diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAADODrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAADODrv.dad
new file mode 100644
index 0000000..4065076
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAADODrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAAbsoluteDBDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAAbsoluteDBDrv.dad
new file mode 100644
index 0000000..368afd7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAAbsoluteDBDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAAnyDACDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAAnyDACDrv.dad
new file mode 100644
index 0000000..c4473d6
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAAnyDACDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DABDEDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DABDEDrv.dad
new file mode 100644
index 0000000..97fbdbb
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DABDEDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAConverter.exe b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAConverter.exe
new file mode 100644
index 0000000..1432eac
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAConverter.exe differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADBISAM3Drv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADBISAM3Drv.dad
new file mode 100644
index 0000000..7673912
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADBISAM3Drv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADBISAM4Drv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADBISAM4Drv.dad
new file mode 100644
index 0000000..3cad429
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADBISAM4Drv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADBXDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADBXDrv.dad
new file mode 100644
index 0000000..65509ee
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADBXDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADOADrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADOADrv.dad
new file mode 100644
index 0000000..2956e08
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DADOADrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAElevateDBDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAElevateDBDrv.dad
new file mode 100644
index 0000000..5fd3c00
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAElevateDBDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAFIBDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAFIBDrv.dad
new file mode 100644
index 0000000..faa2068
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAFIBDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAIBDACDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAIBDACDrv.dad
new file mode 100644
index 0000000..ae4822e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAIBDACDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAIBODrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAIBODrv.dad
new file mode 100644
index 0000000..20e2d38
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAIBODrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAIBXDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAIBXDrv.dad
new file mode 100644
index 0000000..6fc0ce2
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAIBXDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAMyDACDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAMyDACDrv.dad
new file mode 100644
index 0000000..703e884
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAMyDACDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAMySQLDACDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAMySQLDACDrv.dad
new file mode 100644
index 0000000..319a13d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAMySQLDACDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DANexusDBDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DANexusDBDrv.dad
new file mode 100644
index 0000000..5eee435
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DANexusDBDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAODACDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAODACDrv.dad
new file mode 100644
index 0000000..f368c87
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAODACDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAPGDACDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAPGDACDrv.dad
new file mode 100644
index 0000000..1e1f05a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAPGDACDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAPostgresDACDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAPostgresDACDrv.dad
new file mode 100644
index 0000000..1e160dd
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAPostgresDACDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASDACDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASDACDrv.dad
new file mode 100644
index 0000000..215fd83
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASDACDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASQLiteDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASQLiteDrv.dad
new file mode 100644
index 0000000..b757591
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASQLiteDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASQLitePassDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASQLitePassDrv.dad
new file mode 100644
index 0000000..60b729f
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASQLitePassDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASchemaModeler.exe b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASchemaModeler.exe
new file mode 100644
index 0000000..999ab5c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DASchemaModeler.exe differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAServer.exe b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAServer.exe
new file mode 100644
index 0000000..c8babcf
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAServer.exe differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAUniDACDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAUniDACDrv.dad
new file mode 100644
index 0000000..2361291
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAUniDACDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAZeosDrv.dad b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAZeosDrv.dad
new file mode 100644
index 0000000..450eaf6
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DAZeosDrv.dad differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Data Abstract.lic b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Data Abstract.lic
new file mode 100644
index 0000000..16d5f6d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Data Abstract.lic
@@ -0,0 +1,18 @@
+133f802af8ca4a2594c36bb3e17689c37d60e6cd7493fa8b9467caa6ea0bc642e1f9cd6e4109f658bf4b085c1eaf724c9bbdac877b5378f415dcc5a472d392a73bd8a7893f58f83b8a87c9c26a2180bb3afd4b3b01ad50fcb32c09ccd2500defac0b5814e319588fe17d1d19224fbca6bc4619356fc3b111c75c40246e76938420c590423cdc0a49806fe2f4ad09174cc544badcb482b16c3de9c86ccc2b8ed664db678ef3cd0457737ad028a801a0bafac7d9bcc891335de4667737864e5f503c6dc8605413fb65f8b970a01bf9ee3f72d184171dea14e2fecae42ba228f090f5f13ce902a8998c25b1856c54eff8db14dd1fa00fe4b491ce5143f4ac3229c4
+4ebb5baf185307679a7600fa67fa2508d041e3148a7bde8297c88f11d7d0779735ea6846bc66d975dcf8018b36237652ffb43d506287ae0a594d30526bf780ee
+Name=Trial
+Email=Trial
+UserId=Trial
+Company=Trial
+LicenseType=Default
+ProductName=Data Abstract
+Version=6
+AllowBeta=0
+Trial=1
+SubscriptionEndDate=2009-12-04
+LicenseFileEndDate=2009-12-3
+StartDate=2009-11-30
+EndDate=2010-9-2
+P1=13765056502437446495
+P2=4541684468039050332
+P3=1757767162
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DataAbstract.daConfig b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DataAbstract.daConfig
new file mode 100644
index 0000000..3baa736
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DataAbstract.daConfig
@@ -0,0 +1,629 @@
+
+
+
+
+ System.Data.SqlClient
+
+
+
+
+
+
+
+ MSSQL .NET Driver
+ This Driver allows you to connect to MSSQL via the Microsoft .NET MSSQL driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the database name to wish to connect.
+ Step 5: Custom parameters
+ You can specify additional MSSQL driver options as a semicolon separated list of name/value pairs.
+
+
+
+
+ System.Data.SqlClient
+
+
+
+
+
+
+
+ MSSQL2005 .NET Driver
+ This Driver allows you to connect to MSSQL2005 via the Microsoft .NET MSSQL driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the database name to wish to connect.
+ Step 5: Custom parameters
+ You can specify additional MSSQL driver options as a semicolon separated list of name/value pairs.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SQL Server Compact v3.5 Driver
+ This Driver allows you to connect to MSSQL Compact databases via the Microsoft .NET MSSQL driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the database file name you wish to connect.
+ Step 5: Custom parameters
+ You can specify additional driver options as a semicolon separated list of name/value pairs.
+
+
+ To use the MSSQLCE.NET driver for SQL Server Compact v3.5, you must install the SQL Server Compact 3.5 SP1 from http://www.microsoft.com/sqlserver/2005/en/us/compact-downloads.aspx.
+
+
+
+
+ System.Data.Odbc
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ System.Data.OleDb
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FB.NET Driver
+ This Driver allows you to connect to Interbase via the Firebird .NET driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the full path of the database to which you wish to connect (e.g. "c:\..\employee.gdb").
+ Step 5: Custom parameters
+ You can specify additional FB .Net driver specific options as a semicolon separated list of name/value pairs.
+
+
+ To use the FB.NET driver for Firebird, you must install the open-source firebird driver from http://www.dotnetfirebird.org.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SQLite.NET Driver
+ This Driver allows you to connect to an SQLite database via the SQLite .NET driver.
+ Step 2: Login
+ Use these two fields to provide a username and password to access the database server. Username is ignored, Password can be used for protected databases.
+ Step 3: Database
+ Specify the full path of the database to which you wish to connect (e.g. "c:\..\database.db3").
+ Step 4: Custom parameters
+ You can specify additional FB .Net driver specific options as a semicolon separated list of name/value pairs.
+
+
+ To use the SQLite.NET driver, you must install the free SQLite driver from http://sourceforge.net/projects/sqlite-dotnet2/.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ npgsql Driver
+ This Driver allows you to connect to PostgreSQL Database Server via the PostgreSQL .NET driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the name of the database to which you wish to connect.
+ Step 5: Custom parameters
+ You can specify additional npgsql .Net driver specific options as a semicolon separated list of name/value pairs.
+
+
+ To use the NPGSQL.NET driver for PostgreSQL, you must install the open-source PostgreSQL driver from http://pgfoundry.org/projects/npgsql.
+
+
+
+
+ MySql.Data.MySqlClient
+
+
+
+
+
+
+
+ MySql Driver
+ This Driver allows you to connect to MySQL Database Server via the MySql .NET driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the name of the database to which you wish to connect.
+ Step 5: Custom parameters
+ You can specify additional MySql .Net driver specific options as a semicolon separated list of name/value pairs.
+
+
+ To use the MySql.NET driver for MySql, you must have the commercial MySql driver from http://dev.mysql.com/.
+ Please note that you may NOT use the GPL version of the MySQL driver with Data Abstract, as the GPL explicitely
+ prohibits linking against non-GPLed code. Using the GPL version of the MySQL driver will violate your Data Abstract license and the GPL.
+
+
+
+
+ MySql.Data.MySqlClient
+
+
+
+
+
+
+
+ MySql Driver
+ This Driver allows you to connect to MySQL v4 Database Server via the MySql .NET driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the name of the database to which you wish to connect.
+ Step 5: Custom parameters
+ You can specify additional MySql .Net driver specific options as a semicolon separated list of name/value pairs.
+
+
+ To use the MySql.NET driver for MySql, you must have the commercial MySql driver from http://dev.mysql.com/.
+ Please note that you may NOT use the GPL version of the MySQL driver with Data Abstract, as the GPL explicitely
+ prohibits linking against non-GPLed code. Using the GPL version of the MySQL driver will violate your Data Abstract license and the GPL.
+
+
+
+
+
+ System.Data.OracleClient
+
+
+
+
+
+
+
+ Oracle.NET Driver
+ No specific help for the ODAC driver is available, yet. Please consult the Oracle documentation for details.
+
+
+
+
+ Oracle.DataAccess.Client
+
+
+
+
+
+
+
+ Oracle Data Provider Driver for .NET (Oracle10g)
+ Use this selection to connect to Oracle 10g using the Oracle Data Provider for .NET.
+ As a Database parameter you should specify TNS name of the database you want to connect.
+
+ For more details about Oracle Data Provider please refer ODP.NET Home
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oracle Data Provider Driver for .NET (Oracle 9i)
+ Use this selection to connect to Oracle 9i using the Oracle Data Provider for .NET.
+ As a Database parameter you should specify TNS name of the database you want to connect.
+
+ For more details about Oracle Data Provider please refer ODP.NET Home
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Borland Data Provider Driver
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DefaultConnections.ini b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DefaultConnections.ini
new file mode 100644
index 0000000..2c865eb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/DefaultConnections.ini
@@ -0,0 +1,21 @@
+[Delphi]
+AdventureWorks=ADO?AuxDriver=SQLNCLI.1;Server=localhost;Database=AdventureWorks;Schemas=1;Integrated Security=SSPI
+Northwind=ADO?AuxDriver=SQLOLEDB.1;Server=localhost;Database=Northwind;Integrated Security=SSPI
+Employee=IBX?Server=localhost;Database=C:\Program Files\Firebird\Firebird_1_5\examples\EMPLOYEE.FDB;UserID=sysdba;Password=masterkey;
+PCTrade-MSSQL=ADO?AuxDriver=SQLOLEDB.1;Server=localhost;Database=PCTrade;Integrated Security=SSPI;
+PCTrade-SQLite=SQLite?Database=C:\Documents and Settings\All Users\Documentos\RemObjects Samples\Data Abstract for Delphi\Server\Bin\Data\PCTrade.sqlite.db
+PCTrade-FB=IBX?Server=localhost;Database=C:\Documents and Settings\All Users\Documentos\RemObjects Samples\Data Abstract for Delphi\Server\Bin\Data\PCTrade.fdb;UserID=SYSDBA;Password=masterkey;
+
+[.NET]
+AdventureWorks=MSSQL2005.NET?Database=AdventureWorks;Server=localhost;Integrated Security=SSPI
+Northwind=MSSQL.NET?Database=Northwind;Server=localhost;Integrated Security=SSPI
+Employee=FB.NET?Server=localhost;Database=C:\Program Files\Firebird\Firebird_1_5\examples\EMPLOYEE.FDB;UserID=sysdba;Password=masterkey;
+PCTrade-MSSQL=MSSQL.NET?Server=localhost;Database=PCTrade;Integrated Security=SSPI
+
+[Descriptions]
+AdventureWorks_Description=Microsoft SQL Server 2005, localhost
+Northwind_Description=Microsoft SQL Server 2000, localhost
+Employee_Description=Firebird/Interbase, localhost
+PCTrade-SQLite_Description=SQLite, PCTrade.sqlite.db database
+PCTrade-MSSQL_Description=Microsoft SQL Server, localhost, PCTrade database
+PCTrade-FB_Description=Firebird 2.1, localhost, PCTrade.fdb database
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/DAServer6.exe b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/DAServer6.exe
new file mode 100644
index 0000000..2ef2a77
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/DAServer6.exe differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/DAServer6Admin.exe b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/DAServer6Admin.exe
new file mode 100644
index 0000000..440f145
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/DAServer6Admin.exe differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/DataAbstract.daConfig b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/DataAbstract.daConfig
new file mode 100644
index 0000000..3baa736
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/DataAbstract.daConfig
@@ -0,0 +1,629 @@
+
+
+
+
+ System.Data.SqlClient
+
+
+
+
+
+
+
+ MSSQL .NET Driver
+ This Driver allows you to connect to MSSQL via the Microsoft .NET MSSQL driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the database name to wish to connect.
+ Step 5: Custom parameters
+ You can specify additional MSSQL driver options as a semicolon separated list of name/value pairs.
+
+
+
+
+ System.Data.SqlClient
+
+
+
+
+
+
+
+ MSSQL2005 .NET Driver
+ This Driver allows you to connect to MSSQL2005 via the Microsoft .NET MSSQL driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the database name to wish to connect.
+ Step 5: Custom parameters
+ You can specify additional MSSQL driver options as a semicolon separated list of name/value pairs.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SQL Server Compact v3.5 Driver
+ This Driver allows you to connect to MSSQL Compact databases via the Microsoft .NET MSSQL driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the database file name you wish to connect.
+ Step 5: Custom parameters
+ You can specify additional driver options as a semicolon separated list of name/value pairs.
+
+
+ To use the MSSQLCE.NET driver for SQL Server Compact v3.5, you must install the SQL Server Compact 3.5 SP1 from http://www.microsoft.com/sqlserver/2005/en/us/compact-downloads.aspx.
+
+
+
+
+ System.Data.Odbc
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ System.Data.OleDb
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ FB.NET Driver
+ This Driver allows you to connect to Interbase via the Firebird .NET driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the full path of the database to which you wish to connect (e.g. "c:\..\employee.gdb").
+ Step 5: Custom parameters
+ You can specify additional FB .Net driver specific options as a semicolon separated list of name/value pairs.
+
+
+ To use the FB.NET driver for Firebird, you must install the open-source firebird driver from http://www.dotnetfirebird.org.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SQLite.NET Driver
+ This Driver allows you to connect to an SQLite database via the SQLite .NET driver.
+ Step 2: Login
+ Use these two fields to provide a username and password to access the database server. Username is ignored, Password can be used for protected databases.
+ Step 3: Database
+ Specify the full path of the database to which you wish to connect (e.g. "c:\..\database.db3").
+ Step 4: Custom parameters
+ You can specify additional FB .Net driver specific options as a semicolon separated list of name/value pairs.
+
+
+ To use the SQLite.NET driver, you must install the free SQLite driver from http://sourceforge.net/projects/sqlite-dotnet2/.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ npgsql Driver
+ This Driver allows you to connect to PostgreSQL Database Server via the PostgreSQL .NET driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the name of the database to which you wish to connect.
+ Step 5: Custom parameters
+ You can specify additional npgsql .Net driver specific options as a semicolon separated list of name/value pairs.
+
+
+ To use the NPGSQL.NET driver for PostgreSQL, you must install the open-source PostgreSQL driver from http://pgfoundry.org/projects/npgsql.
+
+
+
+
+ MySql.Data.MySqlClient
+
+
+
+
+
+
+
+ MySql Driver
+ This Driver allows you to connect to MySQL Database Server via the MySql .NET driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the name of the database to which you wish to connect.
+ Step 5: Custom parameters
+ You can specify additional MySql .Net driver specific options as a semicolon separated list of name/value pairs.
+
+
+ To use the MySql.NET driver for MySql, you must have the commercial MySql driver from http://dev.mysql.com/.
+ Please note that you may NOT use the GPL version of the MySQL driver with Data Abstract, as the GPL explicitely
+ prohibits linking against non-GPLed code. Using the GPL version of the MySQL driver will violate your Data Abstract license and the GPL.
+
+
+
+
+ MySql.Data.MySqlClient
+
+
+
+
+
+
+
+ MySql Driver
+ This Driver allows you to connect to MySQL v4 Database Server via the MySql .NET driver.
+ Step 2: Server Name
+ In this field, provide the host name or the IP address of the server to which you are connecting.
+ Step 3: Login
+ Use these two fields to provide a username and password to access the database server.
+ Step 4: Database
+ Specify the name of the database to which you wish to connect.
+ Step 5: Custom parameters
+ You can specify additional MySql .Net driver specific options as a semicolon separated list of name/value pairs.
+
+
+ To use the MySql.NET driver for MySql, you must have the commercial MySql driver from http://dev.mysql.com/.
+ Please note that you may NOT use the GPL version of the MySQL driver with Data Abstract, as the GPL explicitely
+ prohibits linking against non-GPLed code. Using the GPL version of the MySQL driver will violate your Data Abstract license and the GPL.
+
+
+
+
+
+ System.Data.OracleClient
+
+
+
+
+
+
+
+ Oracle.NET Driver
+ No specific help for the ODAC driver is available, yet. Please consult the Oracle documentation for details.
+
+
+
+
+ Oracle.DataAccess.Client
+
+
+
+
+
+
+
+ Oracle Data Provider Driver for .NET (Oracle10g)
+ Use this selection to connect to Oracle 10g using the Oracle Data Provider for .NET.
+ As a Database parameter you should specify TNS name of the database you want to connect.
+
+ For more details about Oracle Data Provider please refer ODP.NET Home
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oracle Data Provider Driver for .NET (Oracle 9i)
+ Use this selection to connect to Oracle 9i using the Oracle Data Provider for .NET.
+ As a Database parameter you should specify TNS name of the database you want to connect.
+
+ For more details about Oracle Data Provider please refer ODP.NET Home
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Borland Data Provider Driver
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/FirebirdSql.Data.FirebirdClient.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/FirebirdSql.Data.FirebirdClient.dll
new file mode 100644
index 0000000..40c7c7c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/FirebirdSql.Data.FirebirdClient.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/Mono.Security.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/Mono.Security.dll
new file mode 100644
index 0000000..6accde7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/Mono.Security.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/Novell.Directory.Ldap.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/Novell.Directory.Ldap.dll
new file mode 100644
index 0000000..97499c5
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/Novell.Directory.Ldap.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/Npgsql.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/Npgsql.dll
new file mode 100644
index 0000000..0cf2152
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/Npgsql.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DAServer6.Engine.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DAServer6.Engine.dll
new file mode 100644
index 0000000..36d82f8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DAServer6.Engine.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DAServer6.UI.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DAServer6.UI.dll
new file mode 100644
index 0000000..79392f8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DAServer6.UI.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DataAbstract.Server.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DataAbstract.Server.dll
new file mode 100644
index 0000000..625b0f9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DataAbstract.Server.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DataAbstract.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DataAbstract.dll
new file mode 100644
index 0000000..dfc3cc0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.DataAbstract.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.InternetPack.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.InternetPack.dll
new file mode 100644
index 0000000..b7cb5cc
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.InternetPack.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.Server.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.Server.dll
new file mode 100644
index 0000000..f1d7503
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.Server.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.ZLib.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.ZLib.dll
new file mode 100644
index 0000000..bcef67a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.ZLib.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.ZeroConf.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.ZeroConf.dll
new file mode 100644
index 0000000..bd8d682
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.ZeroConf.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.dll
new file mode 100644
index 0000000..0c4ec08
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/RemObjects.SDK.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/System.Data.SQLite.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/System.Data.SQLite.dll
new file mode 100644
index 0000000..66f38e7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/Relativity/System.Data.SQLite.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/RemObjects.DataAbstract.SchemaModeler.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/RemObjects.DataAbstract.SchemaModeler.dll
new file mode 100644
index 0000000..197410a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/RemObjects.DataAbstract.SchemaModeler.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/borlndmm.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/borlndmm.dll
new file mode 100644
index 0000000..2e3ede2
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/borlndmm.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxasa30.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxasa30.dll
new file mode 100644
index 0000000..3410b2f
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxasa30.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxase30.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxase30.dll
new file mode 100644
index 0000000..1977334
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxase30.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxconnections.ini b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxconnections.ini
new file mode 100644
index 0000000..cd417db
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxconnections.ini
@@ -0,0 +1,192 @@
+[DBXPoolConnection]
+DriverName=DBXPool
+MaxConnections=16
+MinConnections=0
+ConnectTimeout=0
+
+[DBXTraceConnection]
+DriverName=DBXTrace
+;TraceFile=c:\temp\dbxtrace.txt
+;TraceFlags=PARAMETER;ERROR;EXECUTE;COMMAND;CONNECT;TRANSACT;BLOB;MISC;VENDOR;READER;DRIVER_LOAD;METADATA
+;TraceDriver=true
+TraceFlags=NONE
+
+[DB2Connection]
+;DelegateConnection=DBXTraceConnection
+DriverName=DB2
+Database=DBNAME
+User_Name=user
+Password=password
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+DB2 TransIsolation=ReadCommited
+Decimal Separator=.
+
+[MySQLConnection]
+;DelegateConnection=DBXTraceConnection
+DriverName=MySQL
+HostName=ServerName
+Database=DBNAME
+User_Name=user
+Password=password
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+Compressed=False
+Encrypted=False
+
+
+[OracleConnection]
+;DelegateConnection=DBXTraceConnection
+DriverName=Oracle
+DataBase=Database Name
+User_Name=user
+Password=password
+RowsetSize=20
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+Oracle TransIsolation=ReadCommited
+OS Authentication=False
+Multiple Transaction=False
+Trim Char=False
+Decimal Separator=.
+
+[InformixConnection]
+;DelegateConnection=DBXTraceConnection
+DriverName=Informix
+HostName=ServerName
+DataBase=Database Name
+User_Name=user
+Password=password
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+Informix TransIsolation=ReadCommited
+Trim Char=False
+
+
+[ASAConnection]
+;DelegateConnection=DBXTraceConnection
+DriverName=ASA
+HostName=ServerName
+Database=DBNAME
+User_Name=user
+Password=password
+ConnectionString=
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+ASA TransIsolation=ReadCommited
+
+[ASEConnection]
+;DelegateConnection=DBXTraceConnection
+DriverName=ASE
+HostName=ServerName
+DataBase=Database Name
+User_Name=user
+Password=password
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+ASE TransIsolation=ReadCommited
+
+[BlackfishSQLCONNECTION]
+DriverName=BlackfishSQL
+HostName=localhost
+port=2508
+Database=databasename
+create=true
+User_Name=sysdba
+Password=masterkey
+BlobSize=-1
+TransIsolation=ReadCommited
+[Employee]
+DriverName=Interbase
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader,DbxDynalinkDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxDynalinkDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+Database=localhost:D:\EMPLOYEE.FDB
+RoleName=RoleName
+User_Name=sysdba
+Password=masterkey
+ServerCharSet=
+SQLDialect=3
+BlobSize=-1
+CommitRetain=False
+WaitOnLocks=True
+ErrorResourceFile=
+LocaleCode=0000
+Interbase TransIsolation=ReadCommited
+Trim Char=False
+MetaDataPackageLoader=TDBXInterbaseMetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXInterbaseMetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+[MSSQLConnection]
+SchemaOverride=sa.dbo
+DriverName=MSSQL
+HostName=localhost\sqlexpress
+DataBase=adventureWorks
+User_Name=sa
+Password=
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+MSSQL TransIsolation=ReadCommited
+OS Authentication=True
+Prepare SQL=False
+[AdventureWorks]
+DriverName=MSSQL
+SchemaOverride=%.dbo
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader,DBXDynalinkDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxDynalinkDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+HostName=wks1
+DataBase=master
+User_Name=sa
+Password=
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+MSSQL TransIsolation=ReadCommited
+OS Authentication=True
+Prepare SQL=False
+MetaDataPackageLoader=TDBXMsSqlMetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXMsSqlMetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+[ADO]
+DriverName=MSSQL
+SchemaOverride=%.dbo
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+HostName=localhost
+DataBase=Northwind
+User_Name=sa
+Password=
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+MSSQL TransIsolation=ReadCommited
+OS Authentication=True
+Prepare SQL=False
+[IBConnection]
+DriverName=Interbase
+Database=database.gdb
+RoleName=RoleName
+User_Name=sysdba
+Password=masterkey
+ServerCharSet=
+SQLDialect=3
+ErrorResourceFile=
+LocaleCode=0000
+BlobSize=-1
+CommitRetain=False
+WaitOnLocks=True
+Interbase TransIsolation=ReadCommited
+Trim Char=False
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxdb230.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxdb230.dll
new file mode 100644
index 0000000..b44bb92
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxdb230.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxdrivers.ini b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxdrivers.ini
new file mode 100644
index 0000000..63a869f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxdrivers.ini
@@ -0,0 +1,301 @@
+[Installed Drivers]
+DB2=1
+Interbase=1
+MySQL=1
+Oracle=1
+Informix=1
+MSSQL=1
+ASA=1
+ASE=1
+DBXTrace=1
+DBXPool=1
+BlackfishSQL=1
+
+[DBXPool]
+DelegateDriver=True
+DriverName=DBXPool
+DriverUnit=DBXPool
+DriverPackageLoader=TDBXPoolDriverLoader,DBXCommonDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXPoolDriverLoader,Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+
+[DBXTrace]
+DelegateDriver=True
+DriverName=DBXTrace
+DriverUnit=DBXTrace
+DriverPackageLoader=TDBXTraceDriverLoader,DBXCommonDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXTraceDriverLoader,Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+
+[DB2]
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader,DBXDynalinkDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxDynalinkDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+
+GetDriverFunc=getSQLDriverDB2
+LibraryName=dbxdb230.dll
+VendorLib=db2cli.dll
+Database=DBNAME
+User_Name=user
+Password=password
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+DB2 TransIsolation=ReadCommited
+Decimal Separator=.
+MetaDataPackageLoader=TDBXDb2MetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXDb2MetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+
+[Interbase]
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader,DbxDynalinkDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxDynalinkDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+
+GetDriverFunc=getSQLDriverINTERBASE
+LibraryName=dbxint30.dll
+VendorLib=GDS32.DLL
+Database=database.gdb
+RoleName=RoleName
+User_Name=sysdba
+Password=masterkey
+ServerCharSet=
+SQLDialect=3
+BlobSize=-1
+CommitRetain=False
+WaitOnLocks=True
+ErrorResourceFile=
+LocaleCode=0000
+Interbase TransIsolation=ReadCommited
+Trim Char=False
+MetaDataPackageLoader=TDBXInterbaseMetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXInterbaseMetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+
+[MySQL]
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader,DbxDynalinkDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxDynalinkDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+
+GetDriverFunc=getSQLDriverMYSQL
+LibraryName=dbxmys30.dll
+VendorLib=LIBMYSQL.dll
+HostName=ServerName
+Database=DBNAME
+User_Name=user
+Password=password
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+Compressed=False
+Encrypted=False
+MetaDataPackageLoader=TDBXMySqlMetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXMySqlMetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+
+[Oracle]
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader,DBXDynalinkDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxDynalinkDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+
+GetDriverFunc=getSQLDriverORACLE
+LibraryName=dbxora30.dll
+VendorLib=oci.dll
+DataBase=Database Name
+User_Name=user
+Password=password
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+Oracle TransIsolation=ReadCommited
+RowsetSize=20
+OS Authentication=False
+Multiple Transaction=False
+Trim Char=False
+Decimal Separator=.
+MetaDataPackageLoader=TDBXOracleMetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXOracleMetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+
+[Informix]
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader,DBXDynalinkDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxDynalinkDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+
+GetDriverFunc=getSQLDriverINFORMIX
+LibraryName=dbxinf30.dll
+VendorLib=isqlt09a.dll
+HostName=ServerName
+DataBase=Database Name
+User_Name=user
+Password=password
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+Informix TransIsolation=ReadCommited
+Trim Char=False
+MetaDataPackageLoader=TDBXInformixMetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXInformixMetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+
+[MSSQL]
+SchemaOverride=%.dbo
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader,DBXDynalinkDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxDynalinkDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+
+GetDriverFunc=getSQLDriverMSSQL
+LibraryName=dbxmss30.dll
+VendorLib=oledb
+HostName=ServerName
+DataBase=Database Name
+User_Name=user
+Password=password
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+MSSQL TransIsolation=ReadCommited
+OS Authentication=False
+Prepare SQL=False
+MetaDataPackageLoader=TDBXMsSqlMetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXMsSqlMetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+
+[ASA]
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader,DbxDynalinkDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxDynalinkDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+
+GetDriverFunc=getSQLDriverASA
+LibraryName=dbxasa30.dll
+VendorLib=dbodbc9.dll
+HostName=ServerName
+Database=DBNAME
+User_Name=user
+Password=password
+ConnectionString=
+BlobSize=-1
+ErrorResourceFile=
+LocaleCode=0000
+ASA TransIsolation=ReadCommited
+MetaDataPackageLoader=TDBXSybaseASAMetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXSybaseASAMetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+
+[ASE]
+DriverUnit=DBXDynalink
+DriverPackageLoader=TDBXDynalinkDriverLoader,DBXDynalinkDriver100.bpl
+DriverPackage=DBXCommonDriver110.bpl
+DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxDynalinkDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+DriverAssembly=Borland.Data.DbxCommonDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=a91a7c5705831a4f
+
+GetDriverFunc=getSQLDriverASE
+LibraryName=dbxase30.dll
+VendorLib=libct.dll;libcs.dll
+HostName=ServerName
+DataBase=Database Name
+User_Name=user
+Password=password
+BlobSize=-1
+TDS Packet Size=512
+Client HostName=
+Client AppName=
+ErrorResourceFile=
+LocaleCode=0000
+ASE TransIsolation=ReadCommited
+MetaDataPackageLoader=TDBXSybaseASEMetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXSybaseASEMetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+
+[AutoCommit]
+False=0
+True=1
+
+[BlockingMode]
+False=0
+True=1
+
+[WaitOnLocks]
+False=1
+True=0
+
+[CommitRetain]
+False=0
+True=1
+
+[OS Authentication]
+False=0
+True=1
+
+[Multiple Transaction]
+False=0
+True=1
+
+[Trim Char]
+False=0
+True=1
+
+[DB2 TransIsolation]
+DirtyRead=0
+ReadCommited=1
+RepeatableRead=2
+
+[Interbase TransIsolation]
+ReadCommited=1
+RepeatableRead=2
+
+[Oracle TransIsolation]
+DirtyRead=0
+ReadCommited=1
+RepeatableRead=2
+
+[Informix TransIsolation]
+DirtyRead=0
+ReadCommited=1
+RepeatableRead=2
+
+[MSSQL TransIsolation]
+DirtyRead=0
+ReadCommited=1
+RepeatableRead=2
+
+[ASA TransIsolation]
+DirtyRead=0
+ReadCommited=1
+RepeatableRead=2
+
+[ASE TransIsolation]
+DirtyRead=0
+ReadCommited=1
+RepeatableRead=2
+
+[SQLDialect]
+1=0
+2=1
+3=2
+
+[Bdp Providers]
+Oracle=Oracle
+Sybase=Sybase
+Interbase=Interbase
+DB2=DB2
+MySql=MySql
+[BlackfishSQL]
+DriverUnit=DBXClient
+DriverPackageLoader=TDBXClientDriverLoader,DBXClientDriver100.bpl
+DriverAssemblyLoader=Borland.Data.TDBXClientDriverLoader,Borland.Data.DbxClientDriver,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+MetaDataPackageLoader=TDBXDataStoreMetaDataCommandFactory,DbxReadOnlyMetaData100.bpl
+MetaDataAssemblyLoader=Borland.Data.TDBXDataStoreMetaDataCommandFactory,Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
+Password=masterkey
+User_Name=sysdba
+Port=2508
+Create=False
+ReadOnlyDb=False
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxinf30.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxinf30.dll
new file mode 100644
index 0000000..75f6178
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxinf30.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxint30.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxint30.dll
new file mode 100644
index 0000000..6be9532
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxint30.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxmss30.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxmss30.dll
new file mode 100644
index 0000000..770053b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxmss30.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxmys30.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxmys30.dll
new file mode 100644
index 0000000..9795083
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxmys30.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxmysA30.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxmysA30.dll
new file mode 100644
index 0000000..e7a34cf
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxmysA30.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxora30.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxora30.dll
new file mode 100644
index 0000000..f39c32d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxora30.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxoraw30.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxoraw30.dll
new file mode 100644
index 0000000..72fdf4d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/dbxoraw30.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/sqlite3.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/sqlite3.dll
new file mode 100644
index 0000000..47d1080
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/sqlite3.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract (Common)/Bin/sqlitepass3.dll b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/sqlitepass3.dll
new file mode 100644
index 0000000..bdd83c8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract (Common)/Bin/sqlitepass3.dll differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/BaseLoginService_Impl.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/BaseLoginService_Impl.dcu
new file mode 100644
index 0000000..8b55659
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/BaseLoginService_Impl.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/BaseLoginService_Impl.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/BaseLoginService_Impl.dfm
new file mode 100644
index 0000000..75ebc6a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/BaseLoginService_Impl.dfm
@@ -0,0 +1,5 @@
+object BaseLoginService: TBaseLoginService
+ OldCreateOrder = True
+ Height = 300
+ Width = 300
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAADODriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAADODriverHtml.res
new file mode 100644
index 0000000..98b7c6e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAADODriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAADODrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAADODrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAADODrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAbsoluteDBDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAbsoluteDBDriverHtml.res
new file mode 100644
index 0000000..30a5da7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAbsoluteDBDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAbsoluteDBDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAbsoluteDBDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAbsoluteDBDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAnyDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAnyDACDriverHtml.res
new file mode 100644
index 0000000..93f013e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAnyDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAnyDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAnyDACDrv.res
new file mode 100644
index 0000000..84f461e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAAnyDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DABDEDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DABDEDriverHtml.res
new file mode 100644
index 0000000..57e2373
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DABDEDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DABDEDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DABDEDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DABDEDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBISAM3Drv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBISAM3Drv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBISAM3Drv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBISAM4Drv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBISAM4Drv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBISAM4Drv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBISAMDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBISAMDriverHtml.res
new file mode 100644
index 0000000..449e052
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBISAMDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBXDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBXDriverHtml.res
new file mode 100644
index 0000000..a6590c9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBXDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBXDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBXDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADBXDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADOADriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADOADriverHtml.res
new file mode 100644
index 0000000..077daa2
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADOADriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADOADrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADOADrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DADOADrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAElevateDBDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAElevateDBDriverHtml.res
new file mode 100644
index 0000000..e0b8925
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAElevateDBDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAElevateDBDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAElevateDBDrv.res
new file mode 100644
index 0000000..08ba56e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAElevateDBDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAFIBDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAFIBDriverHtml.res
new file mode 100644
index 0000000..d12ca9d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAFIBDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAFIBDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAFIBDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAFIBDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBDACDriverHtml.res
new file mode 100644
index 0000000..4732a47
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBDACDrv.res
new file mode 100644
index 0000000..2aba20c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBODriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBODriverHtml.res
new file mode 100644
index 0000000..32c06f3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBODriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBODrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBODrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBODrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBXDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBXDriverHtml.res
new file mode 100644
index 0000000..790cda2
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBXDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBXDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBXDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAIBXDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DALoginService_Impl.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DALoginService_Impl.dcu
new file mode 100644
index 0000000..3f25f5d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DALoginService_Impl.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMyDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMyDACDriverHtml.res
new file mode 100644
index 0000000..e1fa180
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMyDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMyDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMyDACDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMyDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMySQLDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMySQLDACDriverHtml.res
new file mode 100644
index 0000000..c7f7a82
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMySQLDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMySQLDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMySQLDACDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAMySQLDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DANexusDBDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DANexusDBDriverHtml.res
new file mode 100644
index 0000000..46b9c33
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DANexusDBDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DANexusDBDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DANexusDBDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DANexusDBDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAODACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAODACDriverHtml.res
new file mode 100644
index 0000000..a096da3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAODACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAODACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAODACDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAODACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPGDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPGDACDrv.res
new file mode 100644
index 0000000..2aba20c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPGDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPgDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPgDACDriverHtml.res
new file mode 100644
index 0000000..1b66d75
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPgDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPostgresDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPostgresDACDriverHtml.res
new file mode 100644
index 0000000..c7f7a82
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPostgresDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPostgresDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPostgresDACDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAPostgresDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DARemoteService_Impl.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DARemoteService_Impl.dcu
new file mode 100644
index 0000000..2481f32
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DARemoteService_Impl.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASDACDriverHtml.res
new file mode 100644
index 0000000..2ca3ed1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASDACDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASQLiteDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASQLiteDriverHtml.res
new file mode 100644
index 0000000..316f711
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASQLiteDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASQLiteDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASQLiteDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASQLiteDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASQLitePassDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASQLitePassDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DASQLitePassDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAUniDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAUniDACDriverHtml.res
new file mode 100644
index 0000000..ab9fe22
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAUniDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAUniDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAUniDACDrv.res
new file mode 100644
index 0000000..2aba20c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAUniDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAZeosDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAZeosDriverHtml.res
new file mode 100644
index 0000000..f3000f5
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAZeosDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAZeosDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAZeosDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DAZeosDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract.inc b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract.inc
new file mode 100644
index 0000000..b54e9da
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract.inc
@@ -0,0 +1,33 @@
+{$INCLUDE eDefines.inc}
+{.$DEFINE STORERECID}
+{$DEFINE DataAbstract5}
+
+{$IFDEF FPC}
+ {$IFNDEF RO_FPC_MODE_SET}
+ {$MODE DELPHI}
+ {$DEFINE RO_FPC_MODE_SET}
+ {$ENDIF}
+ {$DEFINE FPC_SAFECALL_BUG}
+ {$DEFINE DA_WideMemoSupport} // support for ftWideMemo
+ {$DEFINE DA_FixedWideCharSupport} // support for ftWideFixedChar
+ {.$DEFINE ftFMTBCD_Support} // support for FMTBCD
+{$ENDIF}
+
+{$IFDEF DELPHI6UP}
+ {$DEFINE ftFMTBCD_Support} // support for FMTBCD
+{$ENDIF}
+
+
+{$IFDEF DELPHI10UP}
+ {$DEFINE DA_WideMemoSupport} // support for ftWideMemo
+ {$DEFINE DA_FixedWideCharSupport} // support for ftWideFixedChar
+{$ENDIF}
+
+// always use std methods for TDataset-compatible drivers
+{$DEFINE Drivers_CompatibilityMode}
+
+// bug in Delphi2009 with AsAnsiString
+{.$DEFINE DELPHI2009_USE_AsAnsiString_for_TStringField}
+
+//
+{$DEFINE USE_LOCALDATAADAPTER}
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract3_Async.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract3_Async.dcu
new file mode 100644
index 0000000..699f4ab
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract3_Async.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract3_Intf.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract3_Intf.dcu
new file mode 100644
index 0000000..4cee3cb
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract3_Intf.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract3_Invk.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract3_Invk.dcu
new file mode 100644
index 0000000..b055ebb
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract3_Invk.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract4_Async.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract4_Async.dcu
new file mode 100644
index 0000000..d47bf2c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract4_Async.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract4_Intf.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract4_Intf.dcu
new file mode 100644
index 0000000..d63632c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract4_Intf.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract4_Invk.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract4_Invk.dcu
new file mode 100644
index 0000000..5635f7b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract4_Invk.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstractService_Impl.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstractService_Impl.dcu
new file mode 100644
index 0000000..f58d18a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstractService_Impl.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstractService_Impl.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstractService_Impl.dfm
new file mode 100644
index 0000000..65deb18
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstractService_Impl.dfm
@@ -0,0 +1,5 @@
+object DataAbstractService: TDataAbstractService
+ OldCreateOrder = True
+ Height = 437
+ Width = 546
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.bpl
new file mode 100644
index 0000000..0f235c0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.dcp
new file mode 100644
index 0000000..2819cd4
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.dcu
new file mode 100644
index 0000000..cbdd9e6
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ADODriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_AbsoluteDBDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_AbsoluteDBDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_AbsoluteDBDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_AnyDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_AnyDACDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_AnyDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.bpl
new file mode 100644
index 0000000..1c0e8e4
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.dcp
new file mode 100644
index 0000000..0681874
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.dcu
new file mode 100644
index 0000000..85c1fcc
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_BDEDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.bpl
new file mode 100644
index 0000000..e7ad031
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.dcp
new file mode 100644
index 0000000..932e0bd
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.dcu
new file mode 100644
index 0000000..09039c8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_Reg.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_Reg.dcu
new file mode 100644
index 0000000..cc6df58
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Core_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBISAMDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBISAMDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBISAMDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.bpl
new file mode 100644
index 0000000..d7d618a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.dcp
new file mode 100644
index 0000000..493d03c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.dcu
new file mode 100644
index 0000000..8023a48
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DBXDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DOADriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DOADriver_D11.res
new file mode 100644
index 0000000..c467631
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_DOADriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ElevateDBDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ElevateDBDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ElevateDBDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_FIBDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_FIBDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_FIBDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBDACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBODriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBODriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBODriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.bpl
new file mode 100644
index 0000000..6af686b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.dcp
new file mode 100644
index 0000000..3c6d05d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.dcu
new file mode 100644
index 0000000..74071fa
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IBXDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_AdditionalResources.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_AdditionalResources.res
new file mode 100644
index 0000000..6735fcb
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_AdditionalResources.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.bpl
new file mode 100644
index 0000000..82fd0bc
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.dcp
new file mode 100644
index 0000000..628461c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.dcu
new file mode 100644
index 0000000..bbdcf7b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_Reg.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_Reg.dcu
new file mode 100644
index 0000000..cee529b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_IDE_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_MyDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_MyDACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_MyDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_MySQLDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_MySQLDACDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_MySQLDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_NexusDBDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_NexusDBDriver_D11.res
new file mode 100644
index 0000000..941b7a7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_NexusDBDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ODACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ODACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ODACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_PgDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_PgDACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_PgDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_PostgresDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_PostgresDACDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_PostgresDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SDACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLiteDriver_D11.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLiteDriver_D11.bpl
new file mode 100644
index 0000000..adb4731
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLiteDriver_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLiteDriver_D11.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLiteDriver_D11.dcp
new file mode 100644
index 0000000..7ac19ed
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLiteDriver_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLiteDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLiteDriver_D11.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLiteDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLitePassDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLitePassDriver_D11.res
new file mode 100644
index 0000000..653aa54
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SQLitePassDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.bpl
new file mode 100644
index 0000000..7fda872
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.dcp
new file mode 100644
index 0000000..9409192
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.dcu
new file mode 100644
index 0000000..e59e52e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_Reg.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_Reg.dcu
new file mode 100644
index 0000000..3bfbdbe
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_Scripting_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SimpleQuery_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SimpleQuery_D11.res
new file mode 100644
index 0000000..c73b102
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_SimpleQuery_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_UniDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_UniDACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_UniDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ZeosDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ZeosDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/DataAbstract_ZeosDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginServiceV5_Impl.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginServiceV5_Impl.dcu
new file mode 100644
index 0000000..6fae572
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginServiceV5_Impl.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginServiceV5_Impl.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginServiceV5_Impl.dfm
new file mode 100644
index 0000000..27ec41e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginServiceV5_Impl.dfm
@@ -0,0 +1,2 @@
+inherited MultiDbLoginServicev5: TMultiDbLoginServicev5
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginService_Impl.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginService_Impl.dcu
new file mode 100644
index 0000000..876bd69
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginService_Impl.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginService_Impl.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginService_Impl.dfm
new file mode 100644
index 0000000..5892128
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/MultiDbLoginService_Impl.dfm
@@ -0,0 +1,2 @@
+inherited MultiDbLoginService: TMultiDbLoginService
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/Resources.BDS.RES b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/Resources.BDS.RES
new file mode 100644
index 0000000..d8238b6
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/Resources.BDS.RES differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/SimpleLoginService_Impl.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/SimpleLoginService_Impl.dcu
new file mode 100644
index 0000000..bbb86c1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/SimpleLoginService_Impl.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/SimpleLoginService_Impl.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/SimpleLoginService_Impl.dfm
new file mode 100644
index 0000000..775b9ce
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/SimpleLoginService_Impl.dfm
@@ -0,0 +1,2 @@
+inherited SimpleLoginService: TSimpleLoginService
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/eDefines.inc b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/eDefines.inc
new file mode 100644
index 0000000..ef01d58
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/eDefines.inc
@@ -0,0 +1,495 @@
+{----------------------------------------------------------------------------}
+{file: eDefines.inc }
+{type: Delphi include file }
+{ }
+{compiler: Borland Pascal 7, }
+{ Delphi 1-7, 2005-2007 for Win32 }
+{ Kylix 1-3, }
+{ C++Builder 1-6, 2006-2007 }
+{ Free Pascal Compiler 2.x }
+{ }
+{platforms: DOS, DPMI, Win16, Win32, Win64, Linux, Mac OS X }
+{ }
+{author: mh@elitedev.com }
+{ }
+{contents: Defines that can be flexibily used to determine the exact }
+{ compiler version used. }
+{ }
+{(c)opyright elitedevelopments software. all rights reserved. }
+{ http://www.elitedev.com }
+{ }
+{ Third Party component developers are encouraged to use the set of defines }
+{ established in this file, rather then their own system, for checking their }
+{ component libraries agains different versions of Delphi and C++Builder. }
+{ }
+{ This file may be distributed freely with both free and commercial source }
+{ libraries, but you are asked to please leave this comment in place, and }
+{ to return any improvements you make to this file to the maintainer that }
+{ is noted above. }
+{----------------------------------------------------------------------------}
+
+{----------------------------------------------------------------------------}
+{ Compiler and OS version defines: }
+{ }
+{ exact compiler versions: }
+{ }
+{ BP7 Borland Pascal 7.0 }
+{ DELPHI1 Delphi 1.0 (any Delphi) }
+{ DELPHI2 Delphi 2.0 }
+{ DELPHI3 Delphi 3.0 }
+{ DELPHI4 Delphi 4.0 }
+{ DELPHI5 Delphi 5.0 }
+{ DELPHI6 Delphi 6.0 }
+{ DELPHI7 Delphi 7.0 }
+{ DELPHI9 Delphi 2005 }
+{ DELPHI2005 Delphi 2005 }
+{ DELPHI2006 Delphi 2006 }
+{ DELPHI2007 Delphi 2007 }
+{ KYLIX1 Kylix 1.0 }
+{ KYLIX2 Kylix 2.0 }
+{ KYLIX3 Kylix 3.0 }
+{ CBUILDER1 C++Builder 1.0 }
+{ CBUILDER3 C++Builder 3.0 }
+{ CBUILDER4 C++Builder 4.0 }
+{ CBUILDER5 C++Builder 5.0 }
+{ }
+{ }
+{ minimum compiler versions: }
+{ }
+{ DELPHI1UP Delphi 1.0 and above (any Delphi) }
+{ DELPHI2UP Delphi 2.0 and above }
+{ DELPHI3UP Delphi 3.0 and above }
+{ DELPHI4UP Delphi 4.0 and above }
+{ DELPHI5UP Delphi 5.0 and above }
+{ DELPHI6UP Delphi 6.0 and above }
+{ DELPHI7UP Delphi 7.0 and above }
+{ DELPHI9UP Delphi 9.0 (2005) and above }
+{ DELPHI10UP Delphi 10.0 (2006) and above }
+{ DELPHI11UP Delphi 11.0 (2007) and above }
+{ DELPHI2005UP Delphi 2005 and above }
+{ DELPHI2006UP Delphi 2006 and above }
+{ DELPHI2007UP Delphi 2007 and above }
+{ KYLIX1UP Kylix 1.0 and above (any Kylix) }
+{ KYLIX2UP Kylix 2.0 and above (any Kylix) }
+{ KYLIX3UP Kylix 3.0 and above (any Kylix) }
+{ CBUILDER1UP C++Builder 1.0 and above or Delphi 2 and above }
+{ CBUILDER3UP C++Builder 3.0 and above or Delphi 3.0 and above }
+{ CBUILDER4UP C++Builder 4.0 and above or Delphi 4.0 and above }
+{ CBUILDER5UP C++Builder 5.0 and above or Delphi 5.0 and above }
+{ CBUILDER6UP C++Builder 5.0 and above or Delphi 5.0 and above }
+{ }
+{ }
+{ compiler types: }
+{ }
+{ BP Borland Pascal (not Delphi or C++Builder) }
+{ DELPHI any Delphi version (but not C++Builder or Kylix) }
+{ KYLIX any Kylix version (not Delphi or C++Builder for Windows) }
+{ CBUILDER any C++Builder for Windows (Pascal) }
+{ }
+{ }
+{ target platforms compiler types: }
+{ }
+{ DELPHI_16BIT 16bit Delphi (but not C++Builder!) }
+{ DELPHI_32BIT 32bit Delphi (but not C++Builder) }
+{ KYLIX_32BIT 32bit Kylix (but not C++Builder) }
+{ CBUILDER_32BIT 32bit C++Builer's Pascal (but not Delphi) }
+{ }
+{ }
+{ target cpu types }
+{ }
+{ CPU16 16bit Delphi or Borland Pascal }
+{ CPU32 32bit Delphi or Free Pascal }
+{ CPU64 64bit Free Pascal }
+{ }
+{ target platforms }
+{ }
+{ DOS any DOS (plain and DPMI) }
+{ REALMODE 16bit realmode DOS }
+{ PROTECTEDMODE 16bit DPMI DOS }
+{ }
+{ MSWINDOWS any Windows platform }
+{ WIN16 16bit Windows }
+{ WIN32 32bit Windows }
+{ WIN64 64bit Windows }
+{ DOTNET .NET }
+{ }
+{ LINUX any Linux platform }
+{ LINUX32 32bit Linux }
+{ LINUX64 64bit Linux }
+{ }
+{ DARWIN Any Mac OS X }
+{ DARWIN32 32bit Mac OS X }
+{ DARWIN64 64bit Mac OS X }
+{----------------------------------------------------------------------------}
+
+{ defines for Borland Pascal 7.0 }
+{$IFDEF VER70}
+ {$DEFINE BP}
+ {$DEFINE BP7}
+ {$DEFINE 16BIT}
+ {$DEFINE CPU16}
+
+ { defines for BP7 DOS real mode }
+ {$IFDEF MSDOS}
+ {$DEFINE DOS}
+ {$DEFINE REALMODE}
+ {$ENDIF}
+
+ { defines for BP7 DOS protected mode }
+ {$IFDEF DPMI}
+ {$DEFINE DOS}
+ {$DEFINE PROTECTEDMODE}
+ {$ENDIF}
+
+ { defines for BP7 Windows }
+ {$IFDEF WINDOWS}
+ {$DEFINE MSWINDOWS}
+ {$DEFINE WIN16}
+ {$ENDIF}
+{$ENDIF}
+
+{ defines for Delphi 1.0 thru 7.0 }
+{$IFDEF MSWINDOWS}
+
+ { defines for Delphi 1.0 }
+ {$IFDEF VER80}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI1}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI_16BIT}
+ {$DEFINE WIN16}
+ {$DEFINE 16BIT}
+ {$DEFINE CPU16}
+ {$ENDIF}
+
+ { defines for Delphi 2.0 }
+ {$IFDEF VER90}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI2}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$ENDIF}
+
+ { defines for C++Builder 1.0 }
+ {$IFDEF VER93}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER1}
+ {$DEFINE CBUILDER1UP}
+ {$ENDIF}
+
+ { defines for Delphi 3.0 }
+ {$IFDEF VER100}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI3}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$ENDIF}
+
+ { defines for C++Builder 3.0 }
+ {$IFDEF VER110}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER3}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$ENDIF}
+
+ { defines for Delphi 4.0 }
+ {$IFDEF VER120}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI4}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$ENDIF}
+
+ { defines for C++Builder 4.0 }
+ {$IFDEF VER125}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER4}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$DEFINE CBUILDER4UP}
+ {$ENDIF}
+ { defines for Delphi 5.0 }
+ {$IFDEF VER130}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI5}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$ENDIF}
+
+ { defines for C++Builder 5.0 }
+ {$IFDEF VER135}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER5}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$DEFINE CBUILDER4UP}
+ {$DEFINE CBUILDER5UP}
+ {$ENDIF}
+
+ { defines for Delphi 6.0 }
+ {$IFDEF VER140}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI6}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$ENDIF}
+
+ { defines for Delphi 7.0 }
+ {$IFDEF VER150}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI7}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$ENDIF}
+
+ { defines for Delphi 2005 }
+ {$IFDEF VER170}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI9}
+ {$DEFINE DELPHI2005}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE BDS}
+ {$DEFINE BDS3}
+ {$DEFINE BDS3UP}
+ {$ENDIF}
+
+ { defines for Delphi 2006 }
+ {$IFDEF VER180}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI10}
+ {$DEFINE DELPHI10A}
+ {$DEFINE DELPHI2006}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE BDS}
+ {$DEFINE BDS4}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$ENDIF}
+
+ { defines for Delphi 2007 }
+ {$IFDEF VER185}
+ {$UNDEF DELPHI10A} // declared in VER180
+ {$UNDEF DELPHI2006} // declared in VER180
+ {$UNDEF BDS4} // declared in VER180
+
+ {$DEFINE DELPHI10B}
+ {$DEFINE DELPHI10BUP}
+ {$DEFINE DELPHI11}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI2007}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE BDS5}
+ {$DEFINE BDS5UP}
+ {$ENDIF}
+
+ { defines for Delphi 2009 }
+ {$IFDEF VER200}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+
+ {$DEFINE DELPHI12}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI12UP}
+
+ {$DEFINE DELPHI2009}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE DELPHI2009UP}
+
+ {$DEFINE BDS}
+ {$DEFINE BDS6}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$DEFINE BDS5UP}
+ {$DEFINE BDS6UP}
+ {$ENDIF}
+
+ { defines for Delphi 2010 }
+ {$IFDEF VER210}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+
+ {$DEFINE DELPHI14}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI12UP}
+ {$DEFINE DELPHI14UP}
+
+ {$DEFINE DELPHI2010}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE DELPHI2009UP}
+ {$DEFINE DELPHI2010UP}
+
+ {$DEFINE BDS}
+ {$DEFINE BDS7}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$DEFINE BDS5UP}
+ {$DEFINE BDS6UP}
+ {$DEFINE BDS7UP}
+ {$ENDIF}
+
+
+ {$IFDEF WIN32}
+ {$DEFINE MSWINDOWS} //not automatically defined for Delphi 2 thru 5
+ {$DEFINE 32BIT}
+ {$DEFINE CPU32}
+ {$ENDIF}
+
+{$ENDIF MSWINDOWS}
+
+{ defines for "Delphi for .NET" }
+{$IFDEF CLR}
+ {$DEFINE DOTNET}
+{$ENDIF}
+
+{$IFDEF DELPHI}
+ {$IFDEF DELPHI2UP}
+ {$DEFINE DELPHI_32BIT}
+ {$ENDIF}
+{$ENDIF}
+
+{$IFDEF CBUILDER}
+ {$DEFINE CBUILDER_32BIT}
+{$ENDIF}
+
+{$IFNDEF FPC}
+
+ { Kylix 1.0 thru 3.0 }
+ {$IFDEF LINUX}
+
+ {$DEFINE VER140UP}
+
+ { Any Kylix }
+ {$DEFINE 32BIT}
+ {$DEFINE LINUX32}
+ {$DEFINE KYLIX_32BIT}
+ {$DEFINE KYLIX}
+ {$DEFINE KYLIX1UP}
+
+ {$IFDEF CONDITIONALEXPRESSIONS}
+ {$IF Declared(CompilerVersion)}
+
+ { Kylix 2.0 }
+ {$IF Declared(RTLVersion) and (RTLVersion = 14.1)}
+ {$DEFINE KYLIX2}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$IFEND}
+
+ { Kylix 3.0 - Delphi portion }
+ {$IF Declared(RTLVersion) and (RTLVersion = 14.5)}
+ {$DEFINE KYLIX3}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$DEFINE KYLIX3UP}
+ {$IFEND}
+
+ { Kylix 1.0 }
+ {$ELSE}
+ {$DEFINE KYLIX1}
+ {$IFEND}
+ {$ENDIF CONDITIONALEXPRESSIONS}
+
+ {$ENDIF LINUX}
+{$ENDIF}
+
+{ CPU }
+
+{$IFDEF FPC}
+ {$IFDEF MSWINDOWS}
+ {$IFDEF CPU64}
+ {$DEFINE WIN64}
+ {$ENDIF}
+ {$ENDIF}
+ {$IFDEF LINUX}
+ {$IFDEF CPU32}
+ {$DEFINE LINUX32}
+ {$ENDIF}
+ {$IFDEF CPU64}
+ {$DEFINE LINUX64}
+ {$ENDIF}
+ {$ENDIF}
+ {$IFDEF DARWIN}
+ {$IFDEF CPU32}
+ {$DEFINE DARWIN32}
+ {$ENDIF}
+ {$IFDEF CPU64}
+ {$DEFINE DARWIN64}
+ {$ENDIF}
+ {$ENDIF}
+{$ELSE}
+ {$DEFINE ENDIAN_LITTLE} // To have endianness symbol defined in Delphi too
+{$ENDIF}
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAADODataTable.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAADODataTable.dcu
new file mode 100644
index 0000000..06f548b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAADODataTable.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAADODriver.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAADODriver.dcu
new file mode 100644
index 0000000..8b2cd6c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAADODriver.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAADOInterfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAADOInterfaces.dcu
new file mode 100644
index 0000000..f46f027
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAADOInterfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABDEDriver.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABDEDriver.dcu
new file mode 100644
index 0000000..a7cbe7d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABDEDriver.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABin2DataStreamer.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABin2DataStreamer.dcu
new file mode 100644
index 0000000..a777f2f
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABin2DataStreamer.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABinAdapter.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABinAdapter.dcu
new file mode 100644
index 0000000..ecd8242
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABinAdapter.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABusinessProcessor.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABusinessProcessor.dcu
new file mode 100644
index 0000000..da6e6b3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDABusinessProcessor.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDACDSDataTable.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDACDSDataTable.dcu
new file mode 100644
index 0000000..fe65fc8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDACDSDataTable.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDACache.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDACache.dcu
new file mode 100644
index 0000000..be17af4
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDACache.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAClasses.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAClasses.dcu
new file mode 100644
index 0000000..d4b19e9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAClasses.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAClientDataModule.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAClientDataModule.dcu
new file mode 100644
index 0000000..b9d5165
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAClientDataModule.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAClientModuleWizard.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAClientModuleWizard.res
new file mode 100644
index 0000000..dd81d99
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAClientModuleWizard.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADB2Interfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADB2Interfaces.dcu
new file mode 100644
index 0000000..a21f525
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADB2Interfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADBSessionManager.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADBSessionManager.dcu
new file mode 100644
index 0000000..1ddd170
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADBSessionManager.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADBSessionManagerEditor.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADBSessionManagerEditor.dcu
new file mode 100644
index 0000000..21c186d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADBSessionManagerEditor.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADBXDriver.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADBXDriver.dcu
new file mode 100644
index 0000000..2965fa6
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADBXDriver.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataAbstractEditors.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataAbstractEditors.dcu
new file mode 100644
index 0000000..1012f55
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataAbstractEditors.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataAdapter.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataAdapter.dcu
new file mode 100644
index 0000000..f508fa3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataAdapter.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataStreamer.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataStreamer.dcu
new file mode 100644
index 0000000..441356b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataStreamer.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTable.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTable.dcu
new file mode 100644
index 0000000..4e6ec1e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTable.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTableMasterLinkWizardForm.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTableMasterLinkWizardForm.dcu
new file mode 100644
index 0000000..e36cfe7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTableMasterLinkWizardForm.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTableReferenceCollection.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTableReferenceCollection.dcu
new file mode 100644
index 0000000..5f21192
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTableReferenceCollection.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTableWizards.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTableWizards.dcu
new file mode 100644
index 0000000..3d98c26
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADataTableWizards.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADatasetProvider.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADatasetProvider.dcu
new file mode 100644
index 0000000..415dd09
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADatasetProvider.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADatasetWrapper.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADatasetWrapper.dcu
new file mode 100644
index 0000000..ea1a465
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADatasetWrapper.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADelta.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADelta.dcu
new file mode 100644
index 0000000..d8819aa
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADelta.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADesigntimeCall.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADesigntimeCall.dcu
new file mode 100644
index 0000000..a224f47
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADesigntimeCall.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADriverInfo.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADriverInfo.dcu
new file mode 100644
index 0000000..49c6c0b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADriverInfo.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADriverManager.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADriverManager.dcu
new file mode 100644
index 0000000..8a04c62
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDADriverManager.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAElevateDBInterfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAElevateDBInterfaces.dcu
new file mode 100644
index 0000000..d01ffe4
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAElevateDBInterfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAEngine.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAEngine.dcu
new file mode 100644
index 0000000..69b43a4
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAEngine.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAExceptions.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAExceptions.dcu
new file mode 100644
index 0000000..47d6a2c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAExceptions.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAExpressionEvaluator.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAExpressionEvaluator.dcu
new file mode 100644
index 0000000..425cce1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAExpressionEvaluator.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAGuideWizardForm.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAGuideWizardForm.dcu
new file mode 100644
index 0000000..c56efe5
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAGuideWizardForm.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAHETConnections.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAHETConnections.dcu
new file mode 100644
index 0000000..f73a1c4
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAHETConnections.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAHETDriver.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAHETDriver.dcu
new file mode 100644
index 0000000..173e1ed
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAHETDriver.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAHelpers.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAHelpers.dcu
new file mode 100644
index 0000000..874098a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAHelpers.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIBInterfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIBInterfaces.dcu
new file mode 100644
index 0000000..a5723da
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIBInterfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIBXDriver.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIBXDriver.dcu
new file mode 100644
index 0000000..2799c58
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIBXDriver.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIDEData.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIDEData.dcu
new file mode 100644
index 0000000..e556920
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIDEData.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIDEMenu.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIDEMenu.dcu
new file mode 100644
index 0000000..df7242a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIDEMenu.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIDERes.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIDERes.dcu
new file mode 100644
index 0000000..baf0de7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAIDERes.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAInterfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAInterfaces.dcu
new file mode 100644
index 0000000..7c1898f
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAInterfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAInterfacesEx.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAInterfacesEx.dcu
new file mode 100644
index 0000000..ba3b1e3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAInterfacesEx.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAJSONDataStreamer.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAJSONDataStreamer.dcu
new file mode 100644
index 0000000..7089571
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAJSONDataStreamer.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDALocalCommand.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDALocalCommand.dcu
new file mode 100644
index 0000000..a9a43d9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDALocalCommand.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDALocalDataAdapter.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDALocalDataAdapter.dcu
new file mode 100644
index 0000000..e7c2329
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDALocalDataAdapter.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDALocalHelpers.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDALocalHelpers.dcu
new file mode 100644
index 0000000..c0373e9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDALocalHelpers.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMacroProcessors.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMacroProcessors.dcu
new file mode 100644
index 0000000..5eca90d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMacroProcessors.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMacros.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMacros.dcu
new file mode 100644
index 0000000..290cbd8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMacros.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMemDataTable.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMemDataTable.dcu
new file mode 100644
index 0000000..d34477a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMemDataTable.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMemDataset.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMemDataset.dcu
new file mode 100644
index 0000000..26d9db7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMemDataset.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMySQLInterfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMySQLInterfaces.dcu
new file mode 100644
index 0000000..95aeca1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAMySQLInterfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAOracleInterfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAOracleInterfaces.dcu
new file mode 100644
index 0000000..032e469
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAOracleInterfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPSScriptingProvider.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPSScriptingProvider.dcu
new file mode 100644
index 0000000..4e265e6
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPSScriptingProvider.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPascalScript.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPascalScript.dcu
new file mode 100644
index 0000000..0c65ea8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPascalScript.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPleaseWaitForm.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPleaseWaitForm.dcu
new file mode 100644
index 0000000..670e344
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPleaseWaitForm.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPostgresInterfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPostgresInterfaces.dcu
new file mode 100644
index 0000000..b3b90d0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPostgresInterfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPoweredByDataAbstractButton.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPoweredByDataAbstractButton.dcu
new file mode 100644
index 0000000..b9a44e7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPoweredByDataAbstractButton.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPoweredByDataAbstractButton.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPoweredByDataAbstractButton.res
new file mode 100644
index 0000000..0dd5c2d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAPoweredByDataAbstractButton.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialog.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialog.dcu
new file mode 100644
index 0000000..fccae1d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialog.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialog.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialog.dfm
new file mode 100644
index 0000000..ae8fe93
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialog.dfm
@@ -0,0 +1,551 @@
+object ReconcileDialogForm: TReconcileDialogForm
+ Left = 354
+ Top = 231
+ Width = 541
+ Height = 403
+ BorderStyle = bsSizeToolWin
+ BorderWidth = 5
+ Caption = 'One or more updates failed to apply on the server...'
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poOwnerFormCenter
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ DesignSize = (
+ 515
+ 357)
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 264
+ Top = 154
+ Width = 238
+ Height = 39
+ Anchors = [akLeft, akRight, akBottom]
+ Caption =
+ 'Skip over this change and ignore the error. You can try and corr' +
+ 'ect the problem by modifying data, or reapply the change again a' +
+ 't a later time.'
+ WordWrap = True
+ end
+ object Label2: TLabel
+ Left = 264
+ Top = 210
+ Width = 225
+ Height = 26
+ Anchors = [akLeft, akRight, akBottom]
+ Caption =
+ 'Cancel the changes you made and restore the record to its origin' +
+ 'al values.'
+ WordWrap = True
+ end
+ object Label3: TLabel
+ Left = 264
+ Top = 266
+ Width = 230
+ Height = 39
+ Anchors = [akLeft, akRight, akBottom]
+ Caption =
+ 'Show a dialog with details of the changes made to the record sin' +
+ 'ce it was last retrieved from or applied to the server.'
+ WordWrap = True
+ end
+ object SkipButton: TButton
+ Left = 161
+ Top = 154
+ Width = 96
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = '&Skip Change'
+ TabOrder = 3
+ OnClick = SkipButtonClick
+ end
+ object CancelButton: TButton
+ Left = 161
+ Top = 210
+ Width = 96
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = '&Cancel Change'
+ TabOrder = 4
+ OnClick = CancelButtonClick
+ end
+ object SkipAllButton: TButton
+ Left = 0
+ Top = 332
+ Width = 75
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = 'Skip &All'
+ TabOrder = 1
+ OnClick = SkipAllButtonClick
+ end
+ object CancelAllButton: TButton
+ Left = 80
+ Top = 332
+ Width = 75
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = 'Cancel A&ll'
+ TabOrder = 2
+ OnClick = CancelAllButtonClick
+ end
+ object ShowDetailButton: TButton
+ Left = 161
+ Top = 266
+ Width = 96
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = 'Show &Details'
+ TabOrder = 5
+ OnClick = ShowDetailButtonClick
+ end
+ object TreeView: TTreeView
+ Left = 0
+ Top = 0
+ Width = 155
+ Height = 327
+ Anchors = [akLeft, akTop, akBottom]
+ HideSelection = False
+ Indent = 20
+ MultiSelectStyle = []
+ ReadOnly = True
+ RowSelect = True
+ ShowButtons = False
+ ShowLines = False
+ ShowRoot = False
+ StateImages = ImageList
+ TabOrder = 0
+ OnClick = ListBoxClick
+ end
+ object btn_Cancel: TButton
+ Left = 440
+ Top = 332
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Cancel = True
+ Caption = 'Close'
+ ModalResult = 2
+ TabOrder = 6
+ end
+ object memMessageError: TMemo
+ Left = 160
+ Top = 0
+ Width = 353
+ Height = 145
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ Color = clBtnFace
+ ReadOnly = True
+ ScrollBars = ssVertical
+ TabOrder = 7
+ end
+ object ImageList: TImageList
+ Left = 59
+ Top = 124
+ 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
+ 0000000000000000000000000000000000000000000000000000000D6C00000D
+ 6C00000C5D00000A5100000A4F00000A4F00000A4F00000A4F00000A4F00000A
+ 4F00000A4F000008400000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000001397000017B9000016
+ B5000015AA000013A0000013A00000139700001397000013A000001397000013
+ 97000013A000000F7A0000084000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000017B900001CE200001A
+ D5000018CA000018C6000016B5000016B5000015AA000015AA000016B5000015
+ AA000016B5000013A000000A4F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018C600001EF000001C
+ E200001AD5000018C6000018C6000016B5000016B5000015AA000013A0000015
+ AA000015AA000013A000000A4F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA000224FF00001E
+ F000001CE200001AD5000018CA000018C6000016B5000016B5000015AA000013
+ A0000017B90000139700000A4F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA00163BFF000528
+ FF00001EF000001CE200001AD5000018CA000018CA000017B9000016B5000015
+ AA000015AA000013A000000A4F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA003559FF000F35
+ FF000224FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000017
+ B9000016B5000013A000000A4F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA004E6EFF00193F
+ FF000224FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000018
+ C6000018C60000139D00000C5D00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA005A79FF002146
+ FF00092DFF000224FF00001EF000001DEE00001DEE00001CE200001AD5000018
+ CA000018CA000016B500000D6C00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA006682FF002D51
+ FF00163BFF000F35FF000224FF00001FFF00001EF000001EF000001DEE00001C
+ DE00001CDE000017B900000F7A00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA007690FF004163
+ FF00193FFF00163BFF00092DFF000528FF000224FF000224FF00001DEE00001D
+ EE00001CE2000018C60000118700000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA007F98FF00728C
+ FF005676FF004163FF003559FF00284CFF00163BFF000224FF00001FFF00001D
+ EE00001DEE00001CDE0000139700000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA005877FF007F98
+ FF00839CFF007690FF006682FF004E6EFF00284CFF000F35FF000224FF00001F
+ FF00001DEE00001CE2000013A000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001DEE00092D
+ FF000F35FF00092DFF000528FF000224FF00001DEE00001CDE00001AD5000018
+ CA00001AD5000016B50000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000015F05000269090002640700005E0400004D0300000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000002C2C6C0005056300000065000000600000004F00000000000000
+ 0000000000000000000000000000000000000000000000000000000D6C00000D
+ 6C00000C5D00000A5100000A4F00000A4F00000A4F00000A4F00000A4F00000A
+ 4F00000A4F000008400000000000000000000000000000000000000D6C00000D
+ 6C00000C5D00000A5100000A4F00000A4F00000A4F00000A4F00000A4F00000A
+ 4F00000A4F000008400000000000000000000000000000000000000000000271
+ 08000C98220011B62F000DB4250009B21C0006B0160001AE0B0000910700005B
+ 0400000000000000000000000000000000000000000000000000000000002929
+ AC000000840000008E0000008E0000008F0000008C0000008800000081000101
+ 54000000000000000000000000000000000000000000001397000017B9000016
+ B5000015AA000013A0000013A00000139700001397000013A000001397000013
+ 97000013A000000F7A00000840000000000000000000001397000017B9000016
+ B5000015AA000013A0000013A00000139700001397000013A000001397000013
+ 97000013A000000F7A0000084000000000000000000000000000078414001CB6
+ 45001BBA440017B83A0012B630000EB426001AB72D0008B21B0004AF110000AD
+ 09000067050000000000000000000000000000000000000000002929AC000000
+ 96000000970000009B0000009F000000A00000009D000000970000008F000000
+ 880000006200000000000000000000000000000000000017B900001CE200001A
+ D5000018CA000018C6000016B5000016B5000015AA000015AA000016B5000015
+ AA000016B5000013A000000A4F0000000000000000000017B900001CE200001A
+ D1000019CC000018C6000016B5000016B5000015AA000015AA000016B5000015
+ AA000016B5000013A000000A4F00000000000000000004860B0023B7530024BE
+ 580021BD51001CBA45001ABA430012B630000EB426000EB426000AB21D0007B1
+ 180002AE0D00005F04000000000000000000000000002929AC000101A3000808
+ 9E009999D4006868D0000000AC000000AE000000A9004848B800B7B7E3002727
+ A50000008C00010152000000000000000000000000000018C600001EF000001C
+ E200001AD5000018C6000018C6000016B5000016B5000015AA000013A0000015
+ AA000015AA000013A000000A4F0000000000000000000018C600001EF000001C
+ E200001AD1000018C6003653D300EAEEFA008899E000061FAF000013A0000015
+ AA000015AA000013A000000A4F00000000000000000017A437002EC26B002CC1
+ 660025BF5A0021BD5100FFFFFF001ABA430012B6300013B6310011B62E000BB3
+ 210009B21C00059712000000000000000000000000002929AC000000AB002828
+ A300DEDED200FEFEFF006464D4000000B3004646C000E7E7EC00FFFFF7005E5E
+ B70000009A00020287000000000000000000000000000018CA000224FF00001E
+ F000001CE200001AD5000018C600FFFFFF00F4F7FF000016B5000015AA000013
+ A0000017B90000139700000A4F0000000000000000000019CC000224FF00001E
+ F0009AACF6000624D7000019CC009AAAEB00FFFFFF008899E0000015AA000015
+ AA000015AA000013A000000A4F00000000000091020028BB5E002EC26B002EC2
+ 6B002EC26B00FFFFFF00FFFFFF00FFFFFF001ABA43001ABA430015B8380012B6
+ 30000FB52A000AB21D0002670800000000004B4BD3000707B1000303B9000000
+ C2004C4CA700E6E6D900FCFCFF009E9EE600E8E9F400FFFFF1007575B9000606
+ B1000101AB000202A00013145D0000000000000000000018CA00163BFF000528
+ FF00001EF000001CE200001BD900FFFFFF00FFFFFF000017B9000016B5000015
+ AA000015AA000013A000000A4F0000000000000000000019CC00163BFF000528
+ FF00FFFFFF00768FF300001AD1003654DE00FFFFFF00ADBBEE000016B5000015
+ AA000016B50000139700000A4F0000000000009701002EC26B002EC26B002EC2
+ 6B00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001ABA43001ABA43000EB4
+ 260014B7340011B62F0005771000000000004B4BD3000808BB000707C8000505
+ D1000000C8005353B600F2F2ED00FFFFFF00FFFFFC007575C9000000BE000101
+ C3000303B8000303AC0010106F0000000000000000000018CA003559FF000F35
+ FF000224FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000017
+ B9000016B5000013A000000A4F0000000000000000000019CC003559FF000F35
+ FF00FFFFFF00FFFFFF00768FF300EAEEFA00FFFFFF00889CEB000018C6000016
+ B5000016B5000013A000000A4F000000000000A001002EC26B002EC26B002EC2
+ 6B00FFFFFF00FFFFFF002EC26B00FFFFFF00FFFFFF00FFFFFF001ABA43001ABA
+ 43001BBA440017B83A000A8D1B00000000004B4BD3000C0CC9000D0DD8000B0B
+ DC000000D6003C3DCE00EEEFED00FFFFFF00FFFFFD005858DB000000CA000303
+ CB000606C5000606B8001212790000000000000000000018CA004E6EFF00193F
+ FF000224FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000018
+ C6000018C6000013A000000A510000000000000000000019CC004D6DFF00193F
+ FF004D6DFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EAEEFA001C3BD5000018
+ C6000017B9000015AA00000A51000000000000A4010033C36E002EC26B002EC2
+ 6B00FFFFFF002EC26B002EC26B002EC26B00FFFFFF00FFFFFF00FFFFFF002BBF
+ 640021BD51001CBA4500077F1300000000004B4BD3001414D8001717EA000B0B
+ F1004343DB00E4E4EA00FDFDF500BABAD400EAEAE800FEFEFF006363E5000303
+ D7000A0ACF000A0AC30021217F0000000000000000000018CA005A79FF002146
+ FF00092DFF000224FF00001EF000FFFFFF00FFFFFF00001CE200001BD9000018
+ CA000018CA000016B500000D6C0000000000000000000019CC005A79FF002146
+ FF00092DFF00294DFF006681F8004565F400C1CCFB00FFFFFF00EAEEFA001C3B
+ D5000019CC000016B500000D6C000000000000AD000044C665003FC776002EC2
+ 6B003AC573002EC26B002EC26B002EC26B002EC26B00FFFFFF00FFFFFF002BBF
+ 640025BF5A0023BE5700047E0D00000000004B4BD3002626E5002222FB003F3F
+ E900DCDCE500FDFDEE007373C5000303D7005151B000E3E3D600FFFFFE006161
+ E5000808DB000F0FCA001212790000000000000000000018CA006682FF002D51
+ FF00163BFF000F35FF000224FF00FFFFFF00FFFFFF00001DEE00001CE200001C
+ E200001BD9000017B900000F7A0000000000000000000019CC006681F8002D51
+ FF00163BFF000F35FF000224FF00001FFF000528FF00EAEEFA00FFFFFF00EAEE
+ FA00001BD9000017B900000F7A00000000000000000031BE3C0072D5950052CC
+ 820035C470003AC573002EC26B002EC26B002EC26B002EC26B00FFFFFF002BBF
+ 64002DC26A001AA73E000000000000000000000000003131FB003232FF005252
+ ED00B3B3C2007777CA000000EA000000EC000000E8005252B400ADADB0004D4D
+ E1001818ED001818B1000000000000000000000000000018CA007690FF004163
+ FF00193FFF00163BFF00092DFF000528FF000224FF000224FF00001EF000001D
+ EE00001CE2000018CA000011870000000000000000000019CC007690FF004163
+ FF00193FFF00163BFF00092DFF000528FF000224FF001C41FF00EAEEFA00C1CC
+ FB00001CE2000019CC0000118700000000000000000000B7000075D6830082DA
+ A00066D28E0044C879003AC573002EC26B002EC26B002EC26B0028BD5E002BBF
+ 64002BBF640003870A000000000000000000000000003131FB003E3EFB005353
+ FF006868EF005757F9003838FF002525FD002929FF003838FC004242EB003232
+ FF001F1FE9003131FB000000000000000000000000000018CA007F98FF00728C
+ FF005676FF004163FF003559FF00284CFF00163BFF000224FF00001FF900001D
+ EE00001EF000001BD9000013A00000000000000000000019CC007F98FF00728C
+ FF005676FF004163FF003559FF002449FF00193FFF000224FF000224FF00001E
+ F000001EF000001BD9000013A0000000000000000000000000000FBC100077D7
+ 800098E0AD0076D798005ACE86003AC573002EC26B002EC26B002EC26B0028BD
+ 5E000998170000000000000000000000000000000000000000003131FB004949
+ FD006E6EFF009191FF009393FF008484FF007676FF006767FF005151FF003131
+ FB003131FB00000000000000000000000000000000000018CA005877FF007F98
+ FF00839CFF007690FF006682FF004E6EFF00284CFF000F35FF000224FF00001F
+ F900001FF900001CE2000013A00000000000000000000019CC005877FF007F98
+ FF00839CFF007690FF006681F8004D6DFF00294DFF000F35FF00001FFF00001F
+ FF00001FFF00001BD9000013A0000000000000000000000000000000000000B8
+ 000047CB490084DA91008CDCA6006AD391004ECB7F002DBF610017B13600049C
+ 0A00000000000000000000000000000000000000000000000000000000003131
+ FB003131FB006969FE008787FF009292FF007676FF005353FF005151F3003131
+ FB00000000000000000000000000000000000000000000000000001DEE00092D
+ FF000F35FF00092DFF000528FF000224FF00001DEE00001BD900001AD5000018
+ CA00001AD5000016B50000000000000000000000000000000000001DEE00092D
+ FF000F35FF00092DFF000528FF000224FF00001DEE00001BD900001AD1000019
+ CC000019CC000017B90000000000000000000000000000000000000000000000
+ 00000000000000B8000000B6000000AE000000AD000000A60100000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000003131FB003131FB003131FB003131FB003131FB00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000424D3E000000000000003E000000
+ 2800000040000000300000000100010000000000800100000000000000000000
+ 000000000000000000000000FFFFFF0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000FFFF000000000000C003000000000000
+ 8001000000000000800100000000000080010000000000008001000000000000
+ 8001000000000000800100000000000080010000000000008001000000000000
+ 8001000000000000800100000000000080010000000000008001000000000000
+ C003000000000000FFFF000000000000FFFFFFFFFFFFFFFFF83FF83FC003C003
+ E00FE00F80018001C007C0078001800180038003800180018003800380018001
+ 0001000180018001000100018001800100010001800180010001000180018001
+ 000100018001800180038003800180018003800380018001C007C00780018001
+ E00FE00FC003C003F83FF83FFFFFFFFF00000000000000000000000000000000
+ 000000000000}
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialogDetails.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialogDetails.dcu
new file mode 100644
index 0000000..4124c5d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialogDetails.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialogDetails.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialogDetails.dfm
new file mode 100644
index 0000000..4508539
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAReconcileDialogDetails.dfm
@@ -0,0 +1,95 @@
+object ReconcileDialogDetailsForm: TReconcileDialogDetailsForm
+ Left = 358
+ Top = 218
+ Width = 500
+ Height = 299
+ BorderIcons = [biSystemMenu]
+ Caption = 'Details for Change to '#39'%s'#39
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poOwnerFormCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object ScrollBox: TScrollBox
+ Left = 0
+ Top = 49
+ Width = 484
+ Height = 179
+ Align = alClient
+ BevelInner = bvNone
+ BevelOuter = bvNone
+ BorderStyle = bsNone
+ TabOrder = 0
+ end
+ object BottomPanel: TPanel
+ Left = 0
+ Top = 228
+ Width = 484
+ Height = 35
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 1
+ DesignSize = (
+ 484
+ 35)
+ object OkButton: TButton
+ Left = 185
+ Top = 5
+ Width = 95
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = '&Skip Change'
+ Default = True
+ ModalResult = 1
+ TabOrder = 0
+ end
+ object CloseButton: TButton
+ Left = 385
+ Top = 5
+ Width = 95
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Cancel = True
+ Caption = 'Close'
+ ModalResult = 7
+ TabOrder = 1
+ end
+ object CancelButton: TButton
+ Left = 285
+ Top = 5
+ Width = 95
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = '&Cancel Change'
+ ModalResult = 2
+ TabOrder = 2
+ end
+ end
+ object TopPanel: TPanel
+ Left = 0
+ Top = 0
+ Width = 484
+ Height = 49
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 2
+ DesignSize = (
+ 484
+ 49)
+ object memMessageError: TMemo
+ Left = 0
+ Top = 0
+ Width = 484
+ Height = 49
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ BevelInner = bvNone
+ BevelOuter = bvNone
+ BorderStyle = bsNone
+ Color = clBtnFace
+ ScrollBars = ssVertical
+ TabOrder = 0
+ end
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARegExpr.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARegExpr.dcu
new file mode 100644
index 0000000..5802d9c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARegExpr.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARemoteCommand.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARemoteCommand.dcu
new file mode 100644
index 0000000..4309f16
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARemoteCommand.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARemoteDataAdapter.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARemoteDataAdapter.dcu
new file mode 100644
index 0000000..814913b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARemoteDataAdapter.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARemoteDataAdapterRequests.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARemoteDataAdapterRequests.dcu
new file mode 100644
index 0000000..3e54706
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARemoteDataAdapterRequests.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARes.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARes.dcu
new file mode 100644
index 0000000..529635e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDARes.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASQL92Interfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASQL92Interfaces.dcu
new file mode 100644
index 0000000..caee8f0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASQL92Interfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASQL92QueryBuilder.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASQL92QueryBuilder.dcu
new file mode 100644
index 0000000..ee8c9b5
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASQL92QueryBuilder.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASQLiteInterfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASQLiteInterfaces.dcu
new file mode 100644
index 0000000..3c5f185
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASQLiteInterfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASchemaUnitsGenerator.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASchemaUnitsGenerator.dcu
new file mode 100644
index 0000000..ca719b7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASchemaUnitsGenerator.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAScriptingProvider.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAScriptingProvider.dcu
new file mode 100644
index 0000000..66bd984
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAScriptingProvider.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASelectDataTablesForm.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASelectDataTablesForm.dcu
new file mode 100644
index 0000000..818a288
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASelectDataTablesForm.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAServerLog.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAServerLog.dcu
new file mode 100644
index 0000000..0aa5f1c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAServerLog.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASupportClasses.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASupportClasses.dcu
new file mode 100644
index 0000000..0d0e296
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASupportClasses.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASybaseInterfaces.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASybaseInterfaces.dcu
new file mode 100644
index 0000000..58c00cd
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDASybaseInterfaces.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAUtils.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAUtils.dcu
new file mode 100644
index 0000000..cea2a74
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAUtils.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAWhere.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAWhere.dcu
new file mode 100644
index 0000000..e42babf
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAWhere.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAXMLAdapter.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAXMLAdapter.dcu
new file mode 100644
index 0000000..46020cd
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAXMLAdapter.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAXMLUtils.dcu b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAXMLUtils.dcu
new file mode 100644
index 0000000..8f5774f
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D11/uDAXMLUtils.dcu differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_ADODriver_D12.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_ADODriver_D12.bpl
new file mode 100644
index 0000000..de455c1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_ADODriver_D12.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_ADODriver_D12.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_ADODriver_D12.dcp
new file mode 100644
index 0000000..093762e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_ADODriver_D12.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_BDEDriver_D12.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_BDEDriver_D12.bpl
new file mode 100644
index 0000000..b4116c1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_BDEDriver_D12.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_BDEDriver_D12.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_BDEDriver_D12.dcp
new file mode 100644
index 0000000..ee5300a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_BDEDriver_D12.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Core_D12.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Core_D12.bpl
new file mode 100644
index 0000000..48f7573
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Core_D12.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Core_D12.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Core_D12.dcp
new file mode 100644
index 0000000..e1f64b4
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Core_D12.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_DBXDriver_D12.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_DBXDriver_D12.bpl
new file mode 100644
index 0000000..3cf2267
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_DBXDriver_D12.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_DBXDriver_D12.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_DBXDriver_D12.dcp
new file mode 100644
index 0000000..9e83916
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_DBXDriver_D12.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IBXDriver_D12.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IBXDriver_D12.bpl
new file mode 100644
index 0000000..6a1919f
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IBXDriver_D12.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IBXDriver_D12.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IBXDriver_D12.dcp
new file mode 100644
index 0000000..9e3216e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IBXDriver_D12.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IDE_D12.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IDE_D12.bpl
new file mode 100644
index 0000000..feb3cc1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IDE_D12.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IDE_D12.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IDE_D12.dcp
new file mode 100644
index 0000000..523c692
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_IDE_D12.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Scripting_D12.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Scripting_D12.bpl
new file mode 100644
index 0000000..5ad13c0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Scripting_D12.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Scripting_D12.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Scripting_D12.dcp
new file mode 100644
index 0000000..c4b9033
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D12/DataAbstract_Scripting_D12.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_ADODriver_D14.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_ADODriver_D14.bpl
new file mode 100644
index 0000000..a8af436
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_ADODriver_D14.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_ADODriver_D14.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_ADODriver_D14.dcp
new file mode 100644
index 0000000..4ea0085
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_ADODriver_D14.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_BDEDriver_D14.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_BDEDriver_D14.bpl
new file mode 100644
index 0000000..9cf745d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_BDEDriver_D14.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_BDEDriver_D14.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_BDEDriver_D14.dcp
new file mode 100644
index 0000000..f8e0911
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_BDEDriver_D14.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Core_D14.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Core_D14.bpl
new file mode 100644
index 0000000..c92082d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Core_D14.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Core_D14.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Core_D14.dcp
new file mode 100644
index 0000000..d0686ed
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Core_D14.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_DBXDriver_D14.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_DBXDriver_D14.bpl
new file mode 100644
index 0000000..70a5d93
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_DBXDriver_D14.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_DBXDriver_D14.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_DBXDriver_D14.dcp
new file mode 100644
index 0000000..71e46f7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_DBXDriver_D14.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IBXDriver_D14.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IBXDriver_D14.bpl
new file mode 100644
index 0000000..be302f9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IBXDriver_D14.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IBXDriver_D14.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IBXDriver_D14.dcp
new file mode 100644
index 0000000..b573611
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IBXDriver_D14.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IDE_D14.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IDE_D14.bpl
new file mode 100644
index 0000000..cc6da04
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IDE_D14.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IDE_D14.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IDE_D14.dcp
new file mode 100644
index 0000000..b0b27e1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_IDE_D14.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Scripting_D14.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Scripting_D14.bpl
new file mode 100644
index 0000000..fd27cae
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Scripting_D14.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Scripting_D14.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Scripting_D14.dcp
new file mode 100644
index 0000000..7a8ae28
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D14/DataAbstract_Scripting_D14.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_ADODriver_D7.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_ADODriver_D7.bpl
new file mode 100644
index 0000000..bce4417
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_ADODriver_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_ADODriver_D7.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_ADODriver_D7.dcp
new file mode 100644
index 0000000..981e47c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_ADODriver_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_BDEDriver_D7.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_BDEDriver_D7.bpl
new file mode 100644
index 0000000..afe30a9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_BDEDriver_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_BDEDriver_D7.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_BDEDriver_D7.dcp
new file mode 100644
index 0000000..12875c8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_BDEDriver_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Core_D7.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Core_D7.bpl
new file mode 100644
index 0000000..df33378
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Core_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Core_D7.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Core_D7.dcp
new file mode 100644
index 0000000..a12b4bb
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Core_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_DBXDriver_D7.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_DBXDriver_D7.bpl
new file mode 100644
index 0000000..6cf8e6e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_DBXDriver_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_DBXDriver_D7.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_DBXDriver_D7.dcp
new file mode 100644
index 0000000..bd4ed77
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_DBXDriver_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IBXDriver_D7.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IBXDriver_D7.bpl
new file mode 100644
index 0000000..e02dd8f
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IBXDriver_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IBXDriver_D7.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IBXDriver_D7.dcp
new file mode 100644
index 0000000..5fa69c2
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IBXDriver_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IDE_D7.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IDE_D7.bpl
new file mode 100644
index 0000000..adbafd7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IDE_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IDE_D7.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IDE_D7.dcp
new file mode 100644
index 0000000..858215a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_IDE_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_SQLiteDriver_D7.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_SQLiteDriver_D7.bpl
new file mode 100644
index 0000000..fe51a01
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_SQLiteDriver_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_SQLiteDriver_D7.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_SQLiteDriver_D7.dcp
new file mode 100644
index 0000000..1cb611d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_SQLiteDriver_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Scripting_D7.bpl b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Scripting_D7.bpl
new file mode 100644
index 0000000..78589c1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Scripting_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Scripting_D7.dcp b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Scripting_D7.dcp
new file mode 100644
index 0000000..825fb02
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Dcu/D7/DataAbstract_Scripting_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Help/changelog.png b/internal/6.0.43.801/1/Data Abstract for Delphi/Help/changelog.png
new file mode 100644
index 0000000..0e19bbc
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Help/changelog.png differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Help/da-sampleserver-delphi.png b/internal/6.0.43.801/1/Data Abstract for Delphi/Help/da-sampleserver-delphi.png
new file mode 100644
index 0000000..e0aa7b9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Help/da-sampleserver-delphi.png differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Help/dadelphi.png b/internal/6.0.43.801/1/Data Abstract for Delphi/Help/dadelphi.png
new file mode 100644
index 0000000..578980c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Help/dadelphi.png differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Help/iphone-xcode.png b/internal/6.0.43.801/1/Data Abstract for Delphi/Help/iphone-xcode.png
new file mode 100644
index 0000000..9b8f26c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Help/iphone-xcode.png differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Help/wiki.png b/internal/6.0.43.801/1/Data Abstract for Delphi/Help/wiki.png
new file mode 100644
index 0000000..a626fe1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Help/wiki.png differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Launch.exe b/internal/6.0.43.801/1/Data Abstract for Delphi/Launch.exe
new file mode 100644
index 0000000..4b346d2
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Launch.exe differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/License.txt b/internal/6.0.43.801/1/Data Abstract for Delphi/License.txt
new file mode 100644
index 0000000..9b07198
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/License.txt
@@ -0,0 +1,85 @@
+*** REMOBJECTS SOFTWARE END USER LICENSE AGREEMENT ***
+
+Updated January 8, 2009
+
+IMPORTANT: PLEASE READ THIS DOCUMENT CAREFULLY AND IN ITS ENTIRETY BEFORE USING ANY SOFTWARE PRODUCT ACQUIRED FROM REMOBJECTS SOFTWARE.
+
+This document constitutes a LEGAL AGREEMENT between you, the End User (either an individual or an entity), and RemObjects Software, LLC.
+
+
+1. SCOPE
+
+This End User License Agreement ("EULA") covers all SOFTWARE PRODUCTS produced and sold by RemObjects Software, LLC. The sections of this EULA that contain information that pertain specifically to a certain product are properly marked as such.
+
+SOFTWARE PRODUCTS covered this EULA:
+
+* RemObjects AnyDAC
+* RemObjects Data Abstract
+* RemObjects DebugServer
+* RemObjects Developer Studio
+* RemObjects Everwood
+* RemObjects Internet Pack
+* RemObjects Hydra
+* RemObjects Oxygene
+* RemObjects Pascal Script
+* RemObjects SDK
+
+
+2. DEFINITIONS
+
+SOFTWARE PRODUCTS: refers to one or more product as made available as a unified installation package.
+
+(LIBRARY) SOURCE CODE: refers to the source code shipped with any of the SOFTWARE PRODUCTS licensed to you, the End User, in the “Source” folder of the product installation.
+
+TOOLS: refers to ANY of the applications deployed with the SOFTWARE PRODUCTS in executable form, whether as auxiliary helper programs of a Library product or as main product. This includes but is not limited to any .EXE files and IDE integration.
+
+SAMPLE CODE: sample code is provided to you as part of the SOFTWARE PRODUCT license inside the “Samples” folder
+
+EXECUTABLE FORMAT refers to executable files such as .EXE and .DLL files build from your own source code, linking in code provided as part of the LIBRARY SOURCE CODE. It does not encompass Delphi .DCU or .BPL/.DCP files or any other format that would allow a third party to the provided file as a replacement for the LIBRARY SOURCE CODE
+
+
+3. COPYRIGHT
+
+This SOFTWARE PRODUCT is owned by RemObjects Software, LLC and is protected by copyright laws and international copyright treaties.
+
+All copyrights of this SOFTWARE PRODUCT, including but not limited to any source code, tools, documentation, images, text, and samples incorporated into the SOFTWARE PRODUCT, as well as those provided via Support Services or any of the RemObjects websites, are proprietary products of RemObjects Software, LLC and are protected by copyright law. You acquire only the right to use the SOFTWARE PRODUCT and do not acquire any rights of ownership. You acknowledge that the SOFTWARE PRODUCT and its source code remains a confidential trade secret of RemObjects Software, LLC. RemObjects Software, LLC may have trademarks, copyrights, patents or other intellectual property rights covering the SOFTWARE PRODUCT. You are not granted any license to these patents, trademarks, copyrights, or other intellectual property rights except as expressly provided herein. RemObjects Software, LLC reserves all rights not expressly granted.
+
+All names and logos of the SOFTWARE PRODUCTS defined in the SCOPE section of this EULA are trademarks or registered trademarks of RemObjects Software, LLC. These names and logos may only be used by the End User when referring to RemObjects Software, LLC or any of its products. These names and logos may not be used by the End User for branding or marketing purposes, without written consent from RemObjects Software, LLC.
+
+
+2. GRANT OF LICENSE
+
+BY INSTALLING, COPYING, OR OTHERWISE USING THE SOFTWARE PRODUCT, YOU AGREE TO BE BOUND BY ALL OF THE TERMS AND CONDITIONS OF THIS END USER LICENSE AGREEMENT. IF YOU DO NOT AGREE TO THE TERMS OF THIS AGREEMENT, YOU ARE NOT PERMITTED TO INSTALL, COPY, OR USE THE SOFTWARE PRODUCT. IF YOU REJECT THE TERMS OF THIS AGREEMENT WITHIN THIRTY (30) DAYS AFTER PURCHASING THE SOFTWARE PRODUCT, YOU MAY SEND AN EMAIL TO sales@remobjects.com AND REQUEST A FULL REFUND OF THE PURCHASE PRICE. IN ORDER TO RECEIVE THE REFUND, YOU MUST IRREVOCABLY UNINSTALL AND/OR DELETE ANY AND ALL COPIES OF THE SOFTWARE PRODUCT(S) YOU HAVE PURCHASED, AND PROVIDE CERTIFICATION OF SUCH TO REMOBJECTS.
+You may make one copy of the SOFTWARE PRODUCT solely for backup or archival purposes or transfer the SOFTWARE PRODUCT to a single hard disk provided you keep the original solely for backup or archival purposes.
+
+You may install the software on up to five computers, providing you are the only person using the software on these computers.
+
+You may not alter any of the programs or accompanying files without written permission from RemObjects Software, LLC. Any resale or commercial distribution of the SOFTWARE PRODUCT is strictly prohibited, unless RemObjects Software, LLC has given explicit written permission.
+
+You are not obtaining title to the SOFTWARE PRODUCT or any copyrights. You may not sublicense, rent, lease, convey, modify, translate, convert to another programming language, decompile, or disassemble the SOFTWARE PRODUCT for any purpose. RemObjects Software, LLC grants you as an individual, a personal, non exclusive license to install and use the SOFTWARE PRODUCT for the sole purpose of developing systems that are not in competition with the SOFTWARE PRODUCT, or any other products developed and sold by RemObjects Software, LLC.
+
+If you are an entity, RemObjects Software, LLC grants you the right to designate one individual within your organization to have the right to use the SOFTWARE PRODUCT in the manner described above.
+The named License you acquired is not transferrable to another individual or entity, unless you are given written permission by RemObjects Software, LLC.
+
+You may link against the LIBRARY SOURCE CODE and deploy it in EXECUTABLE FORMAT as part of your application; you may make changes to the LIBRARY SOURCE CODE and write extensions for your own use, and link against and deploy your changes in EXECUTABLE FORMAT. You may NOT deploy RemObjects Software’s source code to anyone.
+SAMPLE CODE for provided for your convenience and you may use it at your discretion. You may create your own products starting from the samples provided and consider this derived work as your own. You may also deploy such derived work in any way you see fit, including in source code form.
+
+Unless specifically stated on a per-tool basis, you may not deploy the TOOLS included with the SOFTWARE PRODUCT to anyone, neither standalone or as part of your own application; the tools are intended solely for use by yourself.
+In general, you may not distribute any part of the installed product, nor any license codes, license files or your website login to third parties.
+
+
+3. SUPPORT SERVICES
+
+RemObjects Software, LLC may provide the End User with Support Services related to the SOFTWARE PRODUCT. Support Services include free downloading of upgrades as covered by the original purchase, as well as technical support offered via NNTP-based newsgroups, e-mail or telephone. Use of Support Services is governed by RemObjects Software policies and programs described on the RemObjects website (www.remobjects.com/support) and may be subject to additional support charges depending on the type and level of support provided. Any supplemental software code provided to you as part of the Support Services shall be considered part of the SOFTWARE PRODUCT and is subject to the terms and conditions of this EULA.
+
+
+4. TERMINATION
+
+This License shall remain in effect only for so long as you are in compliance with the terms and conditions of this EULA. This License will terminate if you fail to comply with any of its terms or conditions. You may terminate it at any time by destroying your copies of the SOFTWARE PRODUCT. You agree, upon termination, to destroy all copies of the Product. Without prejudice to any other rights, RemObjects Software, LLC may terminate this EULA if you fail to comply with the terms. The provisions of this EULA that protect the proprietary rights of RemObjects Software, LLC and the LIMITATIONS OF WARRANTIES will continue to be in force even after any termination. Upon termination, RemObjects Software, LLC may also enforce any rights provided by law.
+
+
+5. LIMITATIONS OF WARRANTIES AND LIABILITY
+
+THIS SOFTWARE PRODUCT IS PROVIDED TO YOU "AS IS" WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE APPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. YOU ASSUME THE ENTIRE RISK AS TO THE ACCURACY AND THE USE OF THE SOFTWARE PRODUCT AND ALL OTHER RISK ARISING FROMTHE USE OR PERFORMANCE OF THIS SOFTWARE PRODUCT AND DOCUMENTATION.
+
+RemObjects Software, LLC SHALL NOT BE LIABLE FOR ANY DAMAGES WHATSOEVER ARISING FROM USE OF OR INABILITY TO USE THIS SOFTWARE PRODUCT, EVEN IF RemObjects Software, LLC HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL RemObjects Software, LLC BE LIABLE FOR ANY CONSEQUENTIAL, INCIDENTAL, DIRECT, INDIRECT, SPECIAL, PUNITIVE, OR OTHER DAMAGES WHATSOEVER, INCLUDING BUT NOT LIMITED TO DAMAGES OR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS, EVEN IF RemObjects Software, LLC HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME STATES/JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/README.html b/internal/6.0.43.801/1/Data Abstract for Delphi/README.html
new file mode 100644
index 0000000..12f8ecf
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/README.html
@@ -0,0 +1,369 @@
+
+
+
+Data Abstract - README - RemObjects Software
+
+
+
+
+
+
+
+
+
+
+
+
+Thank You for Your Interest in our Products and for Choosing Data Abstract for Delphi .
+
+
+Our goal with Data Abstract (or “DA” as we call it for short) is to provide you with a powerful and
+flexible framework to build your application solutions upon.
+
+
+Data Abstract is not standing still. We will continue to improve the product over time and these improvements
+will be available to you as part of your subscription. To ensure continued access to the latest release and to
+stay up to date with the most recent fixes and new features, please make sure that your subscription stays active.
+
+
+Please check our website regularly, to keep your product up to date with the latest additions.
+
+
+
+
+
+
+Find Out What's New
+
+
+The Winter 2009 releases of
+both Data Abstract and the underlying RemObjects SDK
+continue to focus mainly on quality and bugfixing, but also contain a few new features, such as the new Local Data Adapter, and a tech preview of our
+standalone Relativity Server application. (formerly knows as DAServer6).
+Check out our What's New page for a detailed overview look of all what's new.
+Or visit the Change Logs to get a more detailed list
+of all changes, including features, minor enhanceents and bug-fixes.
+
+
+New : Build Native Mac and iPhone apps with Data Abstract for OS X
+
+
+The Data Abstract product family is growing, as we're adding a third fully native edition to the product suite, designed specifically
+for building native client applications for Macintosh computers and iPhone and iPod touch devices using Cocoa and Xcode.
+
+
+
+Leverage your existing investment into Data Abstract by exposing your existing servers to new clients written for these two exciting
+platforms, for example to deliver a first-class mobile front-end for your DA based enterprise application.
+
+
+Data Abstract for OS X is now shipping, and includes RemObjects SDK for OS X .
+Please check our Shop for purchasing options, or contact our
+sales team if you have any further questions.
+
+
+
+
+Getting Started
+
+
+Data Abstract provides several great sources to help you get started using the product.
+
+
+
+For one, we have introduced a brand-new suite of sample applications built around a new PCTrade sample database.
+A range of client applications are available to demonstrate various concepts such as DA SQL or Business Processors,
+all of which work against a pre-compiled server application available from the start menu.
+
+
+The PCTrade samples are fully compatible between Delphi and .NET, so you can test Delphi clients against the .NET server versions, or vice versa, if you own both editions of Data Abstract.
+
+
+You can read more about the PCTrade sample suite here .
+
+
+
+Delve into the Documentation
+
+
+Our documentation wiki at wiki.remobjects.com also
+continues to be a rich and growing source of information, providing introductory texts about different concepts in
+Data Abstract, articles and how-tos, as well as thorough class reference help.
+
+
+The Wiki is community driven, allowing you and all other Data Abstract customers to participate and contribute content, as well.
+
+
+
+
+
+Some More Technical Information
+
+The remainder of the README provides some more general information and a few guidelines that you should
+follow in order to install and get started with Data Abstract.
+
+
+
Software Requirements
+
+Data Abstract for Delphi supports versions 7, 2007, 2009 and 2010 of Delphi, for 32-bit Windows Development.
+Support is also provided for current releases of Free Pascal 2.2 and later, for both 32-bit and 64-bit Windows and Linux development.
+
+
+The Fall 2009 release drops precompiled support for Delphi 6 and Delphi 2006, although package source files are still provided, if
+you need to manually install Data Abstract in these versions of Delphi. These two versions are no longer officially supported.
+
+
+While Delphi 7 is still officially supported, we strognly recommend our customers to move to Delphi 2007 or later.
+
+
TRIAL Version Requirements
+
+The following requirements must be met for the trial version:
+
+
+Delphi 2010 : No Update Pack required.
+Delphi 2009 : Update Pack 1 is not essential, but strongly recommended.
+Delphi 2007 : Update Pack 3 is required.
+Delphi 7 : No Update Pack required.
+
+
+Using Indy-based components with the TRIAL edition requires the original version of Indy that was installed with your edition of Delphi.
+If you have upgraded to a different Indy version, there should still be enough alternative channels for you to evaluate Data Abstract
+without relying on Indy.
+
+
+Please note that these requirements are for the TRIAL version only. Since the retail version comes with full source code,
+you can easily rebuild it to match the version of Delphi that you are using. Simply open the
+BuildPackages_Dx.bpg project group and do a 'Build All Projects'.
+
+Component Installation
+
+Data Abstract comes as several individual packages, provided in precompiled versions for Delphi 7, 2007, 2009 and 2010.
+Setup will install automatically install these packages with the supported IDEs
+
+The Indy packages are built to work with the default versions of Indy that come with
+Delphi 7 (Indy 9), 2007 (Indy 10) or 2009 and 2010 (Indy 10.2.3). If you have a custom version,
+then the RemObjects SDK Indy package will most likely fail to load when yoiu first start the Delphi IDE.
+
+
+If this is the case you will need to adjust the RemObjects.inc file as described below, and then rebuild the RemObjects_Indy
+package manually to match your specific version. You can accomplish this by opening the RemObjects_Indy_D7.dpk (or D10-D14) in
+the IDE and then building and installing it.
+
+
+Alternatively, you can of course choose to not load the RemObjects SDK Indy components, and instead rely on the other channels we provide.
+
+Free Pascal (FPC)
+
+The current release of Data Abstract for Delphi provides library support for Free Pascal 2.2.2 and above, allowing you to rebuild your
+projects for the Win32 (x86), Win64 (x64), Linux (x86 and x64) platforms. Compilation against other platforms provided by FPC might be possible,
+but is not currently supported; however, we are interested in your feedback if you do try to build against other platforms.
+
+
+Official support for other platforms, as well as support for the Lazarus IDE, is under review for future releases.
+
+
+The minimum version of FPC required is Free Pascal 2.2.2 or newer (which can be downloaded here ).
+Please note that we explicitly do not support the 2.0.x release, as it is missing crucial functionality.
+
+
+More information about Free Pascal can be found on the FPC homepage at http://www.freepascal.org .
+
+Limitations of Free Pascal Support
+
+Not all client and server channels provided with RemObjects SDK are supported for Free Pascal or for all four platforms available through
+Free Pascal.
+
+
+
+For obvious reasons, the WinINet HTTP Channel is not supported for Linux but will function under the Win32 and Win64 targets; the same
+holds true for the Named Pipe client and server channels.
+
+
+Indy support for FPC is experimental, and as such the Indy based channels are only experimentally supported for FPC.
+
+
+Support for FPC requires full source, and so is not available in the TRIAL version of Data Abstract.
+
+
+
+
License File
+
+To avoid piracy and abuse, the Data Abstract install contains a time-limited license for tools auch as Schema Modeler and Service Builder, as
+well as the pre-compiled component libraries. This license file will expire after 30 days of use.
+
+
+You will be prompted about this trial period and offered an option to download your personal license file when you start the tools
+for the first time, or when you build your application using Data Abstract
+or RemObjects SDK
+components. You can
+choose to either download your own license file right away, or keep working with the trial license until such a time
+when the download is more convenient for you. Alternatively, it's possible to download it directly
+from my.remobjects.com .
+
+
+Please note that applications built with the trial license will be marked as such and display the trial notification
+dialog on startup. Download your personal license when prompted, in order to build your applications without this limitation.
+
+
+Sample Projects
+
+A number of sample projects are included in the RemObjects Samples folder of your Shared Documents folder.
+These sample projects will show you how to get started and how to use the various functions of Data Abstract, and are built around a
+shared “PCTrade” sample server that has been newly added. Please read more about this suite of samples in our wiki,
+here .
+
+
+After the first start of your development IDE, the Welcome Page
+for Data Abstract will be presented, giving you the option to directly open any of the sample client applications.
+The matching server application comes pre-compiled with Data Abstract for Delphi and can be launched from the Start Menu.
+
+
+Please Note: Samples have been moved from underneath the product install to the Shared Documents folder, to make them more
+easily usable on Windows Vista and Windows 7, where the Program Files folder is read-only during normal operation.
+
+Support
+
+Support for Data Abstract is available via our newsgroups at
+remobjects.public.dataabstract.delphi .
+
+
+You can use these newsgroups to report any problems or suggestions you might have in regards to Data Abstract, you can communicate
+with fellow Data Abstract users and exchange ideas and solutions. More information about our support offerings, including the
+Premium Support subscription, can be found at remobjects.com/support .
+
+
+
+Known Issues in this Release of Data Abstract
+
+
+While we try our best to get all known issues fixed and addressed for each build, sometimes less important issues need to be
+deferred for later releases in favor of getting a version released at all (perfect is the enemy of shipping, after all).
+Please check our list of known issues for any crucial known problems with
+the current release.
+
+
+
+Thank You
+
+Let us thank you again for choosing Data Abstract. We are confident that you
+will find it to be a worthwhile addition to your development toolset.
+
+
+Should you, at any time, encounter a problem or need assistance using Data Abstract, please feel free to ask on the newsgroups
+or contact us directly via email at support@remobjects.com .
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Samples.lnk b/internal/6.0.43.801/1/Data Abstract for Delphi/Samples.lnk
new file mode 100644
index 0000000..a10c71c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Samples.lnk differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BaseLoginService_Impl.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BaseLoginService_Impl.dfm
new file mode 100644
index 0000000..75ebc6a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BaseLoginService_Impl.dfm
@@ -0,0 +1,5 @@
+object BaseLoginService: TBaseLoginService
+ OldCreateOrder = True
+ Height = 300
+ Width = 300
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BaseLoginService_Impl.lfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BaseLoginService_Impl.lfm
new file mode 100644
index 0000000..75ebc6a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BaseLoginService_Impl.lfm
@@ -0,0 +1,5 @@
+object BaseLoginService: TBaseLoginService
+ OldCreateOrder = True
+ Height = 300
+ Width = 300
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BaseLoginService_Impl.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BaseLoginService_Impl.pas
new file mode 100644
index 0000000..bbb9fa4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BaseLoginService_Impl.pas
@@ -0,0 +1,207 @@
+unit BaseLoginService_Impl;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Required:} uRORemoteDataModule,
+ {Generated:} DataAbstract4_Intf;
+
+type
+ { TBaseLoginService }
+ TBaseLoginService = class (TRORemoteDataModule, IBaseLoginService)
+ private
+ fOnLogout: TNotifyEvent;
+ protected
+ { IBaseLoginService methods }
+ function LoginEx(const aLoginString: Utf8String): Boolean; virtual;
+ procedure Logout;
+ published
+ property OnLogout: TNotifyEvent read fOnLogout write fOnLogout;
+ end;
+
+ TLoginString = class
+ private
+ fValues: TStringList;
+ function get_UserName(): UTF8String;
+ function get_Password(): UTF8String;
+ function get_Connection(): UTF8String;
+ function get_Item(aName: UTF8String): UTF8String;
+ protected
+ procedure set_Item(const aName: UTF8String; const aValue: UTF8String);
+ public
+ constructor Create(const aLoginString: UTF8String);
+ destructor Destroy; override;
+ property Item[aName: UTF8String]: UTF8String read get_Item;
+ property Username: UTF8String read get_UserName;
+ property Password: UTF8String read get_Password;
+ property Connection: UTF8String read get_Connection;
+ end;
+
+
+implementation
+
+uses
+ uDAInterfaces,uROClasses,
+ {Generated:} DataAbstract4_Invk, Math, StrUtils;
+
+{ BaseLoginService }
+
+function TBaseLoginService.LoginEx(
+ const aLoginString: Utf8String): Boolean;
+begin
+ raise EROException.Create('Not implemented');
+end;
+
+procedure TBaseLoginService.Logout;
+begin
+ if assigned(OnLogout) then
+ OnLogout(self);
+end;
+
+{ TLoginString }
+
+constructor TLoginString.Create(const aLoginString: UTF8String);
+
+ function ExtractName(const S: string; const NameValueSeparator: Char): string;
+ var
+ P: Integer;
+ begin
+ Result := S;
+ P := AnsiPos(NameValueSeparator, Result);
+ if P <> 0 then
+ SetLength(Result, P-1)
+ else
+ SetLength(Result, 0);
+ end;
+
+ function ExtractValue(const S, Name: string): string;
+ begin
+ if Length(Name) = 0 then
+ Result := ''
+ else
+ Result := Copy(s, Length(Name) + 2, MaxInt);
+ end;
+
+
+ function ParseString2(var p: PChar): string;
+ var
+ p1: PChar;
+ begin
+ if P^ = '"' then begin
+ Result := AnsiExtractQuotedStr(P, '"');
+ end
+ else begin
+ P1 := P;
+ while (P^ >= ' ') do begin
+ if p^ = ';' then break
+ else if p^ = '"' then AnsiExtractQuotedStr(P, '"')
+ else Inc(P);
+ end;
+ SetString(Result, P1, P - P1);
+ end;
+ end;
+
+ procedure ParseString(AValue: string);
+ var
+ P: PChar;
+ sName, sValue : string;
+ begin
+ fValues.Clear;
+ P := PChar(AValue);
+ while P^ <> #0 do begin
+ sName:= ParseString2(p);
+ if CharInSet(p^, [#0, ';']) then begin
+ if sName <> '' then fValues.Add(sName)
+ end
+ else if CharInSet(p^,[':','=']) then begin
+ Inc(p);
+ sValue := ParseString2(p);
+ fValues.Add(sName+'='+sValue);
+ end;
+ if P^ = ';' then inc(p);
+ end;
+ end;
+
+var
+ i: integer;
+ s, s11, s12, s21,s22: string;
+ l1,l2: integer;
+begin
+ inherited Create;
+ fValues := TStringList.Create;
+ s:= {$IFDEF UNICODE}UTF8ToString{$ENDIF}(aLoginString);
+
+ ParseString(s);
+
+ for i:= fValues.Count -1 downto 0 do
+ if fValues[i]='' then fValues.Delete(i);
+
+ for i := 0 to fValues.Count -1 do begin
+ s := fValues[i];
+ s11:= ExtractName(s,'=');
+ s12:= ExtractValue(s, s11);
+
+ s21:= ExtractName(s,':');
+ s22:= ExtractValue(s, s21);
+ l1 := Length(s11); if l1 = 0 then l1:=MaxInt;
+ l2 := Length(s21); if l2 = 0 then l2:=MaxInt;
+ if l2 < l1 then fValues[i] := s21+'='+s22;
+ end;
+end;
+
+destructor TLoginString.Destroy;
+begin
+ fValues.Free;
+ inherited;
+end;
+
+function TLoginString.get_Connection: UTF8String;
+begin
+ Result := Item['Connection'];
+ if Result = '' then Result:= Item['ConnectionName'];
+ if Result = '' then Result:= Item['Connection Name'];
+end;
+
+function TLoginString.get_Item(aName: UTF8String): UTF8String;
+begin
+ Result := {$IFDEF UNICODE}UTF8Encode{$ENDIF}(AnsiDequotedStr(fValues.Values[{$IFDEF UNICODE}UTF8ToString{$ENDIF}(aName)],'"'));
+ if Result = '""' then Result := '';
+end;
+
+function TLoginString.get_Password: UTF8String;
+begin
+ Result := Item['Password'];
+end;
+
+function TLoginString.get_UserName: UTF8String;
+begin
+ Result := Item['User'];
+ if Result = '' then Result:= Item['UserID'];
+ if Result = '' then Result:= Item['User ID'];
+ if Result = '' then Result:= Item['UserName'];
+ if Result = '' then Result:= Item['User Name'];
+end;
+
+
+procedure TLoginString.set_Item(const aName, aValue: UTF8String);
+begin
+ fValues.Values[{$IFDEF UNICODE}UTF8ToString{$ENDIF}(aName)] :={$IFDEF UNICODE}UTF8ToString{$ENDIF}(aValue);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildDrivers.bpg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildDrivers.bpg
new file mode 100644
index 0000000..d3e61de
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildDrivers.bpg
@@ -0,0 +1,94 @@
+#------------------------------------------------------------------------------
+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 = DAAbsoluteDBDrv.dad DAADODrv.dad DAAnyDACDrv.dad DABDEDrv.dad \
+ DADBISAM3Drv.dad DADBISAM4Drv.dad DADBXDrv.dad DADOADrv.dad DAElevateDBDrv.dad \
+ DAFIBDrv.dad DAIBDACDrv.dad DAIBODrv.dad DAIBXDrv.dad DAMyDACDrv.dad \
+ DAMySQLDACDrv.dad DANexusDBDrv.dad DAODACDrv.dad DAPGDACDrv.dad \
+ DAPostgresDACDrv.dad DASDACDrv.dad DASQLiteDrv.dad DASQLitePassDrv.dad \
+ DAUniDACDrv.dad DAZeosDrv.dad
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+DAADODrv.dad: Drivers\DAADODrv.dpr
+ $(DCC)
+
+DAIBXDrv.dad: Drivers\DAIBXDrv.dpr
+ $(DCC)
+
+DADBXDrv.dad: Drivers\DADBXDrv.dpr
+ $(DCC)
+
+DAIBODrv.dad: Drivers\DAIBODrv.dpr
+ $(DCC)
+
+DAODACDrv.dad: Drivers\DAODACDrv.dpr
+ $(DCC)
+
+DASDACDrv.dad: Drivers\DASDACDrv.dpr
+ $(DCC)
+
+DADBISAM3Drv.dad: Drivers\DADBISAM3Drv.dpr
+ $(DCC)
+
+DADBISAM4Drv.dad: Drivers\DADBISAM4Drv.dpr
+ $(DCC)
+
+DAMyDACDrv.dad: Drivers\DAMyDACDrv.dpr
+ $(DCC)
+
+DAIBDACDrv.dad: Drivers\DAIBDACDrv.dpr
+ $(DCC)
+
+DAFIBDrv.dad: Drivers\DAFIBDrv.dpr
+ $(DCC)
+
+DAPostgresDACDrv.dad: Drivers\DAPostgresDACDrv.dpr
+ $(DCC)
+
+DAMySQLDACDrv.dad: Drivers\DAMySQLDACDrv.dpr
+ $(DCC)
+
+DABDEDrv.dad: Drivers\DABDEDrv.dpr
+ $(DCC)
+
+DANexusDBDrv.dad: Drivers\DANexusDBDrv.dpr
+ $(DCC)
+
+DAZeosDrv.dad: Drivers\DAZeosDrv.dpr
+ $(DCC)
+
+DASQLiteDrv.dad: Drivers\DASQLiteDrv.dpr
+ $(DCC)
+
+DAAnyDACDrv.dad: Drivers\DAAnyDACDrv.dpr
+ $(DCC)
+
+DAElevateDBDrv.dad: Drivers\DAElevateDBDrv.dpr
+ $(DCC)
+
+DADOADrv.dad: Drivers\DADOADrv.dpr
+ $(DCC)
+
+DAAbsoluteDBDrv.dad: Drivers\DAAbsoluteDBDrv.dpr
+ $(DCC)
+
+DAUniDACDrv.dad: Drivers\DAUniDACDrv.dpr
+ $(DCC)
+
+DAPGDACDrv.dad: Drivers\DAPGDACDrv.dpr
+ $(DCC)
+
+DASQLitePassDrv.dad: Drivers\DASQLitePassDrv.dpr
+ $(DCC)
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D10.bdsgroup b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D10.bdsgroup
new file mode 100644
index 0000000..d175bf9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D10.bdsgroup
@@ -0,0 +1,44 @@
+
+
+
+
+ Default.Personality
+
+ 1.0
+ {54AB30E9-B101-48B0-A497-ACE401323312}
+
+
+
+ DataAbstract_Core_D10.bdsproj
+ DataAbstract_Scripting_D10.bdsproj
+ IDE\DataAbstract_IDE_D10.bdsproj
+ Drivers\DataAbstract_AbsoluteDBDriver_D10.bdsproj
+ Drivers\DataAbstract_ADODriver_D10.bdsproj
+ Drivers\DataAbstract_AnyDACDriver_D10.bdsproj
+ Drivers\DataAbstract_BDEDriver_D10.bdsproj
+ Drivers\DataAbstract_DBISAMDriver_D10.bdsproj
+ Drivers\DataAbstract_DBXDriver_D10.bdsproj
+ Drivers\DataAbstract_DOADriver_D10.bdsproj
+ Drivers\DataAbstract_ElevateDBDriver_D10.bdsproj
+ Drivers\DataAbstract_FIBDriver_D10.bdsproj
+ Drivers\DataAbstract_IBDACDriver_D10.bdsproj
+ Drivers\DataAbstract_IBODriver_D10.bdsproj
+ Drivers\DataAbstract_IBXDriver_D10.bdsproj
+ Drivers\DataAbstract_MyDACDriver_D10.bdsproj
+ Drivers\DataAbstract_MySQLDACDriver_D10.bdsproj
+ Drivers\DataAbstract_NexusDBDriver_D10.bdsproj
+ Drivers\DataAbstract_ODACDriver_D10.bdsproj
+ Drivers\DataAbstract_PgDACDriver_D10.bdsproj
+ Drivers\DataAbstract_PostgresDACDriver_D10.bdsproj
+ Drivers\DataAbstract_SDACDriver_D10.bdsproj
+ Drivers\DataAbstract_SQLiteDriver_D10.bdsproj
+ Drivers\DataAbstract_SQLitePassDriver_D10.bdsproj
+ Drivers\DataAbstract_UniDACDriver_D10.bdsproj
+ Drivers\DataAbstract_ZeosDriver_D10.bdsproj
+ DataAbstract_Core_D10.bpl DataAbstract_Scripting_D10.bpl DataAbstract_IDE_D10.bpl DataAbstract_AbsoluteDBDriver_D10.bpl DataAbstract_ADODriver_D10.bpl DataAbstract_AnyDACDriver_D10.bpl DataAbstract_BDEDriver_D10.bpl DataAbstract_DBISAMDriver_D10.bpl DataAbstract_DBXDriver_D10.bpl DataAbstract_DOADriver_D10.bpl DataAbstract_ElevateDBDriver_D10.bpl DataAbstract_FIBDriver_D10.bpl DataAbstract_IBDACDriver_D10.bpl DataAbstract_IBODriver_D10.bpl DataAbstract_IBXDriver_D10.bpl DataAbstract_MyDACDriver_D10.bpl DataAbstract_MySQLDACDriver_D10.bpl DataAbstract_NexusDBDriver_D10.bpl DataAbstract_ODACDriver_D10.bpl DataAbstract_PgDACDriver_D10.bpl DataAbstract_PostgresDACDriver_D10.bpl DataAbstract_SDACDriver_D10.bpl DataAbstract_SQLiteDriver_D10.bpl DataAbstract_SQLitePassDriver_D10.bpl DataAbstract_UniDACDriver_D10.bpl DataAbstract_ZeosDriver_D10.bpl
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D11.groupproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D11.groupproj
new file mode 100644
index 0000000..aac2833
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D11.groupproj
@@ -0,0 +1,300 @@
+
+
+ {788d1e93-6494-4009-bad7-5d620a616e08}
+
+
+
+
+
+
+
+ DataAbstract_Core_D11.dproj
+
+
+ DataAbstract_Core_D11.dproj
+
+
+ DataAbstract_Core_D11.dproj
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D12.groupproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D12.groupproj
new file mode 100644
index 0000000..d42152f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D12.groupproj
@@ -0,0 +1,356 @@
+
+
+ {788d1e93-6494-4009-bad7-5d620a616e08}
+
+
+
+
+
+
+
+
+
+ DataAbstract_Core_D12.dproj;..\..\Pascal Script for Delphi\Source\PascalScript_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+
+
+
+ DataAbstract_Core_D12.dproj
+
+
+ DataAbstract_Core_D12.dproj
+
+
+
+ Default.Personality.12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D14.groupproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D14.groupproj
new file mode 100644
index 0000000..18292ee
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D14.groupproj
@@ -0,0 +1,356 @@
+
+
+ {788d1e93-6494-4009-bad7-5d620a616e08}
+
+
+
+
+
+
+
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+
+
+
+ DataAbstract_Core_D14.dproj
+
+
+ DataAbstract_Core_D14.dproj
+
+
+
+ Default.Personality.12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D6.bpg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D6.bpg
new file mode 100644
index 0000000..08ba77e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D6.bpg
@@ -0,0 +1,96 @@
+#------------------------------------------------------------------------------
+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 = DataAbstract_Core_D6.bpl DataAbstract_Scripting_D6.bpl \
+ DataAbstract_IDE_D6.bpl DataAbstract_ADODriver_D6.bpl \
+ DataAbstract_AnyDACDriver_D6.bpl DataAbstract_BDEDriver_D6.bpl \
+ DataAbstract_DBISAMDriver_D6.bpl DataAbstract_DBXDriver_D6.bpl \
+ DataAbstract_DOADriver_D6.bpl DataAbstract_ElevateDBDriver_D6.bpl \
+ DataAbstract_FIBDriver_D6.bpl DataAbstract_IBDACDriver_D6.bpl \
+ DataAbstract_IBODriver_D6.bpl DataAbstract_IBXDriver_D6.bpl \
+ DataAbstract_MyDACDriver_D6.bpl DataAbstract_MySQLDACDriver_D6.bpl \
+ DataAbstract_NexusDBDriver_D6.bpl DataAbstract_ODACDriver_D6.bpl \
+ DataAbstract_PostgresDACDriver_D6.bpl DataAbstract_SDACDriver_D6.bpl \
+ DataAbstract_SQLiteDriver_D6.bpl DataAbstract_ZeosDriver_D6.bpl
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+DataAbstract_Core_D6.bpl: DataAbstract_Core_D6.dpk
+ $(DCC)
+
+DataAbstract_IDE_D6.bpl: IDE\DataAbstract_IDE_D6.dpk
+ $(DCC)
+
+DataAbstract_ADODriver_D6.bpl: Drivers\DataAbstract_ADODriver_D6.dpk
+ $(DCC)
+
+DataAbstract_IBXDriver_D6.bpl: Drivers\DataAbstract_IBXDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_SDACDriver_D6.bpl: Drivers\DataAbstract_SDACDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_DBXDriver_D6.bpl: Drivers\DataAbstract_DBXDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_ODACDriver_D6.bpl: Drivers\DataAbstract_ODACDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_IBODriver_D6.bpl: Drivers\DataAbstract_IBODriver_D6.dpk
+ $(DCC)
+
+DataAbstract_DBISAMDriver_D6.bpl: Drivers\DataAbstract_DBISAMDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_MyDACDriver_D6.bpl: Drivers\DataAbstract_MyDACDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_Scripting_D6.bpl: DataAbstract_Scripting_D6.dpk
+ $(DCC)
+
+PascalScript_Core_D6.bpl: ..\..\Pascal Script for Delphi\Source\PascalScript_Core_D6.dpk
+ $(DCC)
+
+DataAbstract_FIBDriver_D6.bpl: Drivers\DataAbstract_FIBDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_IBDACDriver_D6.bpl: Drivers\DataAbstract_IBDACDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_BDEDriver_D6.bpl: Drivers\DataAbstract_BDEDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_ZeosDriver_D6.bpl: Drivers\DataAbstract_ZeosDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_MySQLDACDriver_D6.bpl: Drivers\DataAbstract_MySQLDACDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_NexusDBDriver_D6.bpl: Drivers\DataAbstract_NexusDBDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_SQLiteDriver_D6.bpl: Drivers\DataAbstract_SQLiteDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_PostgresDACDriver_D6.bpl: Drivers\DataAbstract_PostgresDACDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_ElevateDBDriver_D6.bpl: Drivers\DataAbstract_ElevateDBDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_AnyDACDriver_D6.bpl: Drivers\DataAbstract_AnyDACDriver_D6.dpk
+ $(DCC)
+
+DataAbstract_DOADriver_D6.bpl: Drivers\DataAbstract_DOADriver_D6.dpk
+ $(DCC)
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D7.bpg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D7.bpg
new file mode 100644
index 0000000..54b7c70
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_D7.bpg
@@ -0,0 +1,110 @@
+#------------------------------------------------------------------------------
+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 = DataAbstract_Core_D7.bpl DataAbstract_Scripting_D7.bpl \
+ DataAbstract_IDE_D7.bpl DataAbstract_AbsoluteDBDriver_D7.bpl \
+ DataAbstract_ADODriver_D7.bpl DataAbstract_AnyDACDriver_D7.bpl \
+ DataAbstract_BDEDriver_D7.bpl DataAbstract_DBISAMDriver_D7.bpl \
+ DataAbstract_DBXDriver_D7.bpl DataAbstract_DOADriver_D7.bpl \
+ DataAbstract_ElevateDBDriver_D7.bpl DataAbstract_FIBDriver_D7.bpl \
+ DataAbstract_IBDACDriver_D7.bpl DataAbstract_IBODriver_D7.bpl \
+ DataAbstract_IBXDriver_D7.bpl DataAbstract_MyDACDriver_D7.bpl \
+ DataAbstract_MySQLDACDriver_D7.bpl DataAbstract_NexusDBDriver_D7.bpl \
+ DataAbstract_ODACDriver_D7.bpl DataAbstract_PgDACDriver_D7.bpl \
+ DataAbstract_PostgresDACDriver_D7.bpl DataAbstract_SDACDriver_D7.bpl \
+ DataAbstract_SQLiteDriver_D7.bpl DataAbstract_SQLitePassDriver_D7.bpl \
+ DataAbstract_UniDACDriver_D7.bpl DataAbstract_ZeosDriver_D7.bpl
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+DataAbstract_Core_D7.bpl: DataAbstract_Core_D7.dpk
+ $(DCC)
+
+DataAbstract_IDE_D7.bpl: IDE\DataAbstract_IDE_D7.dpk
+ $(DCC)
+
+DataAbstract_ADODriver_D7.bpl: Drivers\DataAbstract_ADODriver_D7.dpk
+ $(DCC)
+
+DataAbstract_IBXDriver_D7.bpl: Drivers\DataAbstract_IBXDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_SDACDriver_D7.bpl: Drivers\DataAbstract_SDACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_DBXDriver_D7.bpl: Drivers\DataAbstract_DBXDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_ODACDriver_D7.bpl: Drivers\DataAbstract_ODACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_IBODriver_D7.bpl: Drivers\DataAbstract_IBODriver_D7.dpk
+ $(DCC)
+
+DataAbstract_DBISAMDriver_D7.bpl: Drivers\DataAbstract_DBISAMDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_MyDACDriver_D7.bpl: Drivers\DataAbstract_MyDACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_Scripting_D7.bpl: DataAbstract_Scripting_D7.dpk
+ $(DCC)
+
+PascalScript_Core_D7.bpl: ..\..\Pascal Script for Delphi\Source\PascalScript_Core_D7.dpk
+ $(DCC)
+
+DataAbstract_FIBDriver_D7.bpl: Drivers\DataAbstract_FIBDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_IBDACDriver_D7.bpl: Drivers\DataAbstract_IBDACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_BDEDriver_D7.bpl: Drivers\DataAbstract_BDEDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_ZeosDriver_D7.bpl: Drivers\DataAbstract_ZeosDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_MySQLDACDriver_D7.bpl: Drivers\DataAbstract_MySQLDACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_NexusDBDriver_D7.bpl: Drivers\DataAbstract_NexusDBDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_SQLiteDriver_D7.bpl: Drivers\DataAbstract_SQLiteDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_PostgresDACDriver_D7.bpl: Drivers\DataAbstract_PostgresDACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_ElevateDBDriver_D7.bpl: Drivers\DataAbstract_ElevateDBDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_AnyDACDriver_D7.bpl: Drivers\DataAbstract_AnyDACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_DOADriver_D7.bpl: Drivers\DataAbstract_DOADriver_D7.dpk
+ $(DCC)
+
+DataAbstract_AbsoluteDBDriver_D7.bpl: Drivers\DataAbstract_AbsoluteDBDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_PgDACDriver_D7.bpl: Drivers\DataAbstract_PgDACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_UniDACDriver_D7.bpl: Drivers\DataAbstract_UniDACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_SQLitePassDriver_D7.bpl: Drivers\DataAbstract_SQLitePassDriver_D7.dpk
+ $(DCC)
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_K3.bpg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_K3.bpg
new file mode 100644
index 0000000..6649fe0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/BuildPackages_K3.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+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 = DataAbstract_Core_K3.bpl bplDataAbstract_IDE_K3.so
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+DataAbstract_Core_K3.bpl: DataAbstract_Core_K3.dpk
+ $(DCC)
+
+bplDataAbstract_IDE_K3.so: IDE/DataAbstract_IDE_K3.dpk
+ $(DCC)
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DALoginService_Impl.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DALoginService_Impl.pas
new file mode 100644
index 0000000..2d93706
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DALoginService_Impl.pas
@@ -0,0 +1,230 @@
+unit DALoginService_Impl {$IFNDEF FPC}deprecated{$ENDIF};
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ This is where you are supposed to code the implementation of your objects. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROClientIntf, uROTypes, uROServer, uROSessions,
+ {Ancestor Implementation:} DARemoteService_Impl,
+ {Generated:} DataAbstract3_Intf;
+
+const
+ def_UserID = 'UserID';
+ def_Password = 'UserPassword';
+ def_SessionID = 'SessionID';
+
+type
+ TDALoginService = class;
+
+ TDAOnLoginEvent = procedure(Sender : TDALoginService; var aUserID, aPassword : AnsiString) of object;
+ TDAOnLoginSuccessEvent = procedure(Sender : TDALoginService; aLoginInfo : TDALoginInfo) of object;
+ TDAOnLoginFailureEvent = procedure(Sender : TDALoginService; const aUserID, aPassword : AnsiString) of object;
+ TDAOnLogoutEvent = procedure(Sender : TDALoginService; const aSessionID : TGUID) of object;
+
+ { TDALoginService }
+ TDALoginService = class(TDARemoteService, IDALoginService)
+ private
+ fLoginDataset: string;
+ fLogoutCommand: string;
+ fOnLogin: TDAOnLoginEvent;
+ fOnLoginFailure: TDAOnLoginFailureEvent;
+ fOnLoginSuccess: TDAOnLoginSuccessEvent;
+ fOnLogout: TDAOnLogoutEvent;
+ fParamNameUserID: string;
+ fParamNamePassword: string;
+ fParamNameSessionID: string;
+ function GetParamNamePasswordStored: Boolean;
+ function GetParamNameUserIDStored: Boolean;
+ function GetParamNameSessionIDStored: Boolean;
+ procedure SetParamNameSessionID(const Value: string);
+
+ protected
+ procedure SetLoginDataset(const Value: string); virtual;
+ procedure SetLogoutCommand(const Value: string); virtual;
+
+ procedure SetParamNamePassword(const Value: string); virtual;
+ procedure SetParamNameUserID(const Value: string); virtual;
+
+ function DoLogin(const UserID, Password: AnsiString; out LoginInfo: TDALoginInfo): boolean; virtual;
+ procedure DoLogout(const SessionID : TGUID); virtual;
+
+ { IDALoginService methods }
+ function Login(const UserID: AnsiString; const Password: AnsiString; out LoginInfo: TDALoginInfo): Boolean;
+ procedure Logout;
+
+ public
+ constructor Create(aOwner : TComponent); override;
+ procedure Assign(Source: TPersistent); override;
+ published
+ property LoginDataset : string read fLoginDataset write SetLoginDataset;
+ property LogoutCommand : string read fLogoutCommand write SetLogoutCommand;
+
+ property ParamNameUserID : string read fParamNameUserID write SetParamNameUserID stored GetParamNameUserIDStored;
+ property ParamNamePassword : string read fParamNamePassword write SetParamNamePassword stored GetParamNamePasswordStored;
+ property ParamNameSessionID : string read fParamNameSessionID write SetParamNameSessionID stored GetParamNameSessionIDStored;
+
+ property OnLogin: TDAOnLoginEvent read fOnLogin write fOnLogin;
+ property OnLoginSuccess: TDAOnLoginSuccessEvent read fOnLoginSuccess write fOnLoginSuccess;
+ property OnLoginFailure: TDAOnLoginFailureEvent read fOnLoginFailure write fOnLoginFailure;
+ property OnLogout: TDAOnLogoutEvent read fOnLogout write fOnLogout;
+ end deprecated;
+
+implementation
+
+uses
+ {Generated:} uDAInterfaces, uROClasses;
+
+{ DALoginService }
+procedure TDALoginService.Assign(Source: TPersistent);
+var
+ lSource: TDALoginService;
+begin
+ inherited;
+ if Source is TDALoginService then begin
+ lSource := TDALoginService(Source);
+
+ LoginDataset := lSource.LoginDataset;
+ LogoutCommand := lSource.LogoutCommand;
+ OnLogin := lSource.OnLogin;
+ OnLoginFailure := lSource.OnLoginFailure;
+ OnLoginSuccess := lSource.OnLoginSuccess;
+ OnLogout := lSource.OnLogout;
+ ParamNamePassword := lSource.ParamNamePassword;
+ ParamNameSessionID := lSource.ParamNameSessionID;
+ ParamNameUserID := lSource.ParamNameUserID;
+ end;
+end;
+
+constructor TDALoginService.Create(aOwner: TComponent);
+begin
+ fParamNameUserID := def_UserID;
+ fParamNamePassword := def_Password;
+ fParamNameSessionID := def_SessionID;
+
+ inherited;
+end;
+
+procedure TDALoginService.SetLoginDataset(const Value: string);
+begin
+ fLoginDataset := Value;
+end;
+
+procedure TDALoginService.SetLogoutCommand(const Value: string);
+begin
+ fLogoutCommand := Value;
+end;
+
+function TDALoginService.Login(const UserID: AnsiString; const Password: AnsiString; out LoginInfo: TDALoginInfo): Boolean;
+var tempuserid, temppassword : AnsiString;
+begin
+ tempuserid := UserID;
+ temppassword := Password;
+
+ CheckObjects(Connection, ServiceSchema, NIL, TRUE, TRUE, FALSE);
+
+ if Assigned(fOnLogin) then fOnLogin(Self, tempuserid, temppassword);
+
+ result := DoLogin(tempuserid, temppassword, LoginInfo);
+
+ if not result then begin
+ DestroySession;
+ if Assigned(fOnLoginFailure) then fOnLoginFailure(Self, tempuserid, temppassword);
+ end
+ else begin
+ if Assigned(fOnLoginSuccess) then fOnLoginSuccess(Self, LoginInfo);
+ end;
+end;
+
+procedure TDALoginService.Logout;
+begin
+ if (LogoutCommand<>'')
+ then CheckObjects(Connection, ServiceSchema, NIL, TRUE, TRUE, FALSE);
+
+ if Assigned(fOnLogout)
+ then fOnLogout(Self, Session.SessionID);
+
+ DoLogout(Session.SessionID);
+
+ DestroySession;
+end;
+
+function TDALoginService.DoLogin(const UserID: AnsiString; const Password: AnsiString; out LoginInfo: TDALoginInfo): boolean;
+var ds : IDADataset;
+ i : integer;
+begin
+ result := FALSE;
+ LoginInfo := NIL;
+
+ ds := ServiceSchema.NewDataset(Connection, LoginDataset, [ParamNameUserID, ParamNamePassword], [UserID, Password]);
+ if ds.EOF then Exit;
+
+ LoginInfo := TDALoginInfo.Create;
+ LoginInfo.UserID := UserID;
+ LoginInfo.SessionID := {$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(GUIDToString(Session.SessionID));
+
+ for i := 0 to (ds.FieldCount-1) do begin
+ Session[ds.Fields[i].Name] := ds.Fields[i].Value;
+ LoginInfo.Attributes.Add({$IFDEF UNICODE}UTF8Encode{$ENDIF}(ds.Fields[i].Name+'='+ds.Fields[i].AsString));
+ end;
+
+ result := TRUE;
+end;
+
+procedure TDALoginService.DoLogout(const SessionID: TGUID);
+var cmd : IDASQLCommand;
+begin
+ if (LogoutCommand<>'')
+ then cmd := ServiceSchema.NewCommand(Connection, LogoutCommand, [ParamNameSessionID], [GUIDToString(SessionID)]);
+
+ if Not Connection.InTransaction then
+ Connection.BeginTransaction;
+ try
+ cmd.Execute;
+ Connection.CommitTransaction;
+ except
+ Connection.RollbackTransaction;
+ raise;
+ end;
+
+end;
+
+procedure TDALoginService.SetParamNamePassword(const Value: string);
+begin
+ fParamNamePassword := Value;
+end;
+
+procedure TDALoginService.SetParamNameUserID(const Value: string);
+begin
+ fParamNameUserID := Value;
+end;
+
+function TDALoginService.GetParamNamePasswordStored: Boolean;
+begin
+ result := fParamNamePassword<>def_Password
+end;
+
+function TDALoginService.GetParamNameUserIDStored: Boolean;
+begin
+ result := fParamNameUserID<>def_UserID
+end;
+
+function TDALoginService.GetParamNameSessionIDStored: Boolean;
+begin
+ result := fParamNameSessionID<>def_SessionID
+end;
+
+procedure TDALoginService.SetParamNameSessionID(const Value: string);
+begin
+ fParamNameSessionID := Value;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DARemoteService_Impl.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DARemoteService_Impl.pas
new file mode 100644
index 0000000..aee9793
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DARemoteService_Impl.pas
@@ -0,0 +1,1150 @@
+unit DARemoteService_Impl {$IFNDEF FPC}deprecated{$ENDIF};
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{----------------------------------------------------------------------------}
+{ LEGACY NOTE: }
+{ As of v4.0, future development of this unit has been discontinued, and }
+{ new featureswill be impleentd in DataAbstractService_Impl.pas, instead. }
+{ }
+{ When applying fixes to this unit, please propagate them to the new unit }
+{ as well, where needed. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, SysUtils,
+ {$IFDEF DELPHI5}Forms, {$ENDIF}
+ uRORemoteDataModule, uROClientIntf, uROSessions, uROClasses, uROTypes,
+ uDAClasses, uDAInterfaces, uDADataTable, uDABusinessProcessor, uDACache, uDADelta, uDADataStreamer,
+ uDADataTableReferenceCollection, DataAbstract3_Intf;
+
+type
+ { Types }
+ TDARemoteService = class;
+
+ { Events }
+ TDAAcquireConnectionEvent = procedure(Sender: TDARemoteService; var ConnectionName: string) of object;
+ TDAConnectionAcquiredEvent = procedure(Sender: TDARemoteService; const ConnectionName: string; const AcquiredConnection: IDAConnection) of object;
+ TDAAcquireConnectionFailureEvent = procedure(Sender: TDARemoteService; const ConnectionName: string; Error: Exception) of object;
+ TDAGetDatasetSchemaEvent = procedure(const Dataset: IDADataset) of object;
+ TDAGetDatasetDataEvent = procedure(const Dataset: IDADataset; const IncludeSchema: Boolean; const MaxRecords: Integer) of object;
+ TDAOnBusinessProcessorAutoCreated = procedure(Sender : TRORemoteDataModule; BusinessProcessor : TDABusinessProcessor) of object;
+ TDABeforeExecuteCommandEvent = procedure(Sender : TDARemoteService; const aCommand : IDASQLCommand) of object;
+ TDAAfterExecuteCommandEvent = procedure(Sender : TDARemoteService; const aCommand : IDASQLCommand; RowsAffacted : integer) of object;
+ TDAConnectionReleasedEvent = procedure(Sender: TDARemoteService; const ConnectionName: string) of object;
+ TDAGetSchemaAsXMLEvent = procedure(Sender: TDARemoteService; var SchemaXML : AnsiString) of object;
+
+ TDAProcessDeltasEvent = procedure(Sender : TDARemoteService; DeltaStructs : TDADeltaStructList) of object;
+ TDAProcessDeltasErrorEvent = procedure(Sender : TDARemoteService; DeltaStructs : TDADeltaStructList; Error : Exception; var DoRaise : boolean) of object;
+
+ TDAOnGetCachedDataset = procedure(Sender : TDARemoteService; const aDatasetName : string; aDataStream : TStream) of object;
+
+ TDAGetDatasetDataValidationEvent = procedure(Sender: TDARemoteService;
+ const aConnection: IDAConnection;
+ const aDatasetName: string;
+ const aParamNames: array of string;
+ const aParamValues : array of variant;
+ aSchema: TDASchema;
+ var Allowed : boolean) of object;
+
+ TDAUpdateDataTransactionEvent = procedure(Sender: TDARemoteService; var UseDefaultTransactionLogic: Boolean) of object;
+
+ TDAAfterProcessTransactionAction = (pptaNone, pptaRollback, pptaCommit);
+
+ { TDARemoteService }
+ TDARemoteServiceOption = (rsoProcessDeltasWithoutUpdateRules);
+ TDARemoteServiceOptions = set of TDARemoteServiceOption;
+
+ TDARemoteService = class(TRORemoteDataModule, IDARemoteService)
+ private
+ fServiceSchema: TDASchema;
+
+ fStreamedAcquireConnection,
+ fAcquireConnection: boolean;
+ fConnectionName: string;
+ fOnBeforeAcquireConnection: TDAAcquireConnectionEvent;
+ fOnAfterAcquireConnection: TDAConnectionAcquiredEvent;
+ fOnAfterReleaseConnection: TDAConnectionReleasedEvent;
+ fOnBeforeReleaseConnection: TDAConnectionAcquiredEvent;
+ fConnection: IDAConnection;
+ fServiceAdapter: TDADataStreamer;
+ fOnAcquireConnectionFailure: TDAAcquireConnectionFailureEvent;
+
+ fOnAfterGetDatasetData: TDAGetDatasetDataEvent;
+ fOnBeforeGetDatasetData: TDAGetDatasetDataEvent;
+ fOnAfterGetDatasetSchema: TDAGetDatasetSchemaEvent;
+ fOnBeforeGetDatasetSchema: TDAGetDatasetSchemaEvent;
+ fAutoCreateBusinessProcessors: boolean;
+ fAllowExecuteSQLCommand: boolean;
+ fAllowWhereSQL: boolean;
+ fOnBusinessProcessorAutoCreated: TDAOnBusinessProcessorAutoCreated;
+ fOnBeforeExecuteCommand: TDABeforeExecuteCommandEvent;
+ fOnAfterExecuteCommand: TDAAfterExecuteCommandEvent;
+ fOnGetSchemaAsXML: TDAGetSchemaAsXMLEvent;
+
+ fGetDatasetDataValidation: TDAGetDatasetDataValidationEvent;
+
+ fAfterProcessTransactionAction: TDAAfterProcessTransactionAction;
+
+ fOnUpdateDataBeginTransaction : TDAUpdateDataTransactionEvent;
+ fOnUpdateDataCommitTransaction : TDAUpdateDataTransactionEvent;
+ fOnUpdateDataRollBackTransaction : TDAUpdateDataTransactionEvent;
+
+ fOnBeforeProcessDeltas : TDAProcessDeltasEvent;
+ fOnAfterProcessDeltas: TDAProcessDeltasEvent;
+ fOnProcessDeltasError: TDAProcessDeltasErrorEvent;
+ fExportedDataTables: TDADataTableReferenceCollection;
+ fCache: TDACache;
+ fCacheElements: TDACacheElementCollection;
+ fOnGetCachedDataset: TDAOnGetCachedDataset;
+ fOptions: TDARemoteServiceOptions;
+
+ function TriggerTransactionEvent(aEvent: TDAUpdateDataTransactionEvent): Boolean;
+ procedure SetServiceSchema(const Value: TDASchema);
+ procedure SetAcquireConnection(const Value: boolean);
+ procedure SetConnectionName(const Value: string);
+ procedure SetServiceAdapter(const Value: TDADataAdapter);
+ function UnpackDeltas(const DeltaStream: Binary; DeltaStructList : TDADeltaStructList): integer;
+ procedure SetExportedDataTables(const Value: TDADataTableReferenceCollection);
+ procedure MergeDatatablesToSchema(aList : TList);
+ procedure SetCache(const Value: TDACache);
+ procedure SetCacheElements(const Value: TDACacheElementCollection);
+ procedure SetConnection(const aValue: IDAConnection);
+
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure Loaded; override;
+
+ procedure CheckObjects(const aConnection: IDAConnection;
+ aSchema: TDASchema; anAdapter: TDADataAdapter;
+ CheckConnection : boolean = TRUE;
+ CheckSchema : boolean = TRUE;
+ CheckAdapter : boolean = TRUE);
+
+ { Internal }
+ procedure DoOnActivate(aClientID: TGUID; const aMessage: IROMessage); override;
+ procedure DoOnDeactivate(aClientID: TGUID); override;
+
+ function DoGetDatasetData(const Stream: TStream;
+ const aConnection: IDAConnection;
+ const aDatasetName: ansistring;
+ const aParamNames: array of string;
+ const aParamValues : array of variant;
+ const UserFilter : ansistring;
+ aSchema: TDASchema;
+ anAdapter: TDADataAdapter;
+ someOptions: TDAWriteOptions;
+ MaxRecords: integer): integer; virtual;
+
+ function CreateParamString(const ParamNames: array of string; const ParamValues: array of Variant): string;
+
+ function GetDatasetData(const DatasetName: ansistring;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ const IncludeSchema: Boolean = FALSE;
+ const MaxRecords: Integer = -1): Binary; overload;
+ function GetDatasetData(const DatasetName: Ansistring;
+ const IncludeSchema: Boolean = FALSE;
+ const MaxRecords: Integer = -1): Binary; overload;
+
+ { IDARemoteService }
+ function GetDatasetSchema(const aDatasetName: AnsiString): Binary; virtual;
+ function GetDatasetData(const DatasetName: AnsiString;
+ const Params: AnsiString;
+ const IncludeSchema: Boolean;
+ const MaxRecords: Integer): Binary; overload; virtual;
+ function UpdateData(const Delta: Binary): Binary; virtual;
+ function ExecuteSQLCommand(const SQL: AnsiString): Integer; virtual;
+ function GetSchemaAsXML: AnsiString; virtual;
+ function GetDatasetDataEx(const DatasetName: AnsiString;
+ const Params: TDADatasetParamArray;
+ const UserFilter: AnsiString;
+ const IncludeSchema: Boolean;
+ const MaxRecords: Integer): Binary;
+ function GetMultipleDatasets(const DatasetRequestInfoArray: TDADatasetRequestInfoArray): TROBinaryMemoryStream;
+ function GetDatasetScripts(const DatasetNames: AnsiString): AnsiString;
+ function ExecuteSQLCommandEx(const CommandName: AnsiString; const Params: TDADatasetParamArray): Integer;
+
+ public
+ constructor Create(aOwner : TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ property Connection: IDAConnection read fConnection write SetConnection;
+
+ published
+ property AcquireConnection: boolean read fAcquireConnection write SetAcquireConnection default false;
+ property ConnectionName: string read fConnectionName write SetConnectionName;
+
+ property ServiceSchema: TDASchema read fServiceSchema write SetServiceSchema;
+ property ServiceAdapter: TDADataAdapter read fServiceAdapter write SetServiceAdapter;
+
+ property AutoCreateBusinessProcessors : boolean read fAutoCreateBusinessProcessors write fAutoCreateBusinessProcessors default true;
+ property AllowExecuteSQLCommand: boolean read fAllowExecuteSQLCommand write fAllowExecuteSQLCommand default false;
+ property AllowWhereSQL: boolean read fAllowWhereSQL write fAllowWhereSQL default true;
+
+ property OnAfterProcessTransactionAction: TDAAfterProcessTransactionAction read fAfterProcessTransactionAction write fAfterProcessTransactionAction default pptaCommit;
+
+ property OnBeforeAcquireConnection: TDAAcquireConnectionEvent read fOnBeforeAcquireConnection write fOnBeforeAcquireConnection;
+ property OnAfterAcquireConnection: TDAConnectionAcquiredEvent read fOnAfterAcquireConnection write fOnAfterAcquireConnection;
+ property OnBeforeReleaseConnection: TDAConnectionAcquiredEvent read fOnBeforeReleaseConnection write fOnBeforeReleaseConnection;
+ property OnAfterReleaseConnection: TDAConnectionReleasedEvent read fOnAfterReleaseConnection write fOnAfterReleaseConnection;
+ property OnAcquireConnectionFailure: TDAAcquireConnectionFailureEvent read fOnAcquireConnectionFailure write fOnAcquireConnectionFailure;
+
+ property OnBeforeProcessDeltas : TDAProcessDeltasEvent read fOnBeforeProcessDeltas write fOnBeforeProcessDeltas;
+ property OnAfterProcessDeltas: TDAProcessDeltasEvent read fOnAfterProcessDeltas write fOnAfterProcessDeltas;
+ property OnProcessDeltasError: TDAProcessDeltasErrorEvent read fOnProcessDeltasError write fOnProcessDeltasError;
+
+ property OnBeforeGetDatasetSchema: TDAGetDatasetSchemaEvent read fOnBeforeGetDatasetSchema write fOnBeforeGetDatasetSchema;
+ property OnBeforeGetDatasetData: TDAGetDatasetDataEvent read fOnBeforeGetDatasetData write fOnBeforeGetDatasetData;
+ property OnAfterGetDatasetSchema: TDAGetDatasetSchemaEvent read fOnAfterGetDatasetSchema write fOnAfterGetDatasetSchema;
+ property OnAfterGetDatasetData: TDAGetDatasetDataEvent read fOnAfterGetDatasetData write fOnAfterGetDatasetData;
+ property OnBusinessProcessorAutoCreated: TDAOnBusinessProcessorAutoCreated read fOnBusinessProcessorAutoCreated write fOnBusinessProcessorAutoCreated;
+ property OnBeforeExecuteCommand: TDABeforeExecuteCommandEvent read fOnBeforeExecuteCommand write fOnBeforeExecuteCommand;
+ property OnAfterExecuteCommand: TDAAfterExecuteCommandEvent read fOnAfterExecuteCommand write fOnAfterExecuteCommand;
+ property OnGetSchemaAsXMLEvent: TDAGetSchemaAsXMLEvent read fOnGetSchemaAsXML write fOnGetSchemaAsXML;
+ property GetDatasetDataValidation: TDAGetDatasetDataValidationEvent read fGetDatasetDataValidation write fGetDatasetDataValidation;
+
+ property OnUpdateDataBeginTransaction : TDAUpdateDataTransactionEvent read fOnUpdateDataBeginTransaction write fOnUpdateDataBeginTransaction;
+ property OnUpdateDataCommitTransaction : TDAUpdateDataTransactionEvent read fOnUpdateDataCommitTransaction write fOnUpdateDataCommitTransaction;
+ property OnUpdateDataRollBackTransaction : TDAUpdateDataTransactionEvent read fOnUpdateDataRollBackTransaction write fOnUpdateDataRollBackTransaction;
+
+ property ExportedDataTables : TDADataTableReferenceCollection read fExportedDataTables write SetExportedDataTables;
+ property Cache : TDACache read fCache write SetCache;
+ property CacheElements : TDACacheElementCollection read fCacheElements write SetCacheElements;
+ property OnGetCachedDataset : TDAOnGetCachedDataset read fOnGetCachedDataset write fOnGetCachedDataset;
+
+ property Options : TDARemoteServiceOptions read fOptions write fOptions;
+ end deprecated;
+
+implementation
+
+uses
+ Contnrs, Variants, TypInfo,
+ uROClient,
+ uDARes, uDAExceptions;
+
+{ TDARemoteService }
+
+constructor TDARemoteService.Create(aOwner: TComponent);
+begin
+ fExportedDataTables := TDADataTableReferenceCollection.Create(Self);
+ fCacheElements := TDACacheElementCollection.Create();
+ fOptions := [rsoProcessDeltasWithoutUpdateRules];
+ fAllowWhereSQL := true;
+
+ inherited;
+
+ fAutoCreateBusinessProcessors := TRUE;
+end;
+
+destructor TDARemoteService.Destroy;
+begin
+ ServiceSchema := nil;
+ ServiceAdapter := nil;
+ Cache := nil;
+ inherited;
+
+ FreeAndNIL(fExportedDataTables);
+ FreeAndNIL(fCacheElements);
+end;
+
+procedure TDARemoteService.DoOnActivate(aClientID: TGUID; const aMessage: IROMessage);
+var
+ connname: string;
+begin
+ inherited;
+
+ if (csDesigning in ComponentState) then Exit;
+
+ if AcquireConnection then try
+ // Acquires a DA connection automatically
+ if (fServiceSchema = nil) or (fServiceSchema.ConnectionManager = nil) then RaiseError(err_DARDMInvalidSchema);
+
+ connname := fConnectionName;
+ if Assigned(fOnBeforeAcquireConnection) then fOnBeforeAcquireConnection(Self, connname);
+
+ fConnection := ServiceSchema.ConnectionManager.NewConnection(connname);
+ if Supports(fConnection, IDAHETConnection) then
+ raise Exception.Create(err_HETConnectionNotSupportedInV3);
+
+ if Assigned(fOnAfterAcquireConnection) then fOnAfterAcquireConnection(Self, connname, fConnection);
+ except
+ on E: Exception do begin
+ if Assigned(fOnAcquireConnectionFailure) then fOnAcquireConnectionFailure(Self, connname, E);
+ raise;
+ end;
+ end;
+end;
+
+procedure TDARemoteService.DoOnDeactivate(aClientID: TGUID);
+var connname : string;
+begin
+ inherited;
+
+ if (csDesigning in ComponentState) then Exit;
+
+ if assigned(fConnection) then begin
+ connname := fConnection.Name;
+
+ if Assigned(fOnBeforeReleaseConnection)
+ then fOnBeforeReleaseConnection(Self, connname, fConnection);
+
+ fConnection := nil;
+
+ if Assigned(fOnAfterReleaseConnection)
+ then fOnAfterReleaseConnection(Self, connname);
+ end;
+end;
+
+procedure TDARemoteService.Loaded;
+begin
+ inherited;
+
+ AcquireConnection := fStreamedAcquireConnection;
+end;
+
+procedure TDARemoteService.Assign(Source: TPersistent);
+var
+ lSource: TDARemoteService;
+begin
+ inherited;
+ if Source is TDARemoteService then begin
+ lSource := TDARemoteService(Source);
+
+ AcquireConnection := lSource.AcquireConnection;
+ AllowExecuteSQLCommand := lSource.AllowExecuteSQLCommand;
+ AllowWhereSQL := lSource.AllowWhereSQL;
+ AutoCreateBusinessProcessors := lSource.AutoCreateBusinessProcessors;
+ Cache := lSource.Cache;
+ CacheElements := lSource.CacheElements;
+ ConnectionName := lSource.ConnectionName;
+ ExportedDataTables := lSource.ExportedDataTables;
+ GetDatasetDataValidation := lSource.GetDatasetDataValidation;
+ OnAcquireConnectionFailure := lSource.OnAcquireConnectionFailure;
+ OnAfterAcquireConnection := lSource.OnAfterAcquireConnection;
+ OnAfterExecuteCommand := lSource.OnAfterExecuteCommand;
+ OnAfterGetDatasetData := lSource.OnAfterGetDatasetData;
+ OnAfterGetDatasetSchema := lSource.OnAfterGetDatasetSchema;
+ OnAfterProcessDeltas := lSource.OnAfterProcessDeltas;
+ OnAfterProcessTransactionAction := lSource.OnAfterProcessTransactionAction;
+ OnAfterReleaseConnection := lSource.OnAfterReleaseConnection;
+ OnBeforeAcquireConnection := lSource.OnBeforeAcquireConnection;
+ OnBeforeExecuteCommand := lSource.OnBeforeExecuteCommand;
+ OnBeforeGetDatasetData := lSource.OnBeforeGetDatasetData;
+ OnBeforeGetDatasetSchema := lSource.OnBeforeGetDatasetSchema;
+ OnBeforeProcessDeltas := lSource.OnBeforeProcessDeltas;
+ OnBeforeReleaseConnection := lSource.OnBeforeReleaseConnection;
+ OnBusinessProcessorAutoCreated := lSource.OnBusinessProcessorAutoCreated;
+ OnGetCachedDataset := lSource.OnGetCachedDataset;
+ OnGetSchemaAsXMLEvent := lSource.OnGetSchemaAsXMLEvent;
+ OnProcessDeltasError := lSource.OnProcessDeltasError;
+ OnUpdateDataBeginTransaction := lSource.OnUpdateDataBeginTransaction;
+ OnUpdateDataCommitTransaction := lSource.OnUpdateDataCommitTransaction;
+ OnUpdateDataRollBackTransaction := lSource.OnUpdateDataRollBackTransaction;
+ Options := lSource.Options;
+ ServiceAdapter := lSource.ServiceAdapter;
+ ServiceSchema := lSource.ServiceSchema;
+ end;
+end;
+
+procedure TDARemoteService.CheckObjects(const aConnection: IDAConnection;
+ aSchema: TDASchema; anAdapter: TDADataAdapter;
+ CheckConnection : boolean = TRUE;
+ CheckSchema : boolean = TRUE;
+ CheckAdapter : boolean = TRUE);
+begin
+ if CheckConnection and not Assigned(aConnection) then RaiseError(err_DARDMConnectionIsNotAssigned);
+ if CheckSchema and not Assigned(aSchema) then RaiseError(err_DARDMInvalidSchema);
+ if CheckAdapter and not Assigned(anAdapter) then RaiseError(err_DARDMUnassignedAdapter);
+end;
+
+procedure TDARemoteService.Notification(AComponent: TComponent;
+ Operation: TOperation);
+var ref : TDADataTableReference;
+begin
+ inherited;
+
+ if (Operation = opRemove) then begin
+ if (aComponent = fServiceSchema) then ServiceSchema := nil
+ else if (AComponent=fCache) then fCache := NIL
+ else if (aComponent = fServiceAdapter) then ServiceAdapter := nil
+ else if (AComponent is TDADataTable) and (fExportedDataTables<>NIL) then begin
+ ref := fExportedDataTables.FindByDataTable(TDADataTable(aComponent));
+ if (ref<>NIL) then ref.DataTable := NIL;
+ end;
+ end
+
+ else if (Operation = opInsert) then begin
+ if not (csLoading in ComponentState) and (AComponent is TDASchema) and (fServiceSchema = nil) and (AComponent.Owner = Self) then ServiceSchema := TDASchema(aComponent);
+ end;
+end;
+
+procedure TDARemoteService.SetAcquireConnection(const Value: boolean);
+begin
+ if (csLoading in ComponentState) then
+ fStreamedAcquireConnection := Value
+ else begin
+ if Value then begin
+ if (fServiceSchema = nil) then raise Exception.Create(err_DARDMInvalidSchema);
+ end;
+
+ fAcquireConnection := Value;
+ end;
+end;
+
+procedure TDARemoteService.SetConnection(const aValue: IDAConnection);
+begin
+ if assigned(fConnection) and Supports(fConnection, IDAHETConnection) then
+ raise Exception.Create(err_HETConnectionNotSupportedInV3);
+ fConnection := aValue;
+end;
+
+procedure TDARemoteService.SetConnectionName(const Value: string);
+begin
+ fConnectionName := Trim(Value);
+ if (fConnectionName = '') then fAcquireConnection := FALSE;
+end;
+
+procedure TDARemoteService.SetServiceSchema(const Value: TDASchema);
+begin
+ if fServiceSchema <> Value then begin
+ if (fServiceSchema <> nil) then fServiceSchema.RORemoveFreeNotification(Self);
+ fServiceSchema := Value;
+
+ if (fServiceSchema <> nil) then
+ fServiceSchema.ROFreeNotification(Self)
+ else
+ fAcquireConnection := FALSE;
+ end;
+end;
+
+procedure TDARemoteService.SetServiceAdapter(const Value: TDADataAdapter);
+begin
+ if fServiceAdapter <> Value then begin
+ if (fServiceAdapter <> nil) then fServiceAdapter.RORemoveFreeNotification(Self);
+ fServiceAdapter := Value;
+ if (fServiceAdapter <> nil) then fServiceAdapter.ROFreeNotification(Self);
+ end;
+end;
+
+function TDARemoteService.TriggerTransactionEvent(aEvent: TDAUpdateDataTransactionEvent): Boolean;
+begin
+ result := true;
+ if assigned(aEvent) then aEvent(self, result);
+end;
+
+function TDARemoteService.DoGetDatasetData(
+ const Stream: TStream;
+ const aConnection: IDAConnection;
+ const aDatasetName: ansistring;
+ const aParamNames: array of string;
+ const aParamValues : array of variant;
+ const UserFilter : ansistring;
+ aSchema: TDASchema;
+ anAdapter: TDADataAdapter;
+ someOptions: TDAWriteOptions;
+ MaxRecords: integer): integer;
+
+var
+ ds: IDADataset;
+ i, cnt: integer;
+ paramname: string;
+ paramvalue: variant;
+ inclrows,
+ inclschema: boolean;
+ allow : boolean;
+ ref : TDADataTableReference;
+ cachedentry : IDACacheEntry;
+ cacheelement : TDACacheElement;
+ lDatasetName: string;
+ lUserFilter: string;
+begin
+ // Misc
+ lDatasetName:= Utf8ToString(aDatasetName);
+ luserFilter := Utf8ToString(UserFilter);
+ cachedentry := NIL;
+
+ inclschema := (woSchema in someOptions);
+ inclrows := (woRows in someOptions);
+ ref := NIL;
+
+ if (fCache<>NIL) then begin
+ // If the service is connected to a cache, then it searches the cache for this dataset
+ cachedentry := fCache.Get(Self.Name+'.'+lDatasetName);
+ end;
+
+ if (cachedentry=NIL) then begin
+ // New: searches for a datatable reference that matches the request, if any are present
+ // This allows the user to return in memory datasets or other custom data
+ if (fExportedDataTables.Count>0) then begin
+ ref := fExportedDataTables.FindByName(lDatasetName); // Already checks the datatable is not NIL
+ if (ref<>NIL) then begin
+ ds := ref.Dataset;
+ end;
+ end;
+ end;
+
+ // Checks for connection, schema and adapter to be assigned since it will need to query the DB in this case
+ if (ref=NIL) and (cachedentry=NIL)
+ then CheckObjects(aConnection, aSchema, anAdapter);
+
+ // Security check, common to every case
+ allow := TRUE;
+ if Assigned(fGetDatasetDataValidation)
+ then fGetDatasetDataValidation(Self, aConnection, lDatasetName, aParamNames, aParamValues, aSchema, allow);
+
+ if not allow
+ then raise EDADatasetNotAccessible.CreateFmt(err_DatasetNotAccessible, [aDatasetName]);
+
+ // Returns the actual data. Cached and non-cached data follow two different paths (some events are not triggered in the
+ // case of cached data, since we don't have an actual IDADataset to reference)
+
+ if (cachedentry<>NIL) then begin
+ if Assigned(fOnGetCachedDataset) then fOnGetCachedDataset(Self, lDatasetName, cachedentry.Data);
+
+ result := cachedentry.RecordCount;
+ Stream.CopyFrom(cachedentry.Data, 0);
+ end
+ else begin
+
+ if TriggerTransactionEvent(fOnUpdateDataBeginTransaction) then Connection.BeginTransaction;
+ try
+
+ // Gets a reference to the dataset if it couldn't find a datatable to match the request...
+ if (ref=NIL) then
+ ds := aSchema.NewDataset(aConnection, lDatasetName);
+
+ // Fills the parameters (if any are specified)
+ cnt := Length(aParamNames);
+ if (cnt>0) then begin
+ for i := 0 to (cnt-1) do begin
+ paramname := aParamNames[i];
+ paramvalue := aParamValues[i];
+
+ ds.ParamByName(paramname).Value := paramvalue;
+ end;
+ end;
+
+ // Applies the UserFilter, if any specified
+ if (Trim(lUserFilter)<>'') then begin
+ if not AllowWhereSQL then
+ raise Exception.Create('Passing of clear text WHERE clauses has been disabled (GetData)');
+ ds.Where.AddText(lUserFilter);
+ end;
+
+ // ...and writes the data fireing the right events
+ if inclschema and Assigned(fOnBeforeGetDatasetSchema) then fOnBeforeGetDatasetSchema(ds);
+ if inclrows and Assigned(fOnBeforeGetDatasetData) then fOnBeforeGetDatasetData(ds, inclschema, MaxRecords);
+
+ result := anAdapter.WriteDataset(stream, ds, someOptions, MaxRecords);
+
+ if inclschema and Assigned(fOnAfterGetDatasetSchema) then fOnAfterGetDatasetSchema(ds);
+ if inclrows and Assigned(fOnAfterGetDatasetData) then fOnAfterGetDatasetData(ds, inclschema, MaxRecords);
+
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataCommitTransaction) then Connection.CommitTransaction;
+ except
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataRollBackTransaction) then Connection.RollbackTransaction;
+ raise;
+ end;
+
+ // Checks if it needs to stored it in the cache
+ if (fCache<>NIL) then begin
+ cacheelement := fCacheElements.FindByDatasetName(lDatasetName);
+ if (cacheelement=NIL) or not cacheelement.Enabled then Exit;
+
+ fCache.Store(Self.Name+'.'+lDatasetName, stream, TRUE, result, cacheelement.MaxReads, cacheelement.Duration);
+ end;
+
+ end;
+end;
+
+function TDARemoteService.GetDatasetSchema(
+ const aDatasetName: AnsiString): Binary;
+var tempds : IDADataset;
+ schemads : TDADataset;
+ dummyrefs : TObjectList;
+ lDatasetName: string;
+begin
+ dummyrefs := NIL;
+
+ CheckObjects(Connection, ServiceSchema, ServiceAdapter);
+
+ result := Binary.Create;
+ try
+ try
+ // New: merges the data tables references by the service
+ if (fExportedDataTables.Count>0) then begin
+ dummyrefs := TObjectList.Create;
+ MergeDatatablesToSchema(dummyrefs);
+ end;
+
+ lDatasetName := Utf8ToString(aDatasetName);
+ // Improved this method: now it is not necessary to have statements associated to a dataset
+ // thus allowing for the definition of in memory datasets inside a schema
+ schemads := ServiceSchema.Datasets.DatasetByName(lDatasetName);
+ tempds := Connection.NewDataset('', lDatasetName);
+
+ // Copies the schema
+ tempds.Fields.AssignFieldCollection(schemads.Fields);
+ tempds.Params.AssignParamCollection(schemads.Params);
+
+ ServiceAdapter.WriteDataset(result, tempds, [woSchema], 0);
+ except
+ FreeAndNIL(result);
+ raise;
+ end;
+ finally
+ dummyrefs.Free;
+ end;
+end;
+
+type
+ TBizProcessorReference = class(TObject)
+ private
+ end;
+
+function TDARemoteService.UnpackDeltas(const DeltaStream: Binary;
+ DeltaStructList : TDADeltaStructList): integer;
+var x, i: integer;
+ deltaname: string;
+ bizproc: TDABusinessProcessor;
+ details : TDADatasetRelationshipList;
+ found: boolean;
+ struct : TDADeltaStruct;
+begin
+ result := 0;
+ with ServiceAdapter do begin
+
+ // Reads the deltas.
+ Initialize(DeltaStream, aiReadFromBeginning);
+ try
+ if (DeltaCount = 0) then Exit;
+
+ for i := 0 to (DeltaCount - 1) do begin
+ deltaname := DeltaNames[i];
+ found := FALSE;
+
+ { Tries to locate a user-defined business processor }
+ for x := 0 to (Self.ComponentCount - 1) do
+ if (Self.Components[x] is TDABusinessProcessor) then begin
+ bizproc := TDABusinessProcessor(Self.Components[x]);
+ if SameText(bizproc.ReferencedDataset, deltaname) then begin
+ struct := DeltaStructList.Add(NewDelta(deltaname), bizproc);
+ ReadDelta(deltaname, struct.Delta);
+
+ found := TRUE;
+ Break;
+ end;
+ end;
+
+ { Either creates one or aborts raising an exception }
+ if not found then begin
+ if not AutoCreateBusinessProcessors then RaiseError(err_DARDMCannotFindProxessorForDelta, [deltaname]);
+
+ bizproc := TDABusinessProcessor.Create(Self);
+ bizproc.ReferencedDataset := deltaname;
+ bizproc.Schema := ServiceSchema;
+
+ struct := DeltaStructList.Add(NewDelta(deltaname), bizproc);
+ ReadDelta(deltaname, struct.Delta);
+
+ if Assigned(fOnBusinessProcessorAutoCreated)
+ then fOnBusinessProcessorAutoCreated(Self, bizproc);
+ end;
+
+ Inc(result);
+ end;
+
+ if (result=0) then Exit; // Cannot process anything!
+
+ { Sets the master/detail relationships }
+ with ServiceSchema do
+ if (RelationShips.Count>0) then begin
+ details := TDADatasetRelationshipList.Create;
+ try
+
+ for i := 0 to DeltaStructList.Count-1 do begin
+ RelationShips.GetDetails(DeltaStructList[i].BusinessProcessor.ReferencedDataset, details);
+ if (details.Count=0) then Continue;
+
+ { Prepares an array with the references to the detail deltas that will be used later on to adjust
+ autoincs, etc. }
+ for x := 0 to details.Count-1 do begin
+ struct := DeltaStructList.FindStruct(details[x].DetailDatasetName);
+ if (struct<>NIL) then begin
+ DeltaStructList[i].DetailDeltas.Add(struct.Delta);
+ DeltaStructList[i].RelationShips.Add(details[x]);
+ end;
+ end;
+ end;
+ finally
+ details.Free;
+ end;
+
+ end;
+ finally
+ Finalize;
+ end;
+ end;
+end;
+
+function TDARemoteService.UpdateData(const Delta: Binary): Binary;
+var
+ deltastructs : TDADeltaStructList;
+ struct : TDADeltaStruct;
+ k, i: integer;
+ doraise : boolean;
+ processeddeltas : TStringList;
+
+ function ProceedDefaultTransactionLogic(aEvent: TDAUpdateDataTransactionEvent): Boolean;
+ begin
+ Result := True;
+ if Assigned(aEvent)
+ then aEvent(Self, Result);
+ end;
+
+ procedure FlushCache(const aDatasetName : string);
+ var element : TDACacheElement;
+ begin
+ if (fCache=NIL) or (fCacheElements.Count=0) then Exit;
+
+ element := fCacheElements.FindByDatasetName(aDatasetName);
+ if (element=NIL) then Exit;
+
+ if (ceoFlushOnUpdate in element.Options)
+ then fCache.Flush(Self.Name+'.'+aDatasetName);
+ end;
+
+begin
+ result := NIL;
+ processeddeltas := NIL;
+
+ CheckObjects(Connection, ServiceSchema, ServiceAdapter);
+
+ deltastructs := TDADeltaStructList.Create;
+
+ with ServiceAdapter do try
+ try
+ // Reads the deltas. The order in which the are put in the stream indicates
+ // the order in which updates are being made
+ if not (UnpackDeltas(Delta, deltastructs)>0) then Exit;
+
+ // Applies the updates
+ if ProceedDefaultTransactionLogic(fOnUpdateDataBeginTransaction)
+ then Connection.BeginTransaction;
+
+ if Assigned(fOnBeforeProcessDeltas) then fOnBeforeProcessDeltas(Self, deltastructs);
+
+ if (ServiceSchema.UpdateRules.Count=0) and (rsoProcessDeltasWithoutUpdateRules in Options) then begin
+ // Processes them in order, from first to last delta sent
+ for i := 0 to deltastructs.Count-1 do begin
+ // Flushes the cache for the given dataset
+ FlushCache(deltastructs[i].Delta.LogicalName);
+
+ deltastructs[i].BusinessProcessor.ProcessDelta(Connection, deltastructs[i].Delta, AllChanges);
+ end;
+ end
+ else try
+ processeddeltas := TStringList.Create;
+
+ for i := 0 to (ServiceSchema.UpdateRules.Count-1) do begin
+ // Processes them in the order defined in the schema
+ struct := deltastructs.FindStruct(ServiceSchema.UpdateRules[i].DatasetName);
+ if (struct<>NIL) then begin
+ // Adds the dataset name to the list of processed deltas. Those that don't have update rules will be processed later
+ processeddeltas.Add(struct.Delta.LogicalName);
+
+ // Flushes the cache for the given dataset
+ FlushCache(struct.Delta.LogicalName);
+
+ // Processes the delta
+ struct.BusinessProcessor.ProcessDelta(Connection, struct.Delta, ServiceSchema.UpdateRules[i].ChangeTypes);
+
+
+ if (ctInsert in ServiceSchema.UpdateRules[i].ChangeTypes) then begin
+ for k := 0 to (struct.DetailDeltas.Count-1) do
+ struct.BusinessProcessor.SynchronizeAutoIncs(struct.Delta, struct.DetailDeltas[k], struct.RelationShips[k]);
+ end;
+ end;
+ end;
+
+ // Processes the deltas for which update rules were not defined
+ if (rsoProcessDeltasWithoutUpdateRules in Options) then begin
+ for i := 0 to deltastructs.Count-1 do begin
+ // Skips if already processed
+ if (processeddeltas.IndexOf(deltastructs[i].Delta.LogicalName)>=0) then Continue;
+
+ // Flushes the cache for the given dataset
+ FlushCache(deltastructs[i].Delta.LogicalName);
+
+ deltastructs[i].BusinessProcessor.ProcessDelta(Connection, deltastructs[i].Delta, AllChanges);
+ end;
+ end;
+
+ finally
+ processeddeltas.Free;
+ end;
+
+ if Assigned(fOnAfterProcessDeltas) then fOnAfterProcessDeltas(Self, deltastructs);
+
+ if Connection.InTransaction and ProceedDefaultTransactionLogic(fOnUpdateDataCommitTransaction)
+ then Connection.CommitTransaction;
+
+ // Prepares the response
+ result := Binary.Create;
+ ServiceAdapter.Initialize(result, aiWrite);
+ try
+ for i := 0 to deltastructs.Count-1 do
+ WriteDelta(deltastructs[i].Delta);
+ finally
+ ServiceAdapter.Finalize;
+ end;
+
+ except
+ on E:Exception do begin
+ doraise := TRUE;
+ try
+ if Assigned(fOnProcessDeltasError)
+ then fOnProcessDeltasError(Self, deltastructs, E, doraise);
+ finally
+ if Connection.InTransaction and ProceedDefaultTransactionLogic(fOnUpdateDataRollBackTransaction)
+ then Connection.RollbackTransaction;
+ end;
+ if doraise then raise;
+ end;
+ end;
+ finally
+ deltastructs.Free;
+ end;
+end;
+
+function TDARemoteService.ExecuteSQLCommand(const SQL: AnsiString): Integer;
+begin
+ if not AllowExecuteSQLCommand then
+ RaiseError(err_ExecuteSQLCommandNotAllowed);
+
+ CheckObjects(Connection, ServiceSchema, NIL, TRUE, TRUE, FALSE);
+
+ if TriggerTransactionEvent(fOnUpdateDataBeginTransaction) then Connection.BeginTransaction;
+ try
+ result := Connection.NewCommand(Utf8ToString(SQL), stSQL).Execute;
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataCommitTransaction) then Connection.CommitTransaction;
+ except
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataRollBackTransaction) then Connection.RollbackTransaction;
+ raise;
+ end;
+end;
+
+function TDARemoteService.GetDatasetData(const DatasetName: AnsiString; const Params: AnsiString;
+ const IncludeSchema: Boolean; const MaxRecords: Integer): Binary;
+var
+ parnames: array of string;
+ parvalues: array of Variant;
+ options: TDAWriteOptions;
+ pars: TStringList;
+ i : integer;
+begin
+ pars := TStringList.Create;
+ result := Binary.Create;
+ try
+ try
+ pars.Text := Utf8ToString(Params);
+ SetLength(parnames, pars.Count);
+ SetLength(parvalues, pars.Count);
+ for i := 0 to (pars.Count-1) do begin
+ parnames[i] := pars.Names[i];
+ parvalues[i] := pars.Values[pars.Names[i]];
+ end;
+
+ if IncludeSchema
+ then options := [woSchema, woRows]
+ else options := [woRows];
+
+ DoGetDatasetData(result, Connection, DatasetName, parnames, parvalues, '', ServiceSchema, ServiceAdapter, options, MaxRecords);
+ except
+ FreeAndNIL(result);
+ raise;
+ end;
+ finally
+ pars.Free;
+ end;
+end;
+
+function TDARemoteService.CreateParamString(
+ const ParamNames: array of string;
+ const ParamValues: array of Variant): string;
+var
+ i: integer;
+begin
+ result := '';
+
+ for i := 0 to High(ParamNames) do
+ result := result + ParamNames[i] + '=' + VarToStr(ParamValues[i]) + #13;
+end;
+
+function TDARemoteService.GetDatasetData(const DatasetName: ansistring;
+ const ParamNames: array of string; const ParamValues: array of Variant;
+ const IncludeSchema: Boolean; const MaxRecords: Integer): Binary;
+var
+ options: TDAWriteOptions;
+begin
+ {result := GetDatasetData(DatasetName, CreateParamString(ParamNames, ParamValues), IncludeSchema, MaxRecords);}
+ result := Binary.Create;
+ try
+ if IncludeSchema
+ then options := [woSchema, woRows]
+ else options := [woRows];
+ DoGetDatasetData(result, Connection, DatasetName, ParamNames, ParamValues, '', ServiceSchema, ServiceAdapter, options, MaxRecords);
+ except
+ FreeAndNIL(result);
+ raise;
+ end;
+end;
+
+function TDARemoteService.GetDatasetData(const DatasetName: ansistring;
+ const IncludeSchema: Boolean = FALSE;
+ const MaxRecords: Integer = -1): Binary;
+begin
+ result := GetDatasetData(DatasetName, '', IncludeSchema, MaxRecords);
+end;
+
+procedure TDARemoteService.MergeDatatablesToSchema(aList : TList);
+var i : integer;
+ ref : TDADataset;
+ dt : IDADataset;
+begin
+ if (fExportedDataTables.Count>0) then begin
+ for i := 0 to fExportedDataTables.Count-1 do
+ if fExportedDataTables[i].IsValidReference {and fExportedDataTables[i].ExportAsPartOfSchema} then begin
+ dt := fExportedDataTables[i].Dataset;
+
+ ref := ServiceSchema.Datasets.Add;
+ ref.Name := dt.LogicalName;
+ ref.Fields.AssignFieldCollection(dt.Fields);
+ ref.Params.AssignParamCollection(dt.Params);
+
+ aList.Add(ref);
+ end;
+ end;
+end;
+
+function TDARemoteService.GetSchemaAsXML: AnsiString;
+var xml : TStringStream;
+ dummyrefs : TObjectList;
+begin
+ result := '';
+ dummyrefs := NIL;
+
+ if not Assigned(ServiceSchema) then Exit;
+
+ try
+ // New: merges the data tables references by the service
+ if (fExportedDataTables.Count>0) then begin
+ dummyrefs := TObjectList.Create;
+ MergeDatatablesToSchema(dummyrefs);
+ end;
+
+ // Returns the schema
+ xml := TStringStream.Create('');
+ try
+ ServiceSchema.SaveToStream(xml);
+
+ result := UTF8Encode(xml.DataString);
+
+ if Assigned(fOnGetSchemaAsXML)
+ then fOnGetSchemaAsXML(Self, result);
+ finally
+ xml.Free;
+ end;
+
+ finally
+ dummyrefs.Free; // automatically removes the datatables from the schema again
+ end;
+end;
+
+function TDARemoteService.GetDatasetDataEx(const DatasetName: AnsiString;
+ const Params: TDADatasetParamArray;
+ const UserFilter: AnsiString;
+ const IncludeSchema: Boolean;
+ const MaxRecords: Integer): Binary;
+var parnames : array of string;
+ parvalues : array of variant;
+ i : integer;
+ options : TDAWriteOptions;
+begin
+ result := Binary.Create;
+ try
+ { Prepares the parameter arrays}
+ if (Params<>NIL) then begin
+ SetLength(parnames, Params.Count);
+ SetLength(parvalues, Params.Count);
+ for i := 0 to (Params.Count-1) do begin
+ parnames[i] := Utf8ToString(Params[i].Name);
+ parvalues[i] := Params[i].Value;
+ end;
+ end
+ else begin
+ SetLength(parnames, 0);
+ SetLength(parvalues, 0);
+ end;
+
+ { Other options }
+ if IncludeSchema
+ then options := [woSchema, woRows]
+ else options := [woRows];
+
+ { Reads the data }
+ DoGetDatasetData(result, Connection, DatasetName, parnames, parvalues, UserFilter, ServiceSchema, ServiceAdapter, options, MaxRecords);
+ except
+ FreeAndNIL(result);
+ raise;
+ end;
+end;
+
+function TDARemoteService.GetMultipleDatasets(const DatasetRequestInfoArray: TDADatasetRequestInfoArray): TROBinaryMemoryStream;
+var i : integer;
+ ds : IDADataset;
+ parnames : array of string;
+ parvalues : array of variant;
+ x : integer;
+ opt : TDAWriteOptions;
+ allow : boolean;
+ lDatasetName: string;
+begin
+ result := NIL;
+ if (DatasetRequestInfoArray=NIL) or (DatasetRequestInfoArray.Count=0) then exit;
+ result := Binary.Create;
+ try
+ ServiceAdapter.Initialize(result, aiWrite);
+ try
+
+ for i := 0 to (DatasetRequestInfoArray.Count-1) do begin
+ with DatasetRequestInfoArray[i] do begin
+ SetLength(parnames, Params.Count);
+ SetLength(parvalues, Params.Count);
+ for x := 0 to (Params.Count-1) do begin
+ parnames[x] := Utf8ToString(Params[x].Name);
+ parvalues[x] := Params[x].Value;
+ end;
+ lDatasetName := Utf8ToString(DatasetName);
+ opt := [woRows];
+ if DatasetRequestInfoArray[i].IncludeSchema then opt := opt+[woSchema];
+
+ // Security check
+ allow := TRUE;
+ if Assigned(fGetDatasetDataValidation)
+ then fGetDatasetDataValidation(Self, Connection, lDatasetName, parnames, parvalues, ServiceSchema, allow);
+
+ if not allow
+ then raise EDADatasetNotAccessible.CreateFmt(err_DatasetNotAccessible, [lDatasetName]);
+
+ // Proceeds
+ ds := ServiceSchema.NewDataset(Connection, lDatasetName, parnames, parvalues, TRUE);
+
+ ServiceAdapter.WriteDataset(ds, opt, MaxRecords);
+ end;
+ end;
+ finally
+ ServiceAdapter.Finalize();
+ end;
+ except
+ FreeAndNIL(result);
+ raise
+ end;
+end;
+
+function TDARemoteService.GetDatasetScripts(const DatasetNames: AnsiString): AnsiString;
+var names : TStringList;
+ i : integer;
+ ds : TDADataset;
+begin
+ result := '';
+ names := TStringList.Create;
+ try
+ CheckObjects(NIL, fServiceSchema, NIL, FALSE, TRUE, FALSE);
+ names.CommaText := Utf8ToString(DatasetNames);
+
+ result := '';
+
+ for i := 0 to (names.Count-1) do begin
+ ds := fServiceSchema.Datasets.DatasetByName(names[i]);
+
+ result := result+ {$IFDEF UNICODE}UTF8Encode{$ENDIF}(
+ Format('<%s Language="%s">%s>', [
+ names[i],
+ GetEnumName(TypeInfo(TROSEScriptLanguage), Ord(ds.BusinessRulesClient.ScriptLanguage)),
+ {$IFNDEF UNICODE}UTF8Encode{$ENDIF}(ds.BusinessRulesClient.Script),
+ names[i]]));
+ end;
+
+ result := result+AnsiString(' ');
+ finally
+ FreeAndNIL(names);
+ end;
+end;
+
+function TDARemoteService.ExecuteSQLCommandEx(const CommandName: AnsiString;
+ const Params: TDADatasetParamArray): Integer;
+var cmd : IDASQLCommand;
+ i : integer;
+begin
+ if not AllowExecuteSQLCommand then
+ RaiseError(err_ExecuteSQLCommandNotAllowed);
+
+ CheckObjects(Connection, ServiceSchema, NIL, TRUE, TRUE, FALSE);
+
+ cmd := ServiceSchema.NewCommand(Connection, Utf8ToString(CommandName));
+ for i := 0 to (Params.Count-1) do
+ cmd.ParamByName(Utf8ToString(Params[i].Name)).Value := Params[i].Value;
+
+ if Assigned(fOnBeforeExecuteCommand)
+ then fOnBeforeExecuteCommand(Self, cmd);
+
+ if TriggerTransactionEvent(fOnUpdateDataBeginTransaction) then Connection.BeginTransaction;
+ try
+ result := cmd.Execute;
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataCommitTransaction) then Connection.CommitTransaction;
+ except
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataRollBackTransaction) then Connection.RollbackTransaction;
+ raise;
+ end;
+
+ if Assigned(fOnAfterExecuteCommand)
+ then fOnAfterExecuteCommand(Self, cmd, result);
+end;
+
+procedure TDARemoteService.SetExportedDataTables(const Value: TDADataTableReferenceCollection);
+begin
+ fExportedDataTables.Assign(Value);
+end;
+
+procedure TDARemoteService.SetCache(const Value: TDACache);
+begin
+ if fCache <> Value then begin
+ if (fCache<>NIL) then fCache.RemoveFreeNotification(Self);
+ fCache := Value;
+ if (fCache<>NIL) then fCache.FreeNotification(Self);
+ end;
+end;
+
+procedure TDARemoteService.SetCacheElements(
+ const Value: TDACacheElementCollection);
+begin
+ fCacheElements.Assign(Value);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DBSessionManager Create Session Table.sql b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DBSessionManager Create Session Table.sql
new file mode 100644
index 0000000..54f5e49
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DBSessionManager Create Session Table.sql
@@ -0,0 +1,15 @@
+CREATE TABLE [dbo].[Sessions] (
+ [SessionID] [char] (38) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
+ [Created] [datetime] NULL ,
+ [LastAccessed] [datetime] NULL ,
+ [Data] [image] NULL
+) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
+GO
+
+ALTER TABLE [dbo].[Sessions] WITH NOCHECK ADD
+ CONSTRAINT [PK_Sessions] PRIMARY KEY CLUSTERED
+ (
+ [SessionID]
+ ) ON [PRIMARY]
+GO
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DBSessionManager Default Schema.daConnections b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DBSessionManager Default Schema.daConnections
new file mode 100644
index 0000000..625165d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DBSessionManager Default Schema.daConnections
@@ -0,0 +1 @@
+ADO?AuxDriver=SQLOLEDB.1;Server=localhost;Database=Northwind;UserID=sa;Password=; True MSSQL 0 10 pbWait True 60 0 1
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DBSessionManager Default Schema.daSchema b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DBSessionManager Default Schema.daSchema
new file mode 100644
index 0000000..32f7e13
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DBSessionManager Default Schema.daSchema
@@ -0,0 +1,30 @@
+
+Insert_Session dabtUnknown datString SessionID daptInput 38 dabtUnknown datDateTime Created daptInput 0 dabtUnknown datDateTime LastAccessed daptInput 0 dabtUnknown datBlob Data daptInput 0 MSSQL INSERT
+ INTO Sessions
+ (SessionID, Created, LastAccessed, Data)
+ VALUES
+ (:SessionID, :Created, :LastAccessed, :Data) stSQL Update_Session dabtUnknown datDateTime LastAccessed daptInput 0 dabtUnknown datBlob Data daptInput 0 dabtUnknown datString SessionID daptInput 38 MSSQL UPDATE
+ Sessions
+ SET
+ LastAccessed = :LastAccessed,
+ Data = :Data
+ WHERE
+ SessionID = :SessionID
+ stSQL ClearSessions dabtUnknown datDateTime LastAccessed daptInput 0 MSSQL DELETE
+ FROM
+ Sessions
+ WHERE
+ LastAccessed < :LastAccessed stSQL Delete_Session dabtUnknown datString SessionID daptInput 38 MSSQL DELETE
+ FROM
+ Sessions
+ WHERE
+ SessionID = :SessionID stSQL True True rslPascalScript rslPascalScript taLeftJustify dabtUnknown False datString SessionID 0 False True False False SessionID False False False 38 True GetAllSessionIDsDataset SessionID SessionID MSSQL Select SessionID from Sessions
+ stSQL True True rslPascalScript rslPascalScript taLeftJustify dabtUnknown False datInteger COLUMN1 0 False True False False COLUMN1 False False False 0 True GetSessionCount COLUMN1 COLUMN1 MSSQL SELECT
+ COUNT(*)
+ FROM
+ Sessions stSQL True True rslPascalScript rslPascalScript taLeftJustify dabtUnknown False datString SessionID 0 True True False False SessionID False False False 38 True taLeftJustify dabtUnknown False datDateTime Created 0 False True False False Created False False False 0 True taLeftJustify dabtUnknown False datDateTime LastAccessed 0 False True False False LastAccessed False False False 0 True taLeftJustify dabtUnknown False datBlob Data 0 False True False False Data False False False 0 True GetSession dabtUnknown datString SessionID daptInput 38 SessionID SessionID Created Created LastAccessed LastAccessed Data Data MSSQL SELECT
+ SessionID, Created, LastAccessed, Data
+ FROM
+ Sessions
+ WHERE
+ SessionID = :SessionID stSQL 0
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract.inc b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract.inc
new file mode 100644
index 0000000..b54e9da
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract.inc
@@ -0,0 +1,33 @@
+{$INCLUDE eDefines.inc}
+{.$DEFINE STORERECID}
+{$DEFINE DataAbstract5}
+
+{$IFDEF FPC}
+ {$IFNDEF RO_FPC_MODE_SET}
+ {$MODE DELPHI}
+ {$DEFINE RO_FPC_MODE_SET}
+ {$ENDIF}
+ {$DEFINE FPC_SAFECALL_BUG}
+ {$DEFINE DA_WideMemoSupport} // support for ftWideMemo
+ {$DEFINE DA_FixedWideCharSupport} // support for ftWideFixedChar
+ {.$DEFINE ftFMTBCD_Support} // support for FMTBCD
+{$ENDIF}
+
+{$IFDEF DELPHI6UP}
+ {$DEFINE ftFMTBCD_Support} // support for FMTBCD
+{$ENDIF}
+
+
+{$IFDEF DELPHI10UP}
+ {$DEFINE DA_WideMemoSupport} // support for ftWideMemo
+ {$DEFINE DA_FixedWideCharSupport} // support for ftWideFixedChar
+{$ENDIF}
+
+// always use std methods for TDataset-compatible drivers
+{$DEFINE Drivers_CompatibilityMode}
+
+// bug in Delphi2009 with AsAnsiString
+{.$DEFINE DELPHI2009_USE_AsAnsiString_for_TStringField}
+
+//
+{$DEFINE USE_LOCALDATAADAPTER}
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3.rodl b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3.rodl
new file mode 100644
index 0000000..d9d82c1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3.rodl
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3_Async.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3_Async.pas
new file mode 100644
index 0000000..e823d65
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3_Async.pas
@@ -0,0 +1,367 @@
+unit DataAbstract3_Async;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROTypes, uROClientIntf, uROAsync,
+ {Project:} DataAbstract3_Intf;
+
+type
+ { IDARemoteService_Async }
+ IDARemoteService_Async = interface(IROAsyncInterface)
+ ['{F8299772-C66E-4D77-A4F9-78400662810B}']
+ procedure Invoke_GetDatasetSchema(const aDatasetName: AnsiString);
+ procedure Invoke_GetDatasetScripts(const DatasetNames: AnsiString);
+ procedure Invoke_GetDatasetData(const DatasetName: AnsiString; const Params: AnsiString; const IncludeSchema: Boolean; const MaxRecords: Integer);
+ procedure Invoke_GetDatasetDataEx(const DatasetName: AnsiString; const Params: TDADatasetParamArray; const UserFilter: AnsiString; const IncludeSchema: Boolean; const MaxRecords: Integer);
+ procedure Invoke_UpdateData(const Delta: Binary);
+ procedure Invoke_ExecuteSQLCommand(const SQL: AnsiString);
+ procedure Invoke_GetSchemaAsXML;
+ procedure Invoke_GetMultipleDatasets(const DatasetRequestInfoArray: TDADatasetRequestInfoArray);
+ procedure Invoke_ExecuteSQLCommandEx(const CommandName: AnsiString; const Params: TDADatasetParamArray);
+ function Retrieve_GetDatasetSchema: Binary;
+ function Retrieve_GetDatasetScripts: AnsiString;
+ function Retrieve_GetDatasetData: Binary;
+ function Retrieve_GetDatasetDataEx: Binary;
+ function Retrieve_UpdateData: Binary;
+ function Retrieve_ExecuteSQLCommand: Integer;
+ function Retrieve_GetSchemaAsXML: AnsiString;
+ function Retrieve_GetMultipleDatasets: Binary;
+ function Retrieve_ExecuteSQLCommandEx: Integer;
+ end;
+
+ { IDALoginService_Async }
+ IDALoginService_Async = interface(IDARemoteService_Async)
+ ['{5A9C9231-1C8D-4436-88E1-07AD23D7BEF3}']
+ procedure Invoke_Login(const UserID: AnsiString; const Password: AnsiString);
+ procedure Invoke_Logout;
+ function Retrieve_Login(out LoginInfo: TDALoginInfo): Boolean;
+ end;
+
+ { CoDARemoteService_Async }
+ CoDARemoteService_Async = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDARemoteService_Async;
+ end;
+
+ { CoDALoginService_Async }
+ CoDALoginService_Async = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDALoginService_Async;
+ end;
+
+ { TDARemoteService_AsyncProxy }
+ TDARemoteService_AsyncProxy = class(TROAsyncProxy, IDARemoteService_Async)
+ private
+ protected
+ function __GetInterfaceName:string; override;
+
+ procedure Invoke_GetDatasetSchema(const aDatasetName: AnsiString);
+ procedure Invoke_GetDatasetScripts(const DatasetNames: AnsiString);
+ procedure Invoke_GetDatasetData(const DatasetName: AnsiString; const Params: AnsiString; const IncludeSchema: Boolean; const MaxRecords: Integer);
+ procedure Invoke_GetDatasetDataEx(const DatasetName: AnsiString; const Params: TDADatasetParamArray; const UserFilter: AnsiString; const IncludeSchema: Boolean; const MaxRecords: Integer);
+ procedure Invoke_UpdateData(const Delta: Binary);
+ procedure Invoke_ExecuteSQLCommand(const SQL: AnsiString);
+ procedure Invoke_GetSchemaAsXML;
+ procedure Invoke_GetMultipleDatasets(const DatasetRequestInfoArray: TDADatasetRequestInfoArray);
+ procedure Invoke_ExecuteSQLCommandEx(const CommandName: AnsiString; const Params: TDADatasetParamArray);
+ function Retrieve_GetDatasetSchema: Binary;
+ function Retrieve_GetDatasetScripts: AnsiString;
+ function Retrieve_GetDatasetData: Binary;
+ function Retrieve_GetDatasetDataEx: Binary;
+ function Retrieve_UpdateData: Binary;
+ function Retrieve_ExecuteSQLCommand: Integer;
+ function Retrieve_GetSchemaAsXML: AnsiString;
+ function Retrieve_GetMultipleDatasets: Binary;
+ function Retrieve_ExecuteSQLCommandEx: Integer;
+ end;
+
+ { TDALoginService_AsyncProxy }
+ TDALoginService_AsyncProxy = class(TDARemoteService_AsyncProxy, IDALoginService_Async)
+ private
+ protected
+ function __GetInterfaceName:string; override;
+
+ procedure Invoke_Login(const UserID: AnsiString; const Password: AnsiString);
+ procedure Invoke_Logout;
+ function Retrieve_Login(out LoginInfo: TDALoginInfo): Boolean;
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils;
+
+{ CoDARemoteService }
+
+class function CoDARemoteService_Async.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDARemoteService_Async;
+begin
+ result := TDARemoteService_AsyncProxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TDARemoteService_AsyncProxy }
+
+function TDARemoteService_AsyncProxy.__GetInterfaceName:string;
+begin
+ result := 'DARemoteService';
+end;
+
+procedure TDARemoteService_AsyncProxy.Invoke_GetDatasetSchema(const aDatasetName: AnsiString);
+begin
+ __AssertProxyNotBusy('GetDatasetSchema');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetDatasetSchema');
+ __Message.Write('aDatasetName', TypeInfo(AnsiString), aDatasetName, []);
+ __DispatchAsyncRequest('GetDatasetSchema',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDARemoteService_AsyncProxy.Retrieve_GetDatasetSchema: Binary;
+var __response:TStream;
+begin
+ result := nil;
+ __response := __RetrieveAsyncResponse('GetDatasetSchema');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Binary), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDARemoteService_AsyncProxy.Invoke_GetDatasetScripts(const DatasetNames: AnsiString);
+begin
+ __AssertProxyNotBusy('GetDatasetScripts');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetDatasetScripts');
+ __Message.Write('DatasetNames', TypeInfo(AnsiString), DatasetNames, []);
+ __DispatchAsyncRequest('GetDatasetScripts',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDARemoteService_AsyncProxy.Retrieve_GetDatasetScripts: AnsiString;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('GetDatasetScripts');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(AnsiString), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDARemoteService_AsyncProxy.Invoke_GetDatasetData(const DatasetName: AnsiString; const Params: AnsiString; const IncludeSchema: Boolean; const MaxRecords: Integer);
+begin
+ __AssertProxyNotBusy('GetDatasetData');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetDatasetData');
+ __Message.Write('DatasetName', TypeInfo(AnsiString), DatasetName, []);
+ __Message.Write('Params', TypeInfo(AnsiString), Params, []);
+ __Message.Write('IncludeSchema', TypeInfo(Boolean), IncludeSchema, []);
+ __Message.Write('MaxRecords', TypeInfo(Integer), MaxRecords, []);
+ __DispatchAsyncRequest('GetDatasetData',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDARemoteService_AsyncProxy.Retrieve_GetDatasetData: Binary;
+var __response:TStream;
+begin
+ result := nil;
+ __response := __RetrieveAsyncResponse('GetDatasetData');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Binary), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDARemoteService_AsyncProxy.Invoke_GetDatasetDataEx(const DatasetName: AnsiString; const Params: TDADatasetParamArray; const UserFilter: AnsiString; const IncludeSchema: Boolean; const MaxRecords: Integer);
+begin
+ __AssertProxyNotBusy('GetDatasetDataEx');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetDatasetDataEx');
+ __Message.Write('DatasetName', TypeInfo(AnsiString), DatasetName, []);
+ __Message.Write('Params', TypeInfo(TDADatasetParamArray), Params, []);
+ __Message.Write('UserFilter', TypeInfo(AnsiString), UserFilter, []);
+ __Message.Write('IncludeSchema', TypeInfo(Boolean), IncludeSchema, []);
+ __Message.Write('MaxRecords', TypeInfo(Integer), MaxRecords, []);
+ __DispatchAsyncRequest('GetDatasetDataEx',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDARemoteService_AsyncProxy.Retrieve_GetDatasetDataEx: Binary;
+var __response:TStream;
+begin
+ result := nil;
+ __response := __RetrieveAsyncResponse('GetDatasetDataEx');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Binary), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDARemoteService_AsyncProxy.Invoke_UpdateData(const Delta: Binary);
+begin
+ __AssertProxyNotBusy('UpdateData');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'UpdateData');
+ __Message.Write('Delta', TypeInfo(Binary), Delta, []);
+ __DispatchAsyncRequest('UpdateData',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDARemoteService_AsyncProxy.Retrieve_UpdateData: Binary;
+var __response:TStream;
+begin
+ result := nil;
+ __response := __RetrieveAsyncResponse('UpdateData');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Binary), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDARemoteService_AsyncProxy.Invoke_ExecuteSQLCommand(const SQL: AnsiString);
+begin
+ __AssertProxyNotBusy('ExecuteSQLCommand');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'ExecuteSQLCommand');
+ __Message.Write('SQL', TypeInfo(AnsiString), SQL, []);
+ __DispatchAsyncRequest('ExecuteSQLCommand',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDARemoteService_AsyncProxy.Retrieve_ExecuteSQLCommand: Integer;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('ExecuteSQLCommand');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Integer), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDARemoteService_AsyncProxy.Invoke_GetSchemaAsXML;
+begin
+ __AssertProxyNotBusy('GetSchemaAsXML');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetSchemaAsXML');
+ __DispatchAsyncRequest('GetSchemaAsXML',__Message);
+end;
+
+function TDARemoteService_AsyncProxy.Retrieve_GetSchemaAsXML: AnsiString;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('GetSchemaAsXML');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(AnsiString), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDARemoteService_AsyncProxy.Invoke_GetMultipleDatasets(const DatasetRequestInfoArray: TDADatasetRequestInfoArray);
+begin
+ __AssertProxyNotBusy('GetMultipleDatasets');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetMultipleDatasets');
+ __Message.Write('DatasetRequestInfoArray', TypeInfo(TDADatasetRequestInfoArray), DatasetRequestInfoArray, []);
+ __DispatchAsyncRequest('GetMultipleDatasets',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDARemoteService_AsyncProxy.Retrieve_GetMultipleDatasets: Binary;
+var __response:TStream;
+begin
+ result := nil;
+ __response := __RetrieveAsyncResponse('GetMultipleDatasets');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Binary), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDARemoteService_AsyncProxy.Invoke_ExecuteSQLCommandEx(const CommandName: AnsiString; const Params: TDADatasetParamArray);
+begin
+ __AssertProxyNotBusy('ExecuteSQLCommandEx');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'ExecuteSQLCommandEx');
+ __Message.Write('CommandName', TypeInfo(AnsiString), CommandName, []);
+ __Message.Write('Params', TypeInfo(TDADatasetParamArray), Params, []);
+ __DispatchAsyncRequest('ExecuteSQLCommandEx',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDARemoteService_AsyncProxy.Retrieve_ExecuteSQLCommandEx: Integer;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('ExecuteSQLCommandEx');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Integer), Result, []);
+
+ __response.Free();
+end;
+
+
+{ CoDALoginService }
+
+class function CoDALoginService_Async.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDALoginService_Async;
+begin
+ result := TDALoginService_AsyncProxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TDALoginService_AsyncProxy }
+
+function TDALoginService_AsyncProxy.__GetInterfaceName:string;
+begin
+ result := 'DALoginService';
+end;
+
+procedure TDALoginService_AsyncProxy.Invoke_Login(const UserID: AnsiString; const Password: AnsiString);
+begin
+ __AssertProxyNotBusy('Login');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'Login');
+ __Message.Write('UserID', TypeInfo(AnsiString), UserID, []);
+ __Message.Write('Password', TypeInfo(AnsiString), Password, []);
+ __DispatchAsyncRequest('Login',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDALoginService_AsyncProxy.Retrieve_Login(out LoginInfo: TDALoginInfo): Boolean;
+var __response:TStream;
+begin
+ LoginInfo := nil;
+ __response := __RetrieveAsyncResponse('Login');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Boolean), Result, []);
+ __Message.Read('LoginInfo', TypeInfo(TDALoginInfo), LoginInfo, []);
+
+ __response.Free();
+end;
+
+procedure TDALoginService_AsyncProxy.Invoke_Logout;
+begin
+ __AssertProxyNotBusy('Logout');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'Logout');
+ __DispatchAsyncRequest('Logout',__Message, false);
+end;
+
+
+initialization
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3_Intf.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3_Intf.pas
new file mode 100644
index 0000000..c1f4134
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3_Intf.pas
@@ -0,0 +1,1367 @@
+unit DataAbstract3_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf;
+
+const
+ { Library ID }
+ LibraryUID = '{2966A4BF-569C-45AA-8F34-CF1E155FD77A}';
+ TargetNamespace = '';
+
+ { Service Interface ID's }
+ IDARemoteService_IID : TGUID = '{C532E842-0AA9-4253-A9BF-AFCF22885B97}';
+ IDALoginService_IID : TGUID = '{58550AA0-B64F-495A-B2F8-C981D4C39180}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ IDARemoteService = interface;
+ IDALoginService = interface;
+
+ TDADatasetParamArray = class;
+ TDADatasetRequestInfoArray = class;
+ TDAStringArray = class;
+
+ TDADatasetParam = class;
+ TDADatasetRequestInfo = class;
+ TDALoginInfo = class;
+
+
+ { TDADatasetParam }
+ TDADatasetParam = class(TROComplexType)
+ private
+ fName: AnsiString;
+ fValue: Variant;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property Name:AnsiString read fName write fName;
+ property Value:Variant read fValue write fValue;
+ end;
+
+ { TDADatasetParamCollection }
+ TDADatasetParamCollection = class(TROCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(aIndex: integer): TDADatasetParam;
+ procedure SetItems(aIndex: integer; const Value: TDADatasetParam);
+ public
+ constructor Create; overload;
+ function Add: TDADatasetParam; reintroduce;
+ procedure SaveToArray(anArray: TDADatasetParamArray);
+ procedure LoadFromArray(anArray: TDADatasetParamArray);
+ property Items[Index: integer]:TDADatasetParam read GetItems write SetItems; default;
+ end;
+
+ { TDADatasetRequestInfo }
+ TDADatasetRequestInfo = class(TROComplexType)
+ private
+ fDatasetName: AnsiString;
+ fIncludeSchema: Boolean;
+ fMaxRecords: Integer;
+ fParams: TDADatasetParamArray;
+ function GetParams: TDADatasetParamArray;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property DatasetName:AnsiString read fDatasetName write fDatasetName;
+ property IncludeSchema:Boolean read fIncludeSchema write fIncludeSchema;
+ property MaxRecords:Integer read fMaxRecords write fMaxRecords;
+ property Params:TDADatasetParamArray read GetParams write fParams;
+ end;
+
+ { TDADatasetRequestInfoCollection }
+ TDADatasetRequestInfoCollection = class(TROCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(aIndex: integer): TDADatasetRequestInfo;
+ procedure SetItems(aIndex: integer; const Value: TDADatasetRequestInfo);
+ public
+ constructor Create; overload;
+ function Add: TDADatasetRequestInfo; reintroduce;
+ procedure SaveToArray(anArray: TDADatasetRequestInfoArray);
+ procedure LoadFromArray(anArray: TDADatasetRequestInfoArray);
+ property Items[Index: integer]:TDADatasetRequestInfo read GetItems write SetItems; default;
+ end;
+
+ { TDALoginInfo }
+ TDALoginInfo = class(TROComplexType)
+ private
+ fSessionID: AnsiString;
+ fUserID: AnsiString;
+ fPrivileges: TDAStringArray;
+ fAttributes: TDAStringArray;
+ fData: Binary;
+ function GetPrivileges: TDAStringArray;
+ function GetAttributes: TDAStringArray;
+ function GetData: Binary;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property SessionID:AnsiString read fSessionID write fSessionID;
+ property UserID:AnsiString read fUserID write fUserID;
+ property Privileges:TDAStringArray read GetPrivileges write fPrivileges;
+ property Attributes:TDAStringArray read GetAttributes write fAttributes;
+ property Data:Binary read GetData write fData;
+ end;
+
+ { TDALoginInfoCollection }
+ TDALoginInfoCollection = class(TROCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(aIndex: integer): TDALoginInfo;
+ procedure SetItems(aIndex: integer; const Value: TDALoginInfo);
+ public
+ constructor Create; overload;
+ function Add: TDALoginInfo; reintroduce;
+ property Items[Index: integer]:TDALoginInfo read GetItems write SetItems; default;
+ end;
+
+ { TDADatasetParamArray }
+ TDADatasetParamArray_TDADatasetParam = array of TDADatasetParam;
+ TDADatasetParamArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : TDADatasetParamArray_TDADatasetParam;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): TDADatasetParam;
+ procedure SetItems(aIndex: integer; const Value: TDADatasetParam);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemClass: TClass; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure SetItemRef(aIndex: integer; Ref: pointer); override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add: TDADatasetParam; overload;
+ function Add(const Value: TDADatasetParam):integer; overload;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:TDADatasetParam read GetItems write SetItems; default;
+ property InnerArray: TDADatasetParamArray_TDADatasetParam read fItems;
+ end;
+
+ { TDADatasetRequestInfoArray }
+ TDADatasetRequestInfoArray_TDADatasetRequestInfo = array of TDADatasetRequestInfo;
+ TDADatasetRequestInfoArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : TDADatasetRequestInfoArray_TDADatasetRequestInfo;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): TDADatasetRequestInfo;
+ procedure SetItems(aIndex: integer; const Value: TDADatasetRequestInfo);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemClass: TClass; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure SetItemRef(aIndex: integer; Ref: pointer); override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add: TDADatasetRequestInfo; overload;
+ function Add(const Value: TDADatasetRequestInfo):integer; overload;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:TDADatasetRequestInfo read GetItems write SetItems; default;
+ property InnerArray: TDADatasetRequestInfoArray_TDADatasetRequestInfo read fItems;
+ end;
+
+ { TDAStringArray }
+ TDAStringArray_AnsiString = array of AnsiString;
+ TDAStringArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : TDAStringArray_AnsiString;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): AnsiString;
+ procedure SetItems(aIndex: integer; const Value: AnsiString);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add(const Value:AnsiString): integer;
+ function GetIndex(const aPropertyName : string;
+ const aPropertyValue : Variant;
+ StartFrom : integer = 0;
+ Options : TROSearchOptions = [soIgnoreCase]) : integer; override;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:AnsiString read GetItems write SetItems; default;
+ property InnerArray: TDAStringArray_AnsiString read fItems;
+ end;
+
+ { IDARemoteService }
+ IDARemoteService = interface
+ ['{C532E842-0AA9-4253-A9BF-AFCF22885B97}']
+ function GetDatasetSchema(const aDatasetName: AnsiString): Binary;
+ function GetDatasetScripts(const DatasetNames: AnsiString): AnsiString;
+ function GetDatasetData(const DatasetName: AnsiString; const Params: AnsiString; const IncludeSchema: Boolean; const MaxRecords: Integer): Binary;
+ function GetDatasetDataEx(const DatasetName: AnsiString; const Params: TDADatasetParamArray; const UserFilter: AnsiString; const IncludeSchema: Boolean;
+ const MaxRecords: Integer): Binary;
+ function UpdateData(const Delta: Binary): Binary;
+ function ExecuteSQLCommand(const SQL: AnsiString): Integer;
+ function GetSchemaAsXML: AnsiString;
+ function GetMultipleDatasets(const DatasetRequestInfoArray: TDADatasetRequestInfoArray): Binary;
+ function ExecuteSQLCommandEx(const CommandName: AnsiString; const Params: TDADatasetParamArray): Integer;
+ end;
+
+ { CoDARemoteService }
+ CoDARemoteService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDARemoteService;
+ end;
+
+ { TDARemoteService_Proxy }
+ TDARemoteService_Proxy = class(TROProxy, IDARemoteService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function GetDatasetSchema(const aDatasetName: AnsiString): Binary;
+ function GetDatasetScripts(const DatasetNames: AnsiString): AnsiString;
+ function GetDatasetData(const DatasetName: AnsiString; const Params: AnsiString; const IncludeSchema: Boolean; const MaxRecords: Integer): Binary;
+ function GetDatasetDataEx(const DatasetName: AnsiString; const Params: TDADatasetParamArray; const UserFilter: AnsiString; const IncludeSchema: Boolean;
+ const MaxRecords: Integer): Binary;
+ function UpdateData(const Delta: Binary): Binary;
+ function ExecuteSQLCommand(const SQL: AnsiString): Integer;
+ function GetSchemaAsXML: AnsiString;
+ function GetMultipleDatasets(const DatasetRequestInfoArray: TDADatasetRequestInfoArray): Binary;
+ function ExecuteSQLCommandEx(const CommandName: AnsiString; const Params: TDADatasetParamArray): Integer;
+ end;
+
+ { IDALoginService }
+ IDALoginService = interface(IDARemoteService)
+ ['{58550AA0-B64F-495A-B2F8-C981D4C39180}']
+ function Login(const UserID: AnsiString; const Password: AnsiString; out LoginInfo: TDALoginInfo): Boolean;
+ procedure Logout;
+ end;
+
+ { CoDALoginService }
+ CoDALoginService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDALoginService;
+ end;
+
+ { TDALoginService_Proxy }
+ TDALoginService_Proxy = class(TDARemoteService_Proxy, IDALoginService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function Login(const UserID: AnsiString; const Password: AnsiString; out LoginInfo: TDALoginInfo): Boolean;
+ procedure Logout;
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uROSerializer, uRORes;
+
+{ TDADatasetParamArray }
+
+procedure TDADatasetParamArray.Assign(iSource: TPersistent);
+var lSource:TDADatasetParamArray;
+ i:integer;
+begin
+ if (iSource is TDADatasetParamArray) then begin
+ lSource := TDADatasetParamArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ if Assigned(lSource.Items[i]) then begin
+ Items[i].Assign(lSource.Items[i]);
+ end;
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function TDADatasetParamArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(TDADatasetParam);
+end;
+
+class function TDADatasetParamArray.GetItemClass: TClass;
+begin
+ result := TDADatasetParam;
+end;
+
+class function TDADatasetParamArray.GetItemSize: integer;
+begin
+ result := SizeOf(TDADatasetParam);
+end;
+
+function TDADatasetParamArray.GetItems(aIndex: integer): TDADatasetParam;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function TDADatasetParamArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+procedure TDADatasetParamArray.SetItemRef(aIndex: integer; Ref: pointer);
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if Ref <> fItems[aIndex] then begin
+ if fItems[aIndex] <> nil then fItems[aIndex].Free;
+ fItems[aIndex] := Ref;
+ end;
+end;
+
+procedure TDADatasetParamArray.Clear;
+var i: integer;
+begin
+ for i := 0 to (Count-1) do fItems[i].Free();
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure TDADatasetParamArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ fItems[aIndex].Free();
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if fItems[aIndex] <> Value then begin
+ fItems[aIndex].Free;
+ fItems[aIndex] := Value;
+ end;
+end;
+
+procedure TDADatasetParamArray.Resize(ElementCount: integer);
+var i: Integer;
+begin
+ if fCount = ElementCount then Exit;
+ for i := FCount -1 downto ElementCount do
+ FItems[i].Free;
+ SetLength(fItems, ElementCount);
+ for i := FCount to ElementCount -1 do
+ FItems[i] := TDADatasetParam.Create;
+ FCount := ElementCount;
+end;
+
+function TDADatasetParamArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure TDADatasetParamArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function TDADatasetParamArray.Add: TDADatasetParam;
+begin
+ result := TDADatasetParam.Create;
+ Add(Result);
+end;
+
+function TDADatasetParamArray.Add(const Value:TDADatasetParam): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+procedure TDADatasetParamArray.ReadComplex(ASerializer: TObject);
+var
+ lval: TDADatasetParam;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadStruct(GetArrayElementName(GetItemType, GetItemRef(i)), TDADatasetParam, lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure TDADatasetParamArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteStruct(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], TDADatasetParam, i);
+end;
+
+{ TDADatasetRequestInfoArray }
+
+procedure TDADatasetRequestInfoArray.Assign(iSource: TPersistent);
+var lSource:TDADatasetRequestInfoArray;
+ i:integer;
+begin
+ if (iSource is TDADatasetRequestInfoArray) then begin
+ lSource := TDADatasetRequestInfoArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ if Assigned(lSource.Items[i]) then begin
+ Items[i].Assign(lSource.Items[i]);
+ end;
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function TDADatasetRequestInfoArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(TDADatasetRequestInfo);
+end;
+
+class function TDADatasetRequestInfoArray.GetItemClass: TClass;
+begin
+ result := TDADatasetRequestInfo;
+end;
+
+class function TDADatasetRequestInfoArray.GetItemSize: integer;
+begin
+ result := SizeOf(TDADatasetRequestInfo);
+end;
+
+function TDADatasetRequestInfoArray.GetItems(aIndex: integer): TDADatasetRequestInfo;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function TDADatasetRequestInfoArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+procedure TDADatasetRequestInfoArray.SetItemRef(aIndex: integer; Ref: pointer);
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if Ref <> fItems[aIndex] then begin
+ if fItems[aIndex] <> nil then fItems[aIndex].Free;
+ fItems[aIndex] := Ref;
+ end;
+end;
+
+procedure TDADatasetRequestInfoArray.Clear;
+var i: integer;
+begin
+ for i := 0 to (Count-1) do fItems[i].Free();
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure TDADatasetRequestInfoArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ fItems[aIndex].Free();
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if fItems[aIndex] <> Value then begin
+ fItems[aIndex].Free;
+ fItems[aIndex] := Value;
+ end;
+end;
+
+procedure TDADatasetRequestInfoArray.Resize(ElementCount: integer);
+var i: Integer;
+begin
+ if fCount = ElementCount then Exit;
+ for i := FCount -1 downto ElementCount do
+ FItems[i].Free;
+ SetLength(fItems, ElementCount);
+ for i := FCount to ElementCount -1 do
+ FItems[i] := TDADatasetRequestInfo.Create;
+ FCount := ElementCount;
+end;
+
+function TDADatasetRequestInfoArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure TDADatasetRequestInfoArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function TDADatasetRequestInfoArray.Add: TDADatasetRequestInfo;
+begin
+ result := TDADatasetRequestInfo.Create;
+ Add(Result);
+end;
+
+function TDADatasetRequestInfoArray.Add(const Value:TDADatasetRequestInfo): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+procedure TDADatasetRequestInfoArray.ReadComplex(ASerializer: TObject);
+var
+ lval: TDADatasetRequestInfo;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadStruct(GetArrayElementName(GetItemType, GetItemRef(i)), TDADatasetRequestInfo, lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure TDADatasetRequestInfoArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteStruct(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], TDADatasetRequestInfo, i);
+end;
+
+{ TDAStringArray }
+
+procedure TDAStringArray.Assign(iSource: TPersistent);
+var lSource:TDAStringArray;
+ i:integer;
+begin
+ if (iSource is TDAStringArray) then begin
+ lSource := TDAStringArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ Items[i] := lSource.Items[i];
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function TDAStringArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(AnsiString);
+end;
+
+class function TDAStringArray.GetItemSize: integer;
+begin
+ result := SizeOf(AnsiString);
+end;
+
+function TDAStringArray.GetItems(aIndex: integer): AnsiString;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function TDAStringArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := @fItems[aIndex];
+end;
+
+procedure TDAStringArray.Clear;
+begin
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure TDAStringArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ fItems[aIndex] := Value;
+end;
+
+procedure TDAStringArray.Resize(ElementCount: integer);
+begin
+ if fCount = ElementCount then Exit;
+ SetLength(fItems, ElementCount);
+ FCount := ElementCount;
+end;
+
+function TDAStringArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure TDAStringArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function TDAStringArray.Add(const Value: AnsiString): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+function TDAStringArray.GetIndex(const aPropertyName: string;
+ const aPropertyValue: Variant; StartFrom: integer;
+ Options: TROSearchOptions): integer;
+begin
+ result := -1;
+end;
+
+procedure TDAStringArray.ReadComplex(ASerializer: TObject);
+var
+ lval: AnsiString;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadUTF8String(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure TDAStringArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteUTF8String(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);
+end;
+
+{ TDADatasetParam }
+
+procedure TDADatasetParam.Assign(iSource: TPersistent);
+var lSource: DataAbstract3_Intf.TDADatasetParam;
+begin
+ inherited Assign(iSource);
+ if (iSource is DataAbstract3_Intf.TDADatasetParam) then begin
+ lSource := DataAbstract3_Intf.TDADatasetParam(iSource);
+ Name := lSource.Name;
+ Value := lSource.Value;
+ end;
+end;
+
+procedure TDADatasetParam.ReadComplex(ASerializer: TObject);
+var
+ l_Name: AnsiString;
+ l_Value: Variant;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ l_Name := Name;
+ TROSerializer(ASerializer).ReadUTF8String('Name', l_Name);
+ Name := l_Name;
+ l_Value := Value;
+ TROSerializer(ASerializer).ReadVariant('Value', l_Value);
+ Value := l_Value;
+ end
+ else begin
+ l_Name := Name;
+ TROSerializer(ASerializer).ReadUTF8String('Name', l_Name);
+ Name := l_Name;
+ l_Value := Value;
+ TROSerializer(ASerializer).ReadVariant('Value', l_Value);
+ Value := l_Value;
+ end;
+end;
+
+procedure TDADatasetParam.WriteComplex(ASerializer: TObject);
+var
+ l_Name: AnsiString;
+ l_Value: Variant;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ TROSerializer(ASerializer).ChangeClass(TDADatasetParam);
+ l_Name := Name;
+ TROSerializer(ASerializer).WriteUTF8String('Name', l_Name);
+ l_Value := Value;
+ TROSerializer(ASerializer).WriteVariant('Value', l_Value);
+ end
+ else begin
+ l_Name := Name;
+ TROSerializer(ASerializer).WriteUTF8String('Name', l_Name);
+ l_Value := Value;
+ TROSerializer(ASerializer).WriteVariant('Value', l_Value);
+ end;
+end;
+
+{ TDADatasetParamCollection }
+constructor TDADatasetParamCollection.Create;
+begin
+ inherited Create(TDADatasetParam);
+end;
+
+constructor TDADatasetParamCollection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function TDADatasetParamCollection.Add: TDADatasetParam;
+begin
+ result := TDADatasetParam(inherited Add);
+end;
+
+function TDADatasetParamCollection.GetItems(aIndex: integer): TDADatasetParam;
+begin
+ result := TDADatasetParam(inherited Items[aIndex]);
+end;
+
+procedure TDADatasetParamCollection.LoadFromArray(anArray: TDADatasetParamArray);
+var i : integer;
+begin
+ Clear;
+ for i := 0 to (anArray.Count-1) do
+ Add.Assign(anArray[i]);
+end;
+
+procedure TDADatasetParamCollection.SaveToArray(anArray: TDADatasetParamArray);
+var i : integer;
+begin
+ anArray.Clear;
+ anArray.Resize(Count);
+ for i := 0 to (Count-1) do begin
+ anArray[i] := TDADatasetParam.Create;
+ anArray[i].Assign(Items[i]);
+ end;
+end;
+
+procedure TDADatasetParamCollection.SetItems(aIndex: integer; const Value: TDADatasetParam);
+begin
+ TDADatasetParam(inherited Items[aIndex]).Assign(Value);
+end;
+
+{ TDADatasetRequestInfo }
+
+procedure TDADatasetRequestInfo.Assign(iSource: TPersistent);
+var lSource: DataAbstract3_Intf.TDADatasetRequestInfo;
+begin
+ inherited Assign(iSource);
+ if (iSource is DataAbstract3_Intf.TDADatasetRequestInfo) then begin
+ lSource := DataAbstract3_Intf.TDADatasetRequestInfo(iSource);
+ DatasetName := lSource.DatasetName;
+ IncludeSchema := lSource.IncludeSchema;
+ MaxRecords := lSource.MaxRecords;
+ Params.Assign(lSource.Params);
+ end;
+end;
+
+function TDADatasetRequestInfo.GetParams: TDADatasetParamArray;
+begin
+ if (fParams = nil) then fParams := TDADatasetParamArray.Create();
+ result := fParams;
+end;
+
+procedure TDADatasetRequestInfo.ReadComplex(ASerializer: TObject);
+var
+ l_DatasetName: AnsiString;
+ l_IncludeSchema: Boolean;
+ l_MaxRecords: Integer;
+ l_Params: TDADatasetParamArray;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ l_DatasetName := DatasetName;
+ TROSerializer(ASerializer).ReadUTF8String('DatasetName', l_DatasetName);
+ DatasetName := l_DatasetName;
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).ReadEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ IncludeSchema := l_IncludeSchema;
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).ReadInteger('MaxRecords', otSLong, l_MaxRecords);
+ MaxRecords := l_MaxRecords;
+ l_Params := Params;
+ TROSerializer(ASerializer).ReadArray('Params', TDADatasetParamArray, l_Params);
+ if Params <> l_Params then Params.Free;
+ Params := l_Params;
+ end
+ else begin
+ l_DatasetName := DatasetName;
+ TROSerializer(ASerializer).ReadUTF8String('DatasetName', l_DatasetName);
+ DatasetName := l_DatasetName;
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).ReadEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ IncludeSchema := l_IncludeSchema;
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).ReadInteger('MaxRecords', otSLong, l_MaxRecords);
+ MaxRecords := l_MaxRecords;
+ l_Params := Params;
+ TROSerializer(ASerializer).ReadArray('Params', TDADatasetParamArray, l_Params);
+ if Params <> l_Params then Params.Free;
+ Params := l_Params;
+ end;
+end;
+
+procedure TDADatasetRequestInfo.WriteComplex(ASerializer: TObject);
+var
+ l_DatasetName: AnsiString;
+ l_IncludeSchema: Boolean;
+ l_MaxRecords: Integer;
+ l_Params: TDADatasetParamArray;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ TROSerializer(ASerializer).ChangeClass(TDADatasetRequestInfo);
+ l_DatasetName := DatasetName;
+ TROSerializer(ASerializer).WriteUTF8String('DatasetName', l_DatasetName);
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).WriteEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).WriteInteger('MaxRecords', otSLong, l_MaxRecords);
+ l_Params := Params;
+ TROSerializer(ASerializer).WriteArray('Params', l_Params, TDADatasetParamArray);
+ end
+ else begin
+ l_DatasetName := DatasetName;
+ TROSerializer(ASerializer).WriteUTF8String('DatasetName', l_DatasetName);
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).WriteEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).WriteInteger('MaxRecords', otSLong, l_MaxRecords);
+ l_Params := Params;
+ TROSerializer(ASerializer).WriteArray('Params', l_Params, TDADatasetParamArray);
+ end;
+end;
+
+{ TDADatasetRequestInfoCollection }
+constructor TDADatasetRequestInfoCollection.Create;
+begin
+ inherited Create(TDADatasetRequestInfo);
+end;
+
+constructor TDADatasetRequestInfoCollection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function TDADatasetRequestInfoCollection.Add: TDADatasetRequestInfo;
+begin
+ result := TDADatasetRequestInfo(inherited Add);
+end;
+
+function TDADatasetRequestInfoCollection.GetItems(aIndex: integer): TDADatasetRequestInfo;
+begin
+ result := TDADatasetRequestInfo(inherited Items[aIndex]);
+end;
+
+procedure TDADatasetRequestInfoCollection.LoadFromArray(anArray: TDADatasetRequestInfoArray);
+var i : integer;
+begin
+ Clear;
+ for i := 0 to (anArray.Count-1) do
+ Add.Assign(anArray[i]);
+end;
+
+procedure TDADatasetRequestInfoCollection.SaveToArray(anArray: TDADatasetRequestInfoArray);
+var i : integer;
+begin
+ anArray.Clear;
+ anArray.Resize(Count);
+ for i := 0 to (Count-1) do begin
+ anArray[i] := TDADatasetRequestInfo.Create;
+ anArray[i].Assign(Items[i]);
+ end;
+end;
+
+procedure TDADatasetRequestInfoCollection.SetItems(aIndex: integer; const Value: TDADatasetRequestInfo);
+begin
+ TDADatasetRequestInfo(inherited Items[aIndex]).Assign(Value);
+end;
+
+{ TDALoginInfo }
+
+procedure TDALoginInfo.Assign(iSource: TPersistent);
+var lSource: DataAbstract3_Intf.TDALoginInfo;
+begin
+ inherited Assign(iSource);
+ if (iSource is DataAbstract3_Intf.TDALoginInfo) then begin
+ lSource := DataAbstract3_Intf.TDALoginInfo(iSource);
+ SessionID := lSource.SessionID;
+ UserID := lSource.UserID;
+ Privileges.Assign(lSource.Privileges);
+ Attributes.Assign(lSource.Attributes);
+ Data.Assign(lSource.Data);
+ end;
+end;
+
+function TDALoginInfo.GetPrivileges: TDAStringArray;
+begin
+ if (fPrivileges = nil) then fPrivileges := TDAStringArray.Create();
+ result := fPrivileges;
+end;
+
+function TDALoginInfo.GetAttributes: TDAStringArray;
+begin
+ if (fAttributes = nil) then fAttributes := TDAStringArray.Create();
+ result := fAttributes;
+end;
+
+function TDALoginInfo.GetData: Binary;
+begin
+ if (fData = nil) then fData := Binary.Create();
+ result := fData;
+end;
+
+procedure TDALoginInfo.ReadComplex(ASerializer: TObject);
+var
+ l_Attributes: TDAStringArray;
+ l_Data: Binary;
+ l_Privileges: TDAStringArray;
+ l_SessionID: AnsiString;
+ l_UserID: AnsiString;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ l_SessionID := SessionID;
+ TROSerializer(ASerializer).ReadUTF8String('SessionID', l_SessionID);
+ SessionID := l_SessionID;
+ l_UserID := UserID;
+ TROSerializer(ASerializer).ReadUTF8String('UserID', l_UserID);
+ UserID := l_UserID;
+ l_Privileges := Privileges;
+ TROSerializer(ASerializer).ReadArray('Privileges', TDAStringArray, l_Privileges);
+ if Privileges <> l_Privileges then Privileges.Free;
+ Privileges := l_Privileges;
+ l_Attributes := Attributes;
+ TROSerializer(ASerializer).ReadArray('Attributes', TDAStringArray, l_Attributes);
+ if Attributes <> l_Attributes then Attributes.Free;
+ Attributes := l_Attributes;
+ l_Data := Data;
+ TROSerializer(ASerializer).ReadBinary('Data', l_Data);
+ if Data <> l_Data then Data.Free;
+ Data := l_Data;
+ end
+ else begin
+ l_Attributes := Attributes;
+ TROSerializer(ASerializer).ReadArray('Attributes', TDAStringArray, l_Attributes);
+ if Attributes <> l_Attributes then Attributes.Free;
+ Attributes := l_Attributes;
+ l_Data := Data;
+ TROSerializer(ASerializer).ReadBinary('Data', l_Data);
+ if Data <> l_Data then Data.Free;
+ Data := l_Data;
+ l_Privileges := Privileges;
+ TROSerializer(ASerializer).ReadArray('Privileges', TDAStringArray, l_Privileges);
+ if Privileges <> l_Privileges then Privileges.Free;
+ Privileges := l_Privileges;
+ l_SessionID := SessionID;
+ TROSerializer(ASerializer).ReadUTF8String('SessionID', l_SessionID);
+ SessionID := l_SessionID;
+ l_UserID := UserID;
+ TROSerializer(ASerializer).ReadUTF8String('UserID', l_UserID);
+ UserID := l_UserID;
+ end;
+end;
+
+procedure TDALoginInfo.WriteComplex(ASerializer: TObject);
+var
+ l_Attributes: TDAStringArray;
+ l_Data: Binary;
+ l_Privileges: TDAStringArray;
+ l_SessionID: AnsiString;
+ l_UserID: AnsiString;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ TROSerializer(ASerializer).ChangeClass(TDALoginInfo);
+ l_SessionID := SessionID;
+ TROSerializer(ASerializer).WriteUTF8String('SessionID', l_SessionID);
+ l_UserID := UserID;
+ TROSerializer(ASerializer).WriteUTF8String('UserID', l_UserID);
+ l_Privileges := Privileges;
+ TROSerializer(ASerializer).WriteArray('Privileges', l_Privileges, TDAStringArray);
+ l_Attributes := Attributes;
+ TROSerializer(ASerializer).WriteArray('Attributes', l_Attributes, TDAStringArray);
+ l_Data := Data;
+ TROSerializer(ASerializer).WriteBinary('Data', l_Data);
+ end
+ else begin
+ l_Attributes := Attributes;
+ TROSerializer(ASerializer).WriteArray('Attributes', l_Attributes, TDAStringArray);
+ l_Data := Data;
+ TROSerializer(ASerializer).WriteBinary('Data', l_Data);
+ l_Privileges := Privileges;
+ TROSerializer(ASerializer).WriteArray('Privileges', l_Privileges, TDAStringArray);
+ l_SessionID := SessionID;
+ TROSerializer(ASerializer).WriteUTF8String('SessionID', l_SessionID);
+ l_UserID := UserID;
+ TROSerializer(ASerializer).WriteUTF8String('UserID', l_UserID);
+ end;
+end;
+
+{ TDALoginInfoCollection }
+constructor TDALoginInfoCollection.Create;
+begin
+ inherited Create(TDALoginInfo);
+end;
+
+constructor TDALoginInfoCollection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function TDALoginInfoCollection.Add: TDALoginInfo;
+begin
+ result := TDALoginInfo(inherited Add);
+end;
+
+function TDALoginInfoCollection.GetItems(aIndex: integer): TDALoginInfo;
+begin
+ result := TDALoginInfo(inherited Items[aIndex]);
+end;
+
+procedure TDALoginInfoCollection.SetItems(aIndex: integer; const Value: TDALoginInfo);
+begin
+ TDALoginInfo(inherited Items[aIndex]).Assign(Value);
+end;
+
+{ CoDARemoteService }
+
+class function CoDARemoteService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDARemoteService;
+begin
+ result := TDARemoteService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TDARemoteService_Proxy }
+
+function TDARemoteService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'DARemoteService';
+end;
+
+function TDARemoteService_Proxy.GetDatasetSchema(const aDatasetName: AnsiString): Binary;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetDatasetSchema');
+ __Message.Write('aDatasetName', TypeInfo(AnsiString), aDatasetName, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Binary), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDARemoteService_Proxy.GetDatasetScripts(const DatasetNames: AnsiString): AnsiString;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetDatasetScripts');
+ __Message.Write('DatasetNames', TypeInfo(AnsiString), DatasetNames, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(AnsiString), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDARemoteService_Proxy.GetDatasetData(const DatasetName: AnsiString; const Params: AnsiString; const IncludeSchema: Boolean; const MaxRecords: Integer): Binary;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetDatasetData');
+ __Message.Write('DatasetName', TypeInfo(AnsiString), DatasetName, []);
+ __Message.Write('Params', TypeInfo(AnsiString), Params, []);
+ __Message.Write('IncludeSchema', TypeInfo(Boolean), IncludeSchema, []);
+ __Message.Write('MaxRecords', TypeInfo(Integer), MaxRecords, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Binary), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDARemoteService_Proxy.GetDatasetDataEx(const DatasetName: AnsiString; const Params: TDADatasetParamArray; const UserFilter: AnsiString; const IncludeSchema: Boolean;
+ const MaxRecords: Integer): Binary;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetDatasetDataEx');
+ __Message.Write('DatasetName', TypeInfo(AnsiString), DatasetName, []);
+ __Message.Write('Params', TypeInfo(DataAbstract3_Intf.TDADatasetParamArray), Params, []);
+ __Message.Write('UserFilter', TypeInfo(AnsiString), UserFilter, []);
+ __Message.Write('IncludeSchema', TypeInfo(Boolean), IncludeSchema, []);
+ __Message.Write('MaxRecords', TypeInfo(Integer), MaxRecords, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Binary), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDARemoteService_Proxy.UpdateData(const Delta: Binary): Binary;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'UpdateData');
+ __Message.Write('Delta', TypeInfo(Binary), Delta, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Binary), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDARemoteService_Proxy.ExecuteSQLCommand(const SQL: AnsiString): Integer;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'ExecuteSQLCommand');
+ __Message.Write('SQL', TypeInfo(AnsiString), SQL, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Integer), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDARemoteService_Proxy.GetSchemaAsXML: AnsiString;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetSchemaAsXML');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(AnsiString), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDARemoteService_Proxy.GetMultipleDatasets(const DatasetRequestInfoArray: TDADatasetRequestInfoArray): Binary;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'GetMultipleDatasets');
+ __Message.Write('DatasetRequestInfoArray', TypeInfo(DataAbstract3_Intf.TDADatasetRequestInfoArray), DatasetRequestInfoArray, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Binary), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDARemoteService_Proxy.ExecuteSQLCommandEx(const CommandName: AnsiString; const Params: TDADatasetParamArray): Integer;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'ExecuteSQLCommandEx');
+ __Message.Write('CommandName', TypeInfo(AnsiString), CommandName, []);
+ __Message.Write('Params', TypeInfo(DataAbstract3_Intf.TDADatasetParamArray), Params, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Integer), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+{ CoDALoginService }
+
+class function CoDALoginService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDALoginService;
+begin
+ result := TDALoginService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TDALoginService_Proxy }
+
+function TDALoginService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'DALoginService';
+end;
+
+function TDALoginService_Proxy.Login(const UserID: AnsiString; const Password: AnsiString; out LoginInfo: TDALoginInfo): Boolean;
+begin
+ try
+ LoginInfo := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'Login');
+ __Message.Write('UserID', TypeInfo(AnsiString), UserID, []);
+ __Message.Write('Password', TypeInfo(AnsiString), Password, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Boolean), result, []);
+ __Message.Read('LoginInfo', TypeInfo(DataAbstract3_Intf.TDALoginInfo), LoginInfo, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+procedure TDALoginService_Proxy.Logout;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract3', __InterfaceName, 'Logout');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ finally
+ __Message.FreeStream;
+ end
+end;
+
+initialization
+ RegisterROClass(TDADatasetParam);
+ RegisterROClass(TDADatasetRequestInfo);
+ RegisterROClass(TDALoginInfo);
+ RegisterROClass(TDADatasetParamArray);
+ RegisterROClass(TDADatasetRequestInfoArray);
+ RegisterROClass(TDAStringArray);
+ RegisterProxyClass(IDARemoteService_IID, TDARemoteService_Proxy);
+ RegisterProxyClass(IDALoginService_IID, TDALoginService_Proxy);
+
+
+finalization
+ UnregisterROClass(TDADatasetParam);
+ UnregisterROClass(TDADatasetRequestInfo);
+ UnregisterROClass(TDALoginInfo);
+ UnregisterROClass(TDADatasetParamArray);
+ UnregisterROClass(TDADatasetRequestInfoArray);
+ UnregisterROClass(TDAStringArray);
+ UnregisterProxyClass(IDARemoteService_IID);
+ UnregisterProxyClass(IDALoginService_IID);
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3_Invk.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3_Invk.pas
new file mode 100644
index 0000000..9ad9018
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract3_Invk.pas
@@ -0,0 +1,365 @@
+unit DataAbstract3_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Generated:} DataAbstract3_Intf;
+
+type
+ TDARemoteService_Invoker = class(TROInvoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_GetDatasetSchema(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetDatasetScripts(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetDatasetData(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetDatasetDataEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_UpdateData(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_ExecuteSQLCommand(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetSchemaAsXML(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetMultipleDatasets(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_ExecuteSQLCommandEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+ TDALoginService_Invoker = class(TDARemoteService_Invoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_Login(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_Logout(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+{ TDARemoteService_Invoker }
+
+constructor TDARemoteService_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := True;
+end;
+
+procedure TDARemoteService_Invoker.Invoke_GetDatasetSchema(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetDatasetSchema(const aDatasetName: AnsiString): Binary; }
+var
+ aDatasetName: AnsiString;
+ lResult: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ lResult := nil;
+ try
+ __Message.Read('aDatasetName', TypeInfo(AnsiString), aDatasetName, []);
+
+ lResult := (__Instance as IDARemoteService).GetDatasetSchema(aDatasetName);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DARemoteService', 'GetDatasetSchemaResponse');
+ __Message.Write('Result', TypeInfo(Binary), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDARemoteService_Invoker.Invoke_GetDatasetScripts(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetDatasetScripts(const DatasetNames: AnsiString): AnsiString; }
+var
+ DatasetNames: AnsiString;
+ lResult: AnsiString;
+begin
+ try
+ __Message.Read('DatasetNames', TypeInfo(AnsiString), DatasetNames, []);
+
+ lResult := (__Instance as IDARemoteService).GetDatasetScripts(DatasetNames);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DARemoteService', 'GetDatasetScriptsResponse');
+ __Message.Write('Result', TypeInfo(AnsiString), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TDARemoteService_Invoker.Invoke_GetDatasetData(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetDatasetData(const DatasetName: AnsiString; const Params: AnsiString; const IncludeSchema: Boolean; const MaxRecords: Integer): Binary; }
+var
+ DatasetName: AnsiString;
+ Params: AnsiString;
+ IncludeSchema: Boolean;
+ MaxRecords: Integer;
+ lResult: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ lResult := nil;
+ try
+ __Message.Read('DatasetName', TypeInfo(AnsiString), DatasetName, []);
+ __Message.Read('Params', TypeInfo(AnsiString), Params, []);
+ __Message.Read('IncludeSchema', TypeInfo(Boolean), IncludeSchema, []);
+ __Message.Read('MaxRecords', TypeInfo(Integer), MaxRecords, []);
+
+ lResult := (__Instance as IDARemoteService).GetDatasetData(DatasetName, Params, IncludeSchema, MaxRecords);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DARemoteService', 'GetDatasetDataResponse');
+ __Message.Write('Result', TypeInfo(Binary), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDARemoteService_Invoker.Invoke_GetDatasetDataEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetDatasetDataEx(const DatasetName: AnsiString; const Params: TDADatasetParamArray; const UserFilter: AnsiString; const IncludeSchema: Boolean;
+ const MaxRecords: Integer): Binary; }
+var
+ DatasetName: AnsiString;
+ Params: DataAbstract3_Intf.TDADatasetParamArray;
+ UserFilter: AnsiString;
+ IncludeSchema: Boolean;
+ MaxRecords: Integer;
+ lResult: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ Params := nil;
+ lResult := nil;
+ try
+ __Message.Read('DatasetName', TypeInfo(AnsiString), DatasetName, []);
+ __Message.Read('Params', TypeInfo(DataAbstract3_Intf.TDADatasetParamArray), Params, []);
+ __Message.Read('UserFilter', TypeInfo(AnsiString), UserFilter, []);
+ __Message.Read('IncludeSchema', TypeInfo(Boolean), IncludeSchema, []);
+ __Message.Read('MaxRecords', TypeInfo(Integer), MaxRecords, []);
+
+ lResult := (__Instance as IDARemoteService).GetDatasetDataEx(DatasetName, Params, UserFilter, IncludeSchema, MaxRecords);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DARemoteService', 'GetDatasetDataExResponse');
+ __Message.Write('Result', TypeInfo(Binary), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(Params);
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDARemoteService_Invoker.Invoke_UpdateData(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function UpdateData(const Delta: Binary): Binary; }
+var
+ Delta: Binary;
+ lResult: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ Delta := nil;
+ lResult := nil;
+ try
+ __Message.Read('Delta', TypeInfo(Binary), Delta, []);
+
+ lResult := (__Instance as IDARemoteService).UpdateData(Delta);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DARemoteService', 'UpdateDataResponse');
+ __Message.Write('Result', TypeInfo(Binary), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(Delta);
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDARemoteService_Invoker.Invoke_ExecuteSQLCommand(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function ExecuteSQLCommand(const SQL: AnsiString): Integer; }
+var
+ SQL: AnsiString;
+ lResult: Integer;
+begin
+ try
+ __Message.Read('SQL', TypeInfo(AnsiString), SQL, []);
+
+ lResult := (__Instance as IDARemoteService).ExecuteSQLCommand(SQL);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DARemoteService', 'ExecuteSQLCommandResponse');
+ __Message.Write('Result', TypeInfo(Integer), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TDARemoteService_Invoker.Invoke_GetSchemaAsXML(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetSchemaAsXML: AnsiString; }
+var
+ lResult: AnsiString;
+begin
+ try
+ lResult := (__Instance as IDARemoteService).GetSchemaAsXML;
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DARemoteService', 'GetSchemaAsXMLResponse');
+ __Message.Write('Result', TypeInfo(AnsiString), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TDARemoteService_Invoker.Invoke_GetMultipleDatasets(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetMultipleDatasets(const DatasetRequestInfoArray: TDADatasetRequestInfoArray): Binary; }
+var
+ DatasetRequestInfoArray: DataAbstract3_Intf.TDADatasetRequestInfoArray;
+ lResult: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ DatasetRequestInfoArray := nil;
+ lResult := nil;
+ try
+ __Message.Read('DatasetRequestInfoArray', TypeInfo(DataAbstract3_Intf.TDADatasetRequestInfoArray), DatasetRequestInfoArray, []);
+
+ lResult := (__Instance as IDARemoteService).GetMultipleDatasets(DatasetRequestInfoArray);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DARemoteService', 'GetMultipleDatasetsResponse');
+ __Message.Write('Result', TypeInfo(Binary), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(DatasetRequestInfoArray);
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDARemoteService_Invoker.Invoke_ExecuteSQLCommandEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function ExecuteSQLCommandEx(const CommandName: AnsiString; const Params: TDADatasetParamArray): Integer; }
+var
+ CommandName: AnsiString;
+ Params: DataAbstract3_Intf.TDADatasetParamArray;
+ lResult: Integer;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ Params := nil;
+ try
+ __Message.Read('CommandName', TypeInfo(AnsiString), CommandName, []);
+ __Message.Read('Params', TypeInfo(DataAbstract3_Intf.TDADatasetParamArray), Params, []);
+
+ lResult := (__Instance as IDARemoteService).ExecuteSQLCommandEx(CommandName, Params);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DARemoteService', 'ExecuteSQLCommandExResponse');
+ __Message.Write('Result', TypeInfo(Integer), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(Params);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+{ TDALoginService_Invoker }
+
+constructor TDALoginService_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := True;
+end;
+
+procedure TDALoginService_Invoker.Invoke_Login(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function Login(const UserID: AnsiString; const Password: AnsiString; out LoginInfo: TDALoginInfo): Boolean; }
+var
+ UserID: AnsiString;
+ Password: AnsiString;
+ LoginInfo: DataAbstract3_Intf.TDALoginInfo;
+ lResult: Boolean;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ LoginInfo := nil;
+ try
+ __Message.Read('UserID', TypeInfo(AnsiString), UserID, []);
+ __Message.Read('Password', TypeInfo(AnsiString), Password, []);
+
+ lResult := (__Instance as IDALoginService).Login(UserID, Password, LoginInfo);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DALoginService', 'LoginResponse');
+ __Message.Write('Result', TypeInfo(Boolean), lResult, []);
+ __Message.Write('LoginInfo', TypeInfo(DataAbstract3_Intf.TDALoginInfo), LoginInfo, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(LoginInfo);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDALoginService_Invoker.Invoke_Logout(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure Logout; }
+begin
+ try
+ (__Instance as IDALoginService).Logout;
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract3', 'DALoginService', 'LogoutResponse');
+ __Message.Finalize;
+
+ __oResponseOptions := [roNoResponse];
+
+ finally
+ end;
+end;
+
+initialization
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4.rodl b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4.rodl
new file mode 100644
index 0000000..ed4cf28
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4.rodl
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4_Async.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4_Async.pas
new file mode 100644
index 0000000..6475085
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4_Async.pas
@@ -0,0 +1,670 @@
+unit DataAbstract4_Async;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROTypes, uROClientIntf, uROAsync,
+ {Project:} DataAbstract4_Intf;
+
+type
+ { IDataAbstractService_Async }
+ IDataAbstractService_Async = interface(IROAsyncInterface)
+ ['{B4C1D84D-1C6F-4E5A-8839-0C9F7EA5431B}']
+ procedure Invoke_GetSchema(const aFilter: Utf8String);
+ procedure Invoke_GetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray);
+ procedure Invoke_UpdateData(const aDelta: Binary);
+ procedure Invoke_ExecuteCommand(const aCommandName: Utf8String; const aParameterArray: DataParameterArray);
+ procedure Invoke_ExecuteCommandEx(const aCommandName: Utf8String; const aInputParameters: DataParameterArray);
+ procedure Invoke_GetTableSchema(const aTableNameArray: StringArray);
+ procedure Invoke_GetCommandSchema(const aCommandNameArray: StringArray);
+ procedure Invoke_SQLGetData(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer);
+ procedure Invoke_SQLGetDataEx(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer; const aDynamicWhereXML: Widestring);
+ procedure Invoke_SQLExecuteCommand(const aSQLText: Utf8String);
+ procedure Invoke_SQLExecuteCommandEx(const aSQLText: Utf8String; const aDynamicWhereXML: Widestring);
+ procedure Invoke_GetDatasetScripts(const DatasetNames: Utf8String);
+ procedure Invoke_RegisterForDataChangeNotification(const aTableName: Utf8String);
+ procedure Invoke_UnregisterForDataChangeNotification(const aTableName: Utf8String);
+ function Retrieve_GetSchema: Utf8String;
+ function Retrieve_GetData: Binary;
+ function Retrieve_UpdateData: Binary;
+ function Retrieve_ExecuteCommand: Integer;
+ function Retrieve_ExecuteCommandEx(out aOutputParameters: DataParameterArray): Integer;
+ function Retrieve_GetTableSchema: Utf8String;
+ function Retrieve_GetCommandSchema: Utf8String;
+ function Retrieve_SQLGetData: Binary;
+ function Retrieve_SQLGetDataEx: Binary;
+ function Retrieve_SQLExecuteCommand: Integer;
+ function Retrieve_SQLExecuteCommandEx: Integer;
+ function Retrieve_GetDatasetScripts: Utf8String;
+ end;
+
+ { IBaseLoginService_Async }
+ IBaseLoginService_Async = interface(IROAsyncInterface)
+ ['{45A761A3-80E9-43E6-86BC-E96693551453}']
+ procedure Invoke_LoginEx(const aLoginString: Utf8String);
+ procedure Invoke_Logout;
+ function Retrieve_LoginEx: Boolean;
+ end;
+
+ { IMultiDbLoginService_Async }
+ IMultiDbLoginService_Async = interface(IBaseLoginService_Async)
+ ['{8EBB1878-ECD9-4F4E-8A87-E26D51FD0ADD}']
+ procedure Invoke_Login(const aUserID: Utf8String; const aPassword: Utf8String; const aConnectionName: Utf8String);
+ function Retrieve_Login(out aUserInfo: UserInfo): Boolean;
+ end;
+
+ { IMultiDbLoginServiceV5_Async }
+ IMultiDbLoginServiceV5_Async = interface(IMultiDbLoginService_Async)
+ ['{292C3E8B-B263-4D95-9EE6-41DA014ACDF3}']
+ procedure Invoke_GetConnectionNames;
+ procedure Invoke_GetDefaultConnectionName;
+ function Retrieve_GetConnectionNames: StringArray;
+ function Retrieve_GetDefaultConnectionName: Utf8String;
+ end;
+
+ { ISimpleLoginService_Async }
+ ISimpleLoginService_Async = interface(IBaseLoginService_Async)
+ ['{74BC5406-7AA7-45CD-8012-193C38DF62E9}']
+ procedure Invoke_Login(const aUserID: Utf8String; const aPassword: Utf8String);
+ function Retrieve_Login(out aUserInfo: UserInfo): Boolean;
+ end;
+
+ { CoDataAbstractService_Async }
+ CoDataAbstractService_Async = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDataAbstractService_Async;
+ end;
+
+ { CoBaseLoginService_Async }
+ CoBaseLoginService_Async = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IBaseLoginService_Async;
+ end;
+
+ { CoMultiDbLoginService_Async }
+ CoMultiDbLoginService_Async = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMultiDbLoginService_Async;
+ end;
+
+ { CoMultiDbLoginServiceV5_Async }
+ CoMultiDbLoginServiceV5_Async = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMultiDbLoginServiceV5_Async;
+ end;
+
+ { CoSimpleLoginService_Async }
+ CoSimpleLoginService_Async = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): ISimpleLoginService_Async;
+ end;
+
+ { TDataAbstractService_AsyncProxy }
+ TDataAbstractService_AsyncProxy = class(TROAsyncProxy, IDataAbstractService_Async)
+ private
+ protected
+ function __GetInterfaceName:string; override;
+
+ procedure Invoke_GetSchema(const aFilter: Utf8String);
+ procedure Invoke_GetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray);
+ procedure Invoke_UpdateData(const aDelta: Binary);
+ procedure Invoke_ExecuteCommand(const aCommandName: Utf8String; const aParameterArray: DataParameterArray);
+ procedure Invoke_ExecuteCommandEx(const aCommandName: Utf8String; const aInputParameters: DataParameterArray);
+ procedure Invoke_GetTableSchema(const aTableNameArray: StringArray);
+ procedure Invoke_GetCommandSchema(const aCommandNameArray: StringArray);
+ procedure Invoke_SQLGetData(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer);
+ procedure Invoke_SQLGetDataEx(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer; const aDynamicWhereXML: Widestring);
+ procedure Invoke_SQLExecuteCommand(const aSQLText: Utf8String);
+ procedure Invoke_SQLExecuteCommandEx(const aSQLText: Utf8String; const aDynamicWhereXML: Widestring);
+ procedure Invoke_GetDatasetScripts(const DatasetNames: Utf8String);
+ procedure Invoke_RegisterForDataChangeNotification(const aTableName: Utf8String);
+ procedure Invoke_UnregisterForDataChangeNotification(const aTableName: Utf8String);
+ function Retrieve_GetSchema: Utf8String;
+ function Retrieve_GetData: Binary;
+ function Retrieve_UpdateData: Binary;
+ function Retrieve_ExecuteCommand: Integer;
+ function Retrieve_ExecuteCommandEx(out aOutputParameters: DataParameterArray): Integer;
+ function Retrieve_GetTableSchema: Utf8String;
+ function Retrieve_GetCommandSchema: Utf8String;
+ function Retrieve_SQLGetData: Binary;
+ function Retrieve_SQLGetDataEx: Binary;
+ function Retrieve_SQLExecuteCommand: Integer;
+ function Retrieve_SQLExecuteCommandEx: Integer;
+ function Retrieve_GetDatasetScripts: Utf8String;
+ end;
+
+ { TBaseLoginService_AsyncProxy }
+ TBaseLoginService_AsyncProxy = class(TROAsyncProxy, IBaseLoginService_Async)
+ private
+ protected
+ function __GetInterfaceName:string; override;
+
+ procedure Invoke_LoginEx(const aLoginString: Utf8String);
+ procedure Invoke_Logout;
+ function Retrieve_LoginEx: Boolean;
+ end;
+
+ { TMultiDbLoginService_AsyncProxy }
+ TMultiDbLoginService_AsyncProxy = class(TBaseLoginService_AsyncProxy, IMultiDbLoginService_Async)
+ private
+ protected
+ function __GetInterfaceName:string; override;
+
+ procedure Invoke_Login(const aUserID: Utf8String; const aPassword: Utf8String; const aConnectionName: Utf8String);
+ function Retrieve_Login(out aUserInfo: UserInfo): Boolean;
+ end;
+
+ { TMultiDbLoginServiceV5_AsyncProxy }
+ TMultiDbLoginServiceV5_AsyncProxy = class(TMultiDbLoginService_AsyncProxy, IMultiDbLoginServiceV5_Async)
+ private
+ protected
+ function __GetInterfaceName:string; override;
+
+ procedure Invoke_GetConnectionNames;
+ procedure Invoke_GetDefaultConnectionName;
+ function Retrieve_GetConnectionNames: StringArray;
+ function Retrieve_GetDefaultConnectionName: Utf8String;
+ end;
+
+ { TSimpleLoginService_AsyncProxy }
+ TSimpleLoginService_AsyncProxy = class(TBaseLoginService_AsyncProxy, ISimpleLoginService_Async)
+ private
+ protected
+ function __GetInterfaceName:string; override;
+
+ procedure Invoke_Login(const aUserID: Utf8String; const aPassword: Utf8String);
+ function Retrieve_Login(out aUserInfo: UserInfo): Boolean;
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils;
+
+{ CoDataAbstractService }
+
+class function CoDataAbstractService_Async.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDataAbstractService_Async;
+begin
+ result := TDataAbstractService_AsyncProxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TDataAbstractService_AsyncProxy }
+
+function TDataAbstractService_AsyncProxy.__GetInterfaceName:string;
+begin
+ result := 'DataAbstractService';
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_GetSchema(const aFilter: Utf8String);
+begin
+ __AssertProxyNotBusy('GetSchema');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetSchema');
+ __Message.Write('aFilter', TypeInfo(Utf8String), aFilter, []);
+ __DispatchAsyncRequest('GetSchema',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_GetSchema: Utf8String;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('GetSchema');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Utf8String), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_GetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray);
+begin
+ __AssertProxyNotBusy('GetData');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetData');
+ __Message.Write('aTableNameArray', TypeInfo(StringArray), aTableNameArray, []);
+ __Message.Write('aTableRequestInfoArray', TypeInfo(TableRequestInfoArray), aTableRequestInfoArray, []);
+ __DispatchAsyncRequest('GetData',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_GetData: Binary;
+var __response:TStream;
+begin
+ result := nil;
+ __response := __RetrieveAsyncResponse('GetData');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Binary), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_UpdateData(const aDelta: Binary);
+begin
+ __AssertProxyNotBusy('UpdateData');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'UpdateData');
+ __Message.Write('aDelta', TypeInfo(Binary), aDelta, []);
+ __DispatchAsyncRequest('UpdateData',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_UpdateData: Binary;
+var __response:TStream;
+begin
+ result := nil;
+ __response := __RetrieveAsyncResponse('UpdateData');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Binary), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_ExecuteCommand(const aCommandName: Utf8String; const aParameterArray: DataParameterArray);
+begin
+ __AssertProxyNotBusy('ExecuteCommand');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'ExecuteCommand');
+ __Message.Write('aCommandName', TypeInfo(Utf8String), aCommandName, []);
+ __Message.Write('aParameterArray', TypeInfo(DataParameterArray), aParameterArray, []);
+ __DispatchAsyncRequest('ExecuteCommand',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_ExecuteCommand: Integer;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('ExecuteCommand');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Integer), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_ExecuteCommandEx(const aCommandName: Utf8String; const aInputParameters: DataParameterArray);
+begin
+ __AssertProxyNotBusy('ExecuteCommandEx');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'ExecuteCommandEx');
+ __Message.Write('aCommandName', TypeInfo(Utf8String), aCommandName, []);
+ __Message.Write('aInputParameters', TypeInfo(DataParameterArray), aInputParameters, []);
+ __DispatchAsyncRequest('ExecuteCommandEx',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_ExecuteCommandEx(out aOutputParameters: DataParameterArray): Integer;
+var __response:TStream;
+begin
+ aOutputParameters := nil;
+ __response := __RetrieveAsyncResponse('ExecuteCommandEx');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Integer), Result, []);
+ __Message.Read('aOutputParameters', TypeInfo(DataParameterArray), aOutputParameters, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_GetTableSchema(const aTableNameArray: StringArray);
+begin
+ __AssertProxyNotBusy('GetTableSchema');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetTableSchema');
+ __Message.Write('aTableNameArray', TypeInfo(StringArray), aTableNameArray, []);
+ __DispatchAsyncRequest('GetTableSchema',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_GetTableSchema: Utf8String;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('GetTableSchema');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Utf8String), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_GetCommandSchema(const aCommandNameArray: StringArray);
+begin
+ __AssertProxyNotBusy('GetCommandSchema');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetCommandSchema');
+ __Message.Write('aCommandNameArray', TypeInfo(StringArray), aCommandNameArray, []);
+ __DispatchAsyncRequest('GetCommandSchema',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_GetCommandSchema: Utf8String;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('GetCommandSchema');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Utf8String), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_SQLGetData(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer);
+begin
+ __AssertProxyNotBusy('SQLGetData');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'SQLGetData');
+ __Message.Write('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __Message.Write('aIncludeSchema', TypeInfo(Boolean), aIncludeSchema, []);
+ __Message.Write('aMaxRecords', TypeInfo(Integer), aMaxRecords, []);
+ __DispatchAsyncRequest('SQLGetData',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_SQLGetData: Binary;
+var __response:TStream;
+begin
+ result := nil;
+ __response := __RetrieveAsyncResponse('SQLGetData');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Binary), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_SQLGetDataEx(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer; const aDynamicWhereXML: Widestring);
+begin
+ __AssertProxyNotBusy('SQLGetDataEx');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'SQLGetDataEx');
+ __Message.Write('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __Message.Write('aIncludeSchema', TypeInfo(Boolean), aIncludeSchema, []);
+ __Message.Write('aMaxRecords', TypeInfo(Integer), aMaxRecords, []);
+ __Message.Write('aDynamicWhereXML', TypeInfo(Widestring), aDynamicWhereXML, []);
+ __DispatchAsyncRequest('SQLGetDataEx',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_SQLGetDataEx: Binary;
+var __response:TStream;
+begin
+ result := nil;
+ __response := __RetrieveAsyncResponse('SQLGetDataEx');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Binary), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_SQLExecuteCommand(const aSQLText: Utf8String);
+begin
+ __AssertProxyNotBusy('SQLExecuteCommand');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'SQLExecuteCommand');
+ __Message.Write('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __DispatchAsyncRequest('SQLExecuteCommand',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_SQLExecuteCommand: Integer;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('SQLExecuteCommand');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Integer), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_SQLExecuteCommandEx(const aSQLText: Utf8String; const aDynamicWhereXML: Widestring);
+begin
+ __AssertProxyNotBusy('SQLExecuteCommandEx');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'SQLExecuteCommandEx');
+ __Message.Write('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __Message.Write('aDynamicWhereXML', TypeInfo(Widestring), aDynamicWhereXML, []);
+ __DispatchAsyncRequest('SQLExecuteCommandEx',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_SQLExecuteCommandEx: Integer;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('SQLExecuteCommandEx');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Integer), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_GetDatasetScripts(const DatasetNames: Utf8String);
+begin
+ __AssertProxyNotBusy('GetDatasetScripts');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetDatasetScripts');
+ __Message.Write('DatasetNames', TypeInfo(Utf8String), DatasetNames, []);
+ __DispatchAsyncRequest('GetDatasetScripts',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TDataAbstractService_AsyncProxy.Retrieve_GetDatasetScripts: Utf8String;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('GetDatasetScripts');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Utf8String), Result, []);
+
+ __response.Free();
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_RegisterForDataChangeNotification(const aTableName: Utf8String);
+begin
+ __AssertProxyNotBusy('RegisterForDataChangeNotification');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'RegisterForDataChangeNotification');
+ __Message.Write('aTableName', TypeInfo(Utf8String), aTableName, []);
+ __DispatchAsyncRequest('RegisterForDataChangeNotification',__Message, false);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+procedure TDataAbstractService_AsyncProxy.Invoke_UnregisterForDataChangeNotification(const aTableName: Utf8String);
+begin
+ __AssertProxyNotBusy('UnregisterForDataChangeNotification');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'UnregisterForDataChangeNotification');
+ __Message.Write('aTableName', TypeInfo(Utf8String), aTableName, []);
+ __DispatchAsyncRequest('UnregisterForDataChangeNotification',__Message, false);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+
+{ CoSimpleLoginService }
+
+class function CoSimpleLoginService_Async.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): ISimpleLoginService_Async;
+begin
+ result := TSimpleLoginService_AsyncProxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TSimpleLoginService_AsyncProxy }
+
+function TSimpleLoginService_AsyncProxy.__GetInterfaceName:string;
+begin
+ result := 'SimpleLoginService';
+end;
+
+procedure TSimpleLoginService_AsyncProxy.Invoke_Login(const aUserID: Utf8String; const aPassword: Utf8String);
+begin
+ __AssertProxyNotBusy('Login');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'Login');
+ __Message.Write('aUserID', TypeInfo(Utf8String), aUserID, []);
+ __Message.Write('aPassword', TypeInfo(Utf8String), aPassword, []);
+ __DispatchAsyncRequest('Login',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TSimpleLoginService_AsyncProxy.Retrieve_Login(out aUserInfo: UserInfo): Boolean;
+var __response:TStream;
+begin
+ aUserInfo := nil;
+ __response := __RetrieveAsyncResponse('Login');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Boolean), Result, []);
+ __Message.Read('aUserInfo', TypeInfo(UserInfo), aUserInfo, []);
+
+ __response.Free();
+end;
+
+
+{ CoBaseLoginService }
+
+class function CoBaseLoginService_Async.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IBaseLoginService_Async;
+begin
+ result := TBaseLoginService_AsyncProxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TBaseLoginService_AsyncProxy }
+
+function TBaseLoginService_AsyncProxy.__GetInterfaceName:string;
+begin
+ result := 'BaseLoginService';
+end;
+
+procedure TBaseLoginService_AsyncProxy.Invoke_LoginEx(const aLoginString: Utf8String);
+begin
+ __AssertProxyNotBusy('LoginEx');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'LoginEx');
+ __Message.Write('aLoginString', TypeInfo(Utf8String), aLoginString, []);
+ __DispatchAsyncRequest('LoginEx',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TBaseLoginService_AsyncProxy.Retrieve_LoginEx: Boolean;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('LoginEx');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Boolean), Result, []);
+
+ __response.Free();
+end;
+
+procedure TBaseLoginService_AsyncProxy.Invoke_Logout;
+begin
+ __AssertProxyNotBusy('Logout');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'Logout');
+ __DispatchAsyncRequest('Logout',__Message, false);
+end;
+
+
+{ CoMultiDbLoginService }
+
+class function CoMultiDbLoginService_Async.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMultiDbLoginService_Async;
+begin
+ result := TMultiDbLoginService_AsyncProxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TMultiDbLoginService_AsyncProxy }
+
+function TMultiDbLoginService_AsyncProxy.__GetInterfaceName:string;
+begin
+ result := 'MultiDbLoginService';
+end;
+
+procedure TMultiDbLoginService_AsyncProxy.Invoke_Login(const aUserID: Utf8String; const aPassword: Utf8String; const aConnectionName: Utf8String);
+begin
+ __AssertProxyNotBusy('Login');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'Login');
+ __Message.Write('aUserID', TypeInfo(Utf8String), aUserID, []);
+ __Message.Write('aPassword', TypeInfo(Utf8String), aPassword, []);
+ __Message.Write('aConnectionName', TypeInfo(Utf8String), aConnectionName, []);
+ __DispatchAsyncRequest('Login',__Message);
+ __Message.UnsetAttributes(__TransportChannel);
+end;
+
+function TMultiDbLoginService_AsyncProxy.Retrieve_Login(out aUserInfo: UserInfo): Boolean;
+var __response:TStream;
+begin
+ aUserInfo := nil;
+ __response := __RetrieveAsyncResponse('Login');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Boolean), Result, []);
+ __Message.Read('aUserInfo', TypeInfo(UserInfo), aUserInfo, []);
+
+ __response.Free();
+end;
+
+
+{ CoMultiDbLoginServiceV5 }
+
+class function CoMultiDbLoginServiceV5_Async.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMultiDbLoginServiceV5_Async;
+begin
+ result := TMultiDbLoginServiceV5_AsyncProxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TMultiDbLoginServiceV5_AsyncProxy }
+
+function TMultiDbLoginServiceV5_AsyncProxy.__GetInterfaceName:string;
+begin
+ result := 'MultiDbLoginServiceV5';
+end;
+
+procedure TMultiDbLoginServiceV5_AsyncProxy.Invoke_GetConnectionNames;
+begin
+ __AssertProxyNotBusy('GetConnectionNames');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetConnectionNames');
+ __DispatchAsyncRequest('GetConnectionNames',__Message);
+end;
+
+function TMultiDbLoginServiceV5_AsyncProxy.Retrieve_GetConnectionNames: StringArray;
+var __response:TStream;
+begin
+ result := nil;
+ __response := __RetrieveAsyncResponse('GetConnectionNames');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(StringArray), Result, []);
+
+ __response.Free();
+end;
+
+procedure TMultiDbLoginServiceV5_AsyncProxy.Invoke_GetDefaultConnectionName;
+begin
+ __AssertProxyNotBusy('GetDefaultConnectionName');
+
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetDefaultConnectionName');
+ __DispatchAsyncRequest('GetDefaultConnectionName',__Message);
+end;
+
+function TMultiDbLoginServiceV5_AsyncProxy.Retrieve_GetDefaultConnectionName: Utf8String;
+var __response:TStream;
+begin
+ __response := __RetrieveAsyncResponse('GetDefaultConnectionName');
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(Utf8String), Result, []);
+
+ __response.Free();
+end;
+
+
+initialization
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4_Intf.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4_Intf.pas
new file mode 100644
index 0000000..00348aa
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4_Intf.pas
@@ -0,0 +1,2514 @@
+unit DataAbstract4_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf;
+
+const
+ { Library ID }
+ LibraryUID = '{DC8B7BE2-14AF-402D-B1F8-E1008B6FA4F6}';
+ TargetNamespace = '';
+
+ { Service Interface ID's }
+ IDataAbstractService_IID : TGUID = '{4C2EC238-4FB4-434E-8CFF-ED25EEFF1525}';
+ ISimpleLoginService_IID : TGUID = '{B186853B-168B-4E33-B798-467444BFC8C6}';
+ IBaseLoginService_IID : TGUID = '{C349DB54-9DFB-454E-AD23-6F2166A624A6}';
+ IMultiDbLoginService_IID : TGUID = '{2C6D5764-01CE-447A-8264-27210B2C7371}';
+ IMultiDbLoginServiceV5_IID : TGUID = '{5A78AB01-2097-4473-A4D5-78980FFD90E4}';
+
+ { Event ID's }
+ EID_DataChangeNotification = 'DataChangeNotification';
+
+type
+ { Forward declarations }
+ IDataAbstractService = interface;
+ ISimpleLoginService = interface;
+ IBaseLoginService = interface;
+ IMultiDbLoginService = interface;
+ IMultiDbLoginServiceV5 = interface;
+
+ DataParameterArray = class;
+ TableRequestInfoArray = class;
+ StringArray = class;
+ VariantArray = class;
+ ColumnSortingArray = class;
+
+ DataParameter = class;
+ TableRequestInfo = class;
+ UserInfo = class;
+ TableRequestInfoV5 = class;
+ ColumnSorting = class;
+ TableRequestInfoV6 = class;
+
+ IDataChangeNotification = interface;
+
+
+ { Enumerateds }
+ ColumnSortDirection = (ColumnSortDirection_Ascending,ColumnSortDirection_Descending);
+
+ { DataParameter }
+ DataParameter = class(TROComplexType)
+ private
+ fName: Utf8String;
+ fValue: Variant;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property Name:Utf8String read fName write fName;
+ property Value:Variant read fValue write fValue;
+ end;
+
+ { DataParameterCollection }
+ DataParameterCollection = class(TROCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(aIndex: integer): DataParameter;
+ procedure SetItems(aIndex: integer; const Value: DataParameter);
+ public
+ constructor Create; overload;
+ function Add: DataParameter; reintroduce;
+ procedure SaveToArray(anArray: DataParameterArray);
+ procedure LoadFromArray(anArray: DataParameterArray);
+ property Items[Index: integer]:DataParameter read GetItems write SetItems; default;
+ end;
+
+ { TableRequestInfo }
+ TableRequestInfo = class(TROComplexType)
+ private
+ fUserFilter: Utf8String;
+ fIncludeSchema: Boolean;
+ fMaxRecords: Integer;
+ fParameters: DataParameterArray;
+ function GetParameters: DataParameterArray;
+ public
+ constructor Create(aCollection : TCollection); override;
+ procedure Assign(iSource: TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property UserFilter:Utf8String read fUserFilter write fUserFilter;
+ property IncludeSchema:Boolean read fIncludeSchema write fIncludeSchema;
+ property MaxRecords:Integer read fMaxRecords write fMaxRecords;
+ property Parameters:DataParameterArray read GetParameters write fParameters;
+ end;
+
+ { TableRequestInfoCollection }
+ TableRequestInfoCollection = class(TROCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(aIndex: integer): TableRequestInfo;
+ procedure SetItems(aIndex: integer; const Value: TableRequestInfo);
+ public
+ constructor Create; overload;
+ function Add: TableRequestInfo; reintroduce;
+ procedure SaveToArray(anArray: TableRequestInfoArray);
+ procedure LoadFromArray(anArray: TableRequestInfoArray);
+ property Items[Index: integer]:TableRequestInfo read GetItems write SetItems; default;
+ end;
+
+ { TableRequestInfoV6 }
+ TableRequestInfoV6 = class(TableRequestInfo)
+ private
+ fSql: Widestring;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property Sql:Widestring read fSql write fSql;
+ end;
+
+ { TableRequestInfoV6Collection }
+ TableRequestInfoV6Collection = class(TableRequestInfoCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(aIndex: integer): TableRequestInfoV6;
+ procedure SetItems(aIndex: integer; const Value: TableRequestInfoV6);
+ public
+ constructor Create; overload;
+ function Add: TableRequestInfoV6; reintroduce;
+ property Items[Index: integer]:TableRequestInfoV6 read GetItems write SetItems; default;
+ end;
+
+ { TableRequestInfoV5 }
+ TableRequestInfoV5 = class(TableRequestInfo)
+ private
+ fWhereClause: IXmlNode;
+ fDynamicSelectFieldNames: StringArray;
+ fSorting: ColumnSorting;
+ function GetDynamicSelectFieldNames: StringArray;
+ function GetSorting: ColumnSorting;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property WhereClause:IXmlNode read fWhereClause write fWhereClause;
+ property DynamicSelectFieldNames:StringArray read GetDynamicSelectFieldNames write fDynamicSelectFieldNames;
+ property Sorting:ColumnSorting read GetSorting write fSorting;
+ end;
+
+ { TableRequestInfoV5Collection }
+ TableRequestInfoV5Collection = class(TableRequestInfoCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(aIndex: integer): TableRequestInfoV5;
+ procedure SetItems(aIndex: integer; const Value: TableRequestInfoV5);
+ public
+ constructor Create; overload;
+ function Add: TableRequestInfoV5; reintroduce;
+ property Items[Index: integer]:TableRequestInfoV5 read GetItems write SetItems; default;
+ end;
+
+ { UserInfo }
+ UserInfo = class(TROComplexType)
+ private
+ fSessionID: Utf8String;
+ fUserID: Utf8String;
+ fPrivileges: StringArray;
+ fAttributes: VariantArray;
+ fUserData: Binary;
+ function GetPrivileges: StringArray;
+ function GetAttributes: VariantArray;
+ function GetUserData: Binary;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property SessionID:Utf8String read fSessionID write fSessionID;
+ property UserID:Utf8String read fUserID write fUserID;
+ property Privileges:StringArray read GetPrivileges write fPrivileges;
+ property Attributes:VariantArray read GetAttributes write fAttributes;
+ property UserData:Binary read GetUserData write fUserData;
+ end;
+
+ { UserInfoCollection }
+ UserInfoCollection = class(TROCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(aIndex: integer): UserInfo;
+ procedure SetItems(aIndex: integer; const Value: UserInfo);
+ public
+ constructor Create; overload;
+ function Add: UserInfo; reintroduce;
+ property Items[Index: integer]:UserInfo read GetItems write SetItems; default;
+ end;
+
+ { ColumnSorting }
+ ColumnSorting = class(TROComplexType)
+ private
+ fFieldName: Utf8String;
+ fSortDirection: ColumnSortDirection;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property FieldName:Utf8String read fFieldName write fFieldName;
+ property SortDirection:ColumnSortDirection read fSortDirection write fSortDirection;
+ end;
+
+ { ColumnSortingCollection }
+ ColumnSortingCollection = class(TROCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(aIndex: integer): ColumnSorting;
+ procedure SetItems(aIndex: integer; const Value: ColumnSorting);
+ public
+ constructor Create; overload;
+ function Add: ColumnSorting; reintroduce;
+ procedure SaveToArray(anArray: ColumnSortingArray);
+ procedure LoadFromArray(anArray: ColumnSortingArray);
+ property Items[Index: integer]:ColumnSorting read GetItems write SetItems; default;
+ end;
+
+ { DataParameterArray }
+ DataParameterArray_DataParameter = array of DataParameter;
+ DataParameterArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : DataParameterArray_DataParameter;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): DataParameter;
+ procedure SetItems(aIndex: integer; const Value: DataParameter);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemClass: TClass; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure SetItemRef(aIndex: integer; Ref: pointer); override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add: DataParameter; overload;
+ function Add(const Value: DataParameter):integer; overload;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:DataParameter read GetItems write SetItems; default;
+ property InnerArray: DataParameterArray_DataParameter read fItems;
+ end;
+
+ { TableRequestInfoArray }
+ TableRequestInfoArray_TableRequestInfo = array of TableRequestInfo;
+ TableRequestInfoArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : TableRequestInfoArray_TableRequestInfo;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): TableRequestInfo;
+ procedure SetItems(aIndex: integer; const Value: TableRequestInfo);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemClass: TClass; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure SetItemRef(aIndex: integer; Ref: pointer); override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add: TableRequestInfo; overload;
+ function Add(const Value: TableRequestInfo):integer; overload;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:TableRequestInfo read GetItems write SetItems; default;
+ property InnerArray: TableRequestInfoArray_TableRequestInfo read fItems;
+ end;
+
+ { StringArray }
+ StringArray_Utf8String = array of Utf8String;
+ StringArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : StringArray_Utf8String;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): Utf8String;
+ procedure SetItems(aIndex: integer; const Value: Utf8String);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add(const Value:Utf8String): integer;
+ function GetIndex(const aPropertyName : string;
+ const aPropertyValue : Variant;
+ StartFrom : integer = 0;
+ Options : TROSearchOptions = [soIgnoreCase]) : integer; override;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:Utf8String read GetItems write SetItems; default;
+ property InnerArray: StringArray_Utf8String read fItems;
+ end;
+
+ { VariantArray }
+ VariantArray_Variant = array of Variant;
+ VariantArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : VariantArray_Variant;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): Variant;
+ procedure SetItems(aIndex: integer; const Value: Variant);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add(const Value:Variant): integer;
+ function GetIndex(const aPropertyName : string;
+ const aPropertyValue : Variant;
+ StartFrom : integer = 0;
+ Options : TROSearchOptions = [soIgnoreCase]) : integer; override;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:Variant read GetItems write SetItems; default;
+ property InnerArray: VariantArray_Variant read fItems;
+ end;
+
+ { ColumnSortingArray }
+ ColumnSortingArray_ColumnSorting = array of ColumnSorting;
+ ColumnSortingArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : ColumnSortingArray_ColumnSorting;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): ColumnSorting;
+ procedure SetItems(aIndex: integer; const Value: ColumnSorting);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemClass: TClass; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure SetItemRef(aIndex: integer; Ref: pointer); override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add: ColumnSorting; overload;
+ function Add(const Value: ColumnSorting):integer; overload;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:ColumnSorting read GetItems write SetItems; default;
+ property InnerArray: ColumnSortingArray_ColumnSorting read fItems;
+ end;
+
+ { IDataAbstractService }
+ IDataAbstractService = interface
+ ['{4C2EC238-4FB4-434E-8CFF-ED25EEFF1525}']
+ function GetSchema(const aFilter: Utf8String): Utf8String;
+ function GetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray): Binary;
+ function UpdateData(const aDelta: Binary): Binary;
+ function ExecuteCommand(const aCommandName: Utf8String; const aParameterArray: DataParameterArray): Integer;
+ function ExecuteCommandEx(const aCommandName: Utf8String; const aInputParameters: DataParameterArray; out aOutputParameters: DataParameterArray): Integer;
+ function GetTableSchema(const aTableNameArray: StringArray): Utf8String;
+ function GetCommandSchema(const aCommandNameArray: StringArray): Utf8String;
+ function SQLGetData(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer): Binary;
+ function SQLGetDataEx(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer; const aDynamicWhereXML: Widestring): Binary;
+ function SQLExecuteCommand(const aSQLText: Utf8String): Integer;
+ function SQLExecuteCommandEx(const aSQLText: Utf8String; const aDynamicWhereXML: Widestring): Integer;
+ function GetDatasetScripts(const DatasetNames: Utf8String): Utf8String;
+ procedure RegisterForDataChangeNotification(const aTableName: Utf8String);
+ procedure UnregisterForDataChangeNotification(const aTableName: Utf8String);
+ end;
+
+ { CoDataAbstractService }
+ CoDataAbstractService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDataAbstractService;
+ end;
+
+ { TDataAbstractService_Proxy }
+ TDataAbstractService_Proxy = class(TROProxy, IDataAbstractService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function GetSchema(const aFilter: Utf8String): Utf8String;
+ function GetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray): Binary;
+ function UpdateData(const aDelta: Binary): Binary;
+ function ExecuteCommand(const aCommandName: Utf8String; const aParameterArray: DataParameterArray): Integer;
+ function ExecuteCommandEx(const aCommandName: Utf8String; const aInputParameters: DataParameterArray; out aOutputParameters: DataParameterArray): Integer;
+ function GetTableSchema(const aTableNameArray: StringArray): Utf8String;
+ function GetCommandSchema(const aCommandNameArray: StringArray): Utf8String;
+ function SQLGetData(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer): Binary;
+ function SQLGetDataEx(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer; const aDynamicWhereXML: Widestring): Binary;
+ function SQLExecuteCommand(const aSQLText: Utf8String): Integer;
+ function SQLExecuteCommandEx(const aSQLText: Utf8String; const aDynamicWhereXML: Widestring): Integer;
+ function GetDatasetScripts(const DatasetNames: Utf8String): Utf8String;
+ procedure RegisterForDataChangeNotification(const aTableName: Utf8String);
+ procedure UnregisterForDataChangeNotification(const aTableName: Utf8String);
+ end;
+
+ { IBaseLoginService }
+ IBaseLoginService = interface
+ ['{C349DB54-9DFB-454E-AD23-6F2166A624A6}']
+ function LoginEx(const aLoginString: Utf8String): Boolean;
+ procedure Logout;
+ end;
+
+ { CoBaseLoginService }
+ CoBaseLoginService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IBaseLoginService;
+ end;
+
+ { TBaseLoginService_Proxy }
+ TBaseLoginService_Proxy = class(TROProxy, IBaseLoginService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function LoginEx(const aLoginString: Utf8String): Boolean;
+ procedure Logout;
+ end;
+
+ { IMultiDbLoginService }
+ IMultiDbLoginService = interface(IBaseLoginService)
+ ['{2C6D5764-01CE-447A-8264-27210B2C7371}']
+ function Login(const aUserID: Utf8String; const aPassword: Utf8String; const aConnectionName: Utf8String; out aUserInfo: UserInfo): Boolean;
+ end;
+
+ { CoMultiDbLoginService }
+ CoMultiDbLoginService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMultiDbLoginService;
+ end;
+
+ { TMultiDbLoginService_Proxy }
+ TMultiDbLoginService_Proxy = class(TBaseLoginService_Proxy, IMultiDbLoginService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function Login(const aUserID: Utf8String; const aPassword: Utf8String; const aConnectionName: Utf8String; out aUserInfo: UserInfo): Boolean;
+ end;
+
+ { IMultiDbLoginServiceV5 }
+ IMultiDbLoginServiceV5 = interface(IMultiDbLoginService)
+ ['{5A78AB01-2097-4473-A4D5-78980FFD90E4}']
+ function GetConnectionNames: StringArray;
+ function GetDefaultConnectionName: Utf8String;
+ end;
+
+ { CoMultiDbLoginServiceV5 }
+ CoMultiDbLoginServiceV5 = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMultiDbLoginServiceV5;
+ end;
+
+ { TMultiDbLoginServiceV5_Proxy }
+ TMultiDbLoginServiceV5_Proxy = class(TMultiDbLoginService_Proxy, IMultiDbLoginServiceV5)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function GetConnectionNames: StringArray;
+ function GetDefaultConnectionName: Utf8String;
+ end;
+
+ { ISimpleLoginService }
+ ISimpleLoginService = interface(IBaseLoginService)
+ ['{B186853B-168B-4E33-B798-467444BFC8C6}']
+ function Login(const aUserID: Utf8String; const aPassword: Utf8String; out aUserInfo: UserInfo): Boolean;
+ end;
+
+ { CoSimpleLoginService }
+ CoSimpleLoginService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): ISimpleLoginService;
+ end;
+
+ { TSimpleLoginService_Proxy }
+ TSimpleLoginService_Proxy = class(TBaseLoginService_Proxy, ISimpleLoginService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function Login(const aUserID: Utf8String; const aPassword: Utf8String; out aUserInfo: UserInfo): Boolean;
+ end;
+
+ { IDataChangeNotification }
+ IDataChangeNotification = interface
+ ['{1309480C-AEF8-48E0-A27F-E6090F441B46}']
+ procedure OnDataTableChanged(const aTableName: Utf8String; const aDelta: Binary);
+ end;
+
+ { IDataChangeNotification_Writer }
+ IDataChangeNotification_Writer = interface(IROEventWriter)
+ ['{1309480C-AEF8-48E0-A27F-E6090F441B46}']
+ procedure OnDataTableChanged(const __Sender : TGUID; const aTableName: Utf8String; const aDelta: Binary);
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uROSerializer, uRORes;
+
+{ DataParameterArray }
+
+procedure DataParameterArray.Assign(iSource: TPersistent);
+var lSource:DataParameterArray;
+ i:integer;
+begin
+ if (iSource is DataParameterArray) then begin
+ lSource := DataParameterArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ if Assigned(lSource.Items[i]) then begin
+ Items[i].Assign(lSource.Items[i]);
+ end;
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function DataParameterArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(DataParameter);
+end;
+
+class function DataParameterArray.GetItemClass: TClass;
+begin
+ result := DataParameter;
+end;
+
+class function DataParameterArray.GetItemSize: integer;
+begin
+ result := SizeOf(DataParameter);
+end;
+
+function DataParameterArray.GetItems(aIndex: integer): DataParameter;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function DataParameterArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+procedure DataParameterArray.SetItemRef(aIndex: integer; Ref: pointer);
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if Ref <> fItems[aIndex] then begin
+ if fItems[aIndex] <> nil then fItems[aIndex].Free;
+ fItems[aIndex] := Ref;
+ end;
+end;
+
+procedure DataParameterArray.Clear;
+var i: integer;
+begin
+ for i := 0 to (Count-1) do fItems[i].Free();
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure DataParameterArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ fItems[aIndex].Free();
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if fItems[aIndex] <> Value then begin
+ fItems[aIndex].Free;
+ fItems[aIndex] := Value;
+ end;
+end;
+
+procedure DataParameterArray.Resize(ElementCount: integer);
+var i: Integer;
+begin
+ if fCount = ElementCount then Exit;
+ for i := FCount -1 downto ElementCount do
+ FItems[i].Free;
+ SetLength(fItems, ElementCount);
+ for i := FCount to ElementCount -1 do
+ FItems[i] := DataParameter.Create;
+ FCount := ElementCount;
+end;
+
+function DataParameterArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure DataParameterArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function DataParameterArray.Add: DataParameter;
+begin
+ result := DataParameter.Create;
+ Add(Result);
+end;
+
+function DataParameterArray.Add(const Value:DataParameter): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+procedure DataParameterArray.ReadComplex(ASerializer: TObject);
+var
+ lval: DataParameter;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadStruct(GetArrayElementName(GetItemType, GetItemRef(i)), DataParameter, lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure DataParameterArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteStruct(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], DataParameter, i);
+end;
+
+{ TableRequestInfoArray }
+
+procedure TableRequestInfoArray.Assign(iSource: TPersistent);
+var lSource:TableRequestInfoArray;
+ i:integer;
+begin
+ if (iSource is TableRequestInfoArray) then begin
+ lSource := TableRequestInfoArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ if Assigned(lSource.Items[i]) then begin
+ Items[i].Assign(lSource.Items[i]);
+ end;
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function TableRequestInfoArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(TableRequestInfo);
+end;
+
+class function TableRequestInfoArray.GetItemClass: TClass;
+begin
+ result := TableRequestInfo;
+end;
+
+class function TableRequestInfoArray.GetItemSize: integer;
+begin
+ result := SizeOf(TableRequestInfo);
+end;
+
+function TableRequestInfoArray.GetItems(aIndex: integer): TableRequestInfo;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function TableRequestInfoArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+procedure TableRequestInfoArray.SetItemRef(aIndex: integer; Ref: pointer);
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if Ref <> fItems[aIndex] then begin
+ if fItems[aIndex] <> nil then fItems[aIndex].Free;
+ fItems[aIndex] := Ref;
+ end;
+end;
+
+procedure TableRequestInfoArray.Clear;
+var i: integer;
+begin
+ for i := 0 to (Count-1) do fItems[i].Free();
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure TableRequestInfoArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ fItems[aIndex].Free();
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if fItems[aIndex] <> Value then begin
+ fItems[aIndex].Free;
+ fItems[aIndex] := Value;
+ end;
+end;
+
+procedure TableRequestInfoArray.Resize(ElementCount: integer);
+var i: Integer;
+begin
+ if fCount = ElementCount then Exit;
+ for i := FCount -1 downto ElementCount do
+ FItems[i].Free;
+ SetLength(fItems, ElementCount);
+ for i := FCount to ElementCount -1 do
+ FItems[i] := TableRequestInfo.Create;
+ FCount := ElementCount;
+end;
+
+function TableRequestInfoArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure TableRequestInfoArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function TableRequestInfoArray.Add: TableRequestInfo;
+begin
+ result := TableRequestInfo.Create;
+ Add(Result);
+end;
+
+function TableRequestInfoArray.Add(const Value:TableRequestInfo): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+procedure TableRequestInfoArray.ReadComplex(ASerializer: TObject);
+var
+ lval: TableRequestInfo;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadStruct(GetArrayElementName(GetItemType, GetItemRef(i)), TableRequestInfo, lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure TableRequestInfoArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteStruct(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], TableRequestInfo, i);
+end;
+
+{ StringArray }
+
+procedure StringArray.Assign(iSource: TPersistent);
+var lSource:StringArray;
+ i:integer;
+begin
+ if (iSource is StringArray) then begin
+ lSource := StringArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ Items[i] := lSource.Items[i];
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function StringArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(Utf8String);
+end;
+
+class function StringArray.GetItemSize: integer;
+begin
+ result := SizeOf(Utf8String);
+end;
+
+function StringArray.GetItems(aIndex: integer): Utf8String;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function StringArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := @fItems[aIndex];
+end;
+
+procedure StringArray.Clear;
+begin
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure StringArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ fItems[aIndex] := Value;
+end;
+
+procedure StringArray.Resize(ElementCount: integer);
+begin
+ if fCount = ElementCount then Exit;
+ SetLength(fItems, ElementCount);
+ FCount := ElementCount;
+end;
+
+function StringArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure StringArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function StringArray.Add(const Value: Utf8String): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+function StringArray.GetIndex(const aPropertyName: string;
+ const aPropertyValue: Variant; StartFrom: integer;
+ Options: TROSearchOptions): integer;
+begin
+ result := -1;
+end;
+
+procedure StringArray.ReadComplex(ASerializer: TObject);
+var
+ lval: Utf8String;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadUTF8String(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure StringArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteUTF8String(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);
+end;
+
+{ VariantArray }
+
+procedure VariantArray.Assign(iSource: TPersistent);
+var lSource:VariantArray;
+ i:integer;
+begin
+ if (iSource is VariantArray) then begin
+ lSource := VariantArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ Items[i] := lSource.Items[i];
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function VariantArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(Variant);
+end;
+
+class function VariantArray.GetItemSize: integer;
+begin
+ result := SizeOf(Variant);
+end;
+
+function VariantArray.GetItems(aIndex: integer): Variant;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function VariantArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := @fItems[aIndex];
+end;
+
+procedure VariantArray.Clear;
+begin
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure VariantArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ fItems[aIndex] := Value;
+end;
+
+procedure VariantArray.Resize(ElementCount: integer);
+begin
+ if fCount = ElementCount then Exit;
+ SetLength(fItems, ElementCount);
+ FCount := ElementCount;
+end;
+
+function VariantArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure VariantArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function VariantArray.Add(const Value: Variant): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+function VariantArray.GetIndex(const aPropertyName: string;
+ const aPropertyValue: Variant; StartFrom: integer;
+ Options: TROSearchOptions): integer;
+begin
+ result := -1;
+end;
+
+procedure VariantArray.ReadComplex(ASerializer: TObject);
+var
+ lval: Variant;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadVariant(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure VariantArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteVariant(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);
+end;
+
+{ ColumnSortingArray }
+
+procedure ColumnSortingArray.Assign(iSource: TPersistent);
+var lSource:ColumnSortingArray;
+ i:integer;
+begin
+ if (iSource is ColumnSortingArray) then begin
+ lSource := ColumnSortingArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ if Assigned(lSource.Items[i]) then begin
+ Items[i].Assign(lSource.Items[i]);
+ end;
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function ColumnSortingArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(ColumnSorting);
+end;
+
+class function ColumnSortingArray.GetItemClass: TClass;
+begin
+ result := ColumnSorting;
+end;
+
+class function ColumnSortingArray.GetItemSize: integer;
+begin
+ result := SizeOf(ColumnSorting);
+end;
+
+function ColumnSortingArray.GetItems(aIndex: integer): ColumnSorting;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function ColumnSortingArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+procedure ColumnSortingArray.SetItemRef(aIndex: integer; Ref: pointer);
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if Ref <> fItems[aIndex] then begin
+ if fItems[aIndex] <> nil then fItems[aIndex].Free;
+ fItems[aIndex] := Ref;
+ end;
+end;
+
+procedure ColumnSortingArray.Clear;
+var i: integer;
+begin
+ for i := 0 to (Count-1) do fItems[i].Free();
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure ColumnSortingArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ fItems[aIndex].Free();
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if fItems[aIndex] <> Value then begin
+ fItems[aIndex].Free;
+ fItems[aIndex] := Value;
+ end;
+end;
+
+procedure ColumnSortingArray.Resize(ElementCount: integer);
+var i: Integer;
+begin
+ if fCount = ElementCount then Exit;
+ for i := FCount -1 downto ElementCount do
+ FItems[i].Free;
+ SetLength(fItems, ElementCount);
+ for i := FCount to ElementCount -1 do
+ FItems[i] := ColumnSorting.Create;
+ FCount := ElementCount;
+end;
+
+function ColumnSortingArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure ColumnSortingArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function ColumnSortingArray.Add: ColumnSorting;
+begin
+ result := ColumnSorting.Create;
+ Add(Result);
+end;
+
+function ColumnSortingArray.Add(const Value:ColumnSorting): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+procedure ColumnSortingArray.ReadComplex(ASerializer: TObject);
+var
+ lval: ColumnSorting;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadStruct(GetArrayElementName(GetItemType, GetItemRef(i)), ColumnSorting, lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure ColumnSortingArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteStruct(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], ColumnSorting, i);
+end;
+
+{ DataParameter }
+
+procedure DataParameter.Assign(iSource: TPersistent);
+var lSource: DataAbstract4_Intf.DataParameter;
+begin
+ inherited Assign(iSource);
+ if (iSource is DataAbstract4_Intf.DataParameter) then begin
+ lSource := DataAbstract4_Intf.DataParameter(iSource);
+ Name := lSource.Name;
+ Value := lSource.Value;
+ end;
+end;
+
+procedure DataParameter.ReadComplex(ASerializer: TObject);
+var
+ l_Name: Utf8String;
+ l_Value: Variant;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ l_Name := Name;
+ TROSerializer(ASerializer).ReadUTF8String('Name', l_Name);
+ Name := l_Name;
+ l_Value := Value;
+ TROSerializer(ASerializer).ReadVariant('Value', l_Value);
+ Value := l_Value;
+ end
+ else begin
+ l_Name := Name;
+ TROSerializer(ASerializer).ReadUTF8String('Name', l_Name);
+ Name := l_Name;
+ l_Value := Value;
+ TROSerializer(ASerializer).ReadVariant('Value', l_Value);
+ Value := l_Value;
+ end;
+end;
+
+procedure DataParameter.WriteComplex(ASerializer: TObject);
+var
+ l_Name: Utf8String;
+ l_Value: Variant;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ TROSerializer(ASerializer).ChangeClass(DataParameter);
+ l_Name := Name;
+ TROSerializer(ASerializer).WriteUTF8String('Name', l_Name);
+ l_Value := Value;
+ TROSerializer(ASerializer).WriteVariant('Value', l_Value);
+ end
+ else begin
+ l_Name := Name;
+ TROSerializer(ASerializer).WriteUTF8String('Name', l_Name);
+ l_Value := Value;
+ TROSerializer(ASerializer).WriteVariant('Value', l_Value);
+ end;
+end;
+
+{ DataParameterCollection }
+constructor DataParameterCollection.Create;
+begin
+ inherited Create(DataParameter);
+end;
+
+constructor DataParameterCollection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function DataParameterCollection.Add: DataParameter;
+begin
+ result := DataParameter(inherited Add);
+end;
+
+function DataParameterCollection.GetItems(aIndex: integer): DataParameter;
+begin
+ result := DataParameter(inherited Items[aIndex]);
+end;
+
+procedure DataParameterCollection.LoadFromArray(anArray: DataParameterArray);
+var i : integer;
+begin
+ Clear;
+ for i := 0 to (anArray.Count-1) do
+ Add.Assign(anArray[i]);
+end;
+
+procedure DataParameterCollection.SaveToArray(anArray: DataParameterArray);
+var i : integer;
+begin
+ anArray.Clear;
+ anArray.Resize(Count);
+ for i := 0 to (Count-1) do begin
+ anArray[i] := DataParameter.Create;
+ anArray[i].Assign(Items[i]);
+ end;
+end;
+
+procedure DataParameterCollection.SetItems(aIndex: integer; const Value: DataParameter);
+begin
+ DataParameter(inherited Items[aIndex]).Assign(Value);
+end;
+
+{ TableRequestInfo }
+
+procedure TableRequestInfo.Assign(iSource: TPersistent);
+var lSource: DataAbstract4_Intf.TableRequestInfo;
+begin
+ inherited Assign(iSource);
+ if (iSource is DataAbstract4_Intf.TableRequestInfo) then begin
+ lSource := DataAbstract4_Intf.TableRequestInfo(iSource);
+ UserFilter := lSource.UserFilter;
+ IncludeSchema := lSource.IncludeSchema;
+ MaxRecords := lSource.MaxRecords;
+ Parameters.Assign(lSource.Parameters);
+ end;
+end;
+
+constructor TableRequestInfo.Create(aCollection : TCollection);
+begin
+ inherited Create(aCollection);
+ fMaxRecords := -1;
+end;
+
+function TableRequestInfo.GetParameters: DataParameterArray;
+begin
+ if (fParameters = nil) then fParameters := DataParameterArray.Create();
+ result := fParameters;
+end;
+
+procedure TableRequestInfo.ReadComplex(ASerializer: TObject);
+var
+ l_IncludeSchema: Boolean;
+ l_MaxRecords: Integer;
+ l_Parameters: DataParameterArray;
+ l_UserFilter: Utf8String;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ l_UserFilter := UserFilter;
+ TROSerializer(ASerializer).ReadUTF8String('UserFilter', l_UserFilter);
+ UserFilter := l_UserFilter;
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).ReadEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ IncludeSchema := l_IncludeSchema;
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).ReadInteger('MaxRecords', otSLong, l_MaxRecords);
+ MaxRecords := l_MaxRecords;
+ l_Parameters := Parameters;
+ TROSerializer(ASerializer).ReadArray('Parameters', DataParameterArray, l_Parameters);
+ if Parameters <> l_Parameters then Parameters.Free;
+ Parameters := l_Parameters;
+ end
+ else begin
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).ReadEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ IncludeSchema := l_IncludeSchema;
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).ReadInteger('MaxRecords', otSLong, l_MaxRecords);
+ MaxRecords := l_MaxRecords;
+ l_Parameters := Parameters;
+ TROSerializer(ASerializer).ReadArray('Parameters', DataParameterArray, l_Parameters);
+ if Parameters <> l_Parameters then Parameters.Free;
+ Parameters := l_Parameters;
+ l_UserFilter := UserFilter;
+ TROSerializer(ASerializer).ReadUTF8String('UserFilter', l_UserFilter);
+ UserFilter := l_UserFilter;
+ end;
+end;
+
+procedure TableRequestInfo.WriteComplex(ASerializer: TObject);
+var
+ l_IncludeSchema: Boolean;
+ l_MaxRecords: Integer;
+ l_Parameters: DataParameterArray;
+ l_UserFilter: Utf8String;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ TROSerializer(ASerializer).ChangeClass(TableRequestInfo);
+ l_UserFilter := UserFilter;
+ TROSerializer(ASerializer).WriteUTF8String('UserFilter', l_UserFilter);
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).WriteEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).WriteInteger('MaxRecords', otSLong, l_MaxRecords);
+ l_Parameters := Parameters;
+ TROSerializer(ASerializer).WriteArray('Parameters', l_Parameters, DataParameterArray);
+ end
+ else begin
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).WriteEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).WriteInteger('MaxRecords', otSLong, l_MaxRecords);
+ l_Parameters := Parameters;
+ TROSerializer(ASerializer).WriteArray('Parameters', l_Parameters, DataParameterArray);
+ l_UserFilter := UserFilter;
+ TROSerializer(ASerializer).WriteUTF8String('UserFilter', l_UserFilter);
+ end;
+end;
+
+{ TableRequestInfoCollection }
+constructor TableRequestInfoCollection.Create;
+begin
+ inherited Create(TableRequestInfo);
+end;
+
+constructor TableRequestInfoCollection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function TableRequestInfoCollection.Add: TableRequestInfo;
+begin
+ result := TableRequestInfo(inherited Add);
+end;
+
+function TableRequestInfoCollection.GetItems(aIndex: integer): TableRequestInfo;
+begin
+ result := TableRequestInfo(inherited Items[aIndex]);
+end;
+
+procedure TableRequestInfoCollection.LoadFromArray(anArray: TableRequestInfoArray);
+var i : integer;
+begin
+ Clear;
+ for i := 0 to (anArray.Count-1) do
+ Add.Assign(anArray[i]);
+end;
+
+procedure TableRequestInfoCollection.SaveToArray(anArray: TableRequestInfoArray);
+var i : integer;
+begin
+ anArray.Clear;
+ anArray.Resize(Count);
+ for i := 0 to (Count-1) do begin
+ anArray[i] := TableRequestInfo.Create;
+ anArray[i].Assign(Items[i]);
+ end;
+end;
+
+procedure TableRequestInfoCollection.SetItems(aIndex: integer; const Value: TableRequestInfo);
+begin
+ TableRequestInfo(inherited Items[aIndex]).Assign(Value);
+end;
+
+{ UserInfo }
+
+procedure UserInfo.Assign(iSource: TPersistent);
+var lSource: DataAbstract4_Intf.UserInfo;
+begin
+ inherited Assign(iSource);
+ if (iSource is DataAbstract4_Intf.UserInfo) then begin
+ lSource := DataAbstract4_Intf.UserInfo(iSource);
+ SessionID := lSource.SessionID;
+ UserID := lSource.UserID;
+ Privileges.Assign(lSource.Privileges);
+ Attributes.Assign(lSource.Attributes);
+ UserData.Assign(lSource.UserData);
+ end;
+end;
+
+function UserInfo.GetPrivileges: StringArray;
+begin
+ if (fPrivileges = nil) then fPrivileges := StringArray.Create();
+ result := fPrivileges;
+end;
+
+function UserInfo.GetAttributes: VariantArray;
+begin
+ if (fAttributes = nil) then fAttributes := VariantArray.Create();
+ result := fAttributes;
+end;
+
+function UserInfo.GetUserData: Binary;
+begin
+ if (fUserData = nil) then fUserData := Binary.Create();
+ result := fUserData;
+end;
+
+procedure UserInfo.ReadComplex(ASerializer: TObject);
+var
+ l_Attributes: VariantArray;
+ l_Privileges: StringArray;
+ l_SessionID: Utf8String;
+ l_UserData: Binary;
+ l_UserID: Utf8String;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ l_SessionID := SessionID;
+ TROSerializer(ASerializer).ReadUTF8String('SessionID', l_SessionID);
+ SessionID := l_SessionID;
+ l_UserID := UserID;
+ TROSerializer(ASerializer).ReadUTF8String('UserID', l_UserID);
+ UserID := l_UserID;
+ l_Privileges := Privileges;
+ TROSerializer(ASerializer).ReadArray('Privileges', StringArray, l_Privileges);
+ if Privileges <> l_Privileges then Privileges.Free;
+ Privileges := l_Privileges;
+ l_Attributes := Attributes;
+ TROSerializer(ASerializer).ReadArray('Attributes', VariantArray, l_Attributes);
+ if Attributes <> l_Attributes then Attributes.Free;
+ Attributes := l_Attributes;
+ l_UserData := UserData;
+ TROSerializer(ASerializer).ReadBinary('UserData', l_UserData);
+ if UserData <> l_UserData then UserData.Free;
+ UserData := l_UserData;
+ end
+ else begin
+ l_Attributes := Attributes;
+ TROSerializer(ASerializer).ReadArray('Attributes', VariantArray, l_Attributes);
+ if Attributes <> l_Attributes then Attributes.Free;
+ Attributes := l_Attributes;
+ l_Privileges := Privileges;
+ TROSerializer(ASerializer).ReadArray('Privileges', StringArray, l_Privileges);
+ if Privileges <> l_Privileges then Privileges.Free;
+ Privileges := l_Privileges;
+ l_SessionID := SessionID;
+ TROSerializer(ASerializer).ReadUTF8String('SessionID', l_SessionID);
+ SessionID := l_SessionID;
+ l_UserData := UserData;
+ TROSerializer(ASerializer).ReadBinary('UserData', l_UserData);
+ if UserData <> l_UserData then UserData.Free;
+ UserData := l_UserData;
+ l_UserID := UserID;
+ TROSerializer(ASerializer).ReadUTF8String('UserID', l_UserID);
+ UserID := l_UserID;
+ end;
+end;
+
+procedure UserInfo.WriteComplex(ASerializer: TObject);
+var
+ l_Attributes: VariantArray;
+ l_Privileges: StringArray;
+ l_SessionID: Utf8String;
+ l_UserData: Binary;
+ l_UserID: Utf8String;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ TROSerializer(ASerializer).ChangeClass(UserInfo);
+ l_SessionID := SessionID;
+ TROSerializer(ASerializer).WriteUTF8String('SessionID', l_SessionID);
+ l_UserID := UserID;
+ TROSerializer(ASerializer).WriteUTF8String('UserID', l_UserID);
+ l_Privileges := Privileges;
+ TROSerializer(ASerializer).WriteArray('Privileges', l_Privileges, StringArray);
+ l_Attributes := Attributes;
+ TROSerializer(ASerializer).WriteArray('Attributes', l_Attributes, VariantArray);
+ l_UserData := UserData;
+ TROSerializer(ASerializer).WriteBinary('UserData', l_UserData);
+ end
+ else begin
+ l_Attributes := Attributes;
+ TROSerializer(ASerializer).WriteArray('Attributes', l_Attributes, VariantArray);
+ l_Privileges := Privileges;
+ TROSerializer(ASerializer).WriteArray('Privileges', l_Privileges, StringArray);
+ l_SessionID := SessionID;
+ TROSerializer(ASerializer).WriteUTF8String('SessionID', l_SessionID);
+ l_UserData := UserData;
+ TROSerializer(ASerializer).WriteBinary('UserData', l_UserData);
+ l_UserID := UserID;
+ TROSerializer(ASerializer).WriteUTF8String('UserID', l_UserID);
+ end;
+end;
+
+{ UserInfoCollection }
+constructor UserInfoCollection.Create;
+begin
+ inherited Create(UserInfo);
+end;
+
+constructor UserInfoCollection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function UserInfoCollection.Add: UserInfo;
+begin
+ result := UserInfo(inherited Add);
+end;
+
+function UserInfoCollection.GetItems(aIndex: integer): UserInfo;
+begin
+ result := UserInfo(inherited Items[aIndex]);
+end;
+
+procedure UserInfoCollection.SetItems(aIndex: integer; const Value: UserInfo);
+begin
+ UserInfo(inherited Items[aIndex]).Assign(Value);
+end;
+
+{ TableRequestInfoV5 }
+
+procedure TableRequestInfoV5.Assign(iSource: TPersistent);
+var lSource: DataAbstract4_Intf.TableRequestInfoV5;
+begin
+ inherited Assign(iSource);
+ if (iSource is DataAbstract4_Intf.TableRequestInfoV5) then begin
+ lSource := DataAbstract4_Intf.TableRequestInfoV5(iSource);
+ WhereClause := lSource.WhereClause;
+ DynamicSelectFieldNames.Assign(lSource.DynamicSelectFieldNames);
+ Sorting.Assign(lSource.Sorting);
+ end;
+end;
+
+function TableRequestInfoV5.GetDynamicSelectFieldNames: StringArray;
+begin
+ if (fDynamicSelectFieldNames = nil) then fDynamicSelectFieldNames := StringArray.Create();
+ result := fDynamicSelectFieldNames;
+end;
+
+function TableRequestInfoV5.GetSorting: ColumnSorting;
+begin
+ if (fSorting = nil) then fSorting := ColumnSorting.Create();
+ result := fSorting;
+end;
+
+procedure TableRequestInfoV5.ReadComplex(ASerializer: TObject);
+var
+ l_DynamicSelectFieldNames: StringArray;
+ l_IncludeSchema: Boolean;
+ l_MaxRecords: Integer;
+ l_Parameters: DataParameterArray;
+ l_Sorting: ColumnSorting;
+ l_UserFilter: Utf8String;
+ l_WhereClause: IXmlNode;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ inherited;
+ l_WhereClause := WhereClause;
+ TROSerializer(ASerializer).ReadXML('WhereClause', l_WhereClause);
+ WhereClause := l_WhereClause;
+ l_DynamicSelectFieldNames := DynamicSelectFieldNames;
+ TROSerializer(ASerializer).ReadArray('DynamicSelectFieldNames', StringArray, l_DynamicSelectFieldNames);
+ if DynamicSelectFieldNames <> l_DynamicSelectFieldNames then DynamicSelectFieldNames.Free;
+ DynamicSelectFieldNames := l_DynamicSelectFieldNames;
+ l_Sorting := Sorting;
+ TROSerializer(ASerializer).ReadStruct('Sorting', ColumnSorting, l_Sorting);
+ if Sorting <> l_Sorting then Sorting.Free;
+ Sorting := l_Sorting;
+ end
+ else begin
+ l_DynamicSelectFieldNames := DynamicSelectFieldNames;
+ TROSerializer(ASerializer).ReadArray('DynamicSelectFieldNames', StringArray, l_DynamicSelectFieldNames);
+ if DynamicSelectFieldNames <> l_DynamicSelectFieldNames then DynamicSelectFieldNames.Free;
+ DynamicSelectFieldNames := l_DynamicSelectFieldNames;
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).ReadEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ IncludeSchema := l_IncludeSchema;
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).ReadInteger('MaxRecords', otSLong, l_MaxRecords);
+ MaxRecords := l_MaxRecords;
+ l_Parameters := Parameters;
+ TROSerializer(ASerializer).ReadArray('Parameters', DataParameterArray, l_Parameters);
+ if Parameters <> l_Parameters then Parameters.Free;
+ Parameters := l_Parameters;
+ l_Sorting := Sorting;
+ TROSerializer(ASerializer).ReadStruct('Sorting', ColumnSorting, l_Sorting);
+ if Sorting <> l_Sorting then Sorting.Free;
+ Sorting := l_Sorting;
+ l_UserFilter := UserFilter;
+ TROSerializer(ASerializer).ReadUTF8String('UserFilter', l_UserFilter);
+ UserFilter := l_UserFilter;
+ l_WhereClause := WhereClause;
+ TROSerializer(ASerializer).ReadXML('WhereClause', l_WhereClause);
+ WhereClause := l_WhereClause;
+ end;
+end;
+
+procedure TableRequestInfoV5.WriteComplex(ASerializer: TObject);
+var
+ l_DynamicSelectFieldNames: StringArray;
+ l_IncludeSchema: Boolean;
+ l_MaxRecords: Integer;
+ l_Parameters: DataParameterArray;
+ l_Sorting: ColumnSorting;
+ l_UserFilter: Utf8String;
+ l_WhereClause: IXmlNode;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ inherited;
+ TROSerializer(ASerializer).ChangeClass(TableRequestInfoV5);
+ l_WhereClause := WhereClause;
+ TROSerializer(ASerializer).WriteXML('WhereClause', l_WhereClause);
+ l_DynamicSelectFieldNames := DynamicSelectFieldNames;
+ TROSerializer(ASerializer).WriteArray('DynamicSelectFieldNames', l_DynamicSelectFieldNames, StringArray);
+ l_Sorting := Sorting;
+ TROSerializer(ASerializer).WriteStruct('Sorting', l_Sorting, ColumnSorting);
+ end
+ else begin
+ l_DynamicSelectFieldNames := DynamicSelectFieldNames;
+ TROSerializer(ASerializer).WriteArray('DynamicSelectFieldNames', l_DynamicSelectFieldNames, StringArray);
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).WriteEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).WriteInteger('MaxRecords', otSLong, l_MaxRecords);
+ l_Parameters := Parameters;
+ TROSerializer(ASerializer).WriteArray('Parameters', l_Parameters, DataParameterArray);
+ l_Sorting := Sorting;
+ TROSerializer(ASerializer).WriteStruct('Sorting', l_Sorting, ColumnSorting);
+ l_UserFilter := UserFilter;
+ TROSerializer(ASerializer).WriteUTF8String('UserFilter', l_UserFilter);
+ l_WhereClause := WhereClause;
+ TROSerializer(ASerializer).WriteXML('WhereClause', l_WhereClause);
+ end;
+end;
+
+{ TableRequestInfoV5Collection }
+constructor TableRequestInfoV5Collection.Create;
+begin
+ inherited Create(TableRequestInfoV5);
+end;
+
+constructor TableRequestInfoV5Collection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function TableRequestInfoV5Collection.Add: TableRequestInfoV5;
+begin
+ result := TableRequestInfoV5(inherited Add);
+end;
+
+function TableRequestInfoV5Collection.GetItems(aIndex: integer): TableRequestInfoV5;
+begin
+ result := TableRequestInfoV5(inherited Items[aIndex]);
+end;
+
+procedure TableRequestInfoV5Collection.SetItems(aIndex: integer; const Value: TableRequestInfoV5);
+begin
+ TableRequestInfoV5(inherited Items[aIndex]).Assign(Value);
+end;
+
+{ ColumnSorting }
+
+procedure ColumnSorting.Assign(iSource: TPersistent);
+var lSource: DataAbstract4_Intf.ColumnSorting;
+begin
+ inherited Assign(iSource);
+ if (iSource is DataAbstract4_Intf.ColumnSorting) then begin
+ lSource := DataAbstract4_Intf.ColumnSorting(iSource);
+ FieldName := lSource.FieldName;
+ SortDirection := lSource.SortDirection;
+ end;
+end;
+
+procedure ColumnSorting.ReadComplex(ASerializer: TObject);
+var
+ l_FieldName: Utf8String;
+ l_SortDirection: ColumnSortDirection;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ l_FieldName := FieldName;
+ TROSerializer(ASerializer).ReadUTF8String('FieldName', l_FieldName);
+ FieldName := l_FieldName;
+ l_SortDirection := SortDirection;
+ TROSerializer(ASerializer).ReadEnumerated('SortDirection',TypeInfo(ColumnSortDirection), l_SortDirection);
+ SortDirection := l_SortDirection;
+ end
+ else begin
+ l_FieldName := FieldName;
+ TROSerializer(ASerializer).ReadUTF8String('FieldName', l_FieldName);
+ FieldName := l_FieldName;
+ l_SortDirection := SortDirection;
+ TROSerializer(ASerializer).ReadEnumerated('SortDirection',TypeInfo(ColumnSortDirection), l_SortDirection);
+ SortDirection := l_SortDirection;
+ end;
+end;
+
+procedure ColumnSorting.WriteComplex(ASerializer: TObject);
+var
+ l_FieldName: Utf8String;
+ l_SortDirection: ColumnSortDirection;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ TROSerializer(ASerializer).ChangeClass(ColumnSorting);
+ l_FieldName := FieldName;
+ TROSerializer(ASerializer).WriteUTF8String('FieldName', l_FieldName);
+ l_SortDirection := SortDirection;
+ TROSerializer(ASerializer).WriteEnumerated('SortDirection',TypeInfo(ColumnSortDirection), l_SortDirection);
+ end
+ else begin
+ l_FieldName := FieldName;
+ TROSerializer(ASerializer).WriteUTF8String('FieldName', l_FieldName);
+ l_SortDirection := SortDirection;
+ TROSerializer(ASerializer).WriteEnumerated('SortDirection',TypeInfo(ColumnSortDirection), l_SortDirection);
+ end;
+end;
+
+{ ColumnSortingCollection }
+constructor ColumnSortingCollection.Create;
+begin
+ inherited Create(ColumnSorting);
+end;
+
+constructor ColumnSortingCollection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function ColumnSortingCollection.Add: ColumnSorting;
+begin
+ result := ColumnSorting(inherited Add);
+end;
+
+function ColumnSortingCollection.GetItems(aIndex: integer): ColumnSorting;
+begin
+ result := ColumnSorting(inherited Items[aIndex]);
+end;
+
+procedure ColumnSortingCollection.LoadFromArray(anArray: ColumnSortingArray);
+var i : integer;
+begin
+ Clear;
+ for i := 0 to (anArray.Count-1) do
+ Add.Assign(anArray[i]);
+end;
+
+procedure ColumnSortingCollection.SaveToArray(anArray: ColumnSortingArray);
+var i : integer;
+begin
+ anArray.Clear;
+ anArray.Resize(Count);
+ for i := 0 to (Count-1) do begin
+ anArray[i] := ColumnSorting.Create;
+ anArray[i].Assign(Items[i]);
+ end;
+end;
+
+procedure ColumnSortingCollection.SetItems(aIndex: integer; const Value: ColumnSorting);
+begin
+ ColumnSorting(inherited Items[aIndex]).Assign(Value);
+end;
+
+{ TableRequestInfoV6 }
+
+procedure TableRequestInfoV6.Assign(iSource: TPersistent);
+var lSource: DataAbstract4_Intf.TableRequestInfoV6;
+begin
+ inherited Assign(iSource);
+ if (iSource is DataAbstract4_Intf.TableRequestInfoV6) then begin
+ lSource := DataAbstract4_Intf.TableRequestInfoV6(iSource);
+ Sql := lSource.Sql;
+ end;
+end;
+
+procedure TableRequestInfoV6.ReadComplex(ASerializer: TObject);
+var
+ l_IncludeSchema: Boolean;
+ l_MaxRecords: Integer;
+ l_Parameters: DataParameterArray;
+ l_Sql: Widestring;
+ l_UserFilter: Utf8String;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ inherited;
+ l_Sql := Sql;
+ TROSerializer(ASerializer).ReadWideString('Sql', l_Sql);
+ Sql := l_Sql;
+ end
+ else begin
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).ReadEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ IncludeSchema := l_IncludeSchema;
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).ReadInteger('MaxRecords', otSLong, l_MaxRecords);
+ MaxRecords := l_MaxRecords;
+ l_Parameters := Parameters;
+ TROSerializer(ASerializer).ReadArray('Parameters', DataParameterArray, l_Parameters);
+ if Parameters <> l_Parameters then Parameters.Free;
+ Parameters := l_Parameters;
+ l_Sql := Sql;
+ TROSerializer(ASerializer).ReadWideString('Sql', l_Sql);
+ Sql := l_Sql;
+ l_UserFilter := UserFilter;
+ TROSerializer(ASerializer).ReadUTF8String('UserFilter', l_UserFilter);
+ UserFilter := l_UserFilter;
+ end;
+end;
+
+procedure TableRequestInfoV6.WriteComplex(ASerializer: TObject);
+var
+ l_IncludeSchema: Boolean;
+ l_MaxRecords: Integer;
+ l_Parameters: DataParameterArray;
+ l_Sql: Widestring;
+ l_UserFilter: Utf8String;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ inherited;
+ TROSerializer(ASerializer).ChangeClass(TableRequestInfoV6);
+ l_Sql := Sql;
+ TROSerializer(ASerializer).WriteWideString('Sql', l_Sql);
+ end
+ else begin
+ l_IncludeSchema := IncludeSchema;
+ TROSerializer(ASerializer).WriteEnumerated('IncludeSchema',TypeInfo(boolean), l_IncludeSchema);
+ l_MaxRecords := MaxRecords;
+ TROSerializer(ASerializer).WriteInteger('MaxRecords', otSLong, l_MaxRecords);
+ l_Parameters := Parameters;
+ TROSerializer(ASerializer).WriteArray('Parameters', l_Parameters, DataParameterArray);
+ l_Sql := Sql;
+ TROSerializer(ASerializer).WriteWideString('Sql', l_Sql);
+ l_UserFilter := UserFilter;
+ TROSerializer(ASerializer).WriteUTF8String('UserFilter', l_UserFilter);
+ end;
+end;
+
+{ TableRequestInfoV6Collection }
+constructor TableRequestInfoV6Collection.Create;
+begin
+ inherited Create(TableRequestInfoV6);
+end;
+
+constructor TableRequestInfoV6Collection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function TableRequestInfoV6Collection.Add: TableRequestInfoV6;
+begin
+ result := TableRequestInfoV6(inherited Add);
+end;
+
+function TableRequestInfoV6Collection.GetItems(aIndex: integer): TableRequestInfoV6;
+begin
+ result := TableRequestInfoV6(inherited Items[aIndex]);
+end;
+
+procedure TableRequestInfoV6Collection.SetItems(aIndex: integer; const Value: TableRequestInfoV6);
+begin
+ TableRequestInfoV6(inherited Items[aIndex]).Assign(Value);
+end;
+
+{ CoDataAbstractService }
+
+class function CoDataAbstractService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDataAbstractService;
+begin
+ result := TDataAbstractService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TDataAbstractService_Proxy }
+
+function TDataAbstractService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'DataAbstractService';
+end;
+
+function TDataAbstractService_Proxy.GetSchema(const aFilter: Utf8String): Utf8String;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetSchema');
+ __Message.Write('aFilter', TypeInfo(Utf8String), aFilter, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Utf8String), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.GetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray): Binary;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetData');
+ __Message.Write('aTableNameArray', TypeInfo(DataAbstract4_Intf.StringArray), aTableNameArray, []);
+ __Message.Write('aTableRequestInfoArray', TypeInfo(DataAbstract4_Intf.TableRequestInfoArray), aTableRequestInfoArray, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Binary), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.UpdateData(const aDelta: Binary): Binary;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'UpdateData');
+ __Message.Write('aDelta', TypeInfo(Binary), aDelta, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Binary), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.ExecuteCommand(const aCommandName: Utf8String; const aParameterArray: DataParameterArray): Integer;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'ExecuteCommand');
+ __Message.Write('aCommandName', TypeInfo(Utf8String), aCommandName, []);
+ __Message.Write('aParameterArray', TypeInfo(DataAbstract4_Intf.DataParameterArray), aParameterArray, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Integer), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.ExecuteCommandEx(const aCommandName: Utf8String; const aInputParameters: DataParameterArray; out aOutputParameters: DataParameterArray): Integer;
+begin
+ try
+ aOutputParameters := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'ExecuteCommandEx');
+ __Message.Write('aCommandName', TypeInfo(Utf8String), aCommandName, []);
+ __Message.Write('aInputParameters', TypeInfo(DataAbstract4_Intf.DataParameterArray), aInputParameters, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Integer), result, []);
+ __Message.Read('aOutputParameters', TypeInfo(DataAbstract4_Intf.DataParameterArray), aOutputParameters, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.GetTableSchema(const aTableNameArray: StringArray): Utf8String;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetTableSchema');
+ __Message.Write('aTableNameArray', TypeInfo(DataAbstract4_Intf.StringArray), aTableNameArray, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Utf8String), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.GetCommandSchema(const aCommandNameArray: StringArray): Utf8String;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetCommandSchema');
+ __Message.Write('aCommandNameArray', TypeInfo(DataAbstract4_Intf.StringArray), aCommandNameArray, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Utf8String), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.SQLGetData(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer): Binary;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'SQLGetData');
+ __Message.Write('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __Message.Write('aIncludeSchema', TypeInfo(Boolean), aIncludeSchema, []);
+ __Message.Write('aMaxRecords', TypeInfo(Integer), aMaxRecords, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Binary), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.SQLGetDataEx(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer; const aDynamicWhereXML: Widestring): Binary;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'SQLGetDataEx');
+ __Message.Write('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __Message.Write('aIncludeSchema', TypeInfo(Boolean), aIncludeSchema, []);
+ __Message.Write('aMaxRecords', TypeInfo(Integer), aMaxRecords, []);
+ __Message.Write('aDynamicWhereXML', TypeInfo(Widestring), aDynamicWhereXML, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Binary), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.SQLExecuteCommand(const aSQLText: Utf8String): Integer;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'SQLExecuteCommand');
+ __Message.Write('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Integer), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.SQLExecuteCommandEx(const aSQLText: Utf8String; const aDynamicWhereXML: Widestring): Integer;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'SQLExecuteCommandEx');
+ __Message.Write('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __Message.Write('aDynamicWhereXML', TypeInfo(Widestring), aDynamicWhereXML, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Integer), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TDataAbstractService_Proxy.GetDatasetScripts(const DatasetNames: Utf8String): Utf8String;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetDatasetScripts');
+ __Message.Write('DatasetNames', TypeInfo(Utf8String), DatasetNames, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Utf8String), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+procedure TDataAbstractService_Proxy.RegisterForDataChangeNotification(const aTableName: Utf8String);
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'RegisterForDataChangeNotification');
+ __Message.Write('aTableName', TypeInfo(Utf8String), aTableName, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+procedure TDataAbstractService_Proxy.UnregisterForDataChangeNotification(const aTableName: Utf8String);
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'UnregisterForDataChangeNotification');
+ __Message.Write('aTableName', TypeInfo(Utf8String), aTableName, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+{ CoSimpleLoginService }
+
+class function CoSimpleLoginService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): ISimpleLoginService;
+begin
+ result := TSimpleLoginService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TSimpleLoginService_Proxy }
+
+function TSimpleLoginService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'SimpleLoginService';
+end;
+
+function TSimpleLoginService_Proxy.Login(const aUserID: Utf8String; const aPassword: Utf8String; out aUserInfo: UserInfo): Boolean;
+begin
+ try
+ aUserInfo := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'Login');
+ __Message.Write('aUserID', TypeInfo(Utf8String), aUserID, []);
+ __Message.Write('aPassword', TypeInfo(Utf8String), aPassword, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Boolean), result, []);
+ __Message.Read('aUserInfo', TypeInfo(DataAbstract4_Intf.UserInfo), aUserInfo, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+{ CoBaseLoginService }
+
+class function CoBaseLoginService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IBaseLoginService;
+begin
+ result := TBaseLoginService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TBaseLoginService_Proxy }
+
+function TBaseLoginService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'BaseLoginService';
+end;
+
+function TBaseLoginService_Proxy.LoginEx(const aLoginString: Utf8String): Boolean;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'LoginEx');
+ __Message.Write('aLoginString', TypeInfo(Utf8String), aLoginString, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Boolean), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+procedure TBaseLoginService_Proxy.Logout;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'Logout');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ finally
+ __Message.FreeStream;
+ end
+end;
+
+{ CoMultiDbLoginService }
+
+class function CoMultiDbLoginService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMultiDbLoginService;
+begin
+ result := TMultiDbLoginService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TMultiDbLoginService_Proxy }
+
+function TMultiDbLoginService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'MultiDbLoginService';
+end;
+
+function TMultiDbLoginService_Proxy.Login(const aUserID: Utf8String; const aPassword: Utf8String; const aConnectionName: Utf8String; out aUserInfo: UserInfo): Boolean;
+begin
+ try
+ aUserInfo := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'Login');
+ __Message.Write('aUserID', TypeInfo(Utf8String), aUserID, []);
+ __Message.Write('aPassword', TypeInfo(Utf8String), aPassword, []);
+ __Message.Write('aConnectionName', TypeInfo(Utf8String), aConnectionName, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Boolean), result, []);
+ __Message.Read('aUserInfo', TypeInfo(DataAbstract4_Intf.UserInfo), aUserInfo, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+{ CoMultiDbLoginServiceV5 }
+
+class function CoMultiDbLoginServiceV5.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMultiDbLoginServiceV5;
+begin
+ result := TMultiDbLoginServiceV5_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TMultiDbLoginServiceV5_Proxy }
+
+function TMultiDbLoginServiceV5_Proxy.__GetInterfaceName:string;
+begin
+ result := 'MultiDbLoginServiceV5';
+end;
+
+function TMultiDbLoginServiceV5_Proxy.GetConnectionNames: StringArray;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetConnectionNames');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(DataAbstract4_Intf.StringArray), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TMultiDbLoginServiceV5_Proxy.GetDefaultConnectionName: Utf8String;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'DataAbstract4', __InterfaceName, 'GetDefaultConnectionName');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Utf8String), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+type
+ { TDataChangeNotification_Writer }
+ TDataChangeNotification_Writer = class(TROEventWriter, IDataChangeNotification_Writer)
+ protected
+ procedure OnDataTableChanged(const __Sender : TGUID; const aTableName: Utf8String; const aDelta: Binary);
+ end;
+
+procedure TDataChangeNotification_Writer.OnDataTableChanged(const __Sender : TGUID; const aTableName: Utf8String; const aDelta: Binary);
+var __eventdata : Binary;
+begin
+ __eventdata := Binary.Create;
+ try
+ __Message.InitializeEventMessage(NIL, 'DataAbstract4', EID_DataChangeNotification, 'OnDataTableChanged');
+ __Message.Write('aTableName', TypeInfo(Utf8String), aTableName, []);
+ __Message.Write('aDelta', TypeInfo(Binary), aDelta, []);
+ __Message.Finalize;
+
+ __Message.WriteToStream(__eventdata);
+
+ Repository.StoreEventData(__Sender, __eventdata, ExcludeSender, ExcludeSessionList, SessionList.CommaText);
+ finally
+ __eventdata.Free;
+ end;
+end;
+
+type
+ { TDataChangeNotification_Invoker }
+ TDataChangeNotification_Invoker = class(TROEventInvoker)
+ published
+ procedure Invoke_OnDataTableChanged(__EventReceiver : TROEventReceiver; const __Message : IROMessage; const __Target : IUnknown);
+ end;
+
+procedure TDataChangeNotification_Invoker.Invoke_OnDataTableChanged(__EventReceiver : TROEventReceiver; const __Message : IROMessage; const __Target : IUnknown);
+var
+__lObjectDisposer: TROObjectDisposer;
+ aTableName: Utf8String;
+ aDelta: Binary;
+begin
+ aDelta := NIL;
+
+ try
+ __Message.Read('aTableName', TypeInfo(Utf8String), aTableName, []);
+ __Message.Read('aDelta', TypeInfo(Binary), aDelta, []);
+
+ (__Target as IDataChangeNotification).OnDataTableChanged(aTableName, aDelta);
+
+ finally
+ __lObjectDisposer:= TROObjectDisposer.Create(__EventReceiver);
+ try
+ __lObjectDisposer.Add(aDelta);
+ finally
+ __lObjectDisposer.Free();
+ end
+ end
+end;
+
+initialization
+ RegisterROClass(DataParameter);
+ RegisterROClass(TableRequestInfo);
+ RegisterROClass(UserInfo);
+ RegisterROClass(TableRequestInfoV5);
+ RegisterROClass(ColumnSorting);
+ RegisterROClass(TableRequestInfoV6);
+ RegisterROClass(DataParameterArray);
+ RegisterROClass(TableRequestInfoArray);
+ RegisterROClass(StringArray);
+ RegisterROClass(VariantArray);
+ RegisterROClass(ColumnSortingArray);
+ RegisterProxyClass(IDataAbstractService_IID, TDataAbstractService_Proxy);
+ RegisterProxyClass(ISimpleLoginService_IID, TSimpleLoginService_Proxy);
+ RegisterProxyClass(IBaseLoginService_IID, TBaseLoginService_Proxy);
+ RegisterProxyClass(IMultiDbLoginService_IID, TMultiDbLoginService_Proxy);
+ RegisterProxyClass(IMultiDbLoginServiceV5_IID, TMultiDbLoginServiceV5_Proxy);
+
+ RegisterEventWriterClass(IDataChangeNotification_Writer, TDataChangeNotification_Writer);
+ RegisterEventInvokerClass(EID_DataChangeNotification, TDataChangeNotification_Invoker);
+
+finalization
+ UnregisterROClass(DataParameter);
+ UnregisterROClass(TableRequestInfo);
+ UnregisterROClass(UserInfo);
+ UnregisterROClass(TableRequestInfoV5);
+ UnregisterROClass(ColumnSorting);
+ UnregisterROClass(TableRequestInfoV6);
+ UnregisterROClass(DataParameterArray);
+ UnregisterROClass(TableRequestInfoArray);
+ UnregisterROClass(StringArray);
+ UnregisterROClass(VariantArray);
+ UnregisterROClass(ColumnSortingArray);
+ UnregisterProxyClass(IDataAbstractService_IID);
+ UnregisterProxyClass(ISimpleLoginService_IID);
+ UnregisterProxyClass(IBaseLoginService_IID);
+ UnregisterProxyClass(IMultiDbLoginService_IID);
+ UnregisterProxyClass(IMultiDbLoginServiceV5_IID);
+
+ UnregisterEventWriterClass(IDataChangeNotification_Writer);
+ UnregisterEventInvokerClass(EID_DataChangeNotification);
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4_Invk.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4_Invk.pas
new file mode 100644
index 0000000..fd826b9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract4_Invk.pas
@@ -0,0 +1,642 @@
+unit DataAbstract4_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Generated:} DataAbstract4_Intf;
+
+type
+ TDataAbstractService_Invoker = class(TROInvoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_GetSchema(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetData(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_UpdateData(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_ExecuteCommand(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_ExecuteCommandEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetTableSchema(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetCommandSchema(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_SQLGetData(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_SQLGetDataEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_SQLExecuteCommand(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_SQLExecuteCommandEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetDatasetScripts(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_RegisterForDataChangeNotification(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_UnregisterForDataChangeNotification(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+ TBaseLoginService_Invoker = class(TROInvoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_LoginEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_Logout(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+ TMultiDbLoginService_Invoker = class(TBaseLoginService_Invoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_Login(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+ TMultiDbLoginServiceV5_Invoker = class(TMultiDbLoginService_Invoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_GetConnectionNames(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetDefaultConnectionName(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+ TSimpleLoginService_Invoker = class(TBaseLoginService_Invoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_Login(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+{ TDataAbstractService_Invoker }
+
+constructor TDataAbstractService_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := True;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_GetSchema(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetSchema(const aFilter: Utf8String): Utf8String; }
+var
+ aFilter: Utf8String;
+ lResult: Utf8String;
+begin
+ try
+ __Message.Read('aFilter', TypeInfo(Utf8String), aFilter, []);
+
+ lResult := (__Instance as IDataAbstractService).GetSchema(aFilter);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'GetSchemaResponse');
+ __Message.Write('Result', TypeInfo(Utf8String), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_GetData(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray): Binary; }
+var
+ aTableNameArray: DataAbstract4_Intf.StringArray;
+ aTableRequestInfoArray: DataAbstract4_Intf.TableRequestInfoArray;
+ lResult: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ aTableNameArray := nil;
+ aTableRequestInfoArray := nil;
+ lResult := nil;
+ try
+ __Message.Read('aTableNameArray', TypeInfo(DataAbstract4_Intf.StringArray), aTableNameArray, []);
+ __Message.Read('aTableRequestInfoArray', TypeInfo(DataAbstract4_Intf.TableRequestInfoArray), aTableRequestInfoArray, []);
+
+ lResult := (__Instance as IDataAbstractService).GetData(aTableNameArray, aTableRequestInfoArray);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'GetDataResponse');
+ __Message.Write('Result', TypeInfo(Binary), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(aTableNameArray);
+ __lObjectDisposer.Add(aTableRequestInfoArray);
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_UpdateData(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function UpdateData(const aDelta: Binary): Binary; }
+var
+ aDelta: Binary;
+ lResult: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ aDelta := nil;
+ lResult := nil;
+ try
+ __Message.Read('aDelta', TypeInfo(Binary), aDelta, []);
+
+ lResult := (__Instance as IDataAbstractService).UpdateData(aDelta);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'UpdateDataResponse');
+ __Message.Write('Result', TypeInfo(Binary), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(aDelta);
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_ExecuteCommand(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function ExecuteCommand(const aCommandName: Utf8String; const aParameterArray: DataParameterArray): Integer; }
+var
+ aCommandName: Utf8String;
+ aParameterArray: DataAbstract4_Intf.DataParameterArray;
+ lResult: Integer;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ aParameterArray := nil;
+ try
+ __Message.Read('aCommandName', TypeInfo(Utf8String), aCommandName, []);
+ __Message.Read('aParameterArray', TypeInfo(DataAbstract4_Intf.DataParameterArray), aParameterArray, []);
+
+ lResult := (__Instance as IDataAbstractService).ExecuteCommand(aCommandName, aParameterArray);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'ExecuteCommandResponse');
+ __Message.Write('Result', TypeInfo(Integer), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(aParameterArray);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_ExecuteCommandEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function ExecuteCommandEx(const aCommandName: Utf8String; const aInputParameters: DataParameterArray; out aOutputParameters: DataParameterArray): Integer; }
+var
+ aCommandName: Utf8String;
+ aInputParameters: DataAbstract4_Intf.DataParameterArray;
+ aOutputParameters: DataAbstract4_Intf.DataParameterArray;
+ lResult: Integer;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ aInputParameters := nil;
+ aOutputParameters := nil;
+ try
+ __Message.Read('aCommandName', TypeInfo(Utf8String), aCommandName, []);
+ __Message.Read('aInputParameters', TypeInfo(DataAbstract4_Intf.DataParameterArray), aInputParameters, []);
+
+ lResult := (__Instance as IDataAbstractService).ExecuteCommandEx(aCommandName, aInputParameters, aOutputParameters);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'ExecuteCommandExResponse');
+ __Message.Write('Result', TypeInfo(Integer), lResult, []);
+ __Message.Write('aOutputParameters', TypeInfo(DataAbstract4_Intf.DataParameterArray), aOutputParameters, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(aInputParameters);
+ __lObjectDisposer.Add(aOutputParameters);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_GetTableSchema(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetTableSchema(const aTableNameArray: StringArray): Utf8String; }
+var
+ aTableNameArray: DataAbstract4_Intf.StringArray;
+ lResult: Utf8String;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ aTableNameArray := nil;
+ try
+ __Message.Read('aTableNameArray', TypeInfo(DataAbstract4_Intf.StringArray), aTableNameArray, []);
+
+ lResult := (__Instance as IDataAbstractService).GetTableSchema(aTableNameArray);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'GetTableSchemaResponse');
+ __Message.Write('Result', TypeInfo(Utf8String), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(aTableNameArray);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_GetCommandSchema(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetCommandSchema(const aCommandNameArray: StringArray): Utf8String; }
+var
+ aCommandNameArray: DataAbstract4_Intf.StringArray;
+ lResult: Utf8String;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ aCommandNameArray := nil;
+ try
+ __Message.Read('aCommandNameArray', TypeInfo(DataAbstract4_Intf.StringArray), aCommandNameArray, []);
+
+ lResult := (__Instance as IDataAbstractService).GetCommandSchema(aCommandNameArray);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'GetCommandSchemaResponse');
+ __Message.Write('Result', TypeInfo(Utf8String), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(aCommandNameArray);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_SQLGetData(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function SQLGetData(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer): Binary; }
+var
+ aSQLText: Utf8String;
+ aIncludeSchema: Boolean;
+ aMaxRecords: Integer;
+ lResult: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ lResult := nil;
+ try
+ __Message.Read('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __Message.Read('aIncludeSchema', TypeInfo(Boolean), aIncludeSchema, []);
+ __Message.Read('aMaxRecords', TypeInfo(Integer), aMaxRecords, []);
+
+ lResult := (__Instance as IDataAbstractService).SQLGetData(aSQLText, aIncludeSchema, aMaxRecords);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'SQLGetDataResponse');
+ __Message.Write('Result', TypeInfo(Binary), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_SQLGetDataEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function SQLGetDataEx(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer; const aDynamicWhereXML: Widestring): Binary; }
+var
+ aSQLText: Utf8String;
+ aIncludeSchema: Boolean;
+ aMaxRecords: Integer;
+ aDynamicWhereXML: Widestring;
+ lResult: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ lResult := nil;
+ try
+ __Message.Read('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __Message.Read('aIncludeSchema', TypeInfo(Boolean), aIncludeSchema, []);
+ __Message.Read('aMaxRecords', TypeInfo(Integer), aMaxRecords, []);
+ __Message.Read('aDynamicWhereXML', TypeInfo(Widestring), aDynamicWhereXML, []);
+
+ lResult := (__Instance as IDataAbstractService).SQLGetDataEx(aSQLText, aIncludeSchema, aMaxRecords, aDynamicWhereXML);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'SQLGetDataExResponse');
+ __Message.Write('Result', TypeInfo(Binary), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_SQLExecuteCommand(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function SQLExecuteCommand(const aSQLText: Utf8String): Integer; }
+var
+ aSQLText: Utf8String;
+ lResult: Integer;
+begin
+ try
+ __Message.Read('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+
+ lResult := (__Instance as IDataAbstractService).SQLExecuteCommand(aSQLText);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'SQLExecuteCommandResponse');
+ __Message.Write('Result', TypeInfo(Integer), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_SQLExecuteCommandEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function SQLExecuteCommandEx(const aSQLText: Utf8String; const aDynamicWhereXML: Widestring): Integer; }
+var
+ aSQLText: Utf8String;
+ aDynamicWhereXML: Widestring;
+ lResult: Integer;
+begin
+ try
+ __Message.Read('aSQLText', TypeInfo(Utf8String), aSQLText, []);
+ __Message.Read('aDynamicWhereXML', TypeInfo(Widestring), aDynamicWhereXML, []);
+
+ lResult := (__Instance as IDataAbstractService).SQLExecuteCommandEx(aSQLText, aDynamicWhereXML);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'SQLExecuteCommandExResponse');
+ __Message.Write('Result', TypeInfo(Integer), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_GetDatasetScripts(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetDatasetScripts(const DatasetNames: Utf8String): Utf8String; }
+var
+ DatasetNames: Utf8String;
+ lResult: Utf8String;
+begin
+ try
+ __Message.Read('DatasetNames', TypeInfo(Utf8String), DatasetNames, []);
+
+ lResult := (__Instance as IDataAbstractService).GetDatasetScripts(DatasetNames);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'GetDatasetScriptsResponse');
+ __Message.Write('Result', TypeInfo(Utf8String), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_RegisterForDataChangeNotification(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure RegisterForDataChangeNotification(const aTableName: Utf8String); }
+var
+ aTableName: Utf8String;
+begin
+ try
+ __Message.Read('aTableName', TypeInfo(Utf8String), aTableName, []);
+
+ (__Instance as IDataAbstractService).RegisterForDataChangeNotification(aTableName);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'RegisterForDataChangeNotificationResponse');
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ __oResponseOptions := [roNoResponse];
+
+ finally
+ end;
+end;
+
+procedure TDataAbstractService_Invoker.Invoke_UnregisterForDataChangeNotification(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure UnregisterForDataChangeNotification(const aTableName: Utf8String); }
+var
+ aTableName: Utf8String;
+begin
+ try
+ __Message.Read('aTableName', TypeInfo(Utf8String), aTableName, []);
+
+ (__Instance as IDataAbstractService).UnregisterForDataChangeNotification(aTableName);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'DataAbstractService', 'UnregisterForDataChangeNotificationResponse');
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ __oResponseOptions := [roNoResponse];
+
+ finally
+ end;
+end;
+
+{ TSimpleLoginService_Invoker }
+
+constructor TSimpleLoginService_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := True;
+end;
+
+procedure TSimpleLoginService_Invoker.Invoke_Login(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function Login(const aUserID: Utf8String; const aPassword: Utf8String; out aUserInfo: UserInfo): Boolean; }
+var
+ aUserID: Utf8String;
+ aPassword: Utf8String;
+ aUserInfo: DataAbstract4_Intf.UserInfo;
+ lResult: Boolean;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ aUserInfo := nil;
+ try
+ __Message.Read('aUserID', TypeInfo(Utf8String), aUserID, []);
+ __Message.Read('aPassword', TypeInfo(Utf8String), aPassword, []);
+
+ lResult := (__Instance as ISimpleLoginService).Login(aUserID, aPassword, aUserInfo);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'SimpleLoginService', 'LoginResponse');
+ __Message.Write('Result', TypeInfo(Boolean), lResult, []);
+ __Message.Write('aUserInfo', TypeInfo(DataAbstract4_Intf.UserInfo), aUserInfo, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(aUserInfo);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+{ TBaseLoginService_Invoker }
+
+constructor TBaseLoginService_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := True;
+end;
+
+procedure TBaseLoginService_Invoker.Invoke_LoginEx(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function LoginEx(const aLoginString: Utf8String): Boolean; }
+var
+ aLoginString: Utf8String;
+ lResult: Boolean;
+begin
+ try
+ __Message.Read('aLoginString', TypeInfo(Utf8String), aLoginString, []);
+
+ lResult := (__Instance as IBaseLoginService).LoginEx(aLoginString);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'BaseLoginService', 'LoginExResponse');
+ __Message.Write('Result', TypeInfo(Boolean), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TBaseLoginService_Invoker.Invoke_Logout(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure Logout; }
+begin
+ try
+ (__Instance as IBaseLoginService).Logout;
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'BaseLoginService', 'LogoutResponse');
+ __Message.Finalize;
+
+ __oResponseOptions := [roNoResponse];
+
+ finally
+ end;
+end;
+
+{ TMultiDbLoginService_Invoker }
+
+constructor TMultiDbLoginService_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := True;
+end;
+
+procedure TMultiDbLoginService_Invoker.Invoke_Login(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function Login(const aUserID: Utf8String; const aPassword: Utf8String; const aConnectionName: Utf8String; out aUserInfo: UserInfo): Boolean; }
+var
+ aUserID: Utf8String;
+ aPassword: Utf8String;
+ aConnectionName: Utf8String;
+ aUserInfo: DataAbstract4_Intf.UserInfo;
+ lResult: Boolean;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ aUserInfo := nil;
+ try
+ __Message.Read('aUserID', TypeInfo(Utf8String), aUserID, []);
+ __Message.Read('aPassword', TypeInfo(Utf8String), aPassword, []);
+ __Message.Read('aConnectionName', TypeInfo(Utf8String), aConnectionName, []);
+
+ lResult := (__Instance as IMultiDbLoginService).Login(aUserID, aPassword, aConnectionName, aUserInfo);
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'MultiDbLoginService', 'LoginResponse');
+ __Message.Write('Result', TypeInfo(Boolean), lResult, []);
+ __Message.Write('aUserInfo', TypeInfo(DataAbstract4_Intf.UserInfo), aUserInfo, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(aUserInfo);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+{ TMultiDbLoginServiceV5_Invoker }
+
+constructor TMultiDbLoginServiceV5_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := True;
+end;
+
+procedure TMultiDbLoginServiceV5_Invoker.Invoke_GetConnectionNames(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetConnectionNames: StringArray; }
+var
+ lResult: DataAbstract4_Intf.StringArray;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ lResult := nil;
+ try
+ lResult := (__Instance as IMultiDbLoginServiceV5).GetConnectionNames;
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'MultiDbLoginServiceV5', 'GetConnectionNamesResponse');
+ __Message.Write('Result', TypeInfo(DataAbstract4_Intf.StringArray), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TMultiDbLoginServiceV5_Invoker.Invoke_GetDefaultConnectionName(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetDefaultConnectionName: Utf8String; }
+var
+ lResult: Utf8String;
+begin
+ try
+ lResult := (__Instance as IMultiDbLoginServiceV5).GetDefaultConnectionName;
+
+ __Message.InitializeResponseMessage(__Transport, 'DataAbstract4', 'MultiDbLoginServiceV5', 'GetDefaultConnectionNameResponse');
+ __Message.Write('Result', TypeInfo(Utf8String), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+initialization
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.dfm
new file mode 100644
index 0000000..65deb18
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.dfm
@@ -0,0 +1,5 @@
+object DataAbstractService: TDataAbstractService
+ OldCreateOrder = True
+ Height = 437
+ Width = 546
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.lfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.lfm
new file mode 100644
index 0000000..e5b4ff9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.lfm
@@ -0,0 +1,7 @@
+inherited DataAbstractService: TDataAbstractService
+ OldCreateOrder = True
+ Height = 437
+ HorizontalOffset = 0
+ VerticalOffset = 0
+ Width = 546
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.lrs
new file mode 100644
index 0000000..cca0dab
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.lrs
@@ -0,0 +1,7 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TDataAbstractService','FORMDATA',[
+ 'TPF0'#241#20'TDataAbstractService'#19'DataAbstractService'#14'OldCreateOrder'
+ +#9#6'Height'#3#181#1#16'HorizontalOffset'#2#0#14'VerticalOffset'#2#0#5'Width'
+ +#3'"'#2#0#0
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.pas
new file mode 100644
index 0000000..f32a0cb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstractService_Impl.pas
@@ -0,0 +1,1554 @@
+unit DataAbstractService_Impl;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{----------------------------------------------------------------------------}
+{ When applying fixes to this unit, please see if the need to be propagates }
+{ to the duplicate dlogic in legacy DARemoteService_Impl.pas, too. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:} Classes, SysUtils, DB,
+ {Generated:} DataAbstract4_Intf,
+ uROClientIntf, uROTypes, uROServer, uROSessions, uRORemoteDataModule, uROClasses,
+ uDAInterfaces, uDAClasses, uDADataTable, uDADataStreamer, uDABusinessProcessor,
+ uDADataTableReferenceCollection, uDADelta, uDALocalHelpers;
+
+type
+ { Events }
+ TDAAcquireConnectionEvent = procedure(aSender: TObject; var aConnectionName: string) of object;
+ TDAConnectionAcquiredEvent = procedure(aSender: TObject; const aConnectionName: string; const aAcquiredConnection: IDAConnection) of object;
+ TDAAcquireConnectionFailureEvent = procedure(aSender: TObject; const aConnectionName: string; aError: Exception) of object;
+ TDAGetDatasetSchemaEvent = procedure(aSender: TObject; const aDataset: IDADataset) of object;
+ TDAGetDatasetDataEvent = procedure(aSender: TObject; const aDataset: IDADataset; const aIncludeSchema: Boolean; const aMaxRecords: Integer) of object;
+ TDABusinessProcessorAutoCreatedEvent = procedure(aSender: TRORemoteDataModule; BusinessProcessor : TDABusinessProcessor) of object;
+ TDABeforeExecuteCommandEvent = procedure(aSender: TObject; const aCommand: IDASQLCommand) of object;
+ TDAAfterExecuteCommandEvent = procedure(aSender: TObject; const aCommand: IDASQLCommand; aRowsAffacted : integer) of object;
+ TDAConnectionReleasedEvent = procedure(aSender: TObject; const aConnectionName: string) of object;
+ TDAGetSchemaAsXMLEvent = procedure(aSender: TObject; var aSchemaXML: Utf8string) of object;
+ TDAProcessDeltasEvent = procedure(aSender: TObject; aDeltaStructs: TDADeltaStructList) of object;
+ TDAProcessDeltasErrorEvent = procedure(aSender: TObject; aDeltaStructs: TDADeltaStructList; aError: Exception; var aDoRaise: boolean) of object;
+ TDASchemaElementAccessValidationEvent = procedure(Sender: TObject; const aConnection: IDAConnection; const aDatasetName: string;
+ const aParamNames: array of string; const aParamValues : array of variant;
+ aSchema: TDASchema; var Allowed : boolean) of object;
+ TDASQLValidationEvent = procedure(Sender: TObject; const aConnection: IDAConnection; const aSQLText: string;
+ const aParamNames: array of string; const aParamValues : array of variant;
+ var Allowed : boolean) of object;
+ TDAUpdateDataTransactionEvent = procedure(Sender: TObject; var aUseDefaultTransactionLogic: Boolean) of object;
+
+ TDADeltasMode = (dumExported, dumStandard);
+ TDADeltasModes = set of TDADeltasMode;
+ { TDataAbstractService }
+ TDataAbstractService = class(TRORemoteDataModule, IDataAbstractService, IDataAbstractLocalServiceAccess)
+ private
+ { Properties }
+ fAllowExecuteCommands: boolean;
+ fAllowExecuteSQL: boolean;
+ fAllowDataAccess: boolean;
+ fAllowSchemaAccess: boolean;
+ fAllowWhereSQL: boolean;
+ fConnectionName: string;
+ fAcquireConnection: boolean;
+ fServiceSchema: TDASchema;
+ fAutoCreateBusinessProcessors: boolean;
+ fServiceDataStreamer: TDADataStreamer;
+ fProcessDeltasWithoutUpdateRules: boolean;
+
+ fConnection: IDAConnection;
+ fHETConnection: IDAHETConnection;
+ fExportedDataTables: TDADataTableReferenceCollection;
+
+ { Events }
+ fBeforeGetDatasetSchema: TDAGetDatasetSchemaEvent;
+ fBeforeProcessDeltas: TDAProcessDeltasEvent;
+ fOnAcquireConnectionFailure: TDAAcquireConnectionFailureEvent;
+ fOnUpdateDataCommitTransaction: TDAUpdateDataTransactionEvent;
+ fGetDatasetDataValidation: TDASchemaElementAccessValidationEvent;
+ fExecuteCommandValidation: TDASchemaElementAccessValidationEvent;
+ fSQLValidation: TDASQLValidationEvent;
+ fAfterExecuteCommand: TDAAfterExecuteCommandEvent;
+ fBeforeAcquireConnection: TDAAcquireConnectionEvent;
+ fOnUpdateDataRollBackTransaction: TDAUpdateDataTransactionEvent;
+ fAfterGetDatasetData: TDAGetDatasetDataEvent;
+ fAfterReleaseConnection: TDAConnectionReleasedEvent;
+ fAfterGetDatasetSchema: TDAGetDatasetSchemaEvent;
+ fAfterProcessDeltas: TDAProcessDeltasEvent;
+ fOnGetSchemaAsXML: TDAGetSchemaAsXMLEvent;
+ fOnBusinessProcessorAutoCreated: TDABusinessProcessorAutoCreatedEvent;
+ fOnUpdateDataBeginTransaction: TDAUpdateDataTransactionEvent;
+ fAfterAcquireConnection: TDAConnectionAcquiredEvent;
+ fOnProcessDeltasError: TDAProcessDeltasErrorEvent;
+ fBeforeExecuteCommand: TDABeforeExecuteCommandEvent;
+ fBeforeGetDatasetData: TDAGetDatasetDataEvent;
+ fBeforeReleaseConnection: TDAConnectionAcquiredEvent;
+ fAllowDynamicSelect: boolean;
+ fAllowDynamicWhere: boolean;
+ fAllowUpdates: boolean;
+ fHasReducedDelta: Boolean;
+ fReturnUpdateFailureDelta: boolean;
+
+ procedure SetServiceDataStreamer(const Value: TDADataStreamer);
+ procedure SetServiceSchema(const Value: TDASchema);
+ procedure SetExportedDataTables(const Value: TDADataTableReferenceCollection);
+ procedure Check(CheckOnlyDataStreamer:Boolean = false);
+ procedure Check2;
+ procedure InternalStartTransaction;
+ private
+ function GetConnection: IDAConnection;
+ function ReadDeltaFromStream(const DeltaStream: Binary):IDeltaArray;
+ function PackDeltas(aDeltaList: IDeltaArray): Binary;
+ function UnpackDeltas(aDeltaList: IDeltaArray; DeltaStructList: TDADeltaStructList): TDADeltasModes;
+ function TriggerTransactionEvent(aEvent: TDAUpdateDataTransactionEvent): boolean;
+ procedure ExportedDataTables_MergeDelta(ADelta: IDADelta);
+ procedure InternalGetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray; aStreamer: TDADataStreamer);
+ function InternalGetSchema(const aFilter: Utf8String): Utf8String;
+ procedure InternalUpdateData(aDeltaList: IDeltaArray);
+ function InternalExecuteCommandEx(const aCommandName: String; const aInputParameters: DataParameterArray; out aOutputParameters: DataParameterArray):integer;
+ protected
+ { IDataAbstractService methods }
+ function GetSchema(const aFilter: Utf8String): Utf8String;
+ function GetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray): Binary;
+ function UpdateData(const aDelta: Binary): Binary;
+ function ExecuteCommand(const aCommandName: Utf8String; const aParameterArray: DataParameterArray): Integer;
+ function GetTableSchema(const aTableNameArray: StringArray): Utf8String;
+ function GetCommandSchema(const aCommandNameArray: StringArray): Utf8String;
+ function SQLGetData(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer): Binary;
+ function SQLGetDataEx(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer; const aDynamicWhereXML: Widestring): Binary;
+ function SQLExecuteCommand(const aSQLText: Utf8String): Integer;
+ function SQLExecuteCommandEx(const aSQLText: Utf8String; const aDynamicWhereXML: Widestring): Integer;
+ function ExecuteCommandEx(const aCommandName: Utf8String;
+ const aInputParameters: DataParameterArray;
+ out aOutputParameters: DataParameterArray): Integer;
+ function GetDatasetScripts(const DatasetNames: Utf8String): Utf8String;
+ procedure RegisterForDataChangeNotification(const aTableName: Utf8String);
+ procedure UnregisterForDataChangeNotification(const aTableName: Utf8String);
+ { IDataAbstractLocalServiceAccess }
+ function IDataAbstractLocalServiceAccess.GetSchema = InternalGetSchema;
+ procedure IDataAbstractLocalServiceAccess.UpdateData = InternalUpdateData;
+ procedure IDataAbstractLocalServiceAccess.GetData = InternalGetData;
+ function IDataAbstractLocalServiceAccess.GetDatasetScripts = GetDatasetScripts;
+ function IDataAbstractLocalServiceAccess.ExecuteCommandEx = InternalExecuteCommandEx;
+
+ { TRORemoteDataModule }
+ procedure DoOnDeactivate(aClientID: TGUID); override;
+
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+
+ function GetConnectionForObject(const aName: string): IDAConnection; virtual;
+ public
+ constructor Create(aOwner : TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure SetConnection(aConnection: IDAConnection); deprecated;
+ {$WARN SYMBOL_DEPRECATED OFF}
+ property Connection: IDAConnection read GetConnection write SetConnection;
+ {$WARN SYMBOL_DEPRECATED ON}
+
+ procedure ReleaseConnection;
+ published
+ property AcquireConnection: boolean read fAcquireConnection write fAcquireConnection default true;
+ property ConnectionName: string read fConnectionName write fConnectionName;
+ property AutoCreateBusinessProcessors : boolean read fAutoCreateBusinessProcessors write fAutoCreateBusinessProcessors default true;
+ property ServiceSchema: TDASchema read fServiceSchema write SetServiceSchema;
+ property ServiceDataStreamer: TDADataStreamer read fServiceDataStreamer write SetServiceDataStreamer;
+
+ property AllowDataAccess: boolean read fAllowDataAccess write fAllowDataAccess default true;
+ property AllowSchemaAccess: boolean read fAllowSchemaAccess write fAllowSchemaAccess default true;
+ property AllowUpdates: boolean read fAllowUpdates write fAllowUpdates default true;
+ property AllowExecuteSQL: boolean read fAllowExecuteSQL write fAllowExecuteSQL default false;
+ property AllowWhereSQL: boolean read fAllowWhereSQL write fAllowWhereSQL default false;
+ property AllowExecuteCommands: boolean read fAllowExecuteCommands write fAllowExecuteCommands default false;
+ property AllowDynamicSelect: boolean read fAllowDynamicSelect write fAllowDynamicSelect default true;
+ property AllowDynamicWhere: boolean read fAllowDynamicWhere write fAllowDynamicWhere default true;
+
+ property ProcessDeltasWithoutUpdateRules: boolean read fProcessDeltasWithoutUpdateRules write fProcessDeltasWithoutUpdateRules default true;
+ property ExportedDataTables: TDADataTableReferenceCollection read fExportedDataTables write SetExportedDataTables;
+ property ReturnUpdateFailureDelta: boolean read fReturnUpdateFailureDelta write FReturnUpdateFailureDelta default True;
+
+ { Events }
+ property BeforeAcquireConnection: TDAAcquireConnectionEvent read fBeforeAcquireConnection write fBeforeAcquireConnection;
+ property AfterAcquireConnection: TDAConnectionAcquiredEvent read fAfterAcquireConnection write fAfterAcquireConnection;
+ property BeforeReleaseConnection: TDAConnectionAcquiredEvent read fBeforeReleaseConnection write fBeforeReleaseConnection;
+ property AfterReleaseConnection: TDAConnectionReleasedEvent read fAfterReleaseConnection write fAfterReleaseConnection;
+ property OnAcquireConnectionFailure: TDAAcquireConnectionFailureEvent read fOnAcquireConnectionFailure write fOnAcquireConnectionFailure;
+
+ property BeforeProcessDeltas : TDAProcessDeltasEvent read fBeforeProcessDeltas write fBeforeProcessDeltas;
+ property AfterProcessDeltas: TDAProcessDeltasEvent read fAfterProcessDeltas write fAfterProcessDeltas;
+ property OnProcessDeltasError: TDAProcessDeltasErrorEvent read fOnProcessDeltasError write fOnProcessDeltasError;
+
+ property BeforeGetDatasetSchema: TDAGetDatasetSchemaEvent read fBeforeGetDatasetSchema write fBeforeGetDatasetSchema;
+ property BeforeGetDatasetData: TDAGetDatasetDataEvent read fBeforeGetDatasetData write fBeforeGetDatasetData;
+ property AfterGetDatasetSchema: TDAGetDatasetSchemaEvent read fAfterGetDatasetSchema write fAfterGetDatasetSchema;
+ property AfterGetDatasetData: TDAGetDatasetDataEvent read fAfterGetDatasetData write fAfterGetDatasetData;
+ property OnBusinessProcessorAutoCreated: TDABusinessProcessorAutoCreatedEvent read fOnBusinessProcessorAutoCreated write fOnBusinessProcessorAutoCreated;
+ property BeforeExecuteCommand: TDABeforeExecuteCommandEvent read fBeforeExecuteCommand write fBeforeExecuteCommand;
+ property AfterExecuteCommand: TDAAfterExecuteCommandEvent read fAfterExecuteCommand write fAfterExecuteCommand;
+ property OnGetSchemaAsXMLEvent: TDAGetSchemaAsXMLEvent read fOnGetSchemaAsXML write fOnGetSchemaAsXML;
+ property ValidateDatasetAccess: TDASchemaElementAccessValidationEvent read fGetDatasetDataValidation write fGetDatasetDataValidation;
+ property ValidateCommandExecution: TDASchemaElementAccessValidationEvent read fExecuteCommandValidation write fExecuteCommandValidation;
+ property ValidateDirectSQLAccess: TDASQLValidationEvent read fSQLValidation write fSQLValidation;
+
+ property OnUpdateDataBeginTransaction : TDAUpdateDataTransactionEvent read fOnUpdateDataBeginTransaction write fOnUpdateDataBeginTransaction;
+ property OnUpdateDataCommitTransaction : TDAUpdateDataTransactionEvent read fOnUpdateDataCommitTransaction write fOnUpdateDataCommitTransaction;
+ property OnUpdateDataRollBackTransaction : TDAUpdateDataTransactionEvent read fOnUpdateDataRollBackTransaction write fOnUpdateDataRollBackTransaction;
+ end;
+
+implementation
+
+uses
+ Contnrs, Variants,
+ uDARes, uDAExceptions, uDAXMLUtils, uROXMLIntf,
+ TypInfo, uDAEngine, uDAWhere;
+
+procedure CheckUTF8Decode(const aOriginalStr: Utf8String; aDecodedStr: string);
+begin
+ if (aDecodedStr = '') and (aOriginalStr <> '') then raise Exception.CreateFmt(err_UTF8DecodeError, [aOriginalStr]);
+end;
+{ DataAbstractService }
+
+procedure TDataAbstractService.Check2;
+begin
+ if not (Assigned(Connection) or AcquireConnection) then
+ raise EROException.Create('AcquireConnection is not set and there is no connection available');
+ if not Assigned(ServiceSchema) then
+ raise Exception.Create('ServiceSchema property is not assigned.');
+end;
+
+constructor TDataAbstractService.Create(aOwner : TComponent);
+begin
+ fAllowDataAccess := true;
+ fAllowSchemaAccess := true;
+ fAllowDynamicSelect := true;
+ fAllowDynamicWhere := true;
+ fAllowUpdates := true;
+ fAutoCreateBusinessProcessors := true;
+ fProcessDeltasWithoutUpdateRules := true;
+ fAcquireConnection := true;
+ fExportedDataTables := TDADataTableReferenceCollection.Create(Self);
+ fReturnUpdateFailureDelta := True;
+ fHasReducedDelta := False;
+ inherited;
+end;
+
+destructor TDataAbstractService.Destroy;
+begin
+ ServiceSchema := nil;
+ ServiceDataStreamer := nil;
+ inherited;
+ FreeAndNIL(fExportedDataTables);
+end;
+
+procedure TDataAbstractService.Notification(AComponent: TComponent; Operation: TOperation);
+var
+ lRef: TDADataTableReference;
+begin
+ inherited;
+
+ if (Operation = opRemove) then begin
+
+ if ((AComponent is TDADataTable) or (AComponent is TDataSet)) and (fExportedDataTables.Count > 0) then begin
+ lRef := fExportedDataTables.FindByDataTable(TDADataTable(aComponent));
+ if (lRef<>NIL) then lRef.DataTable := NIL;
+ end else if (AComponent = ServiceSchema) then
+ ServiceSchema := nil
+ else if (AComponent = ServiceDataStreamer) then
+ ServiceDataStreamer := nil;
+ end
+
+end;
+
+function TDataAbstractService.PackDeltas(aDeltaList: IDeltaArray): Binary;
+var
+ oldDeltaMode: Boolean;
+ i: integer;
+begin
+ Result := Binary.Create;
+ Result.CapacityIncrement := ServiceDataStreamer.BufferSize;
+ oldDeltaMode:=ServiceDataStreamer.SendReducedDelta;
+ ServiceDataStreamer.Initialize(result, aiWrite);
+ try
+ if fHasReducedDelta then ServiceDataStreamer.SendReducedDelta:=True;
+ for i := 0 to Length(aDeltaList)-1 do
+ ServiceDataStreamer.WriteDelta(aDeltaList[i]);
+ finally
+ ServiceDataStreamer.Finalize;
+ ServiceDataStreamer.SendReducedDelta:=oldDeltaMode;
+ end;
+end;
+
+function TDataAbstractService.TriggerTransactionEvent(aEvent: TDAUpdateDataTransactionEvent): boolean;
+begin
+ result := true;
+ if assigned(aEvent) then aEvent(self, result);
+end;
+
+{ IDataAbstractService: Schema Access }
+
+function TDataAbstractService.InternalGetSchema(const aFilter: Utf8String): Utf8String;
+var
+ xml: TStringStream;
+ dummyrefs: TObjectList;
+ tempSchema: TDASchema;
+
+ procedure MergeDatatablesToSchema(aList: TObjectList);
+ var i : integer;
+ ref : TDADataset;
+ dt : IDADataset;
+ begin
+ for i := 0 to fExportedDataTables.Count-1 do
+ if fExportedDataTables[i].IsValidReference then begin
+ dt := fExportedDataTables[i].Dataset;
+
+ ref := tempSchema.Datasets.Add;
+ ref.Name := dt.LogicalName;
+ ref.Fields.AssignFieldCollection(dt.Fields);
+ ref.Params.AssignParamCollection(dt.Params);
+
+ aList.Add(ref);
+ end;
+ end;
+
+begin
+ tempSchema := ServiceSchema;
+ if not Assigned(tempSchema) and (fExportedDataTables.Count<>0) then
+ tempSchema := TDASchema.Create(nil);
+
+ if not Assigned(tempSchema) then
+ raise Exception.Create('ServiceSchema property is not assigned and no data tables are exported.');
+
+ dummyrefs := nil;
+ try
+ // New: merges the data tables references by the service
+ if (fExportedDataTables.Count>0) then begin
+ dummyrefs := TObjectList.Create(true);;
+ MergeDatatablesToSchema(dummyrefs);
+ end;
+
+ // Returns the schema
+ xml := TStringStream.Create('');
+ try
+ tempSchema.SaveToStream(xml);
+
+ result := UTF8Encode(xml.DataString);
+
+ if Assigned(fOnGetSchemaAsXML) then fOnGetSchemaAsXML(Self, result);
+ finally
+ xml.Free;
+ end;
+
+ finally
+ FreeAndNil(dummyrefs); // automatically removes the datatables from the schema again
+ if tempSchema <> ServiceSchema then tempSchema.Free;
+ end;
+end;
+
+
+procedure TDataAbstractService.InternalStartTransaction;
+begin
+ try
+ Connection.BeginTransaction;
+ except
+ ReleaseConnection;
+ Connection.BeginTransaction;
+ end;
+end;
+
+procedure TDataAbstractService.InternalUpdateData(aDeltaList: IDeltaArray);
+var
+ lProcessedDeltas: TStringList;
+ lDeltaStructs: TDADeltaStructList;
+ lStruct: TDADeltaStruct;
+ lDs: TDADataset;
+ lDoRaise: boolean;
+ i,j: integer;
+ modes: TDADeltasModes;
+ oldDeltaMode: Boolean;
+begin
+ fHasReducedDelta := False;
+
+ lDeltaStructs := TDADeltaStructList.Create;
+ try
+
+ try
+ modes:= UnpackDeltas(aDeltaList, lDeltaStructs);
+ if modes = [] then exit;
+
+ if dumStandard in modes then begin
+ Check;
+ if TriggerTransactionEvent(fOnUpdateDataBeginTransaction) then InternalStartTransaction;
+ end;
+ if Assigned(fBeforeProcessDeltas) then fBeforeProcessDeltas(Self, lDeltaStructs);
+
+ for i := 0 to lDeltaStructs.Count-1 do begin
+ if ServiceSchema <> nil then
+ lDs := ServiceSchema.FindDataset(lDeltaStructs[i].Delta.LogicalName)
+ else
+ lDs := nil;
+ if lDs <> nil then begin
+ if not lDs.IsPublic then
+ raise EDAException.Create(lDs.Name+' is not accessible');
+ if lDs.ReadOnly then
+ raise EDAException.Create(lDs.Name+' is read-only');
+ end;
+ end;
+ if dumExported in modes then
+ // Processes the delta for exported tables (BP=nil)
+ for i := 0 to lDeltaStructs.Count-1 do begin
+ if lDeltaStructs[i].BusinessProcessor = nil then
+ ExportedDataTables_MergeDelta(lDeltaStructs[i].Delta);
+ end;
+ if dumStandard in modes then begin
+ if (ServiceSchema.UpdateRules.Count = 0) and ProcessDeltasWithoutUpdateRules then begin
+
+ // Processes them in order, from first to last delta sent
+ for i := 0 to lDeltaStructs.Count-1 do
+ if lDeltaStructs[i].BusinessProcessor <> nil then begin
+ oldDeltaMode:=lDeltaStructs[i].BusinessProcessor.HasReducedDelta;
+ try
+ lDeltaStructs[i].BusinessProcessor.HasReducedDelta:=fHasReducedDelta;
+ // TODO: Handle GetConnectionForObject() for 'Rosetta', UNIONS and JOINS
+ lDeltaStructs[i].BusinessProcessor.ProcessDelta(GetConnectionForObject(lDeltaStructs[i].BusinessProcessor.ReferencedDataset), lDeltaStructs[i].Delta, AllChanges, lDeltaStructs[i]);
+ finally
+ lDeltaStructs[i].BusinessProcessor.HasReducedDelta:=oldDeltaMode;
+ end;
+
+ with lDeltaStructs[i] do
+ for j := 0 to (DetailDeltas.Count-1) do
+ BusinessProcessor.SynchronizeAutoIncs(Delta, DetailDeltas[j], RelationShips[j]);
+ end;
+ end
+ else begin
+ lProcessedDeltas := TStringList.Create;
+ try
+
+ for i := 0 to (ServiceSchema.UpdateRules.Count-1) do begin
+ // Processes them in the order defined in the schema
+ lStruct := lDeltaStructs.FindStruct(ServiceSchema.UpdateRules[i].DatasetName);
+ if assigned(lStruct) then begin
+ if lStruct.BusinessProcessor = nil then Continue;
+ // Adds the dataset name to the list of processed deltas. Those that don't have update rules will be processed later
+ lProcessedDeltas.Add(lStruct.Delta.LogicalName);
+
+ // Processes the delta
+ oldDeltaMode:=lStruct.BusinessProcessor.HasReducedDelta;
+ try
+ lStruct.BusinessProcessor.HasReducedDelta:=fHasReducedDelta;
+ // TODO: Handle GetConnectionForObject() for 'Rosetta', UNIONS and JOINS
+ lStruct.BusinessProcessor.ProcessDelta(GetConnectionForObject(lStruct.BusinessProcessor.ReferencedDataset), lStruct.Delta, ServiceSchema.UpdateRules[i].ChangeTypes,lStruct);
+ finally
+ lStruct.BusinessProcessor.HasReducedDelta:=oldDeltaMode;
+ end;
+
+ if (ctInsert in ServiceSchema.UpdateRules[i].ChangeTypes) then begin
+ for j := 0 to (lStruct.DetailDeltas.Count-1) do
+ lStruct.BusinessProcessor.SynchronizeAutoIncs(lStruct.Delta, lStruct.DetailDeltas[j], lStruct.RelationShips[j]);
+ end;
+ end;
+ end;
+
+ // Processes the deltas for which update rules were not defined
+ if (ProcessDeltasWithoutUpdateRules) then begin
+ for i := 0 to lDeltaStructs.Count-1 do begin
+ // Skips if already processed
+ if (lProcessedDeltas.IndexOf(lDeltaStructs[i].Delta.LogicalName)>=0) then Continue;
+
+ if lDeltaStructs[i].BusinessProcessor <> nil then begin
+ oldDeltaMode:=lDeltaStructs[i].BusinessProcessor.HasReducedDelta;
+ try
+ lDeltaStructs[i].BusinessProcessor.HasReducedDelta:=fHasReducedDelta;
+ lDeltaStructs[i].BusinessProcessor.ProcessDelta(GetConnectionForObject(lDeltaStructs[i].BusinessProcessor.ReferencedDataset), lDeltaStructs[i].Delta, AllChanges,lDeltaStructs[i]);
+ finally
+ lDeltaStructs[i].BusinessProcessor.HasReducedDelta:=oldDeltaMode;
+ end;
+
+ with lDeltaStructs[i] do
+ for j := 0 to (DetailDeltas.Count-1) do
+ BusinessProcessor.SynchronizeAutoIncs(Delta, DetailDeltas[j], RelationShips[j]);
+ end;
+ end;
+ end;
+
+ finally
+ lProcessedDeltas.Free;
+ end;
+ end;
+ end;
+
+ if Assigned(fAfterProcessDeltas) then fAfterProcessDeltas(Self, lDeltaStructs);
+
+ if dumStandard in modes then
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataCommitTransaction) then Connection.CommitTransaction;
+
+ // Check for unhandled changes
+ for i := 0 to lDeltaStructs.Count-1 do begin
+ for j := 0 to lDeltaStructs[i].Delta.Count -1 do begin
+ if lDeltaStructs[i].Delta[j].Status = csPending then begin
+ lDeltaStructs[i].Delta[j].Status := csFailed;
+ lDeltaStructs[i].Delta[j].Message := 'Change was not processed';
+ end;
+ end;
+ end;
+ except
+ on E:Exception do begin
+ lDoRaise := true;
+ try
+ if Assigned(fOnProcessDeltasError) then fOnProcessDeltasError(Self, lDeltaStructs, E, lDoRaise);
+ finally
+ if dumStandard in modes then
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataRollBackTransaction) then Connection.RollbackTransaction;
+ end;
+ if lDoRaise then raise;
+ end;
+ end;
+ finally
+ lDeltaStructs.Free;
+ end;
+end;
+
+function TDataAbstractService.GetTableSchema(const aTableNameArray: StringArray): Utf8String;
+
+ function CreateDatasetFromIDADataset(aRef: IDADataset): TDADataset;
+ begin
+ Result := TDADataset.Create(nil);
+ Result.Name := aRef.LogicalName;
+ Result.Fields.AssignFieldCollection(aRef.Fields);
+ Result.Params.AssignParamCollection(aRef.Params);
+ end;
+
+var
+ lxml: IXMLDocument;
+ i: integer;
+ lDataSet: TDADataset;
+ lDataTableRef: TDADataTableReference;
+ lNeedDeleteDataset: Boolean;
+ lTableName: string;
+begin
+ if not AllowSchemaAccess then
+ raise Exception.Create('Schema access has been disabled (GetTableSchema)');
+
+ if not Assigned(ServiceSchema) and (fExportedDataTables.Count=0) then
+ raise Exception.Create('ServiceSchema property is not assigned and no data tables are exported.');
+
+ // Returns the schema
+ lxml := NewROXmlDocument;
+ lxml.New('DataTables');
+ try
+ for i := 0 to aTableNameArray.Count - 1 do begin
+ lTableName := UTF8ToString(aTableNameArray[i]);
+ CheckUTF8Decode(aTableNameArray[i], lTableName);
+ lDataSet := nil;
+ if (fExportedDataTables.Count > 0) then begin
+ lDataTableRef := fExportedDataTables.FindByName(lTableName);
+ if lDataTableRef <> nil then lDataSet := CreateDatasetFromIDADataset(lDataTableRef.Dataset);
+ end;
+ lNeedDeleteDataset := lDataSet <> nil;
+ if not lNeedDeleteDataset and (ServiceSchema <> nil) then
+ lDataSet := ServiceSchema.Datasets.DatasetByName(lTableName);
+ try
+ if lDataSet <> nil then begin
+ // if Assigned(fBeforeGetDatasetSchema) then fBeforeGetDatasetSchema(Self, lDataset as IDADataset);
+ SaveObjectToXMLNode(lDataSet, lxml.DocumentNode.Add('SchemaDataTable'), [], [], False);
+ //if Assigned(FAfterGetDatasetSchema) then FAfterGetDatasetSchema(Self, lDataset as IDADataset);
+ if not (lDataSet.IsPublic) then
+ raise EDAException.Create(lDataset.Name +' is not accessible');
+ end;
+ finally
+ if lNeedDeleteDataset then lDataSet.Free;
+ end;
+ end;
+ Result := UTF8Encode(lxml.DocumentNode.XML);
+ finally
+ lxml := nil;
+ end;
+end;
+
+function TDataAbstractService.InternalExecuteCommandEx(const aCommandName: String;
+ const aInputParameters: DataParameterArray; out aOutputParameters: DataParameterArray):integer;
+var
+ j: integer;
+ lParamNames: array of string;
+ lParamValues: array of Variant;
+ lAllow: boolean;
+ lCommand: IDASQLCommand;
+ lCommandSchema: TDASQLCommand;
+ lConnection: IDAConnection;
+begin
+ SetLength(lParamNames, aInputParameters.Count);
+ SetLength(lParamValues, aInputParameters.Count);
+ for j := 0 to (aInputParameters.Count-1) do begin
+ lParamNames[j] := UTF8ToString(aInputParameters[j].Name);
+ CheckUTF8Decode(aInputParameters[j].Name,lParamNames[j]);
+ lParamValues[j] := aInputParameters[j].Value;
+ end;
+
+ lCommandSchema := ServiceSchema.Commands.SQLCommandByName(aCommandName);
+ if assigned(lCommandSchema) and not (lCommandSchema.IsPublic) then
+ raise EDAException.Create(lCommandSchema.Name +' is not accessible');
+
+ lAllow := true;
+ lConnection := GetConnectionForObject(aCommandName);
+ if assigned(fExecuteCommandValidation) then fExecuteCommandValidation(self, lConnection, aCommandName, lParamNames, lParamValues, ServiceSchema, lAllow);
+ if not lAllow then raise EDADatasetNotAccessible.CreateFmt(err_CommandNotAccessible, [aCommandName]);
+
+ if TriggerTransactionEvent(fOnUpdateDataBeginTransaction) then begin
+ try
+ lConnection.BeginTransaction;
+ except
+ ReleaseConnection;
+ lConnection := GetConnectionForObject(aCommandName);
+ lConnection.BeginTransaction;
+ end;
+ end;
+ try
+
+ lCommand := ServiceSchema.NewCommand(lConnection, aCommandName, lParamNames, lParamValues, false);
+ if Assigned(fBeforeExecutecommand) then fBeforeExecuteCommand(self, lCommand);
+ result := lCommand.Execute;
+ if assigned(fAfterExecutecommand) then fAfterExecuteCommand(self, lCommand, Result);
+
+ aOutputParameters := DataParameterArray.Create;
+ for j := 0 to lCommand.Params.Count -1 do begin
+ if (lCommand.Params[j].ParamType <> daptUnknown) and (lCommand.Params[j].ParamType <> daptInput) then begin
+ with aOutputParameters.Add do begin
+ Name := AnsiToUtf8(lCommand.Params[j].Name);
+ Value := lCommand.Params[j].Value;
+ end;
+ end;
+ end;
+ if lConnection.InTransaction and TriggerTransactionEvent(fOnUpdateDataCommitTransaction) then lConnection.CommitTransaction;
+ except
+ if lConnection.InTransaction and TriggerTransactionEvent(fOnUpdateDataRollBackTransaction) then lConnection.RollbackTransaction;
+ raise;
+ end;
+end;
+
+procedure TDataAbstractService.InternalGetData(
+ const aTableNameArray: StringArray;
+ const aTableRequestInfoArray: TableRequestInfoArray;
+ aStreamer: TDADataStreamer);
+var
+ i, j, x, n,k: integer;
+ lParamNames: array of string;
+ lParamValues: array of Variant;
+ lOptions: TDAWriteOptions;
+ lAllow: boolean;
+ lDataSet: IDADataSet;
+ lEditableDataset: IDAEditableDataset;
+ lHasTransaction: boolean;
+ lMaxRecords: integer;
+ lDataTableRef: TDADataTableReference;
+ lDynSelectFields: array of string;
+ lDynSelectFields2: array of string;
+ lWhereClause, lProcessedWhereClause: UnicodeString;
+ // lConnection: IDAConnection;
+ lTableName: String;
+ lDataTable: TDADataset;
+ lUnionTable: TDAUnionDataTable;
+ lAppendData: TDADataForAppend;
+ lMapping: TDAColumnMappingCollection;
+ lFilter: string;
+begin
+ if not assigned(aTableNameArray) or (aTableNameArray.Count = 0) then exit;
+
+ if assigned(aTableRequestInfoArray) and (aTableNameArray.Count <> aTableRequestInfoArray.Count) then
+ raise Exception.Create('Number of items passed to aTableNameArray and aTableRequestInfoArray do not match.');
+
+ lHasTransaction := false;
+ try
+
+ for i := 0 to (aTableNameArray.Count-1) do begin
+
+ lTableName := UTF8ToString(aTableNameArray[i]);
+ CheckUTF8Decode(aTableNameArray[i], lTableName);
+ if ServiceSchema <> nil then lDataTable := ServiceSchema.FindDataset(lTableName) else lDataTable:=nil;
+ lOptions := [woRows];
+ lMaxRecords := -1;
+ SetLength(lDynSelectFields,0);
+ lWhereClause := '';
+
+ if assigned(aTableRequestInfoArray) and assigned(aTableRequestInfoArray[i]) then with aTableRequestInfoArray[i] do begin
+ SetLength(lParamNames, Parameters.Count);
+ SetLength(lParamValues, Parameters.Count);
+ for j := 0 to (Parameters.Count-1) do begin
+ lParamNames[j] := UTF8ToString(Parameters[j].Name);
+ CheckUTF8Decode(Parameters[j].Name, lParamNames[j]);
+ lParamValues[j] := Parameters[j].Value;
+ end;
+
+ if IncludeSchema then lOptions := lOptions+[woSchema];
+ lMaxRecords := MaxRecords;
+
+ // v5 TableRequestInfo
+ if aTableRequestInfoArray[i] is TableRequestInfoV5 then
+ with TableRequestInfoV5(aTableRequestInfoArray[i]) do begin
+ if assigned(DynamicSelectFieldNames) then begin
+ if AllowDynamicSelect then begin
+ SetLength(lDynSelectFields,DynamicSelectFieldNames.Count);
+ for j := 0 to DynamicSelectFieldNames.Count-1 do begin
+ CheckUTF8Decode(DynamicSelectFieldNames[j], UTF8ToString(DynamicSelectFieldNames[j]));
+ lDynSelectFields[j] := Trim(UTF8ToString(DynamicSelectFieldNames[j]));
+ end;
+ if DynamicSelectFieldNames.Count > 0 then lOptions := lOptions+[woSchema];
+ end else begin
+ raise EDAException.Create('DynamicSelect support has been disabled (GetData)');
+ end;
+ end;
+ if assigned(TableRequestInfoV5(aTableRequestInfoArray[i]).WhereClause) then begin
+ if AllowDynamicWhere then
+ lWhereClause := WhereClause.XML
+ else
+ raise EDAException.Create('DynamicWhere support has been disabled (GetData)');
+ end;
+ end;
+ end;
+
+ if (fExportedDataTables.Count > 0) and Assigned(fExportedDataTables.FindByName(lTableName)) then begin
+ // lConnection := nil;
+ end
+ else begin
+ Check2;
+ //lConnection := GetConnectionForObject(aTableNameArray[i]);
+ end;
+
+ lAllow := true;
+ if assigned(fGetDatasetDataValidation) then fGetDatasetDataValidation(self, {l}Connection, lTableName, lParamNames, lParamValues, ServiceSchema, lAllow);
+ if not lAllow then raise EDADatasetNotAccessible.CreateFmt(err_DatasetNotAccessible, [lTableName]);
+
+ lDataSet := nil;
+ if (fExportedDataTables.Count > 0) then begin
+ lDataTableRef := fExportedDataTables.FindByName(lTableName);
+ if assigned(lDataTableRef) then lDataSet := lDataTableRef.Dataset;
+ end;
+
+ if not assigned(lDataSet) then begin
+
+ // Create transaction, if needed
+ if not lHasTransaction then begin
+ if TriggerTransactionEvent(fOnUpdateDataBeginTransaction) then begin
+ InternalStartTransaction;
+ lHasTransaction := true;
+ end;
+ end;
+
+ lDataTable := ServiceSchema.FindDataset(lTableName);
+
+ { Unions }
+ if lDataTable is TDAUnionDataTable then begin
+
+ if (aTableRequestInfoArray <> nil) then begin
+ lFilter:=UTF8ToString(aTableRequestInfoArray[i].UserFilter);
+ CheckUTF8Decode(aTableRequestInfoArray[i].UserFilter,lFilter);
+ if (Trim(lFilter)<>'') then
+ raise EDAException.Create('Passing of clear text WHERE clauses is not supported for UNIONS (GetData)');
+ end;
+ lUnionTable := lDataTable as TDAUnionDataTable;
+ lAppendData := aStreamer.BeginWriteDataset({Source}nil, {Schema}lDataTable, lOptions, lMaxRecords, lDynSelectFields);
+ if not (woRows in lOptions) then Continue;
+
+ for x := 0 to lUnionTable.SourceTables.Count - 1 do begin
+ lTableName := lUnionTable.SourceTables[x].Name;
+
+ // Check is source table exists in schema.
+ if (not Assigned(ServiceSchema.FindDataset(lTableName))) then
+ raise EDAException.CreateFmt('Source table %s doesn''t exist in schema.', [lTableName]);
+
+ // Do column remapping for DynFields names
+ lMapping := lUnionTable.SourceTables[x].ColumnMappings;
+ SetLength(lDynSelectFields2, Length(lDynSelectFields));
+ for n := Low(lDynSelectFields) to High(lDynSelectFields) do begin
+ if (lDynSelectFields[n]) = def_SourceTableFieldName then
+ lDynSelectFields2[n] := lDynSelectFields[n]
+ else
+ lDynSelectFields2[n] := lMapping.MappingByDatasetField(lDynSelectFields[n]).TableField;
+ end;
+
+ // try to predict do we need dynamic where on this source table or not.
+ lProcessedWhereClause := lWhereClause;
+ if not ProcessDAWhereForUnions(x, lProcessedWhereClause) then Continue;
+
+ // remap Union name to UnionItem.Name
+ lProcessedWhereClause := Where_RemapTableNamesForUnions(lProcessedWhereClause,lTableName,lTableName);
+
+ lDataSet := ServiceSchema.NewUnionItemDataset(
+ GetConnectionForObject(lTableName),
+ lTableName,
+ lParamNames,
+ lParamValues,
+ lDynSelectFields2,
+ lProcessedWhereClause,
+ lMapping
+ );
+
+ aStreamer.WriteDatasetData(lDataSet, lAppendData, x);
+ // Keeping track of maxrecords
+ if ((lMaxRecords <> -1) and (lAppendData.RecordCount >= lMaxRecords)) then Break;
+ end;
+ aStreamer.EndWriteDataset(lAppendData);
+ end
+ { Joins }
+ else if lDataTable is TDAJoinDataTable then begin
+ raise EDAException.Create('TODO: Joined Data Tables are not implemented in this release, yet.');
+ end
+ { Plain Data Tables }
+ else begin
+
+ lDataSet := ServiceSchema.NewDataset(GetConnectionForObject(lTableName), lTableName, lParamNames, lParamValues, lDynSelectFields, lWhereClause, False);
+
+ if (woSchema in lOptions) and Assigned(fBeforeGetDatasetSchema) then fBeforeGetDatasetSchema(self, lDataset);
+ if (woRows in lOptions) and Assigned(fBeforeGetDatasetData) then fBeforeGetDatasetData(self, lDataset, (woSchema in lOptions), lMaxRecords);
+
+ if (aTableRequestInfoArray <> nil) then begin
+ lFilter:=UTF8ToString(aTableRequestInfoArray[i].UserFilter);
+ CheckUTF8Decode(aTableRequestInfoArray[i].UserFilter,lFilter);
+ if (Trim(lFilter)<>'') then begin
+ if not AllowWhereSQL then raise Exception.Create('Passing of clear text WHERE clauses has been disabled (GetData)');
+ lDataSet.Where.AddText(lFilter);
+ for k := 0 to High(lParamValues) do
+ lDataSet.ParamByName(lParamNames[k]).Value := lParamValues[k];
+ end;
+ end;
+ lDataSet.Open;
+
+ aStreamer.WriteDataset(lDataset, lOptions, lMaxRecords,lDynSelectFields);
+
+ if (woRows in lOptions) and Assigned(fAfterGetDatasetData) then fAfterGetDatasetData(self, lDataset, (woSchema in lOptions), lMaxRecords);
+ if (woSchema in lOptions) and Assigned(fAfterGetDatasetSchema) then fAfterGetDatasetSchema(self, lDataset);
+
+ end;
+
+ end
+ { ExportedDataTables }
+ else begin
+ lFilter:=UTF8ToString(aTableRequestInfoArray[i].UserFilter);
+ CheckUTF8Decode(aTableRequestInfoArray[i].UserFilter,lFilter);
+ if (Trim(lFilter)<>'') then
+ raise EDAException.Create('WHERE clauses are not supported on data from ExportedDataTables.');
+
+ if (woSchema in lOptions) and Assigned(fBeforeGetDatasetSchema) then fBeforeGetDatasetSchema(self, lDataset);
+ if (woRows in lOptions) and Assigned(fBeforeGetDatasetData) then fBeforeGetDatasetData(self, lDataset, (woSchema in lOptions), lMaxRecords);
+
+ if lDataSet.Active and (lMaxRecords = -1) then begin
+ if lDataSet.QueryInterface(IDAEditableDataset,lEditableDataset) = s_ok then
+ lEditableDataset.First
+ else
+ lDataSet.Close;
+ end;
+
+ if not lDataSet.Active then lDataSet.Open;
+ aStreamer.WriteDataset(lDataset, lOptions, lMaxRecords,lDynSelectFields);
+
+ if (woRows in lOptions) and Assigned(fAfterGetDatasetData) then fAfterGetDatasetData(self, lDataset, (woSchema in lOptions), lMaxRecords);
+ if (woSchema in lOptions) and Assigned(fAfterGetDatasetSchema) then fAfterGetDatasetSchema(self, lDataset);
+ end;
+
+ if assigned(lDataTable) and not (lDataTable.IsPublic) then
+ raise EDAException.Create(lDataTable.Name +' is not accessible');
+
+ lDataSet := nil;
+ end; { for }
+
+
+ if lHasTransaction and Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataCommitTransaction) then Connection.CommitTransaction;
+ except
+ if lHasTransaction and Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataRollBackTransaction) then Connection.RollbackTransaction;
+ raise;
+ end;
+end;
+
+function TDataAbstractService.GetSchema(const aFilter: Utf8String): Utf8String;
+begin
+ if not AllowSchemaAccess then
+ raise Exception.Create('Schema access has been disabled (GetSchema)');
+
+ Result := InternalGetSchema(aFilter);
+end;
+
+function TDataAbstractService.GetCommandSchema(const aCommandNameArray: StringArray): Utf8String;
+var
+ lxml: IXMLDocument;
+ i: integer;
+ lSQLCommand: TDASQLCommand;
+ lCommand: string;
+begin
+ if not AllowSchemaAccess then
+ raise Exception.Create('Schema access has been disabled (GetCommandSchema)');
+
+ if not Assigned(ServiceSchema) then
+ raise Exception.Create('ServiceSchema property is not assigned.');
+
+ // Returns the schema
+ lxml := NewROXmlDocument;
+ lxml.New('Commands');
+ try
+ for i := 0 to aCommandNameArray.Count - 1 do begin
+ lCommand:=UTF8ToString(aCommandNameArray[i]);
+ CheckUTF8Decode(aCommandNameArray[i], lCommand);
+ lSQLCommand:=ServiceSchema.Commands.SQLCommandByName(lCommand);
+ if lSQLCommand <> nil then begin
+ if not lSQLCommand.IsPublic then
+ raise EDAException.Create(lSqlCommand.Name +' is not accessible');
+ SaveObjectToXMLNode(lSQLCommand, lxml.DocumentNode.Add('SchemaCommand'), [], [], False);
+ end;
+ end;
+ result := UTF8Encode(lxml.DocumentNode.XML);
+ finally
+ lxml := nil;
+ end;
+end;
+
+{ IDataAbstractService: Data Access }
+
+function TDataAbstractService.GetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray): Binary;
+begin
+ if not AllowDataAccess then
+ raise Exception.Create('Data access has been disabled (GetData)');
+
+ result := nil;
+ if not assigned(aTableNameArray) or (aTableNameArray.Count = 0) then exit;
+
+ if assigned(aTableRequestInfoArray) and (aTableNameArray.Count <> aTableRequestInfoArray.Count) then
+ raise Exception.Create('Number of items passed to aTableNameArray and aTableRequestInfoArray do not match.');
+
+ Check(True);
+
+ result := Binary.Create;
+ Result.CapacityIncrement := ServiceDataStreamer.BufferSize;
+ try
+ ServiceDataStreamer.Initialize(result, aiWrite);
+ try
+ InternalGetData(aTableNameArray,aTableRequestInfoArray, ServiceDataStreamer);
+ finally
+ ServiceDataStreamer.Finalize();
+ end;
+ except
+ FreeAndNIL(result);
+ raise;
+ end;
+end;
+
+//TODO: needs cleaning!
+function TDataAbstractService.UnpackDeltas(aDeltaList: IDeltaArray; DeltaStructList: TDADeltaStructList): TDADeltasModes;
+var
+ i, j: integer;
+ lDeltaName: string;
+ lBizProc: TDABusinessProcessor;
+ lDetails : TDADatasetRelationshipList;
+ lFound: boolean;
+ lStruct : TDADeltaStruct;
+ ltabRef: TDADataTableReference;
+begin
+ result := [];
+ if (Length(aDeltaList) = 0) then Exit;
+ for i := 0 to Length(aDeltaList) - 1 do begin
+ lDeltaName := aDeltaList[i].LogicalName;
+ if (ExportedDataTables.Count >0) then begin
+ ltabRef := ExportedDataTables.FindByName(lDeltaName);
+ if Assigned(ltabRef) then begin
+ // for ExportedDataTables , BP=nil
+ DeltaStructList.Add(aDeltaList[i], nil);
+ Result:=Result+[dumExported];
+ Continue;
+ end;
+ end;
+ lFound := false;
+ { Tries to locate a user-defined business processor }
+ for j := 0 to (Self.ComponentCount - 1) do begin
+ if (Self.Components[j] is TDABusinessProcessor) then begin
+ lBizProc := TDABusinessProcessor(Self.Components[j]);
+ if SameText(lBizProc.ReferencedDataset, lDeltaName) and (lBizProc.Schema = fServiceSchema) then begin
+ DeltaStructList.Add(aDeltaList[i], lBizProc);
+ if fHasReducedDelta then begin
+ if (lBizProc.InsertCommandName <> '') or
+ (lBizProc.DeleteCommandName <> '') or
+ (lBizProc.UpdateCommandName <> '') or
+ ([poAutoGenerateInsert,poAutoGenerateUpdate,poAutoGenerateDelete]*lBizProc.ProcessorOptions <>[poAutoGenerateInsert,poAutoGenerateUpdate,poAutoGenerateDelete]) then
+ raise Exception.Create('SendReducedDelta option is incompatible with '+lBizProc.Name+' settings');
+ end;
+ lFound := true;
+ Break;
+ end;
+ end;
+ end;
+
+ { Either creates one or aborts raising an exception }
+ if not lFound then begin
+ if not AutoCreateBusinessProcessors then
+ raise Exception.CreateFmt(err_DARDMCannotFindProxessorForDelta, [lDeltaName]);
+
+ //ToDo: this will never get freed, until the DM frees?
+ lBizProc := TDABusinessProcessor.Create(self);
+ lBizProc.ReferencedDataset := lDeltaName;
+ lBizProc.Schema := ServiceSchema;
+ lBizProc.RaiseExceptionAtError := not fReturnUpdateFailureDelta;
+ if Assigned(fOnBusinessProcessorAutoCreated) then fOnBusinessProcessorAutoCreated(Self, lBizProc);
+
+ DeltaStructList.Add(aDeltaList[i], lBizProc);
+ end;
+
+ Result:=Result+[dumStandard];
+ end;
+ fHasReducedDelta := ServiceDataStreamer.HasReducedDelta;
+ if not (dumStandard in Result) then exit; // nothing to process
+ Check;
+ { Sets the master/detail relationships }
+ if (ServiceSchema.RelationShips.Count>0) then begin
+
+ lDetails := TDADatasetRelationshipList.Create;
+ try
+ for i := 0 to DeltaStructList.Count-1 do begin
+ ServiceSchema.RelationShips.GetDetails(DeltaStructList[i].BusinessProcessor.ReferencedDataset, lDetails);
+ if (lDetails.Count=0) then Continue;
+
+ { Prepares an array with the references to the detail deltas that will be used later on to adjust
+ autoincs, etc. }
+ for j := 0 to lDetails.Count-1 do begin
+ lStruct := DeltaStructList.FindStruct(lDetails[j].DetailDatasetName);
+ if assigned(lStruct) then begin
+ DeltaStructList[i].DetailDeltas.Add(lStruct.Delta);
+ DeltaStructList[i].RelationShips.Add(lDetails[j]);
+ end;
+ end;
+ end;
+ finally
+ lDetails.Free;
+ end;
+
+ end;
+end;
+
+function TDataAbstractService.UpdateData(const aDelta: Binary): Binary;
+var
+ aDeltaList: IDeltaArray;
+begin
+ // WARNING: any changes should be duplicated into TDALocalDataAdapter.DoUpdateData
+ if not AllowDataAccess then
+ raise Exception.Create('Data access has been disabled (UpdateData)');
+
+ if not AllowUpdates then
+ raise Exception.Create('Data updates have been disabled (UpdateData)');
+
+ fHasReducedDelta := False;
+ aDeltaList := ReadDeltaFromStream(aDelta);
+ try
+ InternalUpdateData(aDeltaList);
+ result := PackDeltas(aDeltaList);
+ finally
+ SetLength(aDeltaList,0);
+ end;
+end;
+
+function TDataAbstractService.ExecuteCommand(const aCommandName: Utf8String; const aParameterArray: DataParameterArray): Integer;
+var
+ aOutputParameters: DataParameterArray;
+begin
+ Result := ExecuteCommandEx(aCommandName,aParameterArray, aOutputParameters);
+ aOutputParameters.Free;
+end;
+
+{ IDataAbstractService: Direct SQL Access }
+
+function TDataAbstractService.SQLGetDataEx(const aSQLText: Utf8String;
+ const aIncludeSchema: Boolean; const aMaxRecords: Integer;
+ const aDynamicWhereXML: Widestring): Binary;
+var
+ lOptions: TDAWriteOptions;
+ lDataSet: IDADataSet;
+ lAllow: boolean;
+ lSQLText: string;
+begin
+ if not AllowDataAccess then
+ raise Exception.Create('Data access has been disabled (SQLGetData)');
+
+ if not AllowExecuteSQL then
+ raise Exception.Create('Execution of SQL has been disabled (SQLGetData)');
+
+ if assigned(fHETConnection) then
+ raise Exception.Create('Execution of SQL isnot supported for HET Connections');
+
+ result := nil;
+ lSQLText := UTF8ToString(aSQLText);
+ CheckUTF8Decode(aSQLText,lSQLText);
+ if lSQLText = '' then exit;
+
+ Check();
+
+ lAllow := true;
+ if assigned(fSQLValidation) then fSQLValidation(self, Connection, lSQLText, [], [], lAllow);
+ if not lAllow then raise EDADatasetNotAccessible.Create(err_SQLNotPermitted);
+
+ result := Binary.Create;
+ Result.CapacityIncrement := ServiceDataStreamer.BufferSize;
+ try
+ if TriggerTransactionEvent(fOnUpdateDataBeginTransaction) then InternalStartTransaction;
+ try
+ ServiceDataStreamer.Initialize(result, aiWrite);
+ try
+
+ lOptions := [woRows];
+ if aIncludeSchema then lOptions := lOptions+[woSchema];
+
+ lDataSet := Connection.NewDataset(lSQLText,'SQLResult');
+ try
+ if aDynamicWhereXML <> '' then lDataSet.DynamicWhere.Expression := lDataSet.DynamicWhere.XMLToExpression(aDynamicWhereXML);
+ if (woSchema in lOptions) and Assigned(fBeforeGetDatasetSchema) then fBeforeGetDatasetSchema(self, lDataset);
+ if (woRows in lOptions) and Assigned(fBeforeGetDatasetData) then fBeforeGetDatasetData(self, lDataset, (woSchema in lOptions), aMaxRecords);
+
+ lDataSet.Open();
+
+ ServiceDataStreamer.WriteDataset(lDataset, lOptions, aMaxRecords);
+
+ if (woRows in lOptions) and Assigned(fAfterGetDatasetData) then fAfterGetDatasetData(self, lDataset, (woSchema in lOptions), aMaxRecords);
+ if (woSchema in lOptions) and Assigned(fAfterGetDatasetSchema) then fAfterGetDatasetSchema(self, lDataset);
+
+ finally
+ lDataSet := nil;
+ end;
+
+ finally
+ ServiceDataStreamer.Finalize();
+ end;
+
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataCommitTransaction) then Connection.CommitTransaction;
+ except
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataRollBackTransaction) then Connection.RollbackTransaction;
+ raise;
+ end;
+
+ except
+ FreeAndNIL(result);
+ raise;
+ end;
+
+end;
+
+function TDataAbstractService.SQLExecuteCommandEx(const aSQLText: Utf8String; const aDynamicWhereXML: Widestring): Integer;
+var
+ lAllow: boolean;
+ lSQLText: string;
+begin
+ if not AllowDataAccess then
+ raise Exception.Create('Data access has been disabled (SQLExecuteCommand)');
+
+ if not AllowExecuteSQL then
+ raise Exception.Create('Execution of SQL has been disabled (SQLExecuteCommand)');
+
+ if assigned(fHETConnection) then
+ raise Exception.Create('Execution of SQL isnot supported for HET Connections');
+
+ Check();
+ lSQLText := UTF8ToString(aSQLText);
+ CheckUTF8Decode(aSQLText,lSQLText);
+ lAllow := true;
+ if assigned(fSQLValidation) then fSQLValidation(self, Connection, lSQLText, [], [], lAllow);
+ if not lAllow then raise EDADatasetNotAccessible.CreateFmt(err_SQLNotPermitted, []);
+
+ if TriggerTransactionEvent(fOnUpdateDataBeginTransaction) then InternalStartTransaction;
+ try
+ with Connection.NewCommand(lSQLText, stSQL) do begin
+ if aDynamicWhereXML <> '' then DynamicWhere.Expression := DynamicWhere.XMLToExpression(aDynamicWhereXML);
+ result := Execute;
+ end;
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataCommitTransaction) then Connection.CommitTransaction;
+ except
+ if Connection.InTransaction and TriggerTransactionEvent(fOnUpdateDataRollBackTransaction) then Connection.RollbackTransaction;
+ raise;
+ end;
+end;
+
+{ Properties }
+
+procedure TDataAbstractService.SetExportedDataTables(const Value: TDADataTableReferenceCollection);
+begin
+ fExportedDataTables.Assign(Value);
+end;
+
+procedure TDataAbstractService.SetServiceDataStreamer(const Value: TDADataStreamer);
+begin
+ if fServiceDataStreamer <> Value then begin
+ if (fServiceDataStreamer <> nil) then fServiceDataStreamer.RORemoveFreeNotification(Self);
+ fServiceDataStreamer := Value;
+ if (fServiceDataStreamer <> nil) then fServiceDataStreamer.ROFreeNotification(Self);
+ end;
+end;
+
+procedure TDataAbstractService.SetServiceSchema(const Value: TDASchema);
+begin
+ if fServiceSchema <> Value then begin
+ if assigned(fServiceSchema) then fServiceSchema.RORemoveFreeNotification(self);
+ fServiceSchema := Value;
+ if assigned(fServiceSchema) then fServiceSchema.ROFreeNotification(self);
+ end;
+end;
+
+{ Connections }
+
+function TDataAbstractService.GetConnection: IDAConnection;
+var
+ lConnectionName: string;
+begin
+ // WARNING: any changes should be duplicated into TDALocalDataAdapter.GetConnection
+ inherited;
+ result := fConnection;
+ if assigned(fConnection) then exit;
+ if (csDesigning in ComponentState) then exit;
+
+ if AcquireConnection then try
+
+ if (fServiceSchema = nil) or (fServiceSchema.ConnectionManager = nil) then raise Exception.Create(err_DARDMInvalidSchema);
+
+ lConnectionName := ConnectionName;
+ if Assigned(fBeforeAcquireConnection) then fBeforeAcquireConnection(Self, lConnectionName);
+
+ result := ServiceSchema.ConnectionManager.NewConnection(lConnectionName);
+ Connection := result;
+ if Assigned(fAfterAcquireConnection) then fAfterAcquireConnection(Self, lConnectionName, result);
+
+ except
+ on E: Exception do begin
+ if Assigned(fOnAcquireConnectionFailure) then fOnAcquireConnectionFailure(Self, lConnectionName, E);
+ raise;
+ end;
+ end;
+end;
+
+{$WARN SYMBOL_DEPRECATED OFF}
+procedure TDataAbstractService.SetConnection(aConnection: IDAConnection);
+begin
+ // WARNING: any changes should be duplicated into TDALocalDataAdapter.SetConnection
+
+ if fConnection <> aConnection then begin
+ fConnection := aConnection;
+ if not Supports(fConnection, IDAHETConnection, fHETConnection) then fHETConnection := nil;
+ end;
+end;
+{$WARN SYMBOL_DEPRECATED ON}
+
+function TDataAbstractService.GetConnectionForObject(const aName: string): IDAConnection;
+begin
+ // WARNING: any changes should be duplicated into TDALocalDataAdapter.GetConnectionForObject
+
+ result := Connection; // forces acquisition of Connection
+ if assigned(fHETConnection) and (ServiceSchema.UnionDataTables.FindItem(aName) = nil) then
+ result := fHETConnection.GetConnectionForObject(aName)
+end;
+
+procedure TDataAbstractService.DoOnDeactivate(aClientID: TGUID);
+begin
+ inherited;
+ if (csDesigning in ComponentState) then Exit;
+
+ ReleaseConnection();
+end;
+
+procedure TDataAbstractService.ReleaseConnection;
+var
+ lConnectionName: string;
+begin
+ if assigned(fConnection) then begin
+ lConnectionName := fConnection.Name;
+ if Assigned(fBeforeReleaseConnection) then fBeforeReleaseConnection(Self, lConnectionName, fConnection);
+ Connection := nil;
+ if Assigned(fAfterReleaseConnection) then fAfterReleaseConnection(Self, lConnectionName);
+ end;
+end;
+
+procedure TDataAbstractService.Assign(Source: TPersistent);
+var
+ lSource: TDataAbstractService;
+begin
+ inherited;
+ if Source is TDataAbstractService then begin
+ lSource := TDataAbstractService(Source);
+
+ AcquireConnection := lSource.AcquireConnection;
+ AfterAcquireConnection := lSource.AfterAcquireConnection;
+ AfterExecuteCommand := lSource.AfterExecuteCommand;
+ AfterGetDatasetData := lSource.AfterGetDatasetData;
+ AfterGetDatasetSchema := lSource.AfterGetDatasetSchema;
+ AfterProcessDeltas := lSource.AfterProcessDeltas;
+ AfterReleaseConnection := lSource.AfterReleaseConnection;
+ AllowDataAccess := lSource.AllowDataAccess;
+ AllowDynamicSelect := lSource.AllowDynamicSelect;
+ AllowDynamicWhere := lSource.AllowDynamicWhere;
+ AllowExecuteCommands := lSource.AllowExecuteCommands;
+ AllowExecuteSQL := lSource.AllowExecuteSQL;
+ AllowSchemaAccess := lSource.AllowSchemaAccess;
+ AllowUpdates := lSource.AllowUpdates;
+ AllowWhereSQL := lSource.AllowWhereSQL;
+ AutoCreateBusinessProcessors := lSource.AutoCreateBusinessProcessors;
+ BeforeAcquireConnection := lSource.BeforeAcquireConnection;
+ BeforeExecuteCommand := lSource.BeforeExecuteCommand;
+ BeforeGetDatasetData := lSource.BeforeGetDatasetData;
+ BeforeGetDatasetSchema := lSource.BeforeGetDatasetSchema;
+ BeforeProcessDeltas := lSource.BeforeProcessDeltas;
+ BeforeReleaseConnection := lSource.BeforeReleaseConnection;
+ ConnectionName := lSource.ConnectionName;
+ ExportedDataTables := lSource.ExportedDataTables;
+ OnAcquireConnectionFailure := lSource.OnAcquireConnectionFailure;
+ OnBusinessProcessorAutoCreated := lSource.OnBusinessProcessorAutoCreated;
+ OnGetSchemaAsXMLEvent := lSource.OnGetSchemaAsXMLEvent;
+ OnProcessDeltasError := lSource.OnProcessDeltasError;
+ OnUpdateDataBeginTransaction := lSource.OnUpdateDataBeginTransaction;
+ OnUpdateDataCommitTransaction := lSource.OnUpdateDataCommitTransaction;
+ OnUpdateDataRollBackTransaction := lSource.OnUpdateDataRollBackTransaction;
+ ProcessDeltasWithoutUpdateRules := lSource.ProcessDeltasWithoutUpdateRules;
+ ReturnUpdateFailureDelta := lSource.ReturnUpdateFailureDelta;
+ ServiceDataStreamer := lSource.ServiceDataStreamer;
+ ServiceSchema := lSource.ServiceSchema;
+ ValidateCommandExecution := lSource.ValidateCommandExecution;
+ ValidateDatasetAccess := lSource.ValidateDatasetAccess;
+ ValidateDirectSQLAccess := lSource.ValidateDirectSQLAccess;
+ end;
+end;
+
+procedure TDataAbstractService.Check(CheckOnlyDataStreamer:Boolean = false);
+begin
+ if not CheckOnlyDataStreamer then Check2;
+ if not Assigned(ServiceDataStreamer) then
+ raise EROException.Create('DataStreamer must be assigned.');
+end;
+
+function TDataAbstractService.ExecuteCommandEx(const aCommandName: Utf8String;
+ const aInputParameters: DataParameterArray;
+ out aOutputParameters: DataParameterArray): Integer;
+var
+ lCommandName: string;
+begin
+ if not AllowDataAccess then
+ raise Exception.Create('Data access has been disabled (ExecuteCommand)');
+
+ if not AllowExecuteCommands then
+ raise Exception.Create('Execution of commands has been disabled (ExecuteCommand)');
+
+ lCommandName:= UTF8ToString(aCommandName);
+ CheckUTF8Decode(aCommandName,lCommandName);
+ Result := InternalExecuteCommandEx(lCommandName,aInputParameters,aOutputParameters);
+end;
+
+type
+ TMyDatasetCollection = class(TDADatasetCollection)
+ end;
+
+function TDataAbstractService.GetDatasetScripts(const DatasetNames: Utf8String): Utf8String;
+var names : TStringList;
+ i : integer;
+ ds : TDADataset;
+ lResult: UnicodeString;
+ lLogicalName: string;
+begin
+ lresult := '';
+ names := TStringList.Create;
+ try
+ names.CommaText := UTF8ToString(DatasetNames);
+ CheckUTF8Decode(DatasetNames,names.CommaText);
+ for i := 0 to (names.Count-1) do begin
+ // scripts for externaltables is not allowed
+ lLogicalName := names[i];
+ if fExportedDataTables.FindByName(lLogicalName) <> nil then continue;
+ ds := ServiceSchema.Datasets.FindDatasetByName(lLogicalName);
+ if not assigned(ds) then
+ ds := ServiceSchema.UnionDataTables.FindUnionDataTableByName(lLogicalName);
+ if not assigned(ds) then
+ ds := ServiceSchema.JoinDataTables.FindJoinTableByName(lLogicalName);
+ with TMyDatasetCollection(ServiceSchema.Datasets) do
+ if ds = nil then EDAException.CreateFmt(err_CannotFindItem, [ItemName, lLogicalName, ClassName]);
+
+ lresult := lresult+Format('<%s Language="%s">%s>', [
+ lLogicalName,
+ GetEnumName(TypeInfo(TROSEScriptLanguage), Ord(ds.BusinessRulesClient.ScriptLanguage)),
+ ds.BusinessRulesClient.Script,
+ lLogicalName]);
+ end;
+
+ result := UTF8Encode(''+lresult+' ');
+ finally
+ FreeAndNIL(names);
+ end;
+end;
+
+procedure TDataAbstractService.ExportedDataTables_MergeDelta(ADelta: IDADelta);
+var
+ i, k, x: integer;
+ oldval, newval, val : Variant;
+ fld : TDAField;
+ pkfields : string;
+ pkfields1: array of string;
+ insertfields: array of string;
+ keyvals, insertvals : array of variant;
+ LDAEditableDataset:IDAEditableDataset;
+ ADataset: IDADataset;
+ pk_array: array of boolean;
+begin
+ // validated in UnpackDeltas
+ ADataset:=ExportedDataTables.FindByName(ADelta.LogicalName).Dataset;
+ SetLength(pk_array, ADelta.LoggedFieldCount);
+ for i := 0 to ADelta.LoggedFieldCount - 1 do
+ pk_array[i]:=False;
+
+ for i := 0 to ADelta.KeyFieldCount - 1 do begin
+ x := ADelta.IndexOfLoggedField(ADelta.KeyFieldNames[i]);
+ if x <> -1 then pk_array[x]:=True;
+ end;
+
+ SetLength(pkfields1, ADelta.KeyFieldCount);
+ for i := 0 to (ADelta.KeyFieldCount-1) do
+ pkfields1[i]:=ADelta.KeyFieldNames[i];
+ if ADelta.KeyFieldCount = 0 then
+ begin
+ SetLength(pkfields1, ADelta.LoggedFieldCount);
+ k:=-1;
+ for i := 0 to (ADelta.LoggedFieldCount-1) do begin
+ if ADelta.LoggedFieldTypes[i] in [datUnknown, datMemo, datBlob,datWideMemo, datXml] then Continue;
+ inc(k);
+ pkfields1[k]:=ADelta.LoggedFieldNames[i];
+ end;
+ SetLength(pkfields1,k+1);
+ end;
+ SetLength(keyvals, Length(pkfields1));
+ pkfields := '';
+ For i:=0 to Length(pkfields1) - 1 do
+ pkfields:=pkfields+pkfields1[i]+';';
+ pkfields := Copy(pkfields, 1, Length(pkfields)-1);
+
+ if (ADelta.Count>0) then begin
+ for i := (ADelta.Count-1) downto 0 do begin
+ for k := 0 to Length(pkfields1)-1 do begin
+ val := ADelta[i].OldValueByName[pkfields1[k]];
+ keyvals[k] := val;
+ end;
+ if fHasReducedDelta and (ADelta.KeyFieldCount = 0) then begin
+ SetLength(pkfields1, ADelta.LoggedFieldCount);
+ k:=-1;
+ for x := 0 to (ADelta.LoggedFieldCount-1) do begin
+ if ADelta.LoggedFieldTypes[x] in [datUnknown, datMemo, datBlob,datWideMemo, datXml] then Continue;
+ pkfields:=ADelta.LoggedFieldNames[x];
+ oldval:=ADelta[i].OldValueByName[pkfields];
+ if ROVariantsEqual(oldval,ADelta[i].NewValueByName[pkfields]) and (VarIsNull(oldval) or (VarIsEmpty(oldval))) then Continue;
+ inc(k);
+ pkfields1[k]:=ADelta.LoggedFieldNames[x];
+ end;
+ SetLength(pkfields1,k+1);
+ SetLength(keyvals,k+1);
+ for k := 0 to Length(pkfields1)-1 do begin
+ val := ADelta[i].OldValueByName[pkfields1[k]];
+ keyvals[k] := val;
+ end;
+ pkfields := '';
+ For x:=0 to Length(pkfields1) - 1 do
+ pkfields:=pkfields+pkfields1[x]+';';
+ pkfields := Copy(pkfields, 1, Length(pkfields)-1);
+ end;
+ if ADataset.QueryInterface(StringToGUID('{D3E2147F-65B3-4D9D-8614-7270011FA7D5}'),LDAEditableDataset) <> 0 then exit;
+ LDAEditableDataset.Open;
+ LDAEditableDataset.First;
+ case ADelta[i].ChangeType of
+ ctDelete: begin
+ // Locates the original record
+ if Length(keyvals)=1 then begin
+ if not Adataset.Locate(pkfields, keyvals[0], []) then Continue;
+ end
+ else begin
+ if not Adataset.Locate(pkfields, keyvals, []) then Continue;
+ end;
+ LDAEditableDataset.Delete;
+ end;
+ ctInsert: begin
+ // fHasReducedDelta don't work in this case
+ // old values = Unassigned
+ // new Values = Null
+ SetLength(insertFields, ADelta.LoggedFieldCount);
+ SetLength(insertvals, ADelta.LoggedFieldCount);
+ for x := 0 to (ADelta.LoggedFieldCount-1) do begin
+ insertfields[x] := ADelta.LoggedFieldNames[x];
+ insertvals[x] := ADelta[i].NewValueByName[ADelta.LoggedFieldNames[x]];
+ end;
+ LDAEditableDataset.AddRecord(insertfields,insertvals);
+ end;
+ ctUpdate: begin
+ // Locates the original record
+ if Length(keyvals)=1 then begin
+ if not Adataset.Locate(pkfields, keyvals[0], []) then Continue;
+ end
+ else begin
+ if not Adataset.Locate(pkfields, keyvals, []) then Continue;
+ end;
+ LDAEditableDataset.Edit;
+ for x := 0 to (ADelta.LoggedFieldCount-1) do begin
+ fld := Adataset.FieldByName(ADelta.LoggedFieldNames[x]);
+ newval := ADelta[i].NewValueByName[fld.Name];
+ oldval := ADelta[i].OldValueByName[fld.Name];
+ if fHasReducedDelta and (ROVariantsEqual(newval, oldval)) then Continue;
+ fld.Value:=newval;
+{ if fld.ServerAutoRefresh or (not VarIsArray(newVal) and (newval<>oldval)) then begin
+ VariantToFieldValue(newval, fld);
+ end;
+}
+ end;
+ LDAEditableDataset.Post;
+ end;
+ end;
+ // Removes this merged change
+ ADelta.Delete(i);
+ end;
+ end
+end;
+
+function TDataAbstractService.ReadDeltaFromStream(const DeltaStream: Binary): IDeltaArray;
+var
+ i: integer;
+ lDeltaName: string;
+begin
+ SetLength(result,0);
+ Check(True);
+ // Reads the deltas.
+ ServiceDataStreamer.Initialize(DeltaStream, aiReadFromBeginning);
+ try
+ fHasReducedDelta := ServiceDataStreamer.HasReducedDelta;
+ SetLength(result,ServiceDataStreamer.DeltaCount);
+ for i := 0 to (ServiceDataStreamer.DeltaCount - 1) do begin
+ lDeltaName := ServiceDataStreamer.DeltaNames[i];
+ Result[i] := NewDelta(lDeltaName);
+ ServiceDataStreamer.ReadDelta(lDeltaName, Result[i]);
+ end;
+ finally
+ ServiceDataStreamer.Finalize;
+ end;
+end;
+
+procedure TDataAbstractService.RegisterForDataChangeNotification(
+ const aTableName: Utf8String);
+begin
+{ TODO : todo }
+end;
+
+procedure TDataAbstractService.UnregisterForDataChangeNotification(
+ const aTableName: Utf8String);
+begin
+{ TODO : todo }
+end;
+
+function TDataAbstractService.SQLExecuteCommand(const aSQLText: Utf8String): Integer;
+begin
+ Result:= SQLExecuteCommandEx(aSQLText,'');
+end;
+
+function TDataAbstractService.SQLGetData(const aSQLText: Utf8String; const aIncludeSchema: Boolean; const aMaxRecords: Integer): Binary;
+begin
+ Result:= SQLGetDataEx(aSQLText, aIncludeSchema, aMaxRecords, '');
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.bdsproj
new file mode 100644
index 0000000..4c974b2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.bdsproj
@@ -0,0 +1,179 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {74F520E8-6944-4308-9CFD-20E9AFC351F3}
+
+
+
+
+ DataAbstract_Core_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - Core Library
+ False
+
+
+
+ ..\Dcu\D10
+ ..\Dcu\D10
+ ..\Dcu\D10
+
+
+ DESIGNTIME
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 0
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 0.0.0.0
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.cfg
new file mode 100644
index 0000000..11c667c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.cfg
@@ -0,0 +1,48 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\Dcu\D10"
+-LE"..\Dcu\D10"
+-LN"..\Dcu\D10"
+-DDESIGNTIME
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-SYMBOL_EXPERIMENTAL
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNIT_EXPERIMENTAL
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.dpk
new file mode 100644
index 0000000..1836908
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.dpk
@@ -0,0 +1,117 @@
+package DataAbstract_Core_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Core Library'}
+{$IMPLICITBUILD OFF}
+{$DEFINE DESIGNTIME}
+
+requires
+ RemObjects_Core_D10,
+ rtl,
+ vcl,
+ adortl,
+ dbrtl,
+ dsnap,
+ vcldb;
+
+contains
+ uDAInterfaces in 'uDAInterfaces.pas',
+ uDAInterfacesEx in 'uDAInterfacesEx.pas',
+ uDAClasses in 'uDAClasses.pas',
+ uDAHelpers in 'uDAHelpers.pas',
+ uDAEngine in 'uDAEngine.pas',
+ uDAUtils in 'uDAUtils.pas',
+ uDARes in 'uDARes.pas',
+ DataAbstract_Core_Reg in 'DataAbstract_Core_Reg.pas',
+ uDABinAdapter in 'uDABinAdapter.pas',
+ uDAXMLAdapter in 'uDAXMLAdapter.pas',
+ uDADriverManager in 'uDADriverManager.pas',
+ uDASupportClasses in 'uDASupportClasses.pas',
+ uDADataTable in 'uDADataTable.pas',
+ uDACDSDataTable in 'uDACDSDataTable.pas',
+ uDAADODataTable in 'uDAADODataTable.pas',
+ uDABusinessProcessor in 'uDABusinessProcessor.pas',
+ uDAIBInterfaces in 'uDAIBInterfaces.pas',
+ uDAOracleInterfaces in 'uDAOracleInterfaces.pas',
+ uDAADOInterfaces in 'uDAADOInterfaces.pas',
+ uDAMacroProcessors in 'uDAMacroProcessors.pas',
+ uDADBSessionManager in 'uDADBSessionManager.pas',
+ uDAMacros in 'uDAMacros.pas',
+ DALoginService_Impl in 'DALoginService_Impl.pas',
+ DARemoteService_Impl in 'DARemoteService_Impl.pas',
+ uDAXMLUtils in 'uDAXMLUtils.pas',
+ uDARegExpr in 'uDARegExpr.pas',
+ uDADriverInfo in 'uDADriverInfo.pas',
+ uDAPleaseWaitForm in 'uDAPleaseWaitForm.pas',
+ uDAClientDataModule in 'uDAClientDataModule.pas',
+ uDAScriptingProvider in 'uDAScriptingProvider.pas',
+ uDAServerLog in 'uDAServerLog.pas',
+ uDADatasetProvider in 'uDADatasetProvider.pas',
+ uDAPoweredByDataAbstractButton in 'uDAPoweredByDataAbstractButton.pas',
+ SimpleLoginService_Impl in 'SimpleLoginService_Impl.pas',
+ DataAbstract3_Intf in 'DataAbstract3_Intf.pas',
+ DataAbstract3_Invk in 'DataAbstract3_Invk.pas',
+ DataAbstract3_Async in 'DataAbstract3_Async.pas',
+ DataAbstractService_Impl in 'DataAbstractService_Impl.pas' {DataAbstractService: TRORemoteDataModule},
+ MultiDbLoginService_Impl in 'MultiDbLoginService_Impl.pas',
+ BaseLoginService_Impl in 'BaseLoginService_Impl.pas' {BaseLoginService: TRORemoteDataModule},
+ DataAbstract4_Invk in 'DataAbstract4_Invk.pas',
+ DataAbstract4_Intf in 'DataAbstract4_Intf.pas',
+ DataAbstract4_Async in 'DataAbstract4_Async.pas',
+ uDARemoteDataAdapter in 'uDARemoteDataAdapter.pas',
+ uDACache in 'uDACache.pas',
+ uDARemoteDataAdapterRequests in 'uDARemoteDataAdapterRequests.pas',
+ uDADataStreamer in 'uDADataStreamer.pas',
+ uDADelta in 'uDADelta.pas',
+ uDADesigntimeCall in 'uDADesigntimeCall.pas',
+ uDAExceptions in 'uDAExceptions.pas',
+ uDASQL92Interfaces in 'uDASQL92Interfaces.pas',
+ uDABin2DataStreamer in 'uDABin2DataStreamer.pas',
+ uDAMemDataset in 'uDAMemDataset.pas',
+ uDAMemDataTable in 'uDAMemDataTable.pas',
+ uDAReconcileDialog in 'uDAReconcileDialog.pas' {ReconcileDialogForm},
+ uDAReconcileDialogDetails in 'uDAReconcileDialogDetails.pas',
+ uDADatasetWrapper in 'uDADatasetWrapper.pas',
+ uDADataTableReferenceCollection in 'uDADataTableReferenceCollection.pas',
+ uDAMySQLInterfaces in 'uDAMySQLInterfaces.pas',
+ uDASQLiteInterfaces in 'uDASQLiteInterfaces.pas',
+ uDAExpressionEvaluator in 'uDAExpressionEvaluator.pas',
+ uDASQL92QueryBuilder in 'uDASQL92QueryBuilder.pas',
+ uDAWhere in 'uDAWhere.pas',
+ uDARemoteCommand in 'uDARemoteCommand.pas',
+ uDAPostgresInterfaces in 'uDAPostgresInterfaces.pas',
+ uDAElevateDBInterfaces in 'uDAElevateDBInterfaces.pas',
+ uDADB2Interfaces in 'uDADB2Interfaces.pas',
+ uDASybaseInterfaces in 'uDASybaseInterfaces.pas',
+ MultiDbLoginServiceV5_Impl in 'MultiDbLoginServiceV5_Impl.pas',
+ //.31
+ uDAHETDriver in 'uDAHETDriver.pas',
+ uDAHETConnections in 'uDAHETConnections.pas',
+ //
+ uDAJSONDataStreamer in 'uDAJSONDataStreamer.pas',
+ uDALocalDataAdapter in 'uDALocalDataAdapter.pas',
+ uDADataAdapter in 'uDADataAdapter.pas',
+ uDALocalHelpers in 'uDALocalHelpers.pas',
+ uDALocalCommand in 'uDALocalCommand.pas';
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.res
new file mode 100644
index 0000000..6a57c43
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D11.dpk
new file mode 100644
index 0000000..f56be5d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D11.dpk
@@ -0,0 +1,117 @@
+package DataAbstract_Core_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Core Library'}
+{$IMPLICITBUILD OFF}
+{$DEFINE DESIGNTIME}
+{$DEFINE RELEASE}
+
+requires
+ RemObjects_Core_D11,
+ rtl,
+ vcl,
+ adortl,
+ dbrtl,
+ dsnap,
+ vcldb;
+
+contains
+ uDAInterfaces in 'uDAInterfaces.pas',
+ uDAInterfacesEx in 'uDAInterfacesEx.pas',
+ uDAClasses in 'uDAClasses.pas',
+ uDAHelpers in 'uDAHelpers.pas',
+ uDAEngine in 'uDAEngine.pas',
+ uDAUtils in 'uDAUtils.pas',
+ uDARes in 'uDARes.pas',
+ DataAbstract_Core_Reg in 'DataAbstract_Core_Reg.pas',
+ uDABinAdapter in 'uDABinAdapter.pas',
+ uDAXMLAdapter in 'uDAXMLAdapter.pas',
+ uDADriverManager in 'uDADriverManager.pas',
+ uDASupportClasses in 'uDASupportClasses.pas',
+ uDADataTable in 'uDADataTable.pas',
+ uDACDSDataTable in 'uDACDSDataTable.pas',
+ uDAADODataTable in 'uDAADODataTable.pas',
+ uDABusinessProcessor in 'uDABusinessProcessor.pas',
+ uDAIBInterfaces in 'uDAIBInterfaces.pas',
+ uDAOracleInterfaces in 'uDAOracleInterfaces.pas',
+ uDAADOInterfaces in 'uDAADOInterfaces.pas',
+ uDAMacroProcessors in 'uDAMacroProcessors.pas',
+ uDADBSessionManager in 'uDADBSessionManager.pas',
+ uDAMacros in 'uDAMacros.pas',
+ DALoginService_Impl in 'DALoginService_Impl.pas',
+ DARemoteService_Impl in 'DARemoteService_Impl.pas',
+ uDAXMLUtils in 'uDAXMLUtils.pas',
+ uDARegExpr in 'uDARegExpr.pas',
+ uDADriverInfo in 'uDADriverInfo.pas',
+ uDAPleaseWaitForm in 'uDAPleaseWaitForm.pas',
+ uDAClientDataModule in 'uDAClientDataModule.pas',
+ uDAScriptingProvider in 'uDAScriptingProvider.pas',
+ uDAServerLog in 'uDAServerLog.pas',
+ uDADatasetProvider in 'uDADatasetProvider.pas',
+ uDAPoweredByDataAbstractButton in 'uDAPoweredByDataAbstractButton.pas',
+ SimpleLoginService_Impl in 'SimpleLoginService_Impl.pas',
+ DataAbstract3_Intf in 'DataAbstract3_Intf.pas',
+ DataAbstract3_Invk in 'DataAbstract3_Invk.pas',
+ DataAbstract3_Async in 'DataAbstract3_Async.pas',
+ DataAbstractService_Impl in 'DataAbstractService_Impl.pas' {DataAbstractService: TRORemoteDataModule},
+ MultiDbLoginService_Impl in 'MultiDbLoginService_Impl.pas',
+ BaseLoginService_Impl in 'BaseLoginService_Impl.pas' {BaseLoginService: TRORemoteDataModule},
+ DataAbstract4_Invk in 'DataAbstract4_Invk.pas',
+ DataAbstract4_Intf in 'DataAbstract4_Intf.pas',
+ DataAbstract4_Async in 'DataAbstract4_Async.pas',
+ uDARemoteDataAdapter in 'uDARemoteDataAdapter.pas',
+ uDACache in 'uDACache.pas',
+ uDARemoteDataAdapterRequests in 'uDARemoteDataAdapterRequests.pas',
+ uDADataStreamer in 'uDADataStreamer.pas',
+ uDADelta in 'uDADelta.pas',
+ uDADesigntimeCall in 'uDADesigntimeCall.pas',
+ uDAExceptions in 'uDAExceptions.pas',
+ uDASQL92Interfaces in 'uDASQL92Interfaces.pas',
+ uDABin2DataStreamer in 'uDABin2DataStreamer.pas',
+ uDAMemDataset in 'uDAMemDataset.pas',
+ uDAMemDataTable in 'uDAMemDataTable.pas',
+ uDAReconcileDialog in 'uDAReconcileDialog.pas' {ReconcileDialogForm},
+ uDAReconcileDialogDetails in 'uDAReconcileDialogDetails.pas',
+ uDADatasetWrapper in 'uDADatasetWrapper.pas',
+ uDADataTableReferenceCollection in 'uDADataTableReferenceCollection.pas',
+ uDAMySQLInterfaces in 'uDAMySQLInterfaces.pas',
+ uDASQLiteInterfaces in 'uDASQLiteInterfaces.pas',
+ uDAExpressionEvaluator in 'uDAExpressionEvaluator.pas',
+ uDASQL92QueryBuilder in 'uDASQL92QueryBuilder.pas',
+ uDAWhere in 'uDAWhere.pas',
+ uDARemoteCommand in 'uDARemoteCommand.pas',
+ uDAPostgresInterfaces in 'uDAPostgresInterfaces.pas',
+ uDAElevateDBInterfaces in 'uDAElevateDBInterfaces.pas',
+ uDADB2Interfaces in 'uDADB2Interfaces.pas',
+ uDASybaseInterfaces in 'uDASybaseInterfaces.pas',
+ MultiDbLoginServiceV5_Impl in 'MultiDbLoginServiceV5_Impl.pas',
+ uDAHETDriver in 'uDAHETDriver.pas',
+ uDAHETConnections in 'uDAHETConnections.pas',
+ uDAJSONDataStreamer in 'uDAJSONDataStreamer.pas',
+ uDALocalDataAdapter in 'uDALocalDataAdapter.pas',
+ uDADataAdapter in 'uDADataAdapter.pas',
+ uDALocalHelpers in 'uDALocalHelpers.pas',
+ uDALocalCommand in 'uDALocalCommand.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D11.dproj
new file mode 100644
index 0000000..dd437f4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D11.dproj
@@ -0,0 +1,668 @@
+
+
+ {f3a56007-69a7-443a-8fdf-56da71a8440c}
+ DataAbstract_Core_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\Dcu\D11\DataAbstract_Core_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ DESIGNTIME;RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ ..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\RemObjects SDK for Delphi\Dcu\D11
+
+
+ 7.0
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ DESIGNTIME
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ ..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\RemObjects SDK for Delphi\Dcu\D11
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - Core Library False False False True False 6 0 43 801 False False False False False 1033 1252 RemObjects Software 6.0.43.801 RemObjects SDK 1.0.0.0 DataAbstract_Core_D11.dpk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CodeGear BDE DB Components
+ CodeGear C++Builder Office 2000 Servers Package
+ CodeGear C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ TRORemoteDataModule
+
+
+
+
+
+
+
+
+
+
+
+ TRORemoteDataModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D12.dpk
new file mode 100644
index 0000000..0523a14
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D12.dpk
@@ -0,0 +1,117 @@
+package DataAbstract_Core_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Core Library'}
+{$IMPLICITBUILD OFF}
+{$DEFINE DESIGNTIME}
+
+requires
+ rtl,
+ vcl,
+ adortl,
+ dbrtl,
+ dsnap,
+ vcldb,
+ RemObjects_Core_D12;
+
+contains
+ uDAInterfaces in 'uDAInterfaces.pas',
+ uDAInterfacesEx in 'uDAInterfacesEx.pas',
+ uDAClasses in 'uDAClasses.pas',
+ uDAHelpers in 'uDAHelpers.pas',
+ uDAEngine in 'uDAEngine.pas',
+ uDAUtils in 'uDAUtils.pas',
+ uDARes in 'uDARes.pas',
+ DataAbstract_Core_Reg in 'DataAbstract_Core_Reg.pas',
+ uDABinAdapter in 'uDABinAdapter.pas',
+ uDAXMLAdapter in 'uDAXmlAdapter.pas',
+ uDADriverManager in 'uDADriverManager.pas',
+ uDASupportClasses in 'uDASupportClasses.pas',
+ uDADataTable in 'uDADataTable.pas',
+ uDACDSDataTable in 'uDACDSDataTable.pas',
+ uDAADODataTable in 'uDAADODataTable.pas',
+ uDABusinessProcessor in 'uDABusinessProcessor.pas',
+ uDAIBInterfaces in 'uDAIBInterfaces.pas',
+ uDAOracleInterfaces in 'uDAOracleInterfaces.pas',
+ uDAADOInterfaces in 'uDAADOInterfaces.pas',
+ uDAMacroProcessors in 'uDAMacroProcessors.pas',
+ uDADBSessionManager in 'uDADBSessionManager.pas',
+ uDAMacros in 'uDAMacros.pas',
+ DALoginService_Impl in 'DALoginService_Impl.pas',
+ DARemoteService_Impl in 'DARemoteService_Impl.pas',
+ uDAXMLUtils in 'uDAXMLUtils.pas',
+ uDARegExpr in 'uDARegExpr.pas',
+ uDADriverInfo in 'uDADriverInfo.pas',
+ uDAPleaseWaitForm in 'uDAPleaseWaitForm.pas',
+ uDAClientDataModule in 'uDAClientDataModule.pas',
+ uDAScriptingProvider in 'uDAScriptingProvider.pas',
+ uDAServerLog in 'uDAServerLog.pas',
+ uDADatasetProvider in 'uDADatasetProvider.pas',
+ uDAPoweredByDataAbstractButton in 'uDAPoweredByDataAbstractButton.pas',
+ SimpleLoginService_Impl in 'SimpleLoginService_Impl.pas',
+ DataAbstract3_Intf in 'DataAbstract3_Intf.pas',
+ DataAbstract3_Invk in 'DataAbstract3_Invk.pas',
+ DataAbstract3_Async in 'DataAbstract3_Async.pas',
+ DataAbstractService_Impl in 'DataAbstractService_Impl.pas' {DataAbstractService: TRORemoteDataModule},
+ MultiDbLoginService_Impl in 'MultiDbLoginService_Impl.pas',
+ BaseLoginService_Impl in 'BaseLoginService_Impl.pas' {BaseLoginService: TRORemoteDataModule},
+ DataAbstract4_Invk in 'DataAbstract4_Invk.pas',
+ DataAbstract4_Intf in 'DataAbstract4_Intf.pas',
+ DataAbstract4_Async in 'DataAbstract4_Async.pas',
+ uDARemoteDataAdapter in 'uDARemoteDataAdapter.pas',
+ uDACache in 'uDACache.pas',
+ uDARemoteDataAdapterRequests in 'uDARemoteDataAdapterRequests.pas',
+ uDADataStreamer in 'uDADataStreamer.pas',
+ uDADelta in 'uDADelta.pas',
+ uDADesigntimeCall in 'uDADesigntimeCall.pas',
+ uDAExceptions in 'uDAExceptions.pas',
+ uDASQL92Interfaces in 'uDASQL92Interfaces.pas',
+ uDABin2DataStreamer in 'uDABin2DataStreamer.pas',
+ uDAMemDataset in 'uDAMemDataset.pas',
+ uDAMemDataTable in 'uDAMemDataTable.pas',
+ uDAReconcileDialog in 'uDAReconcileDialog.pas' {ReconcileDialogForm},
+ uDAReconcileDialogDetails in 'uDAReconcileDialogDetails.pas',
+ uDADatasetWrapper in 'uDADatasetWrapper.pas',
+ uDADataTableReferenceCollection in 'uDADataTableReferenceCollection.pas',
+ uDAMySQLInterfaces in 'uDAMySQLInterfaces.pas',
+ uDASQLiteInterfaces in 'uDASQLiteInterfaces.pas',
+ uDAExpressionEvaluator in 'uDAExpressionEvaluator.pas',
+ uDASQL92QueryBuilder in 'uDASQL92QueryBuilder.pas',
+ uDAWhere in 'uDAWhere.pas',
+ uDARemoteCommand in 'uDARemoteCommand.pas',
+ uDAPostgresInterfaces in 'uDAPostgresInterfaces.pas',
+ uDAElevateDBInterfaces in 'uDAElevateDBInterfaces.pas',
+ uDADB2Interfaces in 'uDADB2Interfaces.pas',
+ uDASybaseInterfaces in 'uDASybaseInterfaces.pas',
+ MultiDbLoginServiceV5_Impl in 'MultiDbLoginServiceV5_Impl.pas',
+ //.31
+ uDAHETDriver in 'uDAHETDriver.pas',
+ uDAHETConnections in 'uDAHETConnections.pas',
+ //
+ uDAJSONDataStreamer in 'uDAJSONDataStreamer.pas',
+ uDALocalDataAdapter in 'uDALocalDataAdapter.pas',
+ uDADataAdapter in 'uDADataAdapter.pas',
+ uDALocalHelpers in 'uDALocalHelpers.pas',
+ uDALocalCommand in 'uDALocalCommand.pas';
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D12.dproj
new file mode 100644
index 0000000..814624d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D12.dproj
@@ -0,0 +1,177 @@
+
+
+ {f3a56007-69a7-443a-8fdf-56da71a8440c}
+ DataAbstract_Core_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\Dcu\D12\DataAbstract_Core_D12.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ error
+ ..\..\RemObjects SDK for Delphi\Dcu\D12;..\Dcu\D12;$(DCC_UnitSearchPath)
+ ..\Dcu\D12
+ error
+ error
+ error
+ error
+ ..\Dcu\D12
+ error
+ ..\Dcu\D12
+ true
+ true
+ true
+ false
+ 00400000
+ ..\Dcu\D12\DataAbstract_Core_D12.bpl
+ RemObjects Data Abstract - Core Library
+ DESIGNTIME;$(DCC_Define)
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRORemoteDataModule
+
+
+
+
+ TRORemoteDataModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 4
+ 0
+ 2
+ 434
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 4.0.2.434
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_Core_D12.dpk
+
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D12.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D14.dpk
new file mode 100644
index 0000000..c2e7fa5
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D14.dpk
@@ -0,0 +1,116 @@
+package DataAbstract_Core_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Core Library'}
+{$IMPLICITBUILD OFF}
+{$DEFINE DESIGNTIME}
+{$WARN UNIT_DEPRECATED OFF}
+requires
+ rtl,
+ vcl,
+ adortl,
+ dbrtl,
+ dsnap,
+ vcldb,
+ RemObjects_Core_D14;
+
+contains
+ uDAInterfaces in 'uDAInterfaces.pas',
+ uDAInterfacesEx in 'uDAInterfacesEx.pas',
+ uDAClasses in 'uDAClasses.pas',
+ uDAHelpers in 'uDAHelpers.pas',
+ uDAEngine in 'uDAEngine.pas',
+ uDAUtils in 'uDAUtils.pas',
+ uDARes in 'uDARes.pas',
+ DataAbstract_Core_Reg in 'DataAbstract_Core_Reg.pas',
+ uDABinAdapter in 'uDABinAdapter.pas',
+ uDAXmlAdapter in 'uDAXmlAdapter.pas',
+ uDADriverManager in 'uDADriverManager.pas',
+ uDASupportClasses in 'uDASupportClasses.pas',
+ uDADataTable in 'uDADataTable.pas',
+ uDACDSDataTable in 'uDACDSDataTable.pas',
+ uDAADODataTable in 'uDAADODataTable.pas',
+ uDABusinessProcessor in 'uDABusinessProcessor.pas',
+ uDAIBInterfaces in 'uDAIBInterfaces.pas',
+ uDAOracleInterfaces in 'uDAOracleInterfaces.pas',
+ uDAADOInterfaces in 'uDAADOInterfaces.pas',
+ uDAMacroProcessors in 'uDAMacroProcessors.pas',
+ uDADBSessionManager in 'uDADBSessionManager.pas',
+ uDAMacros in 'uDAMacros.pas',
+ DALoginService_Impl in 'DALoginService_Impl.pas',
+ DARemoteService_Impl in 'DARemoteService_Impl.pas',
+ uDAXMLUtils in 'uDAXMLUtils.pas',
+ uDARegExpr in 'uDARegExpr.pas',
+ uDADriverInfo in 'uDADriverInfo.pas',
+ uDAPleaseWaitForm in 'uDAPleaseWaitForm.pas',
+ uDAClientDataModule in 'uDAClientDataModule.pas',
+ uDAScriptingProvider in 'uDAScriptingProvider.pas',
+ uDAServerLog in 'uDAServerLog.pas',
+ uDADatasetProvider in 'uDADatasetProvider.pas',
+ uDAPoweredByDataAbstractButton in 'uDAPoweredByDataAbstractButton.pas',
+ SimpleLoginService_Impl in 'SimpleLoginService_Impl.pas',
+ DataAbstract3_Intf in 'DataAbstract3_Intf.pas',
+ DataAbstract3_Invk in 'DataAbstract3_Invk.pas',
+ DataAbstract3_Async in 'DataAbstract3_Async.pas',
+ DataAbstractService_Impl in 'DataAbstractService_Impl.pas' {DataAbstractService: TRORemoteDataModule},
+ MultiDbLoginService_Impl in 'MultiDbLoginService_Impl.pas',
+ BaseLoginService_Impl in 'BaseLoginService_Impl.pas' {BaseLoginService: TRORemoteDataModule},
+ DataAbstract4_Invk in 'DataAbstract4_Invk.pas',
+ DataAbstract4_Intf in 'DataAbstract4_Intf.pas',
+ DataAbstract4_Async in 'DataAbstract4_Async.pas',
+ uDARemoteDataAdapter in 'uDARemoteDataAdapter.pas',
+ uDACache in 'uDACache.pas',
+ uDARemoteDataAdapterRequests in 'uDARemoteDataAdapterRequests.pas',
+ uDADataStreamer in 'uDADataStreamer.pas',
+ uDADelta in 'uDADelta.pas',
+ uDADesigntimeCall in 'uDADesigntimeCall.pas',
+ uDAExceptions in 'uDAExceptions.pas',
+ uDASQL92Interfaces in 'uDASQL92Interfaces.pas',
+ uDABin2DataStreamer in 'uDABin2DataStreamer.pas',
+ uDAMemDataset in 'uDAMemDataset.pas',
+ uDAMemDataTable in 'uDAMemDataTable.pas',
+ uDAReconcileDialog in 'uDAReconcileDialog.pas' {ReconcileDialogForm},
+ uDAReconcileDialogDetails in 'uDAReconcileDialogDetails.pas',
+ uDADatasetWrapper in 'uDADatasetWrapper.pas',
+ uDADataTableReferenceCollection in 'uDADataTableReferenceCollection.pas',
+ uDAMySQLInterfaces in 'uDAMySQLInterfaces.pas',
+ uDASQLiteInterfaces in 'uDASQLiteInterfaces.pas',
+ uDAExpressionEvaluator in 'uDAExpressionEvaluator.pas',
+ uDASQL92QueryBuilder in 'uDASQL92QueryBuilder.pas',
+ uDAWhere in 'uDAWhere.pas',
+ uDARemoteCommand in 'uDARemoteCommand.pas',
+ uDAPostgresInterfaces in 'uDAPostgresInterfaces.pas',
+ uDAElevateDBInterfaces in 'uDAElevateDBInterfaces.pas',
+ uDADB2Interfaces in 'uDADB2Interfaces.pas',
+ uDASybaseInterfaces in 'uDASybaseInterfaces.pas',
+ MultiDbLoginServiceV5_Impl in 'MultiDbLoginServiceV5_Impl.pas',
+ uDAHETDriver in 'uDAHETDriver.pas',
+ uDAHETConnections in 'uDAHETConnections.pas',
+ uDAJSONDataStreamer in 'uDAJSONDataStreamer.pas',
+ uDALocalDataAdapter in 'uDALocalDataAdapter.pas',
+ uDADataAdapter in 'uDADataAdapter.pas',
+ uDALocalHelpers in 'uDALocalHelpers.pas',
+ uDALocalCommand in 'uDALocalCommand.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D14.dproj
new file mode 100644
index 0000000..08aee1a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D14.dproj
@@ -0,0 +1,182 @@
+
+
+ {f3a56007-69a7-443a-8fdf-56da71a8440c}
+ DataAbstract_Core_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\Dcu\D12\DataAbstract_Core_D12.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ error
+ ..\..\RemObjects SDK for Delphi\Dcu\D14;..\Dcu\D14;$(DCC_UnitSearchPath)
+ ..\Dcu\D14
+ error
+ error
+ error
+ error
+ ..\Dcu\D14
+ error
+ ..\Dcu\D14
+ true
+ true
+ true
+ false
+ 00400000
+ ..\Dcu\D14\DataAbstract_Core_D14.bpl
+ RemObjects Data Abstract - Core Library
+ DESIGNTIME;$(DCC_Define)
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TRORemoteDataModule
+
+
+
+
+ TRORemoteDataModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 4
+ 0
+ 2
+ 434
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 4.0.2.434
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_Core_D14.dpk
+
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D14.res
new file mode 100644
index 0000000..0593ed9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.cfg
new file mode 100644
index 0000000..3d4736d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.cfg
@@ -0,0 +1,42 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\Dcu\D6"
+-LE"..\Dcu\D6"
+-LN"..\Dcu\D6"
+-U"..\Dcu\D6;..\..\RemObjects SDK for Delphi\Dcu\D6"
+-O"..\Dcu\D6;..\..\RemObjects SDK for Delphi\Dcu\D6"
+-I"..\Dcu\D6;..\..\RemObjects SDK for Delphi\Dcu\D6"
+-R"..\Dcu\D6;..\..\RemObjects SDK for Delphi\Dcu\D6"
+-DDESIGNTIME
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.dof
new file mode 100644
index 0000000..ff6f0ce
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Core Library
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\Dcu\D6
+PackageDLLOutputDir=..\Dcu\D6
+PackageDCPOutputDir=..\Dcu\D6
+SearchPath=..\Dcu\D6;..\..\RemObjects SDK for Delphi\Dcu\D6
+Packages=
+Conditionals=DESIGNTIME
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=3.0.0.280
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.dpk
new file mode 100644
index 0000000..4abdb86
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.dpk
@@ -0,0 +1,117 @@
+package DataAbstract_Core_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Core Library'}
+{$IMPLICITBUILD OFF}
+{$DEFINE DESIGNTIME}
+
+requires
+ RemObjects_Core_D6,
+ rtl,
+ vcl,
+ adortl,
+ dbrtl,
+ dsnap,
+ vcldb;
+
+contains
+ uDAInterfaces in 'uDAInterfaces.pas',
+ uDAInterfacesEx in 'uDAInterfacesEx.pas',
+ uDAClasses in 'uDAClasses.pas',
+ uDAHelpers in 'uDAHelpers.pas',
+ uDAEngine in 'uDAEngine.pas',
+ uDAUtils in 'uDAUtils.pas',
+ uDARes in 'uDARes.pas',
+ DataAbstract_Core_Reg in 'DataAbstract_Core_Reg.pas',
+ uDABinAdapter in 'uDABinAdapter.pas',
+ uDAXMLAdapter in 'uDAXMLAdapter.pas',
+ uDADriverManager in 'uDADriverManager.pas',
+ uDASupportClasses in 'uDASupportClasses.pas',
+ uDADataTable in 'uDADataTable.pas',
+ uDACDSDataTable in 'uDACDSDataTable.pas',
+ uDAADODataTable in 'uDAADODataTable.pas',
+ uDABusinessProcessor in 'uDABusinessProcessor.pas',
+ uDAIBInterfaces in 'uDAIBInterfaces.pas',
+ uDAOracleInterfaces in 'uDAOracleInterfaces.pas',
+ uDAADOInterfaces in 'uDAADOInterfaces.pas',
+ uDAMacroProcessors in 'uDAMacroProcessors.pas',
+ uDADBSessionManager in 'uDADBSessionManager.pas',
+ uDAMacros in 'uDAMacros.pas',
+ DALoginService_Impl in 'DALoginService_Impl.pas',
+ DARemoteService_Impl in 'DARemoteService_Impl.pas',
+ uDAXMLUtils in 'uDAXMLUtils.pas',
+ uDARegExpr in 'uDARegExpr.pas',
+ uDADriverInfo in 'uDADriverInfo.pas',
+ uDAPleaseWaitForm in 'uDAPleaseWaitForm.pas',
+ uDAClientDataModule in 'uDAClientDataModule.pas',
+ uDAScriptingProvider in 'uDAScriptingProvider.pas',
+ uDAServerLog in 'uDAServerLog.pas',
+ uDADatasetProvider in 'uDADatasetProvider.pas',
+ uDAPoweredByDataAbstractButton in 'uDAPoweredByDataAbstractButton.pas',
+ SimpleLoginService_Impl in 'SimpleLoginService_Impl.pas',
+ DataAbstract3_Intf in 'DataAbstract3_Intf.pas',
+ DataAbstract3_Invk in 'DataAbstract3_Invk.pas',
+ DataAbstract3_Async in 'DataAbstract3_Async.pas',
+ DataAbstractService_Impl in 'DataAbstractService_Impl.pas' {DataAbstractService: TRORemoteDataModule},
+ MultiDbLoginService_Impl in 'MultiDbLoginService_Impl.pas',
+ BaseLoginService_Impl in 'BaseLoginService_Impl.pas' {BaseLoginService: TRORemoteDataModule},
+ DataAbstract4_Invk in 'DataAbstract4_Invk.pas',
+ DataAbstract4_Intf in 'DataAbstract4_Intf.pas',
+ DataAbstract4_Async in 'DataAbstract4_Async.pas',
+ uDARemoteDataAdapter in 'uDARemoteDataAdapter.pas',
+ uDACache in 'uDACache.pas',
+ uDARemoteDataAdapterRequests in 'uDARemoteDataAdapterRequests.pas',
+ uDADataStreamer in 'uDADataStreamer.pas',
+ uDADelta in 'uDADelta.pas',
+ uDADesigntimeCall in 'uDADesigntimeCall.pas',
+ uDAExceptions in 'uDAExceptions.pas',
+ uDASQL92Interfaces in 'uDASQL92Interfaces.pas',
+ uDABin2DataStreamer in 'uDABin2DataStreamer.pas',
+ uDAMemDataset in 'uDAMemDataset.pas',
+ uDAMemDataTable in 'uDAMemDataTable.pas',
+ uDAReconcileDialog in 'uDAReconcileDialog.pas' {ReconcileDialogForm},
+ uDAReconcileDialogDetails in 'uDAReconcileDialogDetails.pas',
+ uDADatasetWrapper in 'uDADatasetWrapper.pas',
+ uDADataTableReferenceCollection in 'uDADataTableReferenceCollection.pas',
+ uDAMySQLInterfaces in 'uDAMySQLInterfaces.pas',
+ uDASQLiteInterfaces in 'uDASQLiteInterfaces.pas',
+ uDAExpressionEvaluator in 'uDAExpressionEvaluator.pas',
+ uDASQL92QueryBuilder in 'uDASQL92QueryBuilder.pas',
+ uDAWhere in 'uDAWhere.pas',
+ uDARemoteCommand in 'uDARemoteCommand.pas',
+ uDAPostgresInterfaces in 'uDAPostgresInterfaces.pas',
+ uDAElevateDBInterfaces in 'uDAElevateDBInterfaces.pas',
+ uDADB2Interfaces in 'uDADB2Interfaces.pas',
+ uDASybaseInterfaces in 'uDASybaseInterfaces.pas',
+ MultiDbLoginServiceV5_Impl in 'MultiDbLoginServiceV5_Impl.pas',
+ //.31
+ uDAHETDriver in 'uDAHETDriver.pas',
+ uDAHETConnections in 'uDAHETConnections.pas',
+ //
+ uDAJSONDataStreamer in 'uDAJSONDataStreamer.pas',
+ uDALocalDataAdapter in 'uDALocalDataAdapter.pas',
+ uDADataAdapter in 'uDADataAdapter.pas',
+ uDALocalHelpers in 'uDALocalHelpers.pas',
+ uDALocalCommand in 'uDALocalCommand.pas';
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.res
new file mode 100644
index 0000000..8c3fa75
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.cfg
new file mode 100644
index 0000000..d9c7e92
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.cfg
@@ -0,0 +1,51 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\Dcu\D7"
+-LE"..\Dcu\D7"
+-LN"..\Dcu\D7"
+-U"..\Dcu\D7;..\Dcu\DevEx;..\..\RemObjects SDK for Delphi\Dcu\D7;..\..\Pascal Script\Dcu\D7"
+-O"..\Dcu\D7;..\Dcu\DevEx;..\..\RemObjects SDK for Delphi\Dcu\D7;..\..\Pascal Script\Dcu\D7"
+-I"..\Dcu\D7;..\Dcu\DevEx;..\..\RemObjects SDK for Delphi\Dcu\D7;..\..\Pascal Script\Dcu\D7"
+-R"..\Dcu\D7;..\Dcu\DevEx;..\..\RemObjects SDK for Delphi\Dcu\D7;..\..\Pascal Script\Dcu\D7"
+-DDESIGNTIME
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.dof
new file mode 100644
index 0000000..19785e8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Core Library
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\Dcu\D7
+PackageDLLOutputDir=..\Dcu\D7
+PackageDCPOutputDir=..\Dcu\D7
+SearchPath=..\Dcu\D7;..\Dcu\DevEx;..\..\RemObjects SDK for Delphi\Dcu\D7;..\..\Pascal Script\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=DESIGNTIME
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=3.0.0.286
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.dpk
new file mode 100644
index 0000000..ef48c51
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.dpk
@@ -0,0 +1,117 @@
+package DataAbstract_Core_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Core Library'}
+{$IMPLICITBUILD OFF}
+{$DEFINE DESIGNTIME}
+
+requires
+ RemObjects_Core_D7,
+ rtl,
+ vcl,
+ adortl,
+ dbrtl,
+ dsnap,
+ vcldb;
+
+contains
+ uDAInterfaces in 'uDAInterfaces.pas',
+ uDAInterfacesEx in 'uDAInterfacesEx.pas',
+ uDAClasses in 'uDAClasses.pas',
+ uDAHelpers in 'uDAHelpers.pas',
+ uDAEngine in 'uDAEngine.pas',
+ uDAUtils in 'uDAUtils.pas',
+ uDARes in 'uDARes.pas',
+ DataAbstract_Core_Reg in 'DataAbstract_Core_Reg.pas',
+ uDABinAdapter in 'uDABinAdapter.pas',
+ uDAXMLAdapter in 'uDAXMLAdapter.pas',
+ uDADriverManager in 'uDADriverManager.pas',
+ uDASupportClasses in 'uDASupportClasses.pas',
+ uDADataTable in 'uDADataTable.pas',
+ uDACDSDataTable in 'uDACDSDataTable.pas',
+ uDAADODataTable in 'uDAADODataTable.pas',
+ uDABusinessProcessor in 'uDABusinessProcessor.pas',
+ uDAIBInterfaces in 'uDAIBInterfaces.pas',
+ uDAOracleInterfaces in 'uDAOracleInterfaces.pas',
+ uDAADOInterfaces in 'uDAADOInterfaces.pas',
+ uDAMacroProcessors in 'uDAMacroProcessors.pas',
+ uDADBSessionManager in 'uDADBSessionManager.pas',
+ uDAMacros in 'uDAMacros.pas',
+ DALoginService_Impl in 'DALoginService_Impl.pas',
+ DARemoteService_Impl in 'DARemoteService_Impl.pas',
+ uDAXMLUtils in 'uDAXMLUtils.pas',
+ uDARegExpr in 'uDARegExpr.pas',
+ uDADriverInfo in 'uDADriverInfo.pas',
+ uDAPleaseWaitForm in 'uDAPleaseWaitForm.pas',
+ uDAClientDataModule in 'uDAClientDataModule.pas',
+ uDAScriptingProvider in 'uDAScriptingProvider.pas',
+ uDAServerLog in 'uDAServerLog.pas',
+ uDADatasetProvider in 'uDADatasetProvider.pas',
+ uDAPoweredByDataAbstractButton in 'uDAPoweredByDataAbstractButton.pas',
+ SimpleLoginService_Impl in 'SimpleLoginService_Impl.pas',
+ DataAbstract3_Intf in 'DataAbstract3_Intf.pas',
+ DataAbstract3_Invk in 'DataAbstract3_Invk.pas',
+ DataAbstract3_Async in 'DataAbstract3_Async.pas',
+ DataAbstractService_Impl in 'DataAbstractService_Impl.pas' {DataAbstractService: TRORemoteDataModule},
+ MultiDbLoginService_Impl in 'MultiDbLoginService_Impl.pas',
+ BaseLoginService_Impl in 'BaseLoginService_Impl.pas' {BaseLoginService: TRORemoteDataModule},
+ DataAbstract4_Invk in 'DataAbstract4_Invk.pas',
+ DataAbstract4_Intf in 'DataAbstract4_Intf.pas',
+ DataAbstract4_Async in 'DataAbstract4_Async.pas',
+ uDARemoteDataAdapter in 'uDARemoteDataAdapter.pas',
+ uDACache in 'uDACache.pas',
+ uDARemoteDataAdapterRequests in 'uDARemoteDataAdapterRequests.pas',
+ uDADataStreamer in 'uDADataStreamer.pas',
+ uDADelta in 'uDADelta.pas',
+ uDADesigntimeCall in 'uDADesigntimeCall.pas',
+ uDAExceptions in 'uDAExceptions.pas',
+ uDASQL92Interfaces in 'uDASQL92Interfaces.pas',
+ uDABin2DataStreamer in 'uDABin2DataStreamer.pas',
+ uDAMemDataset in 'uDAMemDataset.pas',
+ uDAMemDataTable in 'uDAMemDataTable.pas',
+ uDAReconcileDialog in 'uDAReconcileDialog.pas' {ReconcileDialogForm},
+ uDAReconcileDialogDetails in 'uDAReconcileDialogDetails.pas',
+ uDADatasetWrapper in 'uDADatasetWrapper.pas',
+ uDADataTableReferenceCollection in 'uDADataTableReferenceCollection.pas',
+ uDAMySQLInterfaces in 'uDAMySQLInterfaces.pas',
+ uDASQLiteInterfaces in 'uDASQLiteInterfaces.pas',
+ uDAExpressionEvaluator in 'uDAExpressionEvaluator.pas',
+ uDASQL92QueryBuilder in 'uDASQL92QueryBuilder.pas',
+ uDAWhere in 'uDAWhere.pas',
+ uDARemoteCommand in 'uDARemoteCommand.pas',
+ uDAPostgresInterfaces in 'uDAPostgresInterfaces.pas',
+ uDAElevateDBInterfaces in 'uDAElevateDBInterfaces.pas',
+ uDADB2Interfaces in 'uDADB2Interfaces.pas',
+ uDASybaseInterfaces in 'uDASybaseInterfaces.pas',
+ MultiDbLoginServiceV5_Impl in 'MultiDbLoginServiceV5_Impl.pas',
+ //.31
+ uDAHETDriver in 'uDAHETDriver.pas',
+ uDAHETConnections in 'uDAHETConnections.pas',
+ //
+ uDAJSONDataStreamer in 'uDAJSONDataStreamer.pas',
+ uDALocalDataAdapter in 'uDALocalDataAdapter.pas',
+ uDADataAdapter in 'uDADataAdapter.pas',
+ uDALocalHelpers in 'uDALocalHelpers.pas',
+ uDALocalCommand in 'uDALocalCommand.pas';
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Glyphs.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Glyphs.lrs
new file mode 100644
index 0000000..881fc96
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Glyphs.lrs
@@ -0,0 +1,1856 @@
+LazarusResources.Add('TDABIN2DATASTREAMER','BMP',[
+ 'BM'#248#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#194#6#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#142']'
+ +'Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#225#189#255#221#181#255#217#172#255
+ +#213#165#255#211#157#255#207#151#255#203#145#255#201#140#255#199#135#128'PK'
+ +#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0
+ +#0#255#231#203#0#0#0#0#0#0#255#220#178#255#216#171#0#0#0#0#0#0#0#0#0#255#203
+ +#143#128'PK'#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#255#255
+ +#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0#0#255
+ +#238#217#0#0#0#255#230#199#0#0#0#255#221#182#0#0#0#255#215#166#255#211#159
+ +#255#207#152#128'PK'#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128
+ +#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0'@'#0#0
+ +#255#243#229#0#0#0#0#0#0#255#233#204#255#229#197#255#224#187#0#0#0#255#216
+ +#171#255#213#165#128'PK'#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128
+ +#0#0'@'#0#0#255#250#242#0#0#0#255#242#225#0#0#0#255#234#209#255#231#203#255
+ +#227#193#0#0#0#255#218#176#128'PK'#128#0#0#255#255#255#128#0#0#128#0#0#128#0
+ +#0#255#255#255#255#255#255#255#255#255#128#0#0#128#0#0#255#255#255#255#255
+ +#255#128#0#0'@'#0#0#255#254#250#0#0#0#0#0#0#255#244#231#255#240#222#0#0#0#0#0
+ +#0#255#229#198#255#225#189#128'PK'#128#0#0#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#128#0#0'@'#0#0#255#255#255#255#254#252#255#252#247
+ +#255#250#242#255#246#235#255#243#227#255#239#220#255#235#211#255#231#203#128
+ +'PK'#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#254#250#255#251#246#255#248#239#255#244#231#255#242#225#255#238#217
+ +#128'PKHJK'#201#194#201#7'9z'#7'9z'#7'9z='#154#242'5'#149#239'-'#140#239#7'9'
+ +'z'#7'9z'#7'9zyyy'#194#140'm'#255#255#255#255#255#255#255#255#255#137#167#199
+ +#7'9z'#137#167#199#255#252#248#247#240#235#226#218#209#226#216#204'{MIHJK'
+ +#206#199#204#191#184#192#7'9z@'#157#242'@'#157#242'@'#157#242'9'#152#240'2'
+ +#145#239#7'9zE_{yyy'#203#147'o'#255#255#255#255#255#255#137#167#199#7'9z'#15
+ +'s'#233#7'9z'#137#167#199#234#233#230#182#180#176#182#177#171'uIEHJK'#209#202
+ +#209#194#188#194'h'#129#163#7'9z@'#157#242'@'#157#242'@'#157#242#7'9zE_{{{{y'
+ +'yy'#209#153'r'#255#255#255#137#167#199#7'9z'#15's'#233#15's'#233#15's'#233#7
+ +'9zURf'#160'g['#160'g['#149'\KHJK'#213#207#213#197#191#197#194#188#194'Qk'
+ +#138#7'9z@'#157#242#7'9zId'#128'yzzyyyyyy'#216#159'u'#137#167#199#7'9z'#27'}'
+ +#235#22'y'#234#18'u'#233#15's'#233#15's'#233#7'9z'#254#176'J'#240#145','#225
+ +#132'.HJK'#217#213#217#201#196#202#199#192#198#150#146#152'0Kf'#7'9z,D^'#137
+ +#137#137#127#127#127#130#130#131'yyy'#220#163'v'#7'9z'#7'9z'#7'9z'#31#130#235
+ +#27'}'#235#22'y'#234#7'9z'#7'9z'#7'9z'#218#152'c'#255#0#255'HJK'#225#218#224
+ +#207#201#206#199#192#198#151#150#153'UWX'#175#175#177'JLM'#137#137#137#128
+ +#128#128#132#132#132#127#127#127#220#163'v'#209#146'm'#209#146'm'#7'9z-'#140
+ +#239'%'#135#238#31#130#237#7'9zXTh'#212#154's'#255#0#255#255#0#255'HJK'#231
+ +#226#230#212#207#211#225#218#224#152#149#152'UWX'#176#175#177'LNO'#150#149
+ +#149#132#131#131'vvvyyy'#143#143#143#131#132#132'*C]'#7'9z7'#150#240'2'#146
+ +#240#7'9z'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'HJK'#239#235#239
+ +#235#233#235#198#197#199#160#157#161'UWX'#164#165#167';=>'#130#130#131#137
+ +#137#137#143#143#143#137#137#137#147#147#147'Id'#128#7'9z@'#157#242'@'#157
+ +#242'='#154#242#7'9z'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'HJK'
+ +#238#237#238#178#177#180#156#153#156#159#158#161'RTU'#235#235#237'ossY[Z'#7
+ +'9z'#7'9z'#7'9z'#7'9z'#7'9z@'#157#242'@'#157#242#7'9z'#7'9z'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255'HJK'#237#235#237#129#129#130#213
+ +#209#212#207#207#208'`cdprrxy{'#138#142#140#171#172#172'Xt'#146#7'9z'#7'9z'#7
+ +'9z'#7'9z'#7'9z'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255'HJK'#251#251#252#204#204#204#254#254#254#227#227#230#186
+ +#184#188#151#149#152#136#134#137'xy{rssfihehi'#150#152#153#150#152#153'HJK'
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255'HJK'#255#255#255#251#251#252#238#238#242#237#238#240#231#230
+ +#233#217#213#217#196#192#196#172#170#172#151#145#151#136#131#136#150#142#146
+ +#136#129#131'HJK'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255'HJK'#255#255#255#255#255#255#246#246
+ ,#248#248#247#251#237#237#239#226#226#229#209#207#212#194#191#196#193#187#193
+ +#167#159#165'HJKHJK'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'HJKHJK'#255
+ +#255#255#255#255#255#255#255#255#240#239#243#229#225#230#203#197#203'HJKHJK'
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255'LNOHJKHJKHJKHJKHJK'#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#0#0
+]);
+LazarusResources.Add('TDABINDATASTREAMER','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#142']'
+ +'Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#225#189#255#221#181#255#217#172#255
+ +#213#165#255#211#157#255#207#151#255#203#145#255#201#140#255#199#135#128'PK'
+ +#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0
+ +#0#255#231#203#255#227#194#255#224#187#255#220#178#255#216#171#0#0#0#0#0#0
+ +#255#206#149#255#203#143#128'PK'#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0
+ +#255#255#255#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255
+ +#128#0#0'@'#0#0#255#238#217#255#233#208#255#230#199#255#226#191#255#221#182#0
+ +#0#0#255#215#166#0#0#0#255#207#152#128'PK'#128#0#0#255#255#255#128#0#0#255
+ +#255#255#255#255#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255
+ +#255#255#128#0#0'@'#0#0#255#243#229#255#240#222#255#235#213#255#233#204#255
+ +#229#197#0#0#0#0#0#0#255#216#171#255#213#165#128'PK'#128#0#0#255#255#255#128
+ +#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255
+ +#255#128#0#0#255#255#255#128#0#0'@'#0#0#7'9z'#255#246#233#255#242#225#255#238
+ +#218#255#234#209#0#0#0#255#227#193#0#0#0#255#218#176#128'PK'#128#0#0#255#255
+ +#255#128#0#0#128#0#0#128#0#0#255#255#255#255#255#255#255#255#255#128#0#0#128
+ +#0#0#255#255#255#255#255#255#128#0#0'@'#0#0#255#254#250#255#250#244#255#248
+ +#239#255#244#231#255#240#222#0#0#0#0#0#0#255#229#198#255#225#189#128'PK'#128
+ +#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0
+ +#255#255#255#255#254#252#255#252#247#255#250#242#255#246#235#255#243#227#255
+ +#239#220#255#235#211#255#231#203#128'PK'#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#254#250#255#251#246#255#248#239
+ +#255#244#231#255#242#225#255#238#217#128'PKHJK'#201#194#201#7'9z'#7'9z'#7'9z'
+ +'='#154#242'5'#149#239'-'#140#239#7'9z'#7'9z'#7'9zyyy'#194#140'm'#255#255#255
+ +#255#255#255#255#255#255#137#167#199#7'9z'#137#167#199#255#252#248#247#240
+ +#235#226#218#209#226#216#204'{MIHJK'#206#199#204#191#184#192#7'9z@'#157#242
+ +'@'#157#242'@'#157#242'9'#152#240'2'#145#239#7'9zE_{yyy'#203#147'o'#255#255
+ +#255#255#255#255#137#167#199#7'9z'#15's'#233#7'9z'#137#167#199#234#233#230
+ +#182#180#176#182#177#171'uIEHJK'#209#202#209#194#188#194'h'#129#163#7'9z@'
+ +#157#242'@'#157#242'@'#157#242#7'9zE_{{{{yyy'#209#153'r'#255#255#255#137#167
+ +#199#7'9z'#15's'#233#15's'#233#15's'#233#7'9zURf'#160'g['#160'g['#149'\KHJK'
+ +#213#207#213#197#191#197#194#188#194'Qk'#138#7'9z@'#157#242#7'9zId'#128'yzzy'
+ +'yyyyy'#216#159'u'#137#167#199#7'9z'#27'}'#235#22'y'#234#18'u'#233#15's'#233
+ +#15's'#233#7'9z'#254#176'J'#240#145','#225#132'.HJK'#217#213#217#201#196#202
+ +#199#192#198#150#146#152'0Kf'#7'9z,D^'#137#137#137#127#127#127#130#130#131'y'
+ +'yy'#220#163'v'#7'9z'#7'9z'#7'9z'#31#130#235#27'}'#235#22'y'#234#7'9z'#7'9z'
+ +#7'9z'#218#152'c'#255#0#255'HJK'#225#218#224#207#201#206#199#192#198#151#150
+ +#153'UWX'#175#175#177'JLM'#137#137#137#128#128#128#132#132#132#127#127#127
+ +#220#163'v'#209#146'm'#209#146'm'#7'9z-'#140#239'%'#135#238#31#130#237#7'9zX'
+ +'Th'#212#154's'#255#0#255#255#0#255'HJK'#231#226#230#212#207#211#225#218#224
+ +#152#149#152'UWX'#176#175#177'LNO'#150#149#149#132#131#131'vvvyyy'#143#143
+ +#143#131#132#132'*C]'#7'9z7'#150#240'2'#146#240#7'9z'#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255'HJK'#239#235#239#235#233#235#198#197#199#160#157
+ +#161'UWX'#164#165#167';=>'#130#130#131#137#137#137#143#143#143#137#137#137
+ +#147#147#147'Id'#128#7'9z@'#157#242'@'#157#242'='#154#242#7'9z'#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255'HJK'#238#237#238#178#177#180#156#153#156
+ +#159#158#161'RTU'#235#235#237'ossY[Z'#7'9z'#7'9z'#7'9z'#7'9z'#7'9z@'#157#242
+ +'@'#157#242#7'9z'#7'9z'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255'HJK'#237#235#237#129#129#130#213#209#212#207#207#208'`cdprrxy{'#138
+ +#142#140#171#172#172'Xt'#146#7'9z'#7'9z'#7'9z'#7'9z'#7'9z'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'HJK'#251#251
+ +#252#204#204#204#254#254#254#227#227#230#186#184#188#151#149#152#136#134#137
+ +'xy{rssfihehi'#150#152#153#150#152#153'HJK'#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'HJK'#255#255#255#251
+ +#251#252#238#238#242#237#238#240#231#230#233#217#213#217#196#192#196#172#170
+ +#172#151#145#151#136#131#136#150#142#146#136#129#131'HJK'#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ ,#255'HJK'#255#255#255#255#255#255#246#246#248#248#247#251#237#237#239#226#226
+ +#229#209#207#212#194#191#196#193#187#193#167#159#165'HJKHJK'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255'HJKHJK'#255#255#255#255#255#255#255#255#255
+ +#240#239#243#229#225#230#203#197#203'HJKHJK'#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'LNOHJKHJKHJKHJKHJK'
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+]);
+LazarusResources.Add('TDABUSINESSPROCESSOR','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0
+ +'@'#0#0#255#0#255#1#3#132#1#1'z'#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255
+ +#255#255#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128
+ +#0#0'@'#0#0#1#6#140#3#19#202#2#10#171#1#1'z'#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255
+ +#255#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128
+ +#0#0'@'#0#0#2#29#218#2#25#216#3#20#207#2#10#171#1#1'z'#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255
+ +#255#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255
+ +#255#128#0#0'@'#0#0#1'%'#234#2#31#225#2#25#216#3#20#207#2#10#171#1#1'z'#255#0
+ +#255#255#0#255#255#0#255#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0
+ +#0#255#255#255#255#255#255#255#255#255#128#0#0#128#0#0#255#255#255#255#255
+ +#255#128#0#0'@'#0#0#128#149#248'1N'#237#2#31#225#2#25#216#3#20#207#2#10#171#1
+ +#1'z'#255#0#255#255#0#255#255#0#255#128#0#0#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#128#0#0'@'#0#0#255#255#255#144#162#248#1'%'#234#2#31
+ +#225#2#25#216#3#20#207#2#10#171#1#1'z'#255#0#255#255#0#255#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#128#0#0#255#255#255#225#231#255#239#242#254#17'8'#243#1'%'#234#2#31#225
+ +#2#25#216#3#20#207#2#10#171#1#1'z'#255#0#255#255#0#255#7#141#187'v'#223#233
+ +#131#248#254'`'#236#254'<'#224#254#27#210#251'+'#203#239#14#22#147'7d'#247'2'
+ +'b'#255')Z'#255#159#181#255'n'#141#255'Lr'#255#255#255#255#175#190#253#1'+'
+ +#243#1'%'#234#2#31#225#2#25#216#3#20#207#2#10#171#1#1'z'#255#0#255#7#141#187
+ +'v'#223#233#151#249#254#147#242#254#149#238#254#157#235#253#176#233#247#23'&'
+ +#164'Ds'#255';k'#255'2b'#255')Z'#255' Q'#255#23'I'#255#151#173#255#255#255
+ +#255'`}'#252#1'+'#243#1'%'#234#2#31#225#2#25#216#3#19#202#1#3#132#255#0#255#7
+ +#141#187#180#238#243#188#242#248#138#218#235'Y'#194#221'2'#170#206'"'#154#192
+ +#28'I'#158#28'.'#172'Ds'#255';k'#255'2b'#255')Z'#255' Q'#255'&U'#255#211#220
+ +#255#255#255#255#175#190#253'@`'#245#1'%'#234#2#29#218#1#6#140#255#0#255#255
+ +#0#255#9#138#183'o'#194#214'?'#176#203'='#189#218'/'#198#231#25#199#241','
+ +#210#248'S'#220#251'CO'#157#28'.'#172'Ds'#255';k'#255'2b'#255')Z'#255' Q'#255
+ +'&U'#255#151#173#255#255#255#255#207#216#254#1')'#235#1#8#143#255#0#255#255#0
+ +#255#255#0#255#11#134#178'Y'#196#215#128#245#252'`'#236#254'<'#224#254#27#212
+ +#254'.'#216#254'U'#223#254'z'#229#252#28'9'#141#28'.'#172'Ds'#255';k'#255'2b'
+ +#255')Z'#255' Q'#255#23'I'#255'-Y'#255'5Z'#247#1#10#146#255#0#255#255#0#255
+ +#255#0#255#255#0#255#7#140#186'v'#223#233#131#248#254'`'#236#254'<'#224#254
+ +#27#212#254'.'#216#254'U'#224#255'{'#231#254'v'#200#220#27'<'#145#28'.'#172
+ +'Ds'#255';k'#255'2b'#255')Z'#255' Q'#255#22'E'#247#4#13#147#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#7#141#187'v'#223#233#131#248#254'`'#236
+ +#254'<'#224#254#27#212#254'.'#216#254'U'#224#255'{'#232#255#144#227#244'c'
+ +#194#217#19';'#146#28'.'#172'Ds'#255';k'#255'2b'#255'''T'#247#7#16#147#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#7#141#187'v'#223#233
+ +#131#248#254'`'#236#254'<'#224#254#27#212#254'.'#216#254'U'#224#255'{'#232
+ +#255#149#235#253'h'#205#230'4'#168#203#4'3'#142#28'.'#172'Ds'#255'7d'#247#10
+ +#19#147#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#7#141#187'v'#223#233#131#248#254'`'#236#254'<'#224#254#27#212#254'.'#216#254
+ +'U'#224#255'{'#232#255#149#235#253'l'#212#238'7'#178#214#9#145#190#2'0'#139
+ +#23'&'#164#14#22#147#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#7#141#187'v'#223#233#131#248#254'`'#236#254'<'#224
+ +#254#27#212#254'.'#216#254'U'#224#255'{'#232#255#149#235#253'l'#212#238'9'
+ +#184#222#10#153#201#4#138#184#13'v'#157#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#7#141#187'}'#223#233
+ +#173#251#254#179#249#255#168#249#254#170#255#254#154#255#254#153#255#254#153
+ +#255#254#153#255#254#143#246#251'k'#227#244')'#187#224#4#145#194#14'}'#167
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ ,#255#255#0#255#7#141#187#195#223#234#250#255#255#229#255#255#207#255#255#185
+ +#255#254#164#255#254#153#255#254#153#255#254#153#255#254#153#255#254#148#253
+ +#254'q'#242#254'>'#205#233#14#128#170#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#7#141#187'h'#176#202#240
+ +#247#250#245#255#255#223#255#255#201#255#254#179#255#254#158#255#254#153#255
+ +#254#153#255#254#153#255#254#153#255#254#132#243#249'0'#170#202#14#128#170
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#7#141#187#14#145#190'|'#192#213'|'#192#213#164#223
+ +#234#148#223#233#131#223#233'w'#223#233'v'#223#233'T'#192#212'T'#192#212#23
+ +#136#175#14#128#170#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#7
+ +#141#187#7#141#187#7#141#187#7#141#187#7#141#187#7#141#187#7#141#187#7#141
+ +#187#7#141#187#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+]);
+LazarusResources.Add('TDACACHE','BMP',[
+ 'BMv'#6#0#0#0#0#0#0'6'#4#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#8#0#0#0#0#0'@'#2#0
+ +#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#0#255#0#254
+ +#252#252#0#136']O'#0#150'5'#17#0#254#251#250#0#165'N+'#0#172'[9'#0#180'iI'#0
+ +#254#252#251#0#152'D'#16#0#254#248#244#0#189'X'#12#0#254#247#242#0#254#248
+ +#243#0#233#127#30#0#254#244#235#0#254#221#187#0#254#230#206#0#254#246#238#0
+ +#254#247#240#0#254#248#242#0#254#250#246#0#254#251#248#0#254#252#250#0#202'h'
+ +#0#0#254#211#165#0#254#215#171#0#254#217#176#0#254#217#177#0#254#217#178#0
+ +#254#218#180#0#254#220#184#0#254#221#184#0#254#222#188#0#254#224#191#0#254
+ +#224#192#0#254#224#193#0#254#225#193#0#254#226#196#0#254#227#197#0#254#227
+ +#198#0#254#229#202#0#254#234#213#0#254#235#215#0#254#238#220#0#254#244#233#0
+ +#206'r'#8#0#207'u'#11#0#208'z'#17#0#209'}'#21#0#211#127#24#0#212#130#28#0#254
+ +#226#194#0#254#229#199#0#254#233#208#0#254#239#222#0#254#243#230#0#254#247
+ +#239#0#215#138'('#0#216#140'+'#0#217#146'4'#0#254#242#226#0#254#242#227#0#254
+ +#247#238#0#254#251#247#0#254#246#235#0#254#250#244#0#192#182#165#0#147'x@'#0
+ +#128'pC'#0#254#254#251#0#254#254#252#0#192#193#187#0#164#166#159#0'=TS'#0'g'
+ +#255#252#0'd'#254#254#0'e'#254#254#0'f'#255#254#0'g'#255#254#0'j'#255#254#0
+ +#172#182#182#0'\'#250#254#0'['#238#243#0'`'#251#254#0'b'#251#254#0'T'#246#254
+ +#0'T'#221#227#0'K'#240#254#0'P'#243#254#0#135#149#150#0'?'#234#254#0'G'#238
+ +#254#0'6'#229#254#0';'#231#254#0','#222#254#0'/'#224#254#0'%'#217#254#0')'
+ +#218#254#0'('#207#243#0'/'#182#211#0'-'#173#201#0#31#212#254#0#20#203#255#0
+ +#21#204#255#0#25#207#255#0'%'#149#181#0'.MV'#0#135#150#154#0#5#187#255#0#10
+ +#192#255#0#12#194#255#0#12#186#244#0#25#142#181#0#31#136#171#0#3#183#255#0#9
+ +#171#233#0#11#156#212#0#24'z'#163#0'u'#138#146#0#0#175#255#0#0#176#255#0#1
+ +#176#255#0#1#177#255#0#1#167#244#0#2#177#255#0#0#171#255#0#0#173#255#0#0#164
+ +#244#0#0#156#233#0#1#165#244#0#1#157#233#0#1#140#212#0#3#144#212#0#6'u'#173#0
+ +#12'c'#144#0#0#136#212#0#0#137#212#0#0#138#212#0#2'v'#182#0#3'p'#173#0#6'd'
+ +#154#0#10'Ow'#0'6z'#160#0#135#158#171#0#0'p'#182#0#3'V'#138#0#4'W'#138#0#10
+ +'\'#143#0#18'\'#137#0')r'#157#0#0'h'#173#0#1'S'#138#0#1'Q'#137#0#1'R'#137#0#2
+ +'T'#138#0#3'Iz'#0#4'P'#132#0#8'Q'#132#0#9'S'#134#0#10'X'#138#0#12'V'#136#0#14
+ +'Y'#139#0#16'Z'#138#0#19'^'#143#0'.m'#150#0'Uw'#143#0'u'#146#165#0#0'Y'#154#0
+ +#0'R'#145#0#0'N'#134#0#0'J'#130#0#0'K'#130#0#0'L'#130#0#0'F{'#0#1'L'#129#0#2
+ +'N'#132#0#2'J}'#0#8'R'#135#0#128#161#186#0#8'Dw'#0#6'Au'#0#0'2h'#0'7G['#0'GL'
+ +'X'#0#254#254#254#0#220#220#220#0#255#255#255#0#0#0#0#0#0#1#0#0#151' '#206#2
+ +#22#0#0#0#0#255#255#255#0#0#0#0#1#0#0#0#165'D'#203#2#244#2#0#0#0#255#255#255
+ +#1#0#0#0'#'#228#201#2#12'\'#18#0#0#255#255#255#1#0#0#0#0#0#0#0#128'4'#233#2
+ +'dm'#18#0#0#133#230#0#176#0#0#0'>'#0#0#0#0#0#174#1#200'X'#18#0#0#0#0#0#24'['
+ +#18#0#24#238#144'|'#240#6#145'|'#255#255#255#255#235#6#145'|'#201#195#194'w'
+ +#0#0#174#1#0#0#0#0#206#195#194'w'#18#0#0#16#20'y'#23#0#24'y'#23#0#0#0#255#255
+ +#255#0#255#0#252'Z'#18#0#252#0#136']Xm'#18#0#148'\'#195'w'#136' '#193'w'#255
+ +#255#255#255#206#195#194'w'#231#195#194'w'#168#0#0#0'D['#18#0'.'#196#194'w'
+ +#168#0#0#0#15'"'#206#2#16#131#23#0#172#207#203#2#16#131#23#0#172'['#18#0'`'
+ +#154#174#1'dm'#18#0#0#0#0#0'('#181#232#2#2#0#0#0#2#232#201#2#18#0#0#16#20#0#0
+ +#0#156#237#227#2'}'#4#0#0'`'#154#174#1#2#210#210#210#210#210#210#210#210#210
+ +#210#210#210#210#174#174#174#174#174#174#174#2#2#2#254#254#254#254#254#254
+ +#254#254#254#254#254#254#254#210#129#129#127#127#127#127#134#174#2#2#254#1#1
+ +#1#1#1#1#1#1#1#1#1#254#210#140#140#140#140#131#127#127#132#174#2#254#1#254
+ +#254#254#1#1#254#1#1#254#1#254#210#184#184#180#184#184#170#127#127#134#174
+ +#254#1#254#1#1#254#1#254#254#254#254#1#254#210#4#176#180#8#9#186#147#127#127
+ +#174#254#1#254#1#1#254#1#254#1#1#254#1#254#210#174'r'#180'3'#27'E'#171#127
+ +#127#174#254#1#254#254#254#1#1#1#254#254#1#1#254#210'rr'#180'5 \'#153#129#129
+ +#174#254#1#1#1#1#1#1#1#1#1#1#1#254#210'kk'#180'Fy'#183#132#129#131#174#254
+ +#254#254#254#254#254#254#254#254#254#254#254#254'_dd'#136#142#141#132#128#129
+ +#174#2#5#187#187#187#6'L'#178'RQQQQTZ`ahjqo'#127#159#185#2#5#187#187#187#187
+ +'>'#181#167#150#149#149'WQW[W'#149#154#154#154#166'K'#9#2#5#187#187#187#187
+ +'3'#187#23#23#14';'#158'WQOW'#180'>(($#'#7#2#5#26#26#26#26#26#26'001=>'#158
+ +'WQW'#144'5000'#26#5#2#5#187#187#187#187#26#187#187#187#23#23'<;'#180'WW'#163
+ +'3(# '#28#5#2#5#187#187#187#187#26#187#187#187#187#187#26#23#14#164'W'#165'3'
+ +'7(# '#5#2#5#187#187#187#187#26#187#187#187#187#187#26#23#23#14#166#145'38+('
+ +'#'#5#2#5#26#26#26#26#26#26#26#26#26#26#26#26#26'1222'#26#26#26#26#5#2#5#187
+ +#187#187#187#26#187#187#187#187#187#26#187'I'#24#12';'#26'?.,'#19#5#2#5#187
+ +#187#187#187#26#187#187#187#187#187#26#187#187#187#25#23#26#17'@9-'#5#2#5#188
+ +#188#188#188#26#188#188#188#188#188#26#188#188#188#188#188#26#188#188#188#188
+ +#5#2#5#11#11#11#11#11#11#11#11#11#11#11#11#11#11#11#11#11#11#11#11#11#5#2#13
+ +#16#16#16#16#16#16#16#16#16#16#16#16#16#16#16#16#16#16#16#16#16#13#2#2#13#13
+ ,#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#2#2#2#2#2#2#2#2#2#2
+ +#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2
+]);
+LazarusResources.Add('TDACONNECTIONMANAGER','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0'M'#194#11
+ +'c'#221#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#0'M'#194#0'M'#194#3'S'#202#7'\'#213#0'M'#194#128#0#0
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#0'M'#194#12'e'#217#17'n'#217#0'M'#194#0'M'
+ +#194#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#255
+ +#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0#0
+ +#255#0#255#255#0#255#255#0#255#0'M'#194#10'c'#217'9'#166#255','#147#255#7'\'
+ +#213#0'M'#194#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#255#0#255#255#0#255#0'M'#194#10'c'#217#29#128#231'0'#154#255#24'w'#243#1
+ +'P'#198#255#0#255#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255
+ +#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255
+ +#128#0#0'@'#0#0#0'M'#194#0'M'#194#10'c'#217'&'#140#243'0'#154#255#13'h'#225#1
+ +'P'#198#255#0#255#255#0#255#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128
+ +#0#0#255#255#255#255#255#255#255#255#255#128#0#0#128#0#0#255#255#255#255#255
+ +#255#128#0#0'@'#0#0'C'#178#255'A'#177#255'4'#159#255#0'M'#194#24'w'#243#0'M'
+ +#194#255#0#255#255#0#255#255#0#255#255#0#255#128#0#0#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#128#0#0'@'#0#0'C'#180#255'6'#161#255'('#143
+ +#255#31#130#255#0'M'#194#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#128#0#0#128#0#0#128#0#0#3'S'#198'+'#146#243'*'#146#255' '#131#255#31#129
+ +#255#0'M'#194#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3'Z'#5#8's'#21#3'^'#8#0'Lh'#2
+ +'Q'#198'-'#150#243'F'#183#255' '#131#231#2'Q'#198#25'y'#243#31#129#255#31#129
+ +#255#0'M'#194#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#3'Z'#5#5'e'#12#31#189'M%'#196'R'#6'e'#12
+ +#0'Lc'#3'S'#198'.'#152#243'.'#152#255#19'p'#231#1'P'#198#19'p'#235#31#129#255
+ +#0'M'#194#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#3'Z'#5#3'Z'#5#22#153'08'#227'l?'#233'o'#6
+ +'e'#10#0'L9'#2'Q'#198#28'}'#243#31#129#255#17'm'#231#0'M'#194#17'm'#231#0'M'
+ +#194#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#3'Z'#5#7#138#19#3'Z'#5'$'#175'A7'#226'_'#31
+ +#188'7'#2'['#3#0'L5'#1'P'#198#24'w'#243#31#129#255#17'm'#231#0'M'#194#0'M'
+ +#194#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#3'Z'#5#18#169'.'#19#160'2'#3'Z'#5#17#146#31#15
+ +#165#27#3#135#5#0'U'#0#0'L5'#1'P'#198#24'w'#243#28'~'#251#3'S'#202#0'M'#194
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#3'Z'#5#27#182'C'#24#175'='#13#140'!'#3'Z'#5#1'r'#2#0
+ +#129#0#0'~'#0#0'U'#0#0'L5'#1'P'#198#4'V'#206#0'M'#194#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#3'Z'#5#24#172';'#17#156')'#11#139#25#4'r'#9#3'Z'#5#0'i'#0#0#129#0
+ +#0'~'#0#0'['#0#0'L5'#0'M'#194#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3
+ +'Z'#5#16#154'('#10#137#24#5'y'#10#1'l'#2#1'd'#1#3'Z'#5#0'^'#0#0'~'#0#0'U'#0#0
+ +'K'#0#255#0#255#0#189#255#0#189#255#0#189#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3'Z'#5#12#137#29#0'K'#0#4
+ +'w'#9#1'l'#2#1'j'#1#1'j'#1#1'd'#1#0'K'#0#0'N'#0#0'K'#0#255#0#255#7#233#231#7
+ +#233#231#7#233#231#0#189#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#3'Z'#5#15#128#29'-'#212'N'#3'm'#6#0'K'#0#0'K'#0#0'K'
+ +#0#0'K'#0#0'K'#0#0'K'#0#0'K'#0#255#0#255#255#0#255#255#0#255#255#0#255#7#233
+ +#231#0#189#255#0#189#255#0#189#255#255#0#255#255#0#255#255#0#255#255#0#255#3
+ +'Z'#5#31#166':-'#212'N'#3'v'#5#0'M'#0#0'K'#0#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#7#233
+ +#231#7#233#231#7#233#231#255#0#255#255#0#255#255#0#255#255#0#255#3'Z'#5#9'n'
+ +#17'('#206'G'#3#140#6#0'^'#0#0'K'#0#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0'K'#0#0'K'
+ ,#0#0'`'#1#0'^'#0#0'K'#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3'Z'#5#6'l'#16#2'X'#5#0'K'
+ +#0#0'K'#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#10'y'#25#3'Z'#5
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+]);
+LazarusResources.Add('TDADBSESSIONMANAGER','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@@@@@@@@@@@@@@@@@@@'
+ +'@@@@@@@@@@@@@@@@@'#0'Z'#0#0'Z'#0#0'Z'#0#0'Z'#0#0'Z'#0#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255'@'#0#192'@'#0#192'@'#0#192'@'#0#192
+ +'@'#0#192'@'#0#192'@'#0#192'@'#0#192'@'#0#192'@'#0#192'@'#0#192'@'#0#192'@@@'
+ +#3#143#10#17#172'.'#22#175'2'#13#146#15#0#127#0#0'Z'#0#0'Z'#0#255#0#255#255#0
+ +#255#255#0#255#255#0#255'@'#0#192#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +'@'#0#192'@@@'#31#189'L'#23#186'K'#15#147#19#140#226#140#17#144#19#0'z'#0#0
+ +']'#0'n-'#19'n-'#19#255#0#255#255#0#255'@'#0#192#255#255#255'@'#0#192#255#255
+ +#255'@'#0#192#255#255#255#255#255#255'@'#0#192'@'#0#192#255#255#255#255#255
+ +#255'@'#0#192'@@@"'#202'Y'#15#147#19'p'#211'j'#255#240#239#30#157'"'#7#147#24
+ +#0'\'#0#244'[A'#248'J6n-'#19'n-'#19'@'#0#192#255#255#255'@'#0#192'@'#0#192
+ +#255#255#255#255#255#255'@'#0#192#255#255#255#255#255#255'@'#0#192#255#255
+ +#255'@'#0#192'@@@'#23#178'='#15#147#19#160#199#188#251#252#252#25#164'$'#12
+ +#150'%'#0'Z'#1#237#156#136#234#136't'#225'@#n-'#19'@'#0#192#255#255#255'@'#0
+ +#192#255#255#255'@'#0#192#255#255#255'@'#0#192#255#255#255#255#255#255'@'#0
+ +#192#255#255#255'@'#0#192'@@@'#12')'#24'1X~.X'#146'5i'#130#17#135'8'#0'Z'#0
+ +#184'A'#23#255#240#239#226#176#154#212'C'#31'n-'#19'@'#0#192#255#255#255'@'#0
+ +#192'@'#0#192'@'#0#192#255#255#255#255#255#255'@'#0#192'@'#0#192#255#255#255
+ +#255#255#255'@'#0#192'@@@'#9#17'?'#7')'#154#5'('#149#2#29#143#2#29#143#184'A'
+ +#23#233#161#140#251#252#252#229#160#136#226'U-n-'#19'@'#0#192#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255'@'#0#192'@@@'#14'?'#167#13'A'#181#13'?'#172#14
+ +'@'#175#2#28#145#134'wwZ'#135#153'W'#131#143#149'hR'#181'2'#21#255#0#255'@'#0
+ +#192'@'#0#192'@'#0#192'@'#0#192'@'#0#192'@'#0#192'@'#0#192'@'#0#192'@'#0#192
+ +'@'#0#192'@'#0#192'@'#0#192#10#28'='#18'T'#213#16'M'#198#17'M'#197#17'M'#197
+ +#17'L'#203#17'W'#139#9'_'#194#4'W'#193#11'n'#154#13#13#13'uuu~~~YYYEuM*'#194
+ +'?;a?BBBBBB========='#3#3#4#0#0#0#10#26'1'#24'j'#229#22'g'#229#22'c'#221#22
+ +'c'#221#23'e'#231#17'W'#139' '#129#251#30'{'#247#22'k'#239#11'n'#154'===dddY'
+ +'YYE'#145'S1'#202'KCiIIIIBBBBBB======'#5#5#6#10#9#7#24#27#31#28'['#169#31#139
+ +#255#31#138#255#31#139#255#31#138#255#17'W'#139')'#145#250'&'#142#250'!'#132
+ +#250#26'p'#235#11'n'#154'^^^YYYJ'#150'Z9'#209'VHnNIIIIIIBBBBBB======%%%USP+2'
+ +':'#17'5]'#19'K'#135#23'W'#154#22'Cx('#142#230'0'#157#251'-'#152#250'('#144
+ +#251#31#130#247#11'n'#154'^^^^^^P'#156'aA'#217'aKzTYYYIIIIIIBBBBBBBBB'#5#5#6
+ +'AABNKJ865'#22#19#19#5#3#3#5#2#1#2'7\5'#166#255'1'#157#251','#150#251'#'#137
+ +#246#11'n'#154'hhh^^^U'#161'iH'#224'mB'#209'aA'#132'LHnNJSKIIIBBBBBB====== '
+ +#31'"'#29#28#28#20#20#20#12#12#12#2'Bm'#29'x'#189'9'#172#255'7'#167#255'4'
+ +#160#255#11'n'#154#23#30#23#138#138#138'bbb\'#139'iP'#232'xH'#224'mA'#217'a9'
+ +#209'V1'#202'K;'#135'FIIIBBBBBB=========&I&'#19'i'#156'R'#152#188#21'c'#146#3
+ +'>h'#3'>h'#0''#148'MIIIIIIBBBBBB======''V'''#0#147#0'#w'#166#22'i'#151#7'P'
+ +'~'#0''#213#254'U'#220
+ +#255'n'#225#255#3'_'#150#140'&'#0#149','#0#149'6'#15#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#0'S'#139#3#129#187#28#137#181#144#213
+ +#234#186#242#255#167#238#255#0'K'#130#255#0#255#0'K'#130#2'f'#156#18#169#220
+ +'*'#208#254'@'#213#254#3'_'#150#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0'K'#130#3
+ +#139#197#12'~'#173#171#233#248#186#242#255#131#211#234#0'K'#130#3'j'#157#13
+ +#139#188#12#198#254#24#202#254#26#166#213#0'K'#130#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#0'K'#130#5#147#201#144#213#234#186#242#255#184#242#255
+ +#159#237#255'n'#225#255'B'#215#254#28#203#254#12#198#254#0'K'#130#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#0'K'#130#6#139#191#186#242#255
+ +#186#242#255#186#242#255#184#242#255#154#235#255'j'#225#255'>'#213#254#25#203
+ +#254#0'K'#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ ,#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#2'}'#182#0
+ +'K'#130#0'K'#130'0'#153#193':'#157#193#186#242#255#183#242#255'j'#198#227#0
+ +'K'#130#0'K'#130#9'y'#170#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#0'\'#149#6#169#225'\'#177#207#171#233#248
+ +#0'K'#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0'K'#130#0'K'
+ +#130#0'K'#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255
+]);
+LazarusResources.Add('TDAHETDRIVER','BMP',[
+ 'BM'#248#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#194#6#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#129#30#0'w'#23#0'w'#23#0#255#0#255#255#0
+ +#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0
+ +#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#0#255#255#0#255#129#30
+ +#0#129#30#0#129#30#0#252#154'*'#184':'#0#184':'#0#128'*'#3#255#0#255#128#0#0
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0#255#0
+ +#255#130#24#0#129#30#0#248'w'#0#255#129#0#255#149#19#255#170'4'#255#189'Z'
+ +#138#31#0#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255
+ +#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#5'f'#149#130#24#0'y'#16#0#255#158' '#252'w'#0#143#30#0#213'g'#10#255#171
+ +'8'#138#31#0#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#130#24#0#130#24#0#221#152'Z'#255#191']'#186'M'#5#255#0#255'v'#12#0#242#134
+ +#20#252#160'4'#138#31#0#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#0'R'#143#0'6o '
+ +' Q6'#24#171'3'#0#233#171'n'#255#215#146#193'e%'#255#0#255'v'#12#0#242'w'#1
+ +#255#150#25#138#31#0#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255
+ +#255#255#255#255#255#255#128#0#0#0'R'#143#0'R'#143#0'R'#143#6#140#194',Xb '
+ +' HF:'#255#218#154#233#170'j'#145'%'#0#193'M'#0#255'~'#0#138#31#0#255#0#255
+ +#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#0'6p'#0'j'#161#2#199#255#9#202#255'"NY.YbAks '
+ +#255#218#154#255#218#154#255#211#137#255#177'C'#255#138#7#138#31#0#255#0#255
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#0'9'
+ +'u'#4'v'#170'('#212#255#0#158#218#0'N'#138#22#163#212'R'#224#255#0'v'#186#196
+ +'f#'#203'g'#25#255#218#154#184':'#0#184':'#0#184':'#0#255#0#255#255#0#255#2
+ +'t'#169'['#213#226'i'#246#254'E'#230#254'%'#215#254#13#199#254#26#204#254#0
+ +';v'#11#128#176#156#233#254'h'#230#255'#'#165#212#0'A~'#0'F'#129'0'#215#255
+ +'M'#215#254'%_p'#184':'#0#184':'#0#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#2't'#169'['#213#226#127#247#254'z'#238#254'}'#233#254#135#231#255
+ +#163#237#255#0';v'#3'{'#176#165#235#254#167#243#255'^'#193#226#0'L'#138#0'N'
+ +#138#19#204#255'-'#206#252#13'b'#145#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#2't'#169#160#233#239#170#238#246'p'#207#229'?'
+ +#177#211#29#149#192#17#131#177#15'{'#170#0'@z'#24#150#196#182#246#255'~'#212
+ +#238#3'g'#157#13#182#235#1#198#255#13'b'#145#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3'p'#164'T'#177#202'('#156
+ +#188'&'#171#207#27#182#224#12#183#237#24#198#247':'#213#254#0'A~'#27#153#196
+ +#181#244#255#182#246#255#154#240#255'N'#222#255#13#202#255#13'b'#145#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#4
+ +'l'#158'?'#180#203'f'#242#251'E'#230#254'%'#215#254#13#199#254#26#204#254';'
+ +#215#255'`'#225#255#0'Ay'#0'E~;'#175#213#182#246#255#13'b'#145#13'b'#145#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#2's'#167'['#213#226'i'#246#254'E'#230#254'%'#215#254#13#199#254#26
+ +#204#254';'#215#255'`'#225#255'}'#229#252'Q'#199#233#0'A{'#0'E{'#1'z'#180#5
+ +'f'#149#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#2't'#169'['#213#226'i'#246#254'E'#230#254#128#128#128#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#2't'#169'['#213#226'i'#246#254
+ +'E'#230#254#128#128#128#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#0#255#0
+ +#255#255#0#255#2't'#169'['#213#226'i'#246#254'E'#230#254#128#128#128#255#255
+ +#255#128#0#0#255#255#255#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0
+ +#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#255#255
+ +#255#0#0#0#255#0#255#255#0#255#2't'#169'['#213#226'i'#246#254'E'#230#254#128
+ +#128#128#255#255#255#128#0#0#192#220#192#255#255#255#192#220#192#128#0#0#255
+ +#255#255#128#0#0#192#220#192#255#255#255#255#255#255#255#255#255#128#0#0#255
+ +#255#255#255#255#255#255#255#255#0#0#0#255#0#255#255#0#255#2't'#169'c'#213
+ +#226#152#250#254#159#247#255#128#128#128#255#255#255#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#192#220#192#255#255#255
+ +#128#0#0#255#255#255#255#255#255#255#255#255#0#0#0#255#0#255#255#0#255#2't'
+ +#169#178#213#227#248#255#255#221#255#255#128#128#128#255#255#255#128#0#0#192
+ ,#220#192#255#255#255#192#220#192#128#0#0#255#255#255#128#0#0#192#220#192#255
+ +#255#255#255#255#255#192#220#192#128#0#0#192#220#192#255#255#255#255#255#255
+ +#0#0#0#255#0#255#255#0#255#2't'#169'M'#156#187#235#244#248#242#255#255#128
+ +#128#128#255#255#255#128#0#0#255#255#255#255#255#255#255#255#255#128#0#0#255
+ +#255#255#128#0#0#128#0#0#192#220#192#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0
+ +#255#255#255#0#0#0#255#0#255#255#0#255#255#0#255#2't'#169#5'x'#172'b'#175#201
+ +#128#128#128#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#0#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#2't'#169#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#255#0#255#0#0
+]);
+LazarusResources.Add('TDAJSONDATASTREAMER','BMP',[
+ 'BM'#248#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#194#6#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#142']'
+ +'Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#225#189#255#221#181#255#217#172#255
+ +#213#165#255#211#157#255#207#151#255#203#145#255#201#140#255#199#135#128'PK'
+ +#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0
+ +#0#255#231#203#255#227#194#255#224#187#255#220#178#255#216#171#0#0#0#0#0#0
+ +#255#206#149#255#203#143#128'PK'#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0
+ +#255#255#255#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255
+ +#128#0#0'@'#0#0#255#238#217#255#233#208#255#230#199#255#226#191#0#0#0#255#216
+ +#171#255#216#171#0#0#0#255#207#152#128'PK'#128#0#0#255#255#255#128#0#0#255
+ +#255#255#255#255#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255
+ +#255#255#128#0#0'@'#0#0#255#243#229#255#240#222#255#235#213#255#233#204#255
+ +#229#197#255#221#182#255#221#182#0#0#0#255#213#165#128'PK'#128#0#0#255#255
+ +#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255
+ +#255#255#255#128#0#0#255#255#255#128#0#0'@'#0#0#7'9z'#255#246#233#255#242#225
+ +#255#238#218#255#234#209#255#229#197#255#229#197#0#0#0#255#218#176#128'PK'
+ +#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#255#255#255#255#255
+ +#255#128#0#0#128#0#0#255#255#255#255#255#255#128#0#0'@'#0#0#255#254#250#255
+ +#250#244#255#248#239#255#244#231#255#240#222#255#234#209#255#234#209#0#0#0
+ +#255#225#189#128'PK'#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#128#0#0'@'#0#0#255#255#255#255#254#252#255#252#247#255#250#242#255
+ +#246#235#0#0#0#0#0#0#0#0#0#255#231#203#128'PK'#128#0#0#128#0#0#128#0#0#128#0
+ +#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#254#250#255#251#246#255
+ +#248#239#255#244#231#255#240#222#255#238#217#128'PKHJK'#201#194#201#7'9z'#7
+ +'9z'#7'9z='#154#242'5'#149#239'-'#140#239#7'9z'#7'9z'#7'9zyyy'#194#140'm'#255
+ +#255#255#255#255#255#255#255#255#137#167#199#7'9z'#137#167#199#255#252#248
+ +#247#240#235#226#218#209#226#216#204'{MIHJK'#206#199#204#191#184#192#7'9z@'
+ +#157#242'@'#157#242'@'#157#242'9'#152#240'2'#145#239#7'9zE_{yyy'#203#147'o'
+ +#255#255#255#255#255#255#137#167#199#7'9z'#15's'#233#7'9z'#137#167#199#234
+ +#233#230#182#180#176#182#177#171'uIEHJK'#209#202#209#194#188#194'h'#129#163#7
+ +'9z@'#157#242'@'#157#242'@'#157#242#7'9zE_{{{{yyy'#209#153'r'#255#255#255#137
+ +#167#199#7'9z'#15's'#233#15's'#233#15's'#233#7'9zURf'#160'g['#160'g['#149'\K'
+ +'HJK'#213#207#213#197#191#197#194#188#194'Qk'#138#7'9z@'#157#242#7'9zId'#128
+ +'yzzyyyyyy'#216#159'u'#137#167#199#7'9z'#27'}'#235#22'y'#234#18'u'#233#15's'
+ +#233#15's'#233#7'9z'#254#176'J'#240#145','#225#132'.HJK'#217#213#217#201#196
+ +#202#199#192#198#150#146#152'0Kf'#7'9z,D^'#137#137#137#127#127#127#130#130
+ +#131'yyy'#220#163'v'#7'9z'#7'9z'#7'9z'#31#130#235#27'}'#235#22'y'#234#7'9z'#7
+ +'9z'#7'9z'#218#152'c'#255#0#255'HJK'#225#218#224#207#201#206#199#192#198#151
+ +#150#153'UWX'#175#175#177'JLM'#137#137#137#128#128#128#132#132#132#127#127
+ +#127#220#163'v'#209#146'm'#209#146'm'#7'9z-'#140#239'%'#135#238#31#130#237#7
+ +'9zXTh'#212#154's'#255#0#255#255#0#255'HJK'#231#226#230#212#207#211#225#218
+ +#224#152#149#152'UWX'#176#175#177'LNO'#150#149#149#132#131#131'vvvyyy'#143
+ +#143#143#131#132#132'*C]'#7'9z7'#150#240'2'#146#240#7'9z'#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255'HJK'#239#235#239#235#233#235#198#197#199#160
+ +#157#161'UWX'#164#165#167';=>'#130#130#131#137#137#137#143#143#143#137#137
+ +#137#147#147#147'Id'#128#7'9z@'#157#242'@'#157#242'='#154#242#7'9z'#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255'HJK'#238#237#238#178#177#180#156#153
+ +#156#159#158#161'RTU'#235#235#237'ossY[Z'#7'9z'#7'9z'#7'9z'#7'9z'#7'9z@'#157
+ +#242'@'#157#242#7'9z'#7'9z'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255'HJK'#237#235#237#129#129#130#213#209#212#207#207#208'`cdprrxy{'
+ +#138#142#140#171#172#172'Xt'#146#7'9z'#7'9z'#7'9z'#7'9z'#7'9z'#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'HJK'#251
+ +#251#252#204#204#204#254#254#254#227#227#230#186#184#188#151#149#152#136#134
+ +#137'xy{rssfihehi'#150#152#153#150#152#153'HJK'#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'HJK'#255#255#255
+ +#251#251#252#238#238#242#237#238#240#231#230#233#217#213#217#196#192#196#172
+ +#170#172#151#145#151#136#131#136#150#142#146#136#129#131'HJK'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ ,#255#0#255'HJK'#255#255#255#255#255#255#246#246#248#248#247#251#237#237#239
+ +#226#226#229#209#207#212#194#191#196#193#187#193#167#159#165'HJKHJK'#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255'HJKHJK'#255#255#255#255#255#255#255
+ +#255#255#240#239#243#229#225#230#203#197#203'HJKHJK'#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'LNOHJKHJKHJKHJK'
+ +'HJK'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#0#0
+]);
+LazarusResources.Add('TDAMEMDATATABLE','BMP',[
+ 'BM'#248#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#194#6#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#5'f'#149#5'f'#149#5'f'#149#5'f'#149#5'f'#149#5'f'#149#255#0
+ +#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0
+ +#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#0#255#2't'#169'0'#201
+ +#233#18#203#254' '#206#254'T'#222#255't'#224#248','#167#211#5'f'#149#255#0
+ +#255#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0
+ +'@'#0#0#2't'#169's'#250#254'?'#227#254#18#203#254' '#206#254'T'#222#255't'
+ +#224#248'0'#176#218#3#134#193#5'f'#149#128#0#0#255#255#255#128#0#0#128#0#0
+ +#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255
+ +#255#255#128#0#0'@'#0#0#2't'#169's'#250#254'?'#227#254#18#203#254' '#206#254
+ +'T'#222#255't'#224#248'0'#176#218#3#134#193#5'f'#149#128#0#0#255#255#255#128
+ +#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128
+ +#0#0#255#255#255#128#0#0'@'#0#0#2't'#169's'#250#254'?'#227#254#18#203#254' '
+ +#206#254'T'#222#255't'#224#248'0'#176#218#3#134#193#5'f'#149#128#0#0#255#255
+ +#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255
+ +#255#255#255#128#0#0#255#255#255#128#0#0'@'#0#0#2't'#169#159#251#254#163#243
+ +#255#182#242#255#218#248#255#229#250#255#216#247#254#154#220#239'A'#172#213#5
+ +'f'#149#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#255#255#255
+ +#255#255#255#128#0#0#128#0#0#255#255#255#255#255#255#128#0#0'@'#0#0#2't'#169
+ +#167#233#243#28#170#211#7#145#197#7#136#188#16#139#188#31#145#191#20'y'#173
+ +'y'#192#220#5'g'#150#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#128#0#0'@'#0#0#2't'#169'1'#181#211'?'#227#254#18#203#254' '#206#254
+ +'T'#222#255't'#224#248'0'#176#218#2'h'#163#3'h'#154#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0'4'#144'4'#2't'#169's'#250#254'?'#227#254#18#203#254' '#206#254'T'#222
+ +#255't'#224#248'0'#176#218#3#134#193#5'f'#149#150'5'#17#254#254#254#254#254
+ +#254#254#254#251#254#250#247#0'e'#0#254#246#237#254#243#230#254#240#225#254
+ +#237#218#254#233#211#0'e'#0#254#226#197#254#233#208#2't'#169's'#250#254'?'
+ +#227#254#18#203#254' '#206#254'T'#222#255't'#224#248'0'#176#218#3#134#193#5
+ +'f'#149#150'5'#17#254#254#254#254#254#254#254#254#254#254#254#252#0'e'#0#254
+ +#248#243#254#246#239#254#244#233#254#242#226#254#238#221#0'e'#0#254#230#206
+ +#254#235#216#2't'#169's'#250#254'?'#227#254#18#203#254' '#206#254'T'#222#255
+ +'t'#224#248'0'#176#218#3#134#193#5'f'#149#150'5'#17#254#254#254#254#254#254
+ +#254#254#254#254#254#254#0'e'#0#254#251#250#254#250#244#254#247#240#254#244
+ +#234#254#242#227#0'e'#0#254#235#215#254#238#222#2't'#169'x'#251#254'h'#246
+ +#255'T'#246#255'_'#254#255#127#254#255#137#251#254'H'#207#242#5#139#199#5'f'
+ +#149#150'5'#17#0'e'#0#0'e'#0#0'e'#0#0'e'#0#0'e'#0#0'e'#0#0'e'#0#0'e'#0#0'e'#0
+ +#0'e'#0#0'e'#0#0'e'#0'4'#144'4'#2't'#169#251#255#255#240#255#255#198#255#255
+ +#160#255#255#152#255#255#152#255#255#147#255#255'W'#247#254#5'f'#149#150'5'
+ +#17#254#254#254#254#254#254#254#254#254#254#254#254#0'e'#0#254#254#254#254
+ +#254#254#254#252#252#254#251#247#254#248#243#0'e'#0#254#243#233#254#240#225
+ +#254#243#230#4'y'#175#237#250#252#220#255#255#183#255#255#153#255#255#146#255
+ +#255#131#250#251#8'k'#154#255#0#255#150'5'#17#254#254#254#254#254#254#254#254
+ +#254#254#254#254#0'e'#0#254#254#254#254#254#254#254#254#254#254#254#254#254
+ +#252#250#0'e'#0#254#247#239#254#244#234#254#242#227#254#244#231#2't'#169#2't'
+ +#169#2't'#169#2't'#169#2't'#169#2't'#169#150'5'#17#255#0#255#150'5'#17#254
+ +#254#254#254#254#254#254#254#254#128#128#128#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#255#0#255#150'5'#17#0'e'#0#0'e'#0#0'e'#0#128#128#128#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#0#0#0#255#0#255#150'5'#17#254#254#254#254#254
+ +#254#254#254#254#128#128#128#255#255#255#128#0#0#255#255#255#255#255#255#255
+ +#255#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0#255
+ +#255#255#255#255#255#255#255#255#128#0#0#255#255#255#0#0#0#255#0#255#150'5'
+ +#17#254#254#254#254#254#254#254#254#254#128#128#128#255#255#255#128#0#0#255
+ +#255#255#192#220#192#255#255#255#128#0#0#255#255#255#128#0#0#192#220#192#255
+ +#255#255#255#255#255#128#0#0#255#255#255#192#220#192#255#255#255#128#0#0#255
+ +#255#255#0#0#0#255#0#255#150'5'#17#220#220#220#220#220#220#220#220#220#128
+ +#128#128#255#255#255#128#0#0#192#220#192#128#0#0#192#220#192#128#0#0#255#255
+ ,#255#128#0#0#128#0#0#192#220#192#255#255#255#128#0#0#192#220#192#128#0#0#192
+ +#220#192#128#0#0#255#255#255#0#0#0#255#0#255#150'5'#17#152'D'#16#152'D'#16
+ +#152'D'#16#128#128#128#255#255#255#128#0#0#128#0#0#192#220#192#128#0#0#128#0
+ +#0#255#255#255#128#0#0#192#220#192#255#255#255#255#255#255#128#0#0#128#0#0
+ +#192#220#192#128#0#0#128#0#0#255#255#255#0#0#0#255#0#255#189'X'#12#233#127#30
+ +#233#127#30#233#127#30#128#128#128#255#255#255#128#0#0#192#220#192#255#255
+ +#255#192#220#192#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#128
+ +#0#0#192#220#192#255#255#255#192#220#192#128#0#0#255#255#255#0#0#0#255#0#255
+ +#255#0#255#189'X'#12#189'X'#12#189'X'#12#128#128#128#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#0#0#0#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#255#0#255#0#0
+]);
+LazarusResources.Add('TDAPOWEREDBYDATAABSTRACTBUTTON','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#135'L*'#135'N.'#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0
+ +#0#142'V5'#135'N.'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255
+ +#255#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0
+ +'@'#0#0#169'vR'#135'N.'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255
+ +#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0
+ +'@'#0#0#173'}Y'#135'N.'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255
+ +#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255
+ +#128#0#0'@'#0#0#166'tU'#137'P2'#134'L-'#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0
+ +#0#255#255#255#255#255#255#255#255#255#128#0#0#128#0#0#255#255#255#255#255
+ +#255#128#0#0'@'#0#0#182#138'j'#156'hI'#144'Z:'#139'R2'#135'N.'#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#128#0#0#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#128#0#0'@'#0#0#237#207#177#211#172#142#180#132'g'
+ +#153'eE'#142'T5'#136'P/'#255#0#255#255#0#255#255#0#255#255#0#255#128#0#0#128
+ +#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#254#233#209#255#235#207#255#231#202#239#208#178#203#163#130
+ +#165'rQ'#144'W8'#137'P2'#135'M-'#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#208#183#169#207#182#164#224#201#181#247#229#209#255#240#221#255#240
+ +#221#254#238#218#254#237#216#254#235#213#254#234#212#254#233#209#254#233#207
+ +#255#234#206#255#235#207#251#225#196#220#183#151#170'xX'#143'Y:'#138'R3'#255
+ +#0#255#255#0#255#255#0#255#255#0#255#218#198#187#216#192#180#224#203#187#246
+ +#230#212#255#243#225#255#240#221#254#239#222#254#239#222#254#237#220#254#238
+ +#218#254#237#216#254#234#212#254#233#209#254#231#207#255#231#202#255#234#206
+ +#255#230#198#215#177#144#161'oP'#143'Y:'#139'T4'#255#0#255#255#0#255#255#0
+ +#255#225#208#197#226#206#194#240#224#209#254#240#226#255#243#227#254#240#226
+ +#254#240#226#254#240#226#254#240#224#254#239#222#254#237#220#254#237#216#254
+ +#234#212#254#233#209#254#231#206#255#231#202#255#234#202#247#217#184#193#150
+ +'v'#151'dD'#143'Y:'#255#0#255#255#0#255#235#225#218#231#218#208#235#221#208
+ +#250#237#224#254#242#231#254#242#231#254#243#230#254#243#230#254#243#230#255
+ +#243#227#254#239#225#254#239#222#254#237#220#254#237#216#254#234#212#254#233
+ +#209#254#231#206#255#231#201#255#230#198#222#184#153#164'tU'#147'_A'#145'[<'
+ +#255#0#255#240#235#230#237#227#220#242#230#220#252#242#230#254#244#237#254
+ +#244#237#254#244#237#254#244#237#254#244#237#254#242#231#254#242#229#254#239
+ +#225#254#239#221#254#238#218#254#235#213#254#233#209#254#231#207#255#231#202
+ +#255#231#201#234#202#170#176#129'e'#153'gH'#150'bC'#255#0#255#247#243#242#243
+ +#235#230#246#237#227#252#243#234#254#247#239#254#247#240#254#247#239#254#247
+ +#240#254#247#239#254#244#237#254#242#231#254#242#229#254#240#224#254#237#220
+ +#254#237#216#254#234#212#254#233#207#255#231#202#255#231#202#237#204#173#180
+ +#136'k'#158'mP'#154'iJ'#255#0#255#254#252#252#250#246#243#247#240#234#252#244
+ +#235#254#248#240#254#250#244#254#250#244#254#250#244#254#248#240#254#244#237
+ +#254#244#234#254#243#230#254#240#226#254#239#221#254#237#217#254#235#213#254
+ +#233#207#254#231#206#255#231#202#229#197#166#178#137'l'#161'tX'#159'oR'#255#0
+ +#255#255#255#255#255#254#254#252#248#246#252#246#239#254#250#244#254#251#247
+ +#254#251#248#254#251#247#254#250#244#254#247#239#254#246#235#254#243#230#254
+ +#240#226#254#239#222#254#237#217#254#235#213#254#233#209#254#233#207#252#226
+ +#197#213#180#151#177#136'm'#167'z`'#164'wZ'#255#0#255#255#0#255#255#255#255
+ +#255#255#255#254#250#247#254#250#244#254#251#248#254#252#252#254#251#248#254
+ +#250#244#254#248#240#254#244#237#254#243#230#254#240#226#254#239#222#254#237
+ +#217#254#235#213#254#233#209#255#234#206#235#208#181#197#160#136#178#138'r'
+ +#172#130'i'#255#0#255#255#0#255#255#0#255#255#255#255#255#255#255#255#255#252
+ +#254#250#247#254#250#247#254#251#247#254#251#247#254#250#244#252#246#239#254
+ +#246#234#254#243#230#254#240#226#254#239#221#254#237#217#254#237#216#254#233
+ ,#209#242#218#192#211#181#157#189#154#131#182#144'z'#178#138't'#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#255#255#255#255#255#255#254#254#254#251#248
+ +#254#250#244#254#247#240#254#247#240#254#244#237#254#244#234#254#243#230#254
+ +#240#226#255#240#221#254#237#216#251#231#208#239#216#193#217#191#171#198#167
+ +#149#192#159#139#187#153#132#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#255#255#255#255#255#255#255#255#254#251#248#254#250#244
+ +#252#246#239#252#243#234#252#240#229#251#239#226#250#235#220#248#231#215#242
+ +#224#206#230#211#193#218#194#178#208#181#164#202#173#156#198#167#149#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#255#255#255#255#255#255#255#255#255#254#254#252#252#248#250#247#240#247
+ +#239#233#244#234#225#239#227#217#235#220#209#229#212#201#221#203#191#216#196
+ +#182#213#189#175#208#183#166#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255
+ +#255#255#255#255#255#255#255#254#254#251#247#246#246#239#235#242#233#227#237
+ +#225#220#231#218#211#227#212#202#221#204#193#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255#255#254
+ +#254#251#247#246#246#240#237#242#233#227#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+]);
+LazarusResources.Add('TDAREMOTECOMMAND','BMP',[
+ 'BMv'#6#0#0#0#0#0#0'6'#4#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#8#0#0#0#0#0'@'#2#0
+ +#0#0#0#0#0#0#0#0#0#0#1#0#0#0#1#0#0#255#0#255#0#153'3'#0#0#154'4'#0#0#156'6'#0
+ +#0#158'8'#0#0#162'<'#0#0#165'?'#0#0#166'@'#0#0#169'C'#0#0#170'D'#0#0#175'I'#0
+ +#0#175'M'#11#0#172'L'#13#0#176'J'#0#0#179'M'#0#0#180'N'#0#0#182'P'#0#0#185'S'
+ +#0#0#185'V'#7#0#183'V'#11#0#181'T'#12#0#185'Y'#15#0#179'W'#25#0#191'd'#26#0
+ +#139'Q$'#0#138'Z+'#0#179'\&'#0#183'i$'#0#199'a'#0#0#201'c'#0#0#203'e'#0#0#204
+ +'f'#0#0#198'd'#10#0#209'k'#0#0#220'v'#0#0#229#127#0#0#197'v9'#0#204#127'>'#0
+ +#144'kG'#0#183'uD'#0#198'{D'#0#247#145#0#0#255#157#11#0#249#152#12#0#255#158
+ +#12#0#242#148#20#0#249#156#24#0#255#161#19#0#255#163#25#0#255#166#31#0#217
+ +#137'6'#0#230#146'-'#0#242#155'%'#0#236#159'>'#0#255#166'!'#0#255#169')'#0
+ +#255#172'.'#0#255#175'7'#0#255#176'8'#0#255#178'>'#0#138#141#127#0#210#136'E'
+ +#0#204#139'['#0#255#179'@'#0#249#178'M'#0#255#184'N'#0#236#167'S'#0#255#186
+ +'Q'#0#255#187'T'#0#255#188'W'#0#210#149'f'#0#223#170'y'#0#255#193'c'#0#255
+ +#194'e'#0#255#195'i'#0#255#196'j'#0#255#197'l'#0#249#193'r'#0#255#202'x'#0
+ +#255#203'|'#0#255#204'~'#0'(r'#138#0' '#129#159#0#14#128#170#0#23#136#175#0
+ +#11#134#178#0#9#138#183#0#7#140#186#0#14#145#190#0#30#148#188#0'('#152#186#0
+ +'g'#145#154#0'p'#159#166#0#4#147#196#0#9#151#199#0#10#157#206#0'"'#155#194#0
+ +#21#175#217#0'!'#170#207#0'5'#160#195#0'0'#170#202#0'2'#170#206#0'?'#176#203
+ +#0'='#189#218#0'9'#184#222#0')'#187#224#0'h'#176#202#0#25#199#241#0#27#212
+ +#254#0'/'#198#231#0'&'#194#233#0'>'#205#233#0','#211#249#0'.'#216#254#0'<'
+ +#224#254#0'T'#192#212#0'Y'#196#215#0'Y'#194#221#0'o'#194#214#0'|'#192#213#0
+ +'C'#200#233#0'T'#223#254#0'`'#206#234#0'l'#212#238#0'd'#217#233#0'v'#223#233
+ +#0'}'#223#233#0'U'#224#255#0'k'#227#244#0'`'#236#254#0'u'#226#250#0'{'#232
+ +#255#0'q'#242#254#0#136#153#143#0#151#166#158#0#150#177#174#0#236#187#133#0
+ +#230#182#136#0#255#205#130#0#255#210#141#0#236#193#147#0#255#212#147#0#249
+ +#212#162#0#255#220#166#0#249#215#170#0#255#221#169#0#255#223#173#0#255#224
+ +#175#0#255#226#181#0#134#187#196#0#131#223#233#0#138#218#235#0#148#223#233#0
+ +#149#223#237#0#164#223#234#0#149#235#253#0#149#238#254#0#158#237#255#0#132
+ +#243#249#0#128#245#252#0#143#246#251#0#131#248#254#0#147#242#254#0#151#249
+ +#254#0#148#253#254#0#153#255#254#0#158#255#254#0#180#238#243#0#164#255#254#0
+ +#168#249#254#0#173#251#254#0#170#255#254#0#182#241#255#0#188#242#248#0#179
+ +#249#255#0#179#255#254#0#185#255#254#0#195#223#234#0#206#234#238#0#204#246
+ +#255#0#201#255#254#0#207#255#255#0#209#247#255#0#223#255#255#0#229#255#255#0
+ +#240#247#250#0#245#255#255#0#250#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#1#1#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#22'N'#1#0#0#0#0#0
+ +#0#0#0#0'SSSSSSQ'#1#1#1#18#21'5HM'#1#1#1#0#0#0#0'SSbbanxz\'#7#4'.*19AHN'#141
+ +#1#0#0#0'SZ|'#129'rlq'#127#131#153#7#9'31*6:CJN'#1#0#0#0'W}'#161#129'rlq'#127
+ +#131#135#10#9'B:-'#7#1#12'@J='#1#0#0'W}'#161#129'rlq'#127#133#16#12'G'#141'H'
+ +#27#0#1#4#23'CJ%'#1#0'W}'#161#129'rlq'#127#15'!F'#148#147#139'&'#0#1#9#20'?C'
+ +'J'#1#0'W}'#161#129'rlq'#127'<'#29#20#137#148#146''''#0#4#15' 7?2'#1#0'W}'
+ +#161#129'rlq'#127#131#134#29#18#140#148#142#26#9#20'*/4'#1#0#0'W}'#163#162
+ +#156#157#172#179#182#178#29'"'#137#148#148#146'NE7*'#1#0#0#0'W'#167#173#151
+ +'ue`Yc[#'#29#144#148#148#148#146'NC7'#1#0#0#0'Vvfgmkpy'#130#149#18#15'>$$'
+ +#144#148#136#1#1#1#0#0#0'Ut'#159#129'rlq'#127#131#156'{g_'#24')('#148#1#0#0#0
+ +#0#0#0'W}'#161#129'rlq'#127#131#156'{h_R'#25#4#1#0#0#0#0#0#0#0'W}'#161#129'r'
+ +'lq'#127#131#156'{h_]S'#0#0#0#0#0#0#0#0#0'W}'#161#129'rlq'#127#131#156'{g_]S'
+ +#0#0#0#0#0#0#0#0#0'W}'#161#129'rlq'#127#131#156'{h_]S'#0#0#0#0#0#0#0#0#0'W}'
+ +#161#129'rlq'#127#131#156'{h_]S'#0#0#0#0#0#0#0#0#0'W~'#170#174#170#170#165
+ +#165#165#165#160#128'i^S'#0#0#0#0#0#0#0#0#0'W'#177#187#184#181#174#168#165
+ +#165#165#165#163#132'oS'#0#0#0#0#0#0#0#0#0'Wj'#185#186#183#181#174#165#165
+ +#165#165#165#159'eS'#0#0#0#0#0#0#0#0#0#0'WXww'#154#153#150'~}ssTS'#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0'WWWWWWWWW'#0#0#0#0#0#0#0#0#0#0#0
+]);
+LazarusResources.Add('TDALOCALCOMMAND','BMP',[
+ 'BMv'#6#0#0#0#0#0#0'6'#4#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#8#0#0#0#0#0'@'#2#0
+ +#0#0#0#0#0#0#0#0#0#0#1#0#0#0#1#0#0#255#0#255#0#153'3'#0#0#154'4'#0#0#156'6'#0
+ +#0#158'8'#0#0#162'<'#0#0#165'?'#0#0#166'@'#0#0#169'C'#0#0#170'D'#0#0#175'I'#0
+ +#0#175'M'#11#0#172'L'#13#0#176'J'#0#0#179'M'#0#0#180'N'#0#0#182'P'#0#0#185'S'
+ +#0#0#185'V'#7#0#183'V'#11#0#181'T'#12#0#185'Y'#15#0#179'W'#25#0#191'd'#26#0
+ +#139'Q$'#0#138'Z+'#0#179'\&'#0#183'i$'#0#199'a'#0#0#201'c'#0#0#203'e'#0#0#204
+ +'f'#0#0#198'd'#10#0#209'k'#0#0#220'v'#0#0#229#127#0#0#197'v9'#0#204#127'>'#0
+ +#144'kG'#0#183'uD'#0#198'{D'#0#247#145#0#0#255#157#11#0#249#152#12#0#255#158
+ +#12#0#242#148#20#0#249#156#24#0#255#161#19#0#255#163#25#0#255#166#31#0#217
+ +#137'6'#0#230#146'-'#0#242#155'%'#0#236#159'>'#0#255#166'!'#0#255#169')'#0
+ +#255#172'.'#0#255#175'7'#0#255#176'8'#0#255#178'>'#0#138#141#127#0#210#136'E'
+ +#0#204#139'['#0#255#179'@'#0#249#178'M'#0#255#184'N'#0#236#167'S'#0#255#186
+ +'Q'#0#255#187'T'#0#255#188'W'#0#210#149'f'#0#223#170'y'#0#255#193'c'#0#255
+ +#194'e'#0#255#195'i'#0#255#196'j'#0#255#197'l'#0#249#193'r'#0#255#202'x'#0
+ +#255#203'|'#0#255#204'~'#0'(r'#138#0' '#129#159#0#14#128#170#0#23#136#175#0
+ +#11#134#178#0#9#138#183#0#7#140#186#0#14#145#190#0#30#148#188#0'('#152#186#0
+ +'g'#145#154#0'p'#159#166#0#4#147#196#0#9#151#199#0#10#157#206#0'"'#155#194#0
+ +#21#175#217#0'!'#170#207#0'5'#160#195#0'0'#170#202#0'2'#170#206#0'?'#176#203
+ +#0'='#189#218#0'9'#184#222#0')'#187#224#0'h'#176#202#0#25#199#241#0#27#212
+ +#254#0'/'#198#231#0'&'#194#233#0'>'#205#233#0','#211#249#0'.'#216#254#0'<'
+ +#224#254#0'T'#192#212#0'Y'#196#215#0'Y'#194#221#0'o'#194#214#0'|'#192#213#0
+ +'C'#200#233#0'T'#223#254#0'`'#206#234#0'l'#212#238#0'd'#217#233#0'v'#223#233
+ +#0'}'#223#233#0'U'#224#255#0'k'#227#244#0'`'#236#254#0'u'#226#250#0'{'#232
+ +#255#0'q'#242#254#0#136#153#143#0#151#166#158#0#150#177#174#0#236#187#133#0
+ +#230#182#136#0#255#205#130#0#255#210#141#0#236#193#147#0#255#212#147#0#249
+ +#212#162#0#255#220#166#0#249#215#170#0#255#221#169#0#255#223#173#0#255#224
+ +#175#0#255#226#181#0#134#187#196#0#131#223#233#0#138#218#235#0#148#223#233#0
+ +#149#223#237#0#164#223#234#0#149#235#253#0#149#238#254#0#158#237#255#0#132
+ +#243#249#0#128#245#252#0#143#246#251#0#131#248#254#0#147#242#254#0#151#249
+ +#254#0#148#253#254#0#153#255#254#0#158#255#254#0#180#238#243#0#164#255#254#0
+ +#168#249#254#0#173#251#254#0#170#255#254#0#182#241#255#0#188#242#248#0#179
+ +#249#255#0#179#255#254#0#185#255#254#0#195#223#234#0#206#234#238#0#204#246
+ +#255#0#201#255#254#0#207#255#255#0#209#247#255#0#223#255#255#0#229#255#255#0
+ +#240#247#250#0#245#255#255#0#250#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#1#1#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#22'N'#1#0#0#0#0#0
+ +#0#0#0#0'SSSSSSQ'#1#1#1#18#21'5HM'#1#1#1#0#0#0#0'SSbbanxz\'#7#4'.*19AHN'#141
+ +#1#0#0#0'SZ|'#129'rlq'#127#131#153#7#9'31*6:CJN'#1#0#0#0'W}'#161#129'rlq'#127
+ +#131#135#10#9'B:-'#7#1#12'@J='#1#0#0'W}'#161#129'rlq'#127#133#16#12'G'#141'H'
+ +#27#0#1#4#23'CJ%'#1#0'W}'#161#129'rlq'#127#15'!F'#148#147#139'&'#0#1#9#20'?C'
+ +'J'#1#0'W}'#161#129'rlq'#127'<'#29#20#137#148#146''''#0#4#15' 7?2'#1#0'W}'
+ +#161#129'rlq'#127#131#134#29#18#140#148#142#26#9#20'*/4'#1#0#0'W}'#163#162
+ +#156#157#172#179#182#178#29'"'#137#148#148#146'NE7*'#1#0#0#0'W'#167#173#151
+ +'ue`Yc[#'#29#144#148#148#148#146'NC7'#1#0#0#0'Vvfgmkpy'#130#149#18#15'>$$'
+ +#144#148#136#1#1#1#0#0#0'Ut'#159#129'rlq'#127#131#156'{g_'#24')('#148#1#0#0#0
+ +#0#0#0'W}'#161#129'rlq'#127#131#156'{h_R'#25#4#1#0#0#0#0#0#0#0'W}'#161#129'r'
+ +'lq'#127#131#156'{h_]S'#0#0#0#0#0#0#0#0#0'W}'#161#129'rlq'#127#131#156'{g_]S'
+ +#0#0#0#0#0#0#0#0#0'W}'#161#129'rlq'#127#131#156'{h_]S'#0#0#0#0#0#0#0#0#0'W}'
+ +#161#129'rlq'#127#131#156'{h_]S'#0#0#0#0#0#0#0#0#0'W~'#170#174#170#170#165
+ +#165#165#165#160#128'i^S'#0#0#0#0#0#0#0#0#0'W'#177#187#184#181#174#168#165
+ +#165#165#165#163#132'oS'#0#0#0#0#0#0#0#0#0'Wj'#185#186#183#181#174#165#165
+ +#165#165#165#159'eS'#0#0#0#0#0#0#0#0#0#0'WXww'#154#153#150'~}ssTS'#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0'WWWWWWWWW'#0#0#0#0#0#0#0#0#0#0#0
+]);
+LazarusResources.Add('TDALOCALDATAADAPTER','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#17#128#169#17#128#169
+ +#17#128#169#17#128#169#17#128#169#17#128#169#17#128#169#255#0#255#255#0#255
+ +#255#0#255#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#128#0#0'@'#0#0'$}'#145#25#149#178'%'#183#215'Q'#210#235'~'#229#245#130#218
+ +#234'J'#179#210#17#128#169#17#128#169#255#0#255#128#0#0#255#255#255#128#0#0
+ +#128#0#0#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#255#255#255#128
+ +#0#0#255#255#255#128#0#0'@'#0#0'aTA'#29'u'#133#29#144#168'I'#188#211'|'#225
+ +#240#145#230#243'b'#201#228'0'#169#212#21#148#197#17#128#169#128#0#0#255#255
+ +#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#128#0#0#128
+ +#0#0#128#0#0#255#255#255#128#0#0'@'#0#0#174'L'#8#158'='#12'JfaH'#186#209'}'
+ +#227#242#145#230#243'b'#201#228'0'#169#212#22#153#204#17#128#169#128#0#0#255
+ +#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#255#255
+ +#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0#0#216#140';'#168'N'#31'5'
+ +#130#140'M'#200#225#127#230#246#145#230#243'b'#201#228'0'#169#212#22#153#204
+ +#17#128#169#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#255#255
+ +#255#255#255#255#128#0#0#128#0#0#255#255#255#255#255#255#128#0#0'@'#0#0#203
+ +#130'F|M."'#168#197'R'#213#238#128#232#248#145#230#243'b'#201#228'0'#169#212
+ +#22#153#204#17#128#169#128#0#0#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#128#0#0'@'#0#0#177']-Jok&'#187#220'U'#220#247#128#232#248#145
+ +#230#243'b'#201#228'0'#169#212#22#153#204#17#128#169#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#159'N"'#152'R+a'#188#202's'#217#233#143#236#247#164#240#247#172#239#244
+ +#129#215#233'A'#178#216#22#153#204#17#128#169#17#128#169#150#248#247'u'#239
+ +#249'N'#227#250'&'#215#252'2'#203#234#154'I'#30#199#136'Z'#169'S&'#139'X9Trw'
+ +#16'z'#161#163#230#233#137'pZdib0'#142#172#17'}'#166#17#128#169#17#128#169'3'
+ +#151#183'?'#158#188'x'#196#212#133#209#225#17#128#169#17#128#169#150#248#247
+ +'u'#239#249'N'#227#250'&'#215#252'+'#214#251'x'#138'~'#140#127'j'#139#196#201
+ +'_'#195#222'0'#168#211#17#128#169#25#135#174'H'#159#178'C'#191#213'$'#207#244
+ +'+'#213#250'V'#223#250#128#232#248#138#225#238'N'#182#213' '#147#188#17#130
+ +#171#17#128#169#17#128#169#150#248#247'u'#239#249'N'#227#250'&'#215#252'+'
+ +#214#251'V'#223#250#128#232#248#145#230#243'b'#201#228'0'#168#210#17'~'#167
+ +#141#239#240'u'#239#249'N'#227#250'&'#214#251'*'#208#244'Q'#210#235'y'#219
+ +#234#142#225#238'b'#201#228'0'#169#212#22#151#202#17#128#169#17#128#169#150
+ +#248#247#129#240#248'u'#234#248'w'#231#248'z'#231#248#143#236#247#164#240#247
+ +#172#239#244#127#212#230'='#168#204#16'v'#156#145#239#238's'#235#245'J'#215
+ +#237'"'#193#226'$'#177#208'A'#170#190'f'#185#197#134#213#225'b'#200#227'0'
+ +#169#212#22#153#204#17#128#169#17#128#169#165#233#236'x'#196#212'?'#158#188
+ +'3'#151#183#17#128#169#17#128#169#17#128#169'3'#151#183'<'#150#178'l'#140#141
+ +#13'c'#131#128#211#210'd'#205#214'<'#175#193'*'#135#150'aVDkT>R'#149#159'z'
+ +#193#204'`'#196#223'0'#169#212#22#153#204#17#128#169#17#128#169#25#135#174'<'
+ +#176#204'>'#202#230'$'#209#246'+'#214#251'V'#223#250#128#232#248#136#222#235
+ +'exuhE0'#10'Mfe'#155#152'hsc'#133'B'#27#156'7'#0#175'J'#1#153'3'#0'Rxzm'#172
+ +#182'\'#188#214'0'#169#212#22#153#204#17#128#169#17#128#169#142#241#242'u'
+ +#239#249'N'#227#250'&'#215#252'+'#214#251'V'#223#250#128#232#248#139#220#233
+ +#144'A'#23#153'3'#0'c9!'#148'8'#8#172'L'#14#192'd'#20#207'q'#17#205'k'#7#172
+ +'G'#1'oWAb'#156#165'X'#180#204'0'#168#211#22#153#204#17#128#169#17#128#169
+ +#150#248#247'u'#239#249'N'#227#250'&'#215#252'+'#214#251'V'#223#250#127#230
+ +#246#137#158#150#162'@'#10#188'i*'#193'q1'#212#140'A'#217#143'<'#215#138'6'
+ +#215#137'7'#213#132'1'#200'r('#150'I'#31'o'#181#181'z'#214#219'Q'#201#228#30
+ +#162#210#17#128#169#17#128#169#150#248#247'u'#239#249'N'#227#250'&'#215#252
+ +'+'#214#251'V'#223#250'}'#227#242#145'W3'#200#127'A'#229#179'q'#230#179'q'
+ +#227#173'j'#226#170'g'#225#165'b'#211#141'K'#191'n5'#168'N'#31#151'W/'#141
+ +#204#196#148#240#238#136#243#247'a'#230#250#17#128#169#17#128#169#150#248#247
+ +'u'#239#249'N'#227#250'&'#215#252'+'#214#251'V'#223#250#129#193#196#158';'#7
+ +#234#192#134#239#208#158#241#212#166#234#197#148#210#151'd'#178'_/'#161'J'#30
+ +#158#127'c'#151#209#201#149#242#240#152#248#246#153#249#247#17#128#169#17#128
+ +#169#255#0#255#17#128#169#150#248#247'u'#239#249'N'#227#250'&'#215#252'+'#214
+ ,#251'V'#223#250#134#173#168#160'N#'#191'{P'#229#197#160#225#190#154#164'H'#27
+ +'oA''Qbe'#17#128#169#17#128#169#17#128#169#17#128#169#17#128#169#17#128#169
+ +#255#0#255#255#0#255#255#0#255#17#128#169#163#249#248#174#246#251#172#246#251
+ +#160#246#249#156#249#247#153#249#247#153#249#247#150#233#230#141#152#133#150
+ +'Q*'#172'Y.'#144'4'#6#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255
+ +#244#254#254#219#253#252#194#251#250#168#250#248#154#249#247#153#249#247#153
+ +#249#247#153#249#247#137#244#248'r'#172#170#144'4'#6#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#17#128#169#17#128#169#236#254#254#211#252#252#186#251
+ +#250#162#250#248#153#249#247#153#249#247#153#249#247#17#128#169#17#128#169
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#17
+ +#128#169#17#128#169#17#128#169#17#128#169#17#128#169#17#128#169#17#128#169
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+]);
+LazarusResources.Add('TDAREMOTEDATAADAPTER','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#17#128#169#17#128#169
+ +#17#128#169#17#128#169#17#128#169#17#128#169#17#128#169#255#0#255#255#0#255
+ +#255#0#255#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#128#0#0'@'#0#0'$}'#145#25#149#178'%'#183#215'Q'#210#235'~'#229#245#130#218
+ +#234'J'#179#210#17#128#169#17#128#169#255#0#255#128#0#0#255#255#255#128#0#0
+ +#128#0#0#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#255#255#255#128
+ +#0#0#255#255#255#128#0#0'@'#0#0'aTA'#29'u'#133#29#144#168'I'#188#211'|'#225
+ +#240#145#230#243'b'#201#228'0'#169#212#21#148#197#17#128#169#128#0#0#255#255
+ +#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#128#0#0#128
+ +#0#0#128#0#0#255#255#255#128#0#0'@'#0#0#174'L'#8#158'='#12'JfaH'#186#209'}'
+ +#227#242#145#230#243'b'#201#228'0'#169#212#22#153#204#17#128#169#128#0#0#255
+ +#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#255#255
+ +#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0#0#216#140';'#168'N'#31'5'
+ +#130#140'M'#200#225#127#230#246#145#230#243'b'#201#228'0'#169#212#22#153#204
+ +#17#128#169#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#255#255
+ +#255#255#255#255#128#0#0#128#0#0#255#255#255#255#255#255#128#0#0'@'#0#0#203
+ +#130'F|M."'#168#197'R'#213#238#128#232#248#145#230#243'b'#201#228'0'#169#212
+ +#22#153#204#17#128#169#128#0#0#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#128#0#0'@'#0#0#177']-Jok&'#187#220'U'#220#247#128#232#248#145
+ +#230#243'b'#201#228'0'#169#212#22#153#204#17#128#169#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#159'N"'#152'R+a'#188#202's'#217#233#143#236#247#164#240#247#172#239#244
+ +#129#215#233'A'#178#216#22#153#204#17#128#169#17#128#169#150#248#247'u'#239
+ +#249'N'#227#250'&'#215#252'2'#203#234#154'I'#30#199#136'Z'#169'S&'#139'X9Trw'
+ +#16'z'#161#163#230#233#137'pZdib0'#142#172#17'}'#166#17#128#169#17#128#169'3'
+ +#151#183'?'#158#188'x'#196#212#133#209#225#17#128#169#17#128#169#150#248#247
+ +'u'#239#249'N'#227#250'&'#215#252'+'#214#251'x'#138'~'#140#127'j'#139#196#201
+ +'_'#195#222'0'#168#211#17#128#169#25#135#174'H'#159#178'C'#191#213'$'#207#244
+ +'+'#213#250'V'#223#250#128#232#248#138#225#238'N'#182#213' '#147#188#17#130
+ +#171#17#128#169#17#128#169#150#248#247'u'#239#249'N'#227#250'&'#215#252'+'
+ +#214#251'V'#223#250#128#232#248#145#230#243'b'#201#228'0'#168#210#17'~'#167
+ +#141#239#240'u'#239#249'N'#227#250'&'#214#251'*'#208#244'Q'#210#235'y'#219
+ +#234#142#225#238'b'#201#228'0'#169#212#22#151#202#17#128#169#17#128#169#150
+ +#248#247#129#240#248'u'#234#248'w'#231#248'z'#231#248#143#236#247#164#240#247
+ +#172#239#244#127#212#230'='#168#204#16'v'#156#145#239#238's'#235#245'J'#215
+ +#237'"'#193#226'$'#177#208'A'#170#190'f'#185#197#134#213#225'b'#200#227'0'
+ +#169#212#22#153#204#17#128#169#17#128#169#165#233#236'x'#196#212'?'#158#188
+ +'3'#151#183#17#128#169#17#128#169#17#128#169'3'#151#183'<'#150#178'l'#140#141
+ +#13'c'#131#128#211#210'd'#205#214'<'#175#193'*'#135#150'aVDkT>R'#149#159'z'
+ +#193#204'`'#196#223'0'#169#212#22#153#204#17#128#169#17#128#169#25#135#174'<'
+ +#176#204'>'#202#230'$'#209#246'+'#214#251'V'#223#250#128#232#248#136#222#235
+ +'exuhE0'#10'Mfe'#155#152'hsc'#133'B'#27#156'7'#0#175'J'#1#153'3'#0'Rxzm'#172
+ +#182'\'#188#214'0'#169#212#22#153#204#17#128#169#17#128#169#142#241#242'u'
+ +#239#249'N'#227#250'&'#215#252'+'#214#251'V'#223#250#128#232#248#139#220#233
+ +#144'A'#23#153'3'#0'c9!'#148'8'#8#172'L'#14#192'd'#20#207'q'#17#205'k'#7#172
+ +'G'#1'oWAb'#156#165'X'#180#204'0'#168#211#22#153#204#17#128#169#17#128#169
+ +#150#248#247'u'#239#249'N'#227#250'&'#215#252'+'#214#251'V'#223#250#127#230
+ +#246#137#158#150#162'@'#10#188'i*'#193'q1'#212#140'A'#217#143'<'#215#138'6'
+ +#215#137'7'#213#132'1'#200'r('#150'I'#31'o'#181#181'z'#214#219'Q'#201#228#30
+ +#162#210#17#128#169#17#128#169#150#248#247'u'#239#249'N'#227#250'&'#215#252
+ +'+'#214#251'V'#223#250'}'#227#242#145'W3'#200#127'A'#229#179'q'#230#179'q'
+ +#227#173'j'#226#170'g'#225#165'b'#211#141'K'#191'n5'#168'N'#31#151'W/'#141
+ +#204#196#148#240#238#136#243#247'a'#230#250#17#128#169#17#128#169#150#248#247
+ +'u'#239#249'N'#227#250'&'#215#252'+'#214#251'V'#223#250#129#193#196#158';'#7
+ +#234#192#134#239#208#158#241#212#166#234#197#148#210#151'd'#178'_/'#161'J'#30
+ +#158#127'c'#151#209#201#149#242#240#152#248#246#153#249#247#17#128#169#17#128
+ +#169#255#0#255#17#128#169#150#248#247'u'#239#249'N'#227#250'&'#215#252'+'#214
+ ,#251'V'#223#250#134#173#168#160'N#'#191'{P'#229#197#160#225#190#154#164'H'#27
+ +'oA''Qbe'#17#128#169#17#128#169#17#128#169#17#128#169#17#128#169#17#128#169
+ +#255#0#255#255#0#255#255#0#255#17#128#169#163#249#248#174#246#251#172#246#251
+ +#160#246#249#156#249#247#153#249#247#153#249#247#150#233#230#141#152#133#150
+ +'Q*'#172'Y.'#144'4'#6#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#255#255
+ +#244#254#254#219#253#252#194#251#250#168#250#248#154#249#247#153#249#247#153
+ +#249#247#153#249#247#137#244#248'r'#172#170#144'4'#6#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#17#128#169#17#128#169#236#254#254#211#252#252#186#251
+ +#250#162#250#248#153#249#247#153#249#247#153#249#247#17#128#169#17#128#169
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#17
+ +#128#169#17#128#169#17#128#169#17#128#169#17#128#169#17#128#169#17#128#169
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+]);
+LazarusResources.Add('TDASCHEMA','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#0'K'#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0
+ +#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#0#255#255#0#255#0'K'#0
+ +#12#152#25#0'K'#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#128#0#0
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0#255#0
+ +#255#0'K'#0#24#169'-'#17#160'#'#12#152#25#0'K'#0#255#0#255#255#0#255#255#0
+ +#255#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#255
+ +#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0#0#0
+ +'K'#0'&'#186'D'#31#177'8'#24#169'-'#17#160'#'#12#152#25#0'K'#0#255#0#255#255
+ +#0#255#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0
+ +#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0'@'#0#0'4'
+ +#203'\,'#193'N&'#186'D'#31#177'8'#23#167','#17#159'!'#12#151#24#0'K'#0#255#0
+ +#255#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0
+ +#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0
+ +#0'>'#215'm4'#203'\,'#193'N&'#186'D'#29#176'6'#23#167','#17#159'!'#9#138#19#0
+ +'K'#0#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#255
+ +#255#255#255#255#255#128#0#0#128#0#0#255#255#255#255#255#255#128#0#0'@'#0#0
+ +'>'#215'm9'#209'f4'#203'\,'#193'N&'#186'D'#29#176'6'#17#151'"'#0'K'#0#255#0
+ +#255#255#0#255#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#128#0#0'@'#0#0#0'K'#0'>'#215'm9'#209'f4'#203'\,'#193'N'#28#164'3'#0'K'#0
+ +#255#0#255#255#0#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0
+ +#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#255#0#255#255#0
+ +#255#0'K'#0'>'#215'm9'#209'f&'#177'E'#0'K'#0#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0'K'#0'/'#188'T'#0'K'#0
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#0'K'#0'/'#188'T'#0'K'#0#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0'K'#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#0'K'#0#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0'K'#0
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#0'K'#0#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0
+ +'K'#0#0'K'#0#0'K'#0#0'K'#0#0'K'#0#0'K'#0#0'K'#0#0'K'#0#0'K'#0#0'K'#0#0'K'#0#0
+ +'K'#0#0'K'#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#0'K'#0#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#0'K'#0#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#0#0#130#0#0#130#0#0#130#0#0#130#0#0#130#0#0#130#0#0#130#0#0#130#0
+ +#0#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#0#0#130#3'('#255#0#30#254#0#24#243#0#18#225#0#13#204#1#10#182#3#7#164#0
+ +#0#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#0#0#130#12'5'#255#3'('#255#0'!'#255#0#24#243#0#18#225#0#15#212#1#10#187
+ +#0#0#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#0#0#130#24'C'#255#12'5'#255#3'('#255#0'!'#255#0#30#254#0#20#234#0
+ +#15#212#0#0#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#0#0#130'&R'#255#24'C'#255#18'='#255#3'('#255#0'!'#255#0#30#254
+ +#0#20#234#0#0#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#0#0#130'/]'#255'&R'#255#24'C'#255#22'A'#255#12'5'#255#0'!'#255
+ +#0#30#254#0#0#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ ,#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#0#0#130'1^'#255'1^'#255'1^'#255#24'C'#255#22'A'#255#12'5'#255
+ +#3'('#255#0#0#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#0#0#130'1^'#255'1^'#255'/]'#255'1^'#255#24'C'#255#22'A'#255#12
+ +'5'#255#0#0#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#0#0#130#0#0#130#0#0#130#0#0#130#0#0#130#0#0#130#0#0#130#0#0
+ +#130#0#0#130#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255
+]);
+LazarusResources.Add('TDASERVERLOG','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#194#30#0#0#194#30#0#0#0#0#0#0#0#0#0#0#255#0#255'>'#0#0'>'#0#0'>'#0
+ +#0'>'#0#0'>'#0#0'>'#0#0'>'#0#0'>'#0#0'>'#0#0'>'#0#0'>'#0#0'>'#0#0'>'#0#0#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'>'#0#0#183#129#131#183#129#131#183#129
+ +#131#183#129#131#183#129#131#183#129#131#183#129#131#183#129#131#183#129#131
+ +#255#0#255'}'#4#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255'}'#4
+ +#0'>'#0#0#254#220#182#254#216#173#254#220#182#254#215#171#254#215#171#254#215
+ +#171#254#215#171#254#215#171#179#137'{'#255#0#255'}'#4#0#255#255#255'}'#4#0
+ +'}'#4#0'}'#4#0#255#255#255#255#255#255'}'#4#0#255#255#255#255#255#255'}'#4#0
+ +#255#255#255'}'#4#0'>'#0#0#254#220#182#254#220#182#254#215#171#254#220#182
+ +#254#216#173#254#216#173#254#215#171#254#215#171#179#137'{'#255#0#255'}'#4#0
+ +#255#255#255'}'#4#0#255#255#255#255#255#255'}'#4#0#255#255#255'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0#255#255#255'}'#4#0'>'#0#0#254#220#182#254#220#182#0#153#0#254
+ +#216#173#254#220#182#254#216#173#254#216#173#254#216#173#179#137'{'#255#0#255
+ +'}'#4#0#255#255#255'}'#4#0#255#255#255#255#255#255'}'#4#0#255#255#255'}'#4#0
+ +#255#255#255#255#255#255'}'#4#0#255#255#255'}'#4#0'>'#0#0#254#222#185#0#153#0
+ +#0#153#0#0#153#0#254#220#182#254#216#173#254#216#173#254#216#173#179#137'{'
+ +#255#0#255'}'#4#0#255#255#255'}'#4#0'}'#4#0'}'#4#0#255#255#255#255#255#255
+ +#255#255#255'}'#4#0'}'#4#0#255#255#255#255#255#255'}'#4#0'>'#0#0#0#153#0'K'
+ +#144'<~'#164'^'#0#153#0'o'#156'Q'#254#220#182#254#216#173#254#216#173#179#137
+ +'{'#255#0#255'}'#4#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +'}'#4#0'>'#0#0#0#153#0#254#222#185#254#222#185#192#194#141#0#153#0#0#153#0
+ +#254#220#182#254#216#173#179#137'{'#255#0#255'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'
+ +#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0#254#228#198#254
+ +#228#198#254#228#198#254#222#185#254#222#185#242#217#178#0#153#0#0#153#0#254
+ +#220#182#179#137'{'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#179#137
+ +'{'#254#240#225#254#240#222#254#238#220#254#238#220#254#233#209#254#233#209
+ +#254#233#209#254#231#204#254#231#204#254#228#198#254#228#198#254#228#198#254
+ +#228#198#254#220#182#254#222#185#254#222#185#254#220#182#179#137'{'#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#182#139#128#254#240#225#254#240#225
+ +#254#240#222#254#238#220#254#238#220#254#238#220#254#233#209#254#233#209#254
+ +#232#206#254#231#204#254#228#198#0#153#0#254#228#198#254#228#198#254#222#185
+ +#254#222#185#254#222#185#179#137'{'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#186#142#130#254#244#233#254#240#225#254#240#225#254#240#225#254
+ +#238#220#254#238#220#254#233#209#254#233#209#254#233#209#254#232#206#0#153#0
+ +#0#153#0#0#153#0#254#228#198#254#228#198#254#222#185#254#222#185#179#137'{'
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#190#146#131#254#244#233
+ +#254#244#233#223#153'>'#223#153'>'#223#153'>'#223#153'>'#223#153'>'#223#153
+ +'>'#254#233#209#0#153#0'K'#147'A~'#169'g'#0#153#0'o'#160'X'#254#228#198#254
+ +#228#198#254#228#198#179#137'{'#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#194#150#133#255#248#239#254#244#233#254#244#233#254#244#233#254#240#225
+ +#254#240#225#254#240#225#254#238#220#254#238#220#0#153#0#254#231#204#254#233
+ +#209#192#201#156#0#153#0#0#153#0#254#228#198#254#224#190#179#137'{'#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#198#153#134#254#248#241#254#248#241
+ +#254#244#233#254#244#233#254#244#233#254#240#225#254#240#225#254#240#225#254
+ +#238#220#254#238#220#254#233#209#254#233#209#254#233#209#242#226#197#0#153#0
+ +#0#153#0#254#228#198#182#139#128#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#202#156#136#254#248#241#254#248#241#254#248#241#255#248#239#254#244
+ +#233#254#244#233#254#244#233#254#240#225#254#240#225#254#240#222#254#238#220
+ +#254#238#220#254#233#209#254#233#209#254#233#209#254#231#204#254#231#204#156
+ +#131'~'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#206#160#137#254#248
+ +#241#254#248#241#254#248#241#254#248#241#254#244#233#254#244#233#254#244#233
+ +#254#240#225#254#240#225#254#240#225#254#240#222#0#153#0#254#238#220#254#233
+ +#209#254#233#209#254#233#209#254#231#204#156#131'~'#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#210#163#138#255#252#249#255#252#249#254#248#241#254
+ +#248#241#254#248#241#254#248#241#255#248#239#254#244#233#254#244#233#254#240
+ +#225#0#153#0#0#153#0#0#153#0#254#238#220#254#238#220#254#233#209#254#232#206
+ +#156#131'~'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#210#163#138#254
+ +#248#241#255#252#249#223#153'>'#223#153'>'#223#153'>'#223#153'>'#223#153'>'
+ +#223#153'>'#254#244#233#0#153#0'K'#147'A~'#174'q'#0#153#0'o'#165'b'#254#238
+ ,#220#254#233#209#254#233#209#173#130't'#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#222#173#142#255#252#249#255#252#249#255#252#249#255#252#249
+ +#254#248#241#254#248#241#254#248#241#254#248#241#254#244#233#0#153#0#254#240
+ +#225#254#244#233#192#209#172#0#153#0#0#153#0#254#238#220#254#238#220#184#130
+ +#133#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#222#173#142#254#248
+ +#241#255#252#249#254#248#241#255#252#249#255#252#249#255#252#249#254#248#241
+ +#254#248#241#254#248#241#254#248#241#254#248#241#254#244#233#254#240#225#243
+ +#236#218#0#153#0#0#153#0#254#238#220#156#131'~'#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#222#173#142#255#252#249#255#252#249#255#252#249#255#252
+ +#249#255#252#249#255#252#249#255#252#249#255#252#249#254#248#241#254#248#241
+ +#255#248#239#254#244#233#254#244#233#254#244#233#254#240#225#254#240#225#254
+ +#240#222#156#131'~'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#222#173
+ +#142#254#248#241#255#252#249#254#248#241#255#252#249#254#248#241#255#252#249
+ +#254#248#241#255#252#249#254#248#241#254#248#241#254#248#241#254#248#241#255
+ +#248#239#254#244#233#254#244#233#254#240#225#254#240#225#156#131'~'#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#218#164#130#218#171#141#218#164#130
+ +#218#171#141#218#164#130#218#171#141#218#164#130#218#171#141#218#164#130#218
+ +#164#130#218#164#130#218#164#130#218#164#130#218#164#130#218#164#130#218#164
+ +#130#218#164#130#218#164#130#156#131'~'#255#0#255
+]);
+LazarusResources.Add('TDAXMLDATASTREAMER','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#142']'
+ +'Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'#142']Y'
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#225#189#255#221#181#255#217#172#255
+ +#213#165#255#211#157#255#207#151#255#203#145#255#201#140#255#199#135#128'PK'
+ +#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0
+ +#0#255#231#203#255#227#194#255#224#187#255#220#178#0#0#0#255#212#161#255#208
+ +#156#0#0#0#255#203#143#128'PK'#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0
+ +#255#255#255#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255
+ +#128#0#0'@'#0#0#255#238#217#255#233#208#255#230#199#255#226#191#0#0#0#255#218
+ +#175#255#215#166#0#0#0#255#207#152#128'PK'#128#0#0#255#255#255#128#0#0#255
+ +#255#255#255#255#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255
+ +#255#255#128#0#0'@'#0#0#255#243#229#255#240#222#255#235#213#255#233#204#255
+ +#229#197#0#0#0#0#0#0#255#216#171#255#213#165#128'PK'#128#0#0#255#255#255#128
+ +#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255
+ +#255#128#0#0#255#255#255#128#0#0'@'#0#0#7'9z'#255#246#233#255#242#225#255#238
+ +#218#0#0#0#255#231#203#255#227#193#0#0#0#255#218#176#128'PK'#128#0#0#255#255
+ +#255#128#0#0#128#0#0#128#0#0#255#255#255#255#255#255#255#255#255#128#0#0#128
+ +#0#0#255#255#255#255#255#255#128#0#0'@'#0#0#255#254#250#255#250#244#255#248
+ +#239#255#244#231#0#0#0#255#238#215#255#233#206#0#0#0#255#225#189#128'PK'#128
+ +#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0
+ +#255#255#255#255#254#252#255#252#247#255#250#242#255#246#235#255#243#227#255
+ +#239#220#255#235#211#255#231#203#128'PK'#128#0#0#128#0#0#128#0#0#128#0#0#128
+ +#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#254#250#255#251#246#255#248#239
+ +#255#244#231#255#242#225#255#238#217#128'PKHJK'#201#194#201#7'9z'#7'9z'#7'9z'
+ +'='#154#242'5'#149#239'-'#140#239#7'9z'#7'9z'#7'9zyyy'#194#140'm'#255#255#255
+ +#255#255#255#255#255#255#137#167#199#7'9z'#137#167#199#255#252#248#247#240
+ +#235#226#218#209#226#216#204'{MIHJK'#206#199#204#191#184#192#7'9z@'#157#242
+ +'@'#157#242'@'#157#242'9'#152#240'2'#145#239#7'9zE_{yyy'#203#147'o'#255#255
+ +#255#255#255#255#137#167#199#7'9z'#15's'#233#7'9z'#137#167#199#234#233#230
+ +#182#180#176#182#177#171'uIEHJK'#209#202#209#194#188#194'h'#129#163#7'9z@'
+ +#157#242'@'#157#242'@'#157#242#7'9zE_{{{{yyy'#209#153'r'#255#255#255#137#167
+ +#199#7'9z'#15's'#233#15's'#233#15's'#233#7'9zURf'#160'g['#160'g['#149'\KHJK'
+ +#213#207#213#197#191#197#194#188#194'Qk'#138#7'9z@'#157#242#7'9zId'#128'yzzy'
+ +'yyyyy'#216#159'u'#137#167#199#7'9z'#27'}'#235#22'y'#234#18'u'#233#15's'#233
+ +#15's'#233#7'9z'#254#176'J'#240#145','#225#132'.HJK'#217#213#217#201#196#202
+ +#199#192#198#150#146#152'0Kf'#7'9z,D^'#137#137#137#127#127#127#130#130#131'y'
+ +'yy'#220#163'v'#7'9z'#7'9z'#7'9z'#31#130#235#27'}'#235#22'y'#234#7'9z'#7'9z'
+ +#7'9z'#218#152'c'#255#0#255'HJK'#225#218#224#207#201#206#199#192#198#151#150
+ +#153'UWX'#175#175#177'JLM'#137#137#137#128#128#128#132#132#132#127#127#127
+ +#220#163'v'#209#146'm'#209#146'm'#7'9z-'#140#239'%'#135#238#31#130#237#7'9zX'
+ +'Th'#212#154's'#255#0#255#255#0#255'HJK'#231#226#230#212#207#211#225#218#224
+ +#152#149#152'UWX'#176#175#177'LNO'#150#149#149#132#131#131'vvvyyy'#143#143
+ +#143#131#132#132'*C]'#7'9z7'#150#240'2'#146#240#7'9z'#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255'HJK'#239#235#239#235#233#235#198#197#199#160#157
+ +#161'UWX'#164#165#167';=>'#130#130#131#137#137#137#143#143#143#137#137#137
+ +#147#147#147'Id'#128#7'9z@'#157#242'@'#157#242'='#154#242#7'9z'#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255'HJK'#238#237#238#178#177#180#156#153#156
+ +#159#158#161'RTU'#235#235#237'ossY[Z'#7'9z'#7'9z'#7'9z'#7'9z'#7'9z@'#157#242
+ +'@'#157#242#7'9z'#7'9z'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255'HJK'#237#235#237#129#129#130#213#209#212#207#207#208'`cdprrxy{'#138
+ +#142#140#171#172#172'Xt'#146#7'9z'#7'9z'#7'9z'#7'9z'#7'9z'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'HJK'#251#251
+ +#252#204#204#204#254#254#254#227#227#230#186#184#188#151#149#152#136#134#137
+ +'xy{rssfihehi'#150#152#153#150#152#153'HJK'#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'HJK'#255#255#255#251
+ +#251#252#238#238#242#237#238#240#231#230#233#217#213#217#196#192#196#172#170
+ +#172#151#145#151#136#131#136#150#142#146#136#129#131'HJK'#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ ,#255'HJK'#255#255#255#255#255#255#246#246#248#248#247#251#237#237#239#226#226
+ +#229#209#207#212#194#191#196#193#187#193#167#159#165'HJKHJK'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255'HJKHJK'#255#255#255#255#255#255#255#255#255
+ +#240#239#243#229#225#230#203#197#203'HJKHJK'#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'LNOHJKHJKHJKHJKHJK'
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Glyphs.res
new file mode 100644
index 0000000..f6af17a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Lazarus_Mac.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Lazarus_Mac.lpk
new file mode 100644
index 0000000..82ed795
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Lazarus_Mac.lpk
@@ -0,0 +1,353 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Lazarus_Unix.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Lazarus_Unix.lpk
new file mode 100644
index 0000000..4cde31d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Lazarus_Unix.lpk
@@ -0,0 +1,359 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Lazarus_Windows.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Lazarus_Windows.lpk
new file mode 100644
index 0000000..35d24ac
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Lazarus_Windows.lpk
@@ -0,0 +1,350 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Reg.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Reg.pas
new file mode 100644
index 0000000..a3d833e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Core_Reg.pas
@@ -0,0 +1,80 @@
+unit DataAbstract_Core_Reg;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+procedure Register;
+
+implementation
+
+uses
+ {$IFDEF FPC}LResources,{$ENDIF}
+ Classes,
+ uDARes, uDAInterfaces, uDAClasses, uDADriverManager,
+ uDABinAdapter, uDAXMLAdapter, uDADataTable, uDADesigntimeCall,uDABin2DataStreamer,
+ uDAJSONDataStreamer,
+ {$IFNDEF FPC}uDACDSDataTable,uDADatasetProvider,uDACache,{$ENDIF FPC}
+ uDARemoteDataAdapter,uDALocalDataAdapter,
+ {$IFDEF MSWINDOWS}
+ {$IFNDEF FPC}
+ uDAADODataTable,
+ {$ENDIF}
+ {$ENDIF MSWINDOWS}
+ uDABusinessProcessor,
+ uDADBSessionManager,
+ uDAServerLog,
+ uDAMemDataTable,
+ uDARemoteCommand, uDALocalCommand,
+ uDAPoweredByDataAbstractButton;
+
+{$IFNDEF FPC}
+ {$R DataAbstract_Core_Glyphs.res}
+{$ENDIF}
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName,
+ [TDAPoweredByDataAbstractButton,
+ TDADriverManager,
+ TDAConnectionManager,
+ TDASchema,
+ TDADiagrams,
+ TDADataDictionary,
+ TDABin2DataStreamer,
+ TDAXMLDataStreamer,
+ TDAJSONDataStreamer,
+ TDARemoteDataAdapter, TDALocalDataAdapter,
+ {$IFNDEF FPC}
+ TDADatasetProvider,
+ {$ENDIF FPC}
+ TDAMemDataTable,
+ TDABusinessProcessor,
+ TDADesigntimeCall,
+ TDADataSource,
+ TDARemoteCommand, TDALocalCommand,
+ TDAServerLog]);
+{$WARN SYMBOL_DEPRECATED OFF}
+ RegisterComponents('RemObjects Data Abstract (Legacy)', [TDABinAdapter,TDABinDataStreamer
+ {$IFNDEF FPC},TDACDSDataTable, TDAADODataTable, TDAXMLAdapter,TDACache{$ENDIF}]);
+{$WARN SYMBOL_DEPRECATED ON}
+ RegisterComponents('RemObjects SDK', [TDADBSessionManager]);
+end;
+
+{$IFDEF FPC}
+initialization
+ {$I DataAbstract_Core_Glyphs.lrs}
+{$ENDIF}
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.bdsproj
new file mode 100644
index 0000000..81d84c2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {20E037D4-6EF6-4096-ACA5-5BA32C54E59D}
+
+
+
+
+ DataAbstract_Scripting_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - Scripting Integration Library False
+
+
+
+ ..\Dcu\D10
+ ..\Dcu\D10
+ ..\Dcu\D10
+ ..\Dcu\D10;..\..\Pascal Script\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
+ $00000000
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.cfg
new file mode 100644
index 0000000..6d65c2e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.cfg
@@ -0,0 +1,52 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\Dcu\D10"
+-LE"..\Dcu\D10"
+-LN"..\Dcu\D10"
+-U"..\Dcu\D10;..\..\Pascal Script\Dcu\D10"
+-O"..\Dcu\D10;..\..\Pascal Script\Dcu\D10"
+-I"..\Dcu\D10;..\..\Pascal Script\Dcu\D10"
+-R"..\Dcu\D10;..\..\Pascal Script\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-SYMBOL_EXPERIMENTAL
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNIT_EXPERIMENTAL
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.dpk
new file mode 100644
index 0000000..14457eb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_Scripting_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Scripting Integration Library'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ dbrtl,
+ vcl,
+ RemObjects_Core_D10,
+ DataAbstract_Core_D10,
+ PascalScript_Core_D10;
+
+contains
+ uDAPascalScript in 'uDAPascalScript.pas',
+ uDAPSScriptingProvider in 'uDAPSScriptingProvider.pas',
+ DataAbstract_Scripting_Reg in 'DataAbstract_Scripting_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D11.dpk
new file mode 100644
index 0000000..2e5cb89
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D11.dpk
@@ -0,0 +1,42 @@
+package DataAbstract_Scripting_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Scripting Integration Library'}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ dbrtl,
+ vcl,
+ RemObjects_Core_D11,
+ DataAbstract_Core_D11,
+ PascalScript_Core_D11;
+
+contains
+ uDAPascalScript in 'uDAPascalScript.pas',
+ uDAPSScriptingProvider in 'uDAPSScriptingProvider.pas',
+ DataAbstract_Scripting_Reg in 'DataAbstract_Scripting_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D11.dproj
new file mode 100644
index 0000000..9a099a4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D11.dproj
@@ -0,0 +1,560 @@
+
+
+ {3fb27763-9440-44c3-bb51-17969172e8fe}
+ DataAbstract_Scripting_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\Dcu\D11\DataAbstract_Scripting_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ 0
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11;..\..\Pascal Script for Delphi\Dcu\D11
+ ..\Dcu\D11;..\..\Pascal Script for Delphi\Dcu\D11
+ ..\Dcu\D11;..\..\Pascal Script for Delphi\Dcu\D11
+ ..\Dcu\D11;..\..\Pascal Script for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11;..\..\Pascal Script for Delphi\Dcu\D11
+ ..\Dcu\D11;..\..\Pascal Script for Delphi\Dcu\D11
+ ..\Dcu\D11;..\..\Pascal Script for Delphi\Dcu\D11
+ ..\Dcu\D11;..\..\Pascal Script for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - Scripting Integration Library False False False True False 6 0 43 801 False False False False False 1033 1252 RemObjects Software 6.0.43.801 RemObjects SDK 1.0.0.0 DataAbstract_Scripting_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D12.dpk
new file mode 100644
index 0000000..aa68349
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D12.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_Scripting_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Scripting Integration Library'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ RemObjects_Core_D12,
+ DataAbstract_Core_D12,
+ PascalScript_Core_D12;
+
+contains
+ uDAPascalScript in 'uDAPascalScript.pas',
+ uDAPSScriptingProvider in 'uDAPSScriptingProvider.pas',
+ DataAbstract_Scripting_Reg in 'DataAbstract_Scripting_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D12.dproj
new file mode 100644
index 0000000..a58aede
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D12.dproj
@@ -0,0 +1,90 @@
+
+
+ {3fb27763-9440-44c3-bb51-17969172e8fe}
+ DataAbstract_Scripting_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\Dcu\D11\DataAbstract_Scripting_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ ..\Dcu\D12
+ ..\Dcu\D12
+ ..\Dcu\D12;..\..\Pascal Script for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ ..\Dcu\D12
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\Dcu\D12\DataAbstract_Scripting_D12.bpl
+ RemObjects Data Abstract - Scripting Integration Library
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_Scripting_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D12.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D14.dpk
new file mode 100644
index 0000000..e6f3cb6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D14.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_Scripting_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Scripting Integration Library'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ RemObjects_Core_D14,
+ DataAbstract_Core_D14,
+ PascalScript_Core_D14;
+
+contains
+ uDAPascalScript in 'uDAPascalScript.pas',
+ uDAPSScriptingProvider in 'uDAPSScriptingProvider.pas',
+ DataAbstract_Scripting_Reg in 'DataAbstract_Scripting_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D14.dproj
new file mode 100644
index 0000000..3fb2d6e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D14.dproj
@@ -0,0 +1,90 @@
+
+
+ {3fb27763-9440-44c3-bb51-17969172e8fe}
+ DataAbstract_Scripting_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\Dcu\D11\DataAbstract_Scripting_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ ..\Dcu\D14
+ ..\Dcu\D14
+ ..\Dcu\D14;..\..\Pascal Script for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ ..\Dcu\D14
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\Dcu\D14\DataAbstract_Scripting_D14.bpl
+ RemObjects Data Abstract - Scripting Integration Library
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_Scripting_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D14.res
new file mode 100644
index 0000000..0593ed9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.cfg
new file mode 100644
index 0000000..d94514b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\Dcu\D6"
+-LE"..\Dcu\D6"
+-LN"..\Dcu\D6"
+-U"..\Dcu\D6;..\..\RemObjects SDK for Delphi\Dcu\D6"
+-O"..\Dcu\D6;..\..\RemObjects SDK for Delphi\Dcu\D6"
+-I"..\Dcu\D6;..\..\RemObjects SDK for Delphi\Dcu\D6"
+-R"..\Dcu\D6;..\..\RemObjects SDK for Delphi\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.dof
new file mode 100644
index 0000000..75f52a1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Scripting Integration Library
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\Dcu\D6
+PackageDLLOutputDir=..\Dcu\D6
+PackageDCPOutputDir=..\Dcu\D6
+SearchPath=..\Dcu\D6;..\..\RemObjects SDK for Delphi\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=3.0.0.280
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.dpk
new file mode 100644
index 0000000..4c39879
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_Scripting_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Scripting Integration Library'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ dbrtl,
+ vcl,
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6,
+ PascalScript_Core_D6;
+
+contains
+ uDAPascalScript in 'uDAPascalScript.pas',
+ uDAPSScriptingProvider in 'uDAPSScriptingProvider.pas',
+ DataAbstract_Scripting_Reg in 'DataAbstract_Scripting_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.res
new file mode 100644
index 0000000..5f31444
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.cfg
new file mode 100644
index 0000000..b26eab1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.cfg
@@ -0,0 +1,46 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\Dcu\D7"
+-LE"..\Dcu\D7"
+-LN"..\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.dof
new file mode 100644
index 0000000..97dc0fb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Scripting Integration Library
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\Dcu\D7
+PackageDLLOutputDir=..\Dcu\D7
+PackageDCPOutputDir=..\Dcu\D7
+SearchPath=
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=ROServiceTester
+FileVersion=3.0.0.257
+InternalName=ROServiceTester
+LegalCopyright=Copyright RemObjects Software 2002
+LegalTrademarks=RemObjects Software 2002
+OriginalFilename=ROServiceTester.exe
+ProductName=RemObjects SDK
+ProductVersion=3.0.0.0
+Compile Date=Sunday, March 21, 2004 5:55 PM
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.dpk
new file mode 100644
index 0000000..34f8513
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.dpk
@@ -0,0 +1,43 @@
+package DataAbstract_Scripting_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Scripting Integration Library'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ dbrtl,
+ vcl,
+ RemObjects_Core_D7,
+ DataAbstract_Core_D7,
+ PascalScript_Core_D7,
+ dsnap,
+ adortl;
+
+contains
+ uDAPascalScript in 'uDAPascalScript.pas',
+ uDAPSScriptingProvider in 'uDAPSScriptingProvider.pas',
+ DataAbstract_Scripting_Reg in 'DataAbstract_Scripting_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Glyphs.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Glyphs.lrs
new file mode 100644
index 0000000..ad57b0f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Glyphs.lrs
@@ -0,0 +1,79 @@
+LazarusResources.Add('TDAPSSCRIPTINGPROVIDER','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#1'>'#3#1'='#3#1'<'#3#1';'#3#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0
+ +#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#1'='#3#3#151#11#3#137#10#3#128#9#2
+ +'z'#9#1'.'#2#1'4'#3#255#0#255#255#0#255#255#0#255#128#0#0#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0#4#158#15#3#151#11#3#149
+ +#11#3#149#11#3#145#10#3#132#10#2't'#9#1'-'#2'111'#255#0#255#128#0#0#255#255
+ +#255#128#0#0#128#0#0#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#255
+ +#255#255#128#0#0#255#255#255#128#0#0'@'#0#0#7#163#24#5#160#16#3#158#12#3#158
+ +#12#3#158#12#3#158#12#3#151#11#3'~'#9#1'.'#2#255#0#255#128#0#0#255#255#255
+ +#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0
+ +#128#0#0#255#255#255#128#0#0'@'#0#0#12#166'#'#8#163#26#255#255#255#3#158#12#3
+ +#158#12#3#158#12#3#158#12#3#154#12#1'0'#3#255#0#255#128#0#0#255#255#255#128#0
+ +#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255
+ +#255#128#0#0#255#255#255#128#0#0'@'#0#0#15#170'.'#12#166'%'#255#255#255#255
+ +#255#255#3#159#13#3#158#12#3#158#12#3#158#12#3#146#11#2'V'#5#128#0#0#255#255
+ +#255#128#0#0#128#0#0#128#0#0#255#255#255#255#255#255#255#255#255#128#0#0#128
+ +#0#0#255#255#255#255#255#255#128#0#0'@'#0#0#20#173':'#17#170'0'#255#255#255
+ +#255#255#255#255#255#255#4#159#15#3#158#12#3#158#12#3#156#12#2'_'#6#128#0#0
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0#24
+ +#177'G'#21#173'='#255#255#255#255#255#255#255#255#255#7#163#24#4#160#16#3#158
+ +#12#3#158#12#2'g'#6#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#28#178'N'#28#178'N'#26#177
+ +'I'#255#255#255#255#255#255#15#169','#11#166'#'#8#163#25#5#160#17#3#158#12#2
+ +'g'#6#255#0#255'KKK'#217#217#217#177#176#176#166#165#165#152#152#152#145#145
+ +#145#137#137#137#255#255#255#255#255#255'D'#173'Mb'#206#137#137#218#167'&'
+ +#183'W'#28#178'N'#28#178'N'#255#255#255#23#175'A'#19#172'7'#15#170'-'#12#166
+ +'$'#9#164#28#6#161#19#2'P'#5#255#0#255'KKK'#226#226#226#193#193#193#177#177
+ +#177#159#159#159#153#153#153#144#144#144#209#209#209#255#255#255#177#215#163
+ +#10#143#22#154#225#181#131#217#164'.'#187'^'#28#178'N'#28#178'N'#27#178'L'#24
+ +#176'D'#20#173':'#16#170'0'#13#167''''#7#135#16#255#0#255#255#0#255'KKK'#234
+ +#233#233#209#208#208#189#188#188#167#167#167#163#163#163#151#151#151#194#193
+ +#193#240#240#240#206#206#206'O'#180'T'#11#144#24#165#227#188#173#230#196'i'
+ +#208#143'A'#193'n5'#189'e6'#189'f-'#184'Y'#24#175'@'#9#139#19'5='#10#255#0
+ +#255#255#0#255'KKK'#238#238#238#218#218#218#198#198#198#176#175#175#171#170
+ +#170#158#158#158#177#177#177#226#226#226#208#208#208#166#166#166'_'#187'c'#10
+ +#143#22'o'#211#149#153#224#180#149#222#176'}'#215#158'Z'#203#131'/'#187'`'#11
+ +#140#22'K'#128':111'#255#0#255#255#0#255'KKK'#240#240#240#225#225#225#206#204
+ +#204#182#182#182#199#199#199#191#190#190#153#152#152#227#227#227#226#226#226
+ +#136#136#136#255#255#255#177#217#167'D'#178'O'#9#142#20#10#143#22#10#142#22#9
+ +#139#19'B'#153'C'#176#186#132'~ee111'#255#0#255#255#0#255'KKK'#242#242#242
+ +#230#230#230#212#211#211#191#189#189#204#204#204#234#234#234#218#218#218#229
+ +#229#229#228#228#228#142#142#142#255#255#255#255#255#255#130#129#129#132#127
+ +#127#138#127'~'#143#127#127#147'~~'#152'~~'#158'~}zee111'#255#0#255#255#0#255
+ +'KKK'#243#242#242#233#233#233#218#218#218#196#196#196#197#196#196#228#227#227
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#187#185#185#137#127'~'#143#127#127#146'~~'#152'~~wfe111'
+ +#255#0#255#255#0#255'KKK'#243#243#243#235#235#235#224#224#224#206#204#204#207
+ +#207#207#199#199#199#188#188#188#180#178#178#171#171#171#163#161#161#156#156
+ +#156#147#147#147#140#140#140#134#134#134#130#129#129#131#127#127#137'~~'#143
+ +#127'~'#146'~~uff111'#255#0#255#255#0#255'KKK'#243#243#243#238#238#238#230
+ +#230#230#208#207#207#211#211#211#204#204#204#197#196#196#189#188#188#181#181
+ +#181#173#172#172#170#169#169#159#159#159#151#151#151#142#142#142#134#134#134
+ +#130#130#130#131#127#127#136#127#127#142#127'~pgg111'#255#0#255#255#0#255'KK'
+ +'K'#243#243#243#240#239#239#238#238#238#220#218#218#216#216#216#213#213#213
+ +#206#204#204#199#198#198#191#189#189#183#182#182#182#182#182#171#171#171#159
+ +#158#158#150#149#149#143#143#143#135#135#135#130#130#130#130#127#127#135#127
+ +#127'mgf111'#255#0#255#255#0#255'KKK'#242#242#242#238#238#238#243#242#242#240
+ +#239#239#238#238#238#235#235#235#231#231#231#226#226#226#218#218#218#208#208
+ +#208#198#198#198#183#182#182#170#170#170#157#157#157#149#147#147#140#140#140
+ ,#136#136#136#131#131#131#130#127#127'kgg111'#255#0#255#255#0#255'KKK'#239#239
+ +#239#233#233#233#238#238#238#242#240#240#242#240#240#239#239#239#237#237#237
+ +#234#234#234#227#227#227#218#218#218#206#206#206#193#193#193#177#177#177#165
+ +#164#164#156#156#156#149#149#149#140#140#140#137#136#136#131#131#131'hgg111'
+ +#255#0#255#255#0#255'KKK'#216#216#216#239#239#239#242#242#242#243#243#243#244
+ +#244#244#243#243#243#243#242#242#242#240#240#239#239#239#235#235#235#230#230
+ +#230#225#224#224#217#217#217#211#211#211#207#207#207#203#202#202#199#199#199
+ +#197#197#197#194#194#194'hgg111'#255#0#255#255#0#255#255#0#255'QQQQQQQQQQQQQ'
+ +'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQSSSQQQQQQQQQQQQ'#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Glyphs.res
new file mode 100644
index 0000000..fa5cad1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Lazarus_Unix.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Lazarus_Unix.lpk
new file mode 100644
index 0000000..35f6313
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Lazarus_Unix.lpk
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Lazarus_Windows.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Lazarus_Windows.lpk
new file mode 100644
index 0000000..b7fb091
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Lazarus_Windows.lpk
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Reg.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Reg.pas
new file mode 100644
index 0000000..f71baf2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_Scripting_Reg.pas
@@ -0,0 +1,40 @@
+unit DataAbstract_Scripting_Reg;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+procedure Register;
+
+implementation
+
+uses
+ {$IFDEF FPC}LResources,{$ENDIF}
+ Classes, uDAPSScriptingProvider, uDARes;
+
+{$IFNDEF FPC}
+ {$R DataAbstract_Scripting_Glyphs.res}
+{$ENDIF FPC}
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAPSScriptingProvider]);
+end;
+
+{$IFDEF FPC}
+initialization
+ {$I DataAbstract_Scripting_Glyphs.lrs}
+{$ENDIF}
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.bdsproj
new file mode 100644
index 0000000..ddab013
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.bdsproj
@@ -0,0 +1,177 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {07EA6B1E-3F93-43E7-91C5-50005788308E}
+
+
+
+
+ DataAbstract_SimpleQuery_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - Korzh SimpleQuery Integration Library False
+
+
+
+ ..\Dcu\D10
+ ..\Dcu\D10
+ ..\Dcu\D10
+ ..\Dcu\D10;..\..\RemObjects SDK for Dephi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.cfg
new file mode 100644
index 0000000..c44bc25
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.cfg
@@ -0,0 +1,44 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\Dcu\D10"
+-LE"..\Dcu\D10"
+-LN"..\Dcu\D10"
+-U"..\Dcu\D10;..\..\RemObjects SDK for Dephi\Dcu\D10"
+-O"..\Dcu\D10;..\..\RemObjects SDK for Dephi\Dcu\D10"
+-I"..\Dcu\D10;..\..\RemObjects SDK for Dephi\Dcu\D10"
+-R"..\Dcu\D10;..\..\RemObjects SDK for Dephi\Dcu\D10"
+-Z
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.dpk
new file mode 100644
index 0000000..9f33f70
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.dpk
@@ -0,0 +1,42 @@
+package DataAbstract_SimpleQuery_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Korzh SimpleQuery Integration Library'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ RemObjects_Core_D10,
+ dbrtl,
+ vcl,
+ DataAbstract_Core_D10,
+ PascalScript_Core_D10,
+ sq7,
+ kprocs7;
+
+contains
+ uDAKDBInfo in 'uDAKDBInfo.pas',
+ DataAbstract_SimpleQuery_Reg in 'DataAbstract_SimpleQuery_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.res
new file mode 100644
index 0000000..c73b102
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D11.dpk
new file mode 100644
index 0000000..795f67f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D11.dpk
@@ -0,0 +1,42 @@
+package DataAbstract_SimpleQuery_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Korzh SimpleQuery Integration Library'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ RemObjects_Core_D11,
+ dbrtl,
+ vcl,
+ DataAbstract_Core_D11,
+ PascalScript_Core_D11,
+ sq11,
+ kprocs11;
+
+contains
+ uDAKDBInfo in 'uDAKDBInfo.pas',
+ DataAbstract_SimpleQuery_Reg in 'DataAbstract_SimpleQuery_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D11.dproj
new file mode 100644
index 0000000..58bef6e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D11.dproj
@@ -0,0 +1,71 @@
+
+
+ {12feb998-13fa-45f9-8ee6-f5ab6077ef8e}
+ DataAbstract_SimpleQuery_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\Dcu\D11\DataAbstract_SimpleQuery_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ 0
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D10
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D10
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D10
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D10
+ RELEASE
+
+
+ 7.0
+ True
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D11
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D11
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D11
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D11
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - Korzh SimpleQuery Integration Library False False False True False 1 0 0 0 False False False False False 1033 1252 1.0.0.0 1.0.0.0 DataAbstract_SimpleQuery_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D11.res
new file mode 100644
index 0000000..c73b102
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.cfg
new file mode 100644
index 0000000..e2a8294
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.cfg
@@ -0,0 +1,47 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"s:\exe"
+-N"..\Dcu\D6"
+-LE"..\Dcu\D6"
+-LN"..\Dcu\D6"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.dof
new file mode 100644
index 0000000..29abd6f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.dof
@@ -0,0 +1,114 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Korzh SimpleQuery Integration Library
+
+[Directories]
+UnitOutputDir=..\Dcu\D6
+PackageDLLOutputDir=..\Dcu\D6
+PackageDCPOutputDir=..\Dcu\D6
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=ROServiceTester
+FileVersion=3.0.0.257
+InternalName=ROServiceTester
+LegalCopyright=Copyright RemObjects Software 2002
+LegalTrademarks=RemObjects Software 2002
+OriginalFilename=ROServiceTester.exe
+ProductName=RemObjects SDK
+ProductVersion=3.0.0.0
+Compile Date=Sunday, March 21, 2004 5:55 PM
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.dpk
new file mode 100644
index 0000000..b8c2834
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.dpk
@@ -0,0 +1,42 @@
+package DataAbstract_SimpleQuery_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Korzh SimpleQuery Integration Library'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ RemObjects_Core_D6,
+ dbrtl,
+ vcl,
+ DataAbstract_Core_D6,
+ PascalScript_Core_D6,
+ sq6,
+ kprocs6;
+
+contains
+ uDAKDBInfo in 'uDAKDBInfo.pas',
+ DataAbstract_SimpleQuery_Reg in 'DataAbstract_SimpleQuery_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.res
new file mode 100644
index 0000000..fff68a1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.cfg
new file mode 100644
index 0000000..b26eab1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.cfg
@@ -0,0 +1,46 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\Dcu\D7"
+-LE"..\Dcu\D7"
+-LN"..\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.dof
new file mode 100644
index 0000000..7e2dfdc
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Korzh SimpleQuery Integration Library
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\Dcu\D7
+PackageDLLOutputDir=..\Dcu\D7
+PackageDCPOutputDir=..\Dcu\D7
+SearchPath=
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=ROServiceTester
+FileVersion=3.0.0.257
+InternalName=ROServiceTester
+LegalCopyright=Copyright RemObjects Software 2002
+LegalTrademarks=RemObjects Software 2002
+OriginalFilename=ROServiceTester.exe
+ProductName=RemObjects SDK
+ProductVersion=3.0.0.0
+Compile Date=Sunday, March 21, 2004 5:55 PM
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.dpk
new file mode 100644
index 0000000..63ff17e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.dpk
@@ -0,0 +1,42 @@
+package DataAbstract_SimpleQuery_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Korzh SimpleQuery Integration Library'}
+{$IMPLICITBUILD ON}
+
+requires
+ rtl,
+ RemObjects_Core_D7,
+ dbrtl,
+ vcl,
+ DataAbstract_Core_D7,
+ PascalScript_Core_D7,
+ sq7,
+ kprocs7;
+
+contains
+ uDAKDBInfo in 'uDAKDBInfo.pas',
+ DataAbstract_SimpleQuery_Reg in 'DataAbstract_SimpleQuery_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.res
new file mode 100644
index 0000000..fff68a1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_Glyphs.res
new file mode 100644
index 0000000..4a5d497
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_Reg.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_Reg.pas
new file mode 100644
index 0000000..5a9be83
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/DataAbstract_SimpleQuery_Reg.pas
@@ -0,0 +1,33 @@
+unit DataAbstract_SimpleQuery_Reg;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library
+{
+{ compiler: Delphi 6 and up, Kylix 3 and up
+{ platform: Win32, Linux
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+{$R DataAbstract_SimpleQuery_Glyphs.res}
+
+interface
+
+procedure Register;
+
+implementation
+
+uses
+ Classes, uDAKDBInfo;
+
+procedure Register;
+begin
+ RegisterComponents('Data Abstract', [TDAKDBConnectionInfo, TDAKDBSchemaInfo]);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/ASGRout3.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/ASGRout3.pas
new file mode 100644
index 0000000..6382a1b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/ASGRout3.pas
@@ -0,0 +1,424 @@
+{*_* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+Author: Albert Drent
+Description: ASGRout parser routines
+Creation: Januari 1998
+Version: 1.2.B
+EMail: a.drent@aducom.com (www.aducom.com)
+Support: support@aducom.com (www.aducom.com)
+Legal issues: Copyright (C) 2003 by Aducom Software
+
+ Aducom Software
+ Eckhartstr 61
+ 9746 BN Groningen
+ Netherlands
+
+ This software is provided 'as-is', without any express or
+ implied warranty. In no event will the author be held liable
+ for any damages arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any
+ purpose, including commercial applications, and to alter it
+ and redistribute it freely, subject to the following
+ restrictions:
+
+ 1. The origin of this software must not be misrepresented,
+ you must not claim that you wrote the original software.
+ If you use this software in a product, an acknowledgment
+ in the product documentation would be appreciated but is
+ not required.
+
+ 2. Altered source versions must be plainly marked as such, and
+ must not be misrepresented as being the original software.
+
+ 3. If you make changes which improves the component you must
+ mail these to aducom as the moderator of the components
+ complete with documentation for the benefits of the community.
+
+ 4. You are not allowed to create commercial available components
+ using this software. If you use this source in any way to create
+ your own components, your source should be free of charge,
+ available to anyone. It's a far better idea to distribute your
+ changes through Aducom Software.
+
+ 5. This notice may not be removed or altered from any source
+ distribution.
+
+ 6. You must register this software by entering the support forum.
+ I like to keep track about where the components are used, so
+ sending a picture postcard to the author would be appreciated.
+ Use a nice stamp and mention your name, street
+ address, EMail address and any comment you like to say.
+
+Modifications
+ 26/5/2004 Function YYYYMMDDParser by JPierce, necessary for
+ locale independent datehandling in SQLite components.
+ 1/9/2005 Changes to the StrToFloatX routine, now depending on
+ decimalseparator.
+
+*_* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
+
+unit ASGRout3;
+
+interface
+
+uses SysUtils;
+
+const
+ vtcIdentifier = 1;
+ vtcNumber = 2;
+ vtcAssignment = 3;
+ vtcQString = 4;
+ vtcDString = 5;
+ vtcRelOp = 6;
+ vtcFloat = 7;
+ vtcDelimiter = 8;
+ vtcEof = 9;
+
+procedure FindErrorPos(InString: string; ErrPos: integer;
+ var TheLine, TheCol: integer);
+function GetWord(var InString: string; var StartPos: integer;
+ var VarType: integer): string;
+function GetWordByDelim(var InString: string; var StartPos: integer;
+ var Delim: string): string;
+function PeekWord(var InString: string; StartPos: integer;
+ var VarType: integer): string;
+function Recover(var InString: string; var StartPos: integer): boolean;
+function StrToIntX(StrIn: string): integer;
+function StrToFloatX(StrIn : string) : extended;
+function StrToDateX(TheDate: string): TDateTime;
+function StrToDateTimeX(const S: string): TDateTime;
+function YYYYMMDDParser(Str: PChar): TDateTime;
+function FloatParser(Str: string): string;// jordi march
+
+implementation
+
+function FloatParser(Str: string): string;// jordi march
+var
+ Point: Byte;
+begin
+ if DecimalSeparator <> '.' then begin
+ Point := Pos ('.', Str);
+ if Point <> 0
+ then Str[Point] := DecimalSeparator;
+ end;
+ Result := Str;
+end;
+
+ //==============================================================================
+ // Convert dates to a correct datetime notation. Try several notations,
+ // starting with the system defaults
+ //==============================================================================
+
+function StrToDateTimeX(const S: string): TDateTime;
+begin
+ if S = '' then
+ StrToDateTimeX := 0
+ else begin
+ try
+ StrToDateTimeX := StrToDateTime(S);
+ except
+ StrToDateTimeX := StrToDateX(s);
+ end;
+ end;
+end;
+
+function StrToDateX(TheDate: string): TDateTime;
+var
+ DateFormat: string;
+ DateSep: char;
+begin
+ DateFormat := ShortDateFormat; // save current settings
+ DateSep := DateSeparator;
+ try
+ try
+ StrToDateX := StrToDate(TheDate)
+ except
+ DateSeparator := '-';
+ ShortDateFormat := 'dd-mm-yyyy';
+ try
+ StrToDateX := StrToDate(TheDate)
+ except
+ ShortDateFormat := 'yyyy-mm-dd';
+ try
+ StrToDateX := StrToDate(TheDate)
+ except
+ StrToDateX := StrToDateX('01-01-1900');
+ raise;
+ end;
+ end;
+ end;
+ finally
+ ShortDateFormat := DateFormat;
+ DateSeparator := DateSep;
+ end;
+end;
+
+// Routine submitted by jpierce, modified to accept more types
+// It requires that the date be in strict yyyy-mm-dd [hh:nn:[ss[:mmm]]]
+
+function YYYYMMDDParser(Str: PChar): TDateTime;
+var
+ Year, Month, Day, Hour, Min, Sec, MSec: Word;
+begin
+ Result := 0;
+
+ try
+ if Length(Str) >= 10 then // 10 = Length of YYYY-MM-DD
+ begin
+ Year := StrToInt(Copy(Str, 1, 4));
+ Month := StrToInt(Copy(Str, 6, 2));
+ Day := StrToInt(Copy(Str, 9, 2));
+
+ Result := EncodeDate(Year, Month, Day);
+ end;
+
+ if Length(Str) > 10 then // it has a time
+ begin
+ Hour := StrToInt(Copy(Str, 12, 2));
+ Min := StrToInt(Copy(Str, 15, 2));
+ Sec := 0;
+ MSec := 0;
+ if Length(Str) > 16 then Sec := StrToInt(Copy(Str, 18, 2));
+ if Length(Str) > 19 then Msec := StrToInt(Copy(Str, 21, 3));
+ Result := Result + EncodeTime(Hour, Min, Sec, MSec);
+ end;
+ except
+ Result := 0;
+ end;
+end;
+
+function StrToIntX(StrIn: string): integer;
+var
+E: Integer;
+begin
+ Val(StrIn, Result, E);
+ if E <> 0 then Result := 0;
+end;
+
+function StrToFloatX(StrIn : string) : extended;
+begin
+ if not TextToFloat(PChar(StrIn), Result, fvExtended) then
+ Result := 0;
+end;
+
+procedure FindErrorPos(InString: string; ErrPos: integer;
+ var TheLine, TheCol: integer);
+var
+ i: integer;
+begin
+ TheLine := 1;
+ TheCol := 1;
+ i := 1;
+ while i < ErrPos do
+ begin
+ if InString[i] in [ #10, #13] then
+ begin
+ Inc(TheLine);
+ TheCol := 1;
+ Inc(i);
+ Inc(i);
+ end
+ else
+ begin
+ Inc(TheCol);
+ Inc(i);
+ end;
+ end;
+end;
+
+function Recover(var InString: string;
+ var StartPos: integer): boolean;
+begin
+ if (StartPos > Length(InString)) then
+ begin
+ Recover := false;
+ exit;
+ end;
+
+ while (Startpos < Length(InString)) and
+ ( not (InString[StartPos] in [ #10, #13])) do
+ Inc(StartPos);
+ Recover := true;
+end;
+
+function PeekWord(var InString: string; StartPos: integer;
+ var VarType: integer): string;
+begin
+ PeekWord := GetWord(InString, StartPos, VarType);
+end;
+
+function GetWordByDelim(var InString: string;
+ var StartPos: integer;
+ var Delim: string): string;
+var
+ Ret: string;
+begin
+ Ret := '';
+ while (StartPos <= Length(InString)) and (InString[StartPos] = ' ') do
+ Inc(StartPos);
+ while (StartPos <= Length(InString)) and (Pos(InString[StartPos], Delim) = 0) do
+ begin
+ Ret := Ret + InString[StartPos];
+ Inc(StartPos);
+ end;
+ GetWordByDelim := Trim(Ret);
+end;
+
+function GetWord(var InString: string; var StartPos: integer;
+ var VarType: integer): string;
+var
+ TheChar: char;
+ Rv: string;
+begin
+ if (StartPos > Length(InString)) then
+ begin
+ GetWord := '';
+ VarType := vtcEof;
+ exit;
+ end;
+
+ while (StartPos <= Length(InString)) and (InString[StartPos] <= #32) do
+ Inc(StartPos);
+
+ TheChar := InString[StartPos];
+ Rv := '';
+
+ if TheChar in ['a'..'z', 'A'..'Z'] then
+ VarType := vtcIdentifier
+ else if TheChar in ['0'..'9', '-'] then
+ VarType := vtcNumber
+ else if TheChar = ':' then
+ VarType := vtcAssignment
+ else if TheChar = '"' then
+ VarType := vtcDString
+ else if TheChar = '''' then
+ VarType := vtcQString
+ else if TheChar in ['>', '=', '<'] then
+ VarType := vtcRelOp
+ else
+ begin
+ Inc(StartPos);
+ if TheChar = '!' then
+ begin
+ Recover(InString, StartPos);
+ Rv := GetWord(InString, StartPos, VarType);
+ GetWord := Rv;
+ end
+ else
+ begin
+ GetWord := TheChar;
+ end;
+ exit;
+ end;
+
+ case VarType of
+ vtcIdentifier:
+ begin
+ while InString[StartPos] in ['a'..'z', 'A'..'Z', '_','0'..'9'] do
+ begin
+ Rv := Rv + InString[StartPos];
+ Inc(StartPos);
+ end;
+ end;
+ vtcNumber:
+ begin
+ while InString[StartPos] in ['-', '0'..'9', '.'] do
+ begin
+ if InString[StartPos] = '.' then
+ VarType := vtcFloat;
+ Rv := Rv + InString[StartPos];
+ Inc(StartPos);
+ end;
+ if VarType = vtcFloat then
+ Rv := FloatToStr(StrToFloat(Rv))
+ else
+ Rv := IntToStr(StrToInt(Rv));
+ end;
+ vtcAssignment:
+ begin
+ Rv := InString[StartPos];
+ Inc(StartPos);
+ if InString[StartPos] = '=' then
+ begin
+ Inc(StartPos);
+ Rv := ':=';
+ end
+ else
+ begin
+ VarType := vtcDelimiter;
+ Rv := ':';
+ end;
+ end;
+ vtcQString:
+ begin
+ Inc(StartPos);
+ while InString[StartPos] <> '''' do
+ begin
+ Rv := Rv + InString[StartPos];
+ Inc(StartPos);
+ end;
+ Inc(StartPos);
+ end;
+ vtcDString:
+ begin
+ Inc(StartPos);
+ while InString[StartPos] <> '"' do
+ begin
+ Rv := Rv + InString[StartPos];
+ Inc(StartPos);
+ end;
+ Inc(StartPos);
+ end;
+ vtcRelOp:
+ begin
+ Rv := InString[StartPos];
+ if Rv = '<' then
+ begin
+ if InString[StartPos + 1] in ['=', '>'] then
+ begin
+ Rv := Rv + InString[StartPos + 1];
+ StartPos := StartPos + 2;
+ end
+ else
+ begin
+ Inc(StartPos);
+ end;
+ end
+ else if Rv = '>' then
+ begin
+ if InString[StartPos + 1] in ['=', '<'] then
+ begin
+ Rv := Rv + InString[StartPos + 1];
+ StartPos := StartPos + 2;
+ end
+ else
+ begin
+ Inc(StartPos);
+ end;
+ end
+ else
+ begin
+ Inc(StartPos);
+ end;
+ end;
+ end;
+ GetWord := Rv;
+end;
+
+{$IFDEF SQLite_Static}
+Var
+ TZInfo :_TIME_ZONE_INFORMATION;
+ TZRes :Integer;
+
+initialization
+ PInteger(@__timezone)^:=0;
+ PInteger(@__daylight)^:=0;
+ TZRes:=GetTimezoneInformation(TZInfo);
+ if TZRes>=0 Then
+ PInteger(@__timezone)^:=TZInfo.Bias*60;
+ if TZRes=TIME_ZONE_ID_DAYLIGHT Then
+ PInteger(@__daylight)^:=1;
+{$ENDIF}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODriverHtml.res
new file mode 100644
index 0000000..98b7c6e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.cfg
new file mode 100644
index 0000000..fbc8cdc
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.cfg
@@ -0,0 +1,46 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-GD
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.dof
new file mode 100644
index 0000000..1a2d3d6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=3
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsD7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=3.0.0.287
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.dpr
new file mode 100644
index 0000000..7d130a8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.dpr
@@ -0,0 +1,13 @@
+library DAADODrv;
+
+uses
+ ShareMem,
+ uDAADODriver in 'uDAADODriver.pas',
+ uDAADOInterfaces in '..\uDAADOInterfaces.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAADODriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAADODrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDriver.html b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDriver.html
new file mode 100644
index 0000000..9f0be67
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDriver.html
@@ -0,0 +1,20 @@
+AbsoluteDB Driver
+
+This driver allows you to connect to data sources accessible via AbsoluteDB.
+
+Step 2: Database
+
+Specify the complete path to your database (including the file name and extension)
+
+Step 3: Custom parameters
+
+You can specify additional AbsoluteDB specific options as a semicolon separated list of name/value pairs. Please address the AbsoluteDB specification for additional information on the available parameter options.
+
+Important Note
+
+You will need to adopt the following naming convention for your Autoinc column's GeneratorName property to enable the driver to obtain and return the LastAutoInc value.
+
+<TableName>*<ColumnName>
+
+e.g. 'Orders*OrderID'
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDriverHtml.rc b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDriverHtml.rc
new file mode 100644
index 0000000..fbfd5a3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDriverHtml.rc
@@ -0,0 +1 @@
+DRIVER_HELP 2110 "DAAbsoluteDBDriver.html"
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDriverHtml.res
new file mode 100644
index 0000000..30a5da7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.bdsproj
new file mode 100644
index 0000000..ed9cd3e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.bdsproj
@@ -0,0 +1,174 @@
+
+
+
+
+ Delphi.Personality
+ VCLApplication
+ 1.0
+ {9B98595C-7A8A-4139-9638-98A40A460278}
+
+
+
+
+ DAAbsoluteDBDrv.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 0
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 3
+ 0
+ False
+ 1
+ True
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+ ..\..\bin
+
+
+
+ $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10
+ vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsD7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+
+
+ False
+
+
+
+ D:\Program Files\RemObjects Software\Data Abstract\DASchemaModeler.exe
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 0
+ 290
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.0.290
+
+
+
+
+ Data Abstract
+ 2.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.cfg
new file mode 100644
index 0000000..63f903b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.cfg
@@ -0,0 +1,39 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O-
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-GD
+-cg
+-vn
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\bin"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.dof
new file mode 100644
index 0000000..64a663b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.dof
@@ -0,0 +1,120 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=0
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=3
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=1
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=$(DELPHI)\Lib\Debug
+Packages=vcl;rtl;dbrtl;adortl;vcldb;vclx;bdertl;vcldbx;ibxpress;dsnap;cds;bdecds;qrpt;teeui;teedb;tee;dss;teeqr;visualclx;visualdbclx;dsnapcrba;dsnapcon;VclSmp;vclshlctrls;dbexpress;dbxcds;indy;vclie;RemObjects_WebBroker_D6;inet;RemObjects_Indy_D6;RemObjects_RODX_D6;RemObjects_BPDX_D6;RemObjects_Synapse_D6;Jcl;JclVcl;JvCoreD6R;JvSystemD6R;JvStdCtrlsD6R;JvAppFrmD6R;JvBandsD6R;JvDBD6R;JvDlgsD6R;JvBDED6R;JvCmpD6R;JvCryptD6R;JvCtrlsD6R;JvCustomD6R;JvDockingD6R;JvDotNetCtrlsD6R;JvEDID6R;JvGlobusD6R;JvHMID6R;JvInterpreterD6R;JvJansD6R;JvManagedThreadsD6R;JvMMD6R;JvNetD6R;JvPageCompsD6R;JvPluginD6R;JvPrintPreviewD6R;JvRuntimeDesignD6R;JvTimeFrameworkD6R;JvUIBD6R;JvValidatorsD6R;JvWizardD6R;JvXPCtrlsD6R;mySQLDAC6;IBO40FTS_D6;IBO40TRT_D6;IBO40CRT_D6;IBO40RPL_D6;IBO40VRT_D6;IBO40FRT_D6;IBO40XRT_D6;IBO40WRT_D6;IBO40WXDT_D6;IBO40WXRT_D6;inetdb;webdsnap;websnap;
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+Launcher=
+UseLauncher=0
+DebugCWD=
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.dpr
new file mode 100644
index 0000000..93bd8c4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.dpr
@@ -0,0 +1,12 @@
+library DAAbsoluteDBDrv;
+
+uses
+ ShareMem,
+ uDAAbsoluteDBDriver in 'uDAAbsoluteDBDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAAbsoluteDBDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.dproj
new file mode 100644
index 0000000..18a5047
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.dproj
@@ -0,0 +1,112 @@
+
+
+ {9B98595C-7A8A-4139-9638-98A40A460278}
+ DAAbsoluteDBDrv.dpr
+ Debug
+ DCC32
+ 12.0
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ ..\..\bin\DAAbsoluteDBDrv.dad
+ $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10;$(DCC_UnitSearchPath)
+ 3
+ 00400000
+ false
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;$(DCC_UnitAlias)
+ ..\..\bin
+ x86
+ vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsD7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+ true
+ false
+ true
+ false
+ 1
+ true
+ false
+ false
+
+
+ false
+ RELEASE;$(DCC_Define)
+ 0
+ false
+
+
+ DEBUG;$(DCC_Define)
+
+
+
+ MainSource
+
+
+
+ Base
+
+
+ Cfg_2
+ Base
+
+
+ Cfg_1
+ Base
+
+
+
+
+ Delphi.Personality.12
+ VCLApplication
+
+
+
+ DAAbsoluteDBDrv.dpr
+
+
+ D:\Program Files\RemObjects Software\Data Abstract\DASchemaModeler.exe
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 0
+ 290
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.0.290
+
+
+
+
+ Data Abstract
+ 2.0.0.0
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAbsoluteDBDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDriverHtml.res
new file mode 100644
index 0000000..93f013e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.cfg
new file mode 100644
index 0000000..9f8c69f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.cfg
@@ -0,0 +1,37 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.dof
new file mode 100644
index 0000000..b542147
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsD7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=5.0.5.25
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.dpr
new file mode 100644
index 0000000..ab5ec53
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.dpr
@@ -0,0 +1,12 @@
+library DAAnyDACDrv;
+
+uses
+ ShareMem,
+ uDAAnyDACDriver in 'uDAAnyDACDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAAnyDACDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.res
new file mode 100644
index 0000000..84f461e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAAnyDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDriverHtml.res
new file mode 100644
index 0000000..57e2373
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.bdsproj
new file mode 100644
index 0000000..720c571
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.bdsproj
@@ -0,0 +1,173 @@
+
+
+
+
+ Delphi.Personality
+ VCLApplication
+ 1.0
+ {9B98595C-7A8A-4139-9638-98A40A460278}
+
+
+
+
+ DABDEDrv.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 0
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 3
+ 0
+ False
+ 1
+ True
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+ ..\..\bin
+
+
+
+ $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10
+
+
+ False
+
+
+
+ D:\Program Files\RemObjects Software\Data Abstract\DASchemaModeler.exe
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 0
+ 290
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.0.290
+
+
+
+
+ Data Abstract
+ 2.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.cfg
new file mode 100644
index 0000000..695c614
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.cfg
@@ -0,0 +1,39 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O-
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-GD
+-cg
+-vn
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\bin"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.dof
new file mode 100644
index 0000000..593b787
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.dof
@@ -0,0 +1,94 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.dpr
new file mode 100644
index 0000000..f00c885
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.dpr
@@ -0,0 +1,12 @@
+library DABDEDrv;
+
+uses
+ ShareMem,
+ uDABDEDriver in 'uDABDEDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DABDEDriverHtml.res}
+begin
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DABDEDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.cfg
new file mode 100644
index 0000000..4a853d2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J+
+-$K-
+-$L+
+-$M-
+-$N+
+-$O-
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_PLATFORM
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.dof
new file mode 100644
index 0000000..af7d0f6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=1
+K=0
+L=1
+M=0
+N=1
+O=0
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Purposesoft HtmlEdit 2.0
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;CDKSmp;EaglWk;ESGraphUtils;ESBase;CDKDesignTimeSupport;ESVsCp;ESSampleCompositeEditors7;ESSampleComposites70;SynEdit_D7;dxsbD7;dxComnD7;dxExELD7;dxGrEdD7;ECQDBCD7;EQTLD7;dxEdtrD7;EQDBTLD7;EQGridD7;dxMasterViewD7;dxmdsd7;dxObjInsD7;dxPSCoreD7;Rz252N70;Rz252D70;madBasic_;madHelp_;madDisAsm_;madExcept_;EzSpecials_D7;sq7;kprocs7;dxDockingD7;dxLayoutControlD7;dxPageControlD7;cxEditorsVCLD7;cxLibraryVCLD7;dxThemeD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;Phoenix_Core_D7;cxPageControlVCLD7;dxELibD7;dxExRwD7;dxDBEdD7;dxInsD7;dxNavBarD7;Phoenix_IDE_D7;DataAbstract_Core_D7;DataAbstract_DBXDriver_D7;cxWebD7;cxWebPascalScriptD7;cxWebTeeChartD7;cxWebSnapD7;SchemaModelerUtils_d7;Ani95_D7;DataAbstract_IDE_D7;DataAbstract_DiskDriver_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=3.0.0.50
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.dpr
new file mode 100644
index 0000000..8efca9c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.dpr
@@ -0,0 +1,18 @@
+library DADBISAM3Drv;
+
+uses
+ ShareMem,
+ uDADBISAMDriver in 'uDADBISAMDriver.pas';
+
+{$E dad}
+
+{$I dbisamvr.inc}
+{$IFDEF DBISAM_V4}
+Please only build this driver dpr with DBISAM3
+{$ENDIF DBISAM_V4}
+
+{$R *.res}
+{$R DADBISAMDriverHtml.res}
+
+begin
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM3Drv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.cfg
new file mode 100644
index 0000000..4a853d2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J+
+-$K-
+-$L+
+-$M-
+-$N+
+-$O-
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_PLATFORM
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.dof
new file mode 100644
index 0000000..af7d0f6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=1
+K=0
+L=1
+M=0
+N=1
+O=0
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Purposesoft HtmlEdit 2.0
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;CDKSmp;EaglWk;ESGraphUtils;ESBase;CDKDesignTimeSupport;ESVsCp;ESSampleCompositeEditors7;ESSampleComposites70;SynEdit_D7;dxsbD7;dxComnD7;dxExELD7;dxGrEdD7;ECQDBCD7;EQTLD7;dxEdtrD7;EQDBTLD7;EQGridD7;dxMasterViewD7;dxmdsd7;dxObjInsD7;dxPSCoreD7;Rz252N70;Rz252D70;madBasic_;madHelp_;madDisAsm_;madExcept_;EzSpecials_D7;sq7;kprocs7;dxDockingD7;dxLayoutControlD7;dxPageControlD7;cxEditorsVCLD7;cxLibraryVCLD7;dxThemeD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;Phoenix_Core_D7;cxPageControlVCLD7;dxELibD7;dxExRwD7;dxDBEdD7;dxInsD7;dxNavBarD7;Phoenix_IDE_D7;DataAbstract_Core_D7;DataAbstract_DBXDriver_D7;cxWebD7;cxWebPascalScriptD7;cxWebTeeChartD7;cxWebSnapD7;SchemaModelerUtils_d7;Ani95_D7;DataAbstract_IDE_D7;DataAbstract_DiskDriver_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=3.0.0.50
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.dpr
new file mode 100644
index 0000000..c81ef35
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.dpr
@@ -0,0 +1,18 @@
+library DADBISAM4Drv;
+
+uses
+ ShareMem,
+ uDADBISAMDriver in 'uDADBISAMDriver.pas';
+
+{$E dad}
+
+{$I dbisamvr.inc}
+{$IFNDEF DBISAM_V4}
+Please only build this driver dpr with DBISAM4
+{$ENDIF DBISAM_V4}
+
+{$R *.res}
+{$R DADBISAMDriverHtml.res}
+
+begin
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAM4Drv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAMDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAMDriverHtml.res
new file mode 100644
index 0000000..449e052
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBISAMDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDriverHtml.res
new file mode 100644
index 0000000..a6590c9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.cfg
new file mode 100644
index 0000000..b0ec5d7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.cfg
@@ -0,0 +1,45 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.dof
new file mode 100644
index 0000000..daabfcd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.dpr
new file mode 100644
index 0000000..4c68283
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.dpr
@@ -0,0 +1,13 @@
+library DADBXDrv;
+
+uses
+ ShareMem,
+ uDADBXDriver in 'uDADBXDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DADBXDriverHtml.res}
+
+begin
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADBXDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADriverHtml.res
new file mode 100644
index 0000000..077daa2
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADrv.cfg
new file mode 100644
index 0000000..ce504fe
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADrv.cfg
@@ -0,0 +1,44 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J+
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\bin"
+-LN"D:\Program files.all\Winsys\borland\DCP_70"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADrv.dpr
new file mode 100644
index 0000000..6282793
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADrv.dpr
@@ -0,0 +1,15 @@
+library DADOADrv;
+
+uses
+ ShareMem,
+ Forms,
+ SysUtils,
+ Classes,
+ uDADOADriver in 'uDADOADriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DADOADriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DADOADrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDriverHtml.res
new file mode 100644
index 0000000..e0b8925
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDrv.cfg
new file mode 100644
index 0000000..a0ce1dc
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDrv.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O-
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\bin"
+-U"d:\program files.all\borland\delphi7\Lib\Debug;"
+-O"d:\program files.all\borland\delphi7\Lib\Debug;"
+-I"d:\program files.all\borland\delphi7\Lib\Debug;"
+-R"d:\program files.all\borland\delphi7\Lib\Debug;"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDrv.dpr
new file mode 100644
index 0000000..7f7050b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDrv.dpr
@@ -0,0 +1,12 @@
+library DAElevateDBDrv;
+
+uses
+ ShareMem,
+ uDAElevateDBDriver in 'uDAElevateDBDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAElevateDBDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDrv.res
new file mode 100644
index 0000000..08ba56e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAElevateDBDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDriverHtml.res
new file mode 100644
index 0000000..d12ca9d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.cfg
new file mode 100644
index 0000000..a17abb2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.cfg
@@ -0,0 +1,46 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-GD
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files (x86)\borland\delphi7\Projects\Bpl"
+-LN"c:\program files (x86)\borland\delphi7\Projects\Bpl"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.dof
new file mode 100644
index 0000000..1a2d3d6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=3
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsD7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=3.0.0.287
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.dpr
new file mode 100644
index 0000000..1373b9a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.dpr
@@ -0,0 +1,12 @@
+library DAFIBDrv;
+
+uses
+ ShareMem,
+ uDAFIBDriver in 'uDAFIBDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAFIBDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAFIBDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBDACDriverHtml.res
new file mode 100644
index 0000000..4732a47
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBDACDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBDACDrv.dpr
new file mode 100644
index 0000000..5c46278
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBDACDrv.dpr
@@ -0,0 +1,12 @@
+library DAIBDACDrv;
+
+uses
+ ShareMem,
+ uDAIBDACDriver in 'uDAIBDACDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAIBDACDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBDACDrv.res
new file mode 100644
index 0000000..2aba20c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODriverHtml.res
new file mode 100644
index 0000000..32c06f3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.cfg
new file mode 100644
index 0000000..301d58f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.cfg
@@ -0,0 +1,39 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.dof
new file mode 100644
index 0000000..daabfcd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.dpr
new file mode 100644
index 0000000..152fbe5
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.dpr
@@ -0,0 +1,13 @@
+library DAIBODrv;
+
+uses
+ ShareMem,
+ uDAIBODriver in 'uDAIBODriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAIBODriverHtml.res}
+
+begin
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBODrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDriverHtml.res
new file mode 100644
index 0000000..790cda2
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.cfg
new file mode 100644
index 0000000..b0ec5d7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.cfg
@@ -0,0 +1,45 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.dof
new file mode 100644
index 0000000..daabfcd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.dpr
new file mode 100644
index 0000000..39dde39
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.dpr
@@ -0,0 +1,13 @@
+library DAIBXDrv;
+
+uses
+ ShareMem,
+ uDAIBXDriver in 'uDAIBXDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAIBXDriverHtml.res}
+
+begin
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAIBXDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDriverHtml.res
new file mode 100644
index 0000000..e1fa180
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.cfg
new file mode 100644
index 0000000..301d58f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.cfg
@@ -0,0 +1,39 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.dof
new file mode 100644
index 0000000..dd86d8f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.dof
@@ -0,0 +1,115 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.178
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.dpr
new file mode 100644
index 0000000..971e17b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.dpr
@@ -0,0 +1,12 @@
+library DAMyDACDrv;
+
+uses
+ ShareMem,
+ uDAMyDACDriver in 'uDAMyDACDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAMyDACDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMyDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDriverHtml.res
new file mode 100644
index 0000000..c7f7a82
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.cfg
new file mode 100644
index 0000000..40c80d0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.cfg
@@ -0,0 +1,45 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files (x86)\borland\delphi7\Projects\Bpl"
+-LN"c:\program files (x86)\borland\delphi7\Projects\Bpl"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.dof
new file mode 100644
index 0000000..dd86d8f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.dof
@@ -0,0 +1,115 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.178
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.dpr
new file mode 100644
index 0000000..3a48d91
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.dpr
@@ -0,0 +1,12 @@
+library DAMySQLDACDrv;
+
+uses
+ ShareMem,
+ uDAMySQLDACDriver in 'uDAMySQLDACDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAMySQLDACDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAMySQLDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDriverHtml.res
new file mode 100644
index 0000000..46b9c33
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDrv.cfg
new file mode 100644
index 0000000..7caebcd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDrv.cfg
@@ -0,0 +1,45 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Data Abstract\Bin"
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDrv.dpr
new file mode 100644
index 0000000..5d47e04
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDrv.dpr
@@ -0,0 +1,12 @@
+library DANexusDBDrv;
+
+uses
+ ShareMem,
+ uDANexusDBDriver in 'uDANexusDBDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DANexusDBDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DANexusDBDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDriverHtml.res
new file mode 100644
index 0000000..a096da3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.cfg
new file mode 100644
index 0000000..301d58f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.cfg
@@ -0,0 +1,39 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.dof
new file mode 100644
index 0000000..daabfcd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.dpr
new file mode 100644
index 0000000..b2aa1e2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.dpr
@@ -0,0 +1,13 @@
+library DAODACDrv;
+
+uses
+ ShareMem,
+ uDAODACDriver in 'uDAODACDriver.pas',
+ uDAOracleInterfaces in '..\uDAOracleInterfaces.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAODACDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAODACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPGDACDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPGDACDrv.dpr
new file mode 100644
index 0000000..25f9404
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPGDACDrv.dpr
@@ -0,0 +1,12 @@
+library DAPGDACDrv;
+
+uses
+ ShareMem,
+ uDAPGDACDriver in 'uDAPGDACDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAPGDACDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPGDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPGDACDrv.res
new file mode 100644
index 0000000..2aba20c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPGDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPgDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPgDACDriverHtml.res
new file mode 100644
index 0000000..1b66d75
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPgDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDriverHtml.res
new file mode 100644
index 0000000..c7f7a82
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.cfg
new file mode 100644
index 0000000..40c80d0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.cfg
@@ -0,0 +1,45 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files (x86)\borland\delphi7\Projects\Bpl"
+-LN"c:\program files (x86)\borland\delphi7\Projects\Bpl"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.dof
new file mode 100644
index 0000000..dd86d8f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.dof
@@ -0,0 +1,115 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.178
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.dpr
new file mode 100644
index 0000000..700c0aa
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.dpr
@@ -0,0 +1,12 @@
+library DAPostgresDACDrv;
+
+uses
+ ShareMem,
+ uDAPostgresDACDriver in 'uDAPostgresDACDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAPostgresDACDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAPostgresDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDriverHtml.res
new file mode 100644
index 0000000..2ca3ed1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.cfg
new file mode 100644
index 0000000..301d58f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.cfg
@@ -0,0 +1,39 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.dof
new file mode 100644
index 0000000..8c8eb5f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.1.196
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.dpr
new file mode 100644
index 0000000..615439d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.dpr
@@ -0,0 +1,12 @@
+library DASDACDrv;
+
+uses
+ ShareMem,
+ uDASDACDriver in 'uDASDACDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DASDACDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDriverHtml.res
new file mode 100644
index 0000000..316f711
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.bdsproj
new file mode 100644
index 0000000..584582a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.bdsproj
@@ -0,0 +1,182 @@
+
+
+
+
+ Delphi.Personality
+ VCLApplication
+ 1.0
+ {5F97886E-15E1-47E5-B346-586F0B37A04B}
+
+
+
+
+ DASQLiteDrv.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 0
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 3
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+ D:\Program Files\RemObjects Software\Data Abstract
+
+
+
+ $(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10;$(DELPHI)\Lib\Debug
+ vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+
+
+ False
+
+
+
+ D:\Program Files\RemObjects Software\Data Abstract\DASchemaModeler.exe
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 0
+ 290
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.0.290
+
+
+
+
+ Data Abstract
+ 2.0.0.0
+
+ RemObjects Data Abstract - FIBPlus Driver
+ RemObjects Hydra - Core Library
+ RemObjects Hydra - IDE Integration
+ RemObjects Hydra - RemObjects SDK Integration Library
+ RemObjects Hydra - RemObjects SDK IDE Integration
+ RemObjects NexusDB Pack - Library
+ RemObjects NexusDB Pack - IDE Integration
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.cfg
new file mode 100644
index 0000000..8549342
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.cfg
@@ -0,0 +1,34 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O-
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.dpr
new file mode 100644
index 0000000..dafaf13
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.dpr
@@ -0,0 +1,13 @@
+library DASQLiteDrv;
+
+uses
+ ShareMem,
+ uDASQLiteDriver in 'uDASQLiteDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DASQLiteDriverHtml.res}
+
+begin
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLiteDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDriver.html b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDriver.html
new file mode 100644
index 0000000..a97ff77
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDriver.html
@@ -0,0 +1,15 @@
+SQLite Driver
+
+ This Driver allows you to connect to data sources accessible via SQLite Pass.
+
+
+Step 1: Database
+
+ Specify the database to which you wish to connect. This a complete path and filename (e.g. "c:\test.db3").
+
+
+Step 2: Custom parameters
+
+ You can specify additional SQLite-driver specific options as a semicolon separated list of name/value pairs.
+ Please consult the SQLite Pass documentation for details on the options available.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.bdsproj
new file mode 100644
index 0000000..04695df
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.bdsproj
@@ -0,0 +1,169 @@
+
+
+
+
+ Delphi.Personality
+ VCLApplication
+ 1.0
+ {9E9CC61D-43B1-4CB4-A2FC-50291E643286}
+
+
+
+
+ DASQLitePassDrv.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+ ..\..\bin
+
+
+
+
+ vcl;rtl;indy;vcldb;dbrtl;dsnap;vclx;VclSmp;dbexpress;dbxcds;vclie;inet;RemObjects_WebBroker_D7;RemObjects_Indy_D7;RemObjects_RODX_D7;RemObjects_BPDX_D7;RemObjects_Synapse_D7;Jcl;JvCoreD7R;JvSystemD7R;JvStdCtrlsD7R;TntUnicodeVcl_R70;acat70;dsnapcon;adortl;ibxpress;IBO40FTS_D7;IBO40RPL_D7;DataAbstract_Core_D7;DataAbstract_DBXDriver_D7;DataAbstract_IDE_D7;xmlrtl;dxBarD7;IndyCore70;IndySystem70;vclactnband;IndyProtocols70;bdertl;DataAbstract_DBISAMDriver_D7;DataAbstract_SQLiteDriver_D7;cxLibraryVCLD7;dxThemeD7;cxEditorsVCLD7;cxTreeListVCLD7;Hydra_Core_D7;dxComnD7;Hydra_DX_D7;Hydra_RO_D7;PascalScript_RO_D7;DataAbstract_Scripting_D7
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+ True
+ False
+ 5
+ 0
+ 31
+ 701
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 5.0.31.701
+
+ RemObjects Software 2002-2008. All rights reserved.
+
+
+ Data Abstract
+ 5.0.31.701
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.cfg
new file mode 100644
index 0000000..8b0d25d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.cfg
@@ -0,0 +1,39 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\bin"
+-LE"C:\Documents and Settings\Administrator\My Documents\Borland Studio Projects\Bpl"
+-LN"C:\Documents and Settings\Administrator\My Documents\Borland Studio Projects\Bpl"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.dof
new file mode 100644
index 0000000..1d774c2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;indy;vcldb;dbrtl;dsnap;vclx;VclSmp;dbexpress;dbxcds;vclie;inet;RemObjects_WebBroker_D7;RemObjects_Indy_D7;RemObjects_RODX_D7;RemObjects_BPDX_D7;RemObjects_Synapse_D7;Jcl;JvCoreD7R;JvSystemD7R;JvStdCtrlsD7R;TntUnicodeVcl_R70;acat70;dsnapcon;adortl;ibxpress;IBO40FTS_D7;IBO40RPL_D7;DataAbstract_Core_D7;DataAbstract_DBXDriver_D7;DataAbstract_IDE_D7;xmlrtl;dxBarD7;IndyCore70;IndySystem70;vclactnband;IndyProtocols70;bdertl;DataAbstract_DBISAMDriver_D7;DataAbstract_SQLiteDriver_D7;cxLibraryVCLD7;dxThemeD7;cxEditorsVCLD7;cxTreeListVCLD7;Hydra_Core_D7;dxComnD7;Hydra_DX_D7;Hydra_RO_D7;PascalScript_RO_D7;DataAbstract_Scripting_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=5.0.31.701
+InternalName=
+LegalCopyright=RemObjects Software 2002-2008. All rights reserved.
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=5.0.31.701
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.dpr
new file mode 100644
index 0000000..84c3df2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.dpr
@@ -0,0 +1,13 @@
+library DASQLitePassDrv;
+
+uses
+ ShareMem,
+ uDASQLitePassDriver in 'uDASQLitePassDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DASQLitePassDriverHtml.res}
+
+begin
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.dproj
new file mode 100644
index 0000000..8613d6d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.dproj
@@ -0,0 +1,106 @@
+
+
+ {5149a29c-143c-4239-9195-63df58f7a57a}
+ DASQLitePassDrv.dpr
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\bin\DASQLitePassDrv.dad
+ 12.0
+ Debug
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ DASQLitePassDrv.dad
+ true
+
+
+ ..\..\bin\DASQLitePassDrv.dad
+ 7.0
+ False
+ False
+ 0
+ ..\..\bin
+ RELEASE;$(DCC_Define)
+
+
+ ..\..\bin\DASQLitePassDrv.dad
+ 7.0
+ ..\..\bin
+ DEBUG;$(DCC_Define)
+
+
+ Delphi.Personality.12
+ VCLApplication
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 5
+ 0
+ 31
+ 701
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 5.0.31.701
+
+ RemObjects Software 2002-2009. All rights reserved.
+
+
+ Data Abstract
+ 5.0.31.701
+
+
+ DASQLitePassDrv.dpr
+
+
+
+ 12
+
+
+
+ MainSource
+
+
+
+ Base
+
+
+ Cfg_2
+ Base
+
+
+ Cfg_1
+ Base
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DASQLitePassDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDriver.html b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDriver.html
new file mode 100644
index 0000000..7670401
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDriver.html
@@ -0,0 +1,4 @@
+UniDAC Driver
+
+ No specific help for the UniDAC driver is available, yet. Please consult the Devart's UniDAC documentation for details.
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDriverHtml.res
new file mode 100644
index 0000000..ab9fe22
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.bdsproj
new file mode 100644
index 0000000..06073c9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.bdsproj
@@ -0,0 +1,174 @@
+
+
+
+
+ Delphi.Personality
+ VCLApplication
+ 1.0
+ {E1366B87-D081-4092-92F2-E03C440E76F3}
+
+
+
+
+ DAUniDACDrv.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+ ..\..\Bin
+
+
+
+
+ vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+ RemObjects Software
+
+ 2.0.0.142
+
+
+
+
+ Data Abstract
+ 2.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.cfg
new file mode 100644
index 0000000..4168799
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.cfg
@@ -0,0 +1,44 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O-
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-GD
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\..\Bin"
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.dof
new file mode 100644
index 0000000..d27c0ad
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=0
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=3
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+
+[Directories]
+OutputDir=..\..\Bin
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=$(DELPHI)\Lib\Debug;D:\Jenya\DLIB\jcl\lib\d7\debug;D:\PROGRA~1.ALL\Borland\DLIB\jcl\lib\d7\debug
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=3.0.0.290
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=Data Abstract
+ProductVersion=2.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.dpr
new file mode 100644
index 0000000..391d393
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.dpr
@@ -0,0 +1,12 @@
+library DAUniDACDrv;
+
+uses
+ ShareMem,
+ uDAUniDACDriver in 'uDAUniDACDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAUniDACDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.dproj
new file mode 100644
index 0000000..953fafb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.dproj
@@ -0,0 +1,110 @@
+
+
+ {39820DD8-A8F5-47C9-AE78-338D8AEA630F}
+ DAUniDACDrv.dpr
+ Debug
+ DCC32
+ 12.0
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ vcl;rtl;vclx;vclimg;vclactnband;dbrtl;vcldb;vcldbx;bdertl;vcltouch;xmlrtl;dsnap;dsnapcon;TeeUI;TeeDB;Tee;vclib;ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;intrawebdb_100_140;Intraweb_100_140;VclSmp;vclie;websnap;webdsnap;inetdb;inetdbbde;inetdbxpress;soaprtl;vclribbon;dbexpress;DbxCommonDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;DbxClientDriver;DataSnapServer;DBXInterBaseDriver;DBXMySQLDriver;dbxcds;DBXFirebirdDriver;DBXSybaseASEDriver;DBXSybaseASADriver;DBXOracleDriver;DBXMSSQLDriver;DBXInformixDriver;DBXDb2Driver;RemObjects_RODX_D14;RemObjects_BPDX_D14;RemObjects_Indy_D14;RemObjects_WebBroker_D14;Jcl;JclVcl;JvCoreD14R;JvStdCtrlsD14R;JvSystemD14R;RemObjects_Synapse_D14;DataAbstract_Core_D14;DataAbstract_DBXDriver_D14;DataAbstract_Scripting_D14;DataAbstract_IDE_D14;AnyDAC_PhysSQLite_D14;AnyDAC_Phys_D14;AnyDAC_ComI_D14;AnyDAC_PhysPg_D14;AnyDAC_PhysIB_D14;AnyDAC_PhysTDBX_D14;AnyDAC_PhysADS_D14;AnyDAC_PhysODBC_D14;AnyDAC_PhysASA_D14;AnyDAC_PhysOracl_D14;AnyDAC_PhysMySQL_D14;AnyDAC_PhysDb2_D14;AnyDAC_PhysMSSQL_D14;AnyDAC_PhysMSAcc_D14;AnyDAC_GUIxForms_D14;AnyDAC_Comp_D14;localizer14
+ 00400000
+ false
+ DAUniDACDrv.dad
+ WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias)
+ x86
+ false
+ true
+ false
+ false
+ false
+
+
+ false
+ RELEASE;$(DCC_Define)
+ 0
+ false
+
+
+ DEBUG;$(DCC_Define)
+
+
+
+ MainSource
+
+
+
+ Base
+
+
+ Cfg_2
+ Base
+
+
+ Cfg_1
+ Base
+
+
+
+
+ Delphi.Personality.12
+ VCLApplication
+
+
+
+ DAUniDACDrv.dpr
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 0
+ 290
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.0.290
+
+
+
+
+ Data Abstract
+ 2.0.0.0
+
+
+
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.res
new file mode 100644
index 0000000..2aba20c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAUniDACDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDriverHtml.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDriverHtml.res
new file mode 100644
index 0000000..f3000f5
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDriverHtml.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDrv.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDrv.cfg
new file mode 100644
index 0000000..96a1b9a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDrv.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O-
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"D:\Program Files\RemObjects Software\Data Abstract"
+-U"d:\program files.all\borland\delphi7\Lib\Debug;J:\Products\ACAT\Source"
+-O"d:\program files.all\borland\delphi7\Lib\Debug;J:\Products\ACAT\Source"
+-I"d:\program files.all\borland\delphi7\Lib\Debug;J:\Products\ACAT\Source"
+-R"d:\program files.all\borland\delphi7\Lib\Debug;J:\Products\ACAT\Source"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDrv.dpr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDrv.dpr
new file mode 100644
index 0000000..a566487
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDrv.dpr
@@ -0,0 +1,12 @@
+library DAZeosDrv;
+
+uses
+ ShareMem,
+ uDAZeosDriver in 'uDAZeosDriver.pas';
+
+{$E dad}
+
+{$R *.res}
+{$R DAZeosDriverHtml.res}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDrv.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDrv.res
new file mode 100644
index 0000000..c7afdf1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DAZeosDrv.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.bdsproj
new file mode 100644
index 0000000..1e97716
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {0FC45B58-F519-40B6-831A-DD79C8D3270F}
+
+
+
+
+ DataAbstract_ADODriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - ADOExpress/dbGo Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.cfg
new file mode 100644
index 0000000..9037d9d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.dpk
new file mode 100644
index 0000000..501b019
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ADODriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ADOExpress/dbGo Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ adortl;
+
+contains
+ uDAADODriver in 'uDAADODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D11.dpk
new file mode 100644
index 0000000..7a5a6d9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D11.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_ADODriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ADOExpress/dbGo Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11,
+ adortl;
+
+contains
+ uDAADODriver in 'uDAADODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D11.dproj
new file mode 100644
index 0000000..cf28353
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D11.dproj
@@ -0,0 +1,552 @@
+
+
+ {6843d8de-6ab6-4222-a3c5-282e7cc611df}
+ DataAbstract_ADODriver_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ADODriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - ADOExpress/dbGo Driver False True False True False 6 0 43 801 False False False False False 1033 1252 RemObjects Software 6.0.43.801 RemObjects SDK 1.0.0.0 DataAbstract_ADODriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D12.dpk
new file mode 100644
index 0000000..9bd8e7c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D12.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ADODriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ADOExpress/dbGo Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ adortl,
+ DataAbstract_Core_D12;
+
+contains
+ uDAADODriver in 'uDAADODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D12.dproj
new file mode 100644
index 0000000..149460f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D12.dproj
@@ -0,0 +1,95 @@
+
+
+ {6843d8de-6ab6-4222-a3c5-282e7cc611df}
+ DataAbstract_ADODriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ADODriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_ADODriver_D12.bpl
+ RemObjects Data Abstract - ADOExpress/dbGo Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_ADODriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D12.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D14.dpk
new file mode 100644
index 0000000..448f41a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ADODriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ADOExpress/dbGo Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ adortl,
+ DataAbstract_Core_D14;
+
+contains
+ uDAADODriver in 'uDAADODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D14.dproj
new file mode 100644
index 0000000..910a5d4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D14.dproj
@@ -0,0 +1,95 @@
+
+
+ {6843d8de-6ab6-4222-a3c5-282e7cc611df}
+ DataAbstract_ADODriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ADODriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_ADODriver_D14.bpl
+ RemObjects Data Abstract - ADOExpress/dbGo Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_ADODriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D14.res
new file mode 100644
index 0000000..0593ed9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.cfg
new file mode 100644
index 0000000..05f9ec3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.dof
new file mode 100644
index 0000000..e0035fa
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - ADOExpress/dbGo Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.138
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.dpk
new file mode 100644
index 0000000..9a608cd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ADODriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ADOExpress/dbGo Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ adortl;
+
+contains
+ uDAADODriver in 'uDAADODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.res
new file mode 100644
index 0000000..892aed8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.cfg
new file mode 100644
index 0000000..6784156
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.dof
new file mode 100644
index 0000000..f2d0c96
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - ADOExpress/dbGo Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.dpk
new file mode 100644
index 0000000..a1427e8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ADODriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ADOExpress/dbGo Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7,
+ adortl;
+
+contains
+ uDAADODriver in 'uDAADODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_Glyphs.res
new file mode 100644
index 0000000..067c6a6
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ADODriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.bdsproj
new file mode 100644
index 0000000..28dc1b5
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {0FC45B58-F519-40B6-831A-DD79C8D3270F}
+
+
+
+
+ DataAbstract_AbsoluteDBDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - AbsoluteDB Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.cfg
new file mode 100644
index 0000000..9037d9d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.dpk
new file mode 100644
index 0000000..0570873
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_AbsoluteDBDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AbsoluteDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ dclAbsDBd10;
+
+contains
+ uDAAbsoluteDBDriver in 'uDAAbsoluteDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.dproj
new file mode 100644
index 0000000..7ba10f7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.dproj
@@ -0,0 +1,110 @@
+
+
+ {6843d8de-6ab6-4222-a3c5-282e7cc611df}
+ DataAbstract_AbsoluteDBDriver_D10.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D10\DataAbstract_AbsoluteDBDriver_D10.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ DEBUG
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+
+ False
+ True
+ False
+
+
+ RemObjects Data Abstract - AbsoluteDB Driver
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_AbsoluteDBDriver_D10.dpk
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D11.dpk
new file mode 100644
index 0000000..b057f5b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D11.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_AbsoluteDBDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AbsoluteDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11,
+ dclAbsDBd11;
+
+contains
+ uDAAbsoluteDBDriver in 'uDAAbsoluteDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D11.dproj
new file mode 100644
index 0000000..3287315
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D11.dproj
@@ -0,0 +1,552 @@
+
+
+ {6843d8de-6ab6-4222-a3c5-282e7cc611df}
+ DataAbstract_AbsoluteDBDriver_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_AbsoluteDBDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - AbsoluteDB Driver False True False True False 3 0 1 361 False False False False False 1033 1252 RemObjects Software 3.0.1.361 RemObjects SDK 1.0.0.0 DataAbstract_AbsoluteDBDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D12.dpk
new file mode 100644
index 0000000..a5f0feb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D12.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_AbsoluteDBDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AbsoluteDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D12,
+ dclAbsDBd12;
+
+contains
+ uDAAbsoluteDBDriver in 'uDAAbsoluteDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D12.dproj
new file mode 100644
index 0000000..aa7fc58
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D12.dproj
@@ -0,0 +1,95 @@
+
+
+ {6843d8de-6ab6-4222-a3c5-282e7cc611df}
+ DataAbstract_AbsoluteDBDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_AbsoluteDBDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_AbsoluteDBDriver_D12.bpl
+ RemObjects Data Abstract - AbsoluteDB Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_AbsoluteDBDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D12.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D14.dpk
new file mode 100644
index 0000000..4342e5c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_AbsoluteDBDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AbsoluteDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D14,
+ dclAbsDBd14;
+
+contains
+ uDAAbsoluteDBDriver in 'uDAAbsoluteDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D14.dproj
new file mode 100644
index 0000000..4ff22e0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D14.dproj
@@ -0,0 +1,95 @@
+
+
+ {6843d8de-6ab6-4222-a3c5-282e7cc611df}
+ DataAbstract_AbsoluteDBDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_AbsoluteDBDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_AbsoluteDBDriver_D14.bpl
+ RemObjects Data Abstract - AbsoluteDB Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_AbsoluteDBDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D14.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.cfg
new file mode 100644
index 0000000..c2c069b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.dof
new file mode 100644
index 0000000..91ad15c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - AbsoluteDB Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.138
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.dpk
new file mode 100644
index 0000000..2c71a2e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_AbsoluteDBDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AbsoluteDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ dclAbsDBd6;
+
+contains
+ uDAAbsoluteDBDriver in 'uDAAbsoluteDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.res
new file mode 100644
index 0000000..f5602d3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.cfg
new file mode 100644
index 0000000..8e0bad7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.dof
new file mode 100644
index 0000000..a5f0893
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - AbsoluteDB Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.dpk
new file mode 100644
index 0000000..abcb4ea
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_AbsoluteDBDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AbsoluteDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7,
+ dclAbsDBd7;
+
+contains
+ uDAAbsoluteDBDriver in 'uDAAbsoluteDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.res
new file mode 100644
index 0000000..77a3fad
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.bdsproj
new file mode 100644
index 0000000..55d25b6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.bdsproj
@@ -0,0 +1,172 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {0FC45B58-F519-40B6-831A-DD79C8D3270F}
+
+
+
+
+ DataAbstract_AbsoluteDBDriver_D9.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - AbsoluteDB Driver
+
+
+
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+ $00000000
+
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.cfg
new file mode 100644
index 0000000..4e5bf0e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D9"
+-LE"..\..\Dcu\D9"
+-LN"..\..\Dcu\D9"
+-U"..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9"
+-O"..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9"
+-I"..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9"
+-R"..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.dpk
new file mode 100644
index 0000000..31dc35a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_AbsoluteDBDriver_D9;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AbsoluteDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D9,
+ dclAbsDBd8;
+
+contains
+ uDAAbsoluteDBDriver in 'uDAAbsoluteDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.res
new file mode 100644
index 0000000..b7c9b4e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_D9.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_Glyphs.RES b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_Glyphs.RES
new file mode 100644
index 0000000..19121c3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_Glyphs.RES differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_Glyphs.rc b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_Glyphs.rc
new file mode 100644
index 0000000..5b44b65
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AbsoluteDBDriver_Glyphs.rc
@@ -0,0 +1,3 @@
+TDAAbsoluteDBDriver BITMAP DISCARDABLE "..\Glyphs\TDAAbsoluteDBDriver.bmp"
+TDAAbsoluteDBDriver16 BITMAP DISCARDABLE "..\Glyphs\TDADriver16.bmp"
+TDAAbsoluteDBDriver32 BITMAP DISCARDABLE "..\Glyphs\TDAAbsoluteDBDriver32.bmp"
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.bdsproj
new file mode 100644
index 0000000..a34aa65
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {0FC45B58-F519-40B6-831A-DD79C8D3270F}
+
+
+
+
+ DataAbstract_AnyDACDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - AnyDAC Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.cfg
new file mode 100644
index 0000000..9037d9d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.dpk
new file mode 100644
index 0000000..ba12aac
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.dpk
@@ -0,0 +1,55 @@
+package DataAbstract_AnyDACDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AnyDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ dbexpress,
+ xmlrtl,
+ AnyDAC_PhysIB_D10,
+ AnyDAC_Phys_D10,
+ AnyDAC_ComI_D10,
+ AnyDAC_PhysADS_D10,
+ AnyDAC_PhysODBC_D10,
+ AnyDAC_PhysDBExp_D10,
+ AnyDAC_PhysASA_D10,
+ AnyDAC_PhysOracl_D10,
+ AnyDAC_PhysMySQL_D10,
+ AnyDAC_PhysDb2_D10,
+ AnyDAC_PhysMSSQL_D10,
+ AnyDAC_PhysMSAcc_D10,
+ AnyDAC_PhysPg_D10,
+ AnyDAC_PhysSQLite_D10,
+ AnyDAC_Comp_D10;
+
+contains
+ uDAAnyDACDriver in 'uDAAnyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D11.dpk
new file mode 100644
index 0000000..ca82d02
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D11.dpk
@@ -0,0 +1,54 @@
+package DataAbstract_AnyDACDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AnyDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11,
+ AnyDAC_PhysIB_D11,
+ AnyDAC_Phys_D11,
+ AnyDAC_ComI_D11,
+ AnyDAC_PhysADS_D11,
+ AnyDAC_PhysODBC_D11,
+ AnyDAC_PhysASA_D11,
+ AnyDAC_PhysOracl_D11,
+ AnyDAC_PhysMySQL_D11,
+ AnyDAC_PhysDb2_D11,
+ AnyDAC_PhysMSSQL_D11,
+ AnyDAC_PhysMSAcc_D11,
+ AnyDAC_PhysPg_D11,
+ AnyDAC_PhysSQLite_D11,
+ AnyDAC_Comp_D11,
+ AnyDAC_PhysTDBX_D11;
+
+contains
+ uDAAnyDACDriver in 'uDAAnyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D11.dproj
new file mode 100644
index 0000000..1ca57a1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D11.dproj
@@ -0,0 +1,566 @@
+
+
+ {6843d8de-6ab6-4222-a3c5-282e7cc611df}
+ DataAbstract_AnyDACDriver_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_AnyDACDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - AnyDAC Driver False True False True False 3 0 1 361 False False False False False 1033 1252 RemObjects Software 3.0.1.361 RemObjects SDK 1.0.0.0 DataAbstract_AnyDACDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D12.dpk
new file mode 100644
index 0000000..ac76284
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D12.dpk
@@ -0,0 +1,53 @@
+package DataAbstract_AnyDACDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AnyDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D12,
+ AnyDAC_PhysIB_D12,
+ AnyDAC_Phys_D12,
+ AnyDAC_ComI_D12,
+ AnyDAC_PhysADS_D12,
+ AnyDAC_PhysODBC_D12,
+ AnyDAC_PhysASA_D12,
+ AnyDAC_PhysOracl_D12,
+ AnyDAC_PhysMySQL_D12,
+ AnyDAC_PhysDb2_D12,
+ AnyDAC_PhysMSSQL_D12,
+ AnyDAC_PhysMSAcc_D12,
+ AnyDAC_Comp_D12,
+ AnyDAC_PhysPg_D12,
+ AnyDAC_PhysSQLite_D12,
+ AnyDAC_PhysTDBX_D12;
+
+contains
+ uDAAnyDACDriver in 'uDAAnyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D12.dproj
new file mode 100644
index 0000000..29141cc
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D12.dproj
@@ -0,0 +1,159 @@
+
+
+ {6843d8de-6ab6-4222-a3c5-282e7cc611df}
+ DataAbstract_AnyDACDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D12\DataAbstract_AnyDACDriver_D12.bpl
+ 11.1
+ Debug
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_AnyDACDriver_D12.bpl
+ RemObjects Data Abstract - AnyDAC Driver
+
+
+ ..\..\Dcu\D12
+ 7.0
+ False
+ 0
+ False
+ False
+ False
+ False
+ False
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_ObjPath)
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_ResourcePath)
+ RELEASE;$(DCC_Define)
+ False
+ ..\..\Dcu\D12
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_IncludePath)
+ False
+
+
+ ..\..\Dcu\D12
+ 7.0
+ False
+ False
+ False
+ False
+ False
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_ObjPath)
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_ResourcePath)
+ ..\..\Dcu\D12
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_IncludePath)
+ False
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+ Cfg_Release
+ Base
+
+
+ Cfg_Debug
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_AnyDACDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D12.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D14.dpk
new file mode 100644
index 0000000..c56c07e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D14.dpk
@@ -0,0 +1,53 @@
+package DataAbstract_AnyDACDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AnyDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D14,
+ AnyDAC_PhysIB_D14,
+ AnyDAC_Phys_D14,
+ AnyDAC_ComI_D14,
+ AnyDAC_PhysADS_D14,
+ AnyDAC_PhysODBC_D14,
+ AnyDAC_PhysASA_D14,
+ AnyDAC_PhysOracl_D14,
+ AnyDAC_PhysMySQL_D14,
+ AnyDAC_PhysDb2_D14,
+ AnyDAC_PhysMSSQL_D14,
+ AnyDAC_PhysMSAcc_D14,
+ AnyDAC_Comp_D14,
+ AnyDAC_PhysPg_D14,
+ AnyDAC_PhysSQLite_D14,
+ AnyDAC_PhysTDBX_D14;
+
+contains
+ uDAAnyDACDriver in 'uDAAnyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D14.dproj
new file mode 100644
index 0000000..599588b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D14.dproj
@@ -0,0 +1,159 @@
+
+
+ {6843d8de-6ab6-4222-a3c5-282e7cc611df}
+ DataAbstract_AnyDACDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D12\DataAbstract_AnyDACDriver_D12.bpl
+ 11.1
+ Debug
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_AnyDACDriver_D14.bpl
+ RemObjects Data Abstract - AnyDAC Driver
+
+
+ ..\..\Dcu\D12
+ 7.0
+ False
+ 0
+ False
+ False
+ False
+ False
+ False
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_ObjPath)
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_ResourcePath)
+ RELEASE;$(DCC_Define)
+ False
+ ..\..\Dcu\D12
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_IncludePath)
+ False
+
+
+ ..\..\Dcu\D12
+ 7.0
+ False
+ False
+ False
+ False
+ False
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_ObjPath)
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_ResourcePath)
+ ..\..\Dcu\D12
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_IncludePath)
+ False
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+ Cfg_Release
+ Base
+
+
+ Cfg_Debug
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_AnyDACDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D14.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.cfg
new file mode 100644
index 0000000..05f9ec3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.dof
new file mode 100644
index 0000000..70f2fea
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - AnyDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.138
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.dpk
new file mode 100644
index 0000000..1136d5c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.dpk
@@ -0,0 +1,55 @@
+package DataAbstract_AnyDACDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AnyDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ dbexpress,
+ xmlrtl,
+ AnyDAC_PhysIB_D6,
+ AnyDAC_Phys_D6,
+ AnyDAC_ComI_D6,
+ AnyDAC_PhysADS_D6,
+ AnyDAC_PhysODBC_D6,
+ AnyDAC_PhysDBExp_D6,
+ AnyDAC_PhysASA_D6,
+ AnyDAC_PhysOracl_D6,
+ AnyDAC_PhysMySQL_D6,
+ AnyDAC_PhysDb2_D6,
+ AnyDAC_PhysMSSQL_D6,
+ AnyDAC_PhysMSAcc_D6,
+ AnyDAC_PhysPg_D6,
+ AnyDAC_PhysSQLite_D6,
+ AnyDAC_Comp_D6;
+
+contains
+ uDAAnyDACDriver in 'uDAAnyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.res
new file mode 100644
index 0000000..892aed8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.cfg
new file mode 100644
index 0000000..f33a910
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\..\RemObjects SDK for Delphi\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\..\RemObjects SDK for Delphi\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\..\RemObjects SDK for Delphi\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\..\RemObjects SDK for Delphi\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.dof
new file mode 100644
index 0000000..f8327e9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - AnyDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\..\RemObjects SDK for Delphi\Dcu\D7
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=3.0.0.289
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.dpk
new file mode 100644
index 0000000..1cfbdcf
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.dpk
@@ -0,0 +1,55 @@
+package DataAbstract_AnyDACDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - AnyDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7,
+ dbexpress,
+ xmlrtl,
+ AnyDAC_PhysIB_D7,
+ AnyDAC_Phys_D7,
+ AnyDAC_ComI_D7,
+ AnyDAC_PhysADS_D7,
+ AnyDAC_PhysODBC_D7,
+ AnyDAC_PhysDBExp_D7,
+ AnyDAC_PhysASA_D7,
+ AnyDAC_PhysOracl_D7,
+ AnyDAC_PhysMySQL_D7,
+ AnyDAC_PhysDb2_D7,
+ AnyDAC_PhysMSSQL_D7,
+ AnyDAC_PhysMSAcc_D7,
+ AnyDAC_PhysPg_D7,
+ AnyDAC_PhysSQLite_D7,
+ AnyDAC_Comp_D7;
+
+contains
+ uDAAnyDACDriver in 'uDAAnyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.res
new file mode 100644
index 0000000..b40eccd
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_Glyphs.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_Glyphs.lrs
new file mode 100644
index 0000000..73491f3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_Glyphs.lrs
@@ -0,0 +1,80 @@
+LazarusResources.Add('TDAANYDACDriver','BMP',[
+ 'BM'#248#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#194#6#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#129#30#0'w'#23#0'w'#23#0#255#0#255#255#0
+ +#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0
+ +#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#0#255#255#0#255#129#30
+ +#0#129#30#0#129#30#0#252#154'*'#184':'#0#184':'#0#128'*'#3#255#0#255#128#0#0
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0#255#0
+ +#255#130#24#0#129#30#0#248'w'#0#255#129#0#255#149#19#255#170'4'#255#189'Z'
+ +#138#31#0#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255
+ +#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#5'f'#149#130#24#0'y'#16#0#255#158' '#252'w'#0#143#30#0#213'g'#10#255#171
+ +'8'#138#31#0#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#130#24#0#130#24#0#221#152'Z'#255#191']'#186'M'#5#255#0#255'v'#12#0#242#134
+ +#20#252#160'4'#138#31#0#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#0'R'#143#0'6o'#9
+ +'o'#164'W9'#23#171'3'#0#233#171'n'#255#215#146#193'e%'#255#0#255'v'#12#0#242
+ +'w'#1#255#150#25#138#31#0#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255
+ +#255#255#255#255#255#255#255#128#0#0#0'R'#143#0'R'#143#0'R'#143#6#140#194'I'
+ +#221#255#0'v'#186#0'v'#186'YVE'#255#218#154#233#170'j'#145'%'#0#193'M'#0#255
+ +'~'#0#138#31#0#255#0#255#128#0#0#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#0'6p'#0'j'#161#2#199#255
+ +#9#202#255''''#212#255'N'#222#255'y'#233#255#0'v'#186#255#218#154#255#218#154
+ +#255#211#137#255#177'C'#255#138#7#138#31#0#255#0#255#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#0'9u'#4'v'#170'('#212#255#0
+ +#158#218#0'N'#138#22#163#212'R'#224#255#0'v'#186#196'f#'#203'g'#25#255#218
+ +#154#184':'#0#184':'#0#184':'#0#255#0#255#255#0#255#2't'#169'['#213#226'i'
+ +#246#254'E'#230#254'%'#215#254#13#199#254#26#204#254#0';v'#11#128#176#156#233
+ +#254'h'#230#255'#'#165#212#0'A~'#0'F'#129'0'#215#255'M'#215#254'%_p'#184':'#0
+ +#184':'#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#2't'#169'['#213
+ +#226#127#247#254'z'#238#254'}'#233#254#135#231#255#163#237#255#0';v'#3'{'#176
+ +#165#235#254#167#243#255'^'#193#226#0'L'#138#0'N'#138#19#204#255'-'#206#252
+ +#13'b'#145#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#2't'#169#160#233#239#170#238#246'p'#207#229'?'#177#211#29#149#192#17#131
+ +#177#15'{'#170#0'@z'#24#150#196#182#246#255'~'#212#238#3'g'#157#13#182#235#1
+ +#198#255#13'b'#145#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#3'p'#164'T'#177#202'('#156#188'&'#171#207#27#182#224
+ +#12#183#237#24#198#247':'#213#254#0'A~'#27#153#196#181#244#255#182#246#255
+ +#154#240#255'N'#222#255#13#202#255#13'b'#145#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#4'l'#158'?'#180#203'f'#242
+ +#251'E'#230#254'%'#215#254#0#0#0#0#0#0#0#0#0#0#0#0#0'Ay'#0'E~;'#175#213#182
+ +#246#255#13'b'#145#13'b'#145#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#2's'#167'['#213#226'i'#246#254
+ +'E'#230#254#0#0#0#255#255#255#255#255#255#255#255#255#255#255#255#0#0#0'Q'
+ +#199#233#0'A{'#0'E{'#1'z'#180#5'f'#149#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#128#128#128#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#255#255#255#128#0#0#128#0#0#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#254#254#254#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#0#0#0#128#128#128#255#255#255#128#0#0#255#255
+ +#255#128#0#0#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#128#0#0#255
+ +#255#255#128#0#0#128#0#0#192#220#192#255#255#255#128#0#0#255#255#255#128#0#0
+ +#255#255#255#192#220#192#128#0#0#255#255#255#0#0#0#128#128#128#255#255#255
+ +#128#0#0#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#128#0#0#255#255
+ +#255#128#0#0#255#255#255#128#0#0#192#220#192#128#0#0#255#255#255#128#0#0#255
+ +#255#255#128#0#0#255#255#255#128#0#0#192#220#192#255#255#255#0#0#0#128#128
+ +#128#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0
+ +#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#128
+ +#0#0#128#0#0#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#0#0#0#128
+ +#128#128#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#255
+ ,#255#255#254#254#254#255#255#255#255#255#255#255#255#255#128#0#0#192#220#192
+ +#128#0#0#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#128#0#0#192#220
+ +#192#255#255#255#0#0#0#128#128#128#255#255#255#192#220#192#128#0#0#192#220
+ +#192#255#255#255#255#255#255#255#255#255#254#254#254#255#255#255#255#255#255
+ +#255#255#255#128#0#0#128#0#0#192#220#192#255#255#255#192#220#192#128#0#0#192
+ +#220#192#255#255#255#192#220#192#128#0#0#255#255#255#0#0#0#128#128#128#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#254#254#254#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#0#0#0#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#0#0
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_Glyphs.res
new file mode 100644
index 0000000..3926468
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_Lazarus_Windows.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_Lazarus_Windows.lpk
new file mode 100644
index 0000000..a937aad
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_AnyDACDriver_Lazarus_Windows.lpk
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.bdsproj
new file mode 100644
index 0000000..f5afeb9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.bdsproj
@@ -0,0 +1,179 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {0FC45B58-F519-40B6-831A-DD79C8D3270F}
+
+
+
+
+ DataAbstract_BDEDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - BDE Driver
+ False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.cfg
new file mode 100644
index 0000000..9037d9d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.dpk
new file mode 100644
index 0000000..de3b837
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_BDEDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - BDE Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ DataAbstract_Core_D10;
+
+contains
+ uDABDEDriver in 'uDABDEDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D11.dpk
new file mode 100644
index 0000000..357cae1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D11.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_BDEDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - BDE Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ DataAbstract_Core_D11;
+
+contains
+ uDABDEDriver in 'uDABDEDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D11.dproj
new file mode 100644
index 0000000..f10798d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D11.dproj
@@ -0,0 +1,552 @@
+
+
+ {3cd4ddcd-76f8-4583-8117-c00562cb6a62}
+ DataAbstract_BDEDriver_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_BDEDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - BDE Driver False True False True False 6 0 43 801 False False False False False 1033 1252 RemObjects Software 6.0.43.801 RemObjects SDK 1.0.0.0 DataAbstract_BDEDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D12.dpk
new file mode 100644
index 0000000..806569a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D12.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_BDEDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - BDE Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ DataAbstract_Core_D12;
+
+contains
+ uDABDEDriver in 'uDABDEDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D12.dproj
new file mode 100644
index 0000000..07c3f28
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D12.dproj
@@ -0,0 +1,95 @@
+
+
+ {3cd4ddcd-76f8-4583-8117-c00562cb6a62}
+ DataAbstract_BDEDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_BDEDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_BDEDriver_D12.bpl
+ RemObjects Data Abstract - BDE Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_BDEDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D12.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D14.dpk
new file mode 100644
index 0000000..b9414fe
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_BDEDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - BDE Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ DataAbstract_Core_D14;
+
+contains
+ uDABDEDriver in 'uDABDEDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D14.dproj
new file mode 100644
index 0000000..5445ba0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D14.dproj
@@ -0,0 +1,95 @@
+
+
+ {3cd4ddcd-76f8-4583-8117-c00562cb6a62}
+ DataAbstract_BDEDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_BDEDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_BDEDriver_D14.bpl
+ RemObjects Data Abstract - BDE Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_BDEDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D14.res
new file mode 100644
index 0000000..0593ed9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D6.cfg
new file mode 100644
index 0000000..c2c069b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D6.dpk
new file mode 100644
index 0000000..aceb56d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_BDEDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - BDE Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ bdertl;
+
+contains
+ uDABDEDriver in 'uDABDEDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D6.res
new file mode 100644
index 0000000..f5602d3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D7.cfg
new file mode 100644
index 0000000..8e0bad7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D7.dpk
new file mode 100644
index 0000000..a5b4538
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_BDEDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - BDE Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ DataAbstract_Core_D7;
+
+contains
+ uDABDEDriver in 'uDABDEDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D7.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_Glyphs.res
new file mode 100644
index 0000000..a2a5a20
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_BDEDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.bdsproj
new file mode 100644
index 0000000..096f1d8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {E4D07654-5C28-4ECD-A91D-BABEA25937FF}
+
+
+
+
+ DataAbstract_DBISAMDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - DBISAM Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.cfg
new file mode 100644
index 0000000..9037d9d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.dpk
new file mode 100644
index 0000000..b21161d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_DBISAMDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - DBISAM Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ RemObjects_Core_D10,
+ DataAbstract_Core_D10,
+ db324d9r;
+
+contains
+ uDADBISAMDriver in 'uDADBISAMDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D11.dpk
new file mode 100644
index 0000000..8831294
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D11.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_DBISAMDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - DBISAM Driver'}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ RemObjects_Core_D11,
+ DataAbstract_Core_D11,
+ db324d2007r;
+
+contains
+ uDADBISAMDriver in 'uDADBISAMDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D11.dproj
new file mode 100644
index 0000000..54b7ccf
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D11.dproj
@@ -0,0 +1,554 @@
+
+
+ {18f879f9-5865-46a9-8515-d3b4503d16ff}
+ DataAbstract_DBISAMDriver_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_DBISAMDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - DBISAM Driver False False False True False 1 0 0 0 False False False False False 1033 1252 RemObjects Software 1.0.0.0 RemObjects Software RemObjects Software RemObjects Data Abstract 1.0.0.0 DataAbstract_DBISAMDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D12.dpk
new file mode 100644
index 0000000..db50a91
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D12.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_DBISAMDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - DBISAM Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ DataAbstract_Core_D12,
+ db424b2009r;
+
+contains
+ uDADBISAMDriver in 'uDADBISAMDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D12.dproj
new file mode 100644
index 0000000..19951b8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D12.dproj
@@ -0,0 +1,96 @@
+
+
+ {18f879f9-5865-46a9-8515-d3b4503d16ff}
+ DataAbstract_DBISAMDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_DBISAMDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_DBISAMDriver_D12.bpl
+ RemObjects Data Abstract - DBISAM Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_DBISAMDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D12.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D14.dpk
new file mode 100644
index 0000000..24dc055
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_DBISAMDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - DBISAM Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ DataAbstract_Core_D14,
+ db424b2009r;
+
+contains
+ uDADBISAMDriver in 'uDADBISAMDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D14.dproj
new file mode 100644
index 0000000..7e420c9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D14.dproj
@@ -0,0 +1,98 @@
+
+
+ {18f879f9-5865-46a9-8515-d3b4503d16ff}
+ DataAbstract_DBISAMDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_DBISAMDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_DBISAMDriver_D14.bpl
+ RemObjects Data Abstract - DBISAM Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_DBISAMDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D14.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.cfg
new file mode 100644
index 0000000..05f9ec3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.dof
new file mode 100644
index 0000000..1e36acf
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.dof
@@ -0,0 +1,77 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - DBISAM Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6
+Packages=vcl;rtl;dbrtl;adortl;vcldb;vclx;bdertl;vcldbx;ibxpress;dsnap;cds;bdecds;visualclx;visualdbclx;dsnapcrba;dsnapcon;VclSmp;vclshlctrls;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;inetdb;webdsnap;websnap;soaprtl;dbexpress;dbxcds;indy;tb2kComplete;CRControls60;dac60;dacvcl60;sdacvcl60;sdac60;oraprov60;odac60;odacvcl60;DataAbstract_Core_D6;DataAbstract_DBXDriver_D6;DataAbstract_DiskDriver_D6
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.dpk
new file mode 100644
index 0000000..f1b37bf
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_DBISAMDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - DBISAM Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6,
+ db324d6r;
+
+contains
+ uDADBISAMDriver in 'uDADBISAMDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.res
new file mode 100644
index 0000000..84eaa11
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.cfg
new file mode 100644
index 0000000..02179cd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7"
+-O"..\..\Dcu\D7"
+-I"..\..\Dcu\D7"
+-R"..\..\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.dof
new file mode 100644
index 0000000..2d15714
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - DBISAM Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.dpk
new file mode 100644
index 0000000..6a2ee23
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_DBISAMDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - DBISAM Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ RemObjects_Core_D7,
+ DataAbstract_Core_D7,
+ db324d7r;
+
+contains
+ uDADBISAMDriver in 'uDADBISAMDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.res
new file mode 100644
index 0000000..84eaa11
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_Glyphs.res
new file mode 100644
index 0000000..3163762
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBISAMDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.bdsproj
new file mode 100644
index 0000000..214c011
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {C227C50C-E7AA-4212-8D32-C33B5BFE5BB8}
+
+
+
+
+ DataAbstract_DBXDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - dbExpress Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.cfg
new file mode 100644
index 0000000..207b254
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.dpk
new file mode 100644
index 0000000..ce917fe
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.dpk
@@ -0,0 +1,38 @@
+package DataAbstract_DBXDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - dbExpress Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ dbexpress,
+ DataAbstract_Core_D10;
+
+contains
+ uDADBXDriver in 'uDADBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D11.dpk
new file mode 100644
index 0000000..be253ca
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D11.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_DBXDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - dbExpress Driver'}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ dbexpress,
+ DataAbstract_Core_D11;
+
+contains
+ uDADBXDriver in 'uDADBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D11.dproj
new file mode 100644
index 0000000..05e1e43
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D11.dproj
@@ -0,0 +1,556 @@
+
+
+ {f8cd0c64-f9cd-46d4-8a1b-03d6a3efbdb3}
+ DataAbstract_DBXDriver_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_DBXDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - dbExpress Driver False False False True False 6 0 43 801 False False False False False 1033 1252 RemObjects Software 6.0.43.801 RemObjects SDK 1.0.0.0 DataAbstract_DBXDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D12.dpk
new file mode 100644
index 0000000..a8fb1ce
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D12.dpk
@@ -0,0 +1,46 @@
+package DataAbstract_DBXDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - dbExpress Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ dbexpress,
+ DataAbstract_Core_D12,
+ DBXInterBaseDriver,
+ DBXMySQLDriver,
+ DBXSybaseASEDriver,
+ DBXSybaseASADriver,
+ DBXOracleDriver,
+ DBXMSSQLDriver,
+ DBXInformixDriver,
+ DBXDb2Driver;
+
+contains
+ uDADBXDriver in 'uDADBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D12.dproj
new file mode 100644
index 0000000..f253ce6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D12.dproj
@@ -0,0 +1,105 @@
+
+
+ {f8cd0c64-f9cd-46d4-8a1b-03d6a3efbdb3}
+ DataAbstract_DBXDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_DBXDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D12
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_DBXDriver_D12.bpl
+ true
+ RemObjects Data Abstract - dbExpress Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_DBXDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D12.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D14.dpk
new file mode 100644
index 0000000..8acd915
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D14.dpk
@@ -0,0 +1,46 @@
+package DataAbstract_DBXDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - dbExpress Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ dbexpress,
+ DataAbstract_Core_D14,
+ DBXInterBaseDriver,
+ DBXMySQLDriver,
+ DBXSybaseASEDriver,
+ DBXSybaseASADriver,
+ DBXOracleDriver,
+ DBXMSSQLDriver,
+ DBXInformixDriver,
+ DBXDb2Driver;
+
+contains
+ uDADBXDriver in 'uDADBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D14.dproj
new file mode 100644
index 0000000..0dcb582
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D14.dproj
@@ -0,0 +1,105 @@
+
+
+ {f8cd0c64-f9cd-46d4-8a1b-03d6a3efbdb3}
+ DataAbstract_DBXDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_DBXDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D14
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_DBXDriver_D14.bpl
+ true
+ RemObjects Data Abstract - dbExpress Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_DBXDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D14.res
new file mode 100644
index 0000000..0593ed9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.cfg
new file mode 100644
index 0000000..0aa2cb6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.dof
new file mode 100644
index 0000000..d2de85f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - dbExpress Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.138
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.dpk
new file mode 100644
index 0000000..d9265ff
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_DBXDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - dbExpress Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ dbexpress,
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6;
+
+contains
+ uDADBXDriver in 'uDADBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.res
new file mode 100644
index 0000000..892aed8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.cfg
new file mode 100644
index 0000000..a290ad9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.dof
new file mode 100644
index 0000000..7f90f99
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - dbExpress Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.dpk
new file mode 100644
index 0000000..a20bd62
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_DBXDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - dbExpress Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ dbexpress,
+ RemObjects_Core_D7,
+ DataAbstract_Core_D7;
+
+contains
+ uDADBXDriver in 'uDADBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_Glyphs.res
new file mode 100644
index 0000000..3ac39af
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DBXDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.bdsproj
new file mode 100644
index 0000000..9e97b99
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.bdsproj
@@ -0,0 +1,172 @@
+
+
+
+
+ Delphi.Personality
+ VCLApplication
+ 1.0
+ {EB34E68F-ED55-4ABC-A07A-7AF827B26017}
+
+
+
+
+ DataAbstract_DOADriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 0
+ 1
+ 0
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - Direct Oracle Access Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1031
+ 1252
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.cfg
new file mode 100644
index 0000000..ec7d8d2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C-
+-$D-
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L-
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q+
+-$R+
+-$S-
+-$T-
+-$U+
+-$V+
+-$W-
+-$X+
+-$Y-
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10"
+-O"..\..\Dcu\D10"
+-I"..\..\Dcu\D10"
+-R"..\..\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.dpk
new file mode 100644
index 0000000..15b25df
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_DOADriver_D10;
+
+{$R *.res}
+{$R 'uDADOADriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS OFF}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS ON}
+{$RANGECHECKS ON}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Direct Oracle Access Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ doa41d2006;
+
+contains
+ uDADOADriver in 'uDADOADriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.res
new file mode 100644
index 0000000..7d5072d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D11.dpk
new file mode 100644
index 0000000..150f485
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D11.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_DOADriver_D11;
+
+{$R *.res}
+{$R 'uDADOADriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS OFF}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS ON}
+{$RANGECHECKS ON}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Direct Oracle Access Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11,
+ doa41d2007;
+
+contains
+ uDADOADriver in 'uDADOADriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D11.dproj
new file mode 100644
index 0000000..28b9bc0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D11.dproj
@@ -0,0 +1,96 @@
+
+
+ {a2e90cba-5a04-4ca5-b40f-eeb19b461f2f}
+ DataAbstract_DOADriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_DOADriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ False
+ True
+ True
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+
+ False
+ True
+ False
+
+
+ RemObjects Data Abstract - Direct Oracle Access Driver
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1031
+ 1252
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ DataAbstract_DOADriver_D11.dpk
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D11.res
new file mode 100644
index 0000000..c467631
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D12.dpk
new file mode 100644
index 0000000..166b374
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D12.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_DOADriver_D12;
+
+{$R *.res}
+{$R 'uDADOADriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS OFF}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS ON}
+{$RANGECHECKS ON}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Direct Oracle Access Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D12,
+ doa41d2009;
+
+contains
+ uDADOADriver in 'uDADOADriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D12.dproj
new file mode 100644
index 0000000..d9bf6ae
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D12.dproj
@@ -0,0 +1,103 @@
+
+
+ {E84B9AAD-18C0-4A3D-893C-C2036F2B3D7A}
+ DataAbstract_DOADriver_D12.dpk
+ Base
+ DCC32
+ 11.1
+
+
+ true
+
+
+ RemObjects Data Abstract - Direct Oracle Access Driver
+ error
+ error
+ ..\..\Dcu\D12\DataAbstract_DOADriver_D12.bpl
+ true
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D12
+ error
+ error
+ false
+ error
+ true
+ error
+ true
+ false
+ true
+ ..\..\Dcu\D12
+ true
+ ..\..\Dcu\D12
+ false
+ true
+ error
+ true
+ 0
+ 00400000
+ x86
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ DataAbstract_DOADriver_D12.dpk
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D12.res
new file mode 100644
index 0000000..77cfa35
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D14.dpk
new file mode 100644
index 0000000..32666ed
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D14.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_DOADriver_D14;
+
+{$R *.res}
+{$R 'uDADOADriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS OFF}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS ON}
+{$RANGECHECKS ON}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Direct Oracle Access Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D14,
+ doa41d2010;
+
+contains
+ uDADOADriver in 'uDADOADriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D14.dproj
new file mode 100644
index 0000000..2f25712
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D14.dproj
@@ -0,0 +1,101 @@
+
+
+ {E84B9AAD-18C0-4A3D-893C-C2036F2B3D7A}
+ DataAbstract_DOADriver_D14.dpk
+ Base
+ DCC32
+ 11.1
+
+
+ true
+
+
+ RemObjects Data Abstract - Direct Oracle Access Driver
+ error
+ error
+ ..\..\Dcu\D14\DataAbstract_DOADriver_D14.bpl
+ true
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D14
+ error
+ error
+ false
+ error
+ true
+ error
+ true
+ false
+ true
+ ..\..\Dcu\D14
+ true
+ ..\..\Dcu\D14
+ false
+ true
+ error
+ true
+ 0
+ 00400000
+ x86
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ DataAbstract_DOADriver_D14.dpk
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D14.res
new file mode 100644
index 0000000..77cfa35
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.cfg
new file mode 100644
index 0000000..ce65bb4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C-
+-$D-
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L-
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q+
+-$R+
+-$S-
+-$T-
+-$U+
+-$V+
+-$W-
+-$X+
+-$Y-
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6"
+-O"..\..\Dcu\D6"
+-I"..\..\Dcu\D6"
+-R"..\..\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.dof
new file mode 100644
index 0000000..3c9cab7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.dof
@@ -0,0 +1,77 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=0
+D=0
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=0
+M=0
+N=1
+O=1
+P=1
+Q=1
+R=1
+S=0
+T=0
+U=1
+V=1
+W=0
+X=1
+Y=0
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Direct Oracle Access Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.dpk
new file mode 100644
index 0000000..4eff87c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_DOADriver_D6;
+
+{$R *.res}
+{$R 'uDADOADriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS OFF}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS ON}
+{$RANGECHECKS ON}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Direct Oracle Access Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ doa41d6;
+
+contains
+ uDADOADriver in 'uDADOADriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.res
new file mode 100644
index 0000000..c467631
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.cfg
new file mode 100644
index 0000000..e5c2492
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C-
+-$D-
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L-
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q+
+-$R+
+-$S-
+-$T-
+-$U+
+-$V+
+-$W-
+-$X+
+-$Y-
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7"
+-O"..\..\Dcu\D7"
+-I"..\..\Dcu\D7"
+-R"..\..\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.dof
new file mode 100644
index 0000000..b369898
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=0
+D=0
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=0
+M=0
+N=1
+O=1
+P=1
+Q=1
+R=1
+S=0
+T=0
+U=1
+V=1
+W=0
+X=1
+Y=0
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Direct Oracle Access Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.dpk
new file mode 100644
index 0000000..fc81f64
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_DOADriver_D7;
+
+{$R *.res}
+{$R 'uDADOADriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS OFF}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS ON}
+{$RANGECHECKS ON}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Direct Oracle Access Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7,
+ doa41d7;
+
+contains
+ uDADOADriver in 'uDADOADriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.res
new file mode 100644
index 0000000..c467631
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.bdsproj
new file mode 100644
index 0000000..213d43f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.bdsproj
@@ -0,0 +1,168 @@
+
+
+
+
+ Delphi.Personality
+ VCLApplication
+ 1.0
+ {EB34E68F-ED55-4ABC-A07A-7AF827B26017}
+
+
+
+
+ DataAbstract_DOADriver_D9.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 0
+ 1
+ 0
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - Direct Oracle Access Driver
+
+
+
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1031
+ 1252
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.cfg
new file mode 100644
index 0000000..1ff2976
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C-
+-$D-
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L-
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q+
+-$R+
+-$S-
+-$T-
+-$U+
+-$V+
+-$W-
+-$X+
+-$Y-
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D9"
+-LE"..\..\Dcu\D9"
+-LN"..\..\Dcu\D9"
+-U"..\..\Dcu\D9"
+-O"..\..\Dcu\D9"
+-I"..\..\Dcu\D9"
+-R"..\..\Dcu\D9"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.dpk
new file mode 100644
index 0000000..5b58a97
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_DOADriver_D9;
+
+{$R *.res}
+{$R 'uDADOADriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS OFF}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS ON}
+{$RANGECHECKS ON}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Direct Oracle Access Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D9,
+ doa41d9;
+
+contains
+ uDADOADriver in 'uDADOADriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.res
new file mode 100644
index 0000000..7d5072d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_DOADriver_D9.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_Drivers_D6.bpg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_Drivers_D6.bpg
new file mode 100644
index 0000000..4e931fa
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_Drivers_D6.bpg
@@ -0,0 +1,61 @@
+#------------------------------------------------------------------------------
+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 = DataAbstract_ADODriver_D7.bpl DataAbstract_DBXDriver_D7.bpl \
+ DataAbstract_IBXDriver_D7.bpl DataAbstract_DiskDriver_D7.bpl DAADODrv.dad \
+ DADBXDrv.dad DADiskDrv.dad DAIBXDrv.dad DataAbstract_IBODriver_D7.bpl \
+ DataAbstract_SDACDriver_D7.bpl DataAbstract_ODACDriver_D7.bpl DAIBODrv.dad \
+ DASDACDrv.dad
+DataAbstract_SDACDriver_D6.bpl DataAbstract_ODACDriver_D6.bpl
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+DataAbstract_DiskDriver_D7.bpl: DataAbstract_DiskDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_DBXDriver_D7.bpl: DataAbstract_DBXDriver_D7.dpk
+ $(DCC)
+
+DAADODrv.dad: DAADODrv.dpr
+ $(DCC)
+
+DADBXDrv.dad: DADBXDrv.dpr
+ $(DCC)
+
+DADiskDrv.dad: DADiskDrv.dpr
+ $(DCC)
+
+DAIBXDrv.dad: DAIBXDrv.dpr
+ $(DCC)
+
+DAIBODrv.dad: DAIBODrv.dpr
+ $(DCC)
+
+DASDACDrv.dad: DASDACDrv.dpr
+ $(DCC)
+
+DataAbstract_SDACDriver_D7.bpl: DataAbstract_SDACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_ODACDriver_D7.bpl: DataAbstract_ODACDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_ADODriver_D7.bpl: DataAbstract_ADODriver_D7.dpk
+ $(DCC)
+
+DataAbstract_IBXDriver_D7.bpl: DataAbstract_IBXDriver_D7.dpk
+ $(DCC)
+
+DataAbstract_IBODriver_D7.bpl: DataAbstract_IBODriver_D7.dpk
+ $(DCC)
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.bdsproj
new file mode 100644
index 0000000..47a24e4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {D0E1436D-9AA9-4616-943B-851DF450E715}
+
+
+
+
+ DataAbstract_ElevateDBDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - Elevate DB Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.cfg
new file mode 100644
index 0000000..9037d9d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.dpk
new file mode 100644
index 0000000..b6773b6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ElevateDBDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ElevateDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ edb105d10run;
+
+contains
+ uDAElevateDBDriver in 'uDAElevateDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D11.dpk
new file mode 100644
index 0000000..bd44fbd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D11.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ElevateDBDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ElevateDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11,
+ edb105D2007run;
+
+contains
+ uDAElevateDBDriver in 'uDAElevateDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D11.dproj
new file mode 100644
index 0000000..9e5e80d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D11.dproj
@@ -0,0 +1,552 @@
+
+
+ {c31471d9-f8e2-4e45-94a7-1264d8011587}
+ DataAbstract_ElevateDBDriver_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ElevateDBDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - ElevateDB Driver False True False True False 3 0 1 361 False False False False False 1033 1252 RemObjects Software 3.0.1.361 RemObjects SDK 1.0.0.0 DataAbstract_ElevateDBDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D12.dpk
new file mode 100644
index 0000000..0eb30af
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D12.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ElevateDBDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ElevateDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D12,
+ edb105D2009run;
+
+contains
+ uDAElevateDBDriver in 'uDAElevateDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D12.dproj
new file mode 100644
index 0000000..d3ea1af
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D12.dproj
@@ -0,0 +1,93 @@
+
+
+ {c31471d9-f8e2-4e45-94a7-1264d8011587}
+ DataAbstract_ElevateDBDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ElevateDBDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_ElevateDBDriver_D12.bpl
+ RemObjects Data Abstract - ElevateDB Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_ElevateDBDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D12.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D14.dpk
new file mode 100644
index 0000000..259fde0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ElevateDBDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ElevateDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D14,
+ edb105D2009run;
+
+contains
+ uDAElevateDBDriver in 'uDAElevateDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D14.dproj
new file mode 100644
index 0000000..edca6cb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D14.dproj
@@ -0,0 +1,97 @@
+
+
+ {c31471d9-f8e2-4e45-94a7-1264d8011587}
+ DataAbstract_ElevateDBDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ElevateDBDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_ElevateDBDriver_D14.bpl
+ RemObjects Data Abstract - ElevateDB Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_ElevateDBDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D14.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.cfg
new file mode 100644
index 0000000..c2c069b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.dof
new file mode 100644
index 0000000..0c3ea83
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - ElevateDB Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.138
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.dpk
new file mode 100644
index 0000000..5e5f141
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ElevateDBDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ElevateDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ edb105d6run;
+
+contains
+ uDAElevateDBDriver in 'uDAElevateDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.res
new file mode 100644
index 0000000..f5602d3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.cfg
new file mode 100644
index 0000000..6784156
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.dof
new file mode 100644
index 0000000..9e696f5
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - ElevateDB Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;EDBpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.dpk
new file mode 100644
index 0000000..c2f5f25
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ElevateDBDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - ElevateDB Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7,
+ edb105d7run;
+
+contains
+ uDAElevateDBDriver in 'uDAElevateDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.res
new file mode 100644
index 0000000..77a3fad
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_Glyphs.res
new file mode 100644
index 0000000..9e2c761
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ElevateDBDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.bdsproj
new file mode 100644
index 0000000..239dc3d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {0FC45B58-F519-40B6-831A-DD79C8D3270F}
+
+
+
+
+ DataAbstract_FIBDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - FIBPlus Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.cfg
new file mode 100644
index 0000000..9037d9d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.dpk
new file mode 100644
index 0000000..6b4fd10
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_FIBDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - FIBPlus Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ FIBPlus2006;
+
+contains
+ uDAFIBDriver in 'uDAFIBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D11.dpk
new file mode 100644
index 0000000..d35cd4a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D11.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_FIBDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - FIBPlus Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11,
+ FIBPlus2007;
+
+contains
+ uDAFIBDriver in 'uDAFIBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D11.dproj
new file mode 100644
index 0000000..f73572b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D11.dproj
@@ -0,0 +1,68 @@
+
+
+ {4aa60252-6f77-44b7-a171-e158f29374ca}
+ DataAbstract_FIBDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_FIBDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - FIBPlus Driver False True False True False 3 0 1 361 False False False False False 1033 1252 RemObjects Software 3.0.1.361 RemObjects SDK 1.0.0.0 DataAbstract_FIBDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D12.dpk
new file mode 100644
index 0000000..07031d1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D12.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_FIBDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - FIBPlus Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D12,
+ FIBPlus2009;
+
+contains
+ uDAFIBDriver in 'uDAFIBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D12.dproj
new file mode 100644
index 0000000..67a3d3b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D12.dproj
@@ -0,0 +1,95 @@
+
+
+ {4aa60252-6f77-44b7-a171-e158f29374ca}
+ DataAbstract_FIBDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_FIBDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ error
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_FIBDriver_D12.bpl
+ RemObjects Data Abstract - FIBPlus Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_FIBDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D12.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D14.dpk
new file mode 100644
index 0000000..fdf734e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_FIBDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - FIBPlus Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D14,
+ FIBPlus2010;
+
+contains
+ uDAFIBDriver in 'uDAFIBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D14.dproj
new file mode 100644
index 0000000..9cef237
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D14.dproj
@@ -0,0 +1,97 @@
+
+
+ {4aa60252-6f77-44b7-a171-e158f29374ca}
+ DataAbstract_FIBDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_FIBDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ error
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_FIBDriver_D14.bpl
+ RemObjects Data Abstract - FIBPlus Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_FIBDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D14.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.cfg
new file mode 100644
index 0000000..05f9ec3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.dof
new file mode 100644
index 0000000..c96c6c8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - FIBPlus Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=3.0.0.289
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.dpk
new file mode 100644
index 0000000..0447c56
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_FIBDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - FIBPlus Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ FIBPlus6;
+
+contains
+ uDAFIBDriver in 'uDAFIBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.res
new file mode 100644
index 0000000..f5602d3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.cfg
new file mode 100644
index 0000000..6784156
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.dof
new file mode 100644
index 0000000..ccdfd7b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - FIBPlus Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.dpk
new file mode 100644
index 0000000..8ecc150
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_FIBDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - FIBPlus Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7,
+ FIBPlus7;
+
+contains
+ uDAFIBDriver in 'uDAFIBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.res
new file mode 100644
index 0000000..892aed8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_Glyphs.res
new file mode 100644
index 0000000..d0e3d08
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_FIBDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.bdsproj
new file mode 100644
index 0000000..8d350cb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.bdsproj
@@ -0,0 +1,179 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {89ABBDEB-A4DB-4045-AE76-0CE8A7CB792A}
+
+
+
+
+ DataAbstract_IBDACDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - CoreLabs IBDAC Driver
+ False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.cfg
new file mode 100644
index 0000000..207b254
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.dpk
new file mode 100644
index 0000000..032d677
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.dpk
@@ -0,0 +1,38 @@
+package DataAbstract_MyDACDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs IBDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ IBdac100,
+ RemObjects_Core_D10,
+ DataAbstract_Core_D10;
+
+contains
+ uDAIBDACDriver in 'uDAIBDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D11.dpk
new file mode 100644
index 0000000..d018594
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D11.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_IBDACDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs IBDAC Driver'}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ vcl,
+ IBdac105,
+ RemObjects_Core_D11,
+ DataAbstract_Core_D11;
+
+contains
+ uDAIBDACDriver in 'uDAIBDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D11.dproj
new file mode 100644
index 0000000..80efb8b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D11.dproj
@@ -0,0 +1,557 @@
+
+
+ {0d0e2131-7a05-4241-9ca1-f98aea2eb9d9}
+ DataAbstract_IBDACDriver_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IBDACDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - CoreLabs IBDAC Driver False False False True False 1 0 0 0 False False False False False 1033 1252 RemObjects Software 1.0.0.0 RemObjects Software RemObjects Software RemObjects Data Abstract 1.0.0.0 DataAbstract_IBDACDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D12.dpk
new file mode 100644
index 0000000..f4b2112
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D12.dpk
@@ -0,0 +1,38 @@
+package DataAbstract_IBDACDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs IBDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ IBdac120,
+ RemObjects_Core_D12,
+ DataAbstract_Core_D12;
+
+contains
+ uDAIBDACDriver in 'uDAIBDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D12.dproj
new file mode 100644
index 0000000..014d532
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D12.dproj
@@ -0,0 +1,97 @@
+
+
+ {0d0e2131-7a05-4241-9ca1-f98aea2eb9d9}
+ DataAbstract_IBDACDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IBDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D12
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_IBDACDriver_D12.bpl
+ true
+ RemObjects Data Abstract - CoreLabs IBDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_IBDACDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D12.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D14.dpk
new file mode 100644
index 0000000..42e9d7a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D14.dpk
@@ -0,0 +1,38 @@
+package DataAbstract_IBDACDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs IBDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ IBdac140,
+ RemObjects_Core_D14,
+ DataAbstract_Core_D14;
+
+contains
+ uDAIBDACDriver in 'uDAIBDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D14.dproj
new file mode 100644
index 0000000..cd2ef89
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D14.dproj
@@ -0,0 +1,101 @@
+
+
+ {0d0e2131-7a05-4241-9ca1-f98aea2eb9d9}
+ DataAbstract_IBDACDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IBDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D14
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_IBDACDriver_D14.bpl
+ true
+ RemObjects Data Abstract - CoreLabs IBDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_IBDACDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D14.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.cfg
new file mode 100644
index 0000000..51b688e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6"
+-O"..\..\Dcu\D6"
+-I"..\..\Dcu\D6"
+-R"..\..\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.dof
new file mode 100644
index 0000000..0cbf2a3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - CoreLabs IBDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.dpk
new file mode 100644
index 0000000..6975ec3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.dpk
@@ -0,0 +1,38 @@
+package DataAbstract_IBDACDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs IBDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ ibdac60,
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6;
+
+contains
+ uDAIBDACDriver in 'uDAIBDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.res
new file mode 100644
index 0000000..371f8db
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.cfg
new file mode 100644
index 0000000..4c8862b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7"
+-O"..\..\Dcu\D7"
+-I"..\..\Dcu\D7"
+-R"..\..\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.dof
new file mode 100644
index 0000000..f69663d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - CoreLabs IBDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.dpk
new file mode 100644
index 0000000..3fd2f36
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.dpk
@@ -0,0 +1,38 @@
+package DataAbstract_MyDACDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs IBDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ ibdac70,
+ RemObjects_Core_D7,
+ DataAbstract_Core_D7;
+
+contains
+ uDAIBDACDriver in 'uDAIBDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.res
new file mode 100644
index 0000000..371f8db
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_Glyphs.res
new file mode 100644
index 0000000..3497984
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBDACDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.bdsproj
new file mode 100644
index 0000000..00d9b79
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {EECA635C-0BB1-414E-B43A-42F8C5D07E64}
+
+
+
+
+ DataAbstract_IBODriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - InterBase Objects Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.cfg
new file mode 100644
index 0000000..9037d9d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.dpk
new file mode 100644
index 0000000..ef0bb3f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_IBODriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Objects Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ IBO40TRT_D10,
+ IBO40XRT_D10;
+
+contains
+ uDAIBODriver in 'uDAIBODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D11.dpk
new file mode 100644
index 0000000..8d0c9ef
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D11.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_IBODriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Objects Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11,
+ IBO40TRT_D2007,
+ IBO40XRT_D2007;
+
+contains
+ uDAIBODriver in 'uDAIBODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D11.dproj
new file mode 100644
index 0000000..2afac81
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D11.dproj
@@ -0,0 +1,554 @@
+
+
+
+ {8dcafd0d-ab98-4b7e-8b86-36dbc593e504}
+ DataAbstract_IBODriver_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IBODriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - InterBase Objects Driver False True False True False 1 0 0 0 False False False False False 1033 1252 RemObjects Software 1.0.0.0 RemObjects Software RemObjects Software RemObjects Data Abstract 1.0.0.0 DataAbstract_IBODriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D12.dpk
new file mode 100644
index 0000000..2056b9a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D12.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_IBODriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Objects Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D12,
+ IBO40TRT_D2009,
+ IBO40XRT_D2009;
+
+contains
+ uDAIBODriver in 'uDAIBODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D12.dproj
new file mode 100644
index 0000000..f65fa8f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D12.dproj
@@ -0,0 +1,96 @@
+
+
+ {8dcafd0d-ab98-4b7e-8b86-36dbc593e504}
+ DataAbstract_IBODriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IBODriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_IBODriver_D12.bpl
+ RemObjects Data Abstract - InterBase Objects Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_IBODriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D12.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D14.dpk
new file mode 100644
index 0000000..88b1691
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D14.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_IBODriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Objects Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D14,
+ IBO40TRT_D2010,
+ IBO40XRT_D2010;
+
+contains
+ uDAIBODriver in 'uDAIBODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D14.dproj
new file mode 100644
index 0000000..3b14493
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D14.dproj
@@ -0,0 +1,98 @@
+
+
+ {8dcafd0d-ab98-4b7e-8b86-36dbc593e504}
+ DataAbstract_IBODriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IBODriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_IBODriver_D14.bpl
+ RemObjects Data Abstract - InterBase Objects Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_IBODriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D14.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.cfg
new file mode 100644
index 0000000..05f9ec3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.dof
new file mode 100644
index 0000000..533614b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.dof
@@ -0,0 +1,77 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - InterBase Objects Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.dpk
new file mode 100644
index 0000000..1238d53
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_IBODriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Objects Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ IBO40TRT_D6,
+ IBO40XRT_D6;
+
+contains
+ uDAIBODriver in 'uDAIBODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.cfg
new file mode 100644
index 0000000..6784156
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.dof
new file mode 100644
index 0000000..b8f8fb1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - InterBase Objects Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.dpk
new file mode 100644
index 0000000..d4562dc
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_IBODriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Objects Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7,
+ IBO40TRT_D7,
+ IBO40XRT_D7;
+
+contains
+ uDAIBODriver in 'uDAIBODriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_Glyphs.res
new file mode 100644
index 0000000..e4c8f7b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBODriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.bdsproj
new file mode 100644
index 0000000..ba3a5e6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {D0E1436D-9AA9-4616-943B-851DF450E715}
+
+
+
+
+ DataAbstract_IBXDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - InterBase Express Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.cfg
new file mode 100644
index 0000000..9037d9d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.dpk
new file mode 100644
index 0000000..33c10ef
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_IBXDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Express Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ ibxpress;
+
+contains
+ uDAIBXDriver in 'uDAIBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D11.dpk
new file mode 100644
index 0000000..f4f4afd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D11.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_IBXDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Express Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11,
+ ibxpress;
+
+contains
+ uDAIBXDriver in 'uDAIBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D11.dproj
new file mode 100644
index 0000000..0a51da1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D11.dproj
@@ -0,0 +1,63 @@
+
+
+ {c31471d9-f8e2-4e45-94a7-1264d8011587}
+ DataAbstract_IBXDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IBXDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - InterBase Express Driver False True False True False 3 0 1 361 False False False False False 1033 1252 RemObjects Software 3.0.1.361 RemObjects SDK 1.0.0.0 DataAbstract_IBXDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D11.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D12.dpk
new file mode 100644
index 0000000..5f919cf
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D12.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_IBXDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Express Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D12,
+ ibxpress;
+
+contains
+ uDAIBXDriver in 'uDAIBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D12.dproj
new file mode 100644
index 0000000..fdd0d82
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D12.dproj
@@ -0,0 +1,102 @@
+
+
+ {c31471d9-f8e2-4e45-94a7-1264d8011587}
+ DataAbstract_IBXDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IBXDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_IBXDriver_D12.bpl
+ RemObjects Data Abstract - InterBase Express Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_IBXDriver_D12.dpk
+
+
+ CodeGear Delphi image support library
+ CodeGear C++Builder Office 2000 Servers Package
+ CodeGear C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D12.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D14.dpk
new file mode 100644
index 0000000..bbc8145
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_IBXDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Express Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D14,
+ ibxpress;
+
+contains
+ uDAIBXDriver in 'uDAIBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D14.dproj
new file mode 100644
index 0000000..5ff0445
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D14.dproj
@@ -0,0 +1,102 @@
+
+
+ {c31471d9-f8e2-4e45-94a7-1264d8011587}
+ DataAbstract_IBXDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IBXDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_IBXDriver_D14.bpl
+ RemObjects Data Abstract - InterBase Express Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_IBXDriver_D14.dpk
+
+
+ CodeGear Delphi image support library
+ CodeGear C++Builder Office 2000 Servers Package
+ CodeGear C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D14.res
new file mode 100644
index 0000000..0593ed9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.cfg
new file mode 100644
index 0000000..05f9ec3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.dof
new file mode 100644
index 0000000..220d444
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - InterBase Express Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.138
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.dpk
new file mode 100644
index 0000000..98c5ffa
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_IBXDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Express Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ ibxpress;
+
+contains
+ uDAIBXDriver in 'uDAIBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.res
new file mode 100644
index 0000000..892aed8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.cfg
new file mode 100644
index 0000000..6784156
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.dof
new file mode 100644
index 0000000..933b8c1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - InterBase Express Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.dpk
new file mode 100644
index 0000000..7c15b6b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_IBXDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - InterBase Express Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7,
+ ibxpress;
+
+contains
+ uDAIBXDriver in 'uDAIBXDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_Glyphs.res
new file mode 100644
index 0000000..5d3bf7b
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_IBXDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.bdsproj
new file mode 100644
index 0000000..f023fd3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {89ABBDEB-A4DB-4045-AE76-0CE8A7CB792A}
+
+
+
+
+ DataAbstract_MyDACDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - CoreLabs MyDAC Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.cfg
new file mode 100644
index 0000000..207b254
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.dpk
new file mode 100644
index 0000000..7d302e2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_MyDACDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs MyDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac100,
+ mydac100,
+ RemObjects_Core_D10,
+ DataAbstract_Core_D10;
+
+contains
+ uDAMyDACDriver in 'uDAMyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D11.dpk
new file mode 100644
index 0000000..9a0e35d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D11.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_MyDACDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs MyDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac105,
+ mydac105,
+ RemObjects_Core_D11,
+ DataAbstract_Core_D11;
+
+contains
+ uDAMyDACDriver in 'uDAMyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D11.dproj
new file mode 100644
index 0000000..dec5987
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D11.dproj
@@ -0,0 +1,77 @@
+
+
+ {c13e3848-8048-4b6e-a5c5-b14de1a683a5}
+ DataAbstract_MyDACDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_MyDACDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - CoreLabs MyDAC Driver False False False True False 1 0 0 0 False False False False False 1033 1252 RemObjects Software 1.0.0.0 RemObjects Software RemObjects Software RemObjects Data Abstract 1.0.0.0 DataAbstract_MyDACDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D12.dpk
new file mode 100644
index 0000000..1051872
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D12.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_MyDACDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs MyDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac120,
+ mydac120,
+ DataAbstract_Core_D12;
+
+contains
+ uDAMyDACDriver in 'uDAMyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D12.dproj
new file mode 100644
index 0000000..addf263
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D12.dproj
@@ -0,0 +1,99 @@
+
+
+ {c13e3848-8048-4b6e-a5c5-b14de1a683a5}
+ DataAbstract_MyDACDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_MyDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D12
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_MyDACDriver_D12.bpl
+ true
+ RemObjects Data Abstract - CoreLabs MyDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_MyDACDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D12.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D14.dpk
new file mode 100644
index 0000000..aa75284
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D14.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_MyDACDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs MyDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac140,
+ mydac140,
+ DataAbstract_Core_D14;
+
+contains
+ uDAMyDACDriver in 'uDAMyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D14.dproj
new file mode 100644
index 0000000..e39e5b1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D14.dproj
@@ -0,0 +1,101 @@
+
+
+ {c13e3848-8048-4b6e-a5c5-b14de1a683a5}
+ DataAbstract_MyDACDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_MyDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D14
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_MyDACDriver_D14.bpl
+ true
+ RemObjects Data Abstract - CoreLabs MyDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_MyDACDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D14.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.cfg
new file mode 100644
index 0000000..481e4c1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.cfg
@@ -0,0 +1,42 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\dcu\d6"
+-LE"..\..\dcu\d6"
+-LN"..\..\dcu\d6"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_PLATFORM
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.dof
new file mode 100644
index 0000000..468bfc4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - CoreLabs MyDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.dpk
new file mode 100644
index 0000000..3886fc7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_MYDACDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs MyDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac60,
+ mydac60,
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6;
+
+contains
+ uDAMyDACDriver in 'uDAMyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.res
new file mode 100644
index 0000000..371f8db
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.cfg
new file mode 100644
index 0000000..6784156
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.dof
new file mode 100644
index 0000000..d99f972
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - CoreLabs MyDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.dpk
new file mode 100644
index 0000000..a90f1f3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_MyDACDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs MyDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac70,
+ mydac70,
+ RemObjects_Core_D7,
+ DataAbstract_Core_D7;
+
+contains
+ uDAMyDACDriver in 'uDAMyDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.res
new file mode 100644
index 0000000..371f8db
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_Glyphs.res
new file mode 100644
index 0000000..7e28db9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MyDACDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D10.bdsproj
new file mode 100644
index 0000000..98d0a00
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {0FC45B58-F519-40B6-831A-DD79C8D3270F}
+
+
+
+
+ DataAbstract_MySQLDACDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - MicroOlap mySQL Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D10.dpk
new file mode 100644
index 0000000..835b724
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D10.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_MySQLDACDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap mySQLDac Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ mySQLDAC10;
+
+contains
+ uDAMySQLDACDriver in 'uDAMySQLDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D11.dpk
new file mode 100644
index 0000000..55e6cc5
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D11.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_MySQLDACDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap mySQLDac Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11,
+ mySQLDAC11;
+
+contains
+ uDAMySQLDACDriver in 'uDAMySQLDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D11.dproj
new file mode 100644
index 0000000..3c6e25d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D11.dproj
@@ -0,0 +1,552 @@
+
+
+ {8ba781c7-bf1c-49bf-a87d-d21f3a68fd91}
+ DataAbstract_MySQLDACDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_MySQLDACDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - MicroOlap mySQLDac Driver False True False True False 3 0 1 361 False False False False False 1033 1252 RemObjects Software 3.0.1.361 RemObjects SDK 1.0.0.0 DataAbstract_MySQLDACDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D12.dpk
new file mode 100644
index 0000000..9a3dd0e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D12.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_MySQLDACDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap mySQLDac Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D12,
+ mySQLDAC12;
+
+contains
+ uDAMySQLDACDriver in 'uDAMySQLDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D12.dproj
new file mode 100644
index 0000000..8eec613
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D12.dproj
@@ -0,0 +1,95 @@
+
+
+ {8ba781c7-bf1c-49bf-a87d-d21f3a68fd91}
+ DataAbstract_MySQLDACDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_MySQLDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_MySQLDACDriver_D12.bpl
+ RemObjects Data Abstract - MicroOlap mySQLDac Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_MySQLDACDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D12.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D14.dpk
new file mode 100644
index 0000000..b35e124
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_MySQLDACDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap mySQLDac Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D14,
+ mySQLDAC14;
+
+contains
+ uDAMySQLDACDriver in 'uDAMySQLDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D14.dproj
new file mode 100644
index 0000000..0287444
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D14.dproj
@@ -0,0 +1,97 @@
+
+
+ {8ba781c7-bf1c-49bf-a87d-d21f3a68fd91}
+ DataAbstract_MySQLDACDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_MySQLDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_MySQLDACDriver_D14.bpl
+ RemObjects Data Abstract - MicroOlap mySQLDac Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_MySQLDACDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D14.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.cfg
new file mode 100644
index 0000000..05f9ec3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.dof
new file mode 100644
index 0000000..e0035fa
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - ADOExpress/dbGo Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.138
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.dpk
new file mode 100644
index 0000000..66a1e6c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_MySQLDACDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap mySQLDac Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ mySQLDAC6;
+
+contains
+ uDAMySQLDACDriver in 'uDAMySQLDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.res
new file mode 100644
index 0000000..892aed8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.cfg
new file mode 100644
index 0000000..6784156
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.dof
new file mode 100644
index 0000000..f2d0c96
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - ADOExpress/dbGo Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.dpk
new file mode 100644
index 0000000..994ed6b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_MySQLDACDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap mySQLDac Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7,
+ mySQLDAC7;
+
+contains
+ uDAMySQLDACDriver in 'uDAMySQLDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.res
new file mode 100644
index 0000000..892aed8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_Glyphs.res
new file mode 100644
index 0000000..cd846aa
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_MySQLDACDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.bdsproj
new file mode 100644
index 0000000..05fd89b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.bdsproj
@@ -0,0 +1,182 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {56F75847-162D-44A5-A3DF-94172EE994EF}
+
+
+
+
+ DataAbstract_NexusDBDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ Data Abstract - NexusDB Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ RemObjects Data Abstract - Core Library
+ RemObjects Data Abstract - IDE Package
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.cfg
new file mode 100644
index 0000000..ab68ed8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\"
+-O"..\"
+-I"..\"
+-R"..\"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.dpk
new file mode 100644
index 0000000..5ab0396
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.dpk
@@ -0,0 +1,47 @@
+package DataAbstract_NexusDBDriver_D10;
+
+{$R *.res}
+{$R 'uDANexusDBDriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'Data Abstract - NexusDB Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ RemObjects_Core_D10,
+ DataAbstract_Core_D10,
+ NexusDB107ll100,
+ NexusDB107sr100,
+ NexusDB107sd100,
+ NexusDB107sq100,
+ NexusDB107re100,
+ NexusDB107st100,
+ NexusDB107tn100,
+ NexusDB107pt100,
+ NexusDB107tw100,
+ NexusDB107db100,
+ NexusDB1071x100;
+
+contains
+ uDANexusDBDriver in 'uDANexusDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.res
new file mode 100644
index 0000000..941b7a7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D11.dpk
new file mode 100644
index 0000000..457277c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D11.dpk
@@ -0,0 +1,46 @@
+package DataAbstract_NexusDBDriver_D11;
+
+{$R *.res}
+{$R 'uDANexusDBDriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'Data Abstract - NexusDB Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ RemObjects_Core_D11,
+ DataAbstract_Core_D11,
+ NexusDB302ll110,
+ NexusDB302se110,
+ NexusDB302sr110,
+ NexusDB302sd110,
+ NexusDB302sq110,
+ NexusDB302re110,
+ NexusDB302pt110,
+ NexusDB302tn110,
+ NexusDB302tw110,
+ NexusDB302db110;
+
+contains
+ uDANexusDBDriver in 'uDANexusDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D11.dproj
new file mode 100644
index 0000000..52343f9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D11.dproj
@@ -0,0 +1,102 @@
+
+
+
+ {f5368522-8742-4b69-a8b3-668ec242cc52}
+ DataAbstract_NexusDBDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_NexusDBDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\
+ ..\
+ ..\
+ ..\
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\
+ ..\
+ ..\
+ ..\
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False Data Abstract - NexusDB Driver False False False True False 1 0 0 0 False False False False False 1033 1252 1.0.0.0 1.0.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ RemObjects Data Abstract - MicroOlap mySQLDac Driver
+ CodeGear BDE DB Components
+ CodeGear C++Builder Office 2000 Servers Package
+ CodeGear C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+ DataAbstract_NexusDBDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D11.res
new file mode 100644
index 0000000..941b7a7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D12.dpk
new file mode 100644
index 0000000..380698b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D12.dpk
@@ -0,0 +1,44 @@
+package DataAbstract_NexusDBDriver_D12;
+
+{$R *.res}
+{$R 'uDANexusDBDriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'Data Abstract - NexusDB Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ DataAbstract_Core_D12,
+ NexusDB302ll120,
+ NexusDB302se120,
+ NexusDB302sr120,
+ NexusDB302sd120,
+ NexusDB302sq120,
+ NexusDB302re120,
+ NexusDB302pt120,
+ NexusDB302tn120,
+ NexusDB302tw120,
+ NexusDB302db120;
+contains
+ uDANexusDBDriver in 'uDANexusDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D12.dproj
new file mode 100644
index 0000000..e683a67
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D12.dproj
@@ -0,0 +1,111 @@
+
+
+ {f5368522-8742-4b69-a8b3-668ec242cc52}
+ DataAbstract_NexusDBDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_NexusDBDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ error
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_NexusDBDriver_D12.bpl
+ Data Abstract - NexusDB Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+ RemObjects Data Abstract - MicroOlap mySQLDac Driver
+ CodeGear BDE DB Components
+ CodeGear C++Builder Office 2000 Servers Package
+ CodeGear C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+ DataAbstract_NexusDBDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D12.res
new file mode 100644
index 0000000..941b7a7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D14.dpk
new file mode 100644
index 0000000..8cacec4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D14.dpk
@@ -0,0 +1,45 @@
+package DataAbstract_NexusDBDriver_D14;
+
+{$R *.res}
+{$R 'uDANexusDBDriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'Data Abstract - NexusDB Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ DataAbstract_Core_D14,
+ NexusDB302ll140,
+ NexusDB302se140,
+ NexusDB302sr140,
+ NexusDB302sd140,
+ NexusDB302sq140,
+ NexusDB302re140,
+ NexusDB302pt140,
+ NexusDB302tn140,
+ NexusDB302tw140,
+ NexusDB302db140;
+
+contains
+ uDANexusDBDriver in 'uDANexusDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D14.dproj
new file mode 100644
index 0000000..cf9424a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D14.dproj
@@ -0,0 +1,113 @@
+
+
+ {f5368522-8742-4b69-a8b3-668ec242cc52}
+ DataAbstract_NexusDBDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_NexusDBDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ error
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_NexusDBDriver_D14.bpl
+ Data Abstract - NexusDB Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+ RemObjects Data Abstract - MicroOlap mySQLDac Driver
+ CodeGear BDE DB Components
+ CodeGear C++Builder Office 2000 Servers Package
+ CodeGear C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+ DataAbstract_NexusDBDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D14.res
new file mode 100644
index 0000000..941b7a7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.cfg
new file mode 100644
index 0000000..c7cbecf
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.cfg
@@ -0,0 +1,42 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\Dcu\D6"
+-LE"..\Dcu\D6"
+-LN"..\Dcu\D6"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_PLATFORM
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.dof
new file mode 100644
index 0000000..dcd6c63
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - NexusDB Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\Dcu\D6
+PackageDLLOutputDir=..\Dcu\D6
+PackageDCPOutputDir=..\Dcu\D6
+SearchPath=
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.dpk
new file mode 100644
index 0000000..f2b9bec
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.dpk
@@ -0,0 +1,44 @@
+package DataAbstract_NexusDBDriver_D6;
+
+{$R *.res}
+{$R 'uDANexusDBDriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'Data Abstract - NexusDB Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6,
+ NexusDB107st60,
+ NexusDB107pt60,
+ NexusDB107tw60,
+ NexusDB107tn60,
+ NexusDB107re60,
+ NexusDB1071x60,
+ NexusDB107sq60,
+ NexusDB107db60;
+
+contains
+ uDANexusDBDriver in 'uDANexusDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.res
new file mode 100644
index 0000000..22eb4e7
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.cfg
new file mode 100644
index 0000000..d772b58
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.cfg
@@ -0,0 +1,46 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\Dcu\D7"
+-LE"..\Dcu\D7"
+-LN"..\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.dof
new file mode 100644
index 0000000..3a86bcb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - NexusDB Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\Dcu\D7
+PackageDLLOutputDir=..\Dcu\D7
+PackageDCPOutputDir=..\Dcu\D7
+SearchPath=
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.dpk
new file mode 100644
index 0000000..66eb10a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.dpk
@@ -0,0 +1,47 @@
+package DataAbstract_NexusDBDriver_D7;
+
+{$R *.res}
+{$R 'uDANexusDBDriver.dcr'}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'Data Abstract - NexusDB Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ RemObjects_Core_D7,
+ DataAbstract_Core_D7,
+ NexusDB107ll70,
+ NexusDB107sr70,
+ NexusDB107sd70,
+ NexusDB107sq70,
+ NexusDB107re70,
+ NexusDB107st70,
+ NexusDB107tn70,
+ NexusDB107pt70,
+ NexusDB107tw70,
+ NexusDB107db70,
+ NexusDB1071x70;
+
+contains
+ uDANexusDBDriver in 'uDANexusDBDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.res
new file mode 100644
index 0000000..20e9bca
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_NexusDBDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.bdsproj
new file mode 100644
index 0000000..01bb3ad
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {D5CF0E18-5430-44E4-8B68-4D54B5F3535D}
+
+
+
+
+ DataAbstract_ODACDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - CoreLabs ODAC Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.cfg
new file mode 100644
index 0000000..207b254
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.dpk
new file mode 100644
index 0000000..78921ea
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_ODACDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs ODAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac100,
+ RemObjects_Core_D10,
+ DataAbstract_Core_D10,
+ odac100;
+
+contains
+ uDAODACDriver in 'uDAODACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D11.dpk
new file mode 100644
index 0000000..92f4d48
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D11.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_ODACDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs ODAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac105,
+ RemObjects_Core_D11,
+ DataAbstract_Core_D11,
+ odac105;
+
+contains
+ uDAODACDriver in 'uDAODACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D11.dproj
new file mode 100644
index 0000000..7d8ed75
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D11.dproj
@@ -0,0 +1,87 @@
+
+
+ {4ed86b4c-3296-4ab5-b711-e264774d76b0}
+ DataAbstract_ODACDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ODACDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - CoreLabs ODAC Driver False False False True False 1 0 0 0 False False False False False 1033 1252 RemObjects Software 1.0.0.0 RemObjects Software RemObjects Software RemObjects Data Abstract 1.0.0.0 DataAbstract_ODACDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D12.dpk
new file mode 100644
index 0000000..0b6e0ae
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D12.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_ODACDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs ODAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac120,
+ DataAbstract_Core_D12,
+ odac120;
+
+contains
+ uDAODACDriver in 'uDAODACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D12.dproj
new file mode 100644
index 0000000..16668d0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D12.dproj
@@ -0,0 +1,99 @@
+
+
+ {4ed86b4c-3296-4ab5-b711-e264774d76b0}
+ DataAbstract_ODACDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ODACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D12
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_ODACDriver_D12.bpl
+ true
+ RemObjects Data Abstract - CoreLabs ODAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_ODACDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D12.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D14.dpk
new file mode 100644
index 0000000..119eebe
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D14.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_ODACDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs ODAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac140,
+ DataAbstract_Core_D14,
+ odac140;
+
+contains
+ uDAODACDriver in 'uDAODACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D14.dproj
new file mode 100644
index 0000000..2a2d16d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D14.dproj
@@ -0,0 +1,101 @@
+
+
+ {4ed86b4c-3296-4ab5-b711-e264774d76b0}
+ DataAbstract_ODACDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ODACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D14
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_ODACDriver_D14.bpl
+ true
+ RemObjects Data Abstract - CoreLabs ODAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_ODACDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D14.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.cfg
new file mode 100644
index 0000000..0aa2cb6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.dof
new file mode 100644
index 0000000..e6a8cb6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.dof
@@ -0,0 +1,77 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - CoreLabs ODAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.dpk
new file mode 100644
index 0000000..debd426
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_ODACDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs ODAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac60,
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6,
+ odac60;
+
+contains
+ uDAODACDriver in 'uDAODACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.cfg
new file mode 100644
index 0000000..a290ad9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.dof
new file mode 100644
index 0000000..b6566eb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - CoreLabs ODAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.dpk
new file mode 100644
index 0000000..06e9940
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_ODACDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs ODAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac70,
+ RemObjects_Core_D7,
+ DataAbstract_Core_D7,
+ odac70;
+
+contains
+ uDAODACDriver in 'uDAODACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_Glyphs.res
new file mode 100644
index 0000000..5948a0e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ODACDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.bdsproj
new file mode 100644
index 0000000..30eddaf
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {D5CF0E18-5430-44E4-8B68-4D54B5F3535D}
+
+
+
+
+ DataAbstract_PgDACDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - Devart PgDAC Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.cfg
new file mode 100644
index 0000000..207b254
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.dpk
new file mode 100644
index 0000000..7517fcb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_PgDACDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart PgDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac100,
+ RemObjects_Core_D10,
+ DataAbstract_Core_D10,
+ pgdac100;
+
+contains
+ uDAPgDACDriver in 'uDAPgDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D11.dpk
new file mode 100644
index 0000000..162cb52
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D11.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_PgDACDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart PgDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac105,
+ RemObjects_Core_D11,
+ DataAbstract_Core_D11,
+ pgdac105;
+
+contains
+ uDAPgDACDriver in 'uDAPgDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D11.dproj
new file mode 100644
index 0000000..18fec30
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D11.dproj
@@ -0,0 +1,73 @@
+
+
+ {4ed86b4c-3296-4ab5-b711-e264774d76b0}
+ DataAbstract_PgDACDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_PgDACDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - Devart PgDAC Driver False False False True False 1 0 0 0 False False False False False 1033 1252 RemObjects Software 1.0.0.0 RemObjects Software RemObjects Software RemObjects Data Abstract 1.0.0.0 DataAbstract_PgDACDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D12.dpk
new file mode 100644
index 0000000..a79a681
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D12.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_PgDACDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart PgDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac120,
+ DataAbstract_Core_D12,
+ pgdac120;
+
+contains
+ uDAPgDACDriver in 'uDAPgDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D12.dproj
new file mode 100644
index 0000000..7a6bbb4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D12.dproj
@@ -0,0 +1,99 @@
+
+
+ {4ed86b4c-3296-4ab5-b711-e264774d76b0}
+ DataAbstract_PgDACDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_PgDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D12
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_PgDACDriver_D12.bpl
+ true
+ RemObjects Data Abstract - Devart PgDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_PgDACDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D12.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D14.dpk
new file mode 100644
index 0000000..d8d6a08
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_PgDACDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart PgDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ dac140,
+ DataAbstract_Core_D14,
+ pgdac140;
+
+contains
+ uDAPgDACDriver in 'uDAPgDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D14.dproj
new file mode 100644
index 0000000..af91ba5
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D14.dproj
@@ -0,0 +1,101 @@
+
+
+ {4ed86b4c-3296-4ab5-b711-e264774d76b0}
+ DataAbstract_PgDACDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_PgDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D14
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_PgDACDriver_D14.bpl
+ true
+ RemObjects Data Abstract - Devart PgDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_PgDACDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D14.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.cfg
new file mode 100644
index 0000000..7124fa1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.dof
new file mode 100644
index 0000000..94003e2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.dof
@@ -0,0 +1,77 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Devart PgDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.dpk
new file mode 100644
index 0000000..85d77b6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_PgDACDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart PgDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ dac60,
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6,
+ pgdac60;
+
+contains
+ uDAPgDACDriver in 'uDAPgDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.cfg
new file mode 100644
index 0000000..a290ad9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.dof
new file mode 100644
index 0000000..a870306
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Devart PgDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.dpk
new file mode 100644
index 0000000..db2cfb1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_PgDACDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart PgDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac70,
+ RemObjects_Core_D7,
+ DataAbstract_Core_D7,
+ pgdac70;
+
+contains
+ uDAPgDACDriver in 'uDAPgDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_Glyphs.res
new file mode 100644
index 0000000..f3a4591
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PgDACDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.bdsproj
new file mode 100644
index 0000000..d3a6db6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {0FC45B58-F519-40B6-831A-DD79C8D3270F}
+
+
+
+
+ DataAbstract_PostgresDACDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - MicroOlap PostgresDAC Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.cfg
new file mode 100644
index 0000000..9037d9d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.dpk
new file mode 100644
index 0000000..424def4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_PostgresDACDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap PostgresDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ PostgresDAC10;
+
+contains
+ uDAPostgresDACDriver in 'uDAPostgresDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D11.dpk
new file mode 100644
index 0000000..14e92ab
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D11.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_PostgresDACDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap PostgresDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11,
+ PostgresDAC11;
+
+contains
+ uDAPostgresDACDriver in 'uDAPostgresDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D11.dproj
new file mode 100644
index 0000000..1233566
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D11.dproj
@@ -0,0 +1,69 @@
+
+
+
+ {777e54de-8166-497d-912a-60af105eb626}
+ DataAbstract_PostgresDACDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_PostgresDACDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - MicroOlap PostgresDAC Driver False True False True False 3 0 1 361 False False False False False 1033 1252 RemObjects Software 3.0.1.361 RemObjects SDK 1.0.0.0 DataAbstract_PostgresDACDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D11.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D12.dpk
new file mode 100644
index 0000000..162af52
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D12.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_PostgresDACDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap PostgresDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D12,
+ PostgresDAC12;
+
+contains
+ uDAPostgresDACDriver in 'uDAPostgresDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D12.dproj
new file mode 100644
index 0000000..cc12094
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D12.dproj
@@ -0,0 +1,95 @@
+
+
+ {777e54de-8166-497d-912a-60af105eb626}
+ DataAbstract_PostgresDACDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_PostgresDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D12
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_PostgresDACDriver_D12.bpl
+ RemObjects Data Abstract - MicroOlap PostgresDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_PostgresDACDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D12.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D14.dpk
new file mode 100644
index 0000000..2d97f99
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_PostgresDACDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap PostgresDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D14,
+ PostgresDAC14;
+
+contains
+ uDAPostgresDACDriver in 'uDAPostgresDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D14.dproj
new file mode 100644
index 0000000..43b7324
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D14.dproj
@@ -0,0 +1,97 @@
+
+
+ {777e54de-8166-497d-912a-60af105eb626}
+ DataAbstract_PostgresDACDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_PostgresDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ error
+ ..\..\Dcu\D14
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_PostgresDACDriver_D14.bpl
+ RemObjects Data Abstract - MicroOlap PostgresDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_PostgresDACDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D14.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.cfg
new file mode 100644
index 0000000..05f9ec3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.dof
new file mode 100644
index 0000000..e0035fa
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - ADOExpress/dbGo Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.138
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.dpk
new file mode 100644
index 0000000..b7803fe
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_PostgresDACDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap PostgresDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6,
+ PostgresDAC6;
+
+contains
+ uDAPostgresDACDriver in 'uDAPostgresDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.res
new file mode 100644
index 0000000..892aed8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.cfg
new file mode 100644
index 0000000..6784156
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.dof
new file mode 100644
index 0000000..f2d0c96
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - ADOExpress/dbGo Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.dpk
new file mode 100644
index 0000000..37c6d74
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_PostgresDACDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - MicroOlap PostgresDAC Driver'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7,
+ PostgresDAC7;
+
+contains
+ uDAPostgresDACDriver in 'uDAPostgresDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.res
new file mode 100644
index 0000000..892aed8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_Glyphs.res
new file mode 100644
index 0000000..fb43550
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_PostgresDACDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.bdsproj
new file mode 100644
index 0000000..d05f343
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {D100EE26-6D50-4902-BC9B-C2BA456E2258}
+
+
+
+
+ DataAbstract_SDACDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - CoreLabs SDAC Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.cfg
new file mode 100644
index 0000000..207b254
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.dpk
new file mode 100644
index 0000000..a7067e9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_SDACDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs SDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac100,
+ RemObjects_Core_D10,
+ sdac100,
+ DataAbstract_Core_D10;
+
+contains
+ uDASDACDriver in 'uDASDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D11.dpk
new file mode 100644
index 0000000..40d1424
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D11.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_SDACDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs SDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac105,
+ RemObjects_Core_D11,
+ sdac105,
+ DataAbstract_Core_D11;
+
+contains
+ uDASDACDriver in 'uDASDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D11.dproj
new file mode 100644
index 0000000..4c5409b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D11.dproj
@@ -0,0 +1,79 @@
+
+
+ {bcb5ceeb-712c-4f85-83e3-6f57bb934c9f}
+ DataAbstract_SDACDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_SDACDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - CoreLabs SDAC Driver False False False True False 1 0 0 0 False False False False False 1033 1252 RemObjects Software 1.0.0.0 RemObjects Software RemObjects Software RemObjects Data Abstract 1.0.0.0 DataAbstract_SDACDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D12.dpk
new file mode 100644
index 0000000..206f297
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D12.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_SDACDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs SDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac120,
+ sdac120,
+ DataAbstract_Core_D12;
+
+contains
+ uDASDACDriver in 'uDASDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D12.dproj
new file mode 100644
index 0000000..6641211
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D12.dproj
@@ -0,0 +1,99 @@
+
+
+ {bcb5ceeb-712c-4f85-83e3-6f57bb934c9f}
+ DataAbstract_SDACDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_SDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D12
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_SDACDriver_D12.bpl
+ true
+ RemObjects Data Abstract - CoreLabs SDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_SDACDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D12.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D14.dpk
new file mode 100644
index 0000000..bd096f5
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D14.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_SDACDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs SDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac140,
+ sdac140,
+ DataAbstract_Core_D14;
+
+contains
+ uDASDACDriver in 'uDASDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D14.dproj
new file mode 100644
index 0000000..2fd239b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D14.dproj
@@ -0,0 +1,101 @@
+
+
+ {bcb5ceeb-712c-4f85-83e3-6f57bb934c9f}
+ DataAbstract_SDACDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_SDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D14
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_SDACDriver_D14.bpl
+ true
+ RemObjects Data Abstract - CoreLabs SDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_SDACDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D14.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.cfg
new file mode 100644
index 0000000..0aa2cb6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.dof
new file mode 100644
index 0000000..a6cb4e4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.dof
@@ -0,0 +1,77 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - CoreLabs SDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.dpk
new file mode 100644
index 0000000..6f3c3e6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_SDACDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs SDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6,
+ dac60,
+ sdac60;
+
+contains
+ uDASDACDriver in 'uDASDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.cfg
new file mode 100644
index 0000000..a290ad9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.dof
new file mode 100644
index 0000000..42ca991
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - CoreLabs SDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.dpk
new file mode 100644
index 0000000..ca1d337
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_SDACDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - CoreLabs SDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac70,
+ RemObjects_Core_D7,
+ sdac70,
+ DataAbstract_Core_D7;
+
+contains
+ uDASDACDriver in 'uDASDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.res
new file mode 100644
index 0000000..ac3b612
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_Glyphs.res
new file mode 100644
index 0000000..d14c81c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SDACDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.bdsproj
new file mode 100644
index 0000000..4acf23e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {C227C50C-E7AA-4212-8D32-C33B5BFE5BB8}
+
+
+
+
+ DataAbstract_SQLiteDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - SQLite Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.cfg
new file mode 100644
index 0000000..207b254
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.dpk
new file mode 100644
index 0000000..e678ec2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.dpk
@@ -0,0 +1,37 @@
+package DataAbstract_SQLiteDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLite Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10;
+
+contains
+ uDASQLiteDriver in 'uDASQLiteDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D11.dpk
new file mode 100644
index 0000000..ba6edaa
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D11.dpk
@@ -0,0 +1,37 @@
+package DataAbstract_SQLiteDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLite Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D11;
+
+contains
+ uDASQLiteDriver in 'uDASQLiteDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D11.dproj
new file mode 100644
index 0000000..ed142b2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D11.dproj
@@ -0,0 +1,71 @@
+
+
+ {17f81962-5ed1-4c36-bee9-ce79aab46e95}
+ DataAbstract_SQLiteDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_SQLiteDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - SQLite Driver False False False True False 3 0 1 361 False False False False False 1033 1252 RemObjects Software 3.0.1.361 RemObjects SDK 1.0.0.0 DataAbstract_SQLiteDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D11.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D12.dpk
new file mode 100644
index 0000000..201d328
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D12.dpk
@@ -0,0 +1,37 @@
+package DataAbstract_SQLiteDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLite Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D12;
+
+contains
+ uDASQLiteDriver in 'uDASQLiteDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D12.dproj
new file mode 100644
index 0000000..e23601c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D12.dproj
@@ -0,0 +1,96 @@
+
+
+ {17f81962-5ed1-4c36-bee9-ce79aab46e95}
+ DataAbstract_SQLiteDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_SQLiteDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D12
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_SQLiteDriver_D12.bpl
+ true
+ RemObjects Data Abstract - SQLite Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_SQLiteDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D12.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D14.dpk
new file mode 100644
index 0000000..633943e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D14.dpk
@@ -0,0 +1,37 @@
+package DataAbstract_SQLiteDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLite Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D14;
+
+contains
+ uDASQLiteDriver in 'uDASQLiteDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D14.dproj
new file mode 100644
index 0000000..0ae6814
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D14.dproj
@@ -0,0 +1,98 @@
+
+
+ {17f81962-5ed1-4c36-bee9-ce79aab46e95}
+ DataAbstract_SQLiteDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_SQLiteDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D14
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_SQLiteDriver_D14.bpl
+ true
+ RemObjects Data Abstract - SQLite Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_SQLiteDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D14.res
new file mode 100644
index 0000000..7b3c163
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.cfg
new file mode 100644
index 0000000..4730510
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.dof
new file mode 100644
index 0000000..1fb3129
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.dof
@@ -0,0 +1,76 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - SQLite Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.138
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.dpk
new file mode 100644
index 0000000..81be681
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.dpk
@@ -0,0 +1,37 @@
+package DataAbstract_SQLiteDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLite Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D6;
+
+contains
+ uDASQLiteDriver in 'uDASQLiteDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.res
new file mode 100644
index 0000000..f5602d3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.cfg
new file mode 100644
index 0000000..5cf57a8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.dof
new file mode 100644
index 0000000..94c4d85
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - SQLite Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.142
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.dpk
new file mode 100644
index 0000000..0265195
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.dpk
@@ -0,0 +1,37 @@
+package DataAbstract_SQLiteDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLite Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D7;
+
+contains
+ uDASQLiteDriver in 'uDASQLiteDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_Glyphs.res
new file mode 100644
index 0000000..9f2e224
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLiteDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.bdsproj
new file mode 100644
index 0000000..ebc5585
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.bdsproj
@@ -0,0 +1,170 @@
+
+
+
+
+ Delphi.Personality
+ VCLApplication
+ 1.0
+ {A7C1512C-6957-4F5F-B567-CF112814C32C}
+
+
+
+
+ DataAbstract_SQLitePassDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - SQLitePass Driver
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.cfg
new file mode 100644
index 0000000..83deb76
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.cfg
@@ -0,0 +1,44 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.dpk
new file mode 100644
index 0000000..accadb7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_SQLitePassDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLitePass Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ DataAbstract_Core_D10,
+ vcldb,
+ RemObjects_Core_D10;
+
+contains
+ uDASQLitePassDriver in 'uDASQLitePassDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.dproj
new file mode 100644
index 0000000..d240289
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.dproj
@@ -0,0 +1,100 @@
+
+
+ {8e6254e3-ed13-46bb-a357-86f60b62c415}
+ DataAbstract_SQLitePassDriver_D10.dpk
+ Debug
+ AnyCPU
+ DCC32
+ D:\Program files.all\Winsys\borland\DataAbstract_SQLitePassDriver_D10.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ RELEASE
+
+
+ 7.0
+ True
+ True
+ DEBUG
+
+
+ Delphi.Personality
+ Package
+
+
+ False
+ True
+ False
+
+
+ RemObjects Data Abstract - SQLitePass Driver
+ False
+ False
+ False
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+
+
+
+
+
+
+ Data Abstract - NexusDB Driver
+ CodeGear C++Builder Office 2000 Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+ DataAbstract_SQLitePassDriver_D10.dpk
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.res
new file mode 100644
index 0000000..c71f94d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D11.dpk
new file mode 100644
index 0000000..038434e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D11.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_SQLitePassDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLitePass Driver'}
+{$IMPLICITBUILD OFF}
+{$DEFINE DEBUG}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ DataAbstract_Core_D11,
+ RemObjects_Core_D11;
+
+contains
+ uDASQLitePassDriver in 'uDASQLitePassDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D11.dproj
new file mode 100644
index 0000000..af5a6da
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D11.dproj
@@ -0,0 +1,62 @@
+
+
+ {8e6254e3-ed13-46bb-a357-86f60b62c415}
+ DataAbstract_SQLitePassDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_SQLitePassDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ RELEASE
+
+
+ 7.0
+ True
+ True
+ DEBUG
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - SQLitePass Driver False False False True False 1 0 0 0 False False False False False 1049 1251 1.0.0.0 1.0.0.0
+
+
+
+
+ Data Abstract - NexusDB Driver
+ CodeGear C++Builder Office 2000 Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+ DataAbstract_SQLitePassDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D11.res
new file mode 100644
index 0000000..653aa54
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D12.dpk
new file mode 100644
index 0000000..1aa375a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D12.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_SQLitePassDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLitePass Driver'}
+{$IMPLICITBUILD OFF}
+{$DEFINE DEBUG}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ DataAbstract_Core_D12,
+ RemObjects_Core_D12;
+
+contains
+ uDASQLitePassDriver in 'uDASQLitePassDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D12.dproj
new file mode 100644
index 0000000..90cf7bb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D12.dproj
@@ -0,0 +1,101 @@
+
+
+ {8e6254e3-ed13-46bb-a357-86f60b62c415}
+ DataAbstract_SQLitePassDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_SQLitePassDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ true
+ ..\..\Dcu\D12\DataAbstract_SQLitePassDriver_D12.bpl
+ 00400000
+ ..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ ..\..\Dcu\D12
+ DEBUG;$(DCC_Define)
+ RemObjects Data Abstract - SQLitePass Driver
+ true
+ ..\..\Dcu\D12
+ true
+ ..\..\Dcu\D12
+ false
+ true
+ true
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ Data Abstract - NexusDB Driver
+ CodeGear C++Builder Office 2000 Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+ DataAbstract_SQLitePassDriver_D12.dpk
+
+
+ C:\Program Files\RemObjects Software\Data Abstract for Delphi\Source\Drivers\
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D12.res
new file mode 100644
index 0000000..653aa54
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D14.dpk
new file mode 100644
index 0000000..95d53c0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D14.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_SQLitePassDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLitePass Driver'}
+{$IMPLICITBUILD OFF}
+{$DEFINE DEBUG}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ DataAbstract_Core_D14,
+ RemObjects_Core_D14;
+
+contains
+ uDASQLitePassDriver in 'uDASQLitePassDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D14.dproj
new file mode 100644
index 0000000..0d2928f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D14.dproj
@@ -0,0 +1,101 @@
+
+
+ {8e6254e3-ed13-46bb-a357-86f60b62c415}
+ DataAbstract_SQLitePassDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_SQLitePassDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ true
+ ..\..\Dcu\D14\DataAbstract_SQLitePassDriver_D14.bpl
+ 00400000
+ ..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ ..\..\Dcu\D14
+ DEBUG;$(DCC_Define)
+ RemObjects Data Abstract - SQLitePass Driver
+ true
+ ..\..\Dcu\D14
+ true
+ ..\..\Dcu\D14
+ false
+ true
+ true
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ Data Abstract - NexusDB Driver
+ CodeGear C++Builder Office 2000 Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+ DataAbstract_SQLitePassDriver_D14.dpk
+
+
+ C:\Program Files\RemObjects Software\Data Abstract for Delphi\Source\Drivers\
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D14.res
new file mode 100644
index 0000000..653aa54
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.cfg
new file mode 100644
index 0000000..7124fa1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.dof
new file mode 100644
index 0000000..9b84b3a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.dof
@@ -0,0 +1,77 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - SQLitePass Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.dpk
new file mode 100644
index 0000000..ba6495f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_SQLitePassDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLitePass Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ DataAbstract_Core_D6,
+ RemObjects_Core_D6;
+
+contains
+ uDASQLitePassDriver in 'uDASQLitePassDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.res
new file mode 100644
index 0000000..622f41e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.cfg
new file mode 100644
index 0000000..fa0d7af
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.cfg
@@ -0,0 +1,44 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\..\RemObjects SDK for Delphi\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\..\RemObjects SDK for Delphi\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\..\RemObjects SDK for Delphi\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\..\RemObjects SDK for Delphi\Dcu\D7"
+-Z
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.dof
new file mode 100644
index 0000000..6326525
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - SQLitePass Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\..\RemObjects SDK for Delphi\Dcu\D7
+Packages=vcl;rtl;indy;vcldb;dbrtl;dsnap;vclx;VclSmp;dbexpress;dbxcds;vclie;inet;RemObjects_WebBroker_D7;RemObjects_Indy_D7;RemObjects_RODX_D7;RemObjects_BPDX_D7;RemObjects_Synapse_D7;Jcl;JvCoreD7R;JvSystemD7R;JvStdCtrlsD7R;TntUnicodeVcl_R70;acat70;dsnapcon;adortl;ibxpress;IBO40FTS_D7;IBO40RPL_D7;DataAbstract_Core_D7;DataAbstract_DBXDriver_D7;DataAbstract_IDE_D7;xmlrtl;dxBarD7;IndyCore70;IndySystem70;vclactnband;IndyProtocols70;bdertl;DataAbstract_DBISAMDriver_D7;DataAbstract_SQLiteDriver_D7;cxLibraryVCLD7;dxThemeD7;cxEditorsVCLD7;cxTreeListVCLD7;Hydra_Core_D7;dxComnD7;Hydra_DX_D7;Hydra_RO_D7;PascalScript_RO_D7;DataAbstract_Scripting_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.dpk
new file mode 100644
index 0000000..cc5b811
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_SQLitePassDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLitePass Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ DataAbstract_Core_D7,
+ RemObjects_Core_D7;
+
+contains
+ uDASQLitePassDriver in 'uDASQLitePassDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.res
new file mode 100644
index 0000000..622f41e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.bdsproj
new file mode 100644
index 0000000..1308e38
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.bdsproj
@@ -0,0 +1,168 @@
+
+
+
+
+ Delphi.Personality
+ VCLApplication
+ 1.0
+ {DF172256-09A3-40CF-BF86-02A5D09B9595}
+
+
+
+
+ DataAbstract_SQLitePassDriver_D9.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - SQLitePass Driver
+
+
+
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.cfg
new file mode 100644
index 0000000..8de9e14
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.cfg
@@ -0,0 +1,44 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D9"
+-LE"..\..\Dcu\D9"
+-LN"..\..\Dcu\D9"
+-U"..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9"
+-O"..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9"
+-I"..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9"
+-R"..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9"
+-Z
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.dpk
new file mode 100644
index 0000000..3500ef6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_SQLitePassDriver_D9;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - SQLitePass Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ vcldb,
+ DataAbstract_Core_D9,
+ RemObjects_Core_D9;
+
+contains
+ uDASQLitePassDriver in 'uDASQLitePassDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.res
new file mode 100644
index 0000000..653aa54
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_D9.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Glyphs.RES b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Glyphs.RES
new file mode 100644
index 0000000..802b13a
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Glyphs.RES differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Glyphs.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Glyphs.lrs
new file mode 100644
index 0000000..d4e787d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Glyphs.lrs
@@ -0,0 +1,80 @@
+LazarusResources.Add('TDASQLITEPASSDRIVER','BMP',[
+ 'BM'#248#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#194#6#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#129#30#0'w'#23#0'w'#23#0#255#0#255#255#0
+ +#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0
+ +#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#0#255#255#0#255#129#30
+ +#0#129#30#0#129#30#0#252#154'*'#184':'#0#184':'#0#128'*'#3#255#0#255#128#0#0
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0#255#0
+ +#255#130#24#0#129#30#0#248'w'#0#255#129#0#255#149#19#255#170'4'#255#189'Z'
+ +#138#31#0#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255
+ +#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#5'f'#149#130#24#0'y'#16#0#255#158' '#252'w'#0#143#30#0#213'g'#10#255#171
+ +'8'#138#31#0#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#130#24#0#130#24#0#221#152'Z'#255#191']'#186'M'#5#255#0#255'v'#12#0#242#134
+ +#20#252#160'4'#138#31#0#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#0'R'#143#0'6o'#9
+ +'o'#164'W9'#23#171'3'#0#233#171'n'#255#215#146#193'e%'#255#0#255'v'#12#0#242
+ +'w'#1#255#150#25#138#31#0#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255
+ +#255#255#255#255#255#255#255#128#0#0#0'R'#143#0'R'#143#0'R'#143#6#140#194'I'
+ +#221#255#0'v'#186#0'v'#186'YVE'#255#218#154#233#170'j'#145'%'#0#193'M'#0#255
+ +'~'#0#138#31#0#255#0#255#128#0#0#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#0'6p'#0'j'#161#2#199#255
+ +#9#202#255''''#212#255'N'#222#255'y'#233#255#0'v'#186#255#218#154#255#218#154
+ +#255#211#137#255#177'C'#255#138#7#138#31#0#255#0#255#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#0'9u'#4'v'#170'('#212#255#0
+ +#158#218#0'N'#138#22#163#212'R'#224#255#0'v'#186#196'f#'#203'g'#25#255#218
+ +#154#184':'#0#184':'#0#184':'#0#255#0#255#255#0#255#2't'#169'['#213#226'i'
+ +#246#254'E'#230#254'%'#215#254#13#199#254#26#204#254#0';v'#11#128#176#156#233
+ +#254'h'#230#255'#'#165#212#0'A~'#0'F'#129'0'#215#255'M'#215#254'%_p'#184':'#0
+ +#184':'#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#2't'#169'['#213
+ +#226#127#247#254'z'#238#254'}'#233#254#135#231#255#163#237#255#0';v'#3'{'#176
+ +#165#235#254#167#243#255'^'#193#226#0'L'#138#0'N'#138#19#204#255'-'#206#252
+ +#13'b'#145#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#2't'#169#160#233#239#170#238#246'p'#207#229'?'#177#211#29#149#192#17#131
+ +#177#15'{'#170#0'@z'#24#150#196#182#246#255'~'#212#238#3'g'#157#13#182#235#1
+ +#198#255#13'b'#145#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#3'p'#164'T'#177#202'('#156#188'&'#171#207#27#182#224
+ +#12#183#237#24#198#247':'#213#254#0'A~'#27#153#196#181#244#255#182#246#255
+ +#154#240#255'N'#222#255#13#202#255#13'b'#145#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#4'l'#158'?'#180#203'f'#242
+ +#251'E'#230#254'%'#215#254#13#199#254#26#204#254';'#215#255'`'#225#255#0'Ay'
+ +#0'E~;'#175#213#182#246#255#13'b'#145#13'b'#145#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#2's'#167'['#213
+ +#226'i'#246#254'E'#230#254'%'#215#254#13#199#254#26#204#254';'#215#255'`'#225
+ +#255'}'#229#252'Q'#199#233#0'A{'#0'E{'#1'z'#180#5'f'#149#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#128#128#128#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#0#0#0#128#128#128#255#255#255#128#0#0#128#0
+ +#0#128#0#0#192#220#192#255#255#255#192#220#192#128#0#0#192#220#192#128#0#0
+ +#255#255#255#128#0#0#128#0#0#192#220#192#128#0#0#255#255#255#128#0#0#255#255
+ +#255#128#0#0#128#0#0#128#0#0#255#255#255#0#0#0#128#128#128#255#255#255#255
+ +#255#255#255#255#255#192#220#192#128#0#0#255#255#255#128#0#0#255#255#255#128
+ +#0#0#192#220#192#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255
+ +#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#255#255#255#0#0#0
+ +#128#128#128#255#255#255#192#220#192#128#0#0#128#0#0#192#220#192#255#255#255
+ +#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#255
+ +#255#255#128#0#0#255#255#255#128#0#0#255#255#255#128#0#0#128#0#0#192#220#192
+ +#255#255#255#0#0#0#128#128#128#255#255#255#128#0#0#192#220#192#255#255#255
+ ,#255#255#255#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255
+ +#128#0#0#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0#255#255#255
+ +#128#0#0#255#255#255#255#255#255#255#255#255#0#0#0#128#128#128#255#255#255
+ +#192#220#192#128#0#0#128#0#0#128#0#0#255#255#255#192#220#192#128#0#0#128#0#0
+ +#192#220#192#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#192#220#192
+ +#128#0#0#128#0#0#192#220#192#128#0#0#128#0#0#255#255#255#0#0#0#128#128#128
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#0#0#0#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#0#0
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Lazarus_Unix.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Lazarus_Unix.lpk
new file mode 100644
index 0000000..5c89f27
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Lazarus_Unix.lpk
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Lazarus_Windows.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Lazarus_Windows.lpk
new file mode 100644
index 0000000..a8fa43b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_SQLitePassDriver_Lazarus_Windows.lpk
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.bdsproj
new file mode 100644
index 0000000..5308f1d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {D5CF0E18-5430-44E4-8B68-4D54B5F3535D}
+
+
+
+
+ DataAbstract_UniDACDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - Devart UniDAC Driver False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.cfg
new file mode 100644
index 0000000..207b254
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.dpk
new file mode 100644
index 0000000..73d5c8d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_UniDACDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart UniDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac100,
+ RemObjects_Core_D10,
+ DataAbstract_Core_D10,
+ UniDAC100;
+
+contains
+ uDAUniDACDriver in 'uDAUniDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.dproj
new file mode 100644
index 0000000..d438d9b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.dproj
@@ -0,0 +1,117 @@
+
+
+ {4ed86b4c-3296-4ab5-b711-e264774d76b0}
+ DataAbstract_UniDACDriver_D10.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D10\DataAbstract_UniDACDriver_D10.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ True
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+ DEBUG
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+
+ False
+ True
+ False
+
+
+ RemObjects Data Abstract - Devart UniDAC Driver
+ False
+ False
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_UniDACDriver_D10.dpk
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D11.dpk
new file mode 100644
index 0000000..3eef34d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D11.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_UniDACDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart UniDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac105,
+ RemObjects_Core_D11,
+ DataAbstract_Core_D11,
+ UniDAC105;
+
+contains
+ uDAUniDACDriver in 'uDAUniDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D11.dproj
new file mode 100644
index 0000000..83719d2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D11.dproj
@@ -0,0 +1,75 @@
+
+
+ {4ed86b4c-3296-4ab5-b711-e264774d76b0}
+ DataAbstract_UniDACDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_UniDACDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - Devart UniDAC Driver False False False True False 1 0 0 0 False False False False False 1033 1252 RemObjects Software 1.0.0.0 RemObjects Software RemObjects Software RemObjects Data Abstract 1.0.0.0 DataAbstract_UniDACDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D12.dpk
new file mode 100644
index 0000000..4e208c2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D12.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_UniDACDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart UniDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac120,
+ DataAbstract_Core_D12,
+ UniDAC120;
+
+contains
+ uDAUniDACDriver in 'uDAUniDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D12.dproj
new file mode 100644
index 0000000..cd51cf6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D12.dproj
@@ -0,0 +1,99 @@
+
+
+ {4ed86b4c-3296-4ab5-b711-e264774d76b0}
+ DataAbstract_UniDACDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_UniDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D12
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_UniDACDriver_D12.bpl
+ true
+ RemObjects Data Abstract - Devart UniDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_UniDACDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D12.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D14.dpk
new file mode 100644
index 0000000..4aa2798
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D14.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_UniDACDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart UniDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ dac140,
+ DataAbstract_Core_D14,
+ UniDAC140;
+
+contains
+ uDAUniDACDriver in 'uDAUniDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D14.dproj
new file mode 100644
index 0000000..887bbd0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D14.dproj
@@ -0,0 +1,101 @@
+
+
+ {4ed86b4c-3296-4ab5-b711-e264774d76b0}
+ DataAbstract_UniDACDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_UniDACDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D14
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_UniDACDriver_D14.bpl
+ true
+ RemObjects Data Abstract - Devart UniDAC Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_UniDACDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D14.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.cfg
new file mode 100644
index 0000000..7124fa1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.dof
new file mode 100644
index 0000000..782fb42
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.dof
@@ -0,0 +1,77 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Devart UniDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\..\RemObjects SDK for Delphi\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.dpk
new file mode 100644
index 0000000..a8628c1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.dpk
@@ -0,0 +1,40 @@
+package DataAbstract_UniDACDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart UniDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ dac60,
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6,
+ UniDAC60;
+
+contains
+ uDAUniDACDriver in 'uDAUniDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.cfg
new file mode 100644
index 0000000..a290ad9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.dof
new file mode 100644
index 0000000..c455597
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Devart UniDAC Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.dpk
new file mode 100644
index 0000000..e2edfd7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_UniDACDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart UniDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac70,
+ RemObjects_Core_D7,
+ DataAbstract_Core_D7,
+ UniDAC70;
+
+contains
+ uDAUniDACDriver in 'uDAUniDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.bdsproj
new file mode 100644
index 0000000..e608c59
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.bdsproj
@@ -0,0 +1,172 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {D5CF0E18-5430-44E4-8B68-4D54B5F3535D}
+
+
+
+
+ DataAbstract_UniDACDriver_D9.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - Devart UniDAC Driver
+
+
+
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9;..\..\..\RemObjects SDK for Delphi\Dcu\D9
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+ $00000000
+
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.cfg
new file mode 100644
index 0000000..4a508dd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D9"
+-LE"..\..\Dcu\D9"
+-LN"..\..\Dcu\D9"
+-U"..\..\Dcu\D9"
+-O"..\..\Dcu\D9"
+-I"..\..\Dcu\D9"
+-R"..\..\Dcu\D9"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.dpk
new file mode 100644
index 0000000..09b480e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.dpk
@@ -0,0 +1,41 @@
+package DataAbstract_UniDACDriver_D9;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Devart UniDAC Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ bdertl,
+ dac90,
+ RemObjects_Core_D9,
+ DataAbstract_Core_D9,
+ UniDAC90;
+
+contains
+ uDAUniDACDriver in 'uDAUniDACDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.res
new file mode 100644
index 0000000..c2869c8
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_D9.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_Glyphs.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_Glyphs.lrs
new file mode 100644
index 0000000..5a19295
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_Glyphs.lrs
@@ -0,0 +1,80 @@
+LazarusResources.Add('TDAUNIDACDRIVER','BMP',[
+ 'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#192#6#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0'@'
+ +#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0#255
+ +#255#0#255#255#0#255#255#0#255#129#30#0'w'#23#0'w'#23#0#255#0#255#255#0#255
+ +#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#0#255#255#0#255#129#30#0
+ +#129#30#0#129#30#0#252#154'*'#184':'#0#184':'#0#128'*'#3#255#0#255#128#0#0
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0#255#0
+ +#255#130#24#0#129#30#0#248'w'#0#255#129#0#255#149#19#255#170'4'#255#189'Z'
+ +#138#31#0#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255
+ +#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#5'f'#149#130#24#0'y'#16#0#255#158' '#252'w'#0#143#30#0#213'g'#10#255#171
+ +'8'#138#31#0#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#130#24#0#130#24#0#221#152'Z'#255#191']'#186'M'#5#255#0#255'v'#12#0#242#134
+ +#20#252#160'4'#138#31#0#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#0'R'#143#0'6o'#9
+ +'o'#164'W9'#23#171'3'#0#233#171'n'#255#215#146#193'e%'#255#0#255'v'#12#0#242
+ +'w'#1#255#150#25#138#31#0#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255
+ +#255#255#255#255#255#255#255#128#0#0#0'R'#143#0'R'#143#0'R'#143#6#140#194'I'
+ +#221#255#0'v'#186#0'v'#186'YVE'#255#218#154#233#170'j'#145'%'#0#193'M'#0#255
+ +'~'#0#138#31#0#255#0#255#128#0#0#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#0'6p'#0'j'#161#2#199#255
+ +#9#202#255''''#212#255'N'#222#255'y'#233#255#0'v'#186#255#218#154#255#218#154
+ +#255#211#137#255#177'C'#255#138#7#138#31#0#255#0#255#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#0'9u'#4'v'#170'('#212#255#0
+ +#158#218#0'N'#138#22#163#212'R'#224#255#0'v'#186#196'f#'#203'g'#25#255#218
+ +#154#184':'#0#184':'#0#184':'#0#255#0#255#255#0#255#2't'#169'['#213#226'i'
+ +#246#254'E'#230#254'%'#215#254#13#199#254#26#204#254#0';v'#11#128#176#156#233
+ +#254'h'#230#255'#'#165#212#0'A~'#0'F'#129'0'#215#255'M'#215#254'%_p'#184':'#0
+ +#184':'#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#2't'#169'['#213
+ +#226#127#247#254'z'#238#254'}'#233#254#135#231#255#163#237#255#0';v'#3'{'#176
+ +#165#235#254#167#243#255'^'#193#226#0'L'#138#0'N'#138#19#204#255'-'#206#252
+ +#13'b'#145#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#2't'#169#160#233#239#170#238#246'p'#207#229'?'#177#211#29#149#192#17#131
+ +#177#15'{'#170#0'@z'#24#150#196#182#246#255'~'#212#238#3'g'#157#13#182#235#1
+ +#198#255#13'b'#145#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#3'p'#164'T'#177#202'('#156#188'&'#171#207#27#182#224
+ +#12#183#237#24#198#247':'#213#254#0'A~'#27#153#196#181#244#255#182#246#255
+ +#154#240#255'N'#222#255#13#202#255#13'b'#145#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#4'l'#158'?'#180#203'f'#242
+ +#251'E'#230#254'%'#215#254#13#199#254#26#204#254';'#215#255'`'#225#255#0'Ay'
+ +#0'E~;'#175#213#182#246#255#13'b'#145#13'b'#145#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#2's'#167'['#213
+ +#226'i'#246#254'E'#230#254'%'#215#254#13#199#254#26#204#254';'#215#255'`'#225
+ +#255'}'#229#252'Q'#199#233#0'A{'#0'E{'#1'z'#180#5'f'#149#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#128#128#128#128
+ +#128#128#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#255#128#128
+ +#128#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#0#0#0#128#128#128#255#255#255#128#0
+ +#0#128#0#0#128#0#0#192#220#192#128#0#0#192#220#192#128#0#0#192#220#192#128#0
+ +#0#192#220#192#128#0#0#128#0#0#192#220#192#255#255#255#128#0#0#255#255#255
+ +#128#0#0#255#255#255#192#220#192#128#0#0#255#255#255#0#0#0#128#128#128#255
+ +#255#255#128#0#0#192#220#192#128#0#0#192#220#192#128#0#0#192#220#192#128#0#0
+ +#192#220#192#128#0#0#192#220#192#128#0#0#192#220#192#128#0#0#255#255#255#128
+ +#0#0#255#255#255#128#0#0#255#255#255#128#0#0#192#220#192#255#255#255#0#0#0
+ +#128#128#128#255#255#255#128#0#0#192#220#192#128#0#0#192#220#192#128#0#0#192
+ +#220#192#128#0#0#192#220#192#128#0#0#192#220#192#128#0#0#255#255#255#128#0#0
+ +#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0#255#255#255#255#255
+ +#255#0#0#0#128#128#128#255#255#255#128#0#0#192#220#192#128#0#0#192#220#192
+ ,#128#0#0#128#0#0#128#0#0#255#255#255#255#255#255#255#255#255#128#0#0#192#220
+ +#192#128#0#0#255#255#255#128#0#0#255#255#255#128#0#0#255#255#255#128#0#0#192
+ +#220#192#255#255#255#0#0#0#128#128#128#255#255#255#128#0#0#255#255#255#128#0
+ +#0#255#255#255#255#255#255#255#255#255#254#254#254#255#255#255#128#0#0#255
+ +#255#255#128#0#0#128#0#0#192#220#192#255#255#255#192#220#192#128#0#0#192#220
+ +#192#255#255#255#192#220#192#128#0#0#255#255#255#0#0#0#128#128#128#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#254#254#254#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#0#0#0#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_Lazarus_Unux.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_Lazarus_Unux.lpk
new file mode 100644
index 0000000..3aebe6a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_Lazarus_Unux.lpk
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_Lazarus_Windows.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_Lazarus_Windows.lpk
new file mode 100644
index 0000000..48e702e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UniDACDriver_Lazarus_Windows.lpk
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UnidacDriver_Glyphs.RES b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UnidacDriver_Glyphs.RES
new file mode 100644
index 0000000..440c85c
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_UnidacDriver_Glyphs.RES differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.bdsproj
new file mode 100644
index 0000000..a1f034b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.bdsproj
@@ -0,0 +1,179 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {D5CF0E18-5430-44E4-8B68-4D54B5F3535D}
+
+
+
+
+ DataAbstract_ZeosDriver_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - Zeos Driver
+ False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.cfg
new file mode 100644
index 0000000..207b254
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.cfg
@@ -0,0 +1,49 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-O"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-I"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-R"..\..\Dcu\D10;..\..\..\RemObjects SDK for Delphi\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.dpk
new file mode 100644
index 0000000..fa6c962
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ZeosDriver_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Zeos Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ ZComponentDesign,
+ RemObjects_Core_D10,
+ DataAbstract_Core_D10;
+
+contains
+ uDAZeosDriver in 'uDAZeosDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D11.dpk
new file mode 100644
index 0000000..8483957
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D11.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ZeosDriver_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Zeos Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ ZComponentDesign,
+ RemObjects_Core_D11,
+ DataAbstract_Core_D11;
+
+contains
+ uDAZeosDriver in 'uDAZeosDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D11.dproj
new file mode 100644
index 0000000..5711217
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D11.dproj
@@ -0,0 +1,73 @@
+
+
+ {a14f79c2-acbc-46d8-a339-5d13e7ddad81}
+ DataAbstract_ZeosDriver_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ZeosDriver_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ ..\..\Dcu\D11;..\..\..\RemObjects SDK for Delphi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - Zeos Driver False False False True False 1 0 0 0 False False False False False 1033 1252 RemObjects Software 1.0.0.0 RemObjects Software RemObjects Software RemObjects Data Abstract 1.0.0.0 DataAbstract_ZeosDriver_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D11.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D12.dpk
new file mode 100644
index 0000000..7a4343f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D12.dpk
@@ -0,0 +1,38 @@
+package DataAbstract_ZeosDriver_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Zeos Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ ZComponentDesign,
+ DataAbstract_Core_D12;
+
+contains
+ uDAZeosDriver in 'uDAZeosDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D12.dproj
new file mode 100644
index 0000000..22b6b80
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D12.dproj
@@ -0,0 +1,97 @@
+
+
+ {a14f79c2-acbc-46d8-a339-5d13e7ddad81}
+ DataAbstract_ZeosDriver_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ZeosDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D12
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D12
+ error
+ ..\..\Dcu\D12
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_ZeosDriver_D12.bpl
+ true
+ RemObjects Data Abstract - Zeos Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_ZeosDriver_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D12.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D14.dpk
new file mode 100644
index 0000000..b93cc3e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D14.dpk
@@ -0,0 +1,38 @@
+package DataAbstract_ZeosDriver_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Zeos Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ ZComponentDesign,
+ DataAbstract_Core_D14;
+
+contains
+ uDAZeosDriver in 'uDAZeosDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D14.dproj
new file mode 100644
index 0000000..9ae3ad4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D14.dproj
@@ -0,0 +1,100 @@
+
+
+ {a14f79c2-acbc-46d8-a339-5d13e7ddad81}
+ DataAbstract_ZeosDriver_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_ZeosDriver_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ error
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ ..\..\Dcu\D14
+ error
+ error
+ error
+ error
+ error
+ ..\..\Dcu\D14
+ error
+ ..\..\Dcu\D14
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_ZeosDriver_D14.bpl
+ true
+ RemObjects Data Abstract - Zeos Driver
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 1.0.0.0
+
+ RemObjects Software
+ RemObjects Software
+
+ RemObjects Data Abstract
+ 1.0.0.0
+
+
+ DataAbstract_ZeosDriver_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D14.res
new file mode 100644
index 0000000..6ef0ba1
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.cfg
new file mode 100644
index 0000000..0aa2cb6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-O"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-I"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-R"..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.dof
new file mode 100644
index 0000000..1972ae0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.dof
@@ -0,0 +1,77 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitDeprecated=0
+UnitLibrary=0
+UnitPlatform=0
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - Zeos Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.dpk
new file mode 100644
index 0000000..95dba7c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ZeosDriver_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Zeos Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ ZComponentDesign,
+ RemObjects_Core_D6,
+ DataAbstract_Core_D6;
+
+contains
+ uDAZeosDriver in 'uDAZeosDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.cfg
new file mode 100644
index 0000000..a290ad9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.dof
new file mode 100644
index 0000000..cb208b6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.dof
@@ -0,0 +1,117 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=1
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - Zeos Driver
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software, Inc.
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=RemObjects Software, Inc.
+LegalTrademarks=RemObjects Software, Inc.
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=http://www.remobjects.com
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.dpk
new file mode 100644
index 0000000..9cac616
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.dpk
@@ -0,0 +1,39 @@
+package DataAbstract_ZeosDriver_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE ON}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - Zeos Driver'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl,
+ RemObjects_Core_D7,
+ DataAbstract_Core_D7,
+ ZComponentDesign;
+
+contains
+ uDAZeosDriver in 'uDAZeosDriver.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.res
new file mode 100644
index 0000000..b26b84e
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Glyphs.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Glyphs.lrs
new file mode 100644
index 0000000..a7f714d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Glyphs.lrs
@@ -0,0 +1,80 @@
+LazarusResources.Add('TDAZEOSDRIVER','BMP',[
+ 'BM'#248#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0#0#0#1#0#24#0#0#0#0#0
+ +#194#6#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255'@'#0#0'@'#0#0'@'#0#0
+ +'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0'@'#0#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#129#30#0'w'#23#0'w'#23#0#255#0#255#255#0
+ +#255#255#0#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0
+ +#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0'@'#0#0#255#0#255#255#0#255#129#30
+ +#0#129#30#0#129#30#0#252#154'*'#184':'#0#184':'#0#128'*'#3#255#0#255#128#0#0
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#128#0#0'@'#0#0#255#0
+ +#255#130#24#0#129#30#0#248'w'#0#255#129#0#255#149#19#255#170'4'#255#189'Z'
+ +#138#31#0#255#0#255#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255#255
+ +#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#5'f'#149#130#24#0'y'#16#0#255#158' '#252'w'#0#143#30#0#213'g'#10#255#171
+ +'8'#138#31#0#255#0#255#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0'@'#0
+ +#0#130#24#0#130#24#0#221#152'Z'#255#191']'#186'M'#5#255#0#255'v'#12#0#242#134
+ +#20#252#160'4'#138#31#0#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255
+ +#128#0#0#255#255#255#128#0#0#255#255#255#255#255#255#128#0#0#0'R'#143#0'6o'#9
+ +'o'#164'W9'#23#171'3'#0#233#171'n'#255#215#146#193'e%'#255#0#255'v'#12#0#242
+ +'w'#1#255#150#25#138#31#0#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#255#255
+ +#255#255#255#255#255#255#255#128#0#0#0'R'#143#0'R'#143#0'R'#143#6#140#194'I'
+ +#221#255#0'v'#186#0'v'#186'YVE'#255#218#154#233#170'j'#145'%'#0#193'M'#0#255
+ +'~'#0#138#31#0#255#0#255#128#0#0#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#0'6p'#0'j'#161#2#199#255
+ +#9#202#255''''#212#255'N'#222#255'y'#233#255#0'v'#186#255#218#154#255#218#154
+ +#255#211#137#255#177'C'#255#138#7#138#31#0#255#0#255#128#0#0#128#0#0#128#0#0
+ +#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#0'9u'#4'v'#170'('#212#255#0
+ +#158#218#0'N'#138#22#163#212'R'#224#255#0'v'#186#196'f#'#203'g'#25#255#218
+ +#154#184':'#0#184':'#0#184':'#0#255#0#255#255#0#255#2't'#169'['#213#226'i'
+ +#246#254'E'#230#254'%'#215#254#13#199#254#26#204#254#0';v'#11#128#176#156#233
+ +#254'h'#230#255'#'#165#212#0'A~'#0'F'#129'0'#215#255'M'#215#254'%_p'#184':'#0
+ +#184':'#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#2't'#169'['#213
+ +#226#127#247#254'z'#238#254'}'#233#254#135#231#255#163#237#255#0';v'#3'{'#176
+ +#165#235#254#167#243#255'^'#193#226#0'L'#138#0'N'#138#19#204#255'-'#206#252
+ +#13'b'#145#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#2't'#169#160#233#239#170#238#246'p'#207#229'?'#177#211#29#149#192#17#131
+ +#177#15'{'#170#0'@z'#24#150#196#182#246#255'~'#212#238#3'g'#157#13#182#235#1
+ +#198#255#13'b'#145#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#3'p'#164'T'#177#202'('#156#188'&'#171#207#27#182#224
+ +#12#183#237#24#198#247':'#213#254#0'A~'#27#153#196#181#244#255#182#246#255
+ +#154#240#255'N'#222#255#13#202#255#13'b'#145#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#4'l'#158'?'#180#203'f'#242
+ +#251'E'#230#254'%'#215#254#13#199#254#26#204#254';'#215#255'`'#225#255#0'Ay'
+ +#0'E~;'#175#213#182#246#255#13'b'#145#13'b'#145#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#2's'#167'['#213
+ +#226'i'#246#254'E'#230#254'%'#215#254#13#199#254#26#204#254';'#215#255'`'#225
+ +#255'}'#229#252'Q'#199#233#0'A{'#0'E{'#1'z'#180#5'f'#149#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#128#128#128#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#0#0#0#128#128#128#255#255#255#128#0#0#128#0
+ +#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0#128#0#0#128#0#0#128#0#0#255
+ +#255#255#192#220#192#128#0#0#128#0#0#192#220#192#255#255#255#128#0#0#128#0#0
+ +#128#0#0#192#220#192#255#255#255#0#0#0#128#128#128#255#255#255#192#220#192
+ +#128#0#0#192#220#192#255#255#255#255#255#255#255#255#255#128#0#0#192#220#192
+ +#255#255#255#255#255#255#255#255#255#128#0#0#192#220#192#192#220#192#128#0#0
+ +#255#255#255#255#255#255#255#255#255#192#220#192#128#0#0#255#255#255#0#0#0
+ +#128#128#128#255#255#255#255#255#255#192#220#192#128#0#0#192#220#192#255#255
+ +#255#255#255#255#128#0#0#128#0#0#128#0#0#192#220#192#255#255#255#128#0#0#255
+ +#255#255#255#255#255#128#0#0#255#255#255#192#220#192#128#0#0#128#0#0#192#220
+ +#192#255#255#255#0#0#0#128#128#128#255#255#255#255#255#255#255#255#255#192
+ ,#220#192#128#0#0#192#220#192#255#255#255#128#0#0#192#220#192#255#255#255#255
+ +#255#255#255#255#255#128#0#0#192#220#192#192#220#192#128#0#0#255#255#255#128
+ +#0#0#192#220#192#255#255#255#255#255#255#255#255#255#0#0#0#128#128#128#255
+ +#255#255#128#0#0#128#0#0#128#0#0#128#0#0#128#0#0#255#255#255#128#0#0#128#0#0
+ +#128#0#0#128#0#0#255#255#255#192#220#192#128#0#0#128#0#0#192#220#192#255#255
+ +#255#192#220#192#128#0#0#128#0#0#128#0#0#255#255#255#0#0#0#128#128#128#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#0#0#0#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128#128
+ +#128#128#128#128#128#128#0#0
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Glyphs.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Glyphs.res
new file mode 100644
index 0000000..92bfe89
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Lazarus_Mac.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Lazarus_Mac.lpk
new file mode 100644
index 0000000..091b32e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Lazarus_Mac.lpk
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Lazarus_Unix.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Lazarus_Unix.lpk
new file mode 100644
index 0000000..ca75cdb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Lazarus_Unix.lpk
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Lazarus_Windows.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Lazarus_Windows.lpk
new file mode 100644
index 0000000..4a5c1ef
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/DataAbstract_ZeosDriver_Lazarus_Windows.lpk
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/asgsqlite3.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/asgsqlite3.pas
new file mode 100644
index 0000000..edea777
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/asgsqlite3.pas
@@ -0,0 +1,5562 @@
+// To enable debugging remove the dot. Do NOT forget to re-insert before
+// deploying to production since this feature will slow down this component
+// significantly
+{.$DEFINE DEBUG_ENABLED } // Enables Debug information
+ {.$DEFINE DEBUG_VERY_LOUD}
+ {.$DEFINE DEBUG_LOUD}
+
+// Disable this for ignoring IProvider interface (for D4)
+{$DEFINE IPROVIDER}
+
+// enable this if you want to link the SQLite library statically. (No need for dll)
+{.$DEFINE SQLite_Static}
+
+{$I asqlite_def.inc}
+
+unit ASGSQLite3;
+{$HINTS OFF}
+{$WARNINGS OFF}
+{*_* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+
+Author: Albert Drent
+Description: SQLite 3 DataSet class (encapsulates the Delphi DataSet Class)
+ based upon the asqlite version for sqlite 2
+Target: Delphi 4, 5, 6 and 7; Delphi 2005; Borland C++ 5 and 6
+Creation: November 2003
+Version: 2006.03.D Stable
+EMail: a.drent@aducom.com (www.aducom.com/sqlite, sqlite.aducom.com)
+Support: support@aducom.com (supportforum on www.aducom.com)
+ Please post any questions, remarks etc. to the support forum. We
+ useually answer questions within days.
+ Unsollicited mail to support will be intercepted by our spamfilters
+ and probabely never be heard of.
+Legal issues: Copyright (C) 2003..2006 by Aducom Software
+
+ Aducom Software
+ Eckhartstr 61
+ 9746 BN Groningen
+ Netherlands
+
+ Open Source licence (BSD: http://www.opensource.org/licenses/bsd-license.php)
+
+ Copyright (c) 2006, Aducom Software
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ Neither the name of Aducom Software nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+Acknowledgement
+ These components were written for our own needs. Since SQLite is
+ a freeware component we like to donate this one to the community
+ too. Parts of the code is adapted from several sources, but mainly
+ from a sample and the vcl sources of Borland itself. And, of
+ course, we did a lot and still are...
+To Do
+ A lot...
+ We are very busy, but will develop on our needs. If anyone can
+ contribute, please feel welcome. Alter the source with lots of comment
+ and mail it to me. If it works right I will add it to the official
+ source and add your credit here below. Before you start, please
+ put a request on the forum. It would be a shame and a waste of your
+ time if you develop something which already is... and I need to set
+ the spamfilter right to let you pass through.
+History:
+ Nov 8, 2003 First alpha release 1.0.A Albert Drent (c) 2003 Aducom Software
+ Nov 11, Release alpha 1.0.B Albert Drent (c) 2003 Aducom Software
+ - added 'param' support
+ - fixed null pointer assignment
+ - added support for partial select (limit / offset)
+ Nov 12, Release alpha 1.0.C Albert Drent (c) 2003 Aducom Software
+ - fixed bug in update
+ - support for events
+ - added 'RowsAffected'
+ Nov 16, Release beta 1.0.D Albert Drent (c) 2003 Aducom Software
+ - fixed 0 resultlist after any ExecSQL usage
+ - added Transaction support
+ Nov 24, Release beta 1.0.E Albert Drent (c) 2003 Aducom Software
+ - StartTransaction will open database if it is'nt already open
+ - Changed resultset method
+ - Added property editor for table names
+ - Added GetTableNames function to TASQLite3Database
+ - Added GetIndexNames function to TASQLite3Database
+ - Added Open and Close function to TASQLite3Database
+ - Added AutoCommit property to TDataSet descendants
+ - Split of source in designtime and runtime package
+ Dec 15, Release beta 1.0.F Albert Drent (c) 2003 Aducom Software
+ - Optimized code for speed
+ - Added support for quering databases
+ - Added property for base directory (default dir) TDatabase
+ - Preparations for mastersets and TUpdateSQL (not functional yet)
+ - Solved GPF on stringfields
+ - Solved hangup of Delphi when developing
+ - Solved invalid pointer operation bug while developing
+ Jan 11 2004, Release beta 1.0.G Albert Drent (c) 2003, 2004 Aducom Software
+ - Fixed GetTableNames Bug as reported on forum
+ - Solved some minor bugs, several code optimizations
+ - Added 'getfieldnames' procedure to asqlitedb
+ - Added component asqlitepragma for adjustments to sqlite behaviour
+ - Added several property editors to smooth things up
+ - Added component asqliteupdatesql
+ - Added master-detail support for TASQLite3table (not fully tested yet)
+ - Added master-detail support for TASQLite3query (not fully tested yet)
+ - Added filter property to TASQLite3Query
+ Jan 18, 2004, Release beta 1.0.H Albert Drent (c) 2003, 2004 Aducom Software
+ - Added TASQLite3Log component
+ - Support for autoincrement (index primary key)
+ Jan 22, 2004, Release beta 1.0.I Albert Drent (c) 2003, 2004 Aducom Software
+ - Solved bug, causing the user to open database first (where
+ it should be opened automatically after open query or table.
+ - datatype text is now treated as a string of max 255 chars.
+ - added samples
+ - added preparations for import and export component
+ Jan 26, 2004, Release beta 1.1.A Albert Drent (c) 2003, 2004 Aducom Software
+ - Support for master-detail
+ - Support for TUpdateSQL
+ Feb 05, 2004, Release beta 1.1.B Albert Drent (c) 2003, 2004 Aducom Software
+ - Solved small bug: basequery is closed on querychanged event
+ - Solved small bug: basequery is closed on filter change event
+ - Solved bug in design package, by Marc Wetzel(forum)
+ - Notification of BaseQuery removed and added to SQLiteTable
+ Feb 24, 2004 Release alpha 1.2.A Albert Drent (c) 2003, 2004 Aducom Software
+ - Locate implemented, working on resultset!
+ - Some small bugfixes
+ Feb 25, 2004 Release alpha 1.2.B Albert Drent (c) 2003, 2004 Aducom Software
+ - Reformat of source (Marc Wetzel)
+ - All the debug directives (Marc Wetzel)
+ The debug stuff is added to be able to do more debugging on the
+ components. At this stage there are still some isues which are
+ hard to be find.
+ - Some small bugfixes (Marc Wetzel)
+ - Solved bug with dblookupcombobox, lookup is now shown (variant error)
+ - Derived more classes from TDataset to solve compatibility isues with
+ 3rd party software (DevExpress)
+ - Start of port to lower Delphi versions (designintf vs dsgnintf)
+ March 25, 2004 Release alpha 1.2.C Albert Drent (c) 2003, 2004 Aducom Software
+ - Added property editor for database directory
+ - Added property editor for sqlitedll directory
+ - Bugix needed for release 13 of SQLite.dll (is compatible to lower
+ dll versions)
+ - More changes to solve compatibility problem with DevExpress (Plato of DevExpress)
+ - Solved some compatibility isues with TDataSet
+ - Solved some compatibility isues with the newest SQLite version (2.8.12)
+ - Added/modified, GetFieldNames, GetPrimaryKeys
+ - Added GetTableInfo
+ - Added StartTransaction and Commit and RollBack to TTable and TQuery
+ This will create a more readable source:
+ db.starttranaction;
+ q.somesql
+ db.commit
+ becomes now
+ with q do begin
+ starttransaction;
+ somesql;
+ try
+ commit;
+ except
+ rollback;
+ end;
+ end;
+ - Changed cleanup of components in notification (TheSneak)
+ - Fixed potential AV (so far not reported)
+ - Changed escape of string characters (TheSneak)
+ (might cause incompatibility of older components if you use single
+ quote in data)
+ - Fixed question mark problem in data (TheSneak)
+ April 7, 2004
+ - Fixed bug GetxxxxNames, moved pragma (reported by Martini)
+ - Improved some performance isues (TheSneak)
+ - Added GetTableIndexNames(by Martini)
+ - Added support for 'small text blobs', it isn't the real stuff but
+ limited to 20000 characters.
+ - Fixed another compatibility isue with DevExpress
+ April 8, 2004
+ - Fixed EnableControls (TheSneak)
+ - Fixed memoryleak ASQLiteQuery.InternalPost (TheSneak)
+ - Downgraded some stuff for support Delphi 4/5
+ - Updated Locate function (by Joel hottcha@juno.com)
+ April 14, 2004 Release beta 1.2.C Albert Drent (c) 2003, 2004 Aducom Software
+ - RawSQL property implemented (supresses parsing of sql data)
+ - published csv release as 1.2.C beta
+ April 15, 2004 Release alpha 2.0.A Albert Drent (c) 2003, 2004 Aducom Software
+ - support for real clobs
+ - added fieldtype numeric(x.y)
+ - Implement RawSQL property in TASQLite3Query
+ May 26, 2004 Release beta 2.0.B Albert Drent (c) 2003, 2004 Aducom Software
+ - new procedure: GetGetLastInsertRow
+ - new component: TASQLite3InlineSQL, to be used to contain all
+ kinds of pre-stored sql statements. I.e. for creation of tables in case
+ of an in-memory database, or a local storage for sql statements to
+ simplify sourcecode. In this release it is bound to the ASQLiteDB component.
+ - new component TASQLite3Output, to be used to generate csv files,
+ xml and html documents. It is NOT bound to ASQLite components but
+ to a datasource (containing any database connection)
+ - implemented bound as described by minhl on the forum
+ - implemented IsNull as described by Kazooie64 on the forum
+ - implemented a uniform datetime implementation by jpierce
+ May, 26, 2004 Release beta 2.0.B Albert Drent (c) 2003, 2004 Aducom Software
+ - A few bugfixes
+ June, 15, 2004 Release beta 2.0.C Albert Drent (c) 2003, 2004 Aducom Software
+ - A few bugfixes, thanks to Tzvetan
+ July 2004, Release 1.0 based upon source sqlite version 2 components
+ Okt 11, 2004 Release beta 1.0.B Albert Drent (c) 2003, 2004 Aducom Software
+ - Callback routine for retieving data replaced by new
+ by sqlite prefered way.
+ - Some bugfixes
+ - Support for calculated fields
+ - Support for real blobs
+ okt 14, 2004 Release beta 1.0.C Albert Drent (c) 2003, 2004 Aducom Software
+ - support for locate lo-partial key (thanks to Bob Mitchel)
+ - some bugfixes (thanks to Oleg Lembievskiy marked by OL)
+ - some other bugfixes and code cleanup
+ okt 18, 2004
+ - re-introduced sqlite_version
+ - added transactiontype property(SQLite3 feature)
+ - added transaction procedures to db and basequery
+ StartDeferredTransaction;
+ StartImmediateTransaction;
+ StartExclusiveTransaction;
+ nov 1, 2004
+ - bugfix (thanx to James) for null pointer assignment on null values
+ nov 8, 2004
+ - fixed introduced bug in result preventing new records to appear
+ right in dbgrids.
+ nov 17, 2004
+ - fixed small bug showing rubish on empty tables
+ Nov 17, 2004 by Mike Dijkema
+ - filter bug FPrepared := FPrepared + ' and ' + Filter adds ' and filterexpr' to the end of the sql statement
+ this created errors with 'order by' 'limit' 'union' 'having' etc..
+ filtering changed to that it works like the ADO components and union and other statements
+ now 'select a from b union select c from d' and 'select a from b order by c' works with a filter
+ - filter bug 'select a_where from b' removed
+ jan 11, 2005 Release 2005.01.A Albert Drent (c) 2003 .. 2005 Aducom Software
+ - fixed bug causing fielddescription to be deleted incorrectly
+ - fixed bug causing errormessage on null values in integer fields
+ - added sqlcursor property
+ - modifications to support Delphi 2005
+ - implemented all transactiontypes
+ - changed all showmessages to raise event types
+ - added readonly property
+ feb 21, 2005 Release 2005.02.A Albert Drent (c) 2003 .. 2005 Aducom Software
+ - some bugfixes, code optimization
+ - first implementation of IProvider support (thanks to
+ Rocco Barbaresco)
+ - changed default SDB extension to SQB
+ - support for multi sql statements in one string
+ - added master-detail functionality on insert of
+ new child record (key-data is copied)
+ - added compatibility with SQLite3.dll version 3.1.2
+ feb 28, 2005 Release 2005.02.B Albert Drent (c) 2003 .. 2005 Aducom Software
+ - bugfix for filter on master-detail. Setting filtered will
+ not automatical open table any more. Causes error on closed
+ tables in master-detail otherwise.
+ mar 7, 2005 Release 2005.03.A Albert Drent (c) 2003 .. 2005 Aducom Software
+ - bugfix for memofields causing crlf to be handled wrongly
+ - added TableExists function ('// DI Ralf http://www.yunqa.de/delphi/)
+ - some code optimizations ('// DI Ralf http://www.yunqa.de/delphi/)
+ - solved decimalpoint bug ('// DI Ralf http://www.yunqa.de/delphi/)
+ mar 10, 2005 Release 2005.03.B Albert Drent (c) 2003 .. 2005 Aducom Software
+ - more code optimizations
+ - removed Forms from uses list to decrease codesize of console app's
+ - changed cursorstyle handling
+ - changed exception handling
+ mar 29, 2005 Release 2005.03.C Albert Drent (c) 2003 .. 2005 Aducom Software
+ - removed default pragma's for tables
+ - implemented another solution for tableheader duplicates (mirko)
+ - implemented user version
+ - solved minor bug in GetTableInfo
+ april 5, 2005 Release 2005.04.A Albert Drent (c) 2003 .. 2005 Aducom Software
+ - fixed bug conceirning in-memory database (Bert Verhees)
+ - fixed precompiler settings for Delhpi 7 (Dak)
+ mai 31, 2005 Release 2005.05.A Albert Drent (c) 2003 .. 2005 Aducom Software
+ - UTF8 support (thanks to Bilgehan KUYUCU)
+ - Statical linking (thanks to Gianpaolo Avallone (GPA)
+ - Some bugfixes and enhancements by Albert, Gianpaolo and others.
+ august 1, 2005 Release 2005.08.A
+ - UTF8 support to be set by property, solving a 'locale' problem.
+ - Bugfix for null strings
+ - Fix for static linking
+ - Solved bug in updatesql, fieldlist is now setup correctly
+ - solved bug in updatesql, inserting null values and constants.
+ august 2, 2005 Release 2005.08.B
+ - first steps towards support utf16 (by Kevin Zhang)
+ - implemented another locate routine (by jbannon)
+ - changed treatment of datatype text. It is considered 'longtext' now.
+ added 'shorttext' datatype which replaces the original 'text' datatype.
+ The datatype text is now compatible with sqlite3, mysql and perhaps
+ others.
+ sept 1, 2005 Release 2005.09.A
+ - code optimizations by Kevin Lu, Aducom
+ sept 1, 2005 Release 2005.09.B
+ - candidate fix for decimal point problem by Jordi March
+ sept 20, 2005 Release 2005.09.C
+ - implementation of unidirectional dataset. This improves
+ performance on large resultsets to the optimum. However
+ the dataset is readonly by default, using inserts/deletes and
+ updates will result in a 'database table is locked' error.
+ sept 21, 2005 Release 2005.09.D
+ - bugfix for decimal point routine by Kevin Lu
+ sept 29, 2005 Release 2005.09.E
+ - bugfix for unidirectional dataset.
+ - bugfix for split of prepare and execute. Data was not updated
+ correctly
+ nov 1, 2005 Release 2005.11.A
+ - Code improvements
+ - First (alpha) implementation of Lookup field (By John Lito)
+ dec 14, 2005 Release 2005.12.A
+ - Check for null values
+ jan 5, 2006 Release 2006.01.A
+ - fixed unidirectional bug (I)
+ jan 9, 2006 Release 2006.01.B
+ - fixed unidirectional bug (II)
+ - automatically will close table if tablename property is changed
+ while a table is still open.
+ - automatically close query if sql property is changed while a table
+ is still open.
+ - fixes for compilation under D4
+ - changes for installation under Delphi 2005 and 2006
+ - changes of copyright notice, the components are now under
+ open-source bsd licence.
+ feb 22, 2006 Release 2006.02.A
+ - Changed status to stable
+ mar 2, 2006 Release 2006.03.A
+ - Modifications for D4/D5
+ - Added order by property. Enter fieldnames separated by ','
+ - Added GetIndexFieldNames (thanks to zavu10n)
+ - Database will be reopened if necessary on filter change
+ - Fixes by Donnie
+ - New routine for dates and floates by Donnie
+ mar 8, 2006 Release 2006.03.B
+ - Fixed small bug causing text treated as char 255, is now memo.
+ mar 15, 2006 Release 2006.03.C
+ - Added switch for compilation under D4/D5 (Art Register)
+ - DBOpen change for utf8 by John Lito
+ - SQLCursor fix
+ - GetFieldValue fix by Velis
+ mar 23, 2006 Release 2006.03.D
+ - Compatibility fixes for D45 (Art Register)
+ - changed D45 directive to $IFDEF ASQLITE_D6PLUS so
+ compilation should work automatically now
+ - changed cr cr/lf pairs for compatibilty with D4/D5
+ - added CompareBookmarks to support multiple selection
+ in DBGrid (Michael S)
+ - added support for char *nothing* datatype (was char(1) now char is allowed)
+
+
+
+*_* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
+
+
+interface
+
+uses
+ DB,
+ DBCommon,
+ Dialogs,
+ Classes,
+ Windows,
+ SysUtils,
+{$IFDEF ASQLITE_D6PLUS}
+ Variants,
+{$ENDIF}
+ ASGRout3;
+const
+ SQLiteVersion = 'ASGSQLite V2006.03.D stable';
+
+ MaxBuf = 30000; // max stringbuffer for record (length) (excluding blob's)
+ SQLITE_OK = 0; // Successful result */
+ SQLITE_ERROR = 1; // SQL error or missing database */
+ SQLITE_INTERNAL = 2; // An internal logic error in SQLite */
+ SQLITE_PERM = 3; // Access permission denied */
+ SQLITE_ABORT = 4; // Callback routine requested an abort */
+ SQLITE_BUSY = 5; // The database file is locked */
+ SQLITE_LOCKED = 6; // A table in the database is locked */
+ SQLITE_NOMEM = 7; // A malloc() failed */
+ SQLITE_READONLY = 8; // Attempt to write a readonly database */
+ SQLITE_INTERRUPT = 9; // Operation terminated by sqlite_interrupt() */
+ SQLITE_IOERR = 10; // Some kind of disk I/O error occurred */
+ SQLITE_CORRUPT = 11; // The database disk image is malformed */
+ SQLITE_NOTFOUND = 12; // (Internal Only) Table or record not found */
+ SQLITE_FULL = 13; // Insertion failed because database is full */
+ SQLITE_CANTOPEN = 14; // Unable to open the database file */
+ SQLITE_PROTOCOL = 15; // Database lock protocol error */
+ SQLITE_EMPTY = 16; // (Internal Only) Database table is empty */
+ SQLITE_SCHEMA = 17; // The database schema changed */
+ SQLITE_TOOBIG = 18; // Too much data for one row of a table */
+ SQLITE_CONSTRAINT = 19; // Abort due to contraint violation */
+ SQLITE_MISMATCH = 20; // Data type mismatch */
+ SQLITE_MISUSE = 21; // Library used incorrectly */
+ SQLITE_NOLFS = 22; // Uses OS features not supported on host */
+ SQLITE_AUTH = 23; // Authorization denied */
+ SQLITE_ROW = 100; // sqlite_step() has another row ready */
+ SQLITE_DONE = 101; // sqlite_step() has finished executing */
+
+ SQLITE_CREATE_INDEX = 1; // Index Name Table Name */
+ SQLITE_CREATE_TABLE = 2; // Table Name NULL */
+ SQLITE_CREATE_TEMP_INDEX = 3; // Index Name Table Name */
+ SQLITE_CREATE_TEMP_TABLE = 4; // Table Name NULL */
+ SQLITE_CREATE_TEMP_TRIGGER = 5; // Trigger Name Table Name */
+ SQLITE_CREATE_TEMP_VIEW = 6; // View Name NULL */
+ SQLITE_CREATE_TRIGGER = 7; // Trigger Name Table Name */
+ SQLITE_CREATE_VIEW = 8; // View Name NULL */
+ SQLITE_DELETE = 9; // Table Name NULL */
+ SQLITE_DROP_INDEX = 10; // Index Name Table Name */
+ SQLITE_DROP_TABLE = 11; // Table Name NULL */
+ SQLITE_DROP_TEMP_INDEX = 12; // Index Name Table Name */
+ SQLITE_DROP_TEMP_TABLE = 13; // Table Name NULL */
+ SQLITE_DROP_TEMP_TRIGGER = 14; // Trigger Name Table Name */
+ SQLITE_DROP_TEMP_VIEW = 15; // View Name NULL */
+ SQLITE_DROP_TRIGGER = 16; // Trigger Name Table Name */
+ SQLITE_DROP_VIEW = 17; // View Name NULL */
+ SQLITE_INSERT = 18; // Table Name NULL */
+ SQLITE_PRAGMA = 19; // Pragma Name 1st arg or NULL */
+ SQLITE_READ = 20; // Table Name Column Name */
+ SQLITE_SELECT = 21; // NULL NULL */
+ SQLITE_TRANSACTION = 22; // NULL NULL */
+ SQLITE_UPDATE = 23; // Table Name Column Name */
+ SQLITE_ATTACH = 24; // Filename NULL */
+ SQLITE_DETACH = 25; // Database Name NULL */
+
+ SQLITE_DENY = 1; // Abort the SQL statement with an error */
+ SQLITE_IGNORE = 2; // Don't allow access, but don't generate an error */
+
+ Crlf : string = #13#10;
+ Q = '''';
+
+type
+ pInteger = ^integer;
+ pPointer = ^Pointer;
+ pSmallInt = ^smallint;
+ pFloat = ^extended;
+ pBoolean = ^boolean;
+
+
+ TConvertBuffer = array[1..255] of char;
+
+ TSQLite3_Callback = function(UserData: Pointer; ColumnCount: Integer; ColumnValues, ColumnNames: PPointer): Integer; cdecl;
+// TSQLiteExecCallback = function(Sender: TObject; Columns: integer; ColumnValues: Pointer; ColumnNames: Pointer): integer of object; cdecl;
+ TSQLiteBusyCallback = function(Sender: TObject; ObjectName: PAnsiChar; BusyCount: integer): integer of object; cdecl;
+ TOnData = procedure(Sender: TObject; Columns: integer; ColumnNames, ColumnValues: string) of object;
+ TOnBusy = procedure(Sender: TObject; ObjectName: string; BusyCount: integer; var Cancel: boolean) of object;
+ TOnQueryComplete = procedure(Sender: TObject) of object;
+ TASQLite3NotifyEvent = procedure(Sender: TObject) of object;
+
+ // structure for holding field information. It is used by GetTableInfo
+
+ TASQLite3Field = class
+ public
+ FieldNumber: integer;
+ FieldName: string;
+ FieldType: string;
+ FieldNN: integer; // 1 if notnull
+ FieldDefault: string;
+ FieldPK: integer; // 1 if primary key
+ end;
+
+ // object to 'play' with SQLite's default settings
+
+ TASQLite3Pragma = class(TComponent)
+ private
+ FTempCacheSize: integer;
+ FDefaultCacheSize: integer;
+ FDefaultSynchronous: string;
+ FDefaultTempStore: string;
+ FTempStore: string;
+ FSynchronous: string;
+ protected
+ function GetTempCacheSize: string;
+ function GetDefaultCacheSize: string;
+ function GetDefaultSynchronous: string;
+ function GetDefaultTempStore: string;
+ function GetTempStore: string;
+ function GetSynchronous: string;
+ published
+ { Published declarations }
+ property TempCacheSize: integer read FTempCacheSize write FTempCacheSize;
+ property DefaultCacheSize: integer read FDefaultCacheSize write FDefaultCacheSize;
+ property DefaultSynchronous: string read FDefaultSynchronous
+ write FDefaultSynchronous;
+ property DefaultTempStore: string read FDefaultTempStore write FDefaultTempStore;
+ property TempStore: string read FTempStore write FTempStore;
+ property Synchronous: string read FSynchronous write FSynchronous;
+ end;
+
+ // component to log messages
+ // it's for debugging purpose and may be obsolete due
+ // to the event implementation. not sure yet...
+
+ TASQLite3Log = class(TComponent)
+ private
+ FLogFile: string;
+ FLogDebugOut: boolean;
+ FAppend: boolean;
+ FLogSQL: boolean;
+ FLogInt: boolean;
+ protected
+ public
+ procedure Display(Msg: string);
+ published
+ { Published declarations }
+ property LogFile: string read FLogFile write FLogFile;
+ property LogDebugOut: boolean read FLogDebugOut write FLogDebugOut; // 20040225
+ property Append: boolean read FAppend write FAppend;
+ property LogSQL: boolean read FLogSQL write FLogSQL;
+ property LogInternals: boolean read FLogInt write FLogInt;
+ end;
+
+// This component can be used to store sql outside the pascal source.
+// It is useful for automatically creating tables on open of a temporary database
+// (i.e. in-memory database)
+
+ TASQLite3InlineSQL = class(TComponent)
+ private
+ FSQL: TStrings;
+ procedure SetSQL(const Value: TStrings);
+ function GetSQL: TStrings;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ published
+ property SQL: TStrings read GetSQL write SetSQL;
+ end;
+
+ { Basic Database component }
+
+ TASQLite3DB = class(TComponent)
+ private
+ { Private declarations }
+ FAfterConnect: TASQLite3NotifyEvent;
+ FBeforeConnect: TASQLite3NotifyEvent;
+ FAfterDisconnect: TASQLite3NotifyEvent;
+ FBeforeDisconnect: TASQLite3NotifyEvent;
+ function FGetDefaultExt: string;
+ function FGetDriverDLL: string;
+ protected
+ { Protected declarations }
+ FInlineSQL: TASQLite3InlineSQL;
+ FExecuteInlineSQL: boolean;
+ FDatabase: string;
+ FTransactionType: string;
+ FSQLiteVersion: string;
+ FDefaultExt: string;
+ FDefaultDir: string;
+ FDriverDll: string;
+ FConnected: boolean;
+ FMustExist: boolean;
+ FVersion: string;
+ FCharEnc: string;
+ FUtf8: boolean;
+ DBHandle: Pointer;
+ FASQLitePragma: TASQLite3Pragma;
+ FASQLiteLog: TASQLite3Log;
+ FLastError: string;
+ SQLite3_Open: function(dbname: PAnsiChar; var db: pointer): integer; cdecl;
+ SQLite3_Close: function(db: pointer): integer; cdecl;
+ SQLite3_Exec: function(DB: Pointer; SQLStatement: PAnsiChar; Callback: TSQLite3_Callback;
+ UserDate: Pointer; var ErrMsg: PAnsiChar): Integer; cdecl;
+ SQLite3_LibVersion: function(): PAnsiChar; cdecl;
+ SQLite3_ErrorString: function(db: pointer): PAnsiChar; cdecl;
+ SQLite3_GetTable: function(db: Pointer; SQLStatement: PAnsiChar; var ResultPtr: Pointer;
+ var RowCount: cardinal; var ColCount: cardinal; var ErrMsg: PAnsiChar): integer; cdecl;
+ SQLite3_FreeTable: procedure(Table: PAnsiChar); cdecl;
+ SQLite3_FreeMem: procedure(P: PAnsiChar); cdecl;
+ SQLite3_Complete: function(P: PAnsiChar): boolean; cdecl;
+ SQLite3_LastInsertRow: function(db: Pointer): integer; cdecl;
+ SQLite3_Cancel: procedure(db: Pointer); cdecl;
+ SQLite3_BusyHandler: procedure(db: Pointer; CallbackPtr: Pointer; Sender: TObject); cdecl;
+ SQLite3_BusyTimeout: procedure(db: Pointer; TimeOut: integer); cdecl;
+ SQLite3_Changes: function(db: Pointer): integer; cdecl;
+ SQLite3_Prepare: function(db: Pointer; SQLStatement: PAnsiChar; nBytes: integer;
+ var hstatement: pointer; var Tail: PAnsiChar): integer; cdecl;
+ SQLite3_Finalize: function(hstatement: pointer): integer; cdecl;
+ SQLite3_Reset: function(hstatement: pointer): integer; cdecl;
+ SQLite3_Step: function(hstatement: pointer): integer; cdecl;
+ SQLite3_Column_blob: function(hstatement: pointer; iCol: integer): pointer; cdecl;
+ SQLite3_Column_bytes: function(hstatement: pointer; iCol: integer): integer; cdecl;
+ SQLite3_Column_count: function(hstatement: pointer): integer; cdecl;
+ SQLite3_Column_decltype: function(hstatement: pointer; iCol: integer): PAnsiChar; cdecl;
+ SQLite3_Column_double: function(hstatement: pointer; iCol: integer): double; cdecl;
+ SQLite3_Column_int: function(hstatement: pointer; iCol: integer): integer; cdecl;
+ SQLite3_Column_int64: function(hstatement: pointer; iCol: integer): int64; cdecl;
+ SQLite3_Column_name: function(hstatement: pointer; iCol: integer): PAnsiChar; cdecl;
+ SQLite3_Column_text: function(hstatement: pointer; iCol: integer): PAnsiChar; cdecl;
+ SQLite3_Column_text16: function(hstatement: pointer; iCol: integer): PWideChar; cdecl;
+ SQLite3_Column_type: function(hstatement: pointer; iCol: integer): integer; cdecl;
+ SQLite3_Bind_Blob: function(hstatement: pointer; iCol: integer; buf: PAnsiChar; n: integer; DestroyPtr: Pointer): integer; cdecl;
+ SQLite3_Bind_Text16: function(hstatement: pointer; iCol: integer; buf: pointer; n: integer; DestroyPtr: Pointer): integer; cdecl;//\\\
+ SQLite3_Bind_Parameter_Count: function(hstatement: pointer): integer; cdecl;//\\\
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure DBConnect(Connected: boolean);
+ function SQLite3_PrepareResult(DB: Pointer; TheStatement: string; FParams: TParams; Sender: TObject) : pointer;
+ function SQLite3_GetNextResult(DB: Pointer; TheStatement: pointer; FParams: TParams; Sender: TObject) : pointer;
+ procedure SQLite3_CloseResult(TheStatement : pointer);
+ public
+ DLLHandle: THandle;
+ { Public declarations }
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ function LoadLibs: boolean;
+ procedure FSetDatabase(Database: string);
+ function RowsAffected: integer;
+ function TableExists(const ATableName: AnsiString): Boolean;
+ procedure ExecStartTransaction(TransType: string);
+ procedure StartTransaction;
+ procedure StartDeferredTransaction;
+ procedure StartImmediateTransaction;
+ procedure StartExclusiveTransaction;
+ procedure Open;
+ procedure Close;
+ procedure Commit;
+ procedure RollBack;
+ procedure ShowDatabases(List: TStrings);
+ procedure GetTableNames(List: TStrings; SystemTables: boolean = false);
+ procedure GetTableInfo(TableName: string; List: TList);
+ procedure GetIndexNames(List: TStrings; SystemTables: boolean = false);
+ procedure GetIndexFieldNames(IndexName: string; List: TStrings);
+ procedure GetFieldNames(TableName: string; List: TStrings);
+ procedure GetPrimaryKeys(TableName: string; List: TStrings);
+ procedure GetTableIndexNames(TableName: string; List: TStrings);
+ procedure ExecPragma;
+// function SQLite_XExec(db: Pointer; SQLStatement: PAnsiChar;
+// CallbackPtr: Pointer; Sender: TObject; var ErrMsg: PAnsiChar): integer; cdecl;
+ function SQLite3_Execute(db: Pointer; TheStatement: string; FParams: TParams; Sender: TObject): integer;
+ function SQLite3_ExecSQL(TheStatement: string; Blobs: TList=nil): integer;
+ procedure ShowError;
+ function GetUserVersion(database : string=''): integer;
+ procedure SetUserVersion(Version : integer; Database : string='');
+ published
+ { Published declarations }
+ property CharacterEncoding: string read FCharEnc write FCharEnc;
+ property TransactionType: string read FTransactionType write FTransactionType;
+ property Database: string read FDatabase write FSetDatabase;
+ property ASQLitePragma: TASQLite3Pragma read FASQLitePragma write FASQLitePragma;
+ property ASQLiteLog: TASQLite3Log read FASQLiteLog write FASQLiteLog;
+ property DefaultExt: string read FGetDefaultExt write FDefaultExt;
+ property DefaultDir: string read FDefaultDir write FDefaultDir;
+ property Version: string read FVersion write FVersion;
+// property CharacterEncoding: string Read FCharEncoding Write FCharEncoding;
+ property DriverDLL: string read FGetDriverDLL write FDriverDLL;
+ property Connected: boolean read FConnected write DBConnect;
+ property MustExist: boolean read FMustExist write FMustExist;
+ property ASQLiteInlineSQL: TASQLite3InlineSQL read FInlineSQL write FInlineSQL;
+ property ExecuteInlineSQL: boolean read FExecuteInlineSQL write FExecuteInlineSQL;
+ property AfterConnect: TASQLite3NotifyEvent read FAfterConnect write FAfterConnect;
+ property BeforeConnect: TASQLite3NotifyEvent read FBeforeConnect write FBeforeConnect;
+ property AfterDisconnect: TASQLite3NotifyEvent
+ read FAfterDisconnect write FAfterDisconnect;
+ property BeforeDisconnect: TASQLite3NotifyEvent
+ read FBeforeDisconnect write FBeforeDisconnect;
+ end;
+
+ AsgError = class(Exception);
+
+{ TRecInfo }
+
+{ This structure is used to access additional information stored in
+ each record buffer which follows the actual record data.
+
+ Buffer: PAnsiChar;
+ ||
+ \/
+ --------------------------------------------
+ | Record Data | Bookmark | Bookmark Flag |
+ --------------------------------------------
+ ^-- PRecInfo = Buffer + FRecInfoOfs
+
+ Keep in mind that this is just an example of how the record buffer
+ can be used to store additional information besides the actual record
+ data. There is no requirement that TDataSet implementations do it this
+ way.
+
+ For the purposes of this demo, the bookmark format used is just an integer
+ value. For an actual implementation the bookmark would most likely be
+ a native bookmark type (as with BDE), or a fabricated bookmark for
+ data providers which do not natively support bookmarks (this might be
+ a variant array of key values for instance).
+
+ The BookmarkFlag is used to determine if the record buffer contains a
+ valid bookmark and has special values for when the dataset is positioned
+ on the "cracks" at BOF and EOF. }
+
+ PRecInfo = ^TRecInfo;
+
+ TRecInfo = packed record
+ Bookmark : integer;
+ BookmarkFlag : TBookmarkFlag;
+// Nulls :
+ end;
+
+ //============================================================================== TFResult
+ // The TFResult class is used to maintain the resultlist in memory. This
+ // will only be the case for 'normal' data. Blobs and Clobs will be treated
+ // differently, but they are not supported yet.
+ //==============================================================================
+ TASQLite3BaseQuery = class;
+
+ TFResult = class
+ protected
+ Data: TList;
+ BookMark: TList;
+ RowId: TList;
+ FLastBookmark: integer;
+ FBufSize: integer;
+ FDataSet: TASQLite3BaseQuery;
+ public
+ constructor Create(TheDataSet: TASQLite3BaseQuery);
+ destructor Destroy; override;
+ procedure FreeBlobs;
+ procedure SetBufSize(TheSize: integer);
+ procedure Add(TheBuffer: PAnsiChar; TheRowId: integer);
+ procedure Insert(Index: integer; TheBuffer: Pointer; TheRowId: integer);
+ procedure Delete(Index: integer);
+ function GetData(Index: integer): Pointer;
+ function Count: integer;
+ function IndexOf(TheBookMark: pointer): integer;
+ function GetBookmark(Index: integer): integer;
+ function GetRowId(Index: integer): integer;
+ end;
+
+//============================================================================== TASQLite3UpdateSQL
+ TASQLite3UpdateSQL = class(TComponent)
+ private
+ FInsertSQL: TStrings;
+ FUpdateSQL: TStrings;
+ FDeleteSQL: TStrings;
+ procedure SetInsertSQL(const Value: TStrings);
+ procedure SetUpdateSQL(const Value: TStrings);
+ procedure SetDeleteSQL(const Value: TStrings);
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ published
+ property InsertSQL: TStrings read FInsertSQL write SetInsertSQL;
+ property UpdateSQL: TStrings read FUpdateSQL write SetUpdateSQL;
+ property DeleteSQL: TStrings read FDeleteSQL write SetDeleteSQL;
+ end;
+
+//============================================================================== TASQLite3Output
+
+ TASQLite3Output = class(TComponent)
+ private
+ FActive: boolean;
+ FOutputType: string;
+ FTableClass: string;
+ FHeaderClass: string;
+ FCellClass: string;
+ FOutput: TStrings;
+ FSeparator: string;
+ FDataSource: TDataSource;
+ procedure SetOutput(const Value: TStrings);
+ procedure SetFActive(Active: boolean);
+ function GetOutput: TStrings;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Execute(MyDataSet: TDataSet);
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ published
+ property Active: boolean read FActive write SetFActive;
+ property DataSource: TDataSource read FDataSource write FDataSource;
+ property OutputType: string read FOutputType write FOutputType;
+ property TableClass: string read FTableClass write FTableClass;
+ property HeaderClass: string read FHeaderClass write FHeaderClass;
+ property CellClass: string read FCellClass write FCellClass;
+ property Output: TStrings read GetOutput write SetOutput;
+ property FieldSeparator: string read FSeparator write FSeparator;
+ end;
+
+//============================================================================== TASQLite3BaseQuery
+ TASQLite3BaseQuery = class(TDataSet)
+ private
+ FParams: TParams;
+ FTypeLess: boolean;
+ FNoResults: boolean; // suppresses the creation of a result list
+ FAutoCommit: boolean;
+ FTransactionType: string;
+ FTableDateFormat: string;
+ FSQLiteDateFormat: boolean;
+ FResult: TFResult;
+ FSQL: TStrings;
+ FSQLCursor: boolean;
+ FPrepared: string;
+ FRecBufSize: integer;
+ FRecInfoOfs: integer;
+ FCurRec: integer;
+ FMasterFields: string;
+ FMasterSource: TDataSource;
+ FSaveChanges: boolean;
+ MaxStrLen: integer;
+ FConnection: TASQLite3DB;
+ FReadOnly: boolean;
+ FMaxResults: integer;
+ FStartResult: integer;
+ FUniDir : boolean;
+ FStatement : pointer;
+ CurrentRowId: integer;
+ SQLStr: string;
+ ResultStr: PAnsiChar;
+ RowId : integer;
+ RowIdCol : integer;
+ DetailList: TList;
+ procedure SetSQL(const Value: TStrings);
+ function UnpackBuffer(Buffer: PAnsiChar; FieldType: TFieldType): TConvertBuffer;
+ procedure SetDataSource(Value: TDataSource);
+ protected
+ function SetQueryParams(InStr: string): string; //***
+ procedure SetParamsList(Value: TParams);
+ function GetParamsCount: word;
+ procedure RegisterDetailDataset(DetailDataSet: TASQLite3BaseQuery);
+ procedure LoadQueryData;
+ function GetActiveBuffer(var Buffer: PAnsiChar): boolean;
+ function GetDataSource: TDataSource; override;
+ procedure NotifySQLiteMasterChanged;
+ function GetFieldValue(const AField: TField; const Blobs: TList = nil): string; // added by Donnie
+
+ { Overriden abstract methods (required) }
+ function AllocRecordBuffer: PAnsiChar; override;
+ procedure FreeRecordBuffer(var Buffer: PAnsiChar); override;
+ procedure GetBookmarkData(Buffer: PAnsiChar; Data: Pointer); override;
+ function GetBookmarkFlag(Buffer: PAnsiChar): TBookmarkFlag; override;
+ function GetRecord(Buffer: PAnsiChar; GetMode: TGetMode;
+ DoCheck: boolean): TGetResult; override;
+ function GetRecordSize: word; override;
+ procedure InternalAddRecord(Buffer: Pointer; Append: boolean); override;
+ procedure InternalClose; override;
+ procedure InternalDelete; override;
+ procedure InternalFirst; override;
+ procedure InternalGotoBookmark(Bookmark: Pointer); override;
+ procedure InternalHandleException; override;
+ procedure InternalInitFieldDefs; override;
+ procedure InternalInitRecord(Buffer: PAnsiChar); override;
+ procedure InternalLast; override;
+ procedure InternalOpen; override;
+ procedure InternalPost; override;
+ procedure InternalSetToRecord(Buffer: PAnsiChar); override;
+ procedure OpenCursor(InfoQuery: Boolean); override; // GPA
+ function IsCursorOpen: boolean; override;
+ procedure SetBookmarkFlag(Buffer: PAnsiChar; Value: TBookmarkFlag); override;
+ procedure SetBookmarkData(Buffer: PAnsiChar; Data: Pointer); override;
+ procedure SetFieldData(Field: TField; Buffer: Pointer); override;
+ function GetFieldSize(FieldNo: integer): integer; overload;
+ function GetFieldSize(Field: TField): integer; overload;
+ function GetNativeFieldSize(FieldNo: integer): integer;
+ function GetFieldOffset(FieldNo: integer): integer;
+ function GetCalcFieldOffset(Field: TField): integer;
+ function GetMasterFields: string;
+ procedure SetMasterFields(const Value: string);
+ { Additional overrides (optional) }
+ function GetRecordCount: integer; override;
+ function GetRecNo: integer; override;
+ procedure SetRecNo(Value: integer); override;
+ property BaseSQL: TStrings read FSQL write SetSQL;
+ procedure SetSQLiteDateFormat(const Value: boolean);
+ procedure SetFilterText(const Value: string); override;
+ procedure DataConvert(Field: TField; Source, Dest: Pointer; ToNative: Boolean); override;//\\\
+ function CalcFieldInList(const List: string): Boolean; // John Lito
+
+ {$IFDEF IPROVIDER}
+ {***** IProviderSupport - Begin *****}
+ //-----| These are not necessary until the moment!
+ // procedure PSGetAttributes(List: TList); virtual;
+ // function PSGetDefaultOrder: TIndexDef; virtual;
+ // function PSGetIndexDefs(IndexTypes: TIndexOptions): TIndexDefs; virtual;
+ //-----| These are necessary to support IProvider
+ procedure PSEndTransaction(Commit: Boolean); override;
+ procedure PSExecute; override;
+ function PSExecuteStatement(const ASQL: string; AParams: TParams; ResultSet: Pointer = nil): Integer; override;
+ function PSGetParams: TParams; override;
+ function PSGetTableName: string; override;
+ function PSGetUpdateException(E: Exception; Prev: EUpdateError): EUpdateError; override;
+ function PSInTransaction: Boolean; override;
+ function PSIsSQLBased: Boolean; override;
+ function PSIsSQLSupported: Boolean; override;
+ procedure PSReset; override;
+ procedure PSSetCommandText(const CommandText: string); override;
+ procedure PSSetParams(AParams: TParams); override;
+ procedure PSStartTransaction; override;
+ function PSUpdateRecord(UpdateKind: TUpdateKind; Delta: TDataSet): Boolean; override;
+ function PSGetQuoteChar: string; override;
+ function PSGetKeyFields: string; override;
+ {***** IProviderSupport - End *****}
+ {$ENDIF}
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure ExecSQL;
+ procedure StartTransaction;
+ procedure StartDeferredTransaction;
+ procedure StartImmediateTransaction;
+ procedure StartExclusiveTransaction;
+ procedure Commit;
+ procedure RollBack;
+ procedure SetFiltered(Value: Boolean); override;
+ procedure SQLiteMasterChanged; virtual;
+ function GetFieldData(Field: TField; Buffer: Pointer): boolean; override;
+ function GetFieldData(FieldNo: integer; Buffer: Pointer): boolean; override; // 20040225
+ function GetLastInsertRow: integer;
+{$IFDEF ASQLITE_D6PLUS}
+// function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: boolean): boolean; override;
+{$ENDIF}
+
+ function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer; override; //MS
+ function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
+ function Locate(const KeyFields: string; const KeyValues: variant; Options: TLocateOptions): boolean; override;
+ function BookmarkValid(Bookmark: Pointer): boolean; override;
+// function LocateNearest(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean;
+ property Params: TParams read FParams write SetParamsList stored false;
+ function Lookup(const KeyFields: string; const KeyValues: Variant; // John Lito
+ const ResultFields: string): Variant; override; // John Lito
+ published
+ property AutoCommit: boolean read FAutoCommit write FAutoCommit default true;
+ property TransactionType: string read FTransactionType write FTransactionType;
+ property SQLiteDateFormat: boolean read FSQLiteDateFormat write SetSQLiteDateFormat;
+ property TableDateFormat: string read FTableDateFormat write FTableDateFormat;
+ property Connection: TASQLite3DB read FConnection write FConnection;
+ property MaxResults: integer read FMaxResults write FMaxResults;
+ property StartResult: integer read FStartResult write FStartResult;
+ property TypeLess: boolean read FTypeLess write FTypeLess;
+ property MasterFields: string read GetMasterFields write SetMasterFields;
+ property MasterSource: TDataSource read GetDataSource write SetDataSource;
+ property SQLCursor: boolean read FSQLCursor write FSQLCursor;
+ property ReadOnly: boolean read FreadOnly write FReadOnly;
+ property UniDirectional : boolean read FUniDir write FUniDir;
+ property AutoCalcFields;
+ property Filter;
+ property Filtered;
+ property Active;
+ property BeforeOpen;
+ property AfterOpen;
+ property BeforeClose;
+ property AfterClose;
+ property BeforeInsert;
+ property AfterInsert;
+ property BeforeEdit;
+ property AfterEdit;
+ property BeforePost;
+ property AfterPost;
+ property BeforeCancel;
+ property AfterCancel;
+ property BeforeDelete;
+ property AfterDelete;
+ property BeforeScroll;
+ property AfterScroll;
+{$IFDEF ASQLITE_D6PLUS}
+ property BeforeRefresh;
+ property AfterRefresh;
+{$ENDIF}
+ property OnCalcFields;
+ property OnDeleteError;
+ property OnEditError;
+ property OnNewRecord;
+ property OnPostError;
+ end;
+//============================================================================== TASQLite3Query
+
+ TASQLite3Query = class(TASQLite3BaseQuery)
+ private
+ FUpdateSQL: TASQLite3UpdateSQL;
+ FRawSQL: boolean;
+ procedure SetSQL(const Value: TStrings);
+ function GetSQL: TStrings;
+ procedure QueryChanged(Sender: TObject);
+ protected
+ procedure InternalOpen; override;
+ procedure InternalPost; override;
+ procedure InternalDelete; override;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure InternalClose; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+// property Params: TParams Read FParams Write SetParamsList Stored false;
+ procedure SQLiteMasterChanged; override;
+ published
+ property RawSQL: boolean read FRawSQL write FRawSQL;
+ property SQL: TStrings read GetSQL write SetSQL;
+ property UpdateSQL: TASQLite3UpdateSQL read FUpdateSQL write FUpdateSQL;
+ end;
+
+//============================================================================== TASQLite3Table
+
+ TASQLite3Table = class(TASQLite3BaseQuery)
+ private
+ FTableName: string;
+ FOrderBy : string;
+ FPrimaryAutoInc: boolean;
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure InternalOpen; override;
+ procedure InternalPost; override;
+ procedure InternalDelete; override;
+ procedure SetFTableName(TableName : string);
+ procedure SetFOrderBy(OrderBy : string);
+ public
+ procedure SQLiteMasterChanged; override;
+ published
+ property TableName: string read FTableName write SetFTableName;
+ property PrimaryAutoInc: boolean read FPrimaryAutoInc write FPrimaryAutoInc;
+ property OrderBy : string read FOrderBy write SetFOrderBy;
+ end;
+
+ //============================================================================== TASQLite3BlobStream
+
+ TASQLite3BlobStream = class(TMemoryStream)
+ private
+ FField: TBlobField;
+ FDataSet: TASQLite3BaseQuery;
+ FMode: TBlobStreamMode;
+ FModified: Boolean;
+ FOpened: Boolean;
+ procedure LoadBlobData;
+ procedure SaveBlobData;
+ public
+ constructor Create(Field: TBlobField; Mode: TBlobStreamMode);
+ destructor Destroy; override;
+ function Read(var Buffer; Count: Longint): Longint; override;
+ function Write(const Buffer; Count: Longint): Longint; override;
+ end;
+
+
+implementation
+
+uses
+ Math
+{$IFDEF ASQLITE_D6PLUS}
+ , StrUtils
+{$endif}
+ ;
+
+// GPA - Static Link Start
+{$IFDEF SQLite_Static}
+Var
+ __HandlerPtr:Pointer;
+
+ {$L 'OBJ\sqlite3.obj'}
+ {$L 'OBJ\files.obj'}
+ {$L 'OBJ\strlen.obj'}
+ {$L 'OBJ\assert.obj'}
+ {$L 'OBJ\memcmp.obj'}
+ {$L 'OBJ\memcpy.obj'}
+ {$L 'OBJ\memset.obj'}
+ {$L 'OBJ\strcmp.obj'}
+ {$L 'OBJ\strcpy.obj'}
+ {$L 'OBJ\strcat.obj'}
+ {$L 'OBJ\strncmp.obj'}
+ {$L 'OBJ\strncpy.obj'}
+ {$L 'OBJ\strncat.obj'}
+ {$L 'OBJ\sprintf.obj'}
+ {$L 'OBJ\fprintf.obj'}
+ {$L 'OBJ\_ll.obj'}
+ {$L 'OBJ\ltoupper.obj'}
+ {$L 'OBJ\ltolower.obj'}
+ {$L 'OBJ\atol.obj'}
+ {$L 'OBJ\ftol.obj'}
+ {$L 'OBJ\longtoa.obj'}
+ {$L 'OBJ\hrdir_r.obj'}
+ {$L 'OBJ\gmtime.obj'}
+ {$L 'OBJ\tzdata.obj'}
+ {$L 'OBJ\initcvt.obj'}
+ {$L 'OBJ\streams.obj'}
+ {$L 'OBJ\scantod.obj'}
+ {$L 'OBJ\scanwtod.obj'}
+ {$L 'OBJ\allocbuf.obj'}
+ {$L 'OBJ\bigctype.obj'}
+ {$L 'OBJ\clocale.obj'}
+ {$L 'OBJ\clower.obj'}
+ {$L 'OBJ\cupper.obj'}
+ {$L 'OBJ\fflush.obj'}
+ {$L 'OBJ\fputn.obj'}
+ {$L 'OBJ\hrdir_s.obj'}
+ {$L 'OBJ\mbisspc.obj'}
+ {$L 'OBJ\mbsrchr.obj'}
+ {$L 'OBJ\realcvt.obj'}
+ {$L 'OBJ\realcvtw.obj'}
+ {$L 'OBJ\timefunc.obj'}
+ {$L 'OBJ\vprinter.obj'}
+ {$L 'OBJ\hugeval.obj'}
+ {$L 'OBJ\cvtfak.obj'}
+ {$L 'OBJ\getinfo.obj'}
+ {$L 'OBJ\qmul10.obj'}
+ {$L 'OBJ\fuildq.obj'}
+ {$L 'OBJ\_pow10.obj'}
+ {$L 'OBJ\ldtrunc.obj'}
+ {$L 'OBJ\cvtfakw.obj'}
+ {$L 'OBJ\wis.obj'}
+ {$L 'OBJ\xfflush.obj'}
+ {$L 'OBJ\flushout.obj'}
+ {$L 'OBJ\lputc.obj'}
+ {$L 'OBJ\hrdir_b.obj'}
+ {$L 'OBJ\realloc.obj'}
+ {$L 'OBJ\mbctype.obj'}
+ {$L 'OBJ\xcvt.obj'}
+ {$L 'OBJ\xcvtw.obj'}
+ {$L 'OBJ\wcscpy.obj'}
+ {$L 'OBJ\errno.obj'}
+ {$L 'OBJ\ctrl87.obj'}
+ {$L 'OBJ\timedata.obj'}
+ {$L 'OBJ\int64toa.obj'}
+ {$L 'OBJ\cvtentry.obj'}
+ {$L 'OBJ\mbyte1.obj'}
+ {$L 'OBJ\errormsg.obj'}
+ {$L 'OBJ\exit.obj'}
+ {$L 'OBJ\iswctype.obj'}
+ {$L 'OBJ\heap.obj'}
+ {$L 'OBJ\memmove.obj'}
+ {$L 'OBJ\fxam.obj'}
+ {$L 'OBJ\fuistq.obj'}
+ {$L 'OBJ\qdiv10.obj'}
+ {$L 'OBJ\wmemset.obj'}
+ {$L 'OBJ\wcslen.obj'}
+ {$L 'OBJ\_tzset.obj'}
+ {$L 'OBJ\deflt87.obj'}
+ {$L 'OBJ\mbschr.obj'}
+ {$L 'OBJ\mbsrchr.obj'}
+ {$L 'OBJ\ermsghlp.obj'}
+ {$L 'OBJ\patexit.obj'}
+ {$L 'OBJ\initexit.obj'}
+ {$L 'OBJ\virtmem.obj'}
+ {$L 'OBJ\tzset.obj'}
+ {$L 'OBJ\mbisdgt.obj'}
+ {$L 'OBJ\mbsnbcpy.obj'}
+ {$L 'OBJ\platform.obj'}
+ {$L 'OBJ\getenv.obj'}
+ {$L 'OBJ\mbisalp.obj'}
+ {$L 'OBJ\abort.obj'}
+ {$L 'OBJ\signal.obj'}
+ {$L 'OBJ\clear87.obj'}
+ {$L 'OBJ\abort.obj'}
+ {$L 'OBJ\handles.obj'}
+ {$L 'OBJ\_cfinfo.obj'}
+ {$L 'OBJ\__isatty.obj'}
+ {$L 'OBJ\perror.obj'}
+ {$L 'OBJ\fputs.obj'}
+ {$L 'OBJ\files2.obj'}
+ {$L 'OBJ\ioerror.obj'}
+ {$L 'OBJ\__write.obj'}
+ {$L 'OBJ\_write.obj'}
+ {$L 'OBJ\__lseek.obj'}
+ {$L 'OBJ\ioerror.obj'}
+ {$L 'OBJ\setenvp.obj'}
+ {$L 'OBJ\calloc.obj'}
+ {$L 'OBJ\mbsnbcmp.obj'}
+ {$L 'OBJ\mbsnbicm.obj'}
+ {$L 'OBJ\is.obj'}
+ {$L 'OBJ\isctype.obj'}
+ {$L 'OBJ\bigctype.obj'}
+ {$L 'OBJ\globals.obj'}
+ {$L 'OBJ\hrdir_mf.obj'}
+ {$L 'OBJ\fpreset.obj'}
+ {$L 'OBJ\ta.obj'}
+ {$L 'OBJ\setexc.obj'}
+ {$L 'OBJ\defhandl.obj'}
+
+ function _wsprintfA:integer; external 'user32.dll' name 'wsprintfA';
+ procedure RtlUnwind; external 'NtDll.dll' name 'RtlUnwind';
+
+ function _sqlite3_open(dbname: PAnsiChar; var db: pointer): integer; cdecl; external;
+ function _sqlite3_close(db: pointer): integer; cdecl; external;
+ function _sqlite3_exec(DB: Pointer; SQLStatement: PAnsiChar; Callback: TSQLite3_Callback;
+ UserDate: Pointer; var ErrMsg: PAnsiChar): Integer; cdecl; external;
+ function _sqlite3_libversion: PAnsiChar; cdecl; external;
+ function _sqlite3_errmsg(db: pointer): PAnsiChar; cdecl; external;
+ function _sqlite3_get_table(db: Pointer; SQLStatement: PAnsiChar; var ResultPtr: Pointer;
+ var RowCount: cardinal; var ColCount: cardinal; var ErrMsg: PAnsiChar): integer; cdecl; external;
+ procedure _sqlite3_free_table(Table: PAnsiChar); cdecl; external;
+ procedure _sqlite3_free(P: PAnsiChar); cdecl; external;
+ function _sqlite3_complete(P: PAnsiChar): boolean; cdecl; external;
+ function _sqlite3_last_insert_rowid(db: Pointer): integer; cdecl; external;
+ procedure _sqlite3_interrupt(db: Pointer); cdecl; external;
+ procedure _sqlite3_busy_handler(db: Pointer; CallbackPtr: Pointer; Sender: TObject); cdecl; external;
+ procedure _sqlite3_busy_timeout(db: Pointer; TimeOut: integer); cdecl; external;
+ function _sqlite3_changes(db: Pointer): integer; cdecl; external;
+ function _sqlite3_prepare(db: Pointer; SQLStatement: PAnsiChar; nBytes: integer;
+ var hstatement: pointer; var Tail: PAnsiChar): integer; cdecl; external;
+ function _sqlite3_finalize(hstatement: pointer): integer; cdecl; external;
+ function _sqlite3_reset(hstatement: pointer): integer; cdecl; external;
+ function _sqlite3_step(hstatement: pointer): integer; cdecl; external;
+ function _sqlite3_column_blob(hstatement: pointer; iCol: integer): pointer; cdecl; external;
+ function _sqlite3_column_bytes(hstatement: pointer; iCol: integer): integer; cdecl; external;
+ function _sqlite3_column_count(hstatement: pointer): integer; cdecl; external;
+ function _sqlite3_column_decltype(hstatement: pointer; iCol: integer): PAnsiChar; cdecl; external;
+ function _sqlite3_column_double(hstatement: pointer; iCol: integer): double; cdecl; external;
+ function _sqlite3_column_int(hstatement: pointer; iCol: integer): integer; cdecl; external;
+ function _sqlite3_column_int64(hstatement: pointer; iCol: integer): int64; cdecl; external;
+ function _sqlite3_column_name(hstatement: pointer; iCol: integer): PAnsiChar; cdecl; external;
+ function _sqlite3_column_text(hstatement: pointer; iCol: integer): PAnsiChar; cdecl; external;
+ function _sqlite3_column_type(hstatement: pointer; iCol: integer): integer; cdecl; external;
+ function _sqlite3_bind_blob(hstatement: pointer; iCol: integer; buf: PAnsiChar; n: integer; DestroyPtr: Pointer): integer; cdecl; external;
+
+{$ENDIF}
+// GPA - Static Link End
+
+
+{$IFDEF DEBUG_ENABLED}
+var
+ DebugSpaces : Integer = 0;
+{$ENDIF}
+
+{$IFNDEF ASQLITE_D6PLUS} //Art Register - Function sign not provided in Delphi 5
+function Sign(I: Integer) : Integer ;
+begin
+ if (I > 0) then
+ Result := 1
+ else
+ begin
+ if (I < 0) then
+ Result := -1
+ else
+ Result := 0;
+ end;
+end;
+{$ENDIF}
+
+procedure Debug(const S: string);
+begin
+{$IFDEF DEBUG_ENABLED}
+ OutputDebugString(PAnsiChar(StringOfChar(' ', DebugSpaces) + S));
+{$ENDIF}
+end;
+
+procedure DebugEnter(const S: string);
+begin
+{$IFDEF DEBUG_ENABLED}
+ OutputDebugString(PAnsiChar(StringOfChar(' ', DebugSpaces) + 'Enter ' + S));
+ inc(DebugSpaces);
+{$ENDIF}
+end;
+
+procedure DebugLeave(const S: string);
+begin
+{$IFDEF DEBUG_ENABLED}
+ dec(DebugSpaces);
+ OutputDebugString(PAnsiChar(StringOfChar(' ', DebugSpaces) + 'Leave ' + S));
+{$ENDIF}
+end;
+
+//==============================================================================
+// SyntaxCheck. This routine is used to check if words match the sql syntax
+// It is called where sql statements are parsed and generated
+//==============================================================================
+
+function SyntaxCheck(LWord, RWord: string): boolean;
+begin
+ DebugEnter('SyntaxCheck');
+ try
+ if CompareText(LWord, RWord) <> 0 then begin
+ SyntaxCheck := false;
+ raise AsgError.Create('SQL macro syntax error on sql, expected ' + RWord)
+ end else
+ SyntaxCheck := true;
+ finally
+ DebugLeave('SyntaxCheck');
+ end;
+end;
+
+//==============================================================================
+// Parse the SQL fielddescription and return the Delphi Field types, length etc.
+//==============================================================================
+
+procedure GetFieldInfo(FieldInfo: string; var FieldType: TFieldType;
+ var FieldLen, FieldDec: integer);
+var
+ p1, p2, pn : integer;
+ vt : string;
+begin
+ DebugEnter('GetFieldInfo');
+ FieldType := ftString; // just a default;
+ FieldLen := 255;
+ FieldDec := 0;
+
+ p1 := pos('(', FieldInfo);
+ if p1 <> 0 then
+ begin
+ p2 := pos(')', FieldInfo);
+ if p2 <> 0 then
+ begin
+ vt := LowerCase(Copy(FieldInfo, 1, p1 - 1));
+ if (vt = 'varchar') or (vt = 'char') or (vt = 'varchar2') then begin
+ FieldType := ftString;
+ FieldLen := StrToInt(Copy(FieldInfo, p1 + 1, p2 - p1 - 1));
+ end else if (vt = 'nvarchar') or (vt = 'nchar') or (vt = 'nvarchar2') then begin
+ FieldType := ftWideString;
+ FieldLen := StrToInt(Copy(FieldInfo, p1 + 1, p2 - p1 - 1)) * 2;
+ end else if (vt = 'numeric') then begin
+ vt := Copy(FieldInfo, p1 + 1, p2 - p1 - 1);
+ pn := pos('.', vt); if pn = 0 then pn := pos(',', vt);
+ FieldType := ftFloat;
+ if pn = 0 then begin
+ FieldLen := StrToInt(vt);
+ FieldDec := 0;
+ end else begin
+ FieldLen := StrToInt(Copy(vt, 1, pn - 1));
+ FieldDec := StrToInt(Copy(vt, pn + 1, 2));
+ end;
+ end;
+ end
+ else
+ FieldLen := 256;
+ end
+ else
+ begin
+ vt := LowerCase(FieldInfo);
+ if vt = 'date' then
+ begin
+ FieldType := ftDate;
+ FieldLen := 10;
+ end
+ else if vt = 'datetime' then
+ begin
+ FieldType := ftDateTime; // fpierce original ftDate
+ FieldLen := 24; // aducom
+ end
+ else if vt = 'time' then
+ begin
+ FieldType := ftTime;
+ FieldLen := 12;
+ end
+{$IFDEF ASQLITE_D6PLUS}
+ else if vt = 'timestamp' then
+ begin
+ FieldType := ftTimeStamp;
+ FieldLen := 12;
+ end
+{$ENDIF}
+ else if (vt = 'integer') or (vt = 'int') then
+ begin
+ FieldType := ftInteger;
+ FieldLen := 12;
+ end
+ else if (vt = 'float') or (vt = 'real') then
+ begin
+ FieldType := ftFloat;
+ FieldLen := 12;
+ end
+ else if (vt = 'boolean') or (vt = 'logical') then
+ begin
+ FieldType := ftBoolean;
+ FieldLen := 2;
+ end
+ else if (vt = 'char') or (vt = 'byte') then
+ begin
+ FieldType := ftString;
+ FieldLen := 1;
+ end
+ else if (vt = 'shorttext') or (vt = 'string') then
+ begin
+ FieldType := ftString;
+ FieldLen := 255;
+ end
+ else if (vt = 'widetext') or (vt = 'widestring') then
+ begin
+ FieldType := ftWideString;
+ FieldLen := 512;
+ end
+ else if (vt = 'currency') or (vt = 'financial') or (vt = 'money') then
+ begin
+ FieldType := ftCurrency;
+ FieldLen := 10;
+ end
+ else if (vt = 'blob') then
+ begin
+ FieldType := ftBlob;
+ FieldLen := SizeOf(Pointer);
+ end
+ else if (vt = 'graphic') then
+ begin
+ FieldType := ftGraphic;
+ FieldLen := SizeOf(Pointer);
+ end
+ else if (vt = 'clob') or (vt = 'memo') or (vt = 'text') or (vt = 'longtext') then
+ begin
+ FieldType := ftMemo;
+ FieldLen := SizeOf(Pointer);
+ end;
+ end;
+ DebugLeave('GetFieldInfo: ' + vt);
+end;
+
+ //==============================================================================
+ // Convert TDateTime to TDateTimeRec
+ //==============================================================================
+
+function DateTimeToNative(DataType: TFieldType; Data: TDateTime): TDateTimeRec;
+var
+ TimeStamp : TTimeStamp;
+begin
+ DebugEnter('DateTimeToNative');
+ TimeStamp := DateTimeToTimeStamp(Data);
+ case DataType of
+ ftDate: Result.Date := TimeStamp.Date;
+ ftTime: Result.Time := TimeStamp.Time;
+ else
+ Result.DateTime := TimeStampToMSecs(TimeStamp);
+ end;
+ DebugLeave('DateTimeToNative');
+end;
+
+procedure ApplicationHandleException(Sender: TObject);
+begin
+{$IFDEF ASQLITE_D6PLUS}
+ if Assigned(Classes.ApplicationHandleException) then
+ Classes.ApplicationHandleException(Sender);
+{$ENDIF}
+end;
+
+//============================================================================== TASQLite3LOG
+
+procedure TASQLite3Log.Display(Msg: string);
+var
+ fn : Textfile;
+begin
+ DebugEnter('TASQLite3Log.Display');
+ if FileExists(FLogFile) then
+ begin
+ if FAppend then
+ begin
+ AssignFile(fn, FLogFile);
+ System.Append(fn);
+ end
+ else
+ begin
+ SysUtils.DeleteFile(FLogFile);
+ AssignFile(fn, FLogFile);
+ Rewrite(fn);
+ end;
+ end
+ else
+ begin
+ AssignFile(fn, FLogFile);
+ Rewrite(fn);
+ end;
+ Writeln(fn, FormatDateTime('yyyy mmm dd (hh:nn:ss) ', now) + Msg);
+ CloseFile(fn);
+ DebugLeave('TASQLite3Log.Display');
+end;
+
+//============================================================================== TASQLite3PRAGMA
+
+function TASQLite3Pragma.GetTempCacheSize: string;
+begin
+ DebugEnter('TASQLite3Pragma.GetTempCacheSize');
+ GetTempCacheSize := 'pragma cache_size=' + IntToStr(FTempCacheSize);
+ DebugLeave('TASQLite3Pragma.GetTempCacheSize');
+end;
+
+function TASQLite3Pragma.GetDefaultCacheSize: string;
+begin
+ DebugEnter('TASQLite3Pragma.GetDefaultCacheSize');
+ GetDefaultCacheSize := 'pragma default_cache_size=' + IntToStr(FDefaultCacheSize);
+ DebugLeave('TASQLite3Pragma.GetDefaultCacheSize');
+end;
+
+function TASQLite3Pragma.GetDefaultSynchronous: string;
+begin
+ DebugEnter('TASQLite3Pragma.GetDefaultSynchronous');
+ GetDefaultSynchronous := 'pragma default_synchronous=' + FDefaultSynchronous;
+ DebugLeave('TASQLite3Pragma.GetDefaultSynchronous');
+end;
+
+function TASQLite3Pragma.GetDefaultTempStore: string;
+begin
+ DebugEnter('TASQLite3Pragma.GetDefaultTempStore');
+ GetDefaultTempStore := 'pragma default_temp_store=' + FDefaultTempStore;
+ DebugLeave('TASQLite3Pragma.GetDefaultTempStore');
+end;
+
+function TASQLite3Pragma.GetTempStore: string;
+begin
+ DebugEnter('TASQLite3Pragma.GetTempStore');
+ GetTempStore := 'pragma temp_store=' + FTempStore;
+ DebugLeave('TASQLite3Pragma.GetTempStore');
+end;
+
+function TASQLite3Pragma.GetSynchronous: string;
+begin
+ DebugEnter('TASQLite3Pragma.GetSynchronous');
+ GetSynchronous := 'pragma synchronous=' + FSynchronous;
+ DebugLeave('TASQLite3Pragma.GetSynchronous');
+end;
+
+ //============================================================================== TFRESULT
+ // TResult is a representation of an internal pointerlist of results.
+ // Only 'normal' results will be stored internally within a fixed memory block
+ // depending on calculated length internally. This is not the case
+ // for blobs and clobs. In this case only the handle is stored in the fixed
+ // structure and a separate memory handle is retrieved to store the blob and
+ // clob data. This is because the blobs are stored as null terminated 'strings'
+ // and thus have different lengths. No more memory is allocated this way than
+ // strictly necessary.
+ // KEEP IN MIND: ...
+ // This resultset is NOT used for unidirectional search results. You can
+ // however, open a dbgrid containing griddata. You cannot update your data
+ // if you use the unidirectional the result is read-only by default and cannot
+ // be changed.
+ // The unidirectional dataset improves performance on large resultsets and
+ // is to be considered for query-only components...
+ //==============================================================================
+
+constructor TFResult.Create(TheDataSet: TASQLite3BaseQuery);
+begin
+ DebugEnter('TFResult.Create');
+ Data := TList.Create;
+ Bookmark := TList.Create;
+ RowId := TList.Create;
+ FDataSet := TheDataset;
+ FLastBookmark := -1; // 2004-14-09 (rps) 0 -> -1 (otherwise insert in an empty table gives index out of range)
+ DebugLeave('TFResult.Create');
+end;
+
+destructor TFResult.Destroy;
+var
+ ptr : Pointer;
+ i : integer;
+begin
+ DebugEnter('TFResult.Destroy');
+ FreeBlobs;
+ if Assigned(Data) then begin
+ for i := 0 to Data.Count - 1 do begin
+ ptr := Data.Items[i];
+ if Assigned(ptr) then FreeMem(ptr, FBufSize);
+ end;
+ Data.Free; // D4 compatibility, otherwise FreeAndNil could be used
+ Data := nil;
+ end;
+
+ if Assigned(Bookmark) then begin
+ Bookmark.Free;
+ Bookmark := nil;
+ end;
+
+ if Assigned(RowId) then begin
+ RowId.Free;
+ RowId := nil;
+ end;
+
+ DebugLeave('TFResult.Destroy');
+end;
+
+procedure TFResult.FreeBlobs;
+var i, j : integer;
+ offset : integer;
+ ptr : PAnsiChar;
+ stream : TMemoryStream;
+begin
+ if not Assigned(FDataSet) then exit;
+ if not Assigned(FDataSet.FieldList) then exit;
+ for j := 0 to Data.Count - 1 do begin
+ ptr := GetData(j);
+ for i := 0 to FDataSet.FieldList.Count - 1 do begin
+ if FDataSet.FieldList[i].DataType in [ftMemo, ftFmtMemo, ftGraphic, ftBlob] then begin
+ Offset := FDataset.GetFieldOffset(FDataSet.FieldList[i].FieldNo);
+ Move((ptr + Offset)^, Pointer(Stream), sizeof(Pointer));
+ Stream.Free;
+ end;
+ end;
+ end;
+end;
+
+procedure TFResult.SetBufSize(TheSize: integer);
+begin
+ DebugEnter('TFResult.SetBufSize');
+ FBufSize := TheSize;
+ DebugLeave('TFResult.SetBufSize');
+end;
+
+//==============================================================================
+// Adds a row of data to the resultset.
+//==============================================================================
+
+procedure TFResult.Add(TheBuffer: PAnsiChar; TheRowId: integer);
+var
+ ptr : PAnsiChar;
+// i: integer;
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TFResult.Add');
+{$ENDIF}
+ Inc(FLastBookmark);
+ GetMem(Ptr, FBufSize);
+ move(TheBuffer^, ptr^, FBufSize);
+ Data.Add(Ptr);
+ Bookmark.Add(Pointer(FLastBookMark));
+ if TheRowId >= 0 then
+ RowId.Add(Pointer(TheRowId))
+ else
+ RowId.Add(Pointer(RowId.Count));
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TFResult.Add');
+{$ENDIF}
+end;
+
+//==============================================================================
+// Inserts a row of date into the resultset
+//==============================================================================
+
+procedure TFResult.Insert(Index: integer; TheBuffer: pointer; TheRowId: integer);
+var
+ ptr : Pointer;
+begin
+ DebugEnter('TFResult.Insert');
+ Inc(FLastBookmark);
+ GetMem(Ptr, FBufSize);
+ move(TheBuffer^, ptr^, FBufSize);
+ if Data.Count < Index then begin
+ Data.Add(Ptr);
+ Bookmark.Add(Pointer(FLastBookMark));
+ RowId.Add(Pointer(TheRowId));
+ end else begin
+ Data.Insert(Index, Ptr);
+ Bookmark.Insert(Index, Pointer(FLastBookMark));
+ RowId.Insert(Index, Pointer(TheRowId));
+ end;
+ DebugLeave('TFResult.Insert');
+end;
+
+//==============================================================================
+// Deletes a row of data from the resultset
+//==============================================================================
+
+procedure TFResult.Delete(Index: integer);
+var
+ ptr : pointer;
+begin
+ DebugEnter('TFResult.Delete');
+ if not ((Index < 0) or (Index >= Data.Count)) then
+ begin
+ ptr := Data.Items[Index];
+ if ptr <> nil then
+ FreeMem(ptr, FBufSize);
+ Data.Delete(Index);
+ Bookmark.Delete(Index);
+ Rowid.Delete(Index);
+ end;
+ DebugLeave('TFResult.Delete');
+end;
+
+//==============================================================================
+// Returns a row from the resultset
+//==============================================================================
+
+function TFResult.GetData(Index: integer): Pointer;
+begin
+ DebugEnter('TFResult.GetData');
+ if (Index < 0) or (Index >= Data.Count) then
+ GetData := nil
+ else
+ GetData := Data.Items[Index];
+ DebugLeave('TFResult.GetData');
+end;
+
+function TFResult.GetBookmark(Index: integer): integer;
+begin
+ DebugEnter('TFResult.GetBookmark');
+ if (Index < 0) or (Index >= Data.Count) then
+ GetBookmark := -1
+ else
+ GetBookmark := integer(Bookmark.Items[Index]);
+ DebugLeave('TFResult.GetBookmark');
+end;
+
+function TFResult.GetRowId(Index: integer): integer;
+begin
+ DebugEnter('TFResult.GetRowId');
+ if (Index < 0) or (Index >= RowId.Count) then
+ GetRowId := -1
+ else
+ GetRowId := integer(RowId.Items[Index]);
+ DebugLeave('TFResult.GetRowId');
+end;
+
+function TFResult.Count: integer;
+begin
+ Count := Data.Count;
+end;
+
+function TFResult.IndexOf(TheBookMark: pointer): integer;
+begin
+ Result := BookMark.IndexOf(TheBookmark);
+end;
+
+//============================================================================== ASQLITEDB
+
+procedure TASQLite3DB.Notification(AComponent: TComponent; Operation: TOperation);
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLite3DB.Notification');
+{$ENDIF}
+// Application.ProcessMessages;
+ if Assigned(AComponent) then
+ begin
+ if (Operation = opRemove) then
+ begin
+ if (AComponent is TASQLite3Pragma) then begin
+ if Assigned(FASQLitePragma) then begin
+ if TASQLite3Pragma(AComponent) = FASQLitePragma then
+ FASQLitePragma := nil;
+ end;
+ end
+ else if (AComponent is TASQLite3Log) then
+ begin
+ if Assigned(FASQLiteLog) then begin
+ if TASQLite3Log(AComponent) = FASQLiteLog then
+ FASQLiteLog := nil;
+ end;
+ end
+ else if (AComponent is TASQLite3InlineSQL) then
+ begin
+ if Assigned(FInlineSQL) then begin
+ if TASQLite3InlineSQL(AComponent) = FInlineSQL then
+ FInlineSQL := nil;
+ end;
+ end;
+ end;
+ end;
+ inherited;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLite3DB.Notification');
+{$ENDIF}
+end;
+
+function TASQLite3DB.LoadLibs: boolean;
+begin
+ try
+ DebugEnter('TASQLite3DB.LoadLibs');
+ if not(DecimalSeparator in ['.',',']) then
+ DecimalSeparator := '.';
+
+ Debug('loading sqlite lib');
+{$IFNDEF SQLite_Static}
+ Debug(PAnsiChar(DriverDLL));
+ Result := false;
+ DLLHandle := LoadLibrary(PAnsiChar(DriverDLL)); //JohnLito
+ if DLLHandle <> 0 then
+ begin
+ @SQLite3_Open := GetProcAddress(DLLHandle, 'sqlite3_open');
+ if not Assigned(@SQLite3_Open) then exit;
+ @SQLite3_Close := GetProcAddress(DLLHandle, 'sqlite3_close');
+ if not Assigned(@SQLite3_Close) then exit;
+ @SQLite3_Exec := GetProcAddress(DLLHandle, 'sqlite3_exec');
+ if not Assigned(@SQLite3_Exec) then exit;
+ @SQLite3_LibVersion := GetProcAddress(DLLHandle, 'sqlite3_libversion');
+ if not Assigned(@SQLite3_LibVersion) then exit;
+ @SQLite3_ErrorString := GetProcAddress(DLLHandle, 'sqlite3_errmsg');
+ if not Assigned(@SQLite3_ErrorString) then exit;
+ @SQLite3_GetTable := GetProcAddress(DLLHandle, 'sqlite3_get_table');
+ if not Assigned(@SQLite3_GetTable) then exit;
+ @SQLite3_FreeTable := GetProcAddress(DLLHandle, 'sqlite3_free_table');
+ if not Assigned(@SQLite3_FreeTable) then exit;
+ @SQLite3_FreeMem := GetProcAddress(DLLHandle, 'sqlite3_free');
+ if not Assigned(@SQLite3_FreeMem) then exit;
+ @SQLite3_Complete := GetProcAddress(DLLHandle, 'sqlite3_complete');
+ if not Assigned(@SQLite3_Complete) then exit;
+ @SQLite3_LastInsertRow := GetProcAddress(DLLHandle, 'sqlite3_last_insert_rowid');
+ if not Assigned(@SQLite3_LastInsertRow) then exit;
+ @SQLite3_Cancel := GetProcAddress(DLLHandle, 'sqlite3_interrupt');
+ if not Assigned(@SQLite3_Cancel) then exit;
+ @SQLite3_BusyTimeout := GetProcAddress(DLLHandle, 'sqlite3_busy_timeout');
+ if not Assigned(@SQLite3_BusyTimeout) then exit;
+ @SQLite3_BusyHandler := GetProcAddress(DLLHandle, 'sqlite3_busy_handler');
+ if not Assigned(@SQLite3_BusyHandler) then exit;
+ @SQLite3_Changes := GetProcAddress(DLLHandle, 'sqlite3_changes');
+ if not Assigned(@SQLite3_Changes) then exit;
+ @SQLite3_Prepare := GetProcAddress(DLLHandle, 'sqlite3_prepare');
+ if not Assigned(@SQLite3_Prepare) then exit;
+ @SQLite3_Finalize := GetProcAddress(DLLHandle, 'sqlite3_finalize');
+ if not Assigned(@SQLite3_Finalize) then exit;
+ @SQLite3_Reset := GetProcAddress(DLLHandle, 'sqlite3_reset');
+ if not Assigned(@SQLite3_Reset) then exit;
+ @SQLite3_Step := GetProcAddress(DLLHandle, 'sqlite3_step');
+ if not Assigned(@SQLite3_Step) then exit;
+ @SQLite3_Column_blob := GetProcAddress(DLLHandle, 'sqlite3_column_blob');
+ if not Assigned(@SQLite3_Column_blob) then exit;
+ @SQLite3_Column_bytes := GetProcAddress(DLLHandle, 'sqlite3_column_bytes');
+ if not Assigned(@SQLite3_Column_bytes) then exit;
+ @SQLite3_Column_count := GetProcAddress(DLLHandle, 'sqlite3_column_count');
+ if not Assigned(@SQLite3_Column_Count) then exit;
+ @SQLite3_Column_decltype := GetProcAddress(DLLHandle, 'sqlite3_column_decltype');
+ if not Assigned(@SQLite3_Column_decltype) then exit;
+ @SQLite3_Column_double := GetProcAddress(DLLHandle, 'sqlite3_column_double');
+ if not Assigned(@SQLite3_Column_double) then exit;
+ @SQLite3_Column_int := GetProcAddress(DLLHandle, 'sqlite3_column_int');
+ if not Assigned(@SQLite3_Column_int) then exit;
+ @SQLite3_Column_int64 := GetProcAddress(DLLHandle, 'sqlite3_column_int64');
+ if not Assigned(@SQLite3_Column_int64) then exit;
+ @SQLite3_Column_name := GetProcAddress(DLLHandle, 'sqlite3_column_name');
+ if not Assigned(@SQLite3_Column_name) then exit;
+ @SQLite3_Column_text := GetProcAddress(DLLHandle, 'sqlite3_column_text');
+ if not Assigned(@SQLite3_Column_text) then exit;
+ @SQLite3_Column_text16 := GetProcAddress(DLLHandle, 'sqlite3_column_text16');
+ if not Assigned(@SQLite3_Column_text16) then exit;
+ @SQLite3_Column_type := GetProcAddress(DLLHandle, 'sqlite3_column_type');
+ if not Assigned(@SQLite3_Column_type) then exit;
+ @SQLite3_Bind_Blob := GetProcAddress(DLLHandle, 'sqlite3_bind_blob');
+ if not Assigned(@SQLite3_Bind_blob) then exit;
+ @SQLite3_Bind_Text16 := GetProcAddress(DLLHandle, 'sqlite3_bind_text16');
+ if not Assigned(@SQLite3_Bind_Text16) then exit;
+ @SQLite3_Bind_Parameter_Count := GetProcAddress(DLLHandle, 'sqlite3_bind_parameter_count');
+ if not Assigned(@SQLite3_Bind_Parameter_Count) then exit;
+
+ Result := true;
+ end;
+ {$ELSE}
+ DllHandle := 1;
+ @SQLite3_Open := @_sqlite3_open;
+ @SQLite3_Close := @_sqlite3_close;
+ @SQLite3_Exec := @_sqlite3_exec;
+ @SQLite3_LibVersion := @_sqlite3_libversion;
+ @SQLite3_ErrorString := @_sqlite3_errmsg;
+ @SQLite3_GetTable := @_sqlite3_get_table;
+ @SQLite3_FreeTable := @_sqlite3_free_table;
+ @SQLite3_FreeMem := @_sqlite3_free;
+ @SQLite3_Complete := @_sqlite3_complete;
+ @SQLite3_LastInsertRow := @_sqlite3_last_insert_rowid;
+ @SQLite3_Cancel := @_sqlite3_interrupt;
+ @SQLite3_BusyTimeout := @_sqlite3_busy_timeout;
+ @SQLite3_BusyHandler := @_sqlite3_busy_handler;
+ @SQLite3_Changes := @_sqlite3_changes;
+ @SQLite3_Prepare := @_sqlite3_prepare;
+ @SQLite3_Finalize := @_sqlite3_finalize;
+ @SQLite3_Reset := @_sqlite3_reset;
+ @SQLite3_Step := @_sqlite3_step;
+ @SQLite3_Column_blob := @_sqlite3_column_blob;
+ @SQLite3_Column_bytes := @_sqlite3_column_bytes;
+ @SQLite3_Column_count := @_sqlite3_column_count;
+ @SQLite3_Column_decltype := @_sqlite3_column_decltype;
+ @SQLite3_Column_double := @_sqlite3_column_double;
+ @SQLite3_Column_int := @_sqlite3_column_int;
+ @SQLite3_Column_int64 := @_sqlite3_column_int64;
+ @SQLite3_Column_name := @_sqlite3_column_name;
+ @SQLite3_Column_text := @_sqlite3_column_text;
+ @SQLite3_Column_type := @_sqlite3_column_type;
+ @SQLite3_Bind_Blob := @_sqlite3_bind_blob;
+ Result := true;
+ {$ENDIF}
+ finally
+ DebugLeave('TASQLite3DB.LoadLibs');
+ end;
+end;
+
+procedure TASQLite3DB.ShowError;
+var msg : PAnsiChar;
+begin
+ msg := SQLite3_ErrorString(DBHandle);
+ raise EDatabaseError.Create(msg);
+end;
+
+function TASQLite3DB.SQLite3_ExecSQL(TheStatement: string; Blobs: TList=nil): integer;
+var
+ PF: PAnsiChar;
+ p: Pointer;
+ i: Integer;
+ b: Integer;
+ m: TMemoryStream;
+begin
+ TheStatement := StringReplace(TheStatement, #2, '?', [rfReplaceAll, rfIgnoreCase]);
+ PF := PAnsiChar(TheStatement);
+ repeat
+ Result := SQLite3_Prepare(DBHandle, PF, -1, p, PF);
+ if Result = SQLITE_OK then
+ begin
+ if Assigned(Blobs) then begin
+ for i := 0 to Blobs.Count - 1 do Begin
+ b := i+1;
+ m := TMemoryStream(Blobs.Items[i]);
+ SQLite3_Bind_Blob(p, b, PChar(m.Memory), m.Size, nil);
+ End;
+ end;
+ repeat
+ until SQLite3_Step(p) in [SQLITE_DONE, SQLITE_ERROR, SQLITE_MISUSE];
+ Result := SQLite3_Finalize(p);
+ if Result <> SQLITE_OK then ShowError;
+ end
+ else
+ ShowError;
+ until PF^ = #0;
+end;
+
+function TASQLite3DB.SQLite3_PrepareResult(DB: Pointer; TheStatement: string; FParams: TParams; Sender: TObject): Pointer;
+var
+ i,tmpi: Integer;
+ t: PAnsiChar;
+ RV: Integer;
+// RowIdCol: Integer; // column containing rowid
+// RowId: Integer; // current record row id (to be stored in resultset)
+ colname, coltype: PChar;
+ tmpcolname:string;
+ FieldType: TFieldType;
+ FieldLen: Integer;
+ FieldDec: Integer;
+ bFirst: Boolean;
+ wildcard: Integer;
+begin
+ if not (Sender is TASQLite3BaseQuery) then Exit;
+
+ with (Sender as TASQLite3BaseQuery) do begin
+ // if there are blob fields then we need to bind the blob variable
+ RowId := -1;
+ RowIdCol := -1;
+ TheStatement := StringReplace(TheStatement, #2, '?', [rfReplaceAll, rfIgnoreCase]);
+
+ bFirst := True;
+{$IFDEF ASQLITE_D6PLUS}
+ if FUtf8 then
+ RV := SQLite3_Prepare(DBHandle, PAnsiChar(AnsiToUtf8(TheStatement)), -1, result, t)
+ else
+{$endif}
+ RV := SQLite3_Prepare(DBHandle, PAnsiChar(TheStatement), -1, result, t);
+
+ wildcard := 1;
+ if Assigned(FParams) then begin
+ for i := 0 to FParams.Count - 1 do begin
+ if FParams[i].DataType in [ftBlob, ftGraphic] then begin
+ SQLite3_Bind_Blob(result, wildcard, PChar(FParams[i].AsBlob), FParams[i].GetDataSize, nil);
+ Inc(wildcard);
+ end;
+ end;
+ end;
+
+ if RV <> 0 then ShowError else begin
+ if bFirst then begin // retrieve metadata on first row
+ bFirst := False;
+ if SQLite3_Column_count(result) > 0 then FieldDefs.Clear;
+ for i := 0 to SQLite3_Column_count(result) - 1 do begin
+ colname := SQLite3_Column_name(result, i);
+
+ // the second field named "ID", change in "ID_1" (like InterBase)
+ if (FieldDefs.IndexOf(colname) >= 0) then begin // Mirko
+ tmpColName := colname; // Mirko
+ tmpI := 0; // Mirko
+ while (FieldDefs.IndexOf(tmpcolname) >= 0) do begin // Mirko
+ inc(tmpI); // Mirko
+ tmpColName := colname + '_' + inttostr(tmpI); // Mirko
+ end; // Mirko
+ colName := PChar(tmpColName); // Mirko
+ end; // Mirko
+
+ if CompareText(colname, 'rowid') = 0 then begin
+ RowIdCol := i;
+ end else begin
+ coltype := SQLite3_Column_decltype(result, i);
+ //SQl: select max(CurID) from Items, sqlite3_column_decltype returns null.. it's probably SQLite bug
+ // better is to use max(CurID) as something from .... Aducom
+ if coltype = nil then
+ GetFieldInfo('string', FieldType, FieldLen, FieldDec) //OL
+ else
+ GetFieldInfo(coltype, FieldType, FieldLen, FieldDec);
+ if TypeLess then begin
+ FieldType := ftString;
+ with FieldDefs.AddFieldDef do begin
+ Name := colname;
+ DataType := FieldType;
+ Size := FieldLen;
+ end;
+ end else begin
+ with FieldDefs.AddFieldDef do begin
+ if FieldType <> ftString then begin
+ Name := colname;
+ DataType := FieldType;
+ if FieldType = ftFloat then
+ Precision := FieldDec;
+ end else begin
+ Name := colname;
+ DataType := FieldType;
+ Size := FieldLen;
+ end;
+ end;
+ end;
+ MaxStrLen := MaxStrLen + GetNativeFieldSize(i + 1); // compensate for terminating zero
+ FResult.SetBufSize(MaxStrLen + 1 + SizeOf(TBookMark));
+ end;
+ end;
+ end;
+ end;
+ end;
+end;
+
+function TASQLite3DB.SQLite3_GetNextResult(DB: Pointer; TheStatement: pointer; FParams: TParams; Sender: TObject) : pointer;
+var
+ i : integer;
+ minmin : integer;
+ RV: Integer;
+ mv: Integer;
+// RowIdCol: Integer; // column containing rowid
+ convertbuf: TConvertBuffer;
+ pData: PAnsiChar;
+ BlobStream: TMemoryStream;
+begin
+ result := nil;
+ with (Sender as TASQLite3BaseQuery) do begin
+
+ FillChar(ResultStr^, MaxBuf, 0);
+ RV := SQLite3_Step(theStatement);
+ if RV = SQLITE_ROW then begin
+
+ // retrieve data
+ if (Sender is TASQLite3Query) then
+ MinMin := 1
+ else
+ MinMin := 1; // compensate for 'rowid'
+ for i := 0 to SQLite3_Column_count(theStatement) - MinMin do begin
+ if i = RowIdCol then begin // just save rowid
+ RowId := SQLite3_Column_int(theStatement, i);
+ end else begin
+
+// ok, i can find-out that the fiels is null but.... eh....
+// if SQLite3_column_type(theStatement, i) = 5 then begin
+// end;
+
+ pData := SQLite3_Column_text(theStatement, i);
+ if pData = nil then pData := ''; // james
+ if FTypeLess then begin
+ mv := GetNativeFieldSize(i + 1);
+ if StrLen(pData) < Cardinal(mv) then
+ mv := StrLen(pData);
+ Move(pData^, (ResultStr + GetFieldOffset(i + 1))^, mv);
+ end else begin
+ case FieldDefs[i].DataType of // DI
+ ftString: // DI
+ begin // DI
+ mv := GetNativeFieldSize(i + 1);
+ if pData <> nil then //OL
+ begin
+ if StrLen(pData) < Cardinal(mv) then
+ mv := StrLen(pData)+1; // plus onennnnnnnnnnnnnnnn
+ Move(pData^, (ResultStr + GetFieldOffset(i + 1))^, mv);
+ end;
+ end; // DI
+ ftMemo, ftGraphic, ftFmtMemo, ftBlob: // DI
+ begin // DI
+ // create memory stream to save blob;
+ pData := SQLite3_Column_blob(theStatement, i);
+ BlobStream := TMemoryStream.Create;
+ if pData <> nil then
+ BlobStream.Write(pData^, SQLite3_Column_bytes(theStatement, i))
+ else begin
+ pData := '';
+ BlobStream.Write(pData^, 0);
+ end;
+ Move(BlobStream, (ResultStr + GetFieldOffset(i + 1))^, SizeOf(BlobStream));
+ end; // DI
+ else // DI
+ begin // DI
+ convertbuf := UnpackBuffer(pData, FieldDefs[i].DataType);
+ Move(convertbuf, (ResultStr + GetFieldOffset(i + 1))^, GetFieldSize(i + 1));
+ end;
+ end;
+ end;
+ end
+ end;
+ Result := ResultStr;
+ end;
+ if RV in [SQLITE_DONE] then result := nil;
+ if RV in [SQLITE_ERROR, SQLITE_MISUSE] then //f.e. inserting NULL in field declared as NOT NULL
+ ShowError;
+ end;
+end;
+
+procedure TASQLite3DB.SQLite3_CloseResult(TheStatement : pointer);
+var RV : integer;
+begin
+ if TheStatement <> nil then begin
+ SQLite3_Reset(TheStatement);
+ RV := SQLite3_Finalize(TheStatement);
+ if RV <> 0 then raise AsgError.Create('SQLiteExecute error: ' + IntToStr(RV));
+ end;
+end;
+
+function TASQLite3DB.SQLite3_Execute(DB: Pointer; TheStatement: string; FParams: TParams; Sender: TObject): Integer;
+var
+ p: Pointer;
+ RowIdCol: Integer; // column containing rowid
+{$IFDEF ASQLITE_D6PLUS}
+ Cursor: TDBScreenCursor;
+{$endif}
+begin
+ SQLite3_Execute := 0;
+ RowIdCol := -1;
+ if not (Sender is TASQLite3BaseQuery) then Exit;
+ try
+ with (Sender as TASQLite3BaseQuery) do begin
+{$IFDEF ASQLITE_D6PLUS}
+ if Assigned(DBScreen) and (FSQLCursor) then begin
+ Cursor := DBScreen.Cursor;
+ DBScreen.Cursor := dcrSQLWait;
+ end;
+{$endif}
+ RowId := -1;
+
+ FStatement := Connection.SQLite3_PrepareResult(Connection.DBHandle, PAnsiChar(TheStatement),FParams, Sender);
+
+ repeat
+ p := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams, Sender);
+ if p <> nil then
+ FResult.Add(ResultStr, RowId);
+ until p = nil;
+
+ Connection.SQLite3_CloseResult(FStatement);
+ FStatement := nil;
+ end;
+ finally
+{$IFDEF ASQLITE_D6PLUS}
+ if Assigned(DBScreen) and ((Sender as TASQLite3BaseQuery).FSQLCursor) then begin
+ DBScreen.Cursor := Cursor;
+ if DBScreen.Cursor = dcrSQLWait then
+ DBScreen.Cursor := dcrDefault;
+ end;
+{$endif}
+
+ end;
+end;
+
+function TASQLite3DB.FGetDriverDLL: string;
+begin
+ DebugEnter('TASQLite3DB.FGetDriverDLL');
+ if FDriverDLL = '' then
+ FDriverDLL := 'SQLite3.dll';
+ FGetDriverDLL := FDriverDLL;
+ DebugLeave('TASQLite3DB.FGetDriverDLL');
+end;
+
+function TASQLite3DB.FGetDefaultExt: string;
+begin
+ DebugEnter('TASQLite3DB.FGetDefaultExt');
+ if FDefaultExt = '' then
+ FDefaultExt := '.sqb';
+ FGetDefaultExt := FDefaultExt;
+ DebugLeave('TASQLite3DB.FGetDefaultExt');
+end;
+
+procedure TASQLite3DB.FSetDatabase(Database: string);
+begin
+ DebugEnter('TASQLite3DB.FSetDatabase ' + Database);
+ FDatabase := Trim(Database);
+ if ExtractFileExt(FDataBase)='' Then // GPA
+ FDatabase:=FDataBase+FDefaultExt; // GPA
+ DebugLeave('TASQLite3DB.FSetDatabase');
+end;
+
+procedure TASQLite3DB.ShowDatabases(List: TStrings);
+var
+ sr : TSearchRec;
+begin
+ DebugEnter('TASQLite3DB.ShowDatabases');
+ if DefaultExt = '' then
+ DefaultExt := '.sqb';
+ if DefaultExt[1] <> '.' then
+ DefaultExt := '.' + DefaultExt;
+ if DefaultDir <> '' then
+ if DefaultDir[Length(DefaultDir)] <> '\' then
+ DefaultDir := DefaultDir + '\';
+ if FindFirst(FDefaultDir + '*' + DefaultExt, faAnyFile, sr) = 0 then
+ begin
+ repeat
+ List.Add(sr.Name);
+ until FindNext(sr) <> 0;
+ SysUtils.FindClose(sr);
+ end;
+ DebugLeave('TASQLite3DB.ShowDatabases');
+end;
+
+procedure TASQLite3DB.GetTableNames(List: TStrings; SystemTables: boolean = false);
+var
+ ResultPtr : Pointer;
+ ResultStr : ^Pointer;
+ RowCount : cardinal;
+ ColCount : cardinal;
+ ErrMsg : PAnsiChar;
+ i : integer;
+begin
+ DebugEnter('TASQLite3DB.GetTableNames');
+ if not FConnected then
+ Connected := true;
+ if FConnected then
+ begin
+ SQLite3_GetTable(DBHandle, PAnsiChar(
+ 'SELECT name FROM sqlite_master WHERE type="table" ORDER BY name'),
+ ResultPtr, RowCount, ColCount, ErrMsg);
+
+ ResultStr := ResultPtr;
+ List.Clear;
+ Inc(ResultStr); // ignore header
+ for i := 1 to RowCount do
+ begin
+ if (CompareText('name', PAnsiChar(ResultStr^)) <> 0) then
+ List.Add(PAnsiChar(ResultStr^));
+ Inc(ResultStr);
+ end;
+ if Assigned(ResultPtr) then SQLite3_FreeTable(ResultPtr);
+ end;
+ DebugLeave('TASQLite3DB.GetTableNames');
+end;
+
+procedure TASQLite3DB.GetIndexFieldNames(IndexName: string; List: TStrings);
+var
+ ResultPtr : Pointer;
+ ResultStr : ^Pointer;
+ RowCount : cardinal;
+ ColCount : cardinal;
+ ErrMsg : PAnsiChar;
+ i : integer;
+begin
+ DebugEnter('TASQLite3DB.GetIndexFieldNames');
+ if not FConnected then
+ Connected := true;
+ if FConnected then
+ begin
+ SQLite3_GetTable(DBHandle, PAnsiChar(
+ 'PRAGMA index_info("' + IndexName + '");'),
+ ResultPtr, RowCount, ColCount, ErrMsg);
+
+ ResultStr := ResultPtr;
+ List.Clear;
+ Inc(ResultStr, 5);
+ for i := 1 to RowCount do
+ begin
+ List.Insert(0, PAnsiChar(ResultStr^));
+ Inc(ResultStr, 3);
+ end;
+ if Assigned(ResultPtr) then SQLite3_FreeTable(ResultPtr);
+ end;
+ DebugLeave('TASQLite3DB.GetIndexFieldNames');
+end;
+
+procedure TASQLite3DB.GetIndexNames(List: TStrings; SystemTables: boolean = false);
+var
+ ResultPtr : Pointer;
+ ResultStr : ^Pointer;
+ RowCount : cardinal;
+ ColCount : cardinal;
+ ErrMsg : PAnsiChar;
+ i : integer;
+begin
+ DebugEnter('TASQLite3DB.GetIndexNames');
+ if not FConnected then
+ Connected := true;
+ if FConnected then
+ begin
+ SQLite3_GetTable(DBHandle, PAnsiChar(
+ 'SELECT name FROM sqlite_master WHERE type="index" ORDER BY name'),
+ ResultPtr, RowCount, ColCount, ErrMsg);
+
+ ResultStr := ResultPtr;
+ List.Clear;
+ Inc(ResultStr); // ignore header
+ for i := 1 to RowCount do
+ begin
+ List.Add(PAnsiChar(ResultStr^));
+ Inc(ResultStr);
+ end;
+ if Assigned(ResultPtr) then SQLite3_FreeTable(ResultPtr);
+ end;
+ DebugLeave('TASQLite3DB.GetIndexNames');
+end;
+
+procedure TASQLite3DB.GetFieldNames(TableName: string; List: TStrings);
+var
+ ResultPtr : Pointer;
+ ResultStr : ^Pointer;
+ RowCount : cardinal;
+ ColCount : cardinal;
+ ErrMsg : PAnsiChar;
+ i : integer;
+begin
+ DebugEnter('TASQLite3DB.GetFieldNames ' + Tablename);
+ if not FConnected then
+ Connected := true;
+ if FConnected then
+ begin
+ SQLite3_GetTable(DBHandle, PAnsiChar('PRAGMA table_info("' + TableName + '");'),
+ ResultPtr, RowCount, ColCount, ErrMsg);
+ ResultStr := ResultPtr;
+ List.Clear;
+ Inc(ResultStr, 6); // headers can be ignored
+ for i := 1 to RowCount do
+ begin
+ Inc(ResultStr);
+ List.Add(PAnsiChar(ResultStr^)); // the second field contains the fieldname
+ Inc(ResultStr, 5);
+ end;
+ if Assigned(ResultPtr) then SQLite3_FreeTable(ResultPtr);
+ end;
+ DebugLeave('TASQLite3DB.GetFieldNames');
+end;
+
+procedure TASQLite3DB.GetPrimaryKeys(TableName: string; List: TStrings);
+var
+ ResultPtr : Pointer;
+ ResultStr : ^Pointer;
+// PK: ^Pointer;
+ RowCount : cardinal;
+ ColCount : cardinal;
+ ErrMsg : PAnsiChar;
+ Temp : string;
+ i : integer;
+begin
+ DebugEnter('TASQLite3DB.GetPrimaryKeys ' + Tablename);
+ if not FConnected then
+ Connected := true;
+ if FConnected then
+ begin
+ SQLite3_GetTable(DBHandle, PAnsiChar('PRAGMA table_info("' + TableName + '");'),
+ ResultPtr, RowCount, ColCount, ErrMsg);
+ ResultStr := ResultPtr;
+ List.Clear;
+ Inc(ResultStr, 6); // headers can be ignored
+ for i := 1 to RowCount do
+ begin
+ Inc(ResultStr);
+ Temp := PAnsiChar(ResultStr^); // the second field contains the fieldname
+ Inc(ResultStr, 4);
+ // the last field reveils a indicator for primary key
+ if PAnsiChar(ResultStr^) = '1' then
+ List.Add(Temp);
+ Inc(ResultStr);
+ end;
+ if Assigned(ResultPtr) then SQLite3_FreeTable(ResultPtr);
+ end;
+ DebugLeave('TASQLite3DB.GetPrimaryKeys');
+end;
+
+procedure TASQLite3DB.GetTableInfo(TableName: string; List: TList);
+var
+ ResultPtr : Pointer;
+ ResultStr : ^Pointer;
+ RowCount : cardinal;
+ ColCount : cardinal;
+ ErrMsg : PAnsiChar;
+ Field : TASQLite3Field;
+ i : integer;
+begin
+ DebugEnter('TASQLite3DB.GetTableInfo ' + Tablename);
+ if not FConnected then
+ Connected := true;
+ if FConnected then
+ begin
+ SQLite3_GetTable(DBHandle, PAnsiChar('PRAGMA table_info("' + TableName + '");'),
+ ResultPtr, RowCount, ColCount, ErrMsg);
+ ResultStr := ResultPtr;
+ while List.Count > 0 do
+ begin
+ TASQLite3Field(List[0]).Free;
+ List.Delete(0);
+ end;
+ List.Clear;
+
+ Inc(ResultStr,6);
+ for i := 1 to RowCount do
+ begin
+ Field := TASQLite3Field.Create;
+ with Field do
+ begin
+ FieldNumber := StrToIntX(PAnsiChar(ResultStr^));
+ Inc(ResultStr);
+ FieldName := PAnsiChar(ResultStr^);
+ Inc(ResultStr);
+ FieldType := PAnsiChar(ResultStr^);
+ Inc(ResultStr);
+ FieldNN := StrToIntX(PAnsiChar(ResultStr^));
+ Inc(ResultStr);
+ FieldDefault := PAnsiChar(ResultStr^);
+ Inc(ResultStr);
+ FieldPK := StrToIntX(PAnsiChar(ResultStr^));
+ Inc(ResultStr);
+ end;
+ List.Add(Field);
+ end;
+ if Assigned(ResultPtr) then SQLite3_FreeTable(ResultPtr);
+ end;
+ DebugLeave('TASQLite3DB.GetTableInfo');
+end;
+
+// retrieves the user version
+function TASQLite3DB.GetUserVersion(database : string=''): integer;
+var
+ ResultPtr : Pointer;
+ ResultStr : ^Pointer;
+ RowCount : cardinal;
+ ColCount : cardinal;
+ ErrMsg : PAnsiChar;
+begin
+ DebugEnter('TASQLite3DB.GetTableIndexNames');
+ GetUserVersion := -1;
+ if not FConnected then
+ Connected := true;
+ if FConnected then
+ begin
+ if database <> '' then database := database +'.';
+ SQLite3_GetTable(DBHandle, PAnsiChar(
+ 'PRAGMA '+Database+'user_version'),
+ ResultPtr, RowCount, ColCount, ErrMsg);
+ ResultStr := ResultPtr;
+ Inc(ResultStr);
+ GetUserVersion := StrToIntX(PAnsiChar(ResultStr^));
+ end;
+end;
+
+// sets user version.
+procedure TASQLite3DB.SetUserVersion(Version : integer; Database : string='');
+begin
+ if Database <> '' then Database := Database +'.';
+ SQLite3_ExecSQL('PRAGMA '+Database+'user_version='+IntToStr(Version));
+end;
+
+procedure TASQLite3DB.GetTableIndexNames(TableName: string; List: TStrings);
+var
+ ResultPtr : Pointer;
+ ResultStr : ^Pointer;
+ RowCount : cardinal;
+ ColCount : cardinal;
+ ErrMsg : PAnsiChar;
+ i : integer;
+begin
+ DebugEnter('TASQLite3DB.GetTableIndexNames');
+ if not FConnected then
+ Connected := true;
+ if FConnected then
+ begin
+ SQLite3_GetTable(DBHandle, PAnsiChar(
+ 'PRAGMA index_list("' + TableName + '");'),
+ ResultPtr, RowCount, ColCount, ErrMsg);
+
+ ResultStr := ResultPtr;
+ List.Clear;
+ Inc(ResultStr, 4); // Skip header + 1st col.
+ for i := 1 to RowCount do
+ begin
+ List.Insert(0, PAnsiChar(ResultStr^));
+ Inc(ResultStr, 3);
+ end;
+ if Assigned(ResultPtr) then SQLite3_FreeTable(ResultPtr);
+ end;
+ DebugLeave('TASQLite3DB.GetTableIndexNames');
+end;
+
+procedure TASQLite3DB.DBConnect(Connected: boolean);
+var
+ ErrMsg : PAnsiChar;
+ DBMS : string;
+ rv : integer;
+ i : integer; // GPA
+begin
+ DebugEnter('TASQLite3DB.DBConnect');
+
+// ShowMessage(FCharEnc);
+ if (CompareText(FCharEnc,'utf8')=0) or (FCharEnc='') then
+ FUtf8 := true
+ else
+ FUtf8 := false;
+
+ if (Connected) and (FDatabase = '') then
+ begin
+ DebugLeave('TASQLite3DB.DBConnect Exit');
+ raise AsgError.Create('Missing database property');
+ SQLite3_FreeMem(ErrMsg);
+ FConnected := false;
+ exit;
+ end;
+
+ if not Connected then
+ begin
+ if FConnected then
+ begin
+ if DLLHandle <> 0 then
+ begin
+ Debug('freeing sqlite dll');
+ if Assigned(FBeforeDisconnect) then
+ FBeforeDisconnect(self);
+ // if closed then all Datasets must be closed (GPA)
+ if Assigned(Owner) Then
+ For I:=0 to Owner.ComponentCount-1 do
+ if Owner.Components[I] is TASQLite3BaseQuery Then
+ TASQLite3BaseQuery(Owner.Components[I]).Active:=False;
+
+ if Assigned(@SQLite3_Close) then
+ SQLite3_Close(DBHandle);
+
+ {$IFNDEF SQLite_Static}
+ FreeLibrary(DLLHandle);
+ {$ENDIF}
+
+ DLLHandle := 0;
+ if Assigned(FAfterDisconnect) then
+ FAfterDisconnect(self);
+ end;
+ FConnected := false;
+ DebugLeave('TASQLite3DB.DBConnect');
+ exit;
+ end
+ end
+ else
+ begin
+ if CompareText(':memory:', Database) <> 0 then begin
+ if DefaultDir <> '' then begin
+ if DefaultDir[Length(DefaultDir)] <> '\' then
+ DefaultDir := DefaultDir + '\';
+ DBMS := DefaultDir + Database;
+ end else begin
+ if Pos('\', Database) = 0 then
+ DBMS := GetCurrentDir + '\' + DataBase
+ else
+ DBMS := Database;
+ end;
+
+ if FMustExist then begin
+ if not FileExists(DBMS) then begin
+ DebugLeave('TASQLite3DB.DBConnect ' + 'Database ' + DBMS + ' does not exist');
+ raise EDatabaseError.Create('Database ' + DBMS + ' does not exist');
+ end;
+ end;
+ end else DBMS := Database; // in memory database
+
+ if DLLHandle = 0 then
+ begin
+ if not LoadLibs then
+ begin
+ FConnected := false;
+ DebugLeave('TASQLite3DB.DBConnect ' + 'Could Not load SQLite Library');
+ raise AsgError.Create('Could not load SQLite library');
+ end;
+ end;
+
+ FConnected := true;
+ FVersion := SQLite3_LibVersion;
+
+ DBHandle := nil;
+ ErrMsg := nil;
+ if Assigned(FBeforeConnect) then
+ FBeforeConnect(self);
+
+{$IFDEF ASQLITE_D6PLUS}
+ if Assigned(@SQLite3_Open) then
+ if FVersion > '3.2.5' then
+ rv := SQLite3_Open(PAnsiChar(AnsiToUTF8(DBMS)), DBHandle)
+ else
+{$endif}
+ rv := SQLite3_Open(PAnsiChar(DBMS), DBHandle);
+
+ if Assigned(FAfterConnect) then
+ FAfterConnect(self);
+
+ if DBHandle = nil then
+ FConnected := false;
+
+ if Assigned(FASQLitePragma) then
+ ExecPragma;
+
+ FLastError := ErrMsg;
+ if ErrMsg <> nil then
+ SQLite3_FreeMem(ErrMsg);
+ // GPA Added to execute InlineSQL in case of use Connected:=True instead of Open
+ if ExecuteInlineSQL and Assigned(FInlineSQL) then Try // GPA
+ ExecStartTransaction(''); // GPA
+ SQLite3_ExecSQL(FInlineSQL.FSQL.Text); // GPA
+ Commit; // GPA
+ finally // GPA
+ ExecuteInlineSQL:=False; //GPA Assure just one execution in case of reopen
+ end; // GPA
+ end;
+ DebugLeave('TASQLite3DB.DBConnect');
+end;
+
+function TASQLite3DB.RowsAffected: integer;
+begin
+ DebugEnter('TASQLite3DB.RowsAffected');
+ if not FConnected then
+ Result := -1
+ else
+ Result := SQLite3_Changes(DBHandle);
+ DebugLeave('TASQLite3DB.RowsAffected');
+end;
+
+//------------------------------------------------------------------------------
+// By Ralf, The Delphi Inspiration
+//------------------------------------------------------------------------------
+
+function TableExistsCallback(UserData: Pointer; ColumnCount: Integer; ColumnValues, ColumnNames: PPointer): Integer; cdecl;
+begin
+ if AnsiStrIComp(UserData, ColumnValues^) <> 0 then
+ Result := 0
+ else
+ Result := 1; // Abort
+end;
+
+//------------------------------------------------------------------------------
+
+function TASQLite3DB.TableExists(const ATableName: AnsiString): Boolean;
+var
+ ErrMsg: PAnsiChar;
+begin
+ try
+ { No WHERE clause is used in the SQL statement below.
+ Instead, the callback function compares without case sensitivity. }
+ Result := SQLite3_Exec(DBHandle, 'SELECT name FROM sqlite_master',
+ TableExistsCallback,Pointer(ATableName), ErrMsg) = SQLITE_ABORT;
+ finally
+ if ErrMsg <> nil then
+ begin
+ SQLite3_FreeMem(ErrMsg);
+ ShowError;
+ end;
+ end;
+end;
+
+//------------------------------------------------------------------------------
+procedure TASQLite3DB.ExecStartTransaction(TransType: string);
+begin
+// if no transaction type available then use default from asqlitedb
+ if (TransType = '') then TransType := FTransactionType;
+
+ if ((TransType = '') or (CompareText(TransType, 'DEFAULT') = 0)) then StartTransaction
+ else if (CompareText(TransType, 'DEFERRED') = 0) then StartDeferredTransaction
+ else if (CompareText(TransType, 'IMMEDIATE') = 0) then StartImmediateTransaction
+ else if (CompareText(TransType, 'EXCLUSIVE') = 0) then StartExclusiveTransaction
+ else StartTransaction;
+end;
+
+procedure TASQLite3DB.StartTransaction;
+begin
+ DebugEnter('TASQLite3DB.StartTransaction');
+ if not FConnected then // open database if necessary
+ Connected := true; // trigger the 'dbconnect' event
+ if FConnected then SQLite3_ExecSQL('begin transaction');
+ DebugLeave('TASQLite3DB.StartTransaction');
+end;
+
+procedure TASQLite3DB.StartDeferredTransaction;
+begin
+ if not FConnected then // open database if necessary
+ Connected := true; // trigger the 'dbconnect' event
+ if FConnected then SQLite3_ExecSQL('begin deferred transaction');
+end;
+
+procedure TASQLite3DB.StartImmediateTransaction;
+begin
+ if not FConnected then // open database if necessary
+ Connected := true; // trigger the 'dbconnect' event
+ if FConnected then SQLite3_ExecSQL('begin immediate transaction');
+end;
+
+procedure TASQLite3DB.StartExclusiveTransaction;
+begin
+ if not FConnected then // open database if necessary
+ Connected := true; // trigger the 'dbconnect' event
+ if FConnected then SQLite3_ExecSQL('begin exclusive transaction');
+end;
+
+procedure TASQLite3DB.Open;
+begin
+ DebugEnter('TASQLite3DB.Open');
+ Connected := true;
+
+ if DLLHandle = 0 then
+ Connected := false;
+
+ DebugLeave('TASQLite3DB.Open');
+end;
+
+procedure TASQLite3DB.Close;
+begin
+ DebugEnter('TASQLite3DB.Close');
+ Connected := false;
+ DebugLeave('TASQLite3DB.Close');
+end;
+
+procedure TASQLite3DB.ExecPragma;
+var
+ Cmd : string;
+begin
+ DebugEnter('TASQLite3DB.ExecPragma');
+ if not FConnected then
+ Connected := true;
+ if FConnected then
+ begin
+ if FASQLitePragma.FTempCacheSize <> 0 then
+ begin
+ cmd := FASQLitePragma.GetTempCacheSize;
+ SQLite3_ExecSQL(cmd);
+ end;
+ if FASQLitePragma.FDefaultCacheSize <> 0 then
+ begin
+ cmd := FASQLitePragma.GetDefaultCacheSize;
+ SQLite3_ExecSQL(cmd);
+ end;
+
+ if FASQLitePragma.FDefaultSynchronous <> '' then
+ begin
+ cmd := FASQLitePragma.GetDefaultSynchronous;
+ SQLite3_ExecSQL(cmd);
+ end;
+
+ if FASQLitePragma.FDefaultTempStore <> '' then
+ begin
+ cmd := FASQLitePragma.GetDefaultTempStore;
+ SQLite3_ExecSQL(cmd);
+ end;
+
+ if FASQLitePragma.FTempStore <> '' then
+ begin
+ cmd := FASQLitePragma.GetTempStore;
+ SQLite3_ExecSQL(cmd);
+ end;
+
+ if FASQLitePragma.FSynchronous <> '' then
+ begin
+ cmd := FASQLitePragma.GetSynchronous;
+ SQLite3_ExecSQL(cmd);
+ end;
+ end;
+ DebugLeave('TASQLite3DB.ExecPragma');
+end;
+
+procedure TASQLite3DB.Commit;
+begin
+ DebugEnter('TASQLite3DB.Commit');
+ if not FConnected then
+ Connected := true;
+ if FConnected then SQLite3_ExecSQL('commit transaction');
+ DebugLeave('TASQLite3DB.Commit');
+end;
+
+procedure TASQLite3DB.RollBack;
+begin
+ DebugEnter('TASQLite3DB.RollBack');
+ if not FConnected then
+ Connected := true;
+ if FConnected then
+ SQLite3_ExecSQL('rollback transaction');
+ DebugLeave('TASQLite3DB.RollBack');
+end;
+
+constructor TASQLite3DB.Create(AOwner: TComponent);
+//var fn : TextFile;
+begin
+ DebugEnter('TASQLite3DB.Create');
+ Connected := false;
+ ASQLiteLog := nil;
+ ASQLitePragma := nil;
+ inherited Create(AOwner);
+ DebugLeave('TASQLite3DB.Create');
+end;
+
+destructor TASQLite3DB.Destroy;
+//var fn : TextFile;
+begin
+ DebugEnter('TASQLite3DB.Destroy');
+ FConnected := false;
+ ASQLiteLog := nil;
+ ASQLitePragma := nil;
+ inherited Destroy;
+ DebugLeave('TASQLite3DB.Destroy');
+end;
+
+//============================================================================== TASQLite3BaseQuery
+
+function TASQLite3BaseQuery.CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer; //MS
+begin
+ result := sign(integer(Bookmark1^)-integer(Bookmark2^));
+end;
+
+// Is one or more fields a calculated field? (John Lito)
+function TASQLite3BaseQuery.CalcFieldInList(const List: string): Boolean;
+var i: Integer;
+ Fields: TList;
+begin
+ if Pos(';', List) <> 0 then
+ begin
+ Result := False;
+ Fields := TList.Create;
+ try
+ GetFieldList(Fields, List);
+ for i := 0 to Fields.Count - 1 do
+ if TField(Fields[I]).FieldKind in [fkCalculated, fkLookup] then Result := True;
+ finally
+ Fields.Free;
+ end;
+ end else
+ Result := (FieldByName(List).FieldKind in [fkCalculated, fkLookup]);
+end;
+
+function TASQLite3BaseQuery.Lookup(const KeyFields: string; const KeyValues: Variant;
+ const ResultFields: string): Variant;
+var OldState: TDataSetState;
+begin
+ Result := '';
+ if Locate(KeyFields, KeyValues, []) then
+ begin
+ if CalcFieldInList(ResultFields) then GetCalcFields(PChar(FResult.GetData(FCurRec)));
+ OldState := SetTempState(dsFilter);
+ try
+ Result := FieldValues[ResultFields];
+ finally
+ RestoreState(OldState);
+ end;
+ end;
+end;
+
+{
+ support routine for UTF16
+}
+
+procedure TASQlite3BaseQuery.DataConvert(Field: TField; Source, Dest: Pointer;
+ ToNative: Boolean);
+const x: Word = 0;
+var L: Integer;
+begin
+ try
+ case Field.DataType of
+ ftWideString:
+ begin
+ if ToNative then
+ begin
+ L := Length(PWideChar(Source^));
+ if (L <= 0) then
+ Move(x,Dest^,2)
+ else
+ begin
+ if (L <= Field.Size) then
+ Move(PWideChar(Source^)^, Dest^, (L+1)*2)
+ else
+ begin
+ Move(PWideChar(Source^)^, Dest^, Field.Size*2);
+ //Move(x,(PChar(Dest)+Field.Size-(Field.Size mod 2))^,2+(Field.Size mod 2));
+ Move(x, (PChar(Dest)+Field.Size*2 - 2)^, 2);
+ end;
+ end;
+ end
+ else
+ begin
+ WideString(Dest^) := WideString(PWideChar(Source));
+ end;
+ end;//ftWideString
+ else
+ begin
+ inherited DataConvert(Field, Source, Dest, ToNative);
+ end
+ end;//case
+ finally
+ end;
+end;//DataConvert
+
+
+{
+ Register detail dataset for a master-detail relationship
+}
+procedure TASQLite3BaseQuery.RegisterDetailDataset(DetailDataSet: TASQLite3BaseQuery);
+var
+ i : integer;
+begin
+ DebugEnter('TASQLite3BaseQuery.RegisterDetailDataset');
+ try
+ for i := 0 to DetailList.Count - 1 do
+ if DetailList[i] = DetailDataset then exit;
+ DetailList.Add(DetailDataSet);
+ finally
+ DebugLeave('TASQLite3BaseQuery.RegisterDetailDataset');
+ end;
+end;
+
+{ compatibility isue }
+procedure TASQLite3BaseQuery.SQLiteMasterChanged;
+begin
+ DebugEnter('TASQLite3BaseQuery.SQLiteMasterChanged');
+ DebugLeave('TASQLite3BaseQuery.SQLiteMasterChanged');
+end;
+
+{
+ notify that the master has changed and a requery on the detail has
+ to be done
+}
+
+procedure TASQLite3BaseQuery.NotifySQLiteMasterChanged;
+var
+ i : integer;
+begin
+ DebugEnter('TASQLite3BaseQuery.NotifySQLiteMasterChanged');
+ for i := 0 to DetailList.Count - 1 do
+ begin
+ TASQLite3BaseQuery(DetailList[i]).SQLiteMasterChanged;
+ end;
+ DebugLeave('TASQLite3BaseQuery.NotifySQLiteMasterChanged');
+end;
+
+{
+ This function returns a string representing the value of the specified field
+ in SQLite format. Floating point values always use '.' as a decimal separator.
+ Date values use 'yyyy-mm-dd' format, unless SQLiteDateFormat is set to false,
+ which results in using TableDateFormat, or system dependent ShortDateFormat
+ if TableDateFormat is not set. Same goes for DateTime and Time values, for
+ which default formats are 'yyyy-mm-ss hh:nn:ss' and 'hh:nn:ss.zzz', respectively.
+ Setting SQLiteDateFormat to false is discouraged.
+ Result is quoted when necessary.
+}
+// added by Donnie
+
+function TASQLite3BaseQuery.GetFieldValue(const AField: TField; const Blobs: TList = nil): string;
+var
+ MS: TMemoryStream;
+ DateTimeFormat: string;
+begin
+ if (AField.DataSet <> Self) then
+ raise EInvalidArgument.Create('Only own fields are accepted');
+ case AField.DataType of
+ ftString:
+{$IFDEF ASQLITE_D6PLUS}
+ if Connection.FUtf8 then
+ Result := QuotedStr(UTF8Encode(VarToWideStr(AField.Value)))
+ else
+{$endif}
+ Result := QuotedStr(AField.AsString);
+ ftSmallint, ftInteger, ftWord:
+ Result := AField.AsString;
+ ftFloat:
+ if DecimalSeparator <> '.' then
+{$IFDEF ASQLITE_D6PLUS}
+ Result := AnsiReplaceStr(AField.AsString, DecimalSeparator, '.')
+{$else}
+ Result := StringReplace(AField.AsString, DecimalSeparator, '.', [rfReplaceAll])
+{$endif}
+ else
+ Result := AField.AsString;
+ ftDate: begin
+ if FSQLiteDateFormat then
+ DateTimeFormat := 'yyyy"-"mm"-"dd'
+ else if TableDateFormat <> '' then
+ DateTimeFormat := TableDateFormat
+ else
+ DateTimeFormat := ShortDateFormat;
+ Result := QuotedStr(FormatDateTime(DateTimeFormat, AField.AsDateTime));
+ end;
+ ftDateTime: begin
+ if FSQLiteDateFormat then
+ DateTimeFormat := 'yyyy"-"mm"-"dd" "hh":"nn":"ss"."zzz'
+ else if TableDateFormat <> '' then
+ DateTimeFormat := TableDateFormat
+ else
+ DateTimeFormat := ShortDateFormat + '" "' + LongTimeFormat;
+ Result := QuotedStr(FormatDateTime(DateTimeFormat, AField.AsDateTime));
+ end;
+ ftTime: begin
+ if FSQLiteDateFormat then
+ DateTimeFormat := 'hh":"nn":"ss"."zzz'
+ else if TableDateFormat <> '' then
+ DateTimeFormat := TableDateFormat
+ else
+ DateTimeFormat := LongTimeFormat;
+ Result := QuotedStr(FormatDateTime(DateTimeFormat, AField.AsDateTime));
+ end;
+ ftBlob, ftGraphic, ftMemo, ftFmtMemo: begin
+ if Blobs = nil then
+ raise EInvalidArgument.Create('No place to store a blob field');
+ MS := TMemoryStream.Create;
+ TBlobField(AField).SaveToStream(MS);
+ Result := #2 + IntToStr(1 + Blobs.Add(MS));
+ end
+ else
+ Result := QuotedStr(AField.AsString);
+ end;
+end; // GetFieldValue
+
+{
+ Unpack the buffer (if necessary) and convert it to a valid representation
+ this is necessary for sqlite since it it typeless. If typed has been
+ defined then the fields have to be converted to the appropiate datatype
+}
+
+function TASQLite3BaseQuery.UnpackBuffer(Buffer: PAnsiChar; FieldType: TFieldType): TConvertBuffer;
+var
+ TempInt : integer;
+ TempDouble : double;
+ TempBool : wordbool;
+ TempT : TDateTimeRec;
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLite3BaseQuery.UnpackBuffer: ' + Buffer);
+{$ENDIF}
+ case FieldType of
+ ftString:
+ begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLite3BaseQuery.UnpackBuffer');
+{$ENDIF}
+ exit;
+ end;
+ ftInteger, ftSmallInt:
+ begin
+ TempInt := StrToIntX(Buffer);
+ Move(TempInt, result, sizeof(TempInt));
+ end;
+ ftTime:
+ begin
+ TempT := DateTimeToNative(FieldType, StrToDateTimeX(Buffer));
+ Move(TempT, result, sizeof(TDateTime));
+ end;
+ ftDate:
+ begin
+ TempT := DateTimeToNative(FieldType, StrToDateTimeX(Buffer));
+ Move(TempT, result, sizeof(TDateTime));
+ end;
+ ftDateTime:
+ begin
+ if FSQLiteDateFormat then // aducom
+ TempT := DateTimeToNative(FieldType, YYYYMMDDParser(Buffer)) // jpierce
+ else
+ TempT := DateTimeToNative(FieldType, StrToDateTimeX(Buffer));
+ Move(TempT, result, sizeof(TDateTime));
+ end;
+ ftFloat, ftBCD, ftCurrency:
+ begin
+ TempDouble := StrToFloatX(FloatParser(Buffer));
+ Move(TempDouble, result, sizeof(TempDouble));
+ end;
+
+{$IFDEF ASQLITE_D6PLUS}
+ ftBoolean:
+ begin
+ TempBool := StrToBool(Buffer);
+ Move(TempBool, result, sizeof(TempBool));
+ end;
+{$ENDIF}
+ ftMemo, ftGraphic, ftBlob, ftFMTMemo: // pointer to stream
+ begin
+ TempInt := StrToInt(Buffer);
+ Move(TempInt, result, sizeof(TempInt));
+ end;
+ end;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLite3BaseQuery.UnpackBuffer');
+{$ENDIF}
+end;
+
+{ This method is called by TDataSet.Open and also when FieldDefs need to
+ be updated (usually by the DataSet designer). Everything which is
+ allocated or initialized in this method should also be freed or
+ uninitialized in the InternalClose method. }
+
+constructor TASQLite3BaseQuery.Create(AOwner: TComponent);
+begin
+ DebugEnter('TASQLite3BaseQuery.Create');
+ MaxStrLen := 0;
+ FSQL := TStringList.Create;
+ FParams := TParams.Create(Self);
+ DetailList := TList.Create;
+ FConnection := nil;
+ FResult := nil;
+ GetMem(ResultStr, MaxBuf);
+ SQLCursor := true;
+ SQLiteDateFormat := true;
+ TypeLess := false;
+ ReadOnly := false;
+ inherited;
+ DebugLeave('TASQLite3BaseQuery.Create');
+end;
+
+function TASQLite3BaseQuery.CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream;
+begin
+ Result := TASQLite3BlobStream.Create(Field as TBlobField, Mode);
+end;
+
+destructor TASQLite3BaseQuery.Destroy;
+begin
+ DebugEnter('TASQLite3BaseQuery.Destroy');
+// Close;
+// inherited Destroy;
+
+ if Assigned(FSQL) then begin
+ TStringList(FSQL).OnChange := nil;
+ FSQL.Free;
+ end;
+ FSQL := nil;
+
+ if Assigned(FParams) then
+ begin
+ FParams.Free;
+ FParams := nil;
+ end;
+
+ if Assigned(DetailList) then
+ DetailList.Free;
+ DetailList := nil;
+
+ if Assigned(FConnection) then
+ FConnection := nil;
+
+ if Assigned(ResultStr) then
+ FreeMem(ResultStr);
+ ResultStr := nil;
+
+ if Assigned(FResult) then
+ FResult.Free;
+ FResult := nil;
+
+ inherited;
+ DebugLeave('TASQLite3BaseQuery.Destroy');
+end;
+
+procedure TASQLite3BaseQuery.StartTransaction;
+begin
+ if Assigned(FConnection) then
+ FConnection.ExecStartTransaction(FTransActionType);
+end;
+
+procedure TASQLite3BaseQuery.StartDeferredTransaction;
+begin
+ if Assigned(FConnection) then
+ FConnection.StartDeferredTransaction;
+end;
+
+procedure TASQLite3BaseQuery.StartImmediateTransaction;
+begin
+ if Assigned(FConnection) then
+ FConnection.StartImmediateTransaction;
+end;
+
+procedure TASQLite3BaseQuery.StartExclusiveTransaction;
+begin
+ if Assigned(FConnection) then
+ FConnection.StartExclusiveTransaction;
+end;
+
+procedure TASQLite3BaseQuery.Commit;
+begin
+ if Assigned(FConnection) then
+ FConnection.Commit;
+end;
+
+procedure TASQLite3BaseQuery.RollBack;
+begin
+ if Assigned(FConnection) then
+ FConnection.RollBack;
+end;
+
+//function TASQLite3BaseQuery.LocateNearest(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean;
+ //begin
+ //end;
+
+// implementation by J Bannon, implementing partial key too.
+function TASQLite3BaseQuery.Locate(const KeyFields: string;
+ const KeyValues: variant; Options: TLocateOptions): boolean;
+//loCaseInsensitive, loPartialKey
+var
+ bOk : boolean;
+ i, j, p : integer;
+ Fields, SearchValue: string; //Variable SearchValue added by bobmitch
+ FieldList : TStringList;
+ DebugStr : string;
+ DoEnableControls : boolean;
+begin
+ DebugEnter('TASQLite3BaseQuery.Locate ' + Keyfields);
+ DoEnableControls := not ControlsDisabled; {used to determine whether to EnableControls at end of function}
+ DisableControls;
+ FieldList := TStringList.Create;
+ bOk := false;
+ try
+ Fields := KeyFields;
+ p := pos(';', Fields);
+ while p > 0 do
+ begin
+ FieldList.Add(Copy(Fields, 1, p - 1));
+ System.Delete(Fields, 1, p);
+ p := pos(';', Fields);
+ end;
+ if Fields <> '' then
+ FieldList.Add(Fields);
+
+ First;
+ for i := 1 to FResult.Data.Count do
+ begin
+ SetRecNo(i);
+ bOk := true;
+ for j := 0 to FieldList.Count - 1 do
+ begin
+ if loCaseInsensitive in Options then
+ begin
+ if FieldList.Count = 1 then
+ begin //Lines 2303 - 2338 by bobmitch, replaces original lines 2303 - 2336
+ SearchValue := VarToStr(KeyValues);
+ if (loPartialKey in Options) and (Length(SearchValue) <= Length(FieldByName(FieldList[j]).AsString)) then
+ bOk := CompareText(Copy(FieldByName(FieldList[j]).AsString, 1, Length(SearchValue)), SearchValue) = 0
+ else
+ bOk := CompareText(FieldByName(FieldList[j]).AsString, SearchValue) = 0
+ end {end loCaseInsensitive in Options AND FieldList.Count = 1}
+ else
+ begin
+ SearchValue := VarToStr(KeyValues[j]);
+ if (loPartialKey in Options) and (Length(SearchValue) <= Length(FieldByName(FieldList[j]).AsString)) then
+ bOk := CompareText(Copy(FieldByName(FieldList[j]).AsString, 1, Length(SearchValue)), SearchValue) = 0
+ else
+ bOk := CompareText(FieldByName(FieldList[j]).AsString, SearchValue) = 0
+ end {end loCaseInsensitive in Options AND FieldList.Count greater than 1}
+ end {end loCaseInsensitive in Options}
+ else
+ begin {begin loCaseInsensitive NOT in Options}
+ if FieldList.Count = 1 then
+ begin
+ SearchValue := VarToStr(KeyValues);
+ if (loPartialKey in Options) and (Length(SearchValue) <= Length(FieldByName(FieldList[j]).AsString)) then
+ bOk := Copy(FieldByName(FieldList[j]).AsString, 1, Length(SearchValue)) = SearchValue
+ else
+ bOk := FieldByName(FieldList[j]).AsString = SearchValue
+ end {end loCaseInsensitive NOT in Options AND FieldList.Count = 1}
+ else
+ begin
+ SearchValue := VarToStr(KeyValues[j]);
+ if (loPartialKey in Options) and (Length(SearchValue) <= Length(FieldByName(FieldList[j]).AsString)) then
+ bOk := Copy(FieldByName(FieldList[j]).AsString, 1, Length(SearchValue)) = SearchValue
+ else
+ bOk := FieldByName(FieldList[j]).AsString = SearchValue
+ end; {end loCaseInsensitive NOT in Options AND FieldList.Count greater than 1}
+ end; {end loCaseInsensitive NOT in Options}
+ if bOk = false then
+ break;
+ end; {end for j := 0 to FieldList.Count - 1}
+ if bOk then
+ begin
+ break;
+ end;
+ end; {end for i := 1 to FResult.Data.Count}
+ if bOk then
+ begin
+ Locate := true;
+ DebugStr := 'TASQLite3BaseQuery.Locate true';
+ end
+ else
+ begin
+ Locate := false;
+ DebugStr := 'TASQLite3BaseQuery.Locate false';
+ end;
+ finally
+ FieldList.Free;
+ if DoEnableControls then {restore original state of the controls}
+ EnableControls;
+ DebugLeave(DebugStr);
+ end;
+end;
+
+
+function TASQLite3BaseQuery.GetDataSource: TDataSource;
+
+begin
+ DebugEnter('TASQLite3BaseQuery.GetDataSource');
+ Result := FMasterSource;
+ DebugLeave('TASQLite3BaseQuery.GetDataSource');
+end;
+
+procedure TASQLite3BaseQuery.SetSQLiteDateFormat(const Value: boolean);
+begin
+ FSQLiteDateFormat := Value;
+end;
+
+procedure TASQLite3BaseQuery.SetDataSource(Value: TDataSource);
+begin
+ DebugEnter('TASQLite3BaseQuery.SetDataSource');
+ if IsLinkedTo(Value) then
+ DatabaseError('circular references are not allowed', Self);
+ FMasterSource := Value;
+ DebugLeave('TASQLite3BaseQuery.SetDataSource');
+end;
+
+function TASQLite3BaseQuery.GetMasterFields: string;
+begin
+ DebugEnter('TASQLite3BaseQuery.GetMasterFields');
+ Result := FMasterFields; //FMasterLink.FieldNames;
+ DebugLeave('TASQLite3BaseQuery.GetMasterFields');
+end;
+
+procedure TASQLite3BaseQuery.SetMasterFields(const Value: string);
+begin
+ DebugEnter('TASQLite3BaseQuery.SetMasterFields ' + Value);
+ FMasterFields := Value; // FMasterLink.FieldNames := Value;
+ DebugLeave('TASQLite3BaseQuery.SetMasterFields');
+end;
+ //Checks the State and Results a defined Buffer;
+
+function TASQLite3BaseQuery.GetActiveBuffer(var Buffer: PAnsiChar): boolean;
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLite3BaseQuery.GetActiveBuffer');
+{$ENDIF}
+ case State of
+ dsBrowse: if IsEmpty then
+ Buffer := nil
+ else
+ Buffer := ActiveBuffer;
+
+ dsEdit: Buffer := ActiveBuffer;
+ dsInsert: Buffer := ActiveBuffer;
+ dsFilter: Buffer := ActiveBuffer; //FFilterBuffer;
+ dsCalcFields: Buffer := CalcBuffer;
+ else
+ Buffer := nil;
+ end;
+ Result := Buffer <> nil;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLite3BaseQuery.GetActiveBuffer ' + PAnsiChar(Buffer));
+{$ENDIF}
+end;
+
+function TASQLite3BaseQuery.GetNativeFieldSize(FieldNo: integer): integer;
+begin
+ DebugEnter('TASQLite3BaseQuery.GetNativeFieldSize');
+ Result := 0;
+ case FieldDefs.Items[FieldNo - 1].Datatype of
+ ftString: Result := FieldDefs.Items[FieldNo - 1].Size + 1;
+ ftWideString: Result := FieldDefs.Items[FieldNo - 1].Size + 1;
+ ftInteger, ftSmallInt, ftDate, ftTime: Result := 12;
+ ftDateTime: Result := 20;
+ ftFloat, ftBCD, ftCurrency: Result := 12;
+ ftBoolean: Result := 12;
+ ftGraphic, ftMemo, ftBlob, ftFmtMemo: Result := 12; // space for memory handles
+ else
+ raise AsgError.Create('Fieldtype of Field "' + FieldDefs.Items[FieldNo - 1].Name +
+ '" not supported!');
+ end;
+ DebugLeave('TASQLite3BaseQuery.GetNativeFieldSize');
+end;
+
+function TASQLite3BaseQuery.GetFieldSize(FieldNo: integer): integer;
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLite3BaseQuery.GetFieldSize');
+{$ENDIF}
+ // try
+ Result := 0;
+ case FieldDefs.Items[FieldNo - 1].Datatype of
+ ftString: Result := FieldDefs.Items[FieldNo - 1].Size+ 1 ; // GPA - Warning UTF-8 length can be potentially > Ansi length
+ ftWideString: Result := FieldDefs.Items[FieldNo - 1].Size+ 1 ;
+ ftInteger, ftSmallInt, ftDate, ftTime: Inc(Result, sizeof(integer));
+ ftDateTime: Inc(Result, sizeof(TDateTime));
+ ftFloat, ftBCD, ftCurrency: Inc(Result, sizeof(double));
+ ftBoolean: Inc(Result, sizeof(wordbool));
+ ftGraphic, ftMemo, ftBlob, ftFmtMemo: Inc(Result, sizeof(pointer));
+ else
+ raise AsgError.Create('Fieldtype of Field "' + FieldDefs.Items[FieldNo - 1].Name +
+ '" not supported!');
+ end;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLite3BaseQuery.GetFieldSize');
+{$ENDIF}
+end;
+
+function TASQLite3BaseQuery.GetFieldSize(Field: TField): integer;
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLiteBaseQuery.GetFieldSize');
+{$ENDIF}
+ // try
+ Result := 0;
+ case Field.DataType of
+ ftString: Result := Field.Size + 1;
+ ftWideString: Result := Field.Size + 1;
+ ftInteger, ftSmallInt, ftDate, ftTime: Inc(Result, sizeof(integer));
+ ftDateTime: Inc(Result, sizeof(TDateTime));
+ ftFloat, ftBCD, ftCurrency: Inc(Result, sizeof(double));
+ ftBoolean: Inc(Result, sizeof(wordbool));
+ ftGraphic, ftMemo, ftBlob, ftFmtMemo: Inc(Result, sizeof(pointer));
+ else
+ raise AsgError.Create('Fieldtype of Field "' + Field.FieldName +
+ '" not supported!');
+ end;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLiteBaseQuery.GetFieldSize');
+{$ENDIF}
+end;
+
+function TASQLite3BaseQuery.GetFieldOffset(FieldNo: integer): integer;
+var
+ i : integer;
+ Offset : integer;
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLite3BaseQuery.GetFieldOffset');
+{$ENDIF}
+ Offset := 0;
+ if FieldNo > 1 then
+ begin
+ for i := 1 to FieldNo - 1 do
+ OffSet := OffSet + GetFieldSize(i);
+ end;
+ GetFieldOffset := Offset;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLite3BaseQuery.GetFieldOffset');
+{$ENDIF}
+end;
+
+function TASQLite3BaseQuery.GetCalcFieldOffset(Field: TField): integer;
+var
+ i : integer;
+ Offset : integer;
+begin
+
+// calcfieldoffset is appended to record (after bookmarkinfo)
+
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLiteBaseQuery.GetCalcFieldOffset');
+{$ENDIF}
+ Offset := FRecBufSize + sizeof(TRecInfo); // startlocation of offsetbuffer
+ for i := 0 to FieldList.Count - 1 do begin
+ if CompareText(FieldList[i].FieldName, Field.FieldName) = 0 then begin
+ GetCalcFieldOffset := Offset;
+ exit;
+ end;
+ if FieldList[i].Calculated then
+ OffSet := OffSet + GetFieldSize(Field);
+ end;
+ GetCalcFieldOffset := Offset;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLiteBaseQuery.GetCalcFieldOffset');
+{$ENDIF}
+end;
+
+procedure TASQLite3BaseQuery.SetSQL(const Value: TStrings);
+begin
+ DebugEnter('TASQLite3BaseQuery.SetSQL');
+ Close;
+ if Assigned(FSQL) then
+ FSQL.Assign(Value)
+ else
+ FSQL := Value;
+ DebugLeave('TASQLite3BaseQuery.SetSQL');
+end;
+
+procedure TASQLite3BaseQuery.LoadQueryData;
+begin
+ DebugEnter('TASQLite3BaseQuery.LoadQueryData');
+ if Connection.FConnected then begin
+ Connection.SQLite3_execute(Connection.DBHandle, PAnsiChar(FPrepared), FParams, self);
+ end;
+ DebugLeave('TASQLite3BaseQuery.LoadQueryData');
+end;
+
+procedure TASQLite3BaseQuery.InternalOpen;
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalOpen');
+{$IFDEF ASQLITE_D6PLUS}
+ if UniDirectional then
+ SetUnidirectional(true)
+ else
+ SetUniDirectional(false);
+{$endif}
+ MaxStrLen := 0;
+ if (Connection = nil) then
+ begin // check to see if a valid database
+ raise AsgError.Create('no database connection');
+ end
+ else
+ begin
+
+ if Connection.Connected = false then // open database if necessary
+ Connection.Connected := true; // trigger the 'dbconnect' event
+
+ if (Connection.Connected) and (Connection.DLLHandle <> 0) then
+ if Assigned(MasterSource) then
+ begin // notify master about existance!
+ if (MasterSource.DataSet <> nil) then
+ begin
+ if CompareText(Copy(MasterSource.DataSet.ClassName, 1, 9), 'TASQLite3') = 0 then
+ begin
+ TASQLite3BaseQuery(MasterSource.DataSet).RegisterDetailDataset(
+ TASQLite3BaseQuery(Self));
+ end
+ else
+ begin
+ raise AsgError.Create('master dataset ' + MasterSource.DataSet.ClassName +
+ ' is not of TSQLiteBaseQuery type');
+ DebugLeave('TASQLite3BaseQuery.InternalOpen');
+ exit;
+ end;
+ end
+ else
+ begin
+ raise AsgError.Create('master dataset undefined');
+ DebugLeave('TASQLite3BaseQuery.InternalOpen');
+ exit;
+ end;
+ end;
+
+ if not FUniDir then begin
+ { Load the result into a resultlist }
+ FResult := TFResult.Create(Self);
+ LoadQueryData;
+ end else begin
+ FResult := TFResult.Create(Self);
+ FStatement := Connection.SQLite3_PrepareResult(Connection.DBHandle, PAnsiChar(FPrepared),FParams, self);
+// ptr := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams,self);
+ end;
+
+ { Initialize our internal position.
+ We use -1 to indicate the "crack" before the first record. }
+ FCurRec := -1;
+
+ { Initialize an offset value to find the TRecInfo in each buffer }
+ FRecInfoOfs := MaxStrLen;
+
+ { Calculate the size of the record buffers.
+ Note: This is NOT the same as the RecordSize property which
+ only gets the size of the data in the record buffer }
+ FRecBufSize := FRecInfoOfs + SizeOf(TRecInfo);
+
+ { Tell TDataSet how big our Bookmarks are (REQUIRED) }
+ BookmarkSize := SizeOf(integer);
+
+ { Initialize the FieldDefs }
+ InternalInitFieldDefs;
+
+ { Create TField components when no persistent fields have been created }
+ if DefaultFields then
+ CreateFields;
+
+ { Bind the TField components to the physical fields }
+ BindFields(true);
+
+ end;
+ DebugLeave('TASQLite3BaseQuery.InternalOpen');
+end;
+
+procedure TASQLite3BaseQuery.InternalClose;
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalClose');
+
+ if (FUniDir) and (FStatement <> nil) and (active) then begin
+ Connection.SQLite3_CloseResult(FStatement);
+ FStatement := nil;
+ end;
+
+ if Assigned(FResult) then
+ begin
+ FResult.Free;
+ FResult := nil;
+ end;
+
+ { Destroy the TField components if no persistent fields }
+ if DefaultFields then
+ DestroyFields;
+
+ { Reset these internal flags }
+ // FLastBookmark := 0;
+ FCurRec := -1;
+ DebugLeave('TASQLite3BaseQuery.InternalClose');
+end;
+
+{ This property is used while opening the dataset.
+ It indicates if data is available even though the
+ current state is still dsInActive. }
+
+function TASQLite3BaseQuery.IsCursorOpen: boolean;
+begin
+ Result := Assigned(FResult);
+end;
+
+procedure TASQLite3BaseQuery.OpenCursor(InfoQuery: Boolean);
+begin
+ if InfoQuery then
+ Begin
+ if Assigned(FConnection) Then Begin
+ InternalOpen;
+ InternalClose;
+ End;
+ End
+ else if State <> dsOpening then
+ inherited OpenCursor(InfoQuery);
+end;
+
+procedure TASQLite3BaseQuery.InternalInitFieldDefs;
+begin
+// Just here for compatibility
+end;
+
+{ This is the exception handler which is called if an exception is raised
+ while the component is being stream in or streamed out. In most cases this
+ should be implemented useing the application exception handler as follows. }
+
+procedure TASQLite3BaseQuery.InternalHandleException;
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalHandleException');
+ ApplicationHandleException(Self);
+ DebugLeave('TASQLite3BaseQuery.InternalHandleException');
+end;
+
+ { Bookmarks }
+ { ========= }
+
+{ In this sample the bookmarks are stored in the Object property of the
+ TStringList holding the data. Positioning to a bookmark just requires
+ finding the offset of the bookmark in the TStrings.Objects and using that
+ value as the new current record pointer. }
+
+procedure TASQLite3BaseQuery.InternalGotoBookmark(Bookmark: Pointer);
+var
+ Index : integer;
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalGotoBookmark');
+// inherited;
+ Index := FResult.IndexOf(TObject(PInteger(Bookmark)^));
+ if Index <> -1 then
+ FCurRec := Index
+ else
+ if not FUniDir then DatabaseError('Bookmark not found');
+ DebugLeave('TASQLite3BaseQuery.InternalGotoBookmark');
+end;
+
+function TASQLite3BaseQuery.BookmarkValid(Bookmark: Pointer): boolean;
+var
+ Index : integer;
+begin
+ DebugEnter('TASQLite3BaseQuery.BookmarkValid');
+ Index := FResult.IndexOf(TObject(PInteger(Bookmark)^));
+ if Index <> -1 then
+ BookmarkValid := true
+ else
+ BookmarkValid := false;
+ DebugLeave('TASQLite3BaseQuery.BookmarkValid');
+end;
+
+{ This function does the same thing as InternalGotoBookmark, but it takes
+ a record buffer as a parameter instead }
+
+procedure TASQLite3BaseQuery.InternalSetToRecord(Buffer: PAnsiChar);
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalSetToRecord');
+ InternalGotoBookmark(@PRecInfo(Buffer + FRecInfoOfs).Bookmark);
+// NotifySQLiteMasterChanged;
+ DebugLeave('TASQLite3BaseQuery.InternalSetToRecord');
+end;
+
+{ Bookmark flags are used to indicate if a particular record is the first
+ or last record in the dataset. This is necessary for "crack" handling.
+ If the bookmark flag is bfBOF or bfEOF then the bookmark is not actually
+ used; InternalFirst, or InternalLast are called instead by TDataSet. }
+
+function TASQLite3BaseQuery.GetBookmarkFlag(Buffer: PAnsiChar): TBookmarkFlag;
+begin
+ DebugEnter('TASQLite3BaseQuery.GetBookmarkFlag');
+ Result := PRecInfo(Buffer + FRecInfoOfs).BookmarkFlag;
+ DebugLeave('TASQLite3BaseQuery.GetBookmarkFlag');
+end;
+
+procedure TASQLite3BaseQuery.SetBookmarkFlag(Buffer: PAnsiChar; Value: TBookmarkFlag);
+begin
+ DebugEnter('TASQLite3BaseQuery.SetBookmarkFlag');
+ PRecInfo(Buffer + FRecInfoOfs).BookmarkFlag := Value;
+ DebugLeave('TASQLite3BaseQuery.SetBookmarkFlag');
+end;
+
+{ These methods provide a way to read and write bookmark data into the
+ record buffer without actually repositioning the current record }
+
+procedure TASQLite3BaseQuery.GetBookmarkData(Buffer: PAnsiChar; Data: Pointer);
+begin
+ DebugEnter('TASQLite3BaseQuery.GetBookmarkData');
+ PInteger(Data)^ := PRecInfo(Buffer + FRecInfoOfs).Bookmark;
+ DebugLeave('TASQLite3BaseQuery.GetBookmarkData');
+end;
+
+procedure TASQLite3BaseQuery.SetBookmarkData(Buffer: PAnsiChar; Data: Pointer);
+begin
+ DebugEnter('TASQLite3BaseQuery.SetBookmarkData');
+ PRecInfo(Buffer + FRecInfoOfs).Bookmark := PInteger(Data)^;
+ DebugLeave('TASQLite3BaseQuery.SetBookmarkData');
+end;
+
+ { Record / Field Access }
+ { ===================== }
+
+{ This method returns the size of just the data in the record buffer.
+ Do not confuse this with RecBufSize which also includes any additonal
+ structures stored in the record buffer (such as TRecInfo). }
+
+function TASQLite3BaseQuery.GetRecordSize: word;
+begin
+ DebugEnter('TASQLite3BaseQuery.GetRecordSize');
+ Result := MaxStrLen;
+ DebugLeave('TASQLite3BaseQuery.GetRecordSize');
+end;
+
+{ TDataSet calls this method to allocate the record buffer. Here we use
+ FRecBufSize which is equal to the size of the data plus the size of the
+ TRecInfo structure. }
+
+function TASQLite3BaseQuery.AllocRecordBuffer: PAnsiChar;
+begin
+ DebugEnter('TASQLiteBaseQuery.AllocRecordBuffer');
+ GetMem(Result, FRecBufSize + CalcFieldsSize + sizeof(TRecinfo) + 5);
+ FillChar(Result^, FRecBufSize + CalcFieldsSize + sizeof(TRecinfo) + 5, 0);
+// FillChar(Result^, GetRecordSize+CalcFieldsSize+10, 0);
+ DebugLeave('TASQLiteBaseQuery.AllocRecordBuffer');
+end;
+
+{ Again, TDataSet calls this method to free the record buffer.
+ Note: Make sure the value of FRecBufSize does not change before all
+ allocated buffers are freed. }
+
+procedure TASQLite3BaseQuery.FreeRecordBuffer(var Buffer: PAnsiChar);
+begin
+ DebugEnter('TASQLiteBaseQuery.FreeRecordBuffer');
+ try FreeMem(Buffer); //, FRecBufSize+CalcFieldsSize+sizeof(TRecinfo));
+ except end;
+// Buffer := nil;
+ DebugLeave('TASQLiteBaseQuery.FreeRecordBuffer');
+end;
+
+{ This multi-purpose function does 3 jobs. It retrieves data for either
+ the current, the prior, or the next record. It must return the status
+ (TGetResult), and raise an exception if DoCheck is True. }
+
+function TASQLite3BaseQuery.GetRecord(Buffer: PAnsiChar; GetMode: TGetMode;
+ DoCheck: boolean): TGetResult;
+var
+ ptr : pointer;
+begin
+ DebugEnter('TASQLite3BaseQuery.GetRecord');
+// if Active then CheckBrowseMode;
+ if (not (FUniDir)) and (FResult.Count < 1) then
+ Result := grEOF
+ else
+ begin
+ Result := grOK;
+ case GetMode of
+ gmNext:
+ if FUniDir then begin
+// ptr := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams,self);
+// if ptr <> nil then
+// Move(ptr^, Buffer^, MaxStrLen)
+// else
+// Result := grEOF;
+ end else begin
+ if FCurRec >= RecordCount - 1 then
+ Result := grEOF
+ else
+ Inc(FCurRec);
+ end;
+ gmPrior: begin
+ if FUniDir then
+// Result := grOK
+ raise AsgError.Create('operation PRIOR not allowed on unidirectional dataset')
+ else begin
+ if FCurRec <= 0 then
+ Result := grBOF
+ else
+ Dec(FCurRec);
+ end;
+ end;
+ gmCurrent:
+ begin
+ if (FCurRec < 0) or (FCurRec >= RecordCount) then
+ Result := grError;
+ end;
+ end;
+ if Result = grOK then
+ begin
+ if FUniDir then begin
+ ptr := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams,self);
+ if ptr <> nil then begin
+ Move(ptr^, ActiveBuffer^, MaxStrLen);
+ end else Result := grEOF;
+ end else begin
+ ptr := FResult.GetData(FCurRec);
+ if FResult.Count = 0 then
+ InternalInitRecord(Buffer)
+ else
+ if ptr <> nil then Move(ptr^, Buffer^, MaxStrLen); // albert 17/11/2004
+ end;
+
+ with PRecInfo(Buffer + FRecInfoOfs)^ do
+ begin
+ BookmarkFlag := bfCurrent;
+ Bookmark := FResult.GetBookMark(FCurRec);
+ end;
+
+ if CalcFieldsSize > 0 then
+ GetCalcFields(Buffer)
+
+ end
+ else if (Result = grError) and DoCheck then
+ DatabaseError('No Records');
+ end;
+ DebugLeave('TASQLite3BaseQuery.GetRecord: ' + Buffer);
+end;
+
+{ This routine is called to initialize a record buffer. }
+
+procedure TASQLite3BaseQuery.InternalInitRecord(Buffer: PAnsiChar);
+var
+ i : integer;
+ TempT : TDateTimeRec;
+ Stream : TMemoryStream;
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalInitRecord');
+
+ for i := 0 to FieldDefs.Count - 1 do
+ begin
+ if not (Fields[i].Calculated) then begin
+ case FieldDefs.Items[i].Datatype of
+ ftMemo, ftGraphic, ftBlob, ftFmtMemo: begin
+ Stream := TMemoryStream.Create;
+ Move(Pointer(Stream), (Buffer + GetFieldOffset(i + 1))^, sizeof(Pointer));
+ end;
+ ftString: PAnsiChar(Buffer + GetFieldOffset(i + 1))^ := #0;
+ ftBoolean: pBoolean(Buffer + GetFieldOffset(i + 1))^ := false;
+ ftFloat: pFloat(Buffer + GetFieldOffset(i + 1))^ := 0;
+ ftSmallInt: pSmallInt(Buffer + GetFieldOffset(i + 1))^ := 0;
+ ftInteger: pInteger(Buffer + GetFieldOffset(i + 1))^ := integer(nil);
+ ftCurrency: pFloat(Buffer + GetFieldOffset(i + 1))^ := 0;
+ ftDate:
+ begin
+ TempT := DateTimeToNative(ftDate, now);
+ Move(TempT, (Buffer + GetFieldOffset(i + 1))^, sizeof(TDateTime));
+ end;
+ ftTime:
+ begin
+ TempT := DateTimeToNative(ftTime, now);
+ Move(TempT, (Buffer + GetFieldOffset(i + 1))^, sizeof(TDateTime));
+ end;
+ ftDateTime:
+ begin
+ TempT := DateTimeToNative(ftDateTime, now);
+ Move(TempT, (Buffer + GetFieldOffset(i + 1))^, sizeof(TDateTime));
+ end;
+ end;
+ end;
+ end;
+
+// if FMasterSource <> nil then begin
+// FMasterSource.DataSet.FieldByName()
+// end;
+
+
+ DebugLeave('TASQLite3BaseQuery.InternalInitRecord');
+end;
+
+{ Here we copy the data from the record buffer into a field's buffer.
+ This function, and SetFieldData, are more complex when supporting
+ calculated fields, filters, and other more advanced features.
+ See TBDEDataSet for a more complete example. }
+
+function TASQLite3BaseQuery.GetFieldData(Field: TField; Buffer: Pointer): boolean;
+var
+// SrcBuffer : PAnsiChar;
+ MyBuf : string;
+
+ SrcBuffer : PAnsiChar;
+// MasterField : TField;
+// EqualPos : Integer;
+/// MasterFieldName, DetailFieldName : string;
+
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLite3BaseQuery.GetFieldData');
+{$ENDIF}
+ if Field.FieldNo > 0 then begin
+ // load masterfield data if there's a master-detail relationship
+ // key-data should not be NULL!!
+ if pos(UpperCase(Field.FieldName), UpperCase(FMasterFields)) > 0 then begin
+ MasterSource.DataSet.GetFieldData(Field, Buffer);
+ Result := true;
+ exit;
+ end;
+
+// if FMasterFields <> '' then begin
+// EqualPos := Pos('=',FMasterFields);
+// DetailFieldName := Copy(FMasterFields,1, EqualPos - 1);
+// MasterFieldName := Copy(FMasterFields,EqualPos + 1, Length(FMasterFields) - EqualPos -1);
+// if UpperCase(Field.FieldName) = UpperCase(DetailFieldName) then begin
+// // locate and get master field by name
+// MasterField := MasterSource.DataSet.FieldByName(MasterFieldName);
+// MasterSource.DataSet.GetFieldData(MasterField, Buffer);
+// Result := true;
+// exit;
+// end;
+// end;
+
+ Result := true; // indicates NotNull
+ if GetActiveBuffer(SrcBuffer) then begin
+ if (Assigned(Buffer)) and (Assigned(SrcBuffer)) then begin
+ Move((SrcBuffer + GetFieldOffset(Field.FieldNo))^, Buffer^, GetFieldSize(Field.FieldNo));
+ if Field.DataType = ftString then begin // GPA
+ MyBuf := PChar(Buffer);
+{$IFDEF ASQLITE_D6PLUS}
+ if Connection.FUtf8 then
+ Move(Utf8ToAnsi(MyBuf)[1], Buffer^, Length(MyBuf)) // GPA - Warning UTF-8 length can be potentially > Ansi length
+ else
+{$endif}
+ Move(MyBuf[1], Buffer^, Length(MyBuf)); // GPA - Warning UTF-8 length can be potentially > Ansi length
+ PAnsiChar(PAnsiChar(Buffer) + GetFieldSize(Field.FieldNo))^ := #0; // dev
+ end;
+ Result := true;
+ exit;
+ end;
+ if Assigned(SrcBuffer) then
+ if (Field.DataType <> ftDateTime) and ((SrcBuffer + GetFieldOffset(Field.FieldNo))^ = #0) then
+ Result := false
+ end else begin
+ if assigned(Buffer) then PAnsiChar(Buffer)^ := #0;
+ Result := false;
+ end;
+ end else begin {calcfields}
+ Result := GetActiveBuffer(SrcBuffer);
+ if Result and (State in [dsBrowse, dsEdit, dsInsert, dsCalcFields, dsBlockRead]) then begin
+ if (Assigned(Buffer)) then
+ Move((SrcBuffer + GetCalcFieldOffset(Field))^, Buffer^, GetFieldSize(Field));
+ end;
+ end;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLite3BaseQuery.GetFieldData: ' + PAnsiChar(Buffer));
+{$ENDIF}
+end;
+
+// The next two functions are added to increase compatibility with
+// components that require it (like DevExpress)
+
+function TASQLite3BaseQuery.GetFieldData(FieldNo: integer; Buffer: Pointer): boolean;
+begin
+ Result := GetFieldData(FieldByNumber(FieldNo), Buffer);
+end;
+
+{$IFDEF ASQLITE_D6PLUS}
+//function TASQLite3BaseQuery.GetFieldData(Field: TField; Buffer: Pointer;
+// NativeFormat: boolean): boolean;
+//begin
+// Result := GetFieldData(Field, Buffer);
+//end;
+{$ENDIF}
+
+{ returns the field data back to callee }
+
+procedure TASQLite3BaseQuery.SetFieldData(Field: TField; Buffer: Pointer);
+var
+ DestBuffer : PAnsiChar;
+ MyBuf : string;
+begin
+ DebugEnter('TASQLite3BaseQuery.SetFieldData');
+ GetActiveBuffer(DestBuffer);
+ if (Field.FieldNo > 0) and (Assigned(Buffer)) and (Assigned(DestBuffer)) then
+ begin
+ if Field.DataType = ftString then
+ Begin // GPA
+ MyBuf := PChar(Buffer);
+{$IFDEF ASQLITE_D6PLUS}
+ if Connection.FUtf8 then
+ MyBuf := AnsiToUTF8(MyBuf);
+{$endif}
+ if Length(MyBuf)>0 then
+ Move(MyBuf[1], (DestBuffer + GetFieldOffset(Field.FieldNo))^, Length(MyBuf)+1) // GPA - Warning UTF-8 length can be potentially > Ansi length
+ else begin
+ MyBuf := #0;
+ Move(MyBuf[1], (DestBuffer + GetFieldOffset(Field.FieldNo))^, Length(MyBuf)); // GPA - Warning UTF-8 length can be potentially > Ansi length
+ end;
+ End
+ else
+ Move(Buffer^, (DestBuffer + GetFieldOffset(Field.FieldNo))^, GetFieldSize(Field.FieldNo));
+ end else {fkCalculated, fkLookup} begin
+ if (State in [dsBrowse, dsEdit, dsInsert, dsCalcFields, dsBlockRead]) then begin
+ if (Field.FieldNo < 0) and (Assigned(Buffer)) and (Assigned(DestBuffer)) then begin
+ Move(Buffer^, (CalcBuffer + GetCalcFieldOffset(Field))^, GetFieldSize(Field));
+ end;
+ end;
+ end;
+
+ if not (State in [dsCalcFields, dsFilter, dsNewValue]) then
+ DataEvent(deFieldChange, Longint(Field));
+ DebugLeave('TASQLite3BaseQuery.SetFieldData');
+end;
+
+{ Record Navigation / Editing }
+{ =========================== }
+
+{ This method is called by TDataSet.First. Crack behavior is required.
+ That is we must position to a special place *before* the first record.
+ Otherwise, we will actually end up on the second record after Resync
+ is called. }
+
+procedure TASQLite3BaseQuery.InternalFirst;
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalFirst');
+ FCurRec := -1;
+ DebugLeave('TASQLite3BaseQuery.InternalFirst');
+end;
+
+{ Again, we position to the crack *after* the last record here. }
+
+procedure TASQLite3BaseQuery.InternalLast;
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalLast');
+ FCurRec := FResult.Count;
+ DebugLeave('TASQLite3BaseQuery.InternalLast');
+end;
+
+function TASQLite3BaseQuery.GetLastInsertRow: integer;
+begin
+ if Assigned(Connection) then
+ result := Connection.SQLite3_LastInsertRow(Connection.DBHandle)
+ else
+ result := -1;
+end;
+
+{ This method is called by TDataSet.Post. }
+
+procedure TASQLite3BaseQuery.InternalPost;
+var
+ ptr : Pointer;
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalPost');
+ FSaveChanges := true;
+ { For inserts, just update the data in the string list }
+ if State = dsEdit then
+ begin
+ if FUniDir then
+ Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams,self)
+ else begin
+ ptr := FResult.GetData(FCurrec);
+ if ptr <> nil then
+ move(ActiveBuffer^, ptr^, FRecBufSize); // albert 17/11/2004
+ end;//2006
+ end
+ else
+ begin
+ { If inserting (or appending), increment the bookmark counter and
+ store the data }
+ FResult.Insert(FCurRec, ActiveBuffer,
+ Connection.SQLite3_LastInsertRow(Connection.DBHandle));
+ end;
+ DebugLeave('TASQLite3BaseQuery.InternalPost');
+end;
+
+{ This method is similar to InternalPost above, but the operation is always
+ an insert or append and takes a pointer to a record buffer as well. }
+
+procedure TASQLite3BaseQuery.InternalAddRecord(Buffer: Pointer; Append: boolean);
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalAddRecord');
+ if FReadOnly then
+ raise AsgError.Create('Cannot write to a read-only dataset');
+
+ FSaveChanges := true;
+ if Append then
+ InternalLast;
+ Post;
+ DebugLeave('TASQLite3BaseQuery.InternalAddRecord');
+end;
+
+{ This method is called by TDataSet.Delete to delete the current record }
+
+procedure TASQLite3BaseQuery.InternalDelete;
+begin
+ DebugEnter('TASQLite3BaseQuery.InternalDelete');
+ FSaveChanges := true;
+ FResult.Delete(FCurRec);
+ if FCurRec >= FResult.Count then
+ Dec(FCurRec);
+ DebugLeave('TASQLite3BaseQuery.InternalDelete');
+end;
+
+ { Optional Methods }
+ { ================ }
+
+{ The following methods are optional. When provided they will allow the
+ DBGrid and other data aware controls to track the current cursor postion
+ relative to the number of records in the dataset. Because we are dealing
+ with a small, static data store (a stringlist), these are very easy to
+ implement. However, for many data sources (SQL servers), the concept of
+ record numbers and record counts do not really apply. }
+
+function TASQLite3BaseQuery.GetRecordCount: longint;
+begin
+ DebugEnter('TASQLite3BaseQuery.GetRecordCount');
+ Result := FResult.Count;
+ DebugLeave('TASQLite3BaseQuery.GetRecordCount ' + IntToStr(Result));
+end;
+
+function TASQLite3BaseQuery.GetRecNo: longint;
+begin
+ DebugEnter('TASQLite3BaseQuery.GetRecNo');
+ UpdateCursorPos;
+ if (FCurRec = -1) and (RecordCount > 0) then
+ Result := 1
+ else
+ Result := FCurRec + 1;
+ NotifySQLiteMasterChanged; //20040819
+ DebugLeave('TASQLite3BaseQuery.GetRecNo');
+end;
+
+procedure TASQLite3BaseQuery.SetRecNo(Value: integer);
+begin
+ DebugEnter('TASQLite3BaseQuery.SetRecNo');
+ if (Value >= 0) and (Value < FResult.Count + 2) then // value < resultetc
+ begin
+ FCurRec := Value - 1;
+ Resync([]);
+ end;
+ DebugLeave('TASQLite3BaseQuery.SetRecNo');
+end;
+
+procedure TASQLite3BaseQuery.SetFiltered(Value: Boolean);
+begin
+ inherited;
+end;
+
+procedure TASQLite3BaseQuery.SetFilterText(const Value: string);
+begin
+ DebugEnter('TASQLite3BaseQuery.SetFilterText ' + Value);
+ if Active then begin
+ Close;
+ inherited;
+ Open;
+ end else Inherited;
+ DebugLeave('TASQLite3BaseQuery.SetFilterText');
+end;
+
+function TASQLite3BaseQuery.SetQueryParams(InStr: string): string;
+var
+ i : integer;
+ TempParam : string;
+ ThisDateFormat : string;
+ OldDateFormat : string;
+begin
+ if FSQLiteDateFormat then
+ ThisDateFormat := 'yyyy-mm-dd hh:nn:ss.zzz'
+ else if (FTableDateFormat <> '') then
+ ThisDateFormat := FTableDateFormat
+ else
+ ThisDateFormat := ShortDateFormat;
+
+ for i := 0 to FParams.Count - 1 do begin
+ if (FParams.Items[i].DataType <> ftBlob) and
+ (FParams.Items[i].DataType <> ftGraphic) then begin
+ TempParam := Fparams.Items[i].AsString;
+ if (TempParam = '') and (FParams.Items[i].bound) then begin
+ InStr := StringReplace(Instr, '?', 'NULL', []);
+ end else begin
+ //Here we'll replace legitimate '?' characters with an unprintable character
+ TempParam := StringReplace(TempParam, '?', #1, [rfReplaceAll]);
+
+ //Okay, we need to check string dates and times
+ if FParams[i].DataType = ftDate then begin
+ end else if FParams[i].DataType = ftTime then begin
+ end else if FParams[i].DataType = ftDateTime then begin
+ OldDateFormat := ShortDateFormat;
+ ShortDateFormat := ThisDateFormat;
+ TempParam := DateToStr(FParams[i].AsDateTime);
+ ShortDateFormat := OldDateFormat;
+ end;
+
+ InStr := StringReplace(Instr, '?', QuotedStr(TempParam), [rfIgnoreCase]);
+ end;
+ end else begin // BLOB !!
+ //Here we'll replace legitimate '?' characters with an unprintable character
+ InStr := StringReplace(Instr, '?', #2, [rfIgnoreCase]);
+ end;
+ end;
+ //Here we'll restore legitimate '?' characters
+ InStr := StringReplace(Instr, #1, '?', [rfReplaceAll]);
+ SetQueryParams := InStr;
+end;
+
+// ============================================================================= TASQLite3 UPDATE SQL
+
+constructor TASQLite3UpdateSQL.Create(AOWner: TComponent);
+begin
+ DebugEnter('TASQLite3UpdateSQL.Create');
+ inherited Create(AOwner);
+ FInsertSQL := TStringList.Create;
+ FUpdateSQL := TStringList.Create;
+ FDeleteSQL := TStringList.Create;
+ DebugLeave('TASQLite3UpdateSQL.Create');
+end;
+
+destructor TASQLite3UpdateSQL.Destroy;
+begin
+ DebugEnter('TASQLite3UpdateSQL.Destroy');
+ inherited;
+ if Assigned(FInsertSQL) then
+ FInsertSQL.Free;
+ if Assigned(FUpdateSQL) then
+ FUpdateSQL.Free;
+ if Assigned(FDeleteSQL) then
+ FDeleteSQL.Free;
+ DebugLeave('TASQLite3UpdateSQL.Destroy');
+end;
+
+procedure TASQLite3UpdateSQL.SetInsertSQL(const Value: TStrings);
+begin
+ DebugEnter('TASQLite3UpdateSQL.SetInsertSQL');
+ if Assigned(FInsertSQL) then
+ FInsertSQL.Assign(Value)
+ else
+ FInsertSQL := Value;
+ DebugLeave('TASQLite3UpdateSQL.SetInsertSQL');
+end;
+
+procedure TASQLite3UpdateSQL.SetUpdateSQL(const Value: TStrings);
+begin
+ DebugEnter('TASQLite3UpdateSQL.SetUpdateSQL');
+ if Assigned(FUpdateSQL) then
+ FUpdateSQL.Assign(Value)
+ else
+ FUpdateSQL := Value;
+ DebugLeave('TASQLite3UpdateSQL.SetUpdateSQL');
+end;
+
+procedure TASQLite3UpdateSQL.SetDeleteSQL(const Value: TStrings);
+begin
+ DebugEnter('TASQLite3UpdateSQL.SetDeleteSQL');
+ if Assigned(FDeleteSQL) then
+ FDeleteSQL.Assign(Value)
+ else
+ FDeleteSQL := Value;
+ DebugLeave('TASQLite3UpdateSQL.SetDeleteSQL');
+end;
+// ============================================================================= TASQLite3 QUERY
+
+constructor TASQLite3Query.Create(AOwner: TComponent);
+begin
+ DebugEnter('TASQLite3Query.Create');
+ inherited Create(AOwner);
+// FParams := TParams.Create(Self);
+ TStringList(FSQL).OnChange := QueryChanged;
+ DebugLeave('TASQLite3Query.Create');
+end;
+
+destructor TASQLite3Query.Destroy;
+begin
+ DebugEnter('TASQLite3Query.Destroy');
+
+ if Assigned(FSQL) then
+ TStringList(FSQL).OnChange := nil;
+
+ inherited Destroy;
+ DebugLeave('TASQLite3Query.Destroy');
+end;
+
+procedure TASQLite3Query.Notification(AComponent: TComponent; Operation: TOperation);
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLite3Query.Notification');
+{$ENDIF}
+// Application.ProcessMessages;
+ if Assigned(AComponent) then
+ begin
+ if (Operation = opRemove) then begin
+ if Assigned(FUpdateSQL) and (AComponent is TASQLite3UpdateSQL) then begin
+ if TASQLite3UpdateSQL(AComponent) = FUpdateSQL then
+ FUpdateSQL := nil;
+ end else
+
+ if Assigned(FConnection) then begin
+ if (AComponent is TASQLite3DB) and
+ (TASQLite3Db(AComponent) = FConnection) then begin
+ Close;
+ Connection := nil;
+ end;
+ end else
+
+ end;
+ end;
+ inherited;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLite3Query.Notification');
+{$ENDIF}
+end;
+
+procedure TASQLite3Query.QueryChanged(Sender: TObject);
+begin
+ DebugEnter('TASQLite3Query.QueryChanged');
+ FNoResults := false;
+ Close;
+ if not FRawSQL then begin
+ if assigned(FParams) then FParams.Clear; // new
+ SQLStr := FParams.ParseSQL(SQL.Text, true)
+ end else SQLStr := SQL.Text;
+ DebugLeave('TASQLite3Query.QueryChanged');
+end;
+
+procedure TASQLite3Query.SetSQL(const Value: TStrings);
+begin
+ DebugEnter('TASQLite3Query.SetSQL');
+ FNoResults := false;
+ Close;
+ if Assigned(FSQL) then
+ FSQL.Assign(Value)
+ else
+ FSQL := Value;
+// FText := FParams.ParseSQL(SQL.Text, False);
+ DebugLeave('TASQLite3Query.SetSQL');
+end;
+
+function TASQLite3Query.GetSQL: TStrings;
+begin
+ DebugEnter('TASQLite3Query.GetSQL');
+ GetSQL := FSQL;
+ DebugLeave('TASQLite3Query.GetSQL');
+end;
+
+procedure TASQLite3Query.InternalDelete;
+var
+ MySQL : string;
+ TempSQL : string;
+ SQLStr : string; // added by Donnie
+ TheWord : string;
+ TableId : string;
+ FieldId : string;
+ startpos : integer;
+ vartype : integer;
+ p : integer;
+ Blobs : TList; // added by Donnie
+label
+ Ende;
+begin
+ DebugEnter('TASQLite3Query.InternalDelete');
+ if FReadOnly then
+ raise AsgError.Create('Cannot delete from a read-only dataset');
+
+ if Connection.FConnected then
+ begin
+ if FAutoCommit then
+ Connection.ExecStartTransaction(FTransactionType);
+
+ if not Assigned(FUpdateSQL) then
+ begin
+ raise AsgError.Create('Missing TASQLite3UpdateSQL component');
+ goto ende;
+ end;
+ // MyFieldList := TStringList.Create;
+ // MyFieldValues := TStringList.Create;
+ Blobs := TList.Create;
+ MySQL := FUpdateSQL.FDeleteSQL.Text;
+ startpos := 1;
+
+ TheWord := GetWord(MySQL, startpos, vartype); // delete
+ if not SyntaxCheck(TheWord, 'delete') then
+ goto ende;
+
+ TheWord := GetWord(MySQL, startpos, vartype); // from
+ if not SyntaxCheck(TheWord, 'from') then
+ goto ende;
+
+ Tableid := GetWord(MySQL, startpos, vartype); // tablename
+
+ TheWord := GetWord(MySQL, startpos, vartype); // where
+ if not SyntaxCheck(TheWord, 'where') then
+ goto ende;
+
+ SQLStr := 'delete from ' + TableId + ' where ';
+ TempSQL := Copy(MySQL, startpos, 999);
+
+ p := pos(':', TempSQL);
+ while p > 0 do
+ begin
+ SQLStr := SQLStr + Copy(TempSQL, 1, p - 1);
+ System.Delete(TempSQL, 1, p);
+ startpos := 1;
+ FieldId := GetWord(TempSQL, startpos, vartype); // variable
+ System.Delete(TempSQL, 1, startpos); // Tzvetan
+ // SQLStr := SQLStr + QuotedStr(FieldByName(FieldId).AsString);
+ // edited by Donnie
+ SQLStr := SQLStr + GetFieldValue(FieldByName(FieldId), Blobs);
+ p := pos(':', TempSQL);
+ end;
+ SQLStr := SQLStr + Copy(TempSQL, StartPos, 999);
+ try
+ Connection.SQLite3_execute(Connection.DBHandle, PAnsiChar(SQLStr), FParams, self);
+ if FAutoCommit then
+ Connection.Commit;
+ except
+ if FAutoCommit then begin
+ Connection.RollBack;
+ raise;
+ end;
+ end;
+ if Assigned(Blobs) then begin
+ for p := 0 to Blobs.Count - 1 do
+ TMemoryStream(Blobs.Items[p]).Free;
+ Blobs.Free;
+ end;
+ inherited InternalDelete;
+ end;
+ Ende:
+ DebugLeave('TASQLite3Query.InternalDelete');
+end;
+
+ //==============================================================================
+ // This is probabely the most difficult thing about these components.
+ // To be able to have a live resultset a tupdatequery must be used to
+ // supply the correct sql on the events. In the internalpost the insert and
+ // update are handled. The routine will take the given sql and remodel it
+ // to a workable sql which is executed. Keep in mind that this routine
+ // is far more difficult then the TASQLite3Table, since the last one is depending
+ // on a unique rownumber, available in the resultset, which might not be
+ // available to user queries
+ // There are several syntaxes allowed:
+ //
+ // insert into table *
+ // this will generate an insert statement for each field and values
+ // i.e. insert into table a,b,c values :a, :b, :c;
+ //
+ // insert into table (a, b, c) values *
+ // this will generate an insert statement like
+ // insert into table (a, b, c) values (:a, :b, :c);
+ //
+ // insert into table (a, b, c) values (:a, :b, :c);
+ // insert into table (a, b, c) values (:a, "bvalue", :c) etc.
+ //
+ // update table set * where
+ // this will generate a update for all fields like
+ // update a=:a, b=:b, c=:c where
+ //
+ //==============================================================================
+
+procedure TASQLite3Query.InternalPost;
+var
+ i : integer;
+ p : integer;
+ startpos : integer;
+ MyFieldList : TStringList;
+ MyFieldValues : TStringList;
+ MySQL : string;
+ TheWord : string;
+ TempSQL : string;
+ SQLStr : string; // added by Donnie
+ TableId : string;
+ FieldId : string;
+ varType : integer;
+ Blobs : TList; // added by Donnie
+begin
+ DebugEnter('TASQLite3Query.InternalPost');
+ if FReadOnly then
+ raise AsgError.Create('Cannot post into a read-only dataset');
+ MyFieldList := nil;
+ MyFieldValues := nil;
+ try
+ if not Connection.FConnected then
+ begin
+ DebugLeave('TASQLite3Query.InternalPost');
+ exit;
+ end;
+ if FAutoCommit then
+ Connection.ExecStartTransaction(FTransactionType);
+ if not Assigned(FUpdateSQL) then
+ begin
+ DebugLeave('TASQLite3Query.InternalPost Exception');
+ raise AsgError.Create('Missing TASQLite3UpdateSQL component');
+ end;
+
+ Blobs := TList.Create;
+ if (State = dsEdit) and (FResult.Count > 0) then
+ begin
+ MyFieldList := TStringList.Create;
+ MyFieldValues := TStringList.Create;
+ MySQL := FUpdateSQL.FUpdateSQL.Text;
+ startpos := 1;
+ TheWord := GetWord(MySQL, startpos, vartype); // update
+ if not SyntaxCheck(TheWord, 'update') then
+ exit;
+
+ Tableid := GetWord(MySQL, startpos, vartype); // tablename
+
+ TheWord := GetWord(MySQL, startpos, vartype); // set or '*'
+ if TheWord = '*' then
+ begin
+ for i := 0 to FieldList.Count - 1 do
+ begin
+ MyFieldList.Add(FieldList[i].FieldName);
+ MyFieldValues.Add(':' + FieldList[i].FieldName);
+ end;
+ TheWord := GetWord(MySQL, startpos, vartype); // where
+ end
+ else
+ begin
+ if not SyntaxCheck(TheWord, 'set') then
+ begin
+ DebugLeave('TASQLite3Query.InternalPost');
+ exit;
+ end;
+
+ repeat
+ TheWord := GetWord(MySQL, startpos, vartype); // fieldname
+ MyFieldList.Add(TheWord);
+
+ TheWord := GetWord(MySQL, startpos, vartype); // '='
+ if not SyntaxCheck(TheWord, '=') then
+ begin
+ DebugLeave('TASQLite3Query.InternalPost');
+ exit;
+ end;
+ TheWord := GetWord(MySQL, startpos, vartype); // 2004-14-09 (rps) ':' or 'where' --->
+ if vartype = vtcDelimiter then // <---
+ TheWord := GetWord(MySQL, startpos, vartype); // fieldvalue
+ if TheWord = '*' then
+ MyFieldValues.Add(':' + MyFieldList[MyFieldList.Count - 1])
+ else
+ MyFieldValues.Add(':' + TheWord);
+
+ TheWord := GetWord(MySQL, startpos, vartype); // , or 'where'
+ until CompareText(TheWord, 'where') = 0;
+ end;
+
+ if not SyntaxCheck(TheWord, 'where') then
+ exit;
+
+ SQLStr := 'update ' + TableId + ' set ';
+ // for i := 0 to FieldList.Count - 1 do
+ // typo corrected by Donnie
+ for i := 0 to MyFieldList.Count - 1 do
+ begin
+ // SQLStr := SQLStr + FieldList[i].FieldName + '=';
+ // typo corrected by Donnie
+ SQLStr := SQLStr + MyFieldList.Strings[i] + '=';
+ FieldId := MyFieldValues[i];
+ if FieldId[1] = ':' then
+ begin
+ System.Delete(FieldId, 1, 1);
+ // SQLStr := SQLStr + QuotedStr(FieldByName(FieldId).AsString) + ','
+ // edited by Donnie
+ SQLStr := SQLStr + GetFieldValue(FieldByName(FieldId), Blobs) + ','
+ end
+ else
+ SQLStr := SQLStr + QuotedStr(FieldId) + ','
+ end;
+ System.Delete(SQLStr, Length(SQLStr), 1); // get rid of ','
+ TempSQL := ' where ' + Copy(MySQL, startpos, 999);
+
+ p := pos(':', TempSQL);
+ while p > 0 do
+ begin
+ SQLStr := SQLStr + Copy(TempSQL, 1, p - 1);
+ System.Delete(TempSQL, 1, p);
+ startpos := 1;
+ FieldId := GetWord(TempSQL, startpos, vartype); // variable
+ System.Delete(TempSQL, 1, startpos); // Tzvetan
+ // SQLStr := SQLStr + QuotedStr(FieldToStr(FieldByName(FieldId)));
+ // edited by Donnie
+ SQLStr := SQLStr + GetFieldValue(FieldByName(FieldId), Blobs);
+ p := pos(':', TempSQL);
+ end;
+ SQLStr := SQLStr + Copy(TempSQL, StartPos, 999);
+
+ // Connection.SQLite3_ExecSQL(SQLStr);
+ // edited by Donnie
+ Connection.SQLite3_ExecSQL(SQLStr, Blobs);
+ inherited InternalPost; // rework internals
+ end
+ else
+ begin
+ { If inserting (or appending), increment the bookmark counter and
+ store the data. Sytax should be: insert into * or
+ insert into (field, field) values (field, field) | *
+ The sql is parsed and a new (valid) sql generated
+ }
+ MyFieldList := TStringList.Create;
+ MyFieldValues := TStringList.Create;
+ MySQL := FUpdateSQL.FInsertSQL.Text;
+ startpos := 1;
+ TheWord := GetWord(MySQL, startpos, vartype); // insert
+ if not SyntaxCheck(TheWord, 'insert') then
+ exit;
+
+ TheWord := GetWord(MySQL, startpos, vartype); // into
+ if not SyntaxCheck(TheWord, 'into') then
+ exit;
+
+ Tableid := GetWord(MySQL, startpos, vartype); // tablename
+
+ TheWord := GetWord(MySQL, startpos, vartype); // ( or *
+ if TheWord = '*' then
+ begin
+ for i := 0 to FieldList.Count - 1 do
+ begin
+ MyFieldList.Add(FieldList[i].FieldName);
+ MyFieldValues.Add(':' + FieldList[i].FieldName);
+ end;
+ end
+ else if TheWord = '(' then
+ begin
+ repeat
+ TheWord := GetWord(MySQL, startpos, vartype); // fieldname
+ MyFieldList.Add(TheWord);
+ TheWord := GetWord(MySQL, startpos, vartype); // ',' or ')'
+ until theword = ')';
+ TheWord := GetWord(MySQL, startpos, vartype); // values
+ TheWord := GetWord(MySQL, startpos, vartype); // '(' or '*'
+ if TheWord = '*' then
+ begin
+ for i := 0 to MyFieldList.Count - 1 do
+ MyFieldValues.Add(':' + MyFieldList[i]);
+ end
+ else
+ begin
+// 2004-14-09 (rps) original - does not work
+ repeat
+ TheWord := GetWord(MySQL, startpos, vartype); // ':' or fieldname
+ if vartype = vtcDelimiter then begin
+ TheWord := GetWord(MySQL, startpos, vartype); // fieldname !!
+ MyFieldValues.Add(':' + TheWord);
+ end else
+ MyFieldValues.Add(TheWord);
+ TheWord := GetWord(MySQL, startpos, vartype); // ',' or ')'
+ until theword = ')';
+ end;
+ end
+ else
+ begin
+ raise AsgError.Create('SQL macro syntax error on insertsql, expected ( or *');
+ end;
+
+ SQLStr := 'insert into ' + TableId + ' (';
+ for i := 0 to MyFieldList.Count - 1 do
+ SQLStr := SQLStr + MyFieldList[i] + ',';
+ SQLStr[Length(SQLStr)] := ')';
+ SQLStr := SQLStr + ' values (';
+ for i := 0 to MyFieldList.Count - 1 do
+ begin
+ FieldId := MyFieldValues[i];
+ if FieldId[1] = ':' then begin
+ System.Delete(FieldId, 1, 1);
+ // SQLStr := SQLStr + QuotedStr(FieldByName(FieldId).AsString) + ','
+ // edited by Donnie
+ SQLStr := SQLStr + GetFieldValue(FieldByName(FieldId), Blobs) + ','
+ end else begin
+ if CompareText(FieldId,'null')=0 then
+ SQLStr := SQLStr + FieldId+','
+ else
+ SQLStr := SQLStr + QuotedStr(FieldId) + ','
+ end;
+ end;
+ SQLStr[Length(SQLStr)] := ')';
+ // Connection.SQLite3_ExecSQL(SQLStr);
+ // edited by Donnie
+ Connection.SQLite3_ExecSQL(SQLStr, Blobs);
+ if FResult.Count = 0 then
+ Inc(FCurrec);
+ inherited InternalPost; // rework internals
+ end;
+ if FAutoCommit then
+ begin
+ try
+ Connection.Commit;
+ except
+ Connection.RollBack;
+ raise;
+ end;
+ end;
+ finally
+ if Assigned(MyFieldList) then MyFieldList.Free;
+ if Assigned(MyFieldValues) then MyFieldValues.Free;
+ if Assigned(Blobs) then begin
+ for i := 0 to Blobs.Count - 1 do
+ try
+ TMemoryStream(Blobs.Items[i]).Free;
+ except
+ end;
+ Blobs.Free;
+ end;
+ end;
+ DebugLeave('TASQLite3Query.InternalPost');
+end;
+
+procedure TASQLite3Query.InternalClose;
+begin
+ DebugEnter('TASQLite3Query.InternalClose');
+ FPrepared := '';
+ inherited;
+ DebugLeave('TASQLite3Query.InternalClose');
+end;
+
+procedure TASQLite3Query.InternalOpen;
+//var
+// p : integer;
+begin
+ DebugEnter('TASQLite3Query.InternalOpen');
+ if Trim(FSQL.Text) = '' then
+ begin
+ raise AsgError.Create('no query specified');
+ abort;
+ end;
+
+ if (FMaxResults = 0) and (FStartResult <> 0) then
+ FMaxResults := -1;
+
+ // SQLStr contains the 'raw' interpreted SQL, with ? as parameterlist
+ // This string has to be preserved, since it was parsed on entering the sql.
+ // On close and open (i.e. in case of master-detail) the parsed data still
+ // must be available
+
+ // We'll prepare the SQL statement into FPrepared. This is also the var
+ // containing the SQL statement to be executed.
+ FPrepared := SQLStr;
+
+// FPrepared := FSql.Text; // 2004-14-09 (rps) changed SqlStr (current) -> FSql.Text (property),
+ // to bring Close; Open; to work. (Full refresh.)
+ // this will block parameterized queries to function right (Aducom)
+
+ if (Filtered) and (Filter <> '') then
+ begin
+ //in order to let a filter work we use a little trick:
+ //select * from (my select statement)
+ FPrepared := 'select * from (' + FPrepared + ') where ' + Filter;
+ end;
+
+ if FParams.Count > 0 then
+ FPrepared := SetQueryParams(FPrepared);
+
+ if FMaxResults <> 0 then
+ FPrepared := FPrepared + ' limit ' + IntToStr(FMaxResults);
+ if FStartResult <> 0 then
+ FPrepared := FPrepared + ' offset ' + IntToStr(FStartResult);
+ inherited;
+ DebugLeave('TASQLite3Query.InternalOpen');
+end;
+
+ // =============================================================================
+ // The master-detail is implemented through the filter object
+ // in the future perhaps a separate filter object will be used allowing
+ // to add your own criteria too, but for the time being..
+ //==============================================================================
+
+procedure TASQLite3Query.SQLiteMasterChanged;
+var
+ r, s : string;
+ m, d : string;
+ p : integer;
+ cAnd : string;
+begin
+ DebugEnter('TASQLite3Query.SQLiteMasterChanged');
+ Close;
+ cAnd := '';
+ r := FMasterFields;
+ Filter := '';
+ Filtered := false;
+ while r <> '' do
+ begin // build the filter sql syntax
+ p := pos(';', r);
+ if p = 0 then
+ begin
+ if Trim(r) <> '' then
+ s := r;
+ r := '';
+ end
+ else
+ begin
+ s := Trim(Copy(r, 1, p - 1));
+ System.Delete(r, 1, p);
+ end;
+
+ p := pos('=', s);
+ if p = 0 then
+ begin
+ raise AsgError.Create('Syntax error: Masterfields not build of a=b;... pairs');
+ end
+ else
+ begin
+ d := copy(s, 1, p - 1);
+ m := copy(s, p + 1, 99);
+ end;
+// Filter := Filter + cAnd + d + '=' + FMasterSource.DataSet.FieldByName(m).AsString;
+ Filter := Filter + cAnd + d + '=' + QuotedStr(FMasterSource.DataSet.FieldByName(m).AsString) ;
+ cAnd := ' and ';
+ end;
+ if (Filter <> '') and (Active) then begin
+ filtered := true;
+ Open;
+ end;
+ DebugLeave('TASQLite3Query.SQLiteMasterChanged');
+end;
+
+ //==============================================================================
+ // execsql is used for sql statements which do not require cursors. For this
+ // reason the fnoresults is set, to prevent building a result set
+ //==============================================================================
+
+procedure TASQLite3BaseQuery.ExecSQL;
+begin
+ DebugEnter('TASQLite3BaseQuery.ExecSQL');
+ FNoResults := true;
+ Close;
+ if FAutoCommit then
+ begin
+ Connection.ExecStartTransaction(FTransactionType);
+ Open;
+ try
+ Connection.Commit
+ except
+ Connection.RollBack;
+ raise;
+ end;
+ end
+ else
+ Open;
+ DebugLeave('TASQLite3BaseQuery.ExecSQL');
+end;
+
+procedure TASQLite3BaseQuery.SetParamsList(Value: TParams);
+begin
+ DebugEnter('TASQLite3BaseQuery.SetParamsList');
+ FParams.AssignValues(Value);
+ DebugLeave('TASQLite3BaseQuery.SetParamsList');
+end;
+
+function TASQLite3BaseQuery.GetParamsCount: word;
+begin
+ DebugEnter('TASQLite3BaseQuery.GetParamsCount');
+ Result := FParams.Count;
+ DebugLeave('TASQLite3BaseQuery.GetParamsCount');
+end;
+
+procedure TASQLite3Table.SetFOrderBy(OrderBy : string);
+begin
+ if FOrderBy <> OrderBy then begin
+ Close;
+ FOrderBy := OrderBy;
+ end;
+end;
+
+procedure TASQLite3Table.SetFTableName(TableName : string);
+begin
+ Close;
+ FTableName := TableName;
+end;
+
+procedure TASQLite3Table.Notification(AComponent: TComponent; Operation: TOperation);
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLite3Table.Notification');
+{$ENDIF}
+// Application.ProcessMessages;
+ if Assigned(AComponent) then
+ begin
+ if (Operation = opRemove) then
+ begin
+ if (AComponent is TASQLite3DB) and Assigned(FConnection) then
+ begin
+ if TASQLite3DB(AComponent) = FConnection then begin
+ Close;
+ FConnection := nil;
+ end;
+ end else
+
+ end;
+ end;
+ inherited;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLite3Table.Notification');
+{$ENDIF}
+end;
+
+procedure TASQLite3Table.InternalOpen;
+begin
+ DebugEnter('TASQLite3Table.InternalOpen');
+
+ if FTableName = '' then
+ begin
+ raise AsgError.Create('no table specified');
+ exit;
+ end;
+ FSQL.Clear;
+ FSQL.Add('select *, rowid as rowid from ' + TableName);
+ if Filtered then
+ if Filter <> '' then
+ FSQL.Add(' where ' + Filter);
+ if (FMaxResults = 0) and (FStartResult <> 0) then
+ FMaxResults := -1;
+ if FMaxResults <> 0 then
+ FSQL.Add(' limit ' + IntToStr(FMaxResults));
+ if FStartResult <> 0 then
+ FSQL.Add(' offset ' + IntToStr(FStartResult));
+ if FOrderBy <> '' then
+ FSQL.Add(' order by ('+FOrderBy+')');
+ SQLStr := FSQL.Text;
+ FPrepared := SQLStr;
+ inherited;
+ DebugLeave('TASQLite3Table.InternalOpen');
+end;
+
+procedure TASQLite3Table.SQLiteMasterChanged;
+var
+ r, s : string;
+ m, d : string;
+ p : integer;
+ cAnd : string;
+begin
+ DebugEnter('TASQLite3Table.SQLiteMasterChanged');
+ Close;
+ cAnd := '';
+ r := FMasterFields;
+ Filter := '';
+ while r <> '' do
+ begin
+ p := pos(';', r);
+ if p = 0 then
+ begin
+ if Trim(r) <> '' then
+ s := r;
+ r := '';
+ end
+ else
+ begin
+ s := Trim(Copy(r, 1, p - 1));
+ System.Delete(r, 1, p);
+ end;
+
+ p := pos('=', s);
+ if p = 0 then
+ begin
+ raise AsgError.Create('Syntax error: Masterfields not build of a=b;... pairs');
+ end
+ else
+ begin
+ d := copy(s, 1, p - 1);
+ m := copy(s, p + 1, 99);
+ end;
+// Filter := Filter + cAnd + d + '=' + FMasterSource.DataSet.FieldByName(m).AsString;
+ Filter := Filter + cAnd + d + '=' + QuotedStr(FMasterSource.DataSet.FieldByName(m).AsString) ;
+ cAnd := ' and ';
+ end;
+ if Filter <> '' then
+ filtered := true;
+ Open;
+ DebugLeave('TASQLite3Table.SQLiteMasterChanged');
+end;
+
+procedure TASQLite3Table.InternalDelete;
+begin
+ DebugEnter('TASQLite3Table.InternalDelete');
+ if FReadOnly then
+ raise AsgError.Create('Cannot delete from a read-only dataset');
+
+ if not Connection.FConnected then
+ exit;
+ if FAutoCommit then
+ Connection.ExecStartTransaction(FTransactionType);
+
+ SQLStr := '';
+ CurrentRowId := FResult.GetRowId(FCurRec);
+ FSQL.Clear;
+ FSQL.Add('delete from ' + Tablename + ' where rowid=' + QuotedStr(IntToStr(CurrentRowId)));
+// SQLStr := StringReplace(FSQL.Text, crlf, #10, [rfReplaceAll, rfIgnoreCase]); // albert
+ SQLStr := FSQL.Text;
+ Connection.SQLite3_execute(Connection.DBHandle, PAnsiChar(SQLStr), FParams, self);
+
+ inherited InternalDelete;
+
+ if FAutoCommit then
+ begin
+ try
+ Connection.Commit;
+ except
+ Connection.RollBack;
+ raise;
+ end;
+ end;
+ DebugLeave('TASQLite3Table.InternalDelete');
+end;
+
+procedure TASQLite3Table.InternalPost;
+var
+ i : integer;
+ n: Integer;
+ ThisDateFormat,
+ tmpMasterDetail, MasterField, chDelim: string;
+ slDetail, slValues: TStringList;
+ lsBlobs: TList; //GPA
+ M:TMemoryStream; //GPA
+
+ // this function will return the fielvalue of an indicated fieldbyordinalnumber
+ // if the fieldtype is tdatetime it is transfered to the right date notation as
+ // indicated by jpierce.
+
+ function GetFieldValue(const AField: TField): string; // DI
+ begin // DI
+ if AField.DataType = ftDateTime then // DI
+ GetFieldValue := QuotedStr(FormatDateTime(ThisDateFormat, FieldByName(AField.FieldName).AsDateTime)) // DI
+ else if (AField.DataType = ftBlob) or (AField.DataType = ftMemo) or (AField.DataType = ftFmtMemo) or (AField.DataType = ftGraphic) then //GPA
+ begin //GPA
+ M:=TMemoryStream.Create; //GPA
+ TBlobField(FieldByName(AField.FieldName)).SaveToStream(M);
+ GetFieldValue := #2+IntToStr(1+lsBlobs.Add(Pointer(M))) //GPA
+ end
+ else
+ GetFieldValue := QuotedStr(FieldByName(AField.FieldName).AsString); // DI
+ end; // DI
+
+var
+ f: TField; // DI
+ OldDecimalSeparator: ansiChar; // DI
+begin
+ DebugEnter('TASQLite3Table.InternalPost');
+
+ if FReadOnly then
+ raise AsgError.Create('Cannot post into a read-only dataset');
+
+ // determine datetime style of dataset (if any)
+
+ if FSQLiteDateFormat then
+ ThisDateFormat := 'yyyy-mm-dd hh:nn:ss.zzz'
+ else if (FTableDateFormat <> '') then
+ ThisDateFormat := FTableDateFormat
+ else
+ ThisDateFormat := ShortDateFormat;
+
+ if not Connection.FConnected then Exit;
+ if FAutoCommit then Connection.StartTransaction;
+
+ lsBlobs := TList.Create; //GPA
+ OldDecimalSeparator := DecimalSeparator; // DI
+ try // DI
+ DecimalSeparator := '.'; // DI: Force Delphi's DecimalSeparator to SQL style syntax.
+
+ if (State = dsEdit) and (FResult.Count > 0) then
+ begin
+ CurrentRowId := FResult.GetRowId(FCurRec);
+ FSQL.Clear;
+ FSQL.Add('update ' + TableName + ' set ');
+ SQLStr := '';
+ for i := 0 to FieldList.Count - 1 do begin
+ f := FieldList[i]; // DI
+ if not (f.Calculated or f.Lookup) then // DI
+ SQLStr := SQLStr + f.FieldName + '=' + GetFieldValue(f) + ','; // DI
+ end;
+ SQLStr[Length(SQLStr)] := ' ';
+ FSQL.Add(SQLStr);
+ FSQL.Add(' where rowid=' + QuotedStr(IntToStr(CurrentRowId)));
+
+ SQLStr := FSQL.Text; // DI
+ // DI SQLStr := StringReplace(FSQL.Text, CRLF, #10, [rfReplaceAll, rfIgnoreCase]);
+
+ Connection.SQLite3_ExecSQL(SQLStr,lsBlobs);
+ inherited InternalPost; // rework internals
+ end
+ else
+ begin
+ { If inserting (or appending), increment the bookmark counter and
+ store the data }
+ FSQL.Clear;
+ FSQL.Add('insert into ' + TableName + ' (');
+ SQLStr := '';
+
+ for i := 0 to FieldList.Count - 1 do begin
+ if not (FieldList[i].Calculated or FieldList[i].Lookup) then // aducom
+ SQLStr := SQLStr + FieldList[i].FieldName + ',';
+ end;
+
+ SQLStr[Length(SQLStr)] := ')';
+ SQLStr := SQLStr + ' values (';
+ FSQL.Add(SQLStr);
+ SQLStr := '';
+
+ slDetail := TStringList.Create;
+ slValues := TStringList.Create;
+ i := 0; chDelim := ';';
+ if FMasterSource <> nil then
+ begin
+ while i < Length(FMasterFields) do
+ begin
+ tmpMasterDetail := GetWordByDelim(FMasterFields, i, chDelim);
+ n := Pos('=', tmpMasterDetail);
+ if n <> 0 then
+ begin
+ slDetail.Add(Copy(tmpMasterDetail, 1, n - 1));
+ MasterField := Copy(tmpMasterDetail, n + 1, Length(tmpMasterDetail) - n);
+ slValues.Add(FMasterSource.DataSet.FieldByName(MasterField).AsString);
+ end;
+ end;
+ end;
+
+ if (FPrimaryAutoInc) and (FieldDefs[0].DataType = ftInteger) then begin
+ SQLStr := SQLStr + 'null,';
+ n := 1; // aducom
+ end else begin // aducom
+ n := 0; // aducom
+ end; // aducom
+
+ for i := n to FieldList.Count - 1 do // aducom
+ begin // DI
+ f := FieldList[i];
+ if not (f.Calculated or f.Lookup) then // DI
+ if slDetail.Find(f.FieldName, n) then // DI
+ SQLStr := SQLStr + QuotedStr(slValues.Strings[n]) + ','
+ else
+ SQLStr := SQLStr + GetFieldValue(f) + ','; // DI
+ end; // DI
+
+ slDetail.Free;
+ slValues.Free;
+
+ SQLStr[Length(SQLStr)] := ')';
+ FSQL.Add(SQLStr);
+
+ SQLStr := FSQL.Text; // DI
+ // DI SQLStr := StringReplace(FSQL.Text, CRLF, #10, [rfReplaceAll, rfIgnoreCase]);
+
+ Connection.SQLite3_ExecSQL(SQLStr, lsBlobs);
+ if FPrimaryAutoInc then
+ if FieldDefs[0].DataType = ftInteger then
+ FieldByName(FieldList[0].FieldName).AsInteger :=
+ Connection.SQLite3_LastInsertRow(Connection.DBHandle);
+ if FResult.Count = 0 then
+ Inc(FCurRec);
+ inherited InternalPost; // rework internals
+ end;
+
+ finally // DI
+ DecimalSeparator := OldDecimalSeparator; // DI
+ For I:=0 to lsBlobs.Count-1 do begin // GPA
+ M:=TMemoryStream(lsBlobs.Items[I]); // GPA
+ M.Free; // GPA
+ end; // GPA
+ lsBlobs.Free; // GPA
+
+ end; // DI
+
+ if FAutoCommit then
+ begin
+ try
+ Connection.Commit;
+ except
+ Connection.RollBack;
+ raise;
+ end;
+ end;
+ DebugLeave('TASQLite3Table.InternalPost');
+end;
+
+// Blobfields in SQLite are in fact CLOB fields. However, since it is a large
+// chunk of data for all types the ftBlob is used. Keep in mind that blobs are
+// stored separately of TResult. Within the result structure only the memory
+// handle of the blob is stored.
+
+constructor TASQLite3BlobStream.Create(Field: TBlobField; Mode: TBlobStreamMode);
+begin
+// inherited Create;
+ FField := Field;
+ FMode := Mode;
+ FDataSet := FField.DataSet as TASQLite3BaseQuery;
+ if Mode <> bmWrite then
+ LoadBlobData;
+end;
+
+destructor TASQLite3BlobStream.Destroy;
+begin
+ DebugEnter('TASQLite3BlobStream.Destroy');
+ if FModified then
+ SaveBlobData;
+ inherited Destroy;
+end;
+
+function TASQLite3BlobStream.Read(var Buffer; Count: Longint): Longint;
+begin
+ DebugEnter('ASQLiteBlobStream.Read');
+ Result := inherited Read(Buffer, Count);
+ FOpened := True;
+end;
+
+function TASQLite3BlobStream.Write(const Buffer; Count: Longint): Longint;
+begin
+ DebugEnter('ASQLiteBlobStream.Write');
+ Result := inherited Write(Buffer, Count);
+ FModified := True;
+ FDataSet.SetModified(true);
+end;
+
+procedure TASQLite3BlobStream.LoadBlobData;
+var
+ Stream : TMemoryStream;
+ Offset : Integer;
+ RecBuffer : PAnsiChar;
+begin
+ DebugEnter('ASQLiteBlobStream.LoadBlobData');
+ Self.Size := 0;
+ FDataset.GetActiveBuffer(RecBuffer);
+
+// recbuffer := nil;
+
+ if RecBuffer <> nil then
+ begin
+ Offset := FDataset.GetFieldOffset(FField.FieldNo);
+ Move((RecBuffer + Offset)^, Pointer(Stream), sizeof(Pointer));
+ Self.CopyFrom(Stream, 0);
+ end;
+ Position := 0;
+end;
+
+procedure TASQLite3BlobStream.SaveBlobData;
+var
+ Stream : TMemoryStream;
+ Offset : Integer;
+ RecBuffer : PAnsiChar;
+begin
+ DebugEnter('ASQLiteBlobStream.SaveBlobData');
+ FDataset.GetActiveBuffer(RecBuffer);
+ if RecBuffer <> nil then
+ begin
+ Offset := FDataset.GetFieldOffset(FField.FieldNo);
+ Move((RecBuffer + Offset)^, Pointer(Stream), sizeof(Pointer));
+ Stream.Size := 0;
+ Stream.CopyFrom(Self, 0);
+ Stream.Position := 0;
+ end;
+end;
+
+// Inline sql can be used to store sqlstatements outside of the pascal source.
+// it prevents large 'sql.add' rows. Also it can be used to generate an in-memory
+// database structure if needed
+
+constructor TASQLite3InlineSQL.Create;
+begin
+ inherited;
+ FSQL := TStringList.Create;
+end;
+
+destructor TASQLite3InlineSQL.Destroy;
+begin
+ if Assigned(FSQL) then FSQL.Free;
+ inherited;
+end;
+
+procedure TASQLite3InlineSQL.SetSQL(const Value: TStrings);
+begin
+ if Assigned(FSQL) then
+ FSQL.Assign(Value)
+ else
+ FSQL := Value;
+end;
+
+function TASQLite3InlineSQL.GetSQL: TStrings;
+begin
+ GetSQL := FSQL;
+end;
+
+// save resultset as text, html or xml. Depending on type the following
+// will happen:
+//
+// text: all rows will be output, separated by the given separation symbol
+// xml: all rows will be output, tags are the fieldnames
+//
+//
+// fieldvalue
+// ....
+//
+// html: a table will be generated with the given classnames (if available)
+
+constructor TASQLite3Output.Create;
+begin
+ inherited;
+ FOutput := TStringList.Create;
+end;
+
+destructor TASQLite3Output.Destroy;
+begin
+ if Assigned(FOutput) then FOutput.Free;
+ inherited;
+end;
+
+procedure TASQLite3Output.SetFActive(Active: boolean);
+begin
+ FActive := Active;
+ if FActive = false then begin
+ end else begin
+ if Assigned(FDataSource) then begin
+ if Assigned(FDataSource.DataSet) then begin
+ Execute(FDataSource.DataSet);
+ end else raise AsgError.Create('Missing Datasource.Dataset');
+ end else raise AsgError.Create('Missing Datasource');
+ end;
+end;
+
+procedure TASQLite3Output.SetOutput(const Value: TStrings);
+begin
+ if Assigned(FOutput) then
+ FOutput.Assign(Value)
+ else
+ FOutput := Value;
+end;
+
+function TASQLite3Output.GetOutput: TStrings;
+begin
+ GetOutput := FOutput;
+end;
+
+procedure TASQLite3Output.Notification(AComponent: TComponent; Operation: TOperation);
+begin
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugEnter('TASQLite3Output.Notification');
+{$ENDIF}
+ if Assigned(AComponent) then begin
+ if (Operation = opRemove) then begin
+ if (AComponent is TDataSource) then begin
+ if Assigned(FDataSource) then begin
+ if TDataSource(AComponent) = FDataSource then
+ FDataSource := nil;
+ end;
+ end
+ end;
+ end;
+ inherited;
+{$IFDEF DEBUG_VERY_LOUD}
+ DebugLeave('TASQLite3DB.Notification');
+{$ENDIF}
+end;
+
+procedure TASQLite3Output.Execute(MyDataSet: TDataSet);
+const eXML = 0;
+ eHTML = 1;
+ eTXT = 2;
+var FType : integer;
+ i : integer;
+ Line : string;
+ Sep : string;
+// Indent : integer;
+begin
+ if Assigned(MyDataset) then begin
+ if MyDataSet.Active = false then MyDataSet.Open;
+ Output.Clear;
+ FType := ETxt;
+ Line := '';
+
+ if CompareText(FOutputType[1], 'X') = 0 then begin
+ FType := eXML;
+ Line := Line + '' + #10;
+ end else if CompareText(FOutputType[1], 'H') = 0 then begin
+ FType := eHTML;
+ Line := Line + '' + #10 + '' + #10 +
+ 'Table ' + MyDataSet.Name + ' ' + #10 +
+ ' ' + #10 +
+ '' + #10 +
+ '' + #10;
+ end else if CompareText(FOutputType[1], 'T') = 0 then begin
+ FType := eTXT;
+ end;
+
+ Sep := '';
+
+ for i := 0 to MyDataSet.FieldDefs.Count - 1 do begin
+ case FType of
+ eXML: begin
+ end;
+ eHTML: begin
+ Line := Line + '' + MyDataSet.FieldDefs[i].Name + ' ';
+ end;
+ eTXT: begin
+ Line := Line + Sep + MyDataSet.FieldDefs[i].Name;
+ end;
+ end;
+ Sep := FSeparator;
+ end;
+
+ Output.Add(Line); Line := ''; Sep := '';
+ MyDataSet.First;
+
+// Indent := 0;
+ while not MyDataSet.Eof do begin
+
+ case FType of
+ eXML: Line := Line + ' ' + #10;
+ eHTML: Line := Line + '' + #10;
+ end;
+
+ for i := 0 to MyDataSet.FieldDefs.Count - 1 do begin
+ case FType of
+ eXML: begin
+ Line := Line + ' <' + MyDataSet.FieldDefs[i].Name + '>' +
+ MyDataSet.FieldByName(MyDataSet.FieldDefs[i].Name).AsString +
+ '' + MyDataSet.FieldDefs[i].Name + '>' + #10;
+ end;
+ eHTML: begin
+ Line := Line + '' + MyDataSet.FieldByName(MyDataSet.FieldDefs[i].Name).AsString + ' ';
+ end;
+ eTXT: begin
+ Line := Line + Sep + MyDataSet.FieldByName(MyDataSet.FieldDefs[i].Name).AsString;
+ end;
+ end;
+ Sep := FSeparator;
+ end;
+
+ case FType of
+ eXML: Line := Line + ' ' + #10;
+ eHTML: Line := Line + ' ' + #10;
+ end;
+
+ Output.Add(Line); Line := ''; Sep := '';
+ MyDataSet.Next;
+ end;
+
+ case FType of
+ eXML: Line := Line + '
' + #10;
+ eHTML: Line := Line + '
' + #10 + '' + #10 + '' + #10;
+ end;
+ Output.Add(Line);
+ end;
+end;
+
+{$IFDEF IPROVIDER}
+procedure TASQLite3BaseQuery.PSEndTransaction(Commit: Boolean);
+begin
+ // qui non sono molto sicuro...
+ if Assigned(Connection) then
+ if Commit then
+ Connection.Commit
+ else
+ Connection.RollBack;
+end;
+
+procedure TASQLite3BaseQuery.PSExecute;
+begin
+ UniDirectional := true;
+ ExecSQL;
+end;
+
+function TASQLite3BaseQuery.PSExecuteStatement(const ASQL: string;
+ AParams: TParams; ResultSet: Pointer): Integer;
+var
+ AsqlQry : TASQLite3BaseQuery;
+begin
+ if Assigned(ResultSet) then
+ begin
+ TDataSet(ResultSet^) := TASQLite3Query.Create(nil);
+{$IFDEF ASQLITE_D6PLUS}
+ TASQlite3Query(ResultSet^).SetUniDirectional(true);// := true; // just store data in provider.
+{$endif}
+ with TASQLite3BaseQuery(ResultSet^) do begin
+ Connection := self.Connection;
+ Params.Assign(AParams);
+ FPrepared := ASql;
+ if FParams.Count > 0 then
+ FPrepared := SetQueryParams(FPrepared);
+ Open;
+ Result := Connection.RowsAffected;
+ end;
+ end
+ else
+ begin
+ AsqlQry := TASQLite3BaseQuery.Create(nil);
+ try
+ with AsqlQry do begin
+ Connection := self.Connection;
+ FPrepared := ASql;
+ FParams.Assign(AParams);
+ if FParams.Count > 0 then
+ FPrepared := SetQueryParams(AsqlQry.FPrepared);
+ ExecSQL;
+ Result := Connection.RowsAffected;
+ end;
+ finally
+ AsqlQry.Free;
+ end;
+ end;
+end;
+
+function TASQLite3BaseQuery.PSGetParams: TParams;
+begin
+ Result := Params;
+end;
+
+function TASQLite3BaseQuery.PSGetQuoteChar: string;
+begin
+ Result := '"';
+end;
+
+function TASQLite3BaseQuery.PSGetTableName: string;
+begin
+ Result := GetTableNameFromSQL(FSQL.Text);
+end;
+
+function TASQLite3BaseQuery.PSInTransaction: Boolean;
+begin
+ Result := Assigned(Connection);
+end;
+
+function TASQLite3BaseQuery.PSIsSQLBased: Boolean;
+begin
+ Result := True;
+end;
+
+function TASQLite3BaseQuery.PSIsSQLSupported: Boolean;
+begin
+ Result := True;
+end;
+
+procedure TASQLite3BaseQuery.PSSetCommandText(const CommandText: string);
+begin
+ if CommandText <> '' then begin
+ FSQL.Text := CommandText;
+ FPrepared := CommandText;
+ end;
+end;
+
+procedure TASQLite3BaseQuery.PSSetParams(AParams: TParams);
+begin
+ if AParams.Count <> 0 then
+ Params.Assign(AParams);
+ Close;
+end;
+
+procedure TASQLite3BaseQuery.PSStartTransaction;
+begin
+ StartTransaction;
+end;
+
+procedure TASQLite3BaseQuery.PSReset;
+begin
+ if Active then
+ begin
+ Close;
+ Open;
+ end;
+end;
+
+function TASQLite3BaseQuery.PSGetUpdateException(e: Exception; Prev: EUpdateError): EUpdateError;
+var
+ PrevErr : Integer;
+begin
+ // Generates an EUpdateError object based on another exception object.
+ if e is ASGError then begin
+ if Prev = nil then
+ PrevErr := Prev.errorCode
+ else
+ PrevErr := 0;
+ with ASGError(e) do
+ Result := EUpdateError.Create(e.Message, '', -1, PrevErr, e);
+ end else
+ Result := EUpdateError.Create(e.Message, '', -1, -1, e);
+end;
+
+function TASQLite3BaseQuery.PSUpdateRecord(UpdateKind: TUpdateKind; Delta: TDataSet): Boolean;
+begin
+ // OnUpdateRecord is not supported
+ Result := False;
+end;
+
+function TASQlite3BaseQuery.PSGetKeyFields: string;
+var
+ i : integer;
+begin
+ Result := '';
+ for i := 0 to (Fields.Count - 1) do begin
+ if pfInKey in Fields[i].ProviderFlags then begin
+ if Result <> '' then
+ Result := Result + ';';
+ Result := Result + Fields[i].FieldName;
+ end;
+ end;
+end;
+
+{$ENDIF}
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/asqlite_def.inc b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/asqlite_def.inc
new file mode 100644
index 0000000..bbd5e3b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/asqlite_def.inc
@@ -0,0 +1,99 @@
+{
+
+Aducom Software SQLite components
+Copyright (C) 2003-2006 by Aducom Software
+Albert Drent
+a.drent@aducom.com
+for questions please register on the forum on www.aducom.com/sqlite
+}
+
+{$IFDEF VER125}{C4}{$B-}{$X+}{$T-}{$H+}{$ENDIF}
+{$IFDEF VER110}{C3}{$B-}{$X+}{$T-}{$H+}{$ENDIF}
+{$IFDEF VER93}{C1}{$B-}{$X+}{$T-}{$H+}{$ENDIF}
+{$IFDEF VER180}
+ {$DEFINE ASQLite_D2PLUS}
+ {$DEFINE ASQLite_D3PLUS}
+ {$DEFINE ASQLite_D4PLUS}
+ {$DEFINE ASQLite_D5PLUS}
+ {$DEFINE ASQLite_D6PLUS}
+ {$DEFINE ASQLite_D7PLUS}
+ {$DEFINE ASQLite_D2005PLUS}
+ {$DEFINE ASQLite_D2006PLUS}
+ {DELPHI10}
+ {$B-}{$X+}{$T-}{$H+}
+ {$DEFINE ASQLite_DYNARRAY}
+{$ENDIF}
+{$IFDEF VER170}
+ {$DEFINE ASQLite_D2PLUS}
+ {$DEFINE ASQLite_D3PLUS}
+ {$DEFINE ASQLite_D4PLUS}
+ {$DEFINE ASQLite_D5PLUS}
+ {$DEFINE ASQLite_D6PLUS}
+ {$DEFINE ASQLite_D7PLUS}
+ {$DEFINE ASQLite_D2005PLUS}
+ {DELPHI9}
+ {$B-}{$X+}{$T-}{$H+}
+ {$DEFINE ASQLite_DYNARRAY}
+{$ENDIF}
+{$IFDEF VER150}
+ {$DEFINE ASQLite_D2PLUS}
+ {$DEFINE ASQLite_D3PLUS}
+ {$DEFINE ASQLite_D4PLUS}
+ {$DEFINE ASQLite_D5PLUS}
+ {$DEFINE ASQLite_D6PLUS}
+ {$DEFINE ASQLite_D7PLUS}
+ {DELPHI7}
+ {$B-}{$X+}{$T-}{$H+}
+ {$DEFINE ASQLite_DYNARRAY}
+{$ENDIF}
+{$IFDEF VER140}
+ {$DEFINE ASQLite_D2PLUS}
+ {$DEFINE ASQLite_D3PLUS}
+ {$DEFINE ASQLite_D4PLUS}
+ {$DEFINE ASQLite_D5PLUS}
+ {$DEFINE ASQLite_D6PLUS}
+ {DELPHI6}
+ {$B-}{$X+}{$T-}{$H+}
+ {$DEFINE ASQLite_DYNARRAY}
+{$ENDIF}
+{$IFDEF VER130}
+ {$DEFINE ASQLite_D2PLUS}
+ {$DEFINE ASQLite_D3PLUS}
+ {$DEFINE ASQLite_D4PLUS}
+ {$DEFINE ASQLite_D5PLUS}
+ {DELPHI5}
+ {$DEFINE ASQLite_DYNARRAY}
+ {$B-}{$X+}{$T-}{$H+}
+{$ENDIF}
+{$IFDEF VER120}
+ {$DEFINE ASQLite_D2PLUS}
+ {$DEFINE ASQLite_D3PLUS}
+ {$DEFINE ASQLite_D4PLUS}
+ {DELPHI4}
+ {$DEFINE ASQLite_DYNARRAY}
+ {$B-}{$X+}{$T-}{$H+}
+{$ENDIF}
+{$IFDEF VER100}
+ {$DEFINE ASQLite_D2PLUS}
+ {$DEFINE ASQLite_D3PLUS}
+ {$DEFINE ASQLite_NOINT64}
+ {DELPHI3}
+ {$B-}{$X+}{$T-}{$H+}
+{$ENDIF}
+{$IFDEF VER90}
+ {$DEFINE ASQLite_D2PLUS}
+ {$DEFINE ASQLite_NOINT64}
+ {$DEFINE ASQLite_NOWIDESTRING}
+ {DELPHI2}
+ {$B-}{$X+}{$T-}{$H+}
+{$ENDIF}
+
+{$IFDEF LINUX}{KYLIX}{$DEFINE CLX}{$ENDIF}
+{$IFDEF FPC}{$H+}{$MODE DELPHI}{$ENDIF}
+{$IFDEF ASQLite_D4PLUS}{$DEFINE ASQLite_HAVEVARIANT}{$ENDIF}
+{$R-}{$Q-}
+
+{$IFDEF CLX}
+{$DEFINE ASQLite_NOIDISPATCH} // not implemented
+{$ENDIF}
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAADODriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAADODriver.pas
new file mode 100644
index 0000000..3ee7b35
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAADODriver.pas
@@ -0,0 +1,1795 @@
+unit uDAADODriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_ADODriver_Glyphs.res}
+
+// with included option, you can receive errors like
+// Access violation at address 6BD7297F in module 'msado15.dll'. Read of address 00000068.
+{.$DEFINE ADOMONITOR_SHOWPARAMVALUES}
+
+interface
+
+uses Windows, Classes, DB, uDAEngine, uDAInterfaces, uDAADOInterfaces, uROClasses, ADODB,
+ uDAInterfacesEx, uDAUtils, uDAOracleInterfaces;
+
+type { TDAADODriver }
+ TDAADODriver = class(TDADriverReference)
+ end;
+ TDAEADODriver = class;
+
+ TDAADOMonitor = class
+ private
+ FDriver: TDAEADODriver;
+ FEnabled: Boolean;
+ FOnCallback: TDALogTraceEvent;
+ FTraceFlags: TDATraceOptions;
+ procedure SetEnabled(const Value: Boolean);
+ procedure SetTraceFlags(const Value: TDATraceOptions);
+ procedure SetOnCallback(const Value: TDALogTraceEvent);
+ procedure ADOConnectionBeginTransComplete(Connection: TADOConnection;
+ TransactionLevel: Integer; const Error: Error;
+ var EventStatus: TEventStatus);
+ procedure ADOConnectionCommitTransComplete(Connection: TADOConnection;
+ const Error: Error; var EventStatus: TEventStatus);
+ procedure ADOConnectionConnectComplete(Connection: TADOConnection;
+ const Error: Error; var EventStatus: TEventStatus);
+ procedure ADOConnectionExecuteComplete(Connection: TADOConnection;
+ RecordsAffected: Integer; const Error: Error;
+ var EventStatus: TEventStatus; const Command: _Command;
+ const Recordset: _Recordset);
+ procedure ADOConnectionInfoMessage(Connection: TADOConnection;
+ const Error: Error; var EventStatus: TEventStatus);
+ procedure ADOConnectionRollbackTransComplete(
+ Connection: TADOConnection; const Error: Error;
+ var EventStatus: TEventStatus);
+ procedure ADOConnectionDisconnect(Connection: TADOConnection;
+ var EventStatus: TEventStatus);
+ procedure ADOConnectionWillConnect(Connection: TADOConnection;
+ var ConnectionString, UserID, Password: WideString;
+ var ConnectOptions: TConnectOption; var EventStatus: TEventStatus);
+ procedure ADOConnectionWillExecute(Connection: TADOConnection;
+ var CommandText: WideString; var CursorType: TCursorType;
+ var LockType: TADOLockType; var CommandType: TCommandType;
+ var ExecuteOptions: TExecuteOptions; var EventStatus: TEventStatus;
+ const Command: _Command; const Recordset: _Recordset);
+ public
+ constructor Create(ADriver: TDAEADODriver);
+ procedure ReAssignEvents;
+ procedure AssignEvents(AConnection:TADOConnection);
+ procedure UnAssignEvents(AConnection:TADOConnection);
+ property Enabled : Boolean read FEnabled write SetEnabled;
+ property TraceFlags: TDATraceOptions read FTraceFlags write SetTraceFlags;
+ property OnCallback: TDALogTraceEvent read FOnCallback write SetOnCallback;
+ end;
+
+ { TDAEADODriver }
+ TDAEADODriver = class(TDAEDriver, IDADriver40)
+ private
+ FConnectionList: TThreadList;
+ FMonitor: TDAADOMonitor;
+ protected
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceFlags: TDATraceOptions; Callback: TDALogTraceEvent); override;
+ procedure RegisterConnection(AConnection: TADOConnection);
+ procedure UnregisterConnection(AConnection: TADOConnection);
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ procedure CustomizeConnectionObject(aConnection: TDAEConnection); override;
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+ procedure GetAuxDrivers(out List: IROStrings); override;
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override;
+ function GetProviderDefaultCustomParameters(Provider: string): string; safecall;
+ function GetDefaultConnectionType(const AuxDriver: string): string;override; safecall;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ end;
+
+ { TDAEADOConnection }
+ TDAEADOConnection = class(TDAEConnection,
+ IDAADOConnection, IDAConnectionModelling, IDACanQueryDatabaseNames,IDAFileBasedDatabase,
+ IDAUseGenerators,IDAUseGenerators2,IDAOracleConnection)
+ private
+ fProviderName: string;
+ fSchemaEnabled: Boolean;
+ fProviderType: TDAOleDBProviderType;
+ fADOConnection: TADOConnection;
+ fQuery_CursorType: TCursorType;
+ fQuery_CursorLocation: TCursorLocation;
+ fQuery_ADOLockType: TADOLockType;
+ procedure GetViewOrTableNames(const aType: string; const aSystemTables: boolean; List: IROStrings);
+ function CreateCompatibleQuery: IDADataset;
+
+ protected
+ function QueryInterface(const IID: TGUID; out Obj): HResult; override; stdcall;
+ function CreateCustomConnection: TCustomConnection; override;
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+
+ function GetQuoteChars: TDAQuoteCharArray; override;
+ function isAlive: Boolean; override; safecall;
+
+ // IADOConnection
+ function GetProviderName: string; safecall;
+ function GetProviderType: TDAOleDBProviderType; safecall;
+ function GetCommandTimeout: Integer; safecall;
+ procedure SetCommandTimeout(const Value: Integer); safecall;
+
+ // IDAConnectionModelling
+ function BuildCreateTableSQL(aDataSet: TDADataSet; const aOverrideName: string = ''): string; safecall;
+ procedure CreateTable(aDataSet: TDADataSet; const aOverrideName: string = ''); safecall;
+ function FieldToDeclaration(aField: TDAField): string; safecall;
+
+ // IDACanQueryDatabaseNames
+ function GetDatabaseNames: IROStrings;
+ function GetSPSelectSyntax(HasArguments: Boolean): String; override; safecall;
+ // IDAFileBasedDatabase
+ function GetFileExtensions: IROStrings;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; safecall;
+ { IDAUseGenerators }
+ function GetNextAutoinc(const GeneratorName: string): integer; safecall;
+ { IDAUseGenerators2 }
+ function GetNextAutoinc2(const GeneratorName: string): variant; safecall;
+ public
+ constructor Create(aDriver: TDAEDriver; aName: string = ''); override;
+ destructor Destroy; override;
+ property SchemaEnabled: Boolean read fSchemaEnabled write fSchemaEnabled;
+ end;
+
+ { TDAEADOQuery }
+ TDAEADOQuery = class(TDAEDataset, IDAMustSetParams)
+ private
+
+ protected
+ procedure ClearParams; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+
+
+ // IDAMustSetParams
+ procedure SetParamValues(Params: TDAParamCollection); override;safecall;
+ procedure RefreshParams; override; safecall;
+ procedure GetParamValues(Params: TDAParamCollection); override;safecall;
+
+ public
+ end;
+
+ { TDAEADOStoredProcedure }
+ TDAEADOStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override;
+ function Execute: integer; override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(Params: TDAParamCollection); override;safecall;
+ procedure GetParamValues(Params: TDAParamCollection); override;safecall;
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses SysUtils, uDADriverManager, uDARes, Variants, ADOInt, uDAMacroProcessors,
+ Math, uDAHelpers, uROBinaryHelpers, uDAPostgresInterfaces;
+
+const
+ Default_CursorType = ctOpenForwardOnly;
+ Default_CursorLocation = clUseServer;
+ Default_ADOLockType = ltReadOnly;
+
+const
+ TConnectOptionStr: array[TConnectOption] of string = ('coConnectUnspecified', 'coAsyncConnect');
+ TCursorLocationStr: array[TCursorLocation] of string = ('clUseServer', 'clUseClient');
+ TCursorTypeStr: array[TCursorType] of string = ('ctUnspecified', 'ctOpenForwardOnly', 'ctKeyset', 'ctDynamic','ctStatic');
+ TEventStatusStr: array[TEventStatus] of string = ('esOK', 'esErrorsOccured', 'esCantDeny', 'esCancel', 'esUnwantedEvent');
+ TADOLockTypeStr: array[TADOLockType] of string = ('ltUnspecified', 'ltReadOnly', 'ltPessimistic', 'ltOptimistic', 'ltBatchOptimistic');
+ TCommandTypeStr: array[TCommandType] of string = ('cmdUnknown', 'cmdText', 'cmdTable', 'cmdStoredProc', 'cmdFile', 'cmdTableDirect');
+ TExecuteOptionStr: array[TExecuteOption] of string = ('eoAsyncExecute', 'eoAsyncFetch', 'eoAsyncFetchNonBlocking','eoExecuteNoRecords');
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAADODriver]);
+end;
+
+function GetDriverObject: IDADriver;
+begin
+ if (_driver = nil) then _driver := TDAEADODriver.Create(nil);
+ result := _driver;
+end;
+
+type
+ TDecimalVariant = packed record
+ VarType: TVarType;
+ scale: Byte;
+ sign: Byte;
+ Hi32: Cardinal;
+ Lo32: Cardinal;
+ Mid32: Cardinal;
+ Dummy: Cardinal;
+ end;
+
+function DecimalToInt64(const V: Variant): variant;
+var
+ vData: TDecimalVariant absolute V;
+begin
+ if VarIsNull(v) or VarIsEmpty(v) then
+ VarClear(Result)
+ else if (vData.VarType = 14) and (vData.scale = 0) and (vData.Hi32 = 0) then begin
+ Result := Int64(vData.Lo32) or (Int64(vData.Mid32) shl 32);
+ if vData.sign <> 0 then result := -Result;
+ end else result := v;
+end;
+
+function Int64ToDecimal(Data: Variant): Variant;
+var
+ vd: TDecimalVariant absolute Result;
+ lint64: int64;
+begin
+ VarClear(Result);
+ if VarIsNull(Data) or VarIsEmpty(Data) then Exit;
+ lint64 := Data;
+ vd.scale := 0;
+ if lint64 < 0 then begin
+ vd.Sign := 128;
+ lint64 := -lint64;
+ end else
+ vd.sign := 0;
+ vd.Hi32 := 0;
+ vd.Mid32 := int64(lint64 shr 32);
+ vd.Lo32 := lint64;
+ vd.VarType := 14;
+end;
+
+
+{ TDAEADOConnection }
+
+procedure TDAEADOConnection.DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+var
+ lConnectionString: string;
+ i: Integer;
+ sName,sValue: string;
+begin
+ inherited;
+
+ with aConnStrParser do begin
+ lConnectionString := '';
+ if AuxDriver <> '' then lConnectionString := lConnectionString + 'Provider=' + AuxDriver + ';' else
+ raise EDADriverException.Create('No aux driver specified for ADO connection');
+
+ fProviderName := AuxDriver;
+ fProviderType := OleDBDriverIdToOleDBProviderType(fProviderName);
+
+ if (Self.UserID <> '') then
+ lConnectionString := lConnectionString + 'User ID=' + Self.UserID + ';'
+ else if (UserID <> '') then
+ lConnectionString := lConnectionString + 'User ID=' + UserID + ';';
+
+ if (Self.Password <> '') then
+ lConnectionString := lConnectionString + 'Password=' + Self.Password + ';'
+ else if (Password <> '') then
+ lConnectionString := lConnectionString + 'Password=' + Password + ';';
+
+ if fProviderType = oledb_Jet then begin
+ lConnectionString := lConnectionString + 'Data Source=' + Database+';';
+ end else begin
+ if Database <> '' then begin
+ if fProviderType = oledb_Postgresql then
+ lConnectionString := lConnectionString + 'Location=' + Database + ';'
+ else
+ lConnectionString := lConnectionString + 'Initial Catalog=' + Database + ';';
+ end;
+ if Server <> '' then lConnectionString := lConnectionString + 'Data Source=' + Server + ';';
+
+ if fProviderType <> oledb_Postgresql then
+ lConnectionString := lConnectionString + 'OLE DB SERVICES=-2;';
+ end;
+ fSchemaEnabled := false;
+ for i := 0 to AuxParamsCount -1 do
+ begin
+ sName := AuxParamNames[i];
+ if sName = '' then Continue;
+ sValue := AuxParams[AuxParamNames[i]];
+ if AnsiSameText('SCHEMAS',sName) then
+ fSchemaEnabled := sValue = '1'
+ else if AnsiSameText(sName, 'CursorLocation') then begin
+ if AnsiSameText('clUseServer',sValue) then
+ fQuery_CursorLocation:= clUseServer
+ else if AnsiSameText('clUseClient',sValue) then
+ fQuery_CursorLocation:= clUseClient;
+ end else if AnsiSameText(sName,'CursorType') then begin
+ if AnsiSameText('ctUnspecified',sValue) then
+ fQuery_CursorType:=ctUnspecified
+ else if AnsiSameText('ctOpenForwardOnly',sValue) then
+ fQuery_CursorType:=ctOpenForwardOnly
+ else if AnsiSameText('ctKeyset',sValue) then
+ fQuery_CursorType:=ctKeyset
+ else if AnsiSameText('ctDynamic',sValue) then
+ fQuery_CursorType:=ctDynamic
+ else if AnsiSameText('ctStatic',sValue) then
+ fQuery_CursorType:=ctStatic;
+ end else if AnsiSameText(sName, 'LockType') then begin
+ if AnsiSameText('ltUnspecified',sValue) then
+ fQuery_ADOLockType:= ltUnspecified
+ else if AnsiSameText('ltReadOnly',sValue) then
+ fQuery_ADOLockType:= ltReadOnly
+ else if AnsiSameText('ltPessimistic',sValue) then
+ fQuery_ADOLockType:= ltPessimistic
+ else if AnsiSameText('ltOptimistic',sValue) then
+ fQuery_ADOLockType:= ltOptimistic
+ else if AnsiSameText('ltBatchOptimistic',sValue) then
+ fQuery_ADOLockType:= ltBatchOptimistic;
+ end else begin
+ if sName[1] = '@' then sName:= Pchar(sName)+1;
+ lConnectionString := lConnectionString + sName + '=' + sValue +';';
+ end;
+ end;
+ fADOConnection.ConnectionString := lConnectionString;
+ end;
+ SchemaEnabled := fSchemaEnabled or ((UpperCase(GetProviderName) = 'SQLNCLI') or (UpperCase(GetProviderName) ='SQLNCLI.1'));
+ if fProviderType = oledb_Postgresql then fQuery_CursorLocation:=clUseClient; // ADOQuery can't process correctly "name" datatype of Postgres
+ if fProviderType = oledb_Oracle then fQuery_CursorLocation:=clUseClient; // Oracle don't work correctly without clUseClient
+end;
+
+function TDAEADOConnection.DoBeginTransaction: integer;
+begin
+ result := fADOConnection.BeginTrans
+end;
+
+procedure TDAEADOConnection.DoCommitTransaction;
+begin
+ fADOConnection.CommitTrans
+end;
+
+function TDAEADOConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fSchemaEnabled := true;
+ fADOConnection := TADOConnection.Create(nil);
+ fADOConnection.LoginPrompt := FALSE;
+ if Assigned(fADOConnection) then TDAEADODriver(Driver).RegisterConnection(fADOConnection);
+ result := fADOConnection;
+end;
+
+function TDAEADOConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEADOQuery;
+end;
+
+function TDAEADOConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEADOStoredProcedure;
+end;
+
+procedure TDAEADOConnection.DoGetStoredProcedureNames(out List: IROStrings);
+var
+ Schema, NameField: TField;
+ DataSet: TADODataSet;
+ lName: string;
+ p: integer;
+begin
+ inherited;
+ case fProviderType of
+ oledb_MSSQL, oledb_MSSQL2005, oledb_MSSQL2008: MSSQL_DoGetNames(CreateCompatibleQuery,List,dotProcedure,SchemaEnabled);
+ oledb_Postgresql: Postgres_DoGetNames(CreateCompatibleQuery,List,dotProcedure);
+ oledb_Oracle: Oracle_DoGetNames(CreateCompatibleQuery,List,dotProcedure);
+ else
+ fADOConnection.Open();
+ DataSet := TADODataSet.Create(nil);
+ try
+ fADOConnection.OpenSchema(siProcedures, EmptyParam, EmptyParam, DataSet);
+ NameField := DataSet.FieldByName('PROCEDURE_NAME');
+ Schema := DataSet.Findfield('PROCEDURE_SCHEMA');
+ while not DataSet.EOF do begin
+ lName := NameField.AsString;
+ if (Schema <> nil) and (Schema.Value = 'sys') then begin dataset.Next; continue; end;
+ p := Pos(';', lName);
+ if p > 1 then begin
+ if P+1 >= length(lName) then begin
+ if lName[p+1] = '0' then // function
+ begin
+ Dataset.Next;
+ continue;
+ end;
+ end;
+ SetLength(lName, p-1);
+ end;
+ if fSchemaEnabled and (Schema <> nil) and not (VarIsNull(Schema.Value)) then
+ List.Add(Schema.AsString + '.' + lName)
+ else
+ List.Add(lName);
+ DataSet.Next;
+ end;
+ finally
+ DataSet.Free;
+ end;
+ end;
+end;
+
+function ADOTypeToFieldType(const ADOType: DataTypeEnum; EnableBCD: Boolean = False): TFieldType;
+begin
+ case ADOType of
+ adEmpty: Result := ftUnknown;
+ adTinyInt, adSmallInt: Result := ftSmallint;
+ adError, adInteger, adUnsignedInt: Result := ftInteger;
+ adBigInt, adUnsignedBigInt: Result := ftLargeInt;
+ adUnsignedTinyInt, adUnsignedSmallInt: Result := ftWord;
+ adSingle, adDouble: Result := ftFloat;
+ adCurrency: Result := ftCurrency;
+ adBoolean: Result := ftBoolean;
+ adDBDate: Result := ftDate;
+ adDBTime: Result := ftTime;
+ adDate, adDBTimeStamp, adFileTime, adDBFileTime: Result := ftDateTime;
+ adChar: Result := ftFixedChar;
+ adVarChar: Result := ftString;
+ adBSTR, adWChar, adVarWChar: Result := ftWideString;
+ adLongVarChar, adLongVarWChar: Result := ftMemo;
+ adLongVarBinary: Result := ftBlob;
+ adBinary: Result := ftBytes;
+ adVarBinary: Result := ftVarBytes;
+ adChapter: Result := ftDataSet;
+ adPropVariant, adVariant: Result := ftVariant;
+ adIUnknown: Result := ftInterface;
+ adIDispatch: Result := ftIDispatch;
+ adGUID: Result := ftGUID;
+ adDecimal, adNumeric, adVarNumeric:
+ if EnableBCD then
+ Result := ftBCD
+ else
+ Result := ftFloat;
+ else
+ Result := ftUnknown;
+ end;
+end;
+
+(*procedure TDAEADOConnection.DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection);
+var
+ DataSet: TADODataSet;
+begin
+ fADOConnection.Open();
+ DataSet := TADODataSet.Create(nil);
+ try
+ fADOConnection.OpenSchema(siProcedureParameters, VarArrayOf([Null, Null, aStoredProcedureName]), EmptyParam, DataSet);
+ //NameField := DataSet.FieldByName('PROCEDURE_NAME'); { do not localize }
+ Params := TDAParamCollection.Create(NIL);
+ while not DataSet.EOF do begin
+ with Params.Add() do begin
+ Name := DataSet.FieldByName('PARAMETER_NAME').AsString;
+ ParamType := TDAParamType(DataSet.FieldByName('PARAMETER_TYPE').AsInteger);
+ //DataType := TDADataType(DataSet.FieldByName('DATA_TYPE').AsInteger);
+ DataType := VCLTypeToDAType(ADOTypeToFieldType(DataSet.FieldByName('DATA_TYPE').AsInteger));
+ Size := DataSet.FieldByName('CHARACTER_MAXIMUM_LENGTH').AsInteger
+ //more info available:
+ //'PARAMETER_HASDEFAULT'
+ //'PARAMETER_DEFAULT'
+ //'IS_NULLABLE'
+ //'DATA_TYPE'
+ //'CHARACTER_MAXIMUM_LENGTH'
+ //'CHARACTER_OCTET_LENGTH'
+ //'DESCRIPTION'
+ //'TYPE_NAME'
+ //'LOCAL_TYPE_NAME'
+ end;
+ //List.Add(NameField.AsString);
+ DataSet.Next;
+ end;
+ finally
+ DataSet.Free;
+ end;
+end;*)
+
+procedure TDAEADOConnection.DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection);
+var
+ lField: TDAField;
+ //i: Integer;
+ DataSet: TADODataSet;
+begin
+ case fProviderType of
+ oledb_MSSQL, oledb_MSSQL2005, oledb_MSSQL2008: MSSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName),CreateCompatibleQuery,Fields);
+ oledb_Postgresql: Postgres_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName),CreateCompatibleQuery,Fields);
+ oledb_Oracle: Oracle_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName),CreateCompatibleQuery,Fields);
+ else
+ fADOConnection.Open();
+ DataSet := TADODataSet.Create(nil);
+ try
+ if (pos('.', aTableName) > 0) and (SchemaEnabled) then
+ fADOConnection.OpenSchema(siColumns, VarArrayOf([Unassigned, Copy(aTableName, 1, Pos('.', aTableName)-1), Copy(aTableName, Pos('.', aTableName)+1, MaxInt)]), EmptyParam, DataSet)
+ else
+ fADOConnection.OpenSchema(siColumns, VarArrayOf([Unassigned, Unassigned, aTableName]), EmptyParam, DataSet);
+ //NameField := DataSet.FieldByName('PROCEDURE_NAME'); { do not localize }
+ if DataSet.EOF then begin
+ inherited DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), Fields);
+ exit ;
+ end;
+
+ Fields := TDAFieldCollection.Create(nil);
+
+ {for i := 0 to DataSet.FieldCount-1 do begin
+ DebugServer.Wre(DataSet.Fields[i].FieldName);
+ end; { for }
+
+ while not DataSet.EOF do begin
+ with Fields.Add() do begin
+ Name := DataSet.FieldByName('COLUMN_NAME').AsString;
+ DataType := VCLTypeToDAType(ADOTypeToFieldType(DataSet.FieldByName('DATA_TYPE').AsInteger));
+ Size := DataSet.FieldByName('CHARACTER_MAXIMUM_LENGTH').AsInteger;
+ Description := DataSet.FieldByName('DESCRIPTION').AsString;
+ // NotNull := DataSet.FieldByName('IS_NULLABLE').AsBoolean;
+ Required := not DataSet.FieldByName('IS_NULLABLE').AsBoolean;
+
+ { Hack: for Memo fields ADO seems to return datString, with a lenght of $7fffffff }
+ //if (DataType = datString) and (Size = $7FFFFFFF) then
+ if (DataType = datString) and (Size > $100000) then
+ DataType := datMemo;
+ if (DAtaType = datWideString) and (Size > $100000) then
+ DataType := datWideMemo;
+
+ if DataSet.FieldByName('COLUMN_HASDEFAULT').AsBoolean then
+ begin
+ DefaultValue := DataSet.FieldByName('COLUMN_DEFAULT').AsString;
+ if not TestDefaultValue(DefaultValue, DataType) then
+ DefaultValue := '';
+ end;
+
+ if ADOTypeToFieldType(DataSet.FieldByName('DATA_TYPE').AsInteger) = ftGUID then begin
+ Size := 38; { Quickhack, until we have proper GUID support in 3.0 }
+ if DefaultValue = 'newid()' then DefaultValue := Unassigned;
+ end;
+
+
+ //more info available:
+ //'COLUMN_HASDEFAULT'
+ //'COLUMN_DEFAULT'
+ //'IS_NULLABLE'
+ //'DATA_TYPE'
+ //'CHARACTER_MAXIMUM_LENGTH'
+ end;
+ //List.Add(NameField.AsString);
+ DataSet.Next;
+ end;
+
+ if (pos('.', aTableName) > 0) and (SchemaEnabled) then
+ fADOConnection.OpenSchema(siPrimaryKeys, VarArrayOf([Unassigned, Copy(aTableName, 1, Pos('.', aTableName)-1), Copy(aTableName, Pos('.', aTableName)+1, MaxInt)]), EmptyParam, DataSet)
+ else
+ fADOConnection.OpenSchema(siPrimaryKeys, VarArrayOf([Unassigned, Unassigned, aTableName]), EmptyParam, DataSet);
+ {for i := 0 to DataSet.FieldCount-1 do begin
+ DebugServer.Write(DataSet.Fields[i].FieldName);
+ end; { for }
+ while not DataSet.EOF do begin
+ lField := Fields.FieldByName(DataSet.FieldByName('COLUMN_NAME').AsString);
+ if Assigned(lField) then
+ lField.InPrimaryKey := true;
+
+ DataSet.Next();
+ end;
+ finally
+ DataSet.Free;
+ end;
+ end;
+end;
+
+procedure TDAEADOConnection.DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection);
+var
+ //i: Integer;
+ DataSet: TADODataSet;
+ s: string;
+ PKSchema,FKSchema: TField;
+begin
+ inherited;
+ case fProviderType of
+ oledb_MSSQL, oledb_MSSQL2005, oledb_MSSQL2008: MSSQL_DoGetForeignKeys(CreateCompatibleQuery, ForeignKeys, SchemaEnabled);
+ oledb_Postgresql: Postgres_DoGetForeignKeys(CreateCompatibleQuery, ForeignKeys);
+ oledb_Oracle: Oracle_DoGetForeignKeys(CreateCompatibleQuery, ForeignKeys);
+ else
+ s := UpperCase(GetProviderName);
+ fADOConnection.Open();
+ DataSet := TADODataSet.Create(nil);
+ try
+ fADOConnection.OpenSchema(siForeignKeys, EmptyParam, EmptyParam, DataSet);
+ {for i := 0 to DataSet.FieldCount-1 do begin
+ DebugServer.Write(DataSet.Fields[i].FieldName);
+ end; { for }
+ PKSchema := DataSet.FindField('PK_TABLE_SCHEMA');
+ FKSchema := DataSet.FindField('FK_TABLE_SCHEMA');
+ while not DataSet.EOF do begin
+ {lField := Fields.FieldByName(DataSet.FieldByName('COLUMN_NAME').AsString);
+ if Assigned(lField) then
+ lField.InPrimaryKey := true;}
+ with ForeignKeys.Add() do begin
+ FKField := DataSet.FieldByName('FK_COLUMN_NAME').AsString;
+ PKField := DataSet.FieldByName('PK_COLUMN_NAME').AsString;
+ //FKTable := DataSet.FieldByName('FK_TABLE_NAME').AsString;
+ //PKTable := DataSet.FieldByName('PK_TABLE_NAME').AsString;
+ if fSchemaEnabled and (PKSchema <> nil) and not (VarIsNull(PKSchema.Value)) then
+ PKTable := PKSchema.AsString + '.' + DataSet.FieldByName('PK_TABLE_NAME').AsString
+ else
+ PKTable := DataSet.FieldByName('PK_TABLE_NAME').AsString;
+ if fSchemaEnabled and (FKSchema <> nil) and not (VarIsNull(FKSchema.Value)) then
+ FKTable := FKSchema.AsString + '.' + DataSet.FieldByName('FK_TABLE_NAME').AsString
+ else
+ FKTable := DataSet.FieldByName('FK_TABLE_NAME').AsString;
+
+ end;
+ {DebugServer.Write(DataSet.FieldByName('FK_TABLE_NAME').AsString+'.'+DataSet.FieldByName('FK_COLUMN_NAME').AsString+' => '+
+ DataSet.FieldByName('PK_COLUMN_NAME').AsString);}
+
+ DataSet.Next();
+ end;
+
+
+ finally
+ DataSet.Free;
+ end;
+ end;
+end;
+
+procedure TDAEADOConnection.GetViewOrTableNames(const aType: string; const aSystemTables: boolean; List: IROStrings);
+var
+ SchemaField,
+ TypeField,
+ NameField: TField;
+ TableType: string;
+ DataSet: TADODataSet;
+begin
+ fADOConnection.Open();
+
+ DataSet := TADODataSet.Create(nil);
+ try
+ fADOConnection.OpenSchema(siTables, EmptyParam, EmptyParam, DataSet);
+
+ TypeField := DataSet.FieldByName('TABLE_TYPE'); { do not localize }
+ NameField := DataSet.FieldByName('TABLE_NAME'); { do not localize }
+ SchemaField := DataSet.FindField('TABLE_SCHEMA');
+ while not DataSet.EOF do begin
+ TableType := TypeField.AsString;
+ if (TableType = aType) or ((aType = 'TABLE') and (TableType ='ACCESS TABLE')) or (aSystemTables and (TableType = 'SYSTEM TABLE')) then
+ begin
+ if fSchemaEnabled and (SchemaField <> nil) and not (VarIsNull(SchemaField.Value)) then
+ List.Add(SchemaField.AsString + '.' + NameField.AsString)
+ else
+ List.Add(NameField.AsString);
+ end;
+ DataSet.Next;
+ end;
+ finally
+ DataSet.Free;
+ end;
+end;
+
+procedure TDAEADOConnection.DoGetViewNames(out List: IROStrings);
+var
+ Schema,NameField: TField;
+ DataSet: TADODataSet;
+ lName: string;
+ p: integer;
+begin
+ inherited;
+ case fProviderType of
+ oledb_MSSQL, oledb_MSSQL2005, oledb_MSSQL2008: MSSQL_DoGetNames(CreateCompatibleQuery,List,dotView,SchemaEnabled);
+ oledb_Postgresql: Postgres_DoGetNames(CreateCompatibleQuery,List,dotView);
+ oledb_Oracle: Oracle_DoGetNames(CreateCompatibleQuery,List,dotView);
+ else
+ GetViewOrTableNames('VIEW', false, List);
+ fADOConnection.Open();
+ DataSet := TADODataSet.Create(nil);
+ try
+ fADOConnection.OpenSchema(siProcedures, EmptyParam, EmptyParam, DataSet);
+ NameField := DataSet.FieldByName('PROCEDURE_NAME'); { do not localize }
+ Schema := DataSet.Findfield('PROCEDURE_SCHEMA');
+ if List = nil then
+ List := NewROStrings();
+ while not DataSet.EOF do begin
+ lName := NameField.AsString;
+ if (Schema <> nil) and (Schema.Value = 'sys') then begin dataset.Next; continue; end;
+ p := Pos(';', lName);
+ if p > 1 then begin
+ if P+1 >= length(lName) then begin
+ if lName[p+1] = '1' then // procedure
+ begin
+ Dataset.Next;
+ continue;
+ end;
+ end;
+ SetLength(lName, p-1);
+ end;
+ if fSchemaEnabled and (Schema <> nil) and not (VarIsNull(Schema.Value)) then
+ List.Add(Schema.AsString + '.' + lName)
+ else
+ List.Add(lName);
+ DataSet.Next;
+ end;
+ finally
+ DataSet.Free;
+ end;
+ end;
+end;
+
+procedure TDAEADOConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited;
+ case fProviderType of
+ oledb_MSSQL, oledb_MSSQL2005, oledb_MSSQL2008: MSSQL_DoGetNames(CreateCompatibleQuery,List,dotTable,SchemaEnabled);
+ oledb_Postgresql: Postgres_DoGetNames(CreateCompatibleQuery,List,dotTable);
+ oledb_Oracle: Oracle_DoGetNames(CreateCompatibleQuery,List,dotTable);
+ else
+ GetViewOrTableNames('TABLE', false, List);
+ end;
+end;
+
+procedure TDAEADOConnection.DoRollbackTransaction;
+begin
+ fADOConnection.RollbackTrans
+end;
+
+function TDAEADOConnection.GetQuoteChars: TDAQuoteCharArray;
+begin
+ case fProviderType of
+ oledb_Oracle: Result:= Oracle_GetQuoteChars;
+ else
+ result:=MSSQL_GetQuoteChars;
+ end;
+end;
+
+function TDAEADOConnection.DoGetInTransaction: boolean;
+begin
+ result := fADOConnection.InTransaction
+end;
+
+function TDAEADOConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+var
+ ds: IDADataset;
+begin
+ case fProviderType of
+ oledb_MSSQL, oledb_MSSQL2005, oledb_MSSQL2008: begin
+ Result := MSSQL_DoGetLastAutoInc(GeneratorName,CreateCompatibleQuery);
+ end;
+ oledb_Jet: begin
+ ds := NewDataset('SELECT @@Identity', ''); // Returns 0 by default
+ ds.Open;
+ result := ds.Fields[0].Value;
+ end;
+ oledb_Postgresql: Result := Postgres_DoGetLastAutoInc(GeneratorName,CreateCompatibleQuery);
+ oledb_Oracle: Result := Oracle_DoGetLastAutoInc(GeneratorName,CreateCompatibleQuery);
+ else
+ result := inherited DoGetLastAutoInc(GeneratorName);
+ end;
+end;
+
+function TDAEADOConnection.GetProviderName: string;
+begin
+ result := fProviderName;
+end;
+
+function TDAEADOConnection.GetProviderType: TDAOleDBProviderType;
+begin
+ result := fProviderType;
+end;
+
+function TDAEADOConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ case fProviderType of
+ oledb_MSSQL, oledb_MSSQL2005, oledb_MSSQL2008: Result := MSSQL_CreateMacroProcessor;
+ oledb_Jet: result := MSSQL_CreateMacroProcessor;
+ oledb_Oracle: Result := Oracle_CreateMacroProcessor;
+ else
+ Result:= inherited CreateMacroProcessor;
+ end;
+end;
+
+procedure TDAEADOConnection.CreateTable(aDataSet: TDADataSet; const aOverrideName: string);
+var
+ lSQL: string;
+begin
+ lSQL := BuildCreateTableSQL(aDataSet, aOverrideName);
+ with NewCommand(lSQL, stSQL) do begin
+ Execute();
+ end; { with }
+end;
+
+function TDAEADOConnection.BuildCreateTableSQL(aDataSet: TDADataSet; const aOverrideName: string): string;
+var
+ lName: string;
+begin
+ lName := aOverrideName;
+ if lName = '' then lName := aDataSet.Name;
+ result := uDAHelpers.BuildCreateStatementForTable(aDataSet, lName, self);
+end;
+
+function TDAEADOConnection.FieldToDeclaration(aField: TDAField): string;
+begin
+ case aField.DataType of
+ datUnknown: result := 'unknown';
+ datString: result := Format('varchar(%d)', [aField.Size]);
+ datDateTime: result := 'datetime';
+ datFloat: result := 'float';
+ datCurrency: result := 'money';
+ datAutoInc: result := 'int IDENTITY(1,1)';
+ datLargeAutoInc: result := 'bigint IDENTITY(1,1)';
+ datInteger: result := 'int';
+ datLargeInt: result := 'largeint';
+ datBoolean: result := 'bit';
+ datMemo: result := 'text';
+ datWideMemo: result := 'ntext';
+ datBlob: result := 'image';
+ //datGuid:result := 'uniqueidentifier';
+ end; { case }
+end;
+
+function TDAEADOConnection.GetDatabaseNames: IROStrings;
+begin
+ case fProviderType of
+ oledb_Jet: Result := NewROStrings;
+ oledb_Postgresql: Result:= Postgres_GetDatabaseNames(Self);
+ else
+ Result := MSSQL_GetDatabaseNames(Self);
+ end;
+end;
+
+function TDAEADOConnection.GetSPSelectSyntax(
+ HasArguments: Boolean): String;
+begin
+ case fProviderType of
+ oledb_MSSQL, oledb_MSSQL2005, oledb_MSSQL2008: Result := MSSQL_GetSPSelectSyntax(HasArguments);
+ oledb_Oracle: Result := Oracle_GetSPSelectSyntax(HasArguments);
+ oledb_Postgresql: Result:= Postgres_GetSPSelectSyntax(HasArguments);
+ else
+ Result := inherited GetSPSelectSyntax(HasArguments);
+ end;
+end;
+
+function TDAEADOConnection.GetCommandTimeout: Integer;
+begin
+ if fADOConnection <> nil then
+ Result:= fADOConnection.CommandTimeout
+ else
+ Result:=0;
+end;
+
+procedure TDAEADOConnection.SetCommandTimeout(const Value: Integer);
+begin
+ if fADOConnection <> nil then
+ fADOConnection.CommandTimeout:= Value;
+end;
+
+function TDAEADOConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(iIdentifier);
+ if not Result then
+ case fProviderType of
+ oledb_Oracle: Result:= Oracle_IdentifierNeedsQuoting(iIdentifier);
+ oledb_Postgresql: Result:= Postgres_IdentifierNeedsQuoting(iIdentifier);
+ else
+ Result:= MSSQL_IdentifierNeedsQuoting(iIdentifier);
+ end;
+end;
+
+function TDAEADOConnection.GetFileExtensions: IROStrings;
+begin
+ case fProviderType of
+ oledb_Jet: Result:=MSACCESS_GetFileExtensions;
+ else
+ result := NewROStrings;
+ end;
+end;
+
+function TDAEADOConnection.QueryInterface(const IID: TGUID;
+ out Obj): HResult;
+begin
+ Result := E_NOINTERFACE;
+ if IsEqualGUID(IID, IDAFileBasedDatabase) then begin
+ if not (fProviderType in [oledb_Jet]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDACanQueryDatabaseNames) then begin
+ if (fProviderType in [oledb_Jet]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDAUseGenerators) or IsEqualGUID(IID, IDAUseGenerators2) then begin
+ if not (fProviderType in [oledb_Oracle, oledb_Postgresql]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDAOracleConnection) then begin
+ if (fProviderType <> oledb_Oracle) then Exit;
+ end;
+
+ Result := inherited QueryInterface(IID, Obj);
+end;
+
+function TDAEADOConnection.isAlive: Boolean;
+begin
+ Result:=(ConnectionObject <> nil) and not (stClosed in fADOConnection.State);
+end;
+
+constructor TDAEADOConnection.Create(aDriver: TDAEDriver; aName: string);
+begin
+ inherited Create(aDriver, aName);
+ fQuery_CursorType := Default_CursorType;
+ fQuery_CursorLocation := Default_CursorLocation;
+ fQuery_ADOLockType := Default_ADOLockType;
+end;
+
+function TDAEADOConnection.GetNextAutoinc(const GeneratorName: string): integer;
+begin
+ Result := GetNextAutoinc2(GeneratorName);
+end;
+
+function TDAEADOConnection.CreateCompatibleQuery: IDADataset;
+begin
+ Result := GetDatasetClass.Create(Self);
+ TADOQuery(Result.Dataset).CursorLocation:=clUseClient;
+end;
+
+procedure TDAEADOConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ case fProviderType of
+ oledb_Postgresql: Postgres_DoGetStoredProcedureParams(aStoredProcedureName, CreateCompatibleQuery, Params);
+ oledb_Oracle: Oracle_DoGetStoredProcedureParams(aStoredProcedureName, CreateCompatibleQuery, Params);
+ oledb_MSSQL, oledb_MSSQL2005, oledb_MSSQL2008: MSSQL_DoGetStoredProcedureParams(aStoredProcedureName, CreateCompatibleQuery, Params);
+ else
+ inherited;
+ end;
+end;
+
+destructor TDAEADOConnection.Destroy;
+begin
+ if Assigned(fADOConnection) then TDAEADODriver(Driver).UnregisterConnection(fADOConnection);
+ inherited;
+end;
+
+function TDAEADOConnection.GetNextAutoinc2(
+ const GeneratorName: string): variant;
+begin
+ case fProviderType of
+ oledb_Oracle: Result:=Oracle_GetNextAutoinc(GeneratorName,CreateCompatibleQuery);
+ oledb_Postgresql: Result := Postgres_GetNextAutoInc(GeneratorName,CreateCompatibleQuery);
+ else
+ Result:=-1;
+ end;
+end;
+
+{ TDAEADODriver }
+
+function TDAEADODriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doAuxDriver, doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+function TDAEADODriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEADOConnection;
+end;
+
+function TDAEADODriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ case OleDBDriverIdToOleDBProviderType(AuxDriver) of
+ oledb_MSSQL,
+ oledb_MSSQL2005,
+ oledb_MSSQL2008 :Result:=MSSQL_DriverType;
+ oledb_Jet: Result := Access_DriverType;
+ oledb_Oracle: Result := Oracle_DriverType;
+ oledb_ODBC: Result := ODBC_DriverType;
+ oledb_Postgresql : Result := PostgreSQL_DriverType;
+ oleDb_VisualFoxPro: Result := FoxPro_DriverType;
+ else
+ Result:= inherited GetDefaultConnectionType(AuxDriver);
+ end;
+end;
+
+function TDAEADODriver.GetDescription: string;
+begin
+ result := 'Borland ADOExpress Driver';
+end;
+
+function TDAEADODriver.GetDriverID: string;
+begin
+ result := 'ADO';
+end;
+
+procedure TDAEADODriver.GetAuxDrivers(out List: IROStrings);
+var
+ i: TDAOleDBProviderType;
+begin
+ inherited;
+ for i := Low(TDAOleDBProviderType) to High(TDAOleDBProviderType) do
+ if (i <> oledb_Unknown) {// Redundant but safe if I change the enum later...} then List.Add(OleDBProviders[i]);
+end;
+
+function TDAEADODriver.GetProviderDefaultCustomParameters(
+ Provider: string): string;
+begin
+ if Sametext(Trim(Provider), oledb_MSSQL2005id) or
+ Sametext(Trim(Provider), oledb_MSSQL2008id) then Result := 'Schemas=1;Integrated Security=SSPI;' else
+ if SameText(Trim(Provider), oledb_MSSQLId) then Result := 'Integrated Security=SSPI;';
+end;
+
+procedure TDAEADODriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ if Sametext(Trim(AuxDriver), oledb_MSSQL2005id) or
+ SameText(Trim(AuxDriver), oledb_MSSQLId) or
+ Sametext(Trim(AuxDriver), oledb_MSSQL2008id) then
+ MSSQL_GetAuxParams(List);
+ List.Add('CursorLocation=(clUseServer,clUseClient)');
+ List.Add('CursorType=(ctUnspecified,ctOpenForwardOnly,ctKeyset,ctDynamic,ctStatic)');
+ List.Add('LockType=(ltUnspecified,ltReadOnly,ltPessimistic,ltOptimistic,ltBatchOptimistic)');
+ List.Add('');
+ List.Add('You can pass any parameters directly to driver. Use the prefix ''@'' for this, e.g.:');
+ List.Add('CursorLocation=clUseServer;@Mode=Read');
+end;
+
+procedure TDAEADODriver.CustomizeConnectionObject(
+ aConnection: TDAEConnection);
+begin
+ inherited;
+ if Assigned(FMonitor) then fMonitor.AssignEvents(TDAEADOConnection(aConnection).fADOConnection);
+end;
+
+constructor TDAEADODriver.Create(AOwner: TComponent);
+begin
+ FConnectionList:= TThreadList.Create;
+ inherited;
+end;
+
+destructor TDAEADODriver.Destroy;
+begin
+ inherited;
+ FConnectionList.Free;
+end;
+
+procedure TDAEADODriver.DoSetTraceOptions(TraceActive: boolean;
+ TraceFlags: TDATraceOptions; Callback: TDALogTraceEvent);
+begin
+ inherited;
+ if TraceActive then begin
+ if (FMonitor = nil) then fMonitor := TDAADOMonitor.Create(Self);
+ fMonitor.Enabled := FALSE;
+ fMonitor.TraceFlags := TraceFlags;
+ FMonitor.OnCallback := Callback;
+ fMonitor.Enabled := TRUE;
+ end
+ else begin
+ if (FMonitor <> nil) then begin
+ fMonitor.Enabled:=False;
+ FreeAndNIL(fMonitor);
+ end;
+ end;
+end;
+
+procedure TDAEADODriver.RegisterConnection(AConnection: TADOConnection);
+begin
+ FConnectionList.Add(AConnection);
+ if FMonitor <> nil then FMonitor.AssignEvents(AConnection);
+end;
+
+procedure TDAEADODriver.UnregisterConnection(AConnection: TADOConnection);
+begin
+ FConnectionList.Remove(AConnection);
+ if FMonitor <> nil then FMonitor.UnAssignEvents(AConnection);
+end;
+
+{ TDAEADOQuery }
+
+procedure TDAEADOQuery.ClearParams;
+begin
+ inherited;
+ TADOQuery(Dataset).Parameters.Clear;
+end;
+
+function TDAEADOQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TADOQuery.Create(nil);
+
+ TADOQuery(result).LockType := TDAEADOConnection(aConnection).fQuery_ADOLockType;// ltReadOnly;
+ TADOQuery(result).CursorLocation :=TDAEADOConnection(aConnection).fQuery_CursorLocation; // clUseClient;
+ TADOQuery(result).CursorType := TDAEADOConnection(aConnection).fQuery_CursorType; //ctOpenForwardOnly;
+ TADOQuery(result).Connection := TDAEADOConnection(aConnection).fADOConnection;
+ TADOQuery(result).EnableBCD := False;
+ TADOQuery(result).CacheSize := 25;
+// TADOQuery(result).Prepared := TRUE;
+ if TADOQuery(result).Connection <> nil then
+ TADOQuery(result).CommandTimeout := TADOQuery(result).Connection.CommandTimeout;
+end;
+
+function TDAEADOQuery.DoExecute: integer;
+begin
+ result := TADOQuery(Dataset).ExecSQL;
+ if TADOQuery(Dataset).Connection.Errors.Count>0 then
+ raise Exception.Create(TADOQuery(Dataset).Connection.Errors.Item[0].Description);
+end;
+
+function TDAEADOQuery.DoGetSQL: string;
+begin
+ result := TADOQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEADOQuery.DoSetSQL(const Value: string);
+begin
+ TADOQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEADOQuery.GetParamValues(Params: TDAParamCollection);
+var
+ i: integer;
+ par: TDAParam;
+ inpar: TParameter;
+ ds: TADOQuery;
+begin
+ ds := TADOQuery(Dataset);
+ if not Assigned(ds.Parameters) then
+ Exit;
+
+ for i := 0 to (ds.Parameters.Count - 1) do begin
+ inpar := ds.Parameters[i];
+
+ par := Params.ParamByName(inpar.Name);
+ if par.ParamType in [daptOutput, daptInputOutput, daptResult] then begin
+ if inpar.DataType = ftLargeint then
+ par.Value := DecimalToInt64(inpar.Value)
+ else
+ par.Value := inpar.Value;
+ end;
+ end;
+end;
+
+procedure TDAEADOQuery.RefreshParams;
+var
+ i: Integer;
+ par: TDAParam;
+ outpar: TParameter;
+ ds: TADOQuery;
+begin
+ inherited;
+ ds := TADOQuery(Dataset);
+ if not Assigned(ds.Parameters) then
+ Exit;
+ for i := 0 to ds.Parameters.Count -1 do begin
+ outpar := ds.Parameters[i];
+
+ par := self.ParamByName(outpar.Name);
+
+ if outpar.DataType <> ftUnknown then begin
+ par.DataType := VCLTypeToDAType(outpar.DataType);
+ par.Size := outpar.Size;
+ par.DecimalPrecision := outpar.Precision;
+ par.DecimalScale := outpar.NumericScale;
+ case outpar.Direction of
+ pdInput: par.ParamType := daptInput;
+ pdOutput: par.ParamType := daptOutput;
+ pdInputOutput: par.ParamType := daptInputOutput;
+ pdReturnValue: par.ParamType := daptResult;
+ end;
+ end;
+ end;
+end;
+
+procedure TDAEADOQuery.SetParamValues(Params: TDAParamCollection);
+var
+ i: integer;
+ par: TDAParam;
+ outpar: TParameter;
+ ds: TADOQuery;
+ ft: TFieldType;
+ {$IFDEF DELPHI2009UP}
+ st: TROBinaryMemoryStream;
+ {$ENDIF}
+begin
+ ds := TADOQuery(Dataset);
+ if not Assigned(ds.Parameters) then
+ Exit;
+
+ for i := 0 to (ds.Parameters.Count - 1) do begin
+ outpar := ds.Parameters[i];
+
+ par := Params.ParamByName(outpar.Name);
+ ft := DATypeToVCLType(par.DataType);
+ case par.ParamType of
+ daptInput: outpar.Direction := pdInput;
+ daptOutput: outpar.Direction := pdOutput;
+ daptInputOutput: outpar.Direction := pdInputOutput;
+ daptResult: outpar.Direction := pdReturnValue;
+ end;
+
+ if par.DataType in [datBlob, datMemo, datWideMemo] then begin
+ case par.DataType of
+ datBlob: outpar.DataType := ftBlob;
+ datMemo: outpar.DataType := ftMemo;
+ datWideMemo: outpar.DataType := {$IFDEF DA_WideMemoSupport}ftWideMemo{$ELSE}ftWideString{$ENDIF};
+ end;
+ if not (par.ParamType in [daptOutput, daptResult]) then begin
+ if VarIsEmpty(par.Value) or VarIsNull(par.Value) then begin
+ outpar.Value := NULL
+ end
+ else begin
+ {$IFDEF DELPHI2009UP}
+ // bug in ADODB, TParameter.SetValue at settings AnsiString+ftBlob
+ st := TROBinaryMemoryStream.Create(VariantToAnsiString(par.Value));
+ try
+ outpar.LoadFromStream(st, outpar.DataType);
+ finally
+ st.Free;
+ end;
+ {$ELSE}
+ outpar.Value := VariantToAnsiString(par.Value);
+ {$ENDIF}
+ end;
+ end;
+ end
+ else begin
+ if (outpar.DataType <> ft) and (ft <> ftUnknown) then begin
+ {$IFNDEF DELPHI2009UP}
+ // ADODB.pas doesn't support ftFMTBCD up to D2009
+ if ft = ftFMTBcd then
+ ft := ftBCD
+ else
+ {$ENDIF}
+ outpar.DataType := ft;
+ end;
+ if not (par.ParamType in [daptOutput, daptResult]) then begin
+ if outpar.DataType = ftLargeint then
+ Outpar.Value := Int64ToDecimal(par.Value)
+ else if ((par.DataType <> datString) and (par.DataType <> datWideString)) and VarIsStr(par.Value) and (VarToStr(par.Value)= '') then begin
+ par.Value := Null;
+ end;
+ outpar.Value := par.Value;
+ end;
+ end;
+ if (VarIsEmpty(par.Value) or VarIsNull(par.Value)) and (par.DataType <> datUnknown) then begin
+ if (outpar.DataType <> ft) and (ft <> ftUnknown) then outpar.DataType := ft;
+ end;
+ end;
+end;
+
+{ TDAEADOStoredProcedure }
+
+function TDAEADOStoredProcedure.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TADOStoredProc.Create(nil);
+ TADOStoredProc(result).Connection := TDAEADOConnection(aConnection).fADOConnection;
+ if TADOStoredProc(result).Connection <> nil then
+ TADOStoredProc(result).CommandTimeout := TADOStoredProc(result).Connection.CommandTimeout;
+end;
+
+procedure TDAEADOStoredProcedure.SetParamValues(Params: TDAParamCollection);
+var
+ i: integer;
+ par: TDAParam;
+ outpar: TParameter;
+ ds: TADOStoredProc;
+ ft: TFieldType;
+ {$IFDEF DELPHI2009UP}
+ st: TROBinaryMemoryStream;
+ {$ENDIF}
+begin
+ ds := TADOStoredProc(Dataset);
+ if not Assigned(ds.Parameters) then
+ Exit;
+
+ for i := 0 to (ds.Parameters.Count - 1) do begin
+ outpar := ds.Parameters[i];
+
+ par := Params.ParamByName(outpar.Name);
+ ft := DATypeToVCLType(par.DataType);
+ case par.ParamType of
+ daptInput: outpar.Direction := pdInput;
+ daptOutput: outpar.Direction := pdOutput;
+ daptInputOutput: outpar.Direction := pdInputOutput;
+ daptResult: outpar.Direction := pdReturnValue;
+ end;
+
+ if par.DataType = datBlob then begin
+ outpar.DataType := ftBlob;
+ if not (par.ParamType in [daptOutput, daptResult]) then begin
+ if VarIsEmpty(par.Value) or VarIsNull(par.Value) then begin
+ outpar.Value := NULL
+ end
+ else begin
+ {$IFDEF DELPHI2009UP}
+ // bug in ADODB, TParameter.SetValue at settings AnsiString+ftBlob
+ st := TROBinaryMemoryStream.Create(VariantToAnsiString(par.Value));
+ try
+ outpar.LoadFromStream(st,ftBlob);
+ finally
+ st.Free;
+ end;
+ {$ELSE}
+ outpar.Value := VariantToAnsiString(par.Value);
+ {$ENDIF}
+ end;
+ end;
+ end
+ else begin
+ if (outpar.DataType <> ft) and (ft <> ftUnknown) then
+ outpar.DataType := ft;
+ if not (par.ParamType in [daptOutput, daptResult]) then begin
+ if outpar.DataType = ftLargeint then
+ Outpar.Value := Int64ToDecimal(par.Value)
+ else
+ outpar.Value := par.Value;
+ end;
+ end;
+ if (VarIsEmpty(par.Value) or VarIsNull(par.Value)) and
+ (par.DataType <> datUnknown) then begin
+ if (outpar.DataType <> ft) and (ft <> ftUnknown) then
+ outpar.DataType := ft;
+ end;
+ end;
+end;
+
+procedure TDAEADOStoredProcedure.GetParamValues(Params: TDAParamCollection);
+var
+ i: integer;
+ par: TDAParam;
+ inpar: TParameter;
+ ds: TADOQuery;
+begin
+ ds := TADOQuery(Dataset);
+ if not Assigned(ds.Parameters) then
+ Exit;
+
+ for i := 0 to (ds.Parameters.Count - 1) do begin
+ inpar := ds.Parameters[i];
+
+ par := Params.ParamByName(inpar.Name);
+ if par.ParamType in [daptOutput, daptInputOutput, daptResult] then begin
+ if inpar.DataType = ftLargeint then
+ par.Value := DecimalToInt64(inpar.Value)
+ else
+ par.Value := inpar.Value;
+ end;
+ end;
+end;
+
+
+type
+ TADOStoredProcHack = class(TADOStoredProc);
+
+function TDAEADOStoredProcedure.Execute: integer;
+var
+ i: integer;
+ pstr: string;
+ params: TDAParamCollection;
+ ds: TADOStoredProc;
+ lParam: TParameter;
+begin
+ params := GetParams;
+ if (Connection as TDAEADOConnection).fProviderType = oledb_Oracle then pstr := '' else pstr := '@';
+
+ ds := TADOStoredProc(Dataset);
+
+ for i := ds.Parameters.Count -1 downto 0 do
+ begin
+ if (ds.Parameters[i].DataType = ftInterface) and (ds.Parameters[i].Direction in [pdOutput, pdInputOutput, pdReturnValue]) then
+ ds.Parameters.Delete(i);
+ end;
+
+ if (ds.Parameters.Count<>Params.Count) then begin
+ ds.Parameters.Refresh;
+ end;
+
+ {for i := 0 to (Parameters.Count - 1) do
+ if (Parameters[i].Direction in [pdInput, pdInputOutput])
+ then Parameters.ParamByName('@'+params[i].Name) [i].Value := params[i].Value;}
+
+ for i := 0 to (params.Count-1) do
+ begin
+ lParam:= ds.Parameters.ParamByName(pstr+params[i].Name);
+ if (params[i].ParamType = daptOutput) and (lParam.Direction <> pdOutput) then
+ lParam.Direction := pdOutput // ado sometimes doesn't set the direction properly
+ else if (params[i].ParamType in [daptInput, daptInputOutput]) then
+ lParam.Value := params[i].Value;
+ end;
+
+ Result := DoExecute;
+
+ {TADOStoredProcHack(Dataset).InitializeMasterFields(Self);
+ Command.Execute;}
+
+ {for i := 0 to (Parameters.Count - 1) do
+ if (Parameters[i].Direction in [pdOutput, pdInputOutput, pdReturnValue])
+ then params[i].Value := Parameters[i].Value;}
+
+ for i := 0 to (params.Count-1) do
+ if (params[i].ParamType in [daptOutput, daptInputOutput, daptResult])
+ then params[i].Value := ds.Parameters.ParamByName(pstr+params[i].Name).Value;
+end;
+
+function TDAEADOStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TADOStoredProc(Dataset).ProcedureName;
+end;
+
+procedure TDAEADOStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TADOStoredProc(Dataset).ProcedureName := Name;
+end;
+
+procedure TDAEADOStoredProcedure.RefreshParams;
+var
+ dsparams: TParameters;
+ dPar: TParameter;
+ i: integer;
+ par: TDAParam;
+ params: TDAParamCollection;
+ nme: string;
+begin
+ dsparams := TADOStoredProc(Dataset).Parameters;
+
+ dsparams.Refresh;
+ params := GetParams;
+ params.Clear;
+
+ for i := 0 to (dsparams.Count - 1) do begin
+ par := params.Add;
+ dPar:=dsparams[i];
+ nme := dPar.Name;
+ if Pos('@', nme) > 0 then
+ System.Delete(nme, Pos('@', nme), 1);
+ par.Name := nme;
+
+ if (dPar.DataType = ftInterface) then
+ par.DataType := datUnknown
+ else
+ par.DataType := VCLTypeToDAType(dPar.DataType);
+ par.ParamType := TDAParamType(dPar.Direction);
+ par.Size := dPar.Size;
+ end;
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+
+function TDAEADOStoredProcedure.DoExecute: integer;
+begin
+ TADOStoredProcHack(TADOStoredProc(Dataset)).Command.Execute(result, EmptyParam);
+
+ if TADOStoredProc(Dataset).Connection.Errors.Count >0 then
+ raise Exception.Create(TADOStoredProc(Dataset).Connection.Errors.Item[0].Description);
+end;
+
+{ TDAADOMonitor }
+
+function ParseError(const AError: Error):string;
+begin
+ if aError = nil then begin
+ Result:=''
+ end
+ else begin
+ Result:=
+ 'Error.Number: ' + IntToStr(AError.Number) + sLineBreak +
+ 'Error.NativeError: ' + IntToStr(AError.NativeError) + sLineBreak +
+ 'Error.Source: ' + AError.Source+sLineBreak +
+ 'Error.Description: ' + AError.Description + sLineBreak +
+ 'Error.SQLState: ' + AError.SQLState + sLineBreak;
+ end;
+end;
+
+function ParseCommand(Const Command: _Command): string;
+var
+ i: integer;
+ {$IFDEF ADOMONITOR_SHOWPARAMVALUES}
+ v: Variant;
+ {$ENDIF}
+ lItem: _Parameter;
+ s: String;
+begin
+ if Command = nil then begin
+ Result:=sLineBreak;
+ end
+ else begin
+ s:= PWideChar(Command.CommandText);
+ Result:=
+ 'Command.CommandText: ' + StringReplace(s, sLineBreak,' ',[rfReplaceAll]) + sLineBreak +
+ 'Command.Parameters.Count: ' + IntToStr(Command.Parameters.Count) + sLineBreak;
+ for i:= 0 to Command.Parameters.Count-1 do begin
+ lItem:=Command.Parameters.Item[i];
+ Result := Result + 'Command.Parameters['+intToStr(i)+ ']: '+ lItem.Name;
+ {$IFDEF ADOMONITOR_SHOWPARAMVALUES}
+ Result:= Result + ' = ';
+ v:=lItem.Value;
+ if VarIsNull(v) then Result := Result+ ''
+ else if VarIsEmpty(v) then Result := Result+ ''
+ else if lItem.Type_ in [adBinary, adVarBinary, adLongVarBinary, adLongVarChar] then Result:= Result + ''
+ else Result:= Result + VarToStr(v);
+ {$ENDIF}
+ Result:=Result+sLineBreak;
+ end;
+ Result:=Result+sLineBreak;
+ end;
+end;
+
+function ParseEventStatus(const EventStatus: TEventStatus): string;
+begin
+ Result := 'EventStatus: ' + TEventStatusStr[EventStatus]+sLineBreak;
+end;
+
+procedure TDAADOMonitor.ADOConnectionBeginTransComplete(
+ Connection: TADOConnection; TransactionLevel: Integer;
+ const Error: Error; var EventStatus: TEventStatus);
+begin
+ if Assigned(FOnCallback) then FOnCallback(Self,
+ 'Begin transaction'+sLineBreak+
+ '-----------------'+sLineBreak+
+ 'TransactionLevel: ' +IntToStr(TransactionLevel)+sLineBreak+
+ ParseError(Error)+
+ ParseEventStatus(EventStatus),
+ 0);
+end;
+
+procedure TDAADOMonitor.ADOConnectionCommitTransComplete(
+ Connection: TADOConnection; const Error: Error;
+ var EventStatus: TEventStatus);
+begin
+ if Assigned(FOnCallback) then FOnCallback(Self,
+ 'Commit transaction'+sLineBreak+
+ '------------------'+sLineBreak+
+ ParseError(Error)+
+ ParseEventStatus(EventStatus),
+ 0);
+end;
+
+procedure TDAADOMonitor.ADOConnectionConnectComplete(
+ Connection: TADOConnection; const Error: Error;
+ var EventStatus: TEventStatus);
+begin
+ if Assigned(FOnCallback) then FOnCallback(Self,
+ 'Connect'+sLineBreak+
+ '-------'+sLineBreak+
+ ParseError(Error)+
+ ParseEventStatus(EventStatus),
+ 0);
+end;
+
+procedure TDAADOMonitor.ADOConnectionDisconnect(Connection: TADOConnection;
+ var EventStatus: TEventStatus);
+begin
+ if Assigned(FOnCallback) then FOnCallback(Self,
+ 'Disconnect'+sLineBreak+
+ '----------'+sLineBreak+
+ ParseEventStatus(EventStatus),
+ 0);
+end;
+
+procedure TDAADOMonitor.ADOConnectionExecuteComplete(
+ Connection: TADOConnection; RecordsAffected: Integer; const Error: Error;
+ var EventStatus: TEventStatus; const Command: _Command;
+ const Recordset: _Recordset);
+begin
+ if Assigned(FOnCallback) then FOnCallback(Self,
+ 'Execute'+sLineBreak+
+ '-------'+sLineBreak+
+ 'RecordsAffected: ' +IntToStr(RecordsAffected)+sLineBreak+
+ ParseError(Error)+
+ ParseEventStatus(EventStatus)+
+ ParseCommand(Command),
+ 0);
+end;
+
+procedure TDAADOMonitor.ADOConnectionInfoMessage(
+ Connection: TADOConnection; const Error: Error;
+ var EventStatus: TEventStatus);
+begin
+ if Assigned(FOnCallback) then FOnCallback(Self,
+ 'Info message'+sLineBreak+
+ '------------'+sLineBreak+
+ ParseError(Error)+
+ ParseEventStatus(EventStatus),
+ 0);
+end;
+
+procedure TDAADOMonitor.ADOConnectionRollbackTransComplete(
+ Connection: TADOConnection; const Error: Error;
+ var EventStatus: TEventStatus);
+begin
+ if Assigned(FOnCallback) then FOnCallback(Self,
+ 'Rollback transaction'+sLineBreak+
+ '-------------------'+sLineBreak+
+ ParseError(Error)+
+ ParseEventStatus(EventStatus),
+ 0);
+end;
+
+procedure TDAADOMonitor.ADOConnectionWillConnect(
+ Connection: TADOConnection; var ConnectionString, UserID,
+ Password: WideString; var ConnectOptions: TConnectOption;
+ var EventStatus: TEventStatus);
+begin
+ if Assigned(FOnCallback) then FOnCallback(Self,
+ 'Will connect'+sLineBreak+
+ '------------'+sLineBreak+
+ 'Connection string: ' + ConnectionString +sLineBreak+
+ 'UserID: ' + UserID +sLineBreak+
+ 'Password: ' + Password +sLineBreak+
+ 'ConnectOptions: ' + TConnectOptionStr[ConnectOptions]+sLineBreak+
+ ParseEventStatus(EventStatus),
+ 0);
+end;
+
+function getExecuteOptionStr(const ExecuteOptions: TExecuteOptions): string;
+var
+ i: TExecuteOption;
+begin
+ Result:='';
+ for i:= low(TExecuteOption) to High(TExecuteOption) do
+ if i in ExecuteOptions then Result:= Result + TExecuteOptionStr[i]+',';
+ if Length(Result) > 0 then SetLength(Result, Length(Result)-1);
+end;
+
+procedure TDAADOMonitor.ADOConnectionWillExecute(
+ Connection: TADOConnection; var CommandText: WideString;
+ var CursorType: TCursorType; var LockType: TADOLockType;
+ var CommandType: TCommandType; var ExecuteOptions: TExecuteOptions;
+ var EventStatus: TEventStatus; const Command: _Command;
+ const Recordset: _Recordset);
+begin
+ if Assigned(FOnCallback) then FOnCallback(Self,
+ 'Will execute' + sLineBreak+
+ '------------' + sLineBreak+
+ 'CommandText: ' + CommandText + sLineBreak+
+ 'CursorType: ' + TCursorTypeStr[CursorType] + sLineBreak +
+ 'LockType: ' + TADOLockTypeStr[LockType] + sLineBreak +
+ 'CommandType: ' + TCommandTypeStr[CommandType] + sLineBreak +
+ 'ExecuteOptions: ' + getExecuteOptionStr(ExecuteOptions) + sLineBreak +
+ ParseEventStatus(EventStatus)+
+ ParseCommand(Command),
+ 0);
+end;
+
+procedure TDAADOMonitor.AssignEvents(AConnection: TADOConnection);
+begin
+ if (AConnection <> nil) and FEnabled and Assigned(FOnCallback) then begin
+ // if toPrepare in FTraceFlags then AConnection.
+ if toExecute in FTraceFlags then begin
+ AConnection.OnExecuteComplete := ADOConnectionExecuteComplete;
+ AConnection.OnWillExecute := ADOConnectionWillExecute;
+ end;
+ // if toFetch in FTraceFlags then AConnection.
+ if toError in FTraceFlags then begin
+ AConnection.OnInfoMessage := ADOConnectionInfoMessage;
+ end;
+ // if toStmt in FTraceFlags then AConnection.
+ if toConnect in FTraceFlags then begin
+ AConnection.OnConnectComplete := ADOConnectionConnectComplete;
+ AConnection.OnWillConnect := ADOConnectionWillConnect;
+ AConnection.OnDisconnect := ADOConnectionDisconnect;
+ end;
+ if toTransact in FTraceFlags then begin
+ AConnection.OnBeginTransComplete := ADOConnectionBeginTransComplete;
+ AConnection.OnCommitTransComplete := ADOConnectionCommitTransComplete;
+ AConnection.OnRollbackTransComplete := ADOConnectionRollbackTransComplete;
+ end;
+ // if toBlob in FTraceFlags then AConnection.
+ // if toService in FTraceFlags then AConnection.
+ // if toMisc in FTraceFlags then AConnection.
+ // if toParams in FTraceFlags then AConnection.
+ end;
+end;
+
+constructor TDAADOMonitor.Create(ADriver: TDAEADODriver);
+begin
+ inherited Create;
+ FDriver := ADriver;
+ FEnabled := False;
+end;
+
+procedure TDAADOMonitor.ReAssignEvents;
+var
+ i: integer;
+ lmode: boolean;
+begin
+ lMode:=FEnabled and (fTraceFlags <> []) and Assigned(FOnCallback);
+ with FDriver.FConnectionList.LockList do try
+ for i:= 0 to Count-1 do
+ if lMode then
+ AssignEvents(TADOConnection(Items[i]))
+ else
+ UnAssignEvents(TADOConnection(Items[i]));
+ finally
+ FDriver.FConnectionList.UnLockList;
+ end;
+end;
+
+procedure TDAADOMonitor.SetEnabled(const Value: Boolean);
+begin
+ if FEnabled <> Value then begin
+ FEnabled := Value;
+ if FEnabled and (fTraceFlags <> []) and Assigned(FOnCallback) then ReAssignEvents;
+ end;
+end;
+
+procedure TDAADOMonitor.SetOnCallback(const Value: TDALogTraceEvent);
+begin
+ if @fOnCallback <> @Value then begin
+ FOnCallback := Value;
+ if FEnabled and (fTraceFlags <> []) and Assigned(FOnCallback) then ReAssignEvents;
+ end;
+end;
+
+procedure TDAADOMonitor.SetTraceFlags(const Value: TDATraceOptions);
+begin
+ if FTraceFlags <> Value then begin
+ FTraceFlags := Value;
+ if FEnabled and (fTraceFlags <> []) and Assigned(FOnCallback) then ReAssignEvents;
+ end;
+end;
+
+procedure TDAADOMonitor.UnAssignEvents(AConnection: TADOConnection);
+begin
+ if AConnection <> nil then begin
+ // toTransact
+ AConnection.OnBeginTransComplete := nil;
+ AConnection.OnCommitTransComplete := nil;
+ AConnection.OnRollbackTransComplete := nil;
+
+ //toConnect
+ AConnection.OnConnectComplete := nil;
+ AConnection.OnWillConnect := nil;
+ AConnection.OnDisconnect := nil;
+
+ //toExecute
+ AConnection.OnExecuteComplete := nil;
+ AConnection.OnWillExecute := nil;
+
+ //toError
+ AConnection.OnInfoMessage := nil;
+ end;
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAAbsoluteDBDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAAbsoluteDBDriver.pas
new file mode 100644
index 0000000..8d59023
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAAbsoluteDBDriver.pas
@@ -0,0 +1,868 @@
+unit uDAAbsoluteDBDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library }
+{ }
+{ compiler: Delphi 6 and up }
+{ platform: Win32 }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ Originally was created by Steve Forbes }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+
+{$R DataAbstract_AbsoluteDBDriver_Glyphs.res}
+
+//{$I absvr.inc}
+
+interface
+
+uses DB, Classes, uDAEngine, uDAInterfaces, uROClasses, ABSMain, uDAUtils;
+
+type
+ { TDAAbsoluteDBDriver }
+ TDAAbsoluteDBDriver = class(TDADriverReference)
+ end;
+
+ { IAbsoluteDBConnection }
+ IAbsoluteDBConnection = interface
+ ['{A0A17C42-D225-4610-83D5-FC6D2A554010}']
+ end;
+
+ { IABSConnectionProperties
+ Provides access to common properties of AbsoluteDB connections }
+
+ IABSConnectionProperties = interface
+ ['{7B13C981-3131-47A5-A6AC-62635B1777AD}']
+ function GetKeepConnections: Boolean;
+ procedure SetKeepConnections(Value: Boolean);
+
+ property KeepConnections: Boolean read GetKeepConnections write SetKeepConnections;
+ end;
+
+ { TAbsoluteDBConnection }
+ TAbsoluteDBConnection = class(TDAConnectionWrapper)
+ private
+ FDatabase: TABSDatabase;
+ FSession: TABSSession;
+
+ protected
+ function GetConnected: Boolean; override;
+ procedure SetConnected(Value: Boolean); override;
+
+ public
+ constructor Create(AOwner: TComponent); override;
+
+ property Database: TABSDatabase read FDatabase;
+ property Session: TABSSession read FSession;
+ end;
+
+ { TDAEAbsoluteDBDriver }
+ TDAEAbsoluteDBDriver = class(TDAEDriver)
+ private
+
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override;
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; safecall;
+ public
+ end;
+
+ { TDAEAbsoluteDBConnection }
+ TDAEAbsoluteDBConnection = class(TDAEConnection, IAbsoluteDBConnection, IABSConnectionProperties)
+ private
+ FConnection: TAbsoluteDBConnection;
+
+ protected
+ // IABSConnectionProperties
+ function GetKeepConnections: Boolean;
+ procedure SetKeepConnections(Value: Boolean);
+
+ // IDAConnection
+ function CreateCustomConnection: TCustomConnection; override;
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+ function DoBeginTransaction: Integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: Boolean; override;
+ procedure DoGetTableNames(out List: IROStrings); override;
+ function DoGetLastAutoInc(const GeneratorName: string): integer; override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection);override;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAEAbsoluteDBQuery }
+ TDAEAbsoluteDBQuery = class(TDAEDataset, IDAMustSetParams)
+ private
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: Integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: Boolean); override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+const
+ AbsoluteDB_DriverType = 'AbsoluteDB';
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ SysUtils, uDADriverManager, uDARes, uDAMacroProcessors, Variants,
+ uROBinaryHelpers;
+
+var
+ _driver: TDAEDriver = nil;
+ absolute_reservedwords: array of string;
+
+const
+ GEN_NAME_DELIMITER = '*';
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAAbsoluteDBDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEAbsoluteDBDriver.Create(nil);
+ result := _driver;
+end;
+
+{ TAbsoluteDBConnection }
+
+constructor TAbsoluteDBConnection.Create(AOwner: TComponent);
+begin
+ inherited;
+
+ FSession := TABSSession.Create(Self);
+ FSession.AutoSessionName := TRUE;
+
+ FDatabase := TABSDatabase.Create(Self);
+ FDatabase.SessionName := FSession.SessionName;
+ FDatabase.DatabaseName := 'ABSOLUTEDB';
+end;
+
+function TAbsoluteDBConnection.GetConnected: Boolean;
+begin
+ result := FDatabase.Connected;
+end;
+
+procedure TAbsoluteDBConnection.SetConnected(Value: Boolean);
+begin
+ if not(csDestroying in FDatabase.ComponentState) then begin
+ try
+ FSession.Active := Value;
+ FDatabase.Connected := Value;
+ except
+ FSession.Active := FALSE;
+ FDatabase.Connected := FALSE;
+ raise;
+ end;
+ end;
+end;
+
+{ TDAEAbsoluteDBConnection }
+
+procedure TDAEAbsoluteDBConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+begin
+ inherited;
+ with aConnStrParser do begin
+ FConnection.Database.DatabaseFileName := Database;
+
+ if (AuxParams['DisableTempFiles'] = 'False') then
+ begin
+ FConnection.Database.DisableTempFiles := False;
+ end
+ else
+ begin
+ FConnection.Database.DisableTempFiles := True;
+ end;
+
+ if (AuxParams['Exclusive'] = 'False') then
+ begin
+ FConnection.Database.Exclusive := False;
+ end
+ else
+ begin
+ FConnection.Database.Exclusive := True;
+ end;
+
+ if (AuxParams['HandleShared'] = 'False') then
+ begin
+ FConnection.Database.HandleShared := False;
+ end
+ else
+ begin
+ FConnection.Database.HandleShared := True;
+ end;
+
+ if (AuxParams['KeepConnections'] = 'False') then
+ begin
+ FConnection.Session.KeepConnections := False;
+ FConnection.Database.KeepConnection := False;
+ end
+ else if (AuxParams['KeepConnections'] = 'True') then
+ begin
+ FConnection.Session.KeepConnections := True;
+ FConnection.Database.KeepConnection := True;
+ end;
+
+ if (AuxParams['MultiUser'] = 'False') then
+ begin
+ FConnection.Database.MultiUser := False;
+ end
+ else
+ begin
+ FConnection.Database.MultiUser := True;
+ end;
+
+ if (AuxParams['DBPassword'] <> '') then
+ begin
+ fConnection.Database.Password := AuxParams['DBPassword'];
+ end;
+ end;
+end;
+
+function TDAEAbsoluteDBConnection.DoBeginTransaction: integer;
+begin
+ result := -1;
+ FConnection.Database.StartTransaction;
+end;
+
+procedure TDAEAbsoluteDBConnection.DoCommitTransaction;
+begin
+ with FConnection do
+ Database.Commit;
+end;
+
+function TDAEAbsoluteDBConnection.CreateCustomConnection: TCustomConnection;
+begin
+ result := TAbsoluteDBConnection.Create(nil);
+ FConnection := TAbsoluteDBConnection(result);
+end;
+
+function TDAEAbsoluteDBConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEAbsoluteDBQuery
+end;
+
+procedure TDAEAbsoluteDBConnection.DoGetTableNames(out List: IROStrings);
+var
+ _database: string;
+begin
+ List := TROStrings.Create;
+ _database := FConnection.Database.DatabaseName;
+
+ FConnection.Session.GetTableNames(_database, List.Strings);
+end;
+
+procedure TDAEAbsoluteDBConnection.DoRollbackTransaction;
+begin
+ FConnection.Database.Rollback;
+end;
+
+function TDAEAbsoluteDBConnection.DoGetInTransaction: Boolean;
+begin
+ result := FConnection.Database.InTransaction;
+end;
+
+function TDAEAbsoluteDBConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ result := TDADBISAMMacroProcessor.Create;
+end;
+
+function TDAEAbsoluteDBConnection.GetKeepConnections: Boolean;
+begin
+ result := FConnection.Session.KeepConnections;
+end;
+
+procedure TDAEAbsoluteDBConnection.SetKeepConnections(Value: Boolean);
+begin
+ FConnection.Session.KeepConnections := Value;
+ FConnection.Database.KeepConnection := Value;
+end;
+
+function TDAEAbsoluteDBConnection.DoGetLastAutoInc(
+ const GeneratorName: string): integer;
+var
+ lQuery: IDADataset;
+ TableName: String;
+ FieldName: String;
+begin
+ try
+ if ((GeneratorName <> '') and (Pos(GEN_NAME_DELIMITER, GeneratorName) > 0)) then
+ begin
+
+ TableName := Copy(GeneratorName, 1,
+ Pos(GEN_NAME_DELIMITER, GeneratorName) - 1);
+ FieldName := Copy(GeneratorName,
+ Pos(GEN_NAME_DELIMITER, GeneratorName) + 1,
+ Length(GeneratorName) - (Length(TableName) + 1));
+ lQuery := GetDatasetClass.Create(Self);
+ try
+ lQuery.SQL := 'SELECT LASTAUTOINC(''' + TableName + ''', ''' +
+ FieldName + ''') from ' + QuoteIdentifierIfNeeded(TableName);
+ lQuery.Open;
+ Result := lQuery.Fields[0].AsInteger;
+ lQuery.Close;
+ finally
+ lQuery := nil;
+ end;
+ end
+ else
+ begin
+ Result := inherited DoGetLastAutoInc(GeneratorName);
+ end;
+ except
+ Result := inherited DoGetLastAutoInc(GeneratorName);
+ end;
+end;
+
+{$IFDEF DELPHI10UP}
+{$WARN SYMBOL_DEPRECATED OFF}
+{$ENDIF DELPHI10UP}
+procedure TDAEAbsoluteDBConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+var
+ i: integer;
+ pos1: integer;
+ fld: TDAField;
+ lofld:TFieldDef;
+ s: string;
+ ltable: TABSTable;
+begin
+ Fields:=TDAFieldCollection.Create(nil);
+ ltable:=TABSTable.Create(nil);
+ try
+ ltable.DatabaseName := FConnection.Database.DatabaseName;
+ ltable.SessionName := FConnection.Session.SessionName;
+ ltable.TableName := aTableName;
+ ltable.FieldDefs.Update;
+ for i:=0 to ltable.FieldDefs.Count-1 do begin
+ lofld:=ltable.FieldDefs[i];
+ fld:= Fields.Add;
+ fld.Name:= lofld.Name;
+ fld.DataType:= VCLTypeToDAType(lofld.DataType);
+ fld.Size:= lofld.Size;
+ fld.Required:= lofld.Required;
+ fld.ReadOnly:= DB.faReadonly in lofld.Attributes;
+ if fld.DataType = datAutoInc then fld.GeneratorName:= aTableName+GEN_NAME_DELIMITER+fld.Name;
+ if fld.DataType = datDecimal then begin
+ case lofld.DataType of
+ ftBCD: begin
+ fld.DecimalPrecision:=20;
+ fld.DecimalScale:=lofld.Size;
+ end;
+ end;
+ end;
+ end;
+
+ //pk
+ ltable.IndexDefs.Update;
+ For i:=0 to ltable.IndexDefs.Count - 1 do
+ if ixPrimary in ltable.IndexDefs[i].Options then begin
+ Pos1 := 1;
+ s:=ltable.IndexDefs[i].Fields;
+ while Pos1 <= Length(s) do begin
+ fld := Fields.FindField(ExtractFieldName(s, Pos1));
+ if fld <> nil then fld.InPrimaryKey:=True;
+ end;
+ end;
+
+ finally
+ ltable.free;
+ end;
+end;
+{$IFDEF DELPHI10UP}
+{$WARN SYMBOL_DEPRECATED ON}
+{$ENDIF DELPHI10UP}
+
+function TDAEAbsoluteDBConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(iIdentifier) or TestIdentifier(iIdentifier,absolute_reservedwords);
+end;
+
+{ TDAEAbsoluteDBDriver }
+
+procedure TDAEAbsoluteDBDriver.GetAuxParams(const AuxDriver: string; out List: IROStrings);
+begin
+ inherited;
+
+ List.Add('DBPassword=');
+ List.Add('DisableTempFiles=False,True');
+ List.Add('Exclusive=False,True');
+ List.Add('HandleShared=False,True');
+ List.Add('KeepConnections=False,True');
+ List.Add('MultiUser=False,True');
+
+ List.Sorted := True;
+end;
+
+function TDAEAbsoluteDBDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doDatabaseName, doCustom];
+end;
+
+function TDAEAbsoluteDBDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEAbsoluteDBConnection
+end;
+
+function TDAEAbsoluteDBDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ Result := AbsoluteDB_DriverType;
+end;
+
+function TDAEAbsoluteDBDriver.GetDescription: string;
+begin
+ result := 'AbsoluteDB Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEAbsoluteDBDriver.GetDriverID: string;
+begin
+ result := 'AbsoluteDB';
+end;
+
+{ TDAEAbsoluteDBQuery }
+
+function TDAEAbsoluteDBQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TABSQuery.Create(nil);
+
+ with TABSQuery(result) do begin
+ DatabaseName := TDAEAbsoluteDBConnection(aConnection).FConnection.Database.DatabaseName;
+ SessionName := TDAEAbsoluteDBConnection(aConnection).FConnection.Session.SessionName;
+ ReadOnly := True;
+ RequestLive := True;
+ end;
+end;
+
+function TDAEAbsoluteDBQuery.DoExecute: integer;
+begin
+ with TABSQuery(Dataset) do begin
+ ExecSQL;
+ result := RowsAffected;
+ end;
+end;
+
+function TDAEAbsoluteDBQuery.DoGetSQL: string;
+begin
+ result := TABSQuery(Dataset).SQL.Text
+end;
+
+procedure TDAEAbsoluteDBQuery.DoPrepare(Value: Boolean);
+begin
+ TABSQuery(Dataset).Prepared := Value;
+end;
+
+procedure TDAEAbsoluteDBQuery.SetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ par: uDAInterfaces.TDAParam;
+ outpar: TParam;
+ ft: TFieldType;
+ lParIsEmpty: Boolean;
+begin
+ for i := 0 to (AParams.Count - 1) do begin
+ par := AParams[i];
+ outpar := TABSQuery(Dataset).Params.ParamByName(par.Name);
+
+ ft := DATypeToVCLType(par.DataType);
+
+ case par.ParamType of
+ daptInput: outpar.ParamType := ptInput;
+ daptOutput: outpar.ParamType := ptOutput;
+ daptInputOutput: outpar.ParamType := ptInputOutput;
+ daptResult: outpar.ParamType := ptResult;
+ end;
+
+ lParIsEmpty := VarIsEmpty(par.Value) or VarIsNull(par.Value);
+
+ if par.DataType = datBlob then begin
+ outpar.DataType := ftBlob;
+ if not (par.ParamType in [daptOutput, daptResult]) then begin
+ if lParIsEmpty then
+ outpar.Value := Null
+ else
+ outpar.Value := VariantToAnsiString(par.Value);
+ end;
+ end
+ else begin
+ if (outpar.DataType <> ft) and (ft <> ftUnknown) then outpar.DataType := ft;
+ if not (par.ParamType in [daptOutput, daptResult]) then outpar.Value := par.Value;
+ end;
+
+ if lParIsEmpty and (par.DataType <> datUnknown) then begin
+ if (outpar.DataType <> ft) and (ft <> ftUnknown) then outpar.DataType := ft;
+ end;
+ end;
+end;
+
+procedure TDAEAbsoluteDBQuery.GetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ par: uDAInterfaces.TDAParam;
+begin
+ for i := 0 to (AParams.Count - 1) do begin
+ par := AParams[i];
+ if Par.ParamType in [daptOutput, daptInputOutput, daptResult] then
+ Par.Value := TABSQuery(Dataset).Params.ParamByName(par.Name).Value;
+ end;
+end;
+
+procedure TDAEAbsoluteDBQuery.DoSetSQL(const Value: string);
+begin
+ TABSQuery(Dataset).SQL.Text := Value;
+end;
+
+exports GetDriverObject name func_GetDriverObject;
+
+procedure TDAEAbsoluteDBQuery.ClearParams;
+begin
+ inherited;
+ TABSQuery(Dataset).Params.Clear;
+end;
+
+procedure absolute_InitializeReservedWords;
+begin
+ SetLength(absolute_reservedwords, 283);
+ // sorted with TStringList.Sort (bds2007)
+ absolute_reservedwords[0] := 'ABS';
+ absolute_reservedwords[1] := 'ABSOLUTE';
+ absolute_reservedwords[2] := 'ACOS';
+ absolute_reservedwords[3] := 'ACTION';
+ absolute_reservedwords[4] := 'ADD';
+ absolute_reservedwords[5] := 'ALL';
+ absolute_reservedwords[6] := 'ALLOCATE';
+ absolute_reservedwords[7] := 'ALTER';
+ absolute_reservedwords[8] := 'AND';
+ absolute_reservedwords[9] := 'ANY';
+ absolute_reservedwords[10] := 'ARE';
+ absolute_reservedwords[11] := 'AS';
+ absolute_reservedwords[12] := 'ASC';
+ absolute_reservedwords[13] := 'ASIN';
+ absolute_reservedwords[14] := 'ASSERTION';
+ absolute_reservedwords[15] := 'AT';
+ absolute_reservedwords[16] := 'ATAN';
+ absolute_reservedwords[17] := 'AUTHORIZATION';
+ absolute_reservedwords[18] := 'AUTOINC';
+ absolute_reservedwords[19] := 'AUTOINDEXES';
+ absolute_reservedwords[20] := 'AVG';
+ absolute_reservedwords[21] := 'BEGIN';
+ absolute_reservedwords[22] := 'BETWEEN';
+ absolute_reservedwords[23] := 'BIT';
+ absolute_reservedwords[24] := 'BIT_LENGTH';
+ absolute_reservedwords[25] := 'BLOBBLOCKSIZE';
+ absolute_reservedwords[26] := 'BLOBCOMPRESSIONALGORITHM';
+ absolute_reservedwords[27] := 'BLOBCOMPRESSIONMODE';
+ absolute_reservedwords[28] := 'BOTH';
+ absolute_reservedwords[29] := 'BY';
+ absolute_reservedwords[30] := 'CASCADE';
+ absolute_reservedwords[31] := 'CASCADED';
+ absolute_reservedwords[32] := 'CASE';
+ absolute_reservedwords[33] := 'CAST';
+ absolute_reservedwords[34] := 'CATALOG';
+ absolute_reservedwords[35] := 'CEIL';
+ absolute_reservedwords[36] := 'CHAR';
+ absolute_reservedwords[37] := 'CHAR_LENGTH';
+ absolute_reservedwords[38] := 'CHARACTER';
+ absolute_reservedwords[39] := 'CHARACTER_LENGTH';
+ absolute_reservedwords[40] := 'CHECK';
+ absolute_reservedwords[41] := 'CLOSE';
+ absolute_reservedwords[42] := 'COALESCE';
+ absolute_reservedwords[43] := 'COLLATE';
+ absolute_reservedwords[44] := 'COLLATION';
+ absolute_reservedwords[45] := 'COLUMN';
+ absolute_reservedwords[46] := 'COMMIT';
+ absolute_reservedwords[47] := 'CONNECT';
+ absolute_reservedwords[48] := 'CONNECTION';
+ absolute_reservedwords[49] := 'CONSTRAINT';
+ absolute_reservedwords[50] := 'CONSTRAINTS';
+ absolute_reservedwords[51] := 'CONTINUE';
+ absolute_reservedwords[52] := 'CONVERT';
+ absolute_reservedwords[53] := 'CORRESPONDING';
+ absolute_reservedwords[54] := 'COS';
+ absolute_reservedwords[55] := 'COUNT';
+ absolute_reservedwords[56] := 'CREATE';
+ absolute_reservedwords[57] := 'CROSS';
+ absolute_reservedwords[58] := 'CURRENT';
+ absolute_reservedwords[59] := 'CURRENT_DATE';
+ absolute_reservedwords[60] := 'CURRENT_TIME';
+ absolute_reservedwords[61] := 'CURRENT_TIMESTAMP';
+ absolute_reservedwords[62] := 'CURRENT_USER';
+ absolute_reservedwords[63] := 'CURSOR';
+ absolute_reservedwords[64] := 'CYCLED';
+ absolute_reservedwords[65] := 'DATE';
+ absolute_reservedwords[66] := 'DAY';
+ absolute_reservedwords[67] := 'DEALLOCATE';
+ absolute_reservedwords[68] := 'DEC';
+ absolute_reservedwords[69] := 'DECIMAL';
+ absolute_reservedwords[70] := 'DECLARE';
+ absolute_reservedwords[71] := 'DEFAULT';
+ absolute_reservedwords[72] := 'DEFERRABLE';
+ absolute_reservedwords[73] := 'DEFERRED';
+ absolute_reservedwords[74] := 'DELETE';
+ absolute_reservedwords[75] := 'DESC';
+ absolute_reservedwords[76] := 'DESCRIBE';
+ absolute_reservedwords[77] := 'DESCRIPTOR';
+ absolute_reservedwords[78] := 'DIAGNOSTICS';
+ absolute_reservedwords[79] := 'DISCONNECT';
+ absolute_reservedwords[80] := 'DISTINCT';
+ absolute_reservedwords[81] := 'DOMAIN';
+ absolute_reservedwords[82] := 'DOUBLE';
+ absolute_reservedwords[83] := 'DROP';
+ absolute_reservedwords[84] := 'ELSE';
+ absolute_reservedwords[85] := 'END';
+ absolute_reservedwords[86] := 'END-EXEC';
+ absolute_reservedwords[87] := 'ESCAPE';
+ absolute_reservedwords[88] := 'EXCEPT';
+ absolute_reservedwords[89] := 'EXCEPTION';
+ absolute_reservedwords[90] := 'EXEC';
+ absolute_reservedwords[91] := 'EXECUTE';
+ absolute_reservedwords[92] := 'EXISTS';
+ absolute_reservedwords[93] := 'EXP';
+ absolute_reservedwords[94] := 'EXTERNAL';
+ absolute_reservedwords[95] := 'EXTRACT';
+ absolute_reservedwords[96] := 'FALSE';
+ absolute_reservedwords[97] := 'FETCH';
+ absolute_reservedwords[98] := 'FIRST';
+ absolute_reservedwords[99] := 'FLOAT';
+ absolute_reservedwords[100] := 'FLOOR';
+ absolute_reservedwords[101] := 'FLUSH';
+ absolute_reservedwords[102] := 'FOR';
+ absolute_reservedwords[103] := 'FOREIGN';
+ absolute_reservedwords[104] := 'FOUND';
+ absolute_reservedwords[105] := 'FROM';
+ absolute_reservedwords[106] := 'FULL';
+ absolute_reservedwords[107] := 'GET';
+ absolute_reservedwords[108] := 'GLOBAL';
+ absolute_reservedwords[109] := 'GO';
+ absolute_reservedwords[110] := 'GOTO';
+ absolute_reservedwords[111] := 'GRANT';
+ absolute_reservedwords[112] := 'GROUP';
+ absolute_reservedwords[113] := 'HAVING';
+ absolute_reservedwords[114] := 'HOUR';
+ absolute_reservedwords[115] := 'IDENTITY';
+ absolute_reservedwords[116] := 'IF';
+ absolute_reservedwords[117] := 'IMMEDIATE';
+ absolute_reservedwords[118] := 'IN';
+ absolute_reservedwords[119] := 'INCREMENT';
+ absolute_reservedwords[120] := 'INDEX';
+ absolute_reservedwords[121] := 'INDICATOR';
+ absolute_reservedwords[122] := 'INITIALLY';
+ absolute_reservedwords[123] := 'INITIALVALUE';
+ absolute_reservedwords[124] := 'INNER';
+ absolute_reservedwords[125] := 'INPUT';
+ absolute_reservedwords[126] := 'INSENSITIVE';
+ absolute_reservedwords[127] := 'INSERT';
+ absolute_reservedwords[128] := 'INT';
+ absolute_reservedwords[129] := 'INTEGER';
+ absolute_reservedwords[130] := 'INTERSECT';
+ absolute_reservedwords[131] := 'INTERVAL';
+ absolute_reservedwords[132] := 'INTO';
+ absolute_reservedwords[133] := 'IS';
+ absolute_reservedwords[134] := 'ISOLATION';
+ absolute_reservedwords[135] := 'JOIN';
+ absolute_reservedwords[136] := 'KEY';
+ absolute_reservedwords[137] := 'LANGUAGE';
+ absolute_reservedwords[138] := 'LAST';
+ absolute_reservedwords[139] := 'LASTAUTOINC';
+ absolute_reservedwords[140] := 'LASTVALUE';
+ absolute_reservedwords[141] := 'LEADING';
+ absolute_reservedwords[142] := 'LEFT';
+ absolute_reservedwords[143] := 'LENGTH';
+ absolute_reservedwords[144] := 'LEVEL';
+ absolute_reservedwords[145] := 'LIKE';
+ absolute_reservedwords[146] := 'LOCAL';
+ absolute_reservedwords[147] := 'LOG';
+ absolute_reservedwords[148] := 'LOWER';
+ absolute_reservedwords[149] := 'LTRIM';
+ absolute_reservedwords[150] := 'MATCH';
+ absolute_reservedwords[151] := 'MAX';
+ absolute_reservedwords[152] := 'MAXVALUE';
+ absolute_reservedwords[153] := 'MEMORY';
+ absolute_reservedwords[154] := 'MIMETOBIN';
+ absolute_reservedwords[155] := 'MIN';
+ absolute_reservedwords[156] := 'MINUS';
+ absolute_reservedwords[157] := 'MINUTE';
+ absolute_reservedwords[158] := 'MINVALUE';
+ absolute_reservedwords[159] := 'MODIFY';
+ absolute_reservedwords[160] := 'MODULE';
+ absolute_reservedwords[161] := 'MONTH';
+ absolute_reservedwords[162] := 'NAMES';
+ absolute_reservedwords[163] := 'NATIONAL';
+ absolute_reservedwords[164] := 'NATURAL';
+ absolute_reservedwords[165] := 'NCHAR';
+ absolute_reservedwords[166] := 'NEW';
+ absolute_reservedwords[167] := 'NEXT';
+ absolute_reservedwords[168] := 'NO';
+ absolute_reservedwords[169] := 'NOAUTOINDEXES';
+ absolute_reservedwords[170] := 'NOCASE';
+ absolute_reservedwords[171] := 'NOCYCLED';
+ absolute_reservedwords[172] := '';
+ absolute_reservedwords[173] := 'NOMAXVALUE';
+ absolute_reservedwords[174] := 'NOMINVALUE';
+ absolute_reservedwords[175] := 'NOT';
+ absolute_reservedwords[176] := 'NOW';
+ absolute_reservedwords[177] := 'NULL';
+ absolute_reservedwords[178] := 'NULLIF';
+ absolute_reservedwords[179] := 'NUMERIC';
+ absolute_reservedwords[180] := 'OCTET_LENGTH';
+ absolute_reservedwords[181] := 'OF';
+ absolute_reservedwords[182] := 'ON';
+ absolute_reservedwords[183] := 'ONLY';
+ absolute_reservedwords[184] := 'OPEN';
+ absolute_reservedwords[185] := 'OPTION';
+ absolute_reservedwords[186] := 'OR';
+ absolute_reservedwords[187] := 'ORDER';
+ absolute_reservedwords[188] := 'OUTER';
+ absolute_reservedwords[189] := 'OUTPUT';
+ absolute_reservedwords[190] := 'OVERLAPS';
+ absolute_reservedwords[191] := 'PAD';
+ absolute_reservedwords[192] := 'PARTIAL';
+ absolute_reservedwords[193] := 'PASSWORD';
+ absolute_reservedwords[194] := 'POS';
+ absolute_reservedwords[195] := 'POSITION';
+ absolute_reservedwords[196] := 'POWER';
+ absolute_reservedwords[197] := 'PRECISION';
+ absolute_reservedwords[198] := 'PREPARE';
+ absolute_reservedwords[199] := 'PRESERVE';
+ absolute_reservedwords[200] := 'PRIMARY';
+ absolute_reservedwords[201] := 'PRIOR';
+ absolute_reservedwords[202] := 'PRIVILEGES';
+ absolute_reservedwords[203] := 'PROCEDURE';
+ absolute_reservedwords[204] := 'PUBLIC';
+ absolute_reservedwords[205] := 'RAND';
+ absolute_reservedwords[206] := 'READ';
+ absolute_reservedwords[207] := 'REAL';
+ absolute_reservedwords[208] := 'REFERENCES';
+ absolute_reservedwords[209] := 'RELATIVE';
+ absolute_reservedwords[210] := 'RENAME';
+ absolute_reservedwords[211] := 'RESTRICT';
+ absolute_reservedwords[212] := 'REVOKE';
+ absolute_reservedwords[213] := 'RIGHT';
+ absolute_reservedwords[214] := 'ROLLBACK';
+ absolute_reservedwords[215] := 'ROUND';
+ absolute_reservedwords[216] := 'ROWNUM';
+ absolute_reservedwords[217] := 'ROWS';
+ absolute_reservedwords[218] := 'RTRIM';
+ absolute_reservedwords[219] := 'SCHEMA';
+ absolute_reservedwords[220] := 'SCROLL';
+ absolute_reservedwords[221] := 'SECOND';
+ absolute_reservedwords[222] := 'SECTION';
+ absolute_reservedwords[223] := 'SELECT';
+ absolute_reservedwords[224] := 'SESSION';
+ absolute_reservedwords[225] := 'SESSION_USER';
+ absolute_reservedwords[226] := 'SET';
+ absolute_reservedwords[227] := 'SIGN';
+ absolute_reservedwords[228] := 'SIN';
+ absolute_reservedwords[229] := 'SIZE';
+ absolute_reservedwords[230] := 'SMALLINT';
+ absolute_reservedwords[231] := 'SOME';
+ absolute_reservedwords[232] := 'SPACE';
+ absolute_reservedwords[233] := 'SQL';
+ absolute_reservedwords[234] := 'SQLCODE';
+ absolute_reservedwords[235] := 'SQLERROR';
+ absolute_reservedwords[236] := 'SQLSTATE';
+ absolute_reservedwords[237] := 'SQR';
+ absolute_reservedwords[238] := 'SQRT';
+ absolute_reservedwords[239] := 'START';
+ absolute_reservedwords[240] := 'SUBSTRING';
+ absolute_reservedwords[241] := 'SUM';
+ absolute_reservedwords[242] := 'SYSDATE';
+ absolute_reservedwords[243] := 'SYSTEM_USER';
+ absolute_reservedwords[244] := 'TABLE';
+ absolute_reservedwords[245] := 'TEMPORARY';
+ absolute_reservedwords[246] := 'THEN';
+ absolute_reservedwords[247] := 'TIME';
+ absolute_reservedwords[248] := 'TIMESTAMP';
+ absolute_reservedwords[249] := 'TIMEZONE_HOUR';
+ absolute_reservedwords[250] := 'TIMEZONE_MINUTE';
+ absolute_reservedwords[251] := 'TO';
+ absolute_reservedwords[252] := 'TODATE';
+ absolute_reservedwords[253] := 'TOP';
+ absolute_reservedwords[254] := 'TOSTRING';
+ absolute_reservedwords[255] := 'TRAILING';
+ absolute_reservedwords[256] := 'TRANSACTION';
+ absolute_reservedwords[257] := 'TRANSLATE';
+ absolute_reservedwords[258] := 'TRANSLATION';
+ absolute_reservedwords[259] := 'TRIM';
+ absolute_reservedwords[260] := 'TRUE';
+ absolute_reservedwords[261] := 'TRUNCATE';
+ absolute_reservedwords[262] := 'UNION';
+ absolute_reservedwords[263] := 'UNIQUE';
+ absolute_reservedwords[264] := 'UNKNOWN';
+ absolute_reservedwords[265] := 'UPDATE';
+ absolute_reservedwords[266] := 'UPPER';
+ absolute_reservedwords[267] := 'USAGE';
+ absolute_reservedwords[268] := 'USER';
+ absolute_reservedwords[269] := 'USING';
+ absolute_reservedwords[270] := 'VALUE';
+ absolute_reservedwords[271] := 'VALUES';
+ absolute_reservedwords[272] := 'VARCHAR';
+ absolute_reservedwords[273] := 'VARYING';
+ absolute_reservedwords[274] := 'VIEW';
+ absolute_reservedwords[275] := 'WHEN';
+ absolute_reservedwords[276] := 'WHENEVER';
+ absolute_reservedwords[277] := 'WHERE';
+ absolute_reservedwords[278] := 'WITH';
+ absolute_reservedwords[279] := 'WORK';
+ absolute_reservedwords[280] := 'WRITE';
+ absolute_reservedwords[281] := 'YEAR';
+ absolute_reservedwords[282] := 'ZONE';
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+ absolute_InitializeReservedWords;
+finalization
+ absolute_reservedwords := nil;
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNil(_driver);
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAAnyDACDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAAnyDACDriver.pas
new file mode 100644
index 0000000..ba8c006
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAAnyDACDriver.pas
@@ -0,0 +1,2897 @@
+{-------------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library }
+{ }
+{ compiler: Delphi 6 and up }
+{ platform: Win32 }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{ }
+{ Based on AnyDAC Driver by Dmitry Arefiev (www.da-soft.com) }
+{-------------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$I uAD.inc}
+
+unit uDAAnyDACDriver;
+
+interface
+
+uses
+ DB, Classes,
+ uROClasses,
+ uDAEngine, uDAInterfaces, uDAInterfacesEx, uDAUtils, uDAOracleInterfaces,
+ uDAMySQLInterfaces, uDAADOInterfaces, uDAIBInterfaces, uDADB2Interfaces,
+ uDASybaseInterfaces, uDASQLiteInterfaces, uDAPostgresInterfaces,
+ uADStanIntf, uADStanOption, uADDatSManager, uADPhysIntf, uADCompClient
+{$IFDEF AnyDAC_MONITOR}
+ ,uADMoniBase, uADMoniCustom
+{$ENDIF}
+ ;
+
+const
+ C_DriverMajVer = 3;
+ C_DriverMinVer = 50;
+
+type
+ TDAAnyDACDriverType = TADRDBMSKind;
+
+ { TDAAnyDACDriver }
+ TDAAnyDACDriver = class(TDADriverReference)
+ end;
+
+ { TDAEAnyDACDriver }
+ TDAEAnyDACDriver = class(TDAEDriver, IDADriver40)
+ private
+ FConnectionDefs: TStringList;
+ FConnectionDefIndex: Integer;
+{$IFDEF AnyDAC_MONITOR}
+ FMonitor: TADMoniCustomClientLink;
+ FTraceCallback: TDALogTraceEvent;
+ procedure DoTrace(ASender: TADMoniClientLinkBase; const AClassName, AObjName, AMessage: String);
+{$ENDIF}
+ function LookupConnectionString(const AConnectionString: String; AParsedParams: TStringList): String;
+ protected
+{$IFDEF AnyDAC_MONITOR}
+ procedure DoSetTraceOptions(TraceActive: Boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent); override;
+{$ENDIF}
+ function GetConnectionClass: TDAEConnectionClass; override;
+ // IDADriver
+ procedure Initialize; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Finalize; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDriverID: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDescription: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetMajVersion: byte; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetMinVersion: byte; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} // IDADriver40
+ procedure GetAuxDrivers(out List: IROStrings); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetProviderDefaultCustomParameters(Provider: string): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ { TDAEAnyDACConnection }
+ TDAEAnyDACConnection = class(TDAEConnection, IDAConnection,
+ IDAADOConnection,
+ IDAInterbaseConnection,
+ IDAIBTransactionAccess,
+ IDAIBConnectionProperties,
+ IDAOracleConnection,
+ IDAMySQLConnection,
+ IDADB2Connection,
+ IDAPostgresConnection,
+ IDASQLiteConnection,
+ IDASybaseConnection,
+ IDAConnectionModelling,
+ IDACanQueryDatabaseNames,
+ IDAFileBasedDatabase,
+ IDAUseGenerators,
+ IDAUseGenerators2,
+ IDACanQueryGeneratorsNames,
+ IDATestableObject)
+ private
+ FADConnection: TADConnection;
+ fDriverType: TDAAnyDACDriverType;
+ fMSSQLSchemaEnabled: Boolean;
+ fBiDirectionalDataSets: Boolean;
+ fDirectMode: Boolean;
+ FDataTypeSchema: String;
+ FMySQLVersion: integer;
+ FDataBaseName: string;
+ procedure DoGetNames(AList: IROStrings; AObjectType: TDAObjecttype);
+ procedure Native_DoGetTableFields(aTableName: string; out Fields: TDAFieldCollection);
+ procedure Native_DoGetForeignKeys(ForeignKeys: TDADriverForeignKeyCollection);
+ function Native_DoGetLastAutoInc(const GeneratorName: string): variant;
+ function Native_GetQuoteChars: TDAQuoteCharArray;
+ function GetAnyDACPhysConnection:IADPhysConnection;
+ procedure MapAsFIB;
+ function GetMySQLVersion: integer;
+ function GetDataBaseName: string;
+ protected
+ // IInterface
+ function QueryInterface(const IID: TGUID; out Obj): HResult; override; stdcall;
+ // TDAEConnection
+ function CreateCustomConnection: TCustomConnection; override;
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+ procedure SetupDataset(ADataSet: TADRdbmsDataSet; AFetchMeta: Boolean);
+ procedure SetupOptions(AOptions: IADStanOptions; AFetchMeta: Boolean);
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ // IDATestObject
+ // nothing
+ // IDAConnection
+ function GetSPSelectSyntax(AHasArguments: Boolean): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetQuoteChars: TDAQuoteCharArray; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function IdentifierNeedsQuoting(const AIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAADOConnection
+ function GetProviderName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetProviderType: TDAOleDBProviderType; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetCommandTimeout: Integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetCommandTimeout(const Value: Integer); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAInterbaseConnection
+ // nothing
+ // IDAIBTransactionAccess
+ function GetTransaction: TObject; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAIBConnectionProperties
+ function GetRole: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRole(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetSQLDialect: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetSQLDialect(Value: integer); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetCharset: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetCharset(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Commit; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CommitRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Rollback; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure RollbackRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAOracleConnection
+ // nothing
+ // IDAConnectionModelling
+ function FieldToDeclaration(aField: TDAField): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function BuildCreateTableSQL(aDataSet: TDADataSet; const aOverrideName: string = ''): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CreateTable(aDataSet: TDADataSet; const aOverrideName: string = ''); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDACanQueryDatabaseNames
+ function GetDatabaseNames: IROStrings;
+ // IDAFileBasedDatabase
+ function GetFileExtensions: IROStrings;
+ // IDADirectoryBasedDatabase
+ // nothing
+ // IDAUseGenerators
+ function GetNextAutoinc(const GeneratorName: string): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAUseGenerators2
+ function GetNextAutoinc2(const GeneratorName: string): variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDACanQueryGeneratorsNames
+ function GetGeneratorNames: IROStrings;
+ end;
+
+ { TDAEAnyDACQuery }
+ TDAEAnyDACQuery = class(TDAEDataset, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ // TDAEDataset
+ procedure DoPrepare(AValue: boolean); override;
+ function DoExecute: integer; override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const AValue: string); override;
+ procedure ClearParams; override;
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ { TDAEAnyDACStoredProcedure }
+ TDAEAnyDACStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ // TDAEDataset
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Execute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ TDAEAnyDACNativeDatabaseAccess = class;
+
+ { TDAEAnyDACNativeField }
+ TDAEAnyDACNativeField = class(TInterfacedObject, IDANativeField)
+ private
+ FCol: TADDatSColumn;
+ FCmd: IADPhysCommand;
+ fParent: TDAEAnyDACNativeDatabaseAccess;
+ protected
+ function GetNativeObject: TObject;
+ function isTFieldCompatible: Boolean;
+ function GetFieldName: string;
+ function GetDataType: TFieldType;
+ function GetSize: integer;
+ function GetDecimalPrecision: Integer;
+ procedure SetDecimalPrecision(Value: integer);
+ function GetDecimalScale: Integer;
+ procedure SetDecimalScale(Value: integer);
+ procedure SetDataType(Value: TFieldType);
+ function GetFieldIndex: integer;
+ function GetValue: Variant;
+ function IsNull: Boolean;
+ public
+ constructor Create(ACol: TADDatSColumn; const ACmd: IADPhysCommand; AParent: TDAEAnyDACNativeDatabaseAccess);
+ end;
+
+ { TDAEAnyDACNativeDatabaseAccess }
+ TDAEAnyDACNativeDatabaseAccessFlags = set of (nfActive, nfBOF, nfEOF);
+ TDAEAnyDACNativeDatabaseAccess = class(TObject, IInterface, IDANativeDatabaseAccess)
+ private
+ FCmd: IADPhysCommand;
+ FTab: TADDatSTable;
+ FFlags: TDAEAnyDACNativeDatabaseAccessFlags;
+ FRowIndex: Integer;
+ FRowsPurged: Integer;
+ FBuffs: array of Pointer;
+ procedure First;
+ procedure CheckActive;
+ procedure CheckBidir;
+ function LocateRecord(const KeyFields: string; const KeyValues: Variant;
+ Options: TLocateOptions; AChangePos: Boolean): Integer;
+ function IsNull(Index: integer): Boolean;
+ protected
+ // IInterface
+ function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
+ function _AddRef: Integer; stdcall;
+ function _Release: Integer; stdcall;
+ // IDANativeDatabaseAccess
+ procedure ClearFieldDefs;
+ function GetRecordCount: Integer;
+ function GetBOF: Boolean;
+ function GetEOF: Boolean;
+ function GetActive: Boolean;
+ procedure SetActive(const aValue: Boolean);
+ procedure Next;
+ function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant;
+ function GetFieldName(Index: Integer): string;
+ procedure DisableControls;
+ procedure EnableControls;
+ function GetIsEmpty: boolean;
+ procedure FreeBookmark(Bookmark: TBookmark);
+ function GetBookMark: pointer;
+ procedure GotoBookmark(Bookmark: TBookmark);
+ function GetState: TDatasetState;
+ function ControlsDisabled: Boolean;
+ procedure Prepare(const AValue: Boolean);
+ function GetFields(Index: integer): IDANativeField;
+ function FieldCount: Integer;
+ function FindField(const FieldName: string): IDANativeField;
+ function IsTDatasetCompatible: Boolean;
+ function GetNativeFieldData(Index: Integer; var Data: pointer; var DataSize: cardinal):Boolean;
+ function GetNativeFieldValue(Index: Integer): Variant;
+ function CanFreeNativeFieldData: Boolean;
+ public
+ Constructor Create(ADAEConnection: TDAEAnyDACConnection);
+ destructor Destroy; override;
+ end;
+
+ { TDAEAnyDACQueryNative }
+ TDAEAnyDACQueryNative = class(TDAEDataset, IDAMustSetParams)
+ private
+ function GetNativeObject: TDAEAnyDACNativeDatabaseAccess;
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ function CreateNativeObject(aConnection: TDAEConnection): TObject; override;
+ function CreateNativeDatabaseAccess: IDANativeDatabaseAccess; override;
+ // TDAEDataset
+ procedure DoPrepare(AValue: boolean); override;
+ function DoExecute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const AValue: string); override;
+ procedure ClearParams; override;
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ property NativeObject: TDAEAnyDACNativeDatabaseAccess read GetNativeObject;
+ end;
+
+ { TDAEAnyDACStoredProcedureNative }
+ TDAEAnyDACStoredProcedureNative = class(TDAEStoredProcedure, IDAMustSetParams)
+ private
+ function GetNativeObject: TDAEAnyDACNativeDatabaseAccess;
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ function CreateNativeObject(aConnection: TDAEConnection): TObject; override;
+ function CreateNativeDatabaseAccess: IDANativeDatabaseAccess; override;
+ // TDAEDataset
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Execute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ property NativeObject: TDAEAnyDACNativeDatabaseAccess read GetNativeObject;
+ end;
+
+procedure Register;
+function GetDriverObject: IDADriver; stdcall;
+function AnyDACDriverIdToAnyDACDriverType(Provider: string): TDAAnyDACDriverType;
+
+implementation
+
+uses
+ {$IFDEF FPC} LResources, {$ENDIF}
+ {$IFDEF MSWINDOWS} Windows, {$ENDIF}
+ SysUtils, Variants, FmtBCD,
+ uDADriverManager, uDARes, uDAHelpers, uROBinaryHelpers,
+ uADStanDef, uADStanAsync, uADStanPool, uADStanExpr, uADStanExprFuncs,
+ uADStanParam, uADStanConst, uADStanFactory,
+{$IFDEF AnyDAC_MONITOR}
+ uADMoniFlatFile, uADMoniRemoteClient,
+{$ENDIF}
+ uADDAptManager,
+ uADGUIxConsoleWait,
+ uADPhysManager, uADPhysODBC, uADPhysOracl, uADPhysMySQL, uADPhysMSSQL,
+ uADPhysMSAcc, uADPhysDB2, uADPhysASA, uADPhysIB, uADPhysADS, uADStanUtil,
+ uADPhysSQLite, uADPhysPg
+{$IFDEF AnyDAC_D11}
+ , uADPhysTDBX
+{$ELSE}
+ {$IFDEF AnyDAC_D6}
+ , uADPhysDbExp
+ {$ENDIF}
+{$ENDIF};
+
+{$IFNDEF FPC}
+ {$R DataAbstract_AnyDACDriver_Glyphs.res}
+{$ENDIF}
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+ {$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+{------------------------------------------------------------------------------}
+{ Generic procedures }
+{------------------------------------------------------------------------------}
+function AnyDACDriverIdToAnyDACDriverType(Provider: string): TDAAnyDACDriverType;
+var
+ FConnectionIntf: IADPhysConnection;
+ oConMeta: IADPhysConnectionMetadata;
+begin
+ Result := mkUnknown;
+ if Provider = '' then
+ Exit;
+ try
+ with TADConnection.Create(nil) do
+ try
+ ResultConnectionDef.DriverID := Provider;
+ ADPhysManager.CreateConnection(ResultConnectionDef, FConnectionIntf);
+ if FConnectionIntf <> nil then begin
+ FConnectionIntf.CreateMetadata(oConMeta);
+ Result := oConMeta.Kind;
+ end;
+ finally
+ Free;
+ end;
+ except
+ // hide an exception
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure SetADParamValuesFromDA(ADAParams: TDAParamCollection;
+ AADParams: TADParams; ASetType: Boolean);
+var
+ i: integer;
+ oDAPar: TDAParam;
+ oADPar: TADParam;
+begin
+ for i := 0 to AADParams.Count - 1 do begin
+ oADPar := AADParams[i];
+ oDAPar := ADAParams.ParamByName(oADPar.Name);
+ oADPar.ParamType := TParamType(oDAPar.ParamType);
+ if oDAPar.ParamType in [daptInput, daptInputOutput, daptUnknown] then
+ if oDAPar.DataType in [datBlob, datMemo, datWideMemo, datXml] then begin
+ if ASetType then
+ if oDAPar.BlobType = dabtUnknown then
+ case oDAPar.DataType of
+ datMemo: oADPar.DataType := ftMemo;
+ datBlob: oADPar.DataType := ftBlob;
+ datXml,
+ datWideMemo: oADPar.DataType := {$IFDEF AnyDAC_D10} ftWideMemo {$ELSE} ftFmtMemo {$ENDIF};
+ end
+ else
+ oADPar.DataType := BlobTypeMappings[oDAPar.BlobType];
+ if VarIsEmpty(oDAPar.Value) or VarIsNull(oDAPar.Value) then
+ oADPar.Clear
+ else
+ oADPar.AsBlob := VariantToAnsiString(oDAPar.Value);
+ end
+ else begin
+ if ASetType then
+ oADPar.DataType := DATypeToVCLType(oDAPar.DataType);
+ if VarIsEmpty(oDAPar.Value) or VarIsNull(oDAPar.Value) then
+ oADPar.Clear
+ else
+ oADPar.Value := oDAPar.Value;
+ end
+ else
+ if ASetType then begin
+ oADPar.DataType := DATypeToVCLType(oDAPar.DataType);
+ oADPar.Size := oDAPar.Size;
+ oADPar.Precision := oDAPar.DecimalPrecision;
+ oADPar.NumericScale := oDAPar.DecimalScale;
+ end;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure GetDAParamValuesFromAD(Params: TDAParamCollection; AADParams: TADParams);
+var
+ i: integer;
+ oDAPar: TDAParam;
+ oADPar: TADParam;
+begin
+ if not Assigned(AADParams) then
+ Exit;
+ for i := 0 to AADParams.Count - 1 do begin
+ oADPar := AADParams[i];
+ oDAPar := Params.ParamByName(oADPar.Name);
+ if oDAPar.ParamType in [daptOutput, daptInputOutput, daptResult] then
+ oDAPar.Value := oADPar.Value;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function MapAD2DADataType(AADDataType: TADDataType; out ABlobType: TDABlobType): TDADataType;
+begin
+ ABlobType := dabtUnknown;
+ case AADDataType of
+ dtUnknown: Result := datUnknown;
+ dtBoolean: Result := datBoolean;
+ dtSByte: Result := datShortInt;
+ dtInt16: Result := datSmallInt;
+ dtInt32: Result := datInteger;
+ dtInt64: Result := datLargeInt;
+ dtByte: Result := datByte;
+ dtUInt16: Result := datWord;
+ dtUInt32: Result := datCardinal;
+ dtUInt64: Result := datLargeUInt;
+ dtDouble: Result := datFloat;
+ dtCurrency: Result := datFloat; // Double
+ dtBCD: Result := datCurrency; // Currency
+ dtFmtBCD: Result := datDecimal; // TBcd
+ dtDateTime: Result := datDateTime;
+ dtTime: Result := datDateTime;
+ dtDate: Result := datDateTime;
+ dtDateTimeStamp: Result := datDateTime;
+ dtAnsiString: Result := datString;
+ dtWideString: Result := datWideString;
+ dtByteString: Result := datString;
+ dtBlob: begin Result := datBlob; ABlobType := dabtBlob; end;
+ dtMemo: begin Result := datMemo; ABlobType := dabtMemo; end;
+ dtWideMemo: begin Result := datWideMemo; ABlobType := dabtMemo; end;
+ dtHBlob: begin Result := datBlob; ABlobType := dabtOraBlob; end;
+ dtHMemo: begin Result := datMemo; ABlobType := dabtOraClob; end;
+ dtWideHMemo: begin Result := datWideMemo; ABlobType := dabtOraClob; end;
+ dtHBFile: begin Result := datBlob; ABlobType := dabtOraBlob; end;
+ dtGUID: Result := datGuid;
+ else raise Exception.CreateFmt('AnyDAC data type [%s] is not supported by DataAbstract',
+ [C_AD_DataTypeNames[AADDataType]]);
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+{ TDAEAnyDACDriver }
+{------------------------------------------------------------------------------}
+function TDAEAnyDACDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doAuxDriver, doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEAnyDACConnection;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACDriver.GetDriverID: string;
+begin
+ result := 'AnyDAC';
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACDriver.GetDescription: string;
+begin
+ result := 'RemObjects AnyDAC v ' + C_AD_Version + ' Driver'
+ {$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACDriver.GetMajVersion: byte;
+begin
+ Result := C_DriverMajVer;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACDriver.GetMinVersion: byte;
+begin
+ Result := C_DriverMinVer;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACDriver.GetAuxDrivers(out List: IROStrings);
+begin
+ List := NewROStrings;
+ ADManager.GetDriverNames(List.Strings);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACDriver.GetProviderDefaultCustomParameters(Provider: string): string;
+begin
+ Result := '';
+ case AnyDACDriverIdToAnyDACDriverType(Provider) of
+ mkOracle: Result := S_AD_ConnParam_Common_OSAuthent + '=No;';
+ mkMSSQL: Result := 'Schemas=1;Integrated Security=SSPI;';
+ mkMySQL: Result := MYSQL_GetDefaultCustomParameters;
+ mkInterbase: Result := S_AD_ConnParam_IB_Protocol + '=TCPIP;';
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACDriver.GetDefaultConnectionType(const AuxDriver: string): string;
+begin
+ case AnyDACDriverIdToAnyDACDriverType(AuxDriver) of
+ mkOracle: Result := Oracle_DriverType;
+ mkMSSQL: Result := MSSQL_DriverType;
+ mkMSAccess: Result := Access_DriverType;
+ mkMySQL: Result := MySQL_DriverType;
+ mkDB2: Result := DB2_DriverType;
+ mkASA: Result := ASA_DriverType;
+ mkInterbase: Result := IB_DriverType;
+ mkSQLite: Result := SQLite_DriverType;
+ mkPostgreSQL:Result := PostgreSQL_DriverType;
+ else
+ Result := inherited GetDefaultConnectionType(AuxDriver);
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+const
+ C_Line: String = '-----------------------------';
+begin
+ inherited;
+
+ List.Add('AnyDAC Driver parameters');
+ List.Add(C_Line);
+ case AnyDACDriverIdToAnyDACDriverType(AuxDriver) of
+ mkOracle:
+ ;
+ mkMSSQL:
+ MSSQL_GetAuxParams(List);
+ mkMSAccess:
+ ;
+ mkMySQL:
+ MYSQL_GetAuxParams(List);
+ mkDB2:
+ ;
+ mkASA:
+ ;
+ mkInterbase:
+ begin
+ AddIBAuxParams(List);
+ List.Add('DataTypeSchema=');
+ end;
+ end;
+ List.Add('ConnectionDefName=');
+ List.Add('BiDirectionalDataSets=0,1');
+ List.Add('DirectMode=0,1');
+ List.Add('');
+
+ case AnyDACDriverIdToAnyDACDriverType(AuxDriver) of
+ mkOracle:
+ begin
+ List.Add('Oracle AuxDriver parameters');
+ List.Add(C_Line);
+ List.Add('You can pass any parameters directly to aux driver. Use the prefix ''@'' for this, e.g.:');
+ List.Add('@SQLTrace=True;@Pooled=True');
+ List.Add('');
+ List.Add('Detailed description of aux driver parameters you can find at:');
+ List.Add('http://wiki.remobjects.com/wiki/Connect_to_Oracle_Server_(AnyDAC)');
+ end;
+ mkMSSQL:
+ begin
+ List.Add('MSSQL AuxDriver parameters');
+ List.Add(C_Line);
+ List.Add('');
+ List.Add('You can pass any parameters directly to aux driver. Use the prefix ''@'' for this, e.g.:');
+ List.Add('@App=My DA Server;@Pooled=True');
+ List.Add('');
+ List.Add('Detailed description of aux driver parameters you can find at:');
+ List.Add('http://wiki.remobjects.com/wiki/Connect_to_Microsoft_SQL_Server_(AnyDAC)');
+ end;
+ mkMSAccess:
+ begin
+ List.Add('MSAccess AuxDriver parameters');
+ List.Add(C_Line);
+ List.Add('You can pass any parameters directly to aux driver. Use the prefix ''@'' for this, e.g.:');
+ List.Add('@ReadOnly=True;@Pooled=True');
+ List.Add('');
+ List.Add('Detailed description of aux driver parameters you can find at:');
+ List.Add('http://wiki.remobjects.com/wiki/Connect_to_MS_Access_database_(AnyDAC)');
+ end;
+ mkMySQL:
+ begin
+ List.Add('MySQL AuxDriver parameters');
+ List.Add(C_Line);
+ List.Add('You can pass any parameters directly to aux driver. Use the prefix ''@'' for this, e.g.:');
+ List.Add('@CharacterSet=utf8;@Pooled=True');
+ List.Add('');
+ List.Add('Detailed description of aux driver parameters you can find at:');
+ List.Add('http://wiki.remobjects.com/wiki/Connect_to_MySQL_Server_(AnyDAC)');
+ end;
+ mkDB2:
+ begin
+ List.Add('DB2 AuxDriver parameters');
+ List.Add(C_Line);
+ List.Add('You can pass any parameters directly to aux driver. Use the prefix ''@'' for this, e.g.:');
+ List.Add('@Alias=MyDB;@Pooled=True');
+ List.Add('');
+ List.Add('Detailed description of aux driver parameters you can find at:');
+ List.Add('http://wiki.remobjects.com/wiki/Connect_to_IBM_DB2_Server_(AnyDAC)');
+ end;
+ mkASA:
+ begin
+ List.Add('ASA AuxDriver parameters');
+ List.Add(C_Line);
+ List.Add('You can pass any parameters directly to aux driver. Use the prefix ''@'' for this, e.g.:');
+ List.Add('@ODBCAdvanced=AutoStart=Yes;@DatabaseFile=C:\sybase\addemo_asa10.db;@Pooled=True');
+ List.Add('');
+ List.Add('Detailed description of aux driver parameters you can find at:');
+ List.Add('http://wiki.remobjects.com/wiki/Connect_to_Sybase_SQL_Anywhere_(AnyDAC)');
+ end;
+ mkInterBase:
+ begin
+ List.Add('IB/FB AuxDriver parameters');
+ List.Add(C_Line);
+ List.Add('You can pass any parameters directly to aux driver. Use the prefix ''@'' for this, e.g.:');
+ List.Add('@Protocol=TCPIP;@CharacterSet=win1251;@Pooled=True');
+ List.Add('');
+ List.Add('Detailed description of aux driver parameters you can find at:');
+ List.Add('http://wiki.remobjects.com/wiki/Connect_to_Interbase_or_Firebird_Server_(AnyDAC)');
+ end;
+ mkADS:
+ begin
+ List.Add('AdvantageDS AuxDriver parameters');
+ List.Add(C_Line);
+ List.Add('You can pass any parameters directly to aux driver. Use the prefix ''@'' for this, e.g.:');
+ List.Add('@DefaultType=Advantage;@ServerTypes=1;@Pooled=True');
+ List.Add('');
+ List.Add('Detailed description of aux driver parameters you can find at:');
+ List.Add('http://wiki.remobjects.com/wiki/Connect_to_Advantage_Database_Server_(AnyDAC)');
+ end;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACDriver.Initialize;
+begin
+ FConnectionDefs := TStringList.Create;
+ FConnectionDefs.Sorted := True;
+ FConnectionDefIndex := 0;
+ ADManager.Open;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACDriver.Finalize;
+begin
+ ADManager.Close;
+ FreeAndNil(FConnectionDefs);
+{$IFDEF AnyDAC_MONITOR}
+ FreeAndNil(FMonitor);
+{$ENDIF}
+ ADTerminate;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACDriver.LookupConnectionString(const AConnectionString: String;
+ AParsedParams: TStringList): String;
+var
+ i: Integer;
+begin
+ i := FConnectionDefs.IndexOf(AConnectionString);
+ if i = -1 then begin
+ Inc(FConnectionDefIndex);
+ FConnectionDefs.AddObject(AConnectionString, TObject(FConnectionDefIndex));
+ with ADManager.ConnectionDefs.AddConnectionDef do begin
+ Name := Format('__DACD_%d', [FConnectionDefIndex]);
+ Params.AddStrings(AParsedParams);
+ Result := Name;
+ end;
+ end
+ else
+ Result := Format('__DACD_%d', [Integer(FConnectionDefs.Objects[i])]);
+end;
+
+{------------------------------------------------------------------------------}
+{$IFDEF AnyDAC_MONITOR}
+procedure TDAEAnyDACDriver.DoTrace(ASender: TADMoniClientLinkBase;
+ const AClassName, AObjName, AMessage: String);
+begin
+ if Assigned(FTraceCallback) then
+ FTraceCallback(ASender, AMessage, 0);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACDriver.DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent);
+var
+ eKinds: TADMoniEventKinds;
+begin
+ inherited;
+ if TraceActive then begin
+ FTraceCallBack := Callback;
+ eKinds := [];
+ if toPrepare in TraceOptions then eKinds := eKinds + [ekCmdPrepare];
+ if toExecute in TraceOptions then eKinds := eKinds + [ekCmdExecute];
+ if toFetch in TraceOptions then eKinds := eKinds + [ekCmdDataIn];
+ if toError in TraceOptions then eKinds := eKinds + [ekError];
+ // if toStmt in TraceOptions then eKinds := eKinds + [tfStmt];
+ if toConnect in TraceOptions then eKinds := eKinds + [ekConnConnect];
+ if toTransact in TraceOptions then eKinds := eKinds + [ekConnTransact];
+ // if toBlob in TraceOptions then eKinds := eKinds + [tfBlob];
+ if toService in TraceOptions then eKinds := eKinds + [ekVendor];
+ if toMisc in TraceOptions then eKinds := eKinds + [ekConnService, ekLiveCycle, ekAdaptUpdate];
+ if toParams in TraceOptions then eKinds := eKinds + [ekCmdDataIn, ekCmdDataOut];
+ if FMonitor = nil then FMonitor := TADMoniCustomClientLink.Create(Self);
+ FMonitor.Tracing := False;
+ FMonitor.OnOutput := DoTrace;
+ FMonitor.EventKinds := eKinds;
+ FMonitor.Tracing := True;
+ end
+ else begin
+ if FMonitor <> nil then
+ FMonitor.Tracing := False;
+ FTraceCallback := nil;
+ end;
+end;
+{$ENDIF}
+
+{------------------------------------------------------------------------------}
+{ TDAEAnyDACConnection }
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.QueryInterface(const IID: TGUID; out Obj): HResult;
+begin
+ Result := E_NOINTERFACE;
+ if IsEqualGUID(IID, IDAADOConnection) then begin
+ if fDriverType <> mkMSSQL then Exit;
+ end else if IsEqualGUID(IID, IDAInterbaseConnection) then begin
+ if fDriverType <> mkInterbase then Exit;
+ end else if IsEqualGUID(IID, IDAIBTransactionAccess) then begin
+ if fDriverType <> mkInterbase then Exit;
+ end else if IsEqualGUID(IID, IDAIBConnectionProperties) then begin
+ if fDriverType <> mkInterbase then Exit;
+ end else if IsEqualGUID(IID, IDAOracleConnection) then begin
+ if fDriverType <> mkOracle then Exit;
+ end else if IsEqualGUID(IID, IDADB2Connection) then begin
+ if fDriverType <> mkDB2 then Exit;
+ end else if IsEqualGUID(IID, IDASybaseConnection) then begin
+ if not (fDriverType in [mkASA, mkADS]) then Exit;
+ end else if IsEqualGUID(IID, IDAMySQLConnection) then begin
+ if fDriverType <> mkMySQL then Exit;
+ end else if IsEqualGUID(IID, IDAPostgresConnection) then begin
+ if fDriverType <> mkPostgreSQL then Exit;
+ end else if IsEqualGUID(IID, IDASQLiteConnection) then begin
+ if fDriverType <> mkSQLite then Exit;
+ end else if IsEqualGUID(IID, IDACanQueryDatabaseNames) then begin
+ if not (fDriverType in [mkMSSQL, mkMySQL, mkPostgreSQL]) then Exit;
+ end else if IsEqualGUID(IID, IDAFileBasedDatabase) then begin
+ if not (fDriverType in [mkInterBase,mkMSAccess, mkSQLite]) then Exit;
+ end else if IsEqualGUID(IID, IDAUseGenerators) or IsEqualGUID(IID, IDAUseGenerators2) then begin
+ if not (fDriverType in [mkInterBase, mkOracle,mkPostgreSQL]) then Exit;
+ end else if IsEqualGUID(IID, IDACanQueryGeneratorsNames) then begin
+ if not (fDriverType in [mkInterBase]) then Exit;
+ end
+ // else if IsEqualGUID(IID, IDAConnectionModelling) then
+ ;
+ Result := inherited QueryInterface(IID, Obj);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ if FDirectMode then
+ result := TDAEAnyDACQueryNative
+ else
+ result := TDAEAnyDACQuery;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ if FDirectMode then
+ result := TDAEAnyDACStoredProcedureNative
+ else
+ result := TDAEAnyDACStoredProcedure;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fDriverType := mkUnknown;
+ FADConnection := TADConnection.Create(nil);
+ with FADConnection do begin
+ LoginPrompt := False;
+ FetchOptions.Mode := fmAll;
+ FetchOptions.RowsetSize := 100;
+ ResourceOptions.SilentMode := True;
+ ResourceOptions.UnifyParamNames := True;
+ end;
+ result := FADConnection;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetAnyDACPhysConnection: IADPhysConnection;
+begin
+ Result := FADConnection.ConnectionIntf;
+ if Result = nil then
+ ADPhysManager.CreateConnection(FADConnection.ConnectionDefName, Result);
+end;
+
+{------------------------------------------------------------------------------}
+
+{
+Database= S_AD_ConnParam_Common_Database
+User_Name= S_AD_ConnParam_Common_UserName
+Password= S_AD_ConnParam_Common_Password
+
+Oracle
+======
+OSAuthent= S_AD_ConnParam_Common_OSAuthent
+DriverID=Ora
+
+MSAccess
+========
+SystemDB= S_AD_ConnParam_MSAcc_SysDB
+DriverID=MSAcc
+
+DB2
+===
+Alias= S_AD_ConnParam_DB2_Alias
+Server= S_AD_ConnParam_Common_Server
+Port= S_AD_ConnParam_Common_Port
+Protocol= S_AD_ConnParam_DB2_Protocol
+DriverID=DB2
+
+ASA
+===
+Server= S_AD_ConnParam_Common_Server
+DatabaseFile= S_AD_ConnParam_ASA_DatabaseFile
+OSAuthent= S_AD_ConnParam_Common_OSAuthent
+App= S_AD_ConnParam_ASA_App
+Compress= S_AD_ConnParam_ASA_Compress
+Encrypt= S_AD_ConnParam_ASA_Encrypt
+DriverID=ASA
+
+ADS
+===
+DefaultType=
+ServerTypes=
+DriverID=ADS
+
+MSSQL
+=====
+Server= S_AD_ConnParam_Common_Server
+Network= S_AD_ConnParam_MSSQL_Network
+Address= S_AD_ConnParam_MSSQL_Address
+OSAuthent= S_AD_ConnParam_Common_OSAuthent
+Workstation= S_AD_ConnParam_MSSQL_Workstation
+App= S_AD_ConnParam_MSSQL_App
+Encrypt= S_AD_ConnParam_MSSQL_Encrypt
+Language= S_AD_ConnParam_MSSQL_Language
+DriverID=MSSQL
+
+MySQL
+=====
+CharacterSet= S_AD_ConnParam_Common_CharacterSet
+Server= S_AD_ConnParam_Common_Server
+Port= S_AD_ConnParam_Common_Port
+DriverID=MySQL
+
+IB
+==
+Protocol= S_AD_ConnParam_IB_Protocol
+Server= S_AD_ConnParam_Common_Server
+InstanceName= S_AD_ConnParam_IB_InstanceName
+CharacterSet= S_AD_ConnParam_Common_CharacterSet
+RoleName= S_AD_ConnParam_IB_RoleName
+SQLDialect= S_AD_ConnParam_IB_SQLDialect
+DriverID=IB
+
+Other
+=====
+ODBCDriver=
+DataSource=
+RDBMS=
+ODBCAdvanced=
+DriverID=ODBC
+}
+
+procedure TDAEAnyDACConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+var
+ sName, sValue: string;
+ i: integer;
+ oParams: TStringList;
+begin
+ FMySQLVersion := -1;
+ fDriverType := mkUnknown;
+ FDataTypeSchema := '';
+ fMSSQLSchemaEnabled := False;
+ fBiDirectionalDataSets := False;
+ fDirectMode := False;
+
+ inherited DoApplyConnectionString(aConnStrParser, aConnectionObject);
+ oParams := TStringList.Create;
+ try
+ with aConnStrParser do begin
+ oParams.Values[S_AD_ConnParam_Common_DriverID] := AuxDriver;
+ fDriverType := AnyDACDriverIdToAnyDACDriverType(AuxDriver);
+
+ if (Self.UserID <> '') then
+ oParams.Values[S_AD_ConnParam_Common_UserName] := Self.UserID
+ else if (UserID <> '') then
+ oParams.Values[S_AD_ConnParam_Common_UserName] := UserID;
+
+ if (Self.Password <> '') then
+ oParams.Values[S_AD_ConnParam_Common_Password] := Self.Password
+ else if (Password <> '') then
+ oParams.Values[S_AD_ConnParam_Common_Password] := Password;
+
+ if Database <> '' then
+ oParams.Values[S_AD_ConnParam_Common_Database] := Database;
+ FDataBaseName := DataBase;
+
+ if Server <> '' then
+ oParams.Values[S_AD_ConnParam_Common_Server] := Server;
+
+ for i := 0 to AuxParamsCount - 1 do begin
+ sName := AuxParamNames[i];
+ if sName = '' then Continue;
+ sValue := AuxParams[AuxParamNames[i]];
+ if SameText(sName, 'Schemas') then begin
+ fMSSQLSchemaEnabled := sValue = '1';
+ Continue;
+ end
+ else if SameText(sName, 'Dialect') then begin
+ if fDriverType = mkInterBase then
+ sName := S_AD_ConnParam_IB_SQLDialect;
+ end
+ else if SameText(sName, 'Role') then begin
+ if fDriverType = mkInterBase then
+ sName := S_AD_ConnParam_IB_RoleName;
+ end
+ else if SameText(sName, 'Charset') then begin
+ if fDriverType = mkInterBase then
+ sName := S_AD_ConnParam_Common_CharacterSet;
+ end
+ else if SameText(sName, 'Port') then begin
+ if StrToIntDef(sValue, -1) <> -1 then
+ sName := S_AD_ConnParam_Common_Port;
+ end
+ else if SameText(sName, 'ConnectionDefName') then
+ sName := S_AD_DefinitionParam_Common_ConnectionDef
+ else if SameText(sName, 'DataTypeSchema') then begin
+ if fDriverType = mkInterBase then
+ FDataTypeSchema := UpperCase(sValue);
+ end
+ else if SameText(sName, 'Integrated Security') then begin
+ if (fDriverType = mkMSSQL) and (sValue = 'SSPI') then begin
+ sName := S_AD_ConnParam_Common_OSAuthent;
+ sValue := 'Yes';
+ end
+ else
+ Continue;
+ end
+ else if SameText(sName, 'BiDirectionalDataSets') then begin
+ fBiDirectionalDataSets := sValue = '1';
+ Continue;
+ end
+ else if SameText(sName, 'DirectMode') then begin
+ fDirectMode := sValue = '1';
+ Continue;
+ end
+ else
+ if sName[1] = '@' then
+ sName := Pchar(sName) + 1;
+ oParams.Values[sName] := sValue;
+ end;
+ end;
+
+ FADConnection.ConnectionDefName :=
+ TDAEAnyDACDriver(Driver).LookupConnectionString(GetConnectionString, oParams);
+
+ if FDataTypeSchema = 'FIB' then
+ MapAsFIB;
+ finally
+ oParams.Free;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.MapAsFIB;
+begin
+ with FADConnection.FormatOptions do begin
+ OwnMapRules := True;
+ MapRules.Clear;
+ with MapRules.Add do begin
+ SourceDataType := dtFmtBCD;
+ TargetDataType := dtDouble;
+ end;
+ with MapRules.Add do begin
+ SourceDataType := dtCurrency;
+ TargetDataType := dtDouble;
+ end;
+ with MapRules.Add do begin
+ SourceDataType := dtBCD;
+ TargetDataType := dtBCD;
+ end;
+ with MapRules.Add do begin
+ SourceDataType := dtInt64;
+ TargetDataType := dtBCD;
+ end;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetMySQLVersion: integer;
+begin
+ if FMySQLVersion = -1 then FMySQLVersion := MYSQL_GetVersion(GetDatasetClass.Create(Self));
+ Result := FMySQLVersion;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.DoBeginTransaction: integer;
+begin
+ Result := 0;
+ FADConnection.StartTransaction;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.DoCommitTransaction;
+begin
+ FADConnection.Commit;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.DoRollbackTransaction;
+begin
+ FADConnection.Rollback;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.DoGetInTransaction: boolean;
+begin
+ result := FADConnection.InTransaction;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.Native_DoGetLastAutoInc(const GeneratorName: string): variant;
+var
+ v: Variant;
+begin
+ v := FADConnection.GetLastAutoGenValue(GeneratorName);
+ if VarIsNull(v) then
+ Result := -1
+ else
+ Result := v;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+begin
+ case fDriverType of
+ mkOracle: Result := Oracle_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ mkMSSQL: Result := MSSQL_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ mkMySQL: Result := MySQL_GetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ mkInterBase: Result := IB_GetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ mkPostgreSQL: Result := Postgres_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ else
+ Result := Native_DoGetLastAutoInc(GeneratorName);
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.DoGetStoredProcedureNames(out List: IROStrings);
+begin
+ inherited;
+ case fDriverType of
+ mkOracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ mkMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure, fMSSQLSchemaEnabled);
+ mkMySQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure, GetDataBaseName,GetMySQLVersion);
+ mkInterbase: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ mkSQLite: SQLite_GetObjectNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ mkPostgreSQL: Postgres_DoGetNames(GetDatasetClass.Create(Self),List,dotProcedure);
+ else
+ DoGetNames(List, dotProcedure);
+ end
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited;
+ case fDriverType of
+ mkOracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotView);
+ mkMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView, fMSSQLSchemaEnabled);
+ mkMySQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView, GetDataBaseName,GetMySQLVersion);
+ mkInterbase: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotView);
+ mkSQLite: SQLite_GetObjectNames(GetDatasetClass.Create(Self), List, dotView);
+ mkPostgreSQL: Postgres_DoGetNames(GetDatasetClass.Create(Self), List, dotView);
+ else
+ DoGetNames(List, dotView);
+ end
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited;
+ case fDriverType of
+ mkOracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotTable);
+ mkMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable, fMSSQLSchemaEnabled);
+ mkMySQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable, GetDataBaseName,GetMySQLVersion);
+ mkInterbase: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotTable);
+ mkSQLite: SQLite_GetObjectNames(GetDatasetClass.Create(Self), List, dotTable);
+ mkPostgreSQL:Postgres_DoGetNames(GetDatasetClass.Create(Self),List,dotTable);
+ else
+ DoGetNames(List, dotTable);
+ end
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.Native_DoGetTableFields(aTableName: string; out Fields: TDAFieldCollection);
+var
+ oMIQ: TADMetaInfoQuery;
+ eAttrs: TADDataAttributes;
+ eBlobType: TDABlobType;
+ lUseROWIDAsPK: Boolean;
+ oFld: TDAField;
+begin
+ aTableName := QuoteIdentifierIfNeeded(aTableName);
+ Fields := TDAFieldCollection.Create(nil);
+ lUseROWIDAsPK := False;
+ oMIQ := TADMetaInfoQuery.Create(nil);
+ try
+ oMIQ.Connection := FADConnection;
+ oMIQ.ObjectName := aTableName;
+ oMIQ.MetaInfoKind := mkTableFields;
+ oMIQ.Open;
+ while not oMIQ.Eof do begin
+ with Fields.Add do begin
+ Name := oMIQ.FieldByName('COLUMN_NAME').AsString;
+ Size := oMIQ.FieldByName('COLUMN_LENGTH').AsInteger;
+ eAttrs := TADDataAttributes({$IFDEF FPC}ord{$ELSE}Word{$ENDIF}(oMIQ.FieldByName('COLUMN_ATTRIBUTES').AsInteger));
+ DataType := MapAD2DADataType(TADDataType(oMIQ.FieldByName('COLUMN_DATATYPE').AsInteger), eBlobType);
+ if eBlobType <> dabtUnknown then BlobType := eBlobType;
+ if (DataType = datInteger) and (caAutoInc in eAttrs) then DataType := datAutoInc;
+ if (DataType = datLargeInt) and (caAutoInc in eAttrs) then DataType := datLargeAutoInc;
+ Required := not (caAllowNull in eAttrs);
+ ReadOnly := caReadOnly in eAttrs;
+ if caROWID in eAttrs then begin
+ InPrimaryKey := True;
+ lUseROWIDAsPK := True;
+ end;
+ // DefaultValue
+ // ServerAutoRefresh
+ end;
+ oMIQ.Next;
+ end;
+
+ if not lUseROWIDAsPK then begin
+ oMIQ.Close;
+ oMIQ.BaseObjectName := oMIQ.ObjectName;
+ oMIQ.ObjectName := '';
+ oMIQ.MetaInfoKind := mkPrimaryKeyFields;
+ oMIQ.Open;
+ while not oMIQ.Eof do begin
+ oFld := Fields.FindField(oMIQ.FieldByName('COLUMN_NAME').AsString);
+ if oFld <> nil then
+ oFld.InPrimaryKey := True;
+ oMIQ.Next;
+ end;
+ end;
+
+ finally
+ oMIQ.Free;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.Native_DoGetForeignKeys(ForeignKeys: TDADriverForeignKeyCollection);
+var
+ oTabs, oFKeys, oFKeyFields: TADMetaInfoQuery;
+ sFKFields, sPKFields: String;
+ oConnMeta: IADPhysConnectionMetadata;
+
+ function QuoteName(const AName: String): String;
+ begin
+ if AName = '' then
+ Result := ''
+ else
+ Result := oConnMeta.NameQuotaChar1 + AName + oConnMeta.NameQuotaChar2;
+ end;
+
+begin
+ GetAnyDACPhysConnection.CreateMetadata(oConnMeta);
+ ForeignKeys := TDADriverForeignKeyCollection.Create(nil);
+ oTabs := TADMetaInfoQuery.Create(nil);
+ oFKeys := TADMetaInfoQuery.Create(nil);
+ oFKeyFields := TADMetaInfoQuery.Create(nil);
+ try
+ oTabs.Connection := FADConnection;
+ oTabs.MetaInfoKind := mkTables;
+ oTabs.TableKinds := [tkTable, tkTempTable, tkLocalTable];
+ oFKeys.MetaInfoKind := mkForeignKeys;
+ oFKeys.Connection := FADConnection;
+ oFKeys.MetaInfoKind := mkForeignKeys;
+ oFKeyFields.Connection := FADConnection;
+ oFKeyFields.MetaInfoKind := mkForeignKeyFields;
+ oTabs.Open;
+ while not oTabs.Eof do begin
+ oFKeys.Close;
+ oFKeys.CatalogName := QuoteName(oTabs.Fields[1].AsString);
+ oFKeys.SchemaName := QuoteName(oTabs.Fields[2].AsString);
+ oFKeys.ObjectName := QuoteName(oTabs.Fields[3].AsString);
+ oFKeys.Open;
+ while not oFKeys.Eof do begin
+ oFKeyFields.Close;
+ oFKeyFields.CatalogName := QuoteName(oFKeys.Fields[1].AsString);
+ oFKeyFields.SchemaName := QuoteName(oFKeys.Fields[2].AsString);
+ oFKeyFields.BaseObjectName := QuoteName(oFKeys.Fields[3].AsString);
+ oFKeyFields.ObjectName := QuoteName(oFKeys.Fields[4].AsString);
+ oFKeyFields.Open;
+ sPKFields := '';
+ sFKFields := '';
+ while not oFKeyFields.Eof do begin
+ if sPKFields <> '' then
+ sPKFields := sPKFields + ',';
+ sPKFields := sPKFields + oFKeyFields.Fields[6].AsString;
+ if sFKFields <> '' then
+ sFKFields := sFKFields + ',';
+ sFKFields := sFKFields + oFKeyFields.Fields[5].AsString;
+ oFKeyFields.Next;
+ end;
+ with ForeignKeys.Add do begin
+ PKTable := FADConnection.EncodeObjectName(oFKeys.Fields[5].AsString,
+ oFKeys.Fields[6].AsString, '', oFKeys.Fields[7].AsString);
+ PKField := sPKFields;
+ FKTable := FADConnection.EncodeObjectName(oFKeys.Fields[1].AsString,
+ oFKeys.Fields[2].AsString, '', oFKeys.Fields[3].AsString);
+ FKField := sFKFields;
+ end;
+ oFKeys.Next;
+ end;
+ oTabs.Next;
+ end;
+ finally
+ oTabs.Free;
+ oFKeys.Free;
+ oFKeyFields.Free;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.DoGetNames(AList: IROStrings; AObjectType: TDAObjecttype);
+begin
+ case AObjectType of
+ dotTable: FADConnection.GetTableNames('', '', '', AList.Strings, [osMy], [tkTable]);
+ dotProcedure: FADConnection.GetStoredProcNames('', '', '', '', AList.Strings, [osMy]);
+ dotView: FADConnection.GetTableNames('', '', '', AList.Strings, [osMy], [tkView]);
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ case fDriverType of
+ mkOracle: Oracle_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ mkMSSQL: MSSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ mkMySQL: MYSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName),GetDatasetClass.Create(Self),Fields, GetDataBaseName,GetMySQLVersion);
+ mkInterBase: IB_GetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ mkPostgreSQL:Postgres_DoGetTableFields(aTableName, GetDatasetClass.Create(Self), Fields);
+ else
+ Native_DoGetTableFields(aTableName,Fields);
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ case fDriverType of
+ mkMySQL: MYSQL_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params, GetDataBaseName);
+ mkOracle: Oracle_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+ mkMSSQL: MSSQL_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+ else
+ inherited;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ inherited;
+ case fDriverType of
+ mkOracle: Oracle_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ mkMSSQL: MSSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, fMSSQLSchemaEnabled);
+ mkMySQL: MYSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, GetDataBaseName,GetMySQLVersion);
+ mkInterBase: IB_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ mkSQLite: SQLite_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ mkPostgreSQL:Postgres_DoGetForeignKeys(GetDatasetClass.Create(Self),ForeignKeys);
+ else
+ Native_DoGetForeignKeys(ForeignKeys);
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ case fDriverType of
+ mkOracle: Result := Oracle_CreateMacroProcessor;
+ mkMSSQL,mkMSAccess: Result := MSSQL_CreateMacroProcessor;
+ mkInterBase: Result := IB_CreateMacroProcessor;
+ else
+ Result := inherited CreateMacroProcessor;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+// IDAConnection
+
+function TDAEAnyDACConnection.GetSPSelectSyntax(AHasArguments: Boolean): string;
+begin
+ case fDriverType of
+ mkOracle: Result := Oracle_GetSPSelectSyntax(AHasArguments);
+ mkMSSQL: Result := MSSQL_GetSPSelectSyntax(AHasArguments);
+ mkInterBase: Result := IB_GetSPSelectSyntax(AHasArguments);
+ mkPostgreSQL:Result := Postgres_GetSPSelectSyntax(AHasArguments);
+ else
+ Result := inherited GetSPSelectSyntax(AHasArguments);
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.Native_GetQuoteChars: TDAQuoteCharArray;
+var
+ oConnMeta: IADPhysConnectionMetadata;
+begin
+ GetAnyDACPhysConnection.CreateMetadata(oConnMeta);
+ result[0] := oConnMeta.NameQuotaChar1;
+ result[1] := oConnMeta.NameQuotaChar2;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetQuoteChars: TDAQuoteCharArray;
+begin
+ case fDriverType of
+ mkMSSQL: Result := MSSQL_GetQuoteChars;
+ mkOracle: Result := Oracle_GetQuoteChars;
+ else
+ Result := Native_GetQuoteChars;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.IdentifierNeedsQuoting(const AIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(AIdentifier);
+ if not Result then
+ case fDriverType of
+ mkORACLE: Result := Oracle_IdentifierNeedsQuoting(AIdentifier);
+ mkMSSQL: Result := MSSQL_IdentifierNeedsQuoting(AIdentifier);
+ mkMySQL: Result := MYSQL_IdentifierNeedsQuoting(AIdentifier);
+ mkInterBase: Result := IB_IdentifierNeedsQuoting(AIdentifier, GetSQLDialect);
+ mkDB2: Result := DB2_IdentifierNeedsQuoting(AIdentifier);
+ mkASA,mkADS: Result := Sybase_IdentifierNeedsQuoting(AIdentifier);
+ mkSQLite: Result := SQLite_IdentifierNeedsQuoting(AIdentifier);
+ mkPostgreSQL:Result := Postgres_IdentifierNeedsQuoting(AIdentifier);
+ else
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+// IDAADOConnection
+
+function TDAEAnyDACConnection.GetCommandTimeout: Integer;
+begin
+ Result := Integer(FADConnection.ResourceOptions.CmdExecTimeout);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.SetCommandTimeout(const Value: Integer);
+begin
+ FADConnection.ResourceOptions.CmdExecTimeout := Value;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetProviderName: string;
+begin
+ Result := FADConnection.ResultConnectionDef.DriverID;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetProviderType: TDAOleDBProviderType;
+var
+ s: String;
+begin
+ s := GetProviderName;
+ if SameText(s, S_AD_MSSQLId) then
+ Result := oledb_MSSQL
+ else if SameText(s, S_AD_MSAccId) then
+ Result := oledb_Jet
+ else if SameText(s, S_AD_OraId) then
+ Result := oledb_Oracle
+ else if SameText(s, S_AD_ODBCId) then
+ Result := oledb_ODBC
+ else if SameText(s, S_AD_PGId) then
+ Result := oledb_Postgresql
+ else
+ Result := oledb_Unknown;
+ // oledb_MSSQL2005
+ // oleDb_VisualFoxPro
+ // oledb_MSSQL2008
+end;
+
+{------------------------------------------------------------------------------}
+// IDAIBTransactionAccess
+
+function TDAEAnyDACConnection.GetTransaction: TObject;
+begin
+ Result := FADConnection.Transaction;
+end;
+
+{------------------------------------------------------------------------------}
+// IDAIBConnectionProperties
+
+function TDAEAnyDACConnection.GetSQLDialect: integer;
+begin
+ Result := StrToIntDef(FADConnection.Params.Values[S_AD_ConnParam_IB_SQLDialect],3);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.SetSQLDialect(Value: integer);
+begin
+ FADConnection.Params.Values[S_AD_ConnParam_IB_SQLDialect] := IntToStr(Value);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetCharset: string;
+begin
+ Result := FADConnection.Params.Values[S_AD_ConnParam_Common_CharacterSet];
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.SetCharset(const Value: string);
+begin
+ FADConnection.Params.Values[S_AD_ConnParam_Common_CharacterSet] := Value;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetRole: string;
+begin
+ Result := FADConnection.Params.Values[S_AD_ConnParam_IB_RoleName];
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.SetRole(const Value: string);
+begin
+ FADConnection.Params.Values[S_AD_ConnParam_IB_RoleName] := Value;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.Commit;
+begin
+ Self.DoCommitTransaction;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.Rollback;
+begin
+ Self.DoRollbackTransaction;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.CommitRetaining;
+begin
+ FADConnection.CommitRetaining;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.RollbackRetaining;
+begin
+ FADConnection.RollbackRetaining;
+end;
+
+{------------------------------------------------------------------------------}
+// IDAConnectionModelling
+
+function TDAEAnyDACConnection.FieldToDeclaration(aField: TDAField): string;
+begin
+ Result := '';
+ case fDriverType of
+ mkMSSQL:
+ case aField.DataType of
+ datString: result := Format('varchar(%d)', [aField.Size]);
+ datDateTime: result := 'datetime';
+ datFloat: result := 'float';
+ datCurrency: result := 'money';
+ datAutoInc: result := 'int IDENTITY(1,1)';
+ datInteger: result := 'int';
+ datLargeInt: result := 'bigint';
+ datBoolean: result := 'bit';
+ datMemo: result := 'text';
+ datBlob: result := 'image';
+ datWideString: result := Format('nvarchar(%d)', [aField.Size]);
+ datWideMemo: result := 'ntext';
+ datLargeAutoInc: result := 'bigint IDENTITY(1,1)';
+ datByte: result := 'smallint';
+ datShortInt: result := 'smallint';
+ datWord: result := 'int';
+ datSmallInt: result := 'smallint';
+ datCardinal: result := 'bigint';
+ datLargeUInt: result := 'bigint';
+ datGuid: result := 'uniqueidentifier';
+ datXml: result := 'ntext';
+ datDecimal: result := 'decimal';
+ datSingleFloat: result := 'real';
+ end;
+
+ mkOracle:
+ case aField.DataType of
+ datString: result := Format('varchar2(%d)', [aField.Size]);
+ datDateTime: result := 'date';
+ datFloat: result := 'float';
+ datCurrency: result := 'number(19,4)';
+ datAutoInc: result := 'number(10,0)';
+ datInteger: result := 'number(10,0)';
+ datLargeInt: result := 'number(19,0)';
+ datBoolean: result := 'number(1)';
+ datMemo,
+ datBlob:
+ case aField.BlobType of
+ dabtBlob: result := 'long raw';
+ dabtMemo: result := 'long';
+ dabtOraBlob: result := 'blob';
+ dabtOraClob: result := 'clob';
+ else if aField.DataType = datMemo then result := 'long' else result := 'long raw';
+ end;
+ datWideString: result := Format('nvarchar2(%d)', [aField.Size]);
+ datWideMemo: result := 'nclob';
+ datLargeAutoInc: result := 'number(19,0)';
+ datByte: result := 'number(3,0)';
+ datShortInt: result := 'number(3,0)';
+ datWord: result := 'number(5,0)';
+ datSmallInt: result := 'number(5,0)';
+ datCardinal: result := 'number(10,0)';
+ datLargeUInt: result := 'number(19,0)';
+ datGuid: result := 'varchar2(38)';
+ datXml: result := 'XMLType';
+ datDecimal: result := 'number';
+ datSingleFloat: result := 'float';
+ end;
+
+ mkMySQL:
+ case aField.DataType of
+ datString: result := Format('varchar(%d)', [aField.Size]);
+ datDateTime: result := 'datetime';
+ datFloat: result := 'double';
+ datCurrency: result := 'decimal(19,4)';
+ datAutoInc: result := 'int auto_increment';
+ datInteger: result := 'int';
+ datLargeInt: result := 'bigint';
+ datBoolean: result := 'bool';
+ datMemo: result := 'longtext';
+ datBlob: result := 'longblob';
+ datWideString: result := Format('varchar(%d) character set utf8', [aField.Size]);
+ datWideMemo: result := 'longtext character set utf8';
+ datLargeAutoInc: result := 'bigint auto_increment';
+ datByte: result := 'tinyint unsigned';
+ datShortInt: result := 'tinyint';
+ datWord: result := 'smallint unsigned';
+ datSmallInt: result := 'smallint';
+ datCardinal: result := 'int unsigned';
+ datLargeUInt: result := 'bigint unsigned';
+ datGuid: result := 'varchar(38)';
+ datXml: result := 'longtext';
+ datDecimal: result := 'decimal';
+ datSingleFloat: result := 'float';
+ end;
+
+ mkMSAccess:
+ case aField.DataType of
+ datString: result := Format('varchar(%d)', [aField.Size]);
+ datDateTime: result := 'datetime';
+ datFloat: result := 'float';
+ datCurrency: result := 'currency';
+ datAutoInc: result := 'IDENTITY(1,1)';
+ datInteger: result := 'integer';
+ datLargeInt: result := 'decimal(19,0)';
+ datBoolean: result := 'boolean';
+ datMemo: result := 'memo';
+ datBlob: result := 'image';
+ datWideString: result := Format('nchar(%d)', [aField.Size]);
+ datWideMemo: result := 'ntext';
+ datLargeAutoInc: result := 'IDENTITY(1,1)';
+ datByte: result := 'byte';
+ datShortInt: result := 'tinyint';
+ datWord: result := 'smallint';
+ datSmallInt: result := 'smallint';
+ datCardinal: result := 'integer';
+ datLargeUInt: result := 'decimal(19,0)';
+ datGuid: result := 'varchar(38)';
+ datXml: result := 'ntext';
+ datDecimal: result := 'decimal';
+ datSingleFloat: result := 'real';
+ end;
+
+ mkDB2:
+ case aField.DataType of
+ datString: result := Format('varchar(%d)', [aField.Size]);
+ datDateTime: result := 'timestamp';
+ datFloat: result := 'real';
+ datCurrency: result := 'decimal(19,4)';
+ datAutoInc: result := 'integer not null generated always as identity (start with 1, increment by 1, no cache)';
+ datInteger: result := 'integer';
+ datLargeInt: result := 'bigint'; // >= 9.1
+ datBoolean: result := 'smallint';
+ datMemo,
+ datBlob:
+ case aField.BlobType of
+ dabtBlob: result := 'long varchar for bit data';
+ dabtMemo: result := 'long varchar ';
+ dabtOraBlob: result := 'blob';
+ dabtOraClob: result := 'clob';
+ else if aField.DataType = datMemo then result := 'long varchar' else result := 'long varchar for bit data';
+ end;
+ datWideString: result := Format('vargraphic(%d)', [aField.Size]);
+ datWideMemo: result := 'clob';
+ datLargeAutoInc: result := 'bigint not null generated always as identity (start with 1, increment by 1, no cache)'; // >= 9.1
+ datByte: result := 'smallint';
+ datShortInt: result := 'smallint';
+ datWord: result := 'smallint';
+ datSmallInt: result := 'smallint';
+ datCardinal: result := 'integer';
+ datLargeUInt: result := 'bigint'; // >= 9.1
+ datGuid: result := 'varchar(38)';
+ datXml: result := 'clob';
+ datDecimal: result := 'number';
+ datSingleFloat: result := 'real';
+ end;
+
+ mkASA:
+ case aField.DataType of
+ datString: result := Format('varchar(%d)', [aField.Size]);
+ datDateTime: result := 'timestamp';
+ datFloat: result := 'double';
+ datCurrency: result := 'money';
+ datAutoInc: result := 'integer identity(1,1)';
+ datInteger: result := 'integer';
+ datLargeInt: result := 'bigint';
+ datBoolean: result := 'bit';
+ datMemo: result := 'text';
+ datBlob: result := 'image';
+ datWideString: result := Format('nvarchar(%d)', [aField.Size]);
+ datWideMemo: result := 'ntext';
+ datLargeAutoInc: result := 'bigint identity(1,1)';
+ datByte: result := 'unsigned tinyint';
+ datShortInt: result := 'tinyint';
+ datWord: result := 'unsigned smallint';
+ datSmallInt: result := 'smallint';
+ datCardinal: result := 'unsigned integer';
+ datLargeUInt: result := 'unsigned bigint';
+ datGuid: result := 'uniqueidentifierstr';
+ datXml: result := 'xml';
+ datDecimal: result := 'decimal';
+ datSingleFloat: result := 'real';
+ end;
+
+ mkInterbase:
+ case aField.DataType of
+ datString: result := Format('varchar(%d)', [aField.Size]);
+ datDateTime: result := 'timestamp';
+ datFloat: result := 'double precision';
+ datCurrency: result := 'decimal(18,4)';
+ datAutoInc: result := 'integer';
+ datInteger: result := 'integer';
+ datLargeInt: result := 'decimal(18,0)';
+ datBoolean: result := 'integer check (value in (0, 1))';
+ datMemo,
+ datBlob:
+ case aField.BlobType of
+ dabtBlob: result := 'blob(2000,0)';
+ dabtMemo: result := 'blob(2000,1)';
+ dabtOraBlob: result := 'blob(2000,0)';
+ dabtOraClob: result := 'blob(2000,1)';
+ else if aField.DataType = datMemo then result := 'blob(2000,1)' else result := 'blob(2000,0)';
+ end;
+ datWideString: result := Format('varchar(%d) character set unicode_fss', [aField.Size]);
+ datWideMemo: result := 'blob sub_type 1 segment size 2000 character set unicode_fss';
+ datLargeAutoInc: result := 'decimal(18,0)';
+ datByte: result := 'smallint';
+ datShortInt: result := 'smallint';
+ datWord: result := 'smallint';
+ datSmallInt: result := 'smallint';
+ datCardinal: result := 'decimal(10,0)';
+ datLargeUInt: result := 'decimal(18,0)';
+ datGuid: result := 'varchar(38)';
+ datXml: result := 'blob(2000,1)';
+ datDecimal: result := 'decimal(18,6)';
+ datSingleFloat: result := 'float';
+ end;
+ end;
+
+ if Result = '' then
+ raise Exception.CreateFmt('DataAbstract [%d] data type of field [%s] for DBMS [%s] is not supported',
+ [Integer(aField.DataType), aField.Name, C_AD_PhysRDBMSKinds[fDriverType]]);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.BuildCreateTableSQL(aDataSet: TDADataSet;
+ const aOverrideName: string): string;
+var
+ lName: string;
+begin
+ lName := aOverrideName;
+ if lName = '' then
+ lName := aDataSet.Name;
+ result := uDAHelpers.BuildCreateStatementForTable(aDataSet, lName, self);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.CreateTable(aDataSet: TDADataSet; const aOverrideName: string);
+var
+ sSQL: string;
+begin
+ sSQL := BuildCreateTableSQL(aDataSet, aOverrideName);
+ with NewCommand(sSQL, stSQL) do
+ Execute();
+end;
+
+{------------------------------------------------------------------------------}
+// IDACanQueryDatabaseNames
+
+function TDAEAnyDACConnection.GetDataBaseName: string;
+begin
+ Result := FDataBaseName;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetDatabaseNames: IROStrings;
+begin
+ case fDriverType of
+ mkMSSQL: Result := MSSQL_GetDatabaseNames(Self);
+ mkMySQL: Result := MYSQL_GetDatabaseNames(Self);
+ mkPostgreSQL: Result := Postgres_GetDatabaseNames(Self);
+ else
+ Result := NewROStrings;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+// IDAFileBasedDatabase
+
+function TDAEAnyDACConnection.GetFileExtensions: IROStrings;
+begin
+ case fDriverType of
+ mkInterBase: Result := IB_GetFileExtensions;
+ mkMSAccess: Result := MSACCESS_GetFileExtensions;
+ mkSQLite: Result := SQLite_GetFileExtensions;
+ else
+ Result := NewROStrings;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+// IDAUseGenerators
+
+function TDAEAnyDACConnection.GetNextAutoinc2(
+ const GeneratorName: string): variant;
+begin
+ Result := -1;
+ case fDriverType of
+ mkInterBase: Result := IB_GetNextAutoinc(GeneratorName, GetDatasetClass.Create(Self));
+ mkOracle: Result := Oracle_GetNextAutoinc(GeneratorName, GetDatasetClass.Create(Self));
+ mkPostgreSQL:Result := Postgres_GetNextAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACConnection.GetNextAutoinc(const GeneratorName: string): integer;
+begin
+ Result := GetNextAutoinc2(GeneratorName);
+end;
+
+{------------------------------------------------------------------------------}
+// IDACanQueryGeneratorsNames
+
+function TDAEAnyDACConnection.GetGeneratorNames: IROStrings;
+begin
+ case fDriverType of
+ mkInterBase: Result := IB_GetGeneratorNames(GetDatasetClass.Create(Self));
+ else
+ Result := NewROStrings;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.SetupOptions(AOptions: IADStanOptions;
+ AFetchMeta: Boolean);
+begin
+ with AOptions do begin
+ if not fBiDirectionalDataSets then
+ FetchOptions.Unidirectional := True;
+ if not AFetchMeta then
+ FetchOptions.Items := FetchOptions.Items - [fiMeta];
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACConnection.SetupDataset(ADataSet: TADRdbmsDataSet;
+ AFetchMeta: Boolean);
+begin
+ TADQuery(ADataSet).Connection := FADConnection;
+ SetupOptions(IADStanOptions(TADQuery(ADataSet).Command), AFetchMeta);
+end;
+
+{------------------------------------------------------------------------------}
+{ TDAEAnyDACQuery }
+{------------------------------------------------------------------------------}
+function TDAEAnyDACQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TADQuery.Create(nil);
+ TDAEAnyDACConnection(aConnection).SetupDataset(TADQuery(result), False);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACQuery.DoPrepare(AValue: boolean);
+var
+ i: integer;
+ oPar: TADParam;
+begin
+ if AValue and not TADQuery(Dataset).Prepared and (TADQuery(Dataset).ParamCount <> 0) then
+ for I := 0 to GetParams.Count - 1 do begin
+ oPar := TADQuery(Dataset).ParamByName(GetParams[i].Name);
+ oPar.DataType := DATypeToVCLType(GetParams[i].DataType);
+ if oPar.DataType = ftAutoInc then
+ oPar.DataType := ftInteger;
+ end;
+ TADQuery(Dataset).Prepared := AValue;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACQuery.ClearParams;
+begin
+ inherited;
+ TADQuery(Dataset).Params.Clear;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACQuery.DoExecute: integer;
+begin
+ with TADQuery(Dataset) do begin
+ // 1) SELECT command on MSSQL, etc may be without result set, for example:
+ // SELECT :CUSTOMERS_CNT = count(*) from customers
+ // 2) On Oracle skExecute is handled specially (PL/SQL) and commands as
+ // above are not possible
+ if PointedConnection.RDBMSKind <> mkOracle then
+ Command.CommandKind := skExecute;
+ ExecSQL;
+ Result := RowsAffected;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACQuery.DoGetSQL: string;
+begin
+ Result := TADQuery(Dataset).SQL.Text;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACQuery.DoSetSQL(const AValue: string);
+begin
+ with TADQuery(Dataset).SQL do begin
+ BeginUpdate;
+ try
+ Clear;
+ Add(AValue);
+ finally
+ EndUpdate;
+ end;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetADParamValuesFromDA(AParams, TADQuery(Dataset).Params, True);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetDAParamValuesFromAD(GetParams, TADQuery(Dataset).Params);
+end;
+
+{------------------------------------------------------------------------------}
+{ TDAEAnyDACStoredProcedure }
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedure.CreateDataset(AConnection: TDAEConnection): TDataset;
+begin
+ Result := TADStoredProc.Create(nil);
+ TDAEAnyDACConnection(aConnection).SetupDataset(TADStoredProc(Result), True);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedure.GetStoredProcedureName: string;
+begin
+ Result := TADStoredProc(DataSet).StoredProcName;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACStoredProcedure.SetStoredProcedureName(const Name: string);
+begin
+ TADStoredProc(DataSet).StoredProcName := Name;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedure.DoExecute: integer;
+begin
+ TADStoredProc(Dataset).ExecProc;
+ result := TADStoredProc(Dataset).RowsAffected;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedure.Execute: integer;
+var
+ oADParams: TADParams;
+ oDAParams: TDAParamCollection;
+begin
+ oADParams := TADStoredProc(Dataset).Params;
+ oDAParams := GetParams;
+ if oADParams.Count <> oDAParams.Count then
+ TADStoredProc(Dataset).Prepare;
+ SetADParamValuesFromDA(oDAParams, oADParams, False);
+ Result := DoExecute;
+ // in case of SP the reference to params may be invalid after execution
+ oADParams := TADStoredProc(Dataset).Params;
+ GetDAParamValuesFromAD(oDAParams, oADParams);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACStoredProcedure.RefreshParams;
+var
+ oDAParams: TDAParamCollection;
+ oDAParam: TDAParam;
+ i: Integer;
+begin
+ TADStoredProc(Dataset).Prepare;
+ oDAParams := GetParams;
+ oDAParams.Clear;
+ with TADStoredProc(Dataset) do
+ for i := 0 to Params.Count - 1 do begin
+ oDAParam := oDAParams.Add;
+ oDAParam.Name := Params[i].Name;
+ oDAParam.DataType := VCLTypeToDAType(Params[i].DataType);
+ oDAParam.ParamType := TDAParamType(Params[i].ParamType);
+ oDAParam.Size := Params[i].Size;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetADParamValuesFromDA(AParams, TADStoredProc(Dataset).Params, False);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetDAParamValuesFromAD(AParams, TADStoredProc(Dataset).Params);
+end;
+
+{------------------------------------------------------------------------------}
+{ TDAEAnyDACNativeField }
+{------------------------------------------------------------------------------}
+constructor TDAEAnyDACNativeField.Create(ACol: TADDatSColumn; const ACmd: IADPhysCommand; AParent: TDAEAnyDACNativeDatabaseAccess);
+begin
+ inherited Create;
+ FCol := ACol;
+ FCmd := ACmd;
+ fParent:= AParent;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeField.GetDataType: TFieldType;
+var
+ iDestSize: Longword;
+ iDestPrec,iDescScale: Integer;
+begin
+ FCmd.Options.FormatOptions.ColumnDef2FieldDef(FCol.DataType, FCol.Size, FCol.Precision, FCol.Scale,
+ FCol.Attributes, Result, iDestSize, iDestPrec, iDescScale);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeField.GetDecimalPrecision: Integer;
+begin
+ Result := FCol.Precision;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeField.GetDecimalScale: Integer;
+begin
+ Result := FCol.Scale;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeField.GetFieldIndex: integer;
+begin
+ Result := FCol.Index;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeField.GetFieldName: string;
+begin
+ Result := FCol.Name;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeField.GetNativeObject: TObject;
+begin
+ Result := Self;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeField.GetSize: integer;
+begin
+ Result := FCol.Size;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeField.GetValue: Variant;
+begin
+ Result := FParent.GetNativeFieldValue(FCol.Index);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeField.IsNull: Boolean;
+begin
+ Result := fParent.IsNull(FCol.Index);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeField.isTFieldCompatible: Boolean;
+begin
+ Result := False;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeField.SetDataType(Value: TFieldType);
+var
+ eDestType: TADDataType;
+ iDestScale: Integer;
+ iDestPrec: Integer;
+ iDestSize: LongWord;
+ iDestAttrs: TADDataAttributes;
+begin
+ FCmd.Options.FormatOptions.FieldDef2ColumnDef(Value, FCol.Size, FCol.Precision,FCol.Scale,
+ eDestType, iDestSize, iDestPrec, iDestScale, iDestAttrs);
+ FCol.DataType := eDestType;
+ FCol.Attributes := iDestAttrs;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeField.SetDecimalPrecision(Value: integer);
+begin
+ FCol.Precision := Value;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeField.SetDecimalScale(Value: integer);
+begin
+ FCol.Scale := Value;
+end;
+
+{------------------------------------------------------------------------------}
+{ TDAEAnyDACNativeDatabaseAccess }
+{------------------------------------------------------------------------------}
+constructor TDAEAnyDACNativeDatabaseAccess.Create(ADAEConnection: TDAEAnyDACConnection);
+begin
+ inherited Create;
+ ADAEConnection.FADConnection.Connected:=True;
+ ADAEConnection.FADConnection.ConnectionIntf.CreateCommand(FCmd);
+ FTab := TADDatSTable.Create;
+end;
+
+{------------------------------------------------------------------------------}
+destructor TDAEAnyDACNativeDatabaseAccess.Destroy;
+begin
+ if GetActive then SetActive(False);
+ FCmd := nil;
+ FreeAndNil(FTab);
+ inherited Destroy;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess._AddRef: Integer;
+begin
+ Result := 1;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess._Release: Integer;
+begin
+ Result := 1;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.QueryInterface(const IID: TGUID; out Obj): HResult;
+begin
+ if GetInterface(IID, Obj) then
+ Result := 0
+ else
+ Result := E_NOINTERFACE;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.CheckActive;
+begin
+ if not (nfActive in FFlags) then
+ raise Exception.Create('Dataset must be active');
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.CheckBidir;
+begin
+ if FCmd.Options.FetchOptions.Unidirectional then
+ raise Exception.Create('Dataset must be bidirectional');
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.ClearFieldDefs;
+begin
+ FTab.Reset;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetRecordCount: Integer;
+begin
+ Result := FRowsPurged + FTab.Rows.Count;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetBOF: Boolean;
+begin
+ Result := nfBOF in FFlags;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetEOF: Boolean;
+begin
+ Result := nfEOF in FFlags;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetActive: Boolean;
+begin
+ Result := nfActive in FFlags;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.SetActive(const aValue: Boolean);
+var
+ i: Integer;
+begin
+ if (nfActive in FFlags) <> aValue then
+ if aValue then begin
+ FCmd.Open;
+ FCmd.Define(FTab);
+ FCmd.Fetch(FTab, False);
+ FRowIndex := 0;
+ FRowsPurged := 0;
+ if FTab.Rows.Count = 0 then
+ Include(FFlags, nfEOF)
+ else
+ Exclude(FFlags, nfEOF);
+ Include(FFlags, nfBOF);
+ Include(FFlags, nfActive);
+ SetLength(FBuffs, FTab.Columns.Count);
+ for i := 0 to FTab.Columns.Count - 1 do
+ case FTab.Columns[i].DataType of
+ dtDateTimeStamp,
+ dtTime,
+ dtDate:
+ GetMem(FBuffs[i], SizeOf(TDateTime));
+ dtGUID:
+ GetMem(FBuffs[i], 39);
+ dtCurrency:
+ GetMem(FBuffs[i], SizeOf(Double));
+ dtBCD:
+ GetMem(FBuffs[i], SizeOf(Currency));
+ else
+ FBuffs[i] := nil;
+ end;
+ end
+ else begin
+ FCmd.AbortJob(True);
+ FCmd.CloseAll;
+ FTab.Clear;
+ FRowIndex := 0;
+ FRowsPurged := 0;
+ Exclude(FFlags, nfActive);
+ for i := 0 to FTab.Columns.Count - 1 do
+ if FBuffs[i] <> nil then
+ FreeMem(FBuffs[i]);
+ SetLength(FBuffs, 0);
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.First;
+begin
+ CheckActive;
+ CheckBidir;
+ FRowIndex := 0;
+ if FTab.Rows.Count = 0 then
+ Include(FFlags, nfEOF);
+ Include(FFlags, nfBOF);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.Next;
+begin
+ CheckActive;
+ Exclude(FFlags, nfEOF);
+ if FRowIndex >= FTab.Rows.Count - 1 then begin
+ if FCmd.State = csOpen then begin
+ if FCmd.Options.FetchOptions.Unidirectional then begin
+ Inc(FRowsPurged, FTab.Rows.Count);
+ FTab.Clear;
+ FRowIndex := -1;
+ end;
+ FCmd.Fetch(FTab, False);
+ if FCmd.RowsAffected = 0 then
+ Include(FFlags, nfEOF);
+ end
+ else
+ Include(FFlags, nfEOF);
+ end;
+ if FRowIndex < FTab.Rows.Count - 1 then
+ Inc(FRowIndex);
+ if FRowIndex <= 0 then
+ Include(FFlags, nfBOF)
+ else
+ Exclude(FFlags, nfBOF);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.LocateRecord(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions; AChangePos: Boolean): Integer;
+var
+ oCols: TADDatSColumnSublist;
+ iPrevRowIndex: Integer;
+ ePrevFlags: TDAEAnyDACNativeDatabaseAccessFlags;
+ lSimple: Boolean;
+ lEQ: Boolean;
+ i: Integer;
+ V1, V2: Variant;
+begin
+ Result := -1;
+ oCols := TADDatSColumnSublist.Create;
+ iPrevRowIndex := FRowIndex;
+ ePrevFlags := FFlags;
+ try
+ oCols.Fill(FTab, KeyFields);
+ lSimple := (oCols.Count = 1) and not VarIsArray(KeyValues);
+ First;
+ while not (nfEOF in FFlags) do begin
+ lEQ := False;
+ for i := 0 to oCols.Count - 1 do begin
+ V1 := FTab.Rows[FRowIndex].GetData(oCols[i]);
+ if lSimple then
+ V2 := KeyValues
+ else
+ V2 := KeyValues[i];
+ if VarIsNull(V1) and VarIsNull(V2) then
+ lEQ := True
+ else if VarIsNull(V1) xor VarIsNull(V2) then
+ lEQ := False
+ else if oCols[i].DataType in [dtAnsiString, dtWideString, dtMemo,
+ dtWideMemo, dtHMemo, dtWideHMemo] then
+ if loCaseInsensitive in Options then begin
+ if loPartialKey in Options then
+ lEQ := Pos(AnsiLowerCase(VarToStr(V2)), AnsiLowerCase(VarToStr(V1))) = 1
+ else
+ lEQ := AnsiCompareText(VarToStr(V2), VarToStr(V1)) = 0;
+ end
+ else if loPartialKey in Options then
+ lEQ := Pos(VarToStr(V2), VarToStr(V1)) = 1
+ else
+ lEQ := CompareStr(VarToStr(V2), VarToStr(V1)) = 0
+ else
+ try
+ lEQ := V1 = V2;
+ except
+ lEQ := False;
+ end;
+ if not lEQ then
+ Break;
+ end;
+ if lEQ then begin
+ Result := FRowIndex;
+ Break;
+ end;
+ Next;
+ end;
+ finally
+ oCols.Free;
+ if (Result = -1) or not AChangePos then begin
+ FRowIndex := iPrevRowIndex;
+ FFlags := ePrevFlags;
+ end;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.Locate(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+begin
+ Result := LocateRecord(KeyFields, KeyValues, Options, True) <> -1;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.Lookup(const KeyFields: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+var
+ iRowIndex, i: Integer;
+ oCols: TADDatSColumnSublist;
+begin
+ iRowIndex := LocateRecord(KeyFields, KeyValues, [], False);
+ if iRowIndex <> -1 then begin
+ oCols := TADDatSColumnSublist.Create;
+ try
+ if oCols.Count = 1 then
+ Result := FTab.Rows[iRowIndex].GetData(oCols[0])
+ else begin
+ Result := VarArrayCreate([0, oCols.Count - 1], varVariant);
+ for i := 0 to oCols.Count - 1 do
+ Result[i] := FTab.Rows[iRowIndex].GetData(oCols[i]);
+ end;
+ finally
+ oCols.Free;
+ end
+ end
+ else
+ Result := Null;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetFieldName(Index: Integer): string;
+begin
+ Result := FTab.Columns[Index].Name;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.DisableControls;
+begin
+ // nothing
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.EnableControls;
+begin
+ // nothing
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.ControlsDisabled: Boolean;
+begin
+ // nothing
+ Result := True;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetIsEmpty: boolean;
+begin
+ Result := (FRowsPurged + FTab.Rows.Count) = 0;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.FreeBookmark(Bookmark: TBookmark);
+begin
+ // nothing
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetBookMark: pointer;
+begin
+ CheckActive;
+ CheckBidir;
+ Result := Pointer(FRowIndex);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.GotoBookmark(Bookmark: TBookmark);
+begin
+ CheckActive;
+ CheckBidir;
+ FRowIndex := Integer(Bookmark);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetState: TDatasetState;
+begin
+ if FCmd.State = csExecuting then
+ Result := dsOpening
+ else if nfActive in FFlags then
+ Result := dsBrowse
+ else
+ Result := dsInactive;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACNativeDatabaseAccess.Prepare(const AValue: Boolean);
+begin
+ if AValue then
+ FCmd.Prepare
+ else
+ FCmd.Unprepare;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetFields(Index: integer): IDANativeField;
+begin
+ Result := TDAEAnyDACNativeField.Create(FTab.Columns[Index], FCmd, Self) as IDANativeField;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.FieldCount: Integer;
+begin
+ Result := FTab.Columns.Count;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.FindField(const FieldName: string): IDANativeField;
+var
+ i: Integer;
+begin
+ i := FTab.Columns.IndexOfName(FieldName);
+ if i = -1 then
+ Result := nil
+ else
+ Result := GetFields(i);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.IsTDatasetCompatible: Boolean;
+begin
+ Result := False;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.IsNull(Index: integer): Boolean;
+var
+ Data: pointer;
+ DataSize: Cardinal;
+begin
+ Result := not FTab.Rows[FRowIndex].GetData(Index, rvDefault, Data, 0, DataSize, False);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetNativeFieldData(Index: Integer;
+ var Data: pointer; var DataSize: cardinal): Boolean;
+
+ procedure CvtGUID(ABuff: PChar; AGuid: PGUID);
+ begin
+ with AGuid^ do
+ StrLFmt(ABuff, 38,
+ '{%.8x-%.4x-%.4x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x}',
+ [D1, D2, D3, D4[0], D4[1], D4[2], D4[3], D4[4], D4[5], D4[6], D4[7]]);
+ end;
+
+ procedure ErrNotSupported(AType: TADDataType);
+ begin
+ raise Exception.CreateFmt('AnyDAC data type [%s] is not supported by DataAbstract',
+ [C_AD_DataTypeNames[AType]]);
+ end;
+
+begin
+ CheckActive;
+ if (FRowIndex >= 0) and (FRowIndex < FTab.Rows.Count) then begin
+ Result := FTab.Rows[FRowIndex].GetData(Index, rvDefault, Data, 0, DataSize, False);
+ if Result then
+ case FTab.Columns[Index].DataType of
+ dtWideString,
+ dtWideMemo,
+ dtWideHMemo:
+ DataSize := DataSize * SizeOf(WideChar);
+ dtDateTimeStamp:
+ begin
+ PDateTime(FBuffs[Index])^ := ADSQLTimeStamp2DateTime(PADSQLTimeStamp(Data)^);
+ DataSize := SizeOf(TDateTime);
+ Data := FBuffs[Index];
+ end;
+ dtTime:
+ begin
+ PDateTime(FBuffs[Index])^ := ADTime2DateTime(PLongint(Data)^);
+ DataSize := SizeOf(TDateTime);
+ Data := FBuffs[Index];
+ end;
+ dtDate:
+ begin
+ PDateTime(FBuffs[Index])^ := ADDate2DateTime(PLongint(Data)^);
+ DataSize := SizeOf(TDateTime);
+ Data := FBuffs[Index];
+ end;
+ dtGUID:
+ begin
+ CvtGUID(PChar(FBuffs[Index]), PGuid(Data));
+ DataSize := 38;
+ Data := FBuffs[Index];
+ end;
+ dtCurrency:
+ begin
+ PDouble(FBuffs[Index])^ := PCurrency(Data)^;
+ DataSize := SizeOf(Double);
+ Data := FBuffs[Index];
+ end;
+ dtBCD:
+ begin
+ BCDToCurr(PBCD(Data)^, PCurrency(FBuffs[Index])^);
+ DataSize := SizeOf(Currency);
+ Data := FBuffs[Index];
+ end;
+ dtFmtBCD: begin
+ PBCD(FBuffs[Index])^ := PBCD(Data)^;
+ DataSize := SizeOf(TBCD);
+ Data := FBuffs[Index];
+ end;
+ dtRowSetRef,
+ dtCursorRef,
+ dtRowRef,
+ dtArrayRef,
+ dtParentRowRef,
+ dtObject:
+ ErrNotSupported(FTab.Columns[Index].DataType);
+ end;
+ end
+ else
+ Result := False;
+ if not Result then begin
+ DataSize := 0;
+ Data := nil;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.GetNativeFieldValue(Index: Integer): Variant;
+var
+ data: pointer;
+ DataSize: cardinal;
+ c: Currency;
+begin
+ CheckActive;
+ if (FRowIndex >= 0) and (FRowIndex < FTab.Rows.Count) then begin
+ case FTab.Columns[Index].DataType of
+ dtDateTimeStamp:
+ if FTab.Rows[FRowIndex].GetData(Index, rvDefault, Data, 0, DataSize, False) then
+ Result := VarFromDateTime(ADSQLTimeStamp2DateTime(PADSQLTimeStamp(Data)^))
+ else
+ Result := Null;
+ dtBCD:
+ if FTab.Rows[FRowIndex].GetData(Index, rvDefault, Data, 0, DataSize, False) then begin
+ BCDToCurr(PBCD(Data)^, c);
+ Result := c;
+ end
+ else begin
+ Result := Null;
+ end;
+ dtFmtBCD:
+ if FTab.Rows[FRowIndex].GetData(Index, rvDefault, Data, 0, DataSize, False) then
+ Result := DecimalToString(BCDToDecimal(PBCD(Data)^),DecimalSeparator)
+ else
+ Result := Null;
+ dtTime, dtDate:
+ if FTab.Rows[FRowIndex].GetData(Index, rvDefault, Data, 0, DataSize, False) then
+ Result := VarFromDateTime(ADTime2DateTime(PLongint(Data)^))
+ else
+ Result := Null;
+ dtCurrency:
+ if FTab.Rows[FRowIndex].GetData(Index, rvDefault, Data, 0, DataSize, False) then
+ Result := PCurrency(Data)^
+ else
+ Result := Null;
+ dtGUID:
+ if FTab.Rows[FRowIndex].GetData(Index, rvDefault, Data, 0, DataSize, False) then
+ Result := GUIDToString(PGuid(Data)^)
+ else
+ Result := Null;
+ else
+ Result := FTab.Rows[FRowIndex].GetData(Index);
+ end;
+ end
+ else
+ Result := Null;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACNativeDatabaseAccess.CanFreeNativeFieldData: Boolean;
+begin
+ Result := False;
+end;
+
+{------------------------------------------------------------------------------}
+{ TDAEAnyDACQueryNative }
+{------------------------------------------------------------------------------}
+function TDAEAnyDACQueryNative.GetNativeObject: TDAEAnyDACNativeDatabaseAccess;
+begin
+ Result := TDAEAnyDACNativeDatabaseAccess(inherited NativeObject);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACQueryNative.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ Result := nil;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACQueryNative.CreateNativeDatabaseAccess: IDANativeDatabaseAccess;
+begin
+ Supports(NativeObject, IDANativeDatabaseAccess, Result);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACQueryNative.CreateNativeObject(aConnection: TDAEConnection): TObject;
+begin
+ Result := TDAEAnyDACNativeDatabaseAccess.Create(TDAEAnyDACConnection(aConnection));
+ TDAEAnyDACConnection(aConnection).SetupOptions(TDAEAnyDACNativeDatabaseAccess(Result).FCmd.Options, False);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACQueryNative.DoPrepare(AValue: boolean);
+var
+ i: integer;
+ oPar: TADParam;
+begin
+ if AValue and (NativeObject.FCmd.State <> csPrepared) and (NativeObject.FCmd.Params.Count <> 0) then
+ for I := 0 to GetParams.Count - 1 do begin
+ oPar := NativeObject.FCmd.Params.ParamByName(GetParams[i].Name);
+ oPar.DataType := DATypeToVCLType(GetParams[i].DataType);
+ if oPar.DataType = ftAutoInc then
+ oPar.DataType := ftInteger;
+ end;
+ if AValue then
+ NativeObject.FCmd.Prepare
+ else
+ NativeObject.FCmd.Unprepare;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACQueryNative.ClearParams;
+begin
+ inherited;
+ NativeObject.FCmd.Params.Clear;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACQueryNative.DoExecute: integer;
+var
+ oConnMeta: IADPhysConnectionMetadata;
+begin
+ with NativeObject.FCmd do begin
+ // 1) SELECT command on MSSQL, etc may be without result set, for example:
+ // SELECT :CUSTOMERS_CNT = count(*) from customers
+ // 2) On Oracle skExecute is handled specially (PL/SQL) and commands as
+ // above are not possible
+ Connection.CreateMetadata(oConnMeta);
+ if oConnMeta.Kind <> mkOracle then
+ CommandKind := skExecute;
+ Execute;
+ if RowsAffectedReal then
+ Result := RowsAffected
+ else
+ Result := 0;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACQueryNative.DoGetSQL: string;
+begin
+ Result := NativeObject.FCmd.CommandText;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACQueryNative.DoSetSQL(const AValue: string);
+begin
+ NativeObject.FCmd.CommandText := AValue;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACQueryNative.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetADParamValuesFromDA(AParams, NativeObject.FCmd.Params, True);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACQueryNative.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetDAParamValuesFromAD(GetParams, NativeObject.FCmd.Params);
+end;
+
+{------------------------------------------------------------------------------}
+{ TDAEAnyDACStoredProcedureNative }
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedureNative.GetNativeObject: TDAEAnyDACNativeDatabaseAccess;
+begin
+ Result := TDAEAnyDACNativeDatabaseAccess(inherited NativeObject);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedureNative.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ Result := nil;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedureNative.CreateNativeDatabaseAccess: IDANativeDatabaseAccess;
+begin
+ Supports(NativeObject, IDANativeDatabaseAccess, Result);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedureNative.CreateNativeObject(aConnection: TDAEConnection): TObject;
+begin
+ Result := TDAEAnyDACNativeDatabaseAccess.Create(TDAEAnyDACConnection(aConnection));
+ TDAEAnyDACNativeDatabaseAccess(Result).FCmd.CommandKind := skStoredProc;
+ TDAEAnyDACConnection(aConnection).SetupOptions(TDAEAnyDACNativeDatabaseAccess(Result).FCmd.Options, False);
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedureNative.GetStoredProcedureName: string;
+begin
+ Result := NativeObject.FCmd.CommandText;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACStoredProcedureNative.SetStoredProcedureName(const Name: string);
+begin
+ NativeObject.FCmd.CommandText := Name;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedureNative.DoExecute: integer;
+begin
+ with NativeObject.FCmd do begin
+ Execute();
+ if RowsAffectedReal then
+ Result := RowsAffected
+ else
+ Result := 0;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAEAnyDACStoredProcedureNative.Execute: integer;
+var
+ oADParams: TADParams;
+ oDAParams: TDAParamCollection;
+begin
+ oADParams := NativeObject.FCmd.Params;
+ oDAParams := GetParams;
+ if oADParams.Count <> oDAParams.Count then
+ NativeObject.FCmd.Prepare;
+ SetADParamValuesFromDA(oDAParams, oADParams, False);
+ Result := DoExecute;
+ // in case of SP the reference to params may be invalid after execution
+ oADParams := NativeObject.FCmd.Params;
+ GetDAParamValuesFromAD(oDAParams, oADParams);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACStoredProcedureNative.RefreshParams;
+var
+ oDAParams: TDAParamCollection;
+ oDAParam: TDAParam;
+ i: Integer;
+begin
+ NativeObject.FCmd.Prepare;
+ oDAParams := GetParams;
+ oDAParams.Clear;
+ with NativeObject.FCmd do
+ for i := 0 to Params.Count - 1 do begin
+ oDAParam := oDAParams.Add;
+ oDAParam.Name := Params[i].Name;
+ oDAParam.DataType := VCLTypeToDAType(Params[i].DataType);
+ oDAParam.ParamType := TDAParamType(Params[i].ParamType);
+ oDAParam.Size := Params[i].Size;
+ end;
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACStoredProcedureNative.GetParamValues(AParams: TDAParamCollection);
+begin
+ SetADParamValuesFromDA(AParams, NativeObject.FCmd.Params, False);
+end;
+
+{------------------------------------------------------------------------------}
+procedure TDAEAnyDACStoredProcedureNative.SetParamValues(AParams: TDAParamCollection);
+begin
+ GetDAParamValuesFromAD(AParams, NativeObject.FCmd.Params);
+end;
+
+{------------------------------------------------------------------------------}
+{ Registration and factory code }
+{------------------------------------------------------------------------------}
+var
+ _driver: TDAEDriver = nil;
+
+{------------------------------------------------------------------------------}
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAAnyDACDriver]);
+end;
+
+{------------------------------------------------------------------------------}
+function GetDriverObject: IDADriver;
+begin
+{$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+{$ENDIF}
+ if _driver = nil then
+ _driver := TDAEAnyDACDriver.Create(nil);
+ result := _driver;
+end;
+
+{------------------------------------------------------------------------------}
+exports
+ GetDriverObject name func_GetDriverObject;
+
+initialization
+{$IFDEF FPC}
+ {$I DataAbstract_AnyDACDriver_Glyphs.lrs}
+{$ENDIF}
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNil(_driver);
+
+end.
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDABDEDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDABDEDriver.pas
new file mode 100644
index 0000000..2a6ac6f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDABDEDriver.pas
@@ -0,0 +1,1204 @@
+unit uDABDEDriver;
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_BDEDriver_Glyphs.res}
+{$DEFINE MAX_SUPPORT}
+interface
+
+uses DB, uDAEngine, uDAInterfaces, uROClasses, uDAInterfacesEx, uDAUtils, DBTables,
+ uDAIBInterfaces, uDAADOInterfaces, uDAOracleInterfaces, uDADB2Interfaces, uDASybaseInterfaces;
+
+type
+ TDABDEProviderType = (
+ bdeSTANDARD,
+ bdeDB2,
+ bdeINFORMIX,
+ bdeINTRBASE,
+ bdeMSACCESS,
+ bdeMSSQL,
+ bdeORACLE,
+ bdeSYBASE,
+ bdeODBC);
+
+ { TDABDEDriver }
+ TDABDEDriver = class(TDADriverReference)
+ end;
+
+ { TDAEADODriver }
+ TDAEBDEDriver = class(TDAEDriver, IDADriver40)
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+ procedure GetAuxDrivers(out List: IROStrings); override;
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override;
+ function GetAvailableDriverOptionsEx(AuxDriver: string): TDAAvailableDriverOptions; override;
+ function GetProviderDefaultCustomParameters(Provider: string): string; safecall;
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; safecall;
+ public
+ end;
+
+ { TDAEADOConnection }
+ TDAEBDEConnection = class(TDAEConnection, IDACanQueryDatabaseNames, IDAFileBasedDatabase,
+ IDADirectoryBasedDatabase, IDAUseGenerators, IDAUseGenerators2, {IDAADOConnection,}
+ IDAInterbaseConnection, IDAOracleConnection, IDACanQueryGeneratorsNames,
+ IDADB2Connection, IDASybaseConnection)
+ private
+ fProviderName: string;
+ fProviderType: TDABDEProviderType;
+ fDatabase: TDataBase;
+ FSession: TSession;
+ protected
+ function QueryInterface(const IID: TGUID; out Obj): HResult; override; stdcall;
+ function CreateCustomConnection: TCustomConnection; override;
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ function GetQuoteChars: TDAQuoteCharArray; override;
+ function GetSPSelectSyntax(HasArguments: Boolean): string; override; safecall;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; safecall;
+ function QuoteFieldName(const aTableName, aFieldName: string): string; override; safecall;
+ function GetUserID: string; override; safecall;
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ // IDACanQueryDatabaseNames
+ function GetDatabaseNames: IROStrings;
+ // IDAFileBasedDatabase
+ function GetFileExtensions: IROStrings;
+ // IDAUseGenerators
+ function GetNextAutoinc(const GeneratorName: string): integer; safecall;
+ // IDAUseGenerators2
+ function GetNextAutoinc2(const GeneratorName: string): variant; safecall;
+ // IDACanQueryGeneratorsNames
+ function GetGeneratorNames: IROStrings;
+ public
+ destructor Destroy; override;
+ property DataBase: TDatabase read fDatabase;
+ property Session: TSession read FSession;
+ end;
+
+ { TDAEADOQuery }
+ TDAEBDEQuery = class(TDAEDataset, IDAMustSetParams)
+ protected
+ procedure ClearParams; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure RefreshParams; override; safecall;
+ procedure DoPrepare(Value: boolean); override; safecall;
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAEADOStoredProcedure }
+ TDAEBDEStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override;
+ function Execute: integer; override;
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoPrepare(Value: boolean); override; safecall;
+ end;
+
+procedure Register;
+function GetDriverObject: IDADriver; stdcall;
+
+function ProviderToProviderType(AProvider: string): TDABDEProviderType;
+
+implementation
+
+uses
+ Windows, SysUtils, Variants, Classes, uDARes,
+ uROBinaryHelpers, uDADriverManager, uDAMacroProcessors, uDASQL92Interfaces;
+
+var
+ _driver : TDAEDriver = nil;
+
+const
+ BDE_LANGDRIVER =
+ '(Access General,Access Greece,Access Japanese,Access Nord/Danish,Access Swed/Finnish,''ascii'' ANSI,' +
+ 'Borland ANSI Arabic,Borland DAN Latin-1,Borland DEU Latin-1,Borland ENG Latin-1,Borland ENU Latin-1,Borland ESP Latin-1,' +
+ 'Borland FIN Latin-1,Borland FRA Latin-1,Borland FRC Latin-1,Borland ISL Latin-1,Borland ITA Latin-1,Borland NLD Latin-1,' +
+ 'Borland NOR Latin-1,Borland PTG Latin-1,Borland SVE Latin-1,DB2 SQL ANSI DEU,dBASE BUL 868,dBASE CHS cp936,dBASE CHT cp950,' +
+ 'dBASE CSY cp852,dBASE CSY cp867,dBASE DAN cp865,dBASE DEU cp437,dBASE DEU cp850,dBASE ELL GR437,dBASE ENG cp437,dBASE ENG cp850,' +
+ 'dBASE ENU cp437,dBASE ENU cp850,dBASE ESP cp437,dBASE ESP cp850,dBASE FIN cp437,dBASE FRA cp437,dBASE FRA cp850,dBASE FRC cp850,' +
+ 'dBASE FRC cp863,dBASE HUN cp852,dBASE ITA cp437,dBASE ITA cp850,dBASE JPN cp932,dBASE JPN Dic932,dBASE KOR cp949,dBASE NLD cp437,' +
+ 'dBASE NLD cp850,dBASE NOR cp865,dBASE PLK cp852,dBASE PTB cp850,dBASE PTG cp860,dBASE RUS cp866,dBASE SLO cp852,dBASE SVE cp437,' +
+ 'dBASE SVE cp850,dBASE THA cp874,dBASE TRK cp857,FoxPro Czech 1250,FoxPro Czech DOS895,FoxPro German 1252,FoxPro German 437,FoxPro Nordic 1252,' +
+ 'FoxPro Nordic 437,FoxPro Nordic 850,Hebrew dBASE,MSSQL ANSI Greek,Oracle SQL WE850,Paradox ANSI HEBREW,Paradox ''ascii'',Paradox BUL 868,' +
+ 'Paradox China 936,Paradox Cyrr 866,Paradox Czech 852,Paradox Czech 867,Paradox ESP 437,Paradox Greek GR437,Paradox ''hebrew'',' +
+ 'Paradox Hun 852 DC,Paradox ''intl'',Paradox ''intl'' 850,Paradox ISL 861,Paradox ''japan'',Paradox Korea 949,Paradox ''nordan'',' +
+ 'Paradox ''nordan40'',Paradox Polish 852,Paradox Slovene 852,Paradox ''swedfin'',Paradox Taiwan 950,Paradox Thai 874,Paradox ''turk'',' +
+ 'Pdox ANSI Bulgaria,Pdox ANSI Cyrillic,Pdox ANSI Czech,Pdox ANSI Greek,Pdox ANSI Hun. DC,Pdox ANSI Intl,Pdox ANSI Intl850,Pdox ANSI Nordan4,' +
+ 'Pdox ANSI Polish,Pdox ANSI Slovene,Pdox ANSI Spanish,Pdox ANSI Swedfin,Pdox ANSI Swedfin,Pdox ANSI Turkish,Paradox ''ascii'' Japan,' +
+ 'pdx ANSI Czech ''CH'',pdx ANSI ISO L_2 CZ,pdx Czech 852 ''CH'',pdx Czech 867 ''CH'',pdx ISO L_2 Czech,''Spanish'' ANSI,' +
+ 'SQL Link ROMAN8,Sybase SQL Dic437,Sybase SQL Dic850,''WEurope'' ANSI)';
+
+function ProviderToProviderType2(AProvider: string): TDABDEProviderType;
+begin
+ if AnsiCompareText(AProvider, 'STANDARD') = 0 then Result := bdeSTANDARD else
+ if AnsiCompareText(AProvider, 'DB2') = 0 then Result := bdeDB2 else
+ if AnsiCompareText(AProvider, 'INFORMIX') = 0 then Result := bdeINFORMIX else
+ if AnsiCompareText(AProvider, 'INTRBASE') = 0 then Result := bdeINTRBASE else
+ if AnsiCompareText(AProvider, 'MSACCESS') = 0 then Result := bdeMSACCESS else
+ if AnsiCompareText(AProvider, 'MSSQL') = 0 then Result := bdeMSSQL else
+ if AnsiCompareText(AProvider, 'ORACLE') = 0 then Result := bdeORACLE else
+ if AnsiCompareText(AProvider, 'SYBASE') = 0 then Result := bdeSYBASE else
+ Result := bdeODBC;
+end;
+
+function ProviderToProviderType(AProvider: string): TDABDEProviderType;
+begin
+ if Session.IsAlias(AProvider) then
+ Result := ProviderToProviderType2(Session.GetAliasDriverName(AProvider))
+ else
+ Result := ProviderToProviderType2(AProvider);
+end;
+
+function GetDriverObject: IDADriver;
+begin
+ if (_driver = nil) then _driver := TDAEBDEDriver.Create(nil);
+ result := _driver;
+end;
+
+{ TDAEBDEDriver }
+
+procedure TDAEBDEDriver.GetAuxDrivers(out List: IROStrings);
+var
+ FList : TStringList;
+begin
+ inherited GetAuxDrivers(List);
+ FList := TStringList.Create;
+ try
+ try
+ Session.GetAliasNames(FList);
+ List.AddStrings(FList);
+ except
+ end;
+ try
+ Session.GetDriverNames(FList);
+ List.AddStrings(FList);
+ except
+ end;
+ finally
+ FList.Free;
+ end;
+ List.Sorted := True;
+ List.Sorted := False;
+end;
+
+procedure TDAEBDEDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited GetAuxParams(AuxDriver, List);
+ case ProviderToProviderType(AuxDriver) of
+ bdeSTANDARD: begin
+ List.Add('DEFAULT DRIVER=(PARADOX, DBASE, FOXPRO, ASCIIDRV)');
+ List.Add('ENABLE BCD=(TRUE, FALSE)');
+ end;
+ bdeDB2: begin
+ List.Add('BATCH COUNT=200');
+ List.Add('BLOB SIZE=32');
+ List.Add('BLOBS TO CACHE=64');
+ //List.Add('DB2 DSN'); { = 'DB2_SERVER'}
+ List.Add('ENABLE BCD=(TRUE, FALSE)');
+ List.Add('ENABLE SCHEMA CACHE=(TRUE, FALSE)');
+ List.Add('LANGDRIVER=' + BDE_LANGDRIVER);
+ List.Add('MAX ROWS=-1');
+ List.Add('OPEN MODE=(READ/WRITE,READ ONLY)');
+ List.Add('ROWSET SIZE=20');
+ List.Add('SCHEMA CACHE DIR=');
+ List.Add('SCHEMA CACHE SIZE=8');
+ List.Add('SCHEMA CACHE TIME=-1');
+ List.Add('SQLPASSTHRU MODE=(SHARED AUTOCOMMIT,SHARED NOAUTOCOMMIT,NOT SHARED)');
+ List.Add('SQLQRYMODE=(LOCAL,SERVER)');
+ end;
+ bdeINFORMIX: begin
+ List.Add('BATCH COUNT=200');
+ List.Add('BLOB SIZE=32');
+ List.Add('BLOBS TO CACHE=64');
+ List.Add('COLLCHAR=(0,1,2)');
+ List.Add('DATE MODE=0');
+ List.Add('DATE SEPARATOR=/');
+ List.Add('DBNLS=(0,1,2)');
+ List.Add('ENABLE BCD=(TRUE, FALSE)');
+ List.Add('ENABLE SCHEMA CACHE=(TRUE, FALSE)');
+ List.Add('LANGDRIVER=' + BDE_LANGDRIVER);
+ List.Add('LIST SYNONYMS=(NONE,ALL,PRIVATE)');
+ List.Add('LOCK MODE=5');
+ List.Add('MAX ROWS=-1');
+ List.Add('OPEN MODE=(READ/WRITE,READ ONLY)');
+ List.Add('SCHEMA CACHE DIR=');
+ List.Add('SCHEMA CACHE SIZE=8');
+ List.Add('SCHEMA CACHE TIME=-1');
+ List.Add('SQLPASSTHRU MODE=(SHARED AUTOCOMMIT,SHARED NOAUTOCOMMIT,NOT SHARED)');
+ List.Add('SQLQRYMODE=(LOCAL,SERVER)');
+ end;
+ bdeINTRBASE: begin
+ List.Add('BATCH COUNT=200');
+ List.Add('BLOB SIZE=32');
+ List.Add('BLOBS TO CACHE=64');
+ List.Add('COMMIT RETAIN=(FALSE)');
+ List.Add('ENABLE BCD=(TRUE, FALSE)');
+ List.Add('ENABLE SCHEMA CACHE=(TRUE, FALSE)');
+ List.Add('LANGDRIVER=' + BDE_LANGDRIVER);
+ List.Add('MAX ROWS=-1');
+ List.Add('OPEN MODE=(READ/WRITE,READ ONLY)');
+ List.Add('ROLE NAME=');
+ List.Add('SCHEMA CACHE DIR=');
+ List.Add('SCHEMA CACHE SIZE=8');
+ List.Add('SCHEMA CACHE TIME=-1');
+ List.Add('SQLPASSTHRU MODE=(SHARED AUTOCOMMIT,SHARED NOAUTOCOMMIT,NOT SHARED)');
+ List.Add('SQLQRYMODE=(LOCAL,SERVER)');
+ List.Add('WAIT ON LOCKS=(FALSE)');
+ end;
+ bdeMSACCESS: begin
+ //List.Add('DATABASE NAME'); { DRIVE:/PATH/DATABASE.MDB}
+ List.Add('LANGDRIVER=' + BDE_LANGDRIVER);
+ List.Add('OPEN MODE=(READ/WRITE,READ ONLY)');
+ List.Add('SYSTEM DATABASE=(.MDW)');
+ end;
+ bdeMSSQL: begin
+ List.Add('APPLICATION MODE'); { }
+ List.Add('BATCH COUNT=200');
+ List.Add('BLOB EDIT LOGGING=(TRUE, FALSE)');
+ List.Add('BLOB SIZE=32');
+ List.Add('BLOBS TO CACHE=64');
+ //List.Add('DATABASE NAME'); { }
+ List.Add('DATE MODE=0');
+ List.Add('ENABLE BCD=(TRUE, FALSE)');
+ List.Add('ENABLE SCHEMA CACHE=(TRUE, FALSE)');
+ //List.Add('HOST NAME'); { }
+ List.Add('LANGDRIVER=' + BDE_LANGDRIVER);
+ List.Add('MAX QUERY TIME=300');
+ List.Add('NATIONAL LANG NAME=');
+ List.Add('MAX ROWS=-1');
+ List.Add('OPEN MODE=(READ/WRITE,READ ONLY)');
+ List.Add('SCHEMA CACHE DIR=');
+ List.Add('SCHEMA CACHE SIZE=8');
+ List.Add('SCHEMA CACHE TIME=-1');
+ List.Add('SQLPASSTHRU MODE=(SHARED AUTOCOMMIT,SHARED NOAUTOCOMMIT,NOT SHARED)');
+ List.Add('SQLQRYMODE=(LOCAL,SERVER)');
+ List.Add('TDS PACKET SIZE=4096');
+ end;
+ bdeORACLE: begin
+ List.Add('BATCH COUNT=200');
+ List.Add('BLOB SIZE=32');
+ List.Add('BLOBS TO CACHE=64');
+ List.Add('ENABLE BCD=(TRUE, FALSE)');
+ List.Add('ENABLE INTEGERS=(TRUE, FALSE)');
+ List.Add('ENABLE SCHEMA CACHE=(TRUE, FALSE)');
+ List.Add('LANGDRIVER=' + BDE_LANGDRIVER);
+ List.Add('LIST SYNONYMS=(NONE,ALL,PRIVATE)');
+ List.Add('MAX ROWS=-1');
+ List.Add('OPEN MODE=(READ/WRITE,READ ONLY)');
+ List.Add('NET PROTOCOL=(TNS,TCP/IP,SPX/IPX,NETBIOS,NAMED PIPES,DECNET,3270,VINES,APPC,ASYNC)');
+ List.Add('OBJECT MODE=(TRUE, FALSE)');
+ List.Add('ROWSET SIZE=20');
+ List.Add('SCHEMA CACHE DIR=');
+ List.Add('SCHEMA CACHE SIZE=8');
+ List.Add('SCHEMA CACHE TIME=-1');
+ List.Add('SQLPASSTHRU MODE=(SHARED AUTOCOMMIT,SHARED NOAUTOCOMMIT,NOT SHARED)');
+ List.Add('SQLQRYMODE=(LOCAL,SERVER)');
+ end;
+ bdeSYBASE: begin
+ List.Add('APPLICATION MODE=');
+ List.Add('BATCH COUNT=200');
+ List.Add('BLOB EDIT LOGGING=(TRUE, FALSE)');
+ List.Add('BLOB SIZE=32');
+ List.Add('BLOBS TO CACHE=64');
+ List.Add('CS CURSOR ROWS=1');
+ //List.Add('DATABASE NAME'); { }
+ List.Add('DATE MODE=0');
+ List.Add('ENABLE BCD=(TRUE, FALSE)');
+ List.Add('ENABLE SCHEMA CACHE=(TRUE, FALSE)');
+ List.Add('HOST NAME='); { }
+ List.Add('LANGDRIVER=' + BDE_LANGDRIVER);
+ List.Add('MAX QUERY TIME=300');
+ List.Add('NATIONAL LANG NAME=');
+ List.Add('MAX ROWS=-1');
+ List.Add('OPEN MODE=(READ/WRITE,READ ONLY)');
+ List.Add('SCHEMA CACHE DIR=');
+ List.Add('SCHEMA CACHE SIZE=8');
+ List.Add('SCHEMA CACHE TIME=-1');
+ List.Add('SQLPASSTHRU MODE=(SHARED AUTOCOMMIT,SHARED NOAUTOCOMMIT,NOT SHARED)');
+ List.Add('SQLQRYMODE=(LOCAL,SERVER)');
+ List.Add('TDS PACKET SIZE=512');
+ end;
+ bdeODBC: begin
+ List.Add('BATCH COUNT=200');
+ List.Add('BLOB SIZE=32');
+ List.Add('BLOBS TO CACHE=64');
+ //List.Add('DATABASE NAME='); { }
+ List.Add('ENABLE BCD=(TRUE, FALSE)');
+ List.Add('ENABLE SCHEMA CACHE=(TRUE, FALSE)');
+ List.Add('LANGDRIVER=' + BDE_LANGDRIVER);
+ List.Add('MAX ROWS=-1');
+ List.Add('OPEN MODE=(READ/WRITE,READ ONLY)');
+ List.Add('ODBC DSN=');
+ List.Add('ROWSET SIZE=20');
+ List.Add('SCHEMA CACHE DIR=');
+ List.Add('SCHEMA CACHE SIZE=8');
+ List.Add('SCHEMA CACHE TIME=-1');
+ List.Add('SQLPASSTHRU MODE=(SHARED AUTOCOMMIT,SHARED NOAUTOCOMMIT,NOT SHARED)');
+ List.Add('SQLQRYMODE=(LOCAL,SERVER)');
+ end;
+ end;
+ List.Add('Exclusive=(TRUE, FALSE)');
+ List.Add('KeepConnections=(TRUE, FALSE)');
+ List.Add('Session_NetFileDir=');
+ List.Add('Session_PrivateDir=');
+ List.Add('TransIsolation=(tiDirtyRead,tiReadCommitted,tiRepeatableRead)');
+end;
+
+function TDAEBDEDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doAuxDriver, doServerName, doDatabaseName, doLogin, doCustom];
+ { TODO -c???: GetAuxParams }
+end;
+
+function TDAEBDEDriver.GetAvailableDriverOptionsEx(
+ AuxDriver: string): TDAAvailableDriverOptions;
+begin
+ case ProviderToProviderType(AuxDriver) of
+ bdeSTANDARD: result := [doAuxDriver, doDatabaseName, doCustom];
+ bdeDB2: result := [doAuxDriver, doServerName, doLogin, doCustom];
+ bdeMSACCESS: result := [doAuxDriver, doDatabaseName, doLogin, doCustom];
+ else
+ result := [doAuxDriver, doServerName, doDatabaseName, doLogin, doCustom];
+ end;
+end;
+
+function TDAEBDEDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEBDEConnection;
+end;
+
+function TDAEBDEDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ case ProviderToProviderType(AuxDriver) of
+ bdeSTANDARD : Result := Paradox_DriverType;
+ bdeDB2 : Result := DB2_DriverType;
+ bdeINFORMIX: Result := Informix_DriverType;
+ bdeINTRBASE : Result := IB_DriverType;
+ bdeMSACCESS : Result := Access_DriverType;
+ bdeMSSQL: Result:=MSSQL_DriverType;
+ bdeORACLE: Result:=Oracle_DriverType;
+ bdeSYBASE: Result:=Sybase_DriverType;
+ bdeODBC: Result:=ODBC_DriverType;
+ else
+ Result := inherited GetDefaultConnectionType(AuxDriver);
+ end;
+end;
+
+function TDAEBDEDriver.GetDescription: string;
+begin
+ result := 'Borland BDE Driver';
+end;
+
+function TDAEBDEDriver.GetDriverID: string;
+begin
+ result := 'BDE';
+end;
+
+function Need_ODBC_DSN(Provider: string): boolean;
+var
+ List : TStringList;
+begin
+ List := TStringList.Create;
+ try
+ try
+ if Session.IsAlias(Provider) then
+ Session.GetAliasParams(Provider, List)
+ else
+ Session.GetDriverParams(Provider, List);
+ Result := List.Values['ODBC DSN'] = '';
+ except
+ // in case is invalid Provider, error is raised
+ Result := False;
+ end;
+ finally
+ List.Free;
+ end;
+end;
+
+function TDAEBDEDriver.GetProviderDefaultCustomParameters(
+ Provider: string): string;
+begin
+ Result := '';
+ if Provider = '' then Exit;
+ case ProviderToProviderType(Provider) of
+ bdeODBC: if Need_ODBC_DSN(Provider) then Result := 'ODBC DSN=';
+ bdeSTANDARD, bdeDB2, bdeMSACCESS: Result := 'TransIsolation=tiDirtyRead;';
+ end;
+end;
+
+{ TDAEBDEQuery }
+
+procedure TDAEBDEQuery.ClearParams;
+begin
+ inherited;
+ TQuery(Dataset).Params.Clear;
+end;
+
+function TDAEBDEQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TQuery.Create(nil);
+ TQuery(Result).DatabaseName := TDAEBDEConnection(aConnection).fDatabase.DatabaseName;
+ TQuery(Result).SessionName := TDAEBDEConnection(aConnection).fDatabase.SessionName;
+end;
+
+function TDAEBDEQuery.DoExecute: integer;
+begin
+ TQuery(Dataset).ExecSQL;
+ result := TQuery(Dataset).RowsAffected;
+end;
+
+function TDAEBDEQuery.DoGetSQL: string;
+begin
+ result := TQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEBDEQuery.DoPrepare(Value: boolean);
+begin
+ if Value then
+ TQuery(Dataset).Prepare
+ else
+ TQuery(Dataset).UnPrepare
+end;
+
+procedure TDAEBDEQuery.DoSetSQL(const Value: string);
+begin
+ TQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEBDEQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams,TQuery(Dataset).Params);
+end;
+
+procedure TDAEBDEQuery.RefreshParams;
+var
+ i : Integer;
+ par : TDAParam;
+ outpar : TParam;
+ ds : TQuery;
+begin
+ inherited;
+ ds := TQuery(Dataset);
+ if not Assigned(ds.Params) then Exit;
+ for i := 0 to ds.Params.Count - 1 do begin
+ outpar := ds.Params[i];
+
+ par := self.ParamByName(outpar.Name);
+
+ if outpar.DataType <> ftUnknown then
+ par.DataType := VCLTypeToDAType(outpar.DataType);
+ end;
+end;
+
+procedure TDAEBDEQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams,TQuery(Dataset).Params);
+end;
+
+{ TDAEBDEStoredProcedure }
+
+function TDAEBDEStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ result := TStoredProc.Create(nil);
+ TStoredProc(result).DatabaseName := TDAEBDEConnection(aConnection).fDatabase.DatabaseName;
+ TStoredProc(result).SessionName := TDAEBDEConnection(aConnection).fDatabase.SessionName;
+end;
+
+function TDAEBDEStoredProcedure.DoExecute: integer;
+begin
+ Result := -1;
+ TStoredProc(Dataset).ExecProc;
+end;
+
+procedure TDAEBDEStoredProcedure.DoPrepare(Value: boolean);
+begin
+ if value then
+ TStoredProc(Dataset).Prepare
+ else
+ TStoredProc(Dataset).UnPrepare
+end;
+
+function TDAEBDEStoredProcedure.Execute: integer;
+var
+ i : integer;
+ ds : TStoredProc;
+begin
+ ds := TStoredProc(Dataset);
+
+ for i := ds.Params.Count - 1 downto 0 do begin
+ if (ds.Params[i].DataType = ftInterface) and
+ (ds.Params[i].ParamType in [ptOutput, ptInputOutput, ptReSult]) then
+ ds.Params.Delete(i);
+ end;
+
+ SetParamValuesStd(GetParams, TStoredProc(Dataset).Params);
+
+ Result:= DoExecute;
+ ds.GetResults;
+
+ GetParamValuesStd(GetParams, TStoredProc(Dataset).Params);
+end;
+
+procedure TDAEBDEStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TStoredProc(Dataset).Params);
+end;
+
+function TDAEBDEStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEBDEStoredProcedure.RefreshParams;
+var
+ dsparams : TParams;
+begin
+ dsparams := TParams.Create(nil);
+ try
+ TStoredProc(Dataset).CopyParams(dsParams);
+ RefreshParamsStd(dsparams);
+ finally
+ dsParams.Free;
+ end;
+end;
+
+procedure TDAEBDEStoredProcedure.SetParamValues(
+ AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TStoredProc(Dataset).Params);
+end;
+
+procedure TDAEBDEStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TStoredProc(Dataset).StoredProcName := Name;
+end;
+
+{ TDAEBDEConnection }
+
+function TDAEBDEConnection.CreateCustomConnection: TCustomConnection;
+begin
+ FDatabase := TDatabase.Create(nil);
+ FSession := TSession.Create(nil);
+ FSession.AutoSessionName := True;
+ fDatabase.SessionName := FSession.SessionName;
+ Result := fDatabase;
+ fDatabase.LoginPrompt := False;
+ fDatabase.DatabaseName := copy(NewStrippedGuidAsString, 1, 30);
+end;
+
+function TDAEBDEConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeINTRBASE: Result := IB_CreateMacroProcessor;
+ bdeMSSQL: Result := MSSQL_CreateMacroProcessor;
+ bdeORACLE: Result := Oracle_CreateMacroProcessor;
+ else
+ Result:=inherited CreateMacroProcessor;
+ end;
+ {$ELSE}
+ Result:=inherited CreateMacroProcessor;
+ {$ENDIF}
+end;
+
+destructor TDAEBDEConnection.Destroy;
+begin
+ FSession.CloseDatabase(fDatabase);
+ FSession.Close;
+ fDatabase.Close;
+ FreeAndNil(FSession);
+ inherited;
+end;
+
+procedure TDAEBDEConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection);
+
+ procedure SetUserNamePassword;
+ begin
+ with aConnStrParser do begin
+ if (Self.UserID <> '') then
+ fDatabase.Params.Values['USER NAME'] := Self.UserID
+ else if (UserID <> '') then
+ fDatabase.Params.Values['USER NAME'] := UserID;
+
+ if (Self.Password <> '') then
+ fDatabase.Params.Values['PASSWORD'] := Self.Password
+ else if (Password <> '') then
+ fDatabase.Params.Values['PASSWORD'] := Password;
+ end;
+ end;
+
+var
+ i : Integer;
+ sName, sValue: String;
+begin
+ inherited;
+ with aConnStrParser do begin
+ if AuxDriver <> '' then begin
+ fDatabase.Params.Clear;
+ fDatabase.AliasName := '';
+ fDatabase.DriverName := '';
+ fProviderType := ProviderToProviderType(AuxDriver);
+ if fDatabase.Session.IsAlias(AuxDriver) then
+ fDatabase.AliasName := AuxDriver
+ else
+ fDatabase.DriverName := AuxDriver;
+ end
+ else
+ raise EDADriverException.Create('No aux driver specified for BDE connection');
+
+ fProviderName := AuxDriver;
+
+ case fProviderType of
+ bdeSTANDARD: begin
+ //fDatabase.Params.Values['DEFAULT DRIVER'] := ; {PARADOX, DBASE, FOXPRO, ASCIIDRV}
+ //fDatabase.Params.Values['ENABLE BCD'] := { TRUE / FALSE}
+ if Database <> '' then fDatabase.Params.Values['PATH'] := Database;
+ end;
+ bdeDB2: begin
+ //fDatabase.Params.Values['BATCH COUNT'] := { = 200}
+ //fDatabase.Params.Values['BLOB SIZE'] := { = 32}
+ //fDatabase.Params.Values['BLOBS TO CACHE'] := { = 64}
+ if Server <> '' then fDatabase.Params.Values['DB2 DSN'] := Server; { = 'DB2_SERVER'}
+ //fDatabase.Params.Values['ENABLE BCD'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['ENABLE SCHEMA CACHE'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['LANGDRIVER'] := { ...}
+ //fDatabase.Params.Values['MAX ROWS'] := { = -1}
+ //fDatabase.Params.Values['OPEN MODE'] := { READ/WRITE, READ ONLY}
+ //fDatabase.Params.Values['ROWSET SIZE'] := { = 20}
+ //fDatabase.Params.Values['SCHEMA CACHE DIR'] := { = ''}
+ //fDatabase.Params.Values['SCHEMA CACHE SIZE'] := { = 8}
+ //fDatabase.Params.Values['SCHEMA CACHE TIME'] := { = -1}
+ //fDatabase.Params.Values['SQLPASSTHRU MODE'] := { SHARED AUTOCOMMIT, SHARED NOAUTOCOMMIT, NOT SHARED}
+ //fDatabase.Params.Values['SQLQRYMODE'] := { = '',LOCAL,SERVER}
+ SetUserNamePassword;
+ end;
+ bdeINFORMIX: begin
+ //fDatabase.Params.Values['BATCH COUNT'] := { = 200}
+ //fDatabase.Params.Values['BLOB SIZE'] := { = 32}
+ //fDatabase.Params.Values['BLOBS TO CACHE'] := { = 64}
+ //fDatabase.Params.Values['COLLCHAR'] := { = 0,1,2}
+ if Database <> '' then fDatabase.Params.Values['DATABASE NAME'] := Database;
+ //fDatabase.Params.Values['DATE MODE'] := { = 0};
+ //fDatabase.Params.Values['DATE SEPARATOR'] := { = '/'};
+ //fDatabase.Params.Values['DBNLS'] := { = '',0,1,2};
+ //fDatabase.Params.Values['ENABLE BCD'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['ENABLE SCHEMA CACHE'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['LANGDRIVER'] := { ...}
+ //fDatabase.Params.Values['LIST SYNONYMS'] := { NONE, ALL, PRIVATE}
+ //fDatabase.Params.Values['LOCK MODE'] := { = 5}
+ //fDatabase.Params.Values['MAX ROWS'] := { = -1}
+ //fDatabase.Params.Values['OPEN MODE'] := { READ/WRITE, READ ONLY}
+ //fDatabase.Params.Values['SCHEMA CACHE DIR'] := { = ''}
+ //fDatabase.Params.Values['SCHEMA CACHE SIZE'] := { = 8}
+ //fDatabase.Params.Values['SCHEMA CACHE TIME'] := { = -1}
+ if Server <> '' then fDatabase.Params.Values['SERVER NAME'] := Server;
+ //fDatabase.Params.Values['SQLPASSTHRU MODE'] := { SHARED AUTOCOMMIT, SHARED NOAUTOCOMMIT, NOT SHARED}
+ //fDatabase.Params.Values['SQLQRYMODE'] := { = '',LOCAL,SERVER}
+ SetUserNamePassword;
+ end;
+ bdeINTRBASE: begin
+ //fDatabase.Params.Values['BATCH COUNT'] := { = 200}
+ //fDatabase.Params.Values['BLOB SIZE'] := { = 32}
+ //fDatabase.Params.Values['BLOBS TO CACHE'] := { = 64}
+ //fDatabase.Params.Values['COMMIT RETAIN'] := { = FALSE}
+ //fDatabase.Params.Values['ENABLE BCD'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['ENABLE SCHEMA CACHE'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['LANGDRIVER'] := { ...}
+ //fDatabase.Params.Values['MAX ROWS'] := { = -1}
+ //fDatabase.Params.Values['OPEN MODE'] := { READ/WRITE, READ ONLY}
+ //fDatabase.Params.Values['ROLE NAME'] := { = ''}
+ //fDatabase.Params.Values['SCHEMA CACHE DIR'] := { = ''}
+ //fDatabase.Params.Values['SCHEMA CACHE SIZE'] := { = 8}
+ //fDatabase.Params.Values['SCHEMA CACHE TIME'] := { = -1}
+ if Database <> '' then fDatabase.Params.Values['SERVER NAME'] := StringReplace(Database, '\', '/', [rfReplaceAll]); { = IB_SERVER:/PATH/DATABASE.GDB}
+ if Server <> '' then fDatabase.Params.Values['SERVER NAME'] := Server + ':' + fDatabase.Params.Values['SERVER NAME']; { = IB_SERVER:/PATH/DATABASE.GDB}
+ //fDatabase.Params.Values['SQLPASSTHRU MODE'] := { SHARED AUTOCOMMIT, SHARED NOAUTOCOMMIT, NOT SHARED}
+ //fDatabase.Params.Values['SQLQRYMODE'] := { = '',LOCAL,SERVER}
+ SetUserNamePassword;
+ //fDatabase.Params.Values['WAIT ON LOCKS'] := {FALSE};
+ end;
+ bdeMSACCESS: begin
+ if Database <> '' then fDatabase.Params.Values['DATABASE NAME'] := StringReplace(Database, '\', '/', [rfReplaceAll]); { DRIVE:/PATH/DATABASE.MDB}
+ //fDatabase.Params.Values['LANGDRIVER'] := { ...}
+ //fDatabase.Params.Values['OPEN MODE'] := { READ/WRITE, READ ONLY}
+ //fDatabase.Params.Values['SYSTEM DATABASE'] := { *.MDW}
+ SetUserNamePassword;
+ end;
+ bdeMSSQL: begin
+ //fDatabase.Params.Values['APPLICATION MODE'] := { }
+ //fDatabase.Params.Values['BATCH COUNT'] := { = 200}
+ //fDatabase.Params.Values['BLOB EDIT LOGGING'] := { '',TRUE,FALSE}
+ //fDatabase.Params.Values['BLOB SIZE'] := { = 32}
+ //fDatabase.Params.Values['BLOBS TO CACHE'] := { = 64}
+ if Database <> '' then fDatabase.Params.Values['DATABASE NAME'] := Database;
+ //fDatabase.Params.Values['DATE MODE'] := { = 0};
+ //fDatabase.Params.Values['ENABLE BCD'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['ENABLE SCHEMA CACHE'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['HOST NAME'] := { };
+ //fDatabase.Params.Values['LANGDRIVER'] := { ...}
+ //fDatabase.Params.Values['MAX QUERY TIME'] := { 300}
+ //fDatabase.Params.Values['MAX ROWS'] := { = -1}
+ //fDatabase.Params.Values['NATIONAL LANG NAME'] := { }
+ //fDatabase.Params.Values['OPEN MODE'] := { READ/WRITE, READ ONLY}
+ //fDatabase.Params.Values['SCHEMA CACHE DIR'] := { = ''}
+ //fDatabase.Params.Values['SCHEMA CACHE SIZE'] := { = 8}
+ //fDatabase.Params.Values['SCHEMA CACHE TIME'] := { = -1}
+ if Server <> '' then fDatabase.Params.Values['SERVER NAME'] := Server; { = MSS_SERVER}
+ //fDatabase.Params.Values['SQLPASSTHRU MODE'] := { SHARED AUTOCOMMIT, SHARED NOAUTOCOMMIT, NOT SHARED}
+ //fDatabase.Params.Values['SQLQRYMODE'] := { = '',LOCAL,SERVER}
+ //fDatabase.Params.Values['TDS PACKET SIZE'] := { = 4096}
+ SetUserNamePassword;
+ end;
+ bdeORACLE: begin
+ //fDatabase.Params.Values['BATCH COUNT'] := { = 200}
+ //fDatabase.Params.Values['BLOB SIZE'] := { = 32}
+ //fDatabase.Params.Values['BLOBS TO CACHE'] := { = 64}
+ //fDatabase.Params.Values['ENABLE BCD'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['ENABLE INTEGERS'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['ENABLE SCHEMA CACHE'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['LANGDRIVER'] := { ...}
+ //fDatabase.Params.Values['LIST SYNONYMS'] := { NONE, ALL, PRIVATE}
+ //fDatabase.Params.Values['MAX ROWS'] := { = -1}
+ //fDatabase.Params.Values['NET PROTOCOL'] := { = TNS, TCP/IP,SPX/IPX,NETBIOS,NAMED PIPES,DECNET,3270,VINES,APPC,ASYNC}
+ //fDatabase.Params.Values['OBJECT MODE'] := { = TRUE/FALSE}
+ //fDatabase.Params.Values['OPEN MODE'] := { READ/WRITE, READ ONLY}
+ //fDatabase.Params.Values['ROWSET SIZE'] := { = 20}
+ //fDatabase.Params.Values['SCHEMA CACHE DIR'] := { = ''}
+ //fDatabase.Params.Values['SCHEMA CACHE SIZE'] := { = 8}
+ //fDatabase.Params.Values['SCHEMA CACHE TIME'] := { = -1}
+ if Server <> '' then fDatabase.Params.Values['SERVER NAME'] := Server; { = ORA_SERVER}
+ //fDatabase.Params.Values['SQLPASSTHRU MODE'] := { SHARED AUTOCOMMIT, SHARED NOAUTOCOMMIT, NOT SHARED}
+ //fDatabase.Params.Values['SQLQRYMODE'] := { = '',LOCAL,SERVER}
+ SetUserNamePassword;
+ end;
+ bdeSYBASE: begin
+ //fDatabase.Params.Values['APPLICATION MODE'] := { }
+ //fDatabase.Params.Values['BATCH COUNT'] := { = 200}
+ //fDatabase.Params.Values['BLOB EDIT LOGGING'] := { '',TRUE,FALSE}
+ //fDatabase.Params.Values['BLOB SIZE'] := { = 32}
+ //fDatabase.Params.Values['BLOBS TO CACHE'] := { = 64}
+ //fDatabase.Params.Values['CS CURSOR ROWS'] := { = 1}
+ if Database <> '' then fDatabase.Params.Values['DATABASE NAME'] := Database;
+ //fDatabase.Params.Values['DATE MODE'] := { = 0};
+ //fDatabase.Params.Values['ENABLE BCD'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['ENABLE SCHEMA CACHE'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['HOST NAME'] := { };
+ //fDatabase.Params.Values['LANGDRIVER'] := { ...}
+ //fDatabase.Params.Values['MAX QUERY TIME'] := { 300}
+ //fDatabase.Params.Values['MAX ROWS'] := { = -1}
+ //fDatabase.Params.Values['NATIONAL LANG NAME'] := { }
+ //fDatabase.Params.Values['OPEN MODE'] := { READ/WRITE, READ ONLY}
+ //fDatabase.Params.Values['SCHEMA CACHE DIR'] := { = ''}
+ //fDatabase.Params.Values['SCHEMA CACHE SIZE'] := { = 8}
+ //fDatabase.Params.Values['SCHEMA CACHE TIME'] := { = -1}
+ if Server <> '' then fDatabase.Params.Values['SERVER NAME'] := Server; { = SYB_SERVER}
+ //fDatabase.Params.Values['SQLPASSTHRU MODE'] := { SHARED AUTOCOMMIT, SHARED NOAUTOCOMMIT, NOT SHARED}
+ //fDatabase.Params.Values['SQLQRYMODE'] := { = '',LOCAL,SERVER}
+ //fDatabase.Params.Values['TDS PACKET SIZE'] := { = 512}
+ SetUserNamePassword;
+ end;
+ bdeODBC: begin
+ //fDatabase.Params.Values['BATCH COUNT'] := { = 200}
+ //fDatabase.Params.Values['BLOB SIZE'] := { = 32}
+ //fDatabase.Params.Values['BLOBS TO CACHE'] := { = 64}
+ if Database <> '' then fDatabase.Params.Values['DATABASE NAME'] := Database;
+ //fDatabase.Params.Values['ENABLE BCD'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['ENABLE SCHEMA CACHE'] := { TRUE / FALSE}
+ //fDatabase.Params.Values['LANGDRIVER'] := { ...}
+ //fDatabase.Params.Values['MAX ROWS'] := { = -1}
+ //fDatabase.Params.Values['ODBC DSN'] := {}
+ //fDatabase.Params.Values['OPEN MODE'] := { READ/WRITE, READ ONLY}
+ //fDatabase.Params.Values['ROWSET SIZE'] := { = 20}
+ //fDatabase.Params.Values['SCHEMA CACHE DIR'] := { = ''}
+ //fDatabase.Params.Values['SCHEMA CACHE SIZE'] := { = 8}
+ //fDatabase.Params.Values['SCHEMA CACHE TIME'] := { = -1}
+ //fDatabase.Params.Values['SQLPASSTHRU MODE'] := { SHARED AUTOCOMMIT, SHARED NOAUTOCOMMIT, NOT SHARED}
+ //fDatabase.Params.Values['SQLQRYMODE'] := { = '',LOCAL,SERVER}
+ SetUserNamePassword;
+ end;
+ end;
+ for i := 0 to AuxParamsCount - 1 do begin
+ sName := AuxParamNames[i];
+ sValue := AuxParams[sName];
+
+ if AnsiSameText(sName, 'TransIsolation') then begin
+ if AnsiSameText(sValue, 'tiDirtyRead') then fDatabase.TransIsolation := tiDirtyRead else
+ if AnsiSameText(sValue, 'tiReadCommitted') then fDatabase.TransIsolation := tiReadCommitted else
+ if AnsiSameText(sValue, 'tiRepeatableRead') then fDatabase.TransIsolation := tiRepeatableRead;
+ end
+ else if AnsiSameText(sName,'Session_NetFileDir') then begin
+ FSession.Close;
+ FSession.NetFileDir := sValue
+ end
+ else if AnsiSameText(sName,'Session_PrivateDir') then begin
+ FSession.Close;
+ FSession.PrivateDir := sValue
+ end
+ else if AnsiSameText(sName,'KeepConnections') and AnsiSameText(sValue, 'False') then begin
+ FSession.KeepConnections := False // it has True by defaulr
+ end
+ else if AnsiSameText(sName,'Exclusive') then
+ fDatabase.Exclusive := AnsiSameText(sValue, 'True') // it has False by defaulr
+ else
+ fDatabase.Params.Values[AuxParamNames[i]] := AuxParams[AuxParamNames[i]];
+ end;
+ end;
+end;
+
+function TDAEBDEConnection.DoBeginTransaction: integer;
+begin
+ result := -1;
+ fDatabase.StartTransaction;
+end;
+
+procedure TDAEBDEConnection.DoCommitTransaction;
+begin
+ fDatabase.Commit;
+end;
+
+procedure TDAEBDEConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ inherited DoGetForeignKeys(ForeignKeys);
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeINTRBASE: IB_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ bdeMSSQL: MSSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, True);
+ bdeORACLE: Oracle_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ end;
+ {$ENDIF}
+end;
+
+function TDAEBDEConnection.DoGetInTransaction: boolean;
+begin
+ Result := fDatabase.InTransaction;
+end;
+
+function TDAEBDEConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+begin
+ Result := inherited DoGetLastAutoInc(GeneratorName);
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeINTRBASE: Result := IB_GetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ bdeMSSQL: Result := MSSQL_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ bdeOracle: Result := Oracle_DoGetLastAutoInc(GeneratorName,GetDatasetClass.Create(Self));
+ end;
+ {$ENDIF}
+end;
+
+procedure TDAEBDEConnection.DoGetStoredProcedureNames(
+ out List: IROStrings);
+begin
+ inherited DoGetStoredProcedureNames(List);
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeINTRBASE: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ bdeMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure, True);
+ bdeORACLE: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ else
+ fDatabase.Session.GetStoredProcNames(fDatabase.DatabaseName, List.Strings);
+ end;
+ {$ELSE}
+ fDatabase.Session.GetStoredProcNames(fDatabase.DatabaseName, List.Strings);
+ {$ENDIF}
+end;
+
+procedure TDAEBDEConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeOracle: Oracle_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+ bdeMSSQL: MSSQL_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+ else
+ inherited DoGetStoredProcedureParams(aStoredProcedureName, Params);
+ end;
+ {$ELSE}
+ inherited DoGetStoredProcedureParams(aStoredProcedureName, Params);
+ {$ENDIF}
+end;
+
+procedure TDAEBDEConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeINTRBASE: IB_GetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ bdeMSSQL: MSSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ bdeOracle: Oracle_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ else
+ inherited DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), Fields);
+ end;
+ {$ELSE}
+ inherited DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), Fields);
+ {$ENDIF}
+end;
+
+procedure TDAEBDEConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited DoGetTableNames(List);
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeINTRBASE: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotTable);
+ bdeMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable, True);
+ bdeORACLE: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotTable);
+ else
+ fDatabase.GetTableNames(List.Strings);
+ end;
+ {$ELSE}
+ fDatabase.GetTableNames(List.Strings);
+ {$ENDIF}
+end;
+
+procedure TDAEBDEConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited DoGetViewNames(List);
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeINTRBASE: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotView);
+ bdeMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView, True);
+ bdeORACLE: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotView);
+ end;
+ {$ENDIF}
+end;
+
+procedure TDAEBDEConnection.DoRollbackTransaction;
+begin
+ fDatabase.Rollback;
+end;
+
+function TDAEBDEConnection.GetDatabaseNames: IROStrings;
+begin
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeMSSQL: Result := MSSQL_GetDatabaseNames(Self);
+ else
+ Result := NewROStrings;
+ fDatabase.Session.GetDatabaseNames(Result.Strings);
+ end;
+ {$ELSE}
+ Result := NewROStrings;
+ fDatabase.Session.GetDatabaseNames(Result.Strings);
+ {$ENDIF}
+end;
+
+function TDAEBDEConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ Result := TDAEBDEQuery;
+end;
+
+function TDAEBDEConnection.GetFileExtensions: IROStrings;
+begin
+ case fProviderType of
+ bdeINTRBASE: Result := IB_GetFileExtensions;
+ bdeMSACCESS: Result := MSACCESS_GetFileExtensions;
+ else
+ Result := NewROStrings;
+ end;
+end;
+
+function TDAEBDEConnection.GetGeneratorNames: IROStrings;
+begin
+ case fProviderType of
+ bdeINTRBASE: Result:= IB_GetGeneratorNames(GetDatasetClass.Create(Self));
+ else
+ Result := NewROStrings;
+ end;
+end;
+
+function TDAEBDEConnection.GetNextAutoinc(
+ const GeneratorName: string): integer;
+begin
+ Result := GetNextAutoinc2(GeneratorName);
+end;
+
+function TDAEBDEConnection.GetNextAutoinc2(
+ const GeneratorName: string): variant;
+begin
+ result := -1;
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeINTRBASE: Result := IB_GetNextAutoinc(GeneratorName, GetDatasetClass.Create(Self));
+ bdeOracle: Result := Oracle_GetNextAutoinc(GeneratorName, GetDatasetClass.Create(Self));
+ end;
+ {$ENDIF}
+end;
+
+function TDAEBDEConnection.GetQuoteChars: TDAQuoteCharArray;
+begin
+ case fProviderType of
+ bdeMSSQL: result:=MSSQL_GetQuoteChars;
+ bdeORACLE: Result:= Oracle_GetQuoteChars;
+ else
+ Result[0] := '"';
+ Result[1] := '"';
+ end;
+end;
+
+function TDAEBDEConnection.GetSPSelectSyntax(
+ HasArguments: Boolean): string;
+begin
+ Result := inherited GetSPSelectSyntax(HasArguments);
+ {$IFDEF MAX_SUPPORT}
+ case fProviderType of
+ bdeINTRBASE: Result := IB_GetSPSelectSyntax(HasArguments);
+ bdeMSSQL: Result := MSSQL_GetSPSelectSyntax(HasArguments);
+ bdeOracle: Result := Oracle_GetSPSelectSyntax(HasArguments);
+ end;
+ {$ENDIF}
+end;
+
+function TDAEBDEConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ Result := TDAEBDEStoredProcedure;
+end;
+
+function TDAEBDEConnection.GetUserID: string;
+begin
+ Result:=fDatabase.Params.Values['USER NAME'];
+end;
+
+function TDAEBDEConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(iIdentifier);
+ if not Result then
+ case fProviderType of
+ bdeMSSQL: Result := MSSQL_IdentifierNeedsQuoting(iIdentifier);
+ bdeINTRBASE: Result := IB_IdentifierNeedsQuoting(iIdentifier,1);
+ bdeORACLE: Result := Oracle_IdentifierNeedsQuoting(iIdentifier);
+ bdeDB2: Result := DB2_IdentifierNeedsQuoting(iIdentifier);
+ bdeSYBASE: Result := Sybase_IdentifierNeedsQuoting(iIdentifier);
+ else
+ Result := SQL92_IdentifierNeedsQuoting(iIdentifier);
+ end;
+end;
+
+function TDAEBDEConnection.QueryInterface(const IID: TGUID;
+ out Obj): HResult;
+begin
+ Result := E_NOINTERFACE;
+
+ if IsEqualGUID(IID, IDADB2Connection) then begin
+ if not (fProviderType in [bdeDB2]) then Exit;
+ end;
+
+ if IsEqualGUID(IID, IDASybaseConnection) then begin
+ if not (fProviderType in [bdeSYBASE]) then Exit;
+ end;
+
+ if IsEqualGUID(IID, IDAInterbaseConnection) then begin
+ if not (fProviderType in [bdeINTRBASE]) then Exit;
+ end;
+
+ if IsEqualGUID(IID, IDAADOConnection) then begin
+ if not (fProviderType in [bdeMSSQL]) then Exit;
+ end;
+
+ if IsEqualGUID(IID, IDAOracleConnection) then begin
+ if not (fProviderType in [bdeOracle]) then Exit;
+ end;
+
+ if IsEqualGUID(IID, IDAUseGenerators) or IsEqualGUID(IID, IDAUseGenerators2) then begin
+ if not (fProviderType in [bdeINTRBASE, bdeOracle]) then Exit;
+ end;
+
+ if IsEqualGUID(IID, IDACanQueryGeneratorsNames) then begin
+ if not (fProviderType in [bdeINTRBASE]) then Exit;
+ end;
+
+ if IsEqualGUID(IID, IDAFileBasedDatabase) then begin
+ if not (fProviderType in [bdeINTRBASE, bdeMSACCESS]) then Exit;
+ end;
+
+ if IsEqualGUID(IID, IDACanQueryDatabaseNames) then begin
+ if not (fProviderType in [bdeINFORMIX, bdeMSSQL, bdeORACLE, bdeSYBASE]) then Exit;
+ end;
+
+ if IsEqualGUID(IID, IDADirectoryBasedDatabase) then begin
+ if not (fProviderType in [bdeSTANDARD]) then Exit;
+ end;
+
+ Result := inherited QueryInterface(IID, Obj);
+end;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDABDEDriver]);
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+function TDAEBDEConnection.QuoteFieldName(const aTableName,
+ aFieldName: string): string;
+begin
+ Result := inherited QuoteFieldName(aTableName, aFieldName);
+ case fProviderType of
+ bdeSTANDARD:
+ if (aTableName <> '') and (aFieldName <> Result) then
+ Result := QuoteIdentifierIfNeeded(aTableName) + '.' + Result;
+ end;
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDACRLabsUtils.inc b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDACRLabsUtils.inc
new file mode 100644
index 0000000..7db5910
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDACRLabsUtils.inc
@@ -0,0 +1,61 @@
+{
+ !!! DO NOT REMOVE THIS FILE !!!
+
+ It's included with an $I directive in the SDAC and ODAC driver units and it's used in
+ their implementation of the IDAMustSetParams
+
+}
+procedure WriteCrLabsParamValues(InputParams : TDAParamCollection; OutputParams: TDAParams; IgnoreBlobType : boolean = false);
+var i : integer;
+ par : uDAInterfaces.TDAParam;
+ outpar : DBAccess.TDAParam;
+ blobtype : TFieldType;
+begin
+ for i := 0 to (InputParams.Count-1) do begin
+ par := InputParams[i];
+ outpar := OutputParams.ParamByName(par.Name);
+
+ // If no blob type is specified, then gets the default field type.
+ // BlobType is only meaningful to Oracle. MSSQL works fine just setting the DataType
+ blobtype := BlobTypeMappings[par.BlobType];
+ if (blobtype=ftUnknown)
+ then blobtype := DADataTypesMappings[par.DataType];
+
+ case par.DataType of
+ datWideMemo,
+ datBlob : begin
+ outpar.ParamType := TParamType(par.ParamType);
+ outpar.DataType := DADataTypesMappings[par.DataType];
+ if VarIsNull(par.Value) then
+ outpar.Clear
+ else begin
+ if VarIsArray(par.Value) then
+ outpar.Value := VariantToAnsiString(par.Value)
+ else
+ outpar.Value := par.Value;
+ end;
+ end;
+ datMemo : begin
+ outpar.ParamType := TParamType(par.ParamType);
+ outpar.DataType := ftMemo;
+
+ // Only happens with Oracle
+ if not IgnoreBlobType and (blobtype<>ftUnknown) then
+ outpar.DataType := blobtype;
+
+ if VarIsNull(par.Value) then
+ outpar.Clear
+ else
+ outpar.Value := par.Value;
+ end;
+ else begin
+ outpar.ParamType := TParamType(par.ParamType);
+ outpar.DataType := DADataTypesMappings[par.DataType];
+ if VarIsNull(par.Value)
+ then outpar.Clear
+ else outpar.Value := par.Value;
+ end;
+ end; { case }
+ end; { for }
+end;
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADBISAMDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADBISAMDriver.pas
new file mode 100644
index 0000000..8627488
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADBISAMDriver.pas
@@ -0,0 +1,1109 @@
+unit uDADBISAMDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+
+{$R DataAbstract_DBISAMDriver_Glyphs.res}
+
+{$I dbisamvr.inc}
+{$IFNDEF DBISAM_V4}
+{$DEFINE DBISAM_V3}
+{$ENDIF}
+
+interface
+
+uses DB, Classes, uDAEngine, uDAInterfaces, uROClasses, DBISAMTb, uDAUtils;
+
+type
+ { TDADBISAMDriver }
+ TDADBISAMDriver = class(TDADriverReference)
+ end;
+
+ { IDBISAMConnection }
+ IDBISAMConnection = interface
+ ['{C6222EF8-FBAE-42AE-B034-8FFAE8FF2578}']
+ end;
+
+ { IDBISAMConnectionProperties
+ Provides access to common properties of DBISAM connections }
+
+ IDBISAMConnectionProperties = interface
+ ['{41BAFCD6-D6EA-477E-B489-7EA6E05FFCC0}']
+ function GetForceBufferFlush: Boolean;
+ procedure SetForceBufferFlush(Value: Boolean);
+ function GetKeepConnections: Boolean;
+ procedure SetKeepConnections(Value: Boolean);
+ function GetLockProtocol: TLockProtocol;
+ procedure SetLockProtocol(Value: TLockProtocol);
+ function GetLockRetryCount: Byte;
+ procedure SetLockRetryCount(Value: Byte);
+ function GetLockWaitTime: Word;
+ procedure SetLockWaitTime(Value: Word);
+ function GetPrivateDir: string;
+ procedure SetPrivateDir(const Value: string);
+ function GetRemotePort: Integer;
+ procedure SetRemotePort(Value: Integer);
+ function GetRemoteService: string;
+ procedure SetRemoteService(const Value: string);
+ function GetRemoteTrace: Boolean;
+ procedure SetRemoteTrace(Value: Boolean);
+ {$IFDEF DBISAM_V3}
+ function GetRemoteType: TRemoteType;
+ procedure SetRemoteType(Value: TRemoteType);
+ {$ENDIF}
+ {$IFDEF DBISAM_V4}
+ function GetRemoteCompression: Byte;
+ procedure SetRemoteCompression(Value: Byte);
+ function GetRemoteEncryption: Boolean;
+ procedure SetRemoteEncryption(Value: Boolean);
+ function GetRemoteEncryptionPassword: string;
+ procedure SetRemoteEncryptionPassword(const Value: string);
+ function GetRemoteTimeout: Integer;
+ procedure SetRemoteTimeout(Value: Integer);
+ {$ENDIF}
+
+ procedure AddPassword( const aPassword: string);
+ procedure RemovePassword(const aPassword: string);
+ procedure RemoveAllPasswords;
+
+ property ForceBufferFlush: Boolean read GetForceBufferFlush write SetForceBufferFlush;
+ property KeepConnections: Boolean read GetKeepConnections write SetKeepConnections;
+ property LockProtocol: TLockProtocol read GetLockProtocol write SetLockProtocol;
+ property LockRetryCount: Byte read GetLockRetryCount write SetLockRetryCount;
+ property LockWaitTime: Word read GetLockWaitTime write SetLockWaitTime;
+ property PrivateDir: string read GetPrivateDir write SetPrivateDir;
+ property RemotePort: Integer read GetRemotePort write SetRemotePort;
+ property RemoteService: string read GetRemoteService write SetRemoteService;
+ property RemoteTrace: Boolean read GetRemoteTrace write SetRemoteTrace;
+ {$IFDEF DBISAM_V3}
+ property RemoteType: TRemoteType read GetRemoteType write SetRemoteType;
+ {$ENDIF}
+ {$IFDEF DBISAM_V4}
+ property RemoteCompression: Byte read GetRemoteCompression write SetRemoteCompression;
+ property RemoteEncryption: Boolean read GetRemoteEncryption write SetRemoteEncryption;
+ property RemoteEncryptionPassword: string read GetRemoteEncryptionPassword write SetRemoteEncryptionPassword;
+ property RemoteTimeout: Integer read GetRemoteTimeout write SetRemoteTimeout;
+ {$ENDIF}
+ end;
+
+ { TDBISAMConnection }
+ TDBISAMConnection = class(TDAConnectionWrapper)
+ private
+ fDatabase: TDBISAMDatabase;
+ fSession: TDBISAMSession;
+
+ protected
+ function GetConnected: Boolean; override;
+ procedure SetConnected(Value: Boolean); override;
+
+ public
+ constructor Create(AOwner: TComponent); override;
+
+ property Database: TDBISAMDatabase read fDatabase;
+ property Session: TDBISAMSession read fSession;
+ end;
+
+ { TDAEDBISAMDriver }
+ TDAEDBISAMDriver = class(TDAEDriver)
+ private
+
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override;
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; safecall;
+ public
+ end;
+
+ { TDAEDBISAMConnection }
+ TDAEDBISAMConnection = class(TDAEConnection, IDBISAMConnection, IDBISAMConnectionProperties)
+ private
+ fConnection: TDBISAMConnection;
+
+ protected
+ // IDBISAMConnectionProperties
+ function GetForceBufferFlush: Boolean;
+ procedure SetForceBufferFlush(Value: Boolean);
+ function GetKeepConnections: Boolean;
+ procedure SetKeepConnections(Value: Boolean);
+ function GetLockProtocol: TLockProtocol;
+ procedure SetLockProtocol(Value: TLockProtocol);
+ function GetLockRetryCount: Byte;
+ procedure SetLockRetryCount(Value: Byte);
+ function GetLockWaitTime: Word;
+ procedure SetLockWaitTime(Value: Word);
+ function GetPrivateDir: string;
+ procedure SetPrivateDir(const Value: string);
+ function GetRemotePort: Integer;
+ procedure SetRemotePort(Value: Integer);
+ function GetRemoteService: string;
+ procedure SetRemoteService(const Value: string);
+ function GetRemoteTrace: Boolean;
+ procedure SetRemoteTrace(Value: Boolean);
+ {$IFDEF DBISAM_V3}
+ function GetRemoteType: TRemoteType;
+ procedure SetRemoteType(Value: TRemoteType);
+ {$ENDIF}
+ {$IFDEF DBISAM_V4}
+ function GetRemoteCompression: Byte;
+ procedure SetRemoteCompression(Value: Byte);
+ function GetRemoteEncryption: Boolean;
+ procedure SetRemoteEncryption(Value: Boolean);
+ function GetRemoteEncryptionPassword: string;
+ procedure SetRemoteEncryptionPassword(const Value: string);
+ function GetRemoteTimeout: Integer;
+ procedure SetRemoteTimeout(Value: Integer);
+ {$ENDIF}
+ procedure AddPassword( const aPassword: string);
+ procedure RemovePassword(const aPassword: string);
+ procedure RemoveAllPasswords;
+
+ // IDAConnection
+ function CreateCustomConnection: TCustomConnection; override;
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+ function DoBeginTransaction: Integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: Boolean; override;
+ procedure DoGetTableNames(out List: IROStrings); override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection);override;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAEDBISAMQuery }
+ TDAEDBISAMQuery = class(TDAEDataset, IDAMustSetParams)
+ private
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: Integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: Boolean); override;
+
+ // IDAMustSetParams
+ {$IFDEF DBISAM_V4}
+ procedure RefreshParams; override;
+ {$ENDIF}
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+const
+ DBISAM_DriverType = 'DBISAM';
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ SysUtils, uDADriverManager, uDARes, uDAMacroProcessors, Variants,
+ uROBinaryHelpers;
+
+var
+ _driver: TDAEDriver = nil;
+ dbisam_reservedwords: array of string;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDADBISAMDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEDBISAMDriver.Create(nil);
+ result := _driver;
+end;
+
+{ TDBISAMConnection }
+
+constructor TDBISAMConnection.Create(AOwner: TComponent);
+begin
+ inherited;
+
+ fSession := TDBISAMSession.Create(Self);
+ fSession.AutoSessionName := TRUE;
+
+ fDatabase := TDBISAMDatabase.Create(Self);
+ fDatabase.SessionName := fSession.SessionName;
+ fDatabase.DatabaseName := 'DBISAMDB';
+end;
+
+function TDBISAMConnection.GetConnected: Boolean;
+begin
+ result := fDatabase.Connected;
+end;
+
+procedure TDBISAMConnection.SetConnected(Value: Boolean);
+begin
+ if not(csDestroying in fDatabase.ComponentState) then begin
+ try
+ fSession.Active := Value;
+ fDatabase.Connected := Value;
+ except
+ fSession.Active := FALSE;
+ fDatabase.Connected := FALSE;
+ raise;
+ end;
+ end;
+end;
+
+{ TDAEDBISAMConnection }
+
+procedure TDAEDBISAMConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+begin
+ inherited;
+ with aConnStrParser do begin
+ if (Self.UserID <> '') then
+ fConnection.Session.RemoteUser := Self.UserID
+ else
+ fConnection.Session.RemoteUser := UserID;
+ if (Self.Password <> '') then
+ fConnection.Session.RemotePassword := Self.Password
+ else
+ fConnection.Session.RemotePassword := Password;
+
+ if (Server <> '') then begin
+ // Remote connection
+ fConnection.Session.SessionType := stRemote;
+ fConnection.Session.RemoteHost := Server;
+ fConnection.Database.RemoteDatabase := Database;
+ if (AuxParams['RemotePort'] <> '') then
+ fConnection.Session.RemotePort := StrToInt(AuxParams['RemotePort']);
+ if (AuxParams['RemoteService'] <> '') then
+ fConnection.Session.RemoteService := AuxParams['RemoteService'];
+ if (AuxParams['RemoteTrace'] = 'False') then
+ fConnection.Session.RemoteTrace := False
+ else if (AuxParams['RemoteTrace'] = 'True') then
+ fConnection.Session.RemoteTrace := True;
+ {$IFDEF DBISAM_V3}
+ if (AuxParams['RemoteType'] = 'rtLAN') then
+ fConnection.Session.RemoteType := rtLAN
+ else if (AuxParams['RemoteType'] = 'rtInternet') then
+ fConnection.Session.RemoteType := rtInternet;
+ {$ENDIF}
+ {$IFDEF DBISAM_V4}
+ if (AuxParams['RemoteCompression'] <> '') then
+ if (StrToInt(AuxParams['RemoteCompression']) in [0..9]) then
+ fConnection.Session.RemoteCompression := StrToInt(AuxParams['RemoteCompression']);
+ if (AuxParams['RemoteEncryption'] = 'False') then
+ fConnection.Session.RemoteEncryption := False
+ else if (AuxParams['RemoteEncryption'] = 'True') then
+ fConnection.Session.RemoteEncryption := True;
+ if (AuxParams['RemoteEncryptionPassword'] <> '') then
+ fConnection.Session.RemoteEncryptionPassword := AuxParams['RemoteEncryptionPassword'];
+ if (AuxParams['RemoteTimeout'] <> '') then
+ fConnection.Session.RemoteTimeout := StrToInt(AuxParams['RemoteTimeout']);
+ {$ENDIF}
+ end
+ else begin
+ // Local connection
+ fConnection.Session.SessionType := stLocal;
+ fConnection.Database.Directory := Database;
+ end;
+
+ if (AuxParams['ForceBufferFlush'] = 'False') then
+ fConnection.Session.ForceBufferFlush := False
+ else if (AuxParams['ForceBufferFlush'] = 'True') then
+ fConnection.Session.ForceBufferFlush := True;
+ if (AuxParams['KeepConnections'] = 'False') then
+ begin
+ fConnection.Session.KeepConnections := False;
+ fConnection.Database.KeepConnection := False;
+ end
+ else if (AuxParams['KeepConnections'] = 'True') then
+ begin
+ fConnection.Session.KeepConnections := True;
+ fConnection.Database.KeepConnection := True;
+ end;
+ if (AuxParams['LockProtocol'] = 'lpOptimistic') then
+ fConnection.Session.LockProtocol := lpOptimistic
+ else if (AuxParams['LockProtocol'] = 'lpPessimistic') then
+ fConnection.Session.LockProtocol := lpPessimistic;
+ if (AuxParams['LockRetryCount'] <> '') then
+ fConnection.Session.LockRetryCount := StrToInt(AuxParams['LockRetryCount']);
+ if (AuxParams['LockWaitTime'] <> '') then
+ fConnection.Session.LockWaitTime := StrToInt(AuxParams['LockWaitTime']);
+ if (AuxParams['PrivateDir'] <> '') then
+ fConnection.Session.PrivateDir := AuxParams['PrivateDir'];
+ if (AuxParams['TablePassword'] <> '') then
+ begin
+ fConnection.Session.Active := True;
+ fConnection.Session.AddPassword(AuxParams['TablePassword']);
+ end;
+ end;
+end;
+
+function TDAEDBISAMConnection.DoBeginTransaction: integer;
+begin
+ result := -1;
+ fConnection.Database.StartTransaction;
+end;
+
+procedure TDAEDBISAMConnection.DoCommitTransaction;
+begin
+ with fConnection do
+ Database.Commit(Session.ForceBufferFlush);
+end;
+
+function TDAEDBISAMConnection.CreateCustomConnection: TCustomConnection;
+begin
+ result := TDBISAMConnection.Create(nil);
+ fConnection := TDBISAMConnection(result);
+end;
+
+function TDAEDBISAMConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEDBISAMQuery
+end;
+
+procedure TDAEDBISAMConnection.DoGetTableNames(out List: IROStrings);
+var
+ _database: string;
+begin
+ List := TROStrings.Create;
+ if (fConnection.Session.SessionType = stLocal) then
+ _database := fConnection.Database.Directory
+ else
+ _database := fConnection.Database.RemoteDatabase;
+
+ fConnection.Session.GetTableNames(_database, List.Strings);
+end;
+
+procedure TDAEDBISAMConnection.DoRollbackTransaction;
+begin
+ fConnection.Database.Rollback;
+end;
+
+function TDAEDBISAMConnection.DoGetInTransaction: Boolean;
+begin
+ result := fConnection.Database.InTransaction;
+end;
+
+function TDAEDBISAMConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ result := TDADBISAMMacroProcessor.Create;
+end;
+
+function TDAEDBISAMConnection.GetForceBufferFlush: Boolean;
+begin
+ result := fConnection.Session.ForceBufferFlush;
+end;
+
+procedure TDAEDBISAMConnection.SetForceBufferFlush(Value: Boolean);
+begin
+ fConnection.Session.ForceBufferFlush := Value;
+end;
+
+function TDAEDBISAMConnection.GetKeepConnections: Boolean;
+begin
+ result := fConnection.Session.KeepConnections;
+end;
+
+procedure TDAEDBISAMConnection.SetKeepConnections(Value: Boolean);
+begin
+ fConnection.Session.KeepConnections := Value;
+ fConnection.Database.KeepConnection := Value;
+end;
+
+function TDAEDBISAMConnection.GetLockProtocol: TLockProtocol;
+begin
+ result := fConnection.Session.LockProtocol;
+end;
+
+procedure TDAEDBISAMConnection.SetLockProtocol(Value: TLockProtocol);
+begin
+ fConnection.Session.LockProtocol := Value;
+end;
+
+function TDAEDBISAMConnection.GetLockRetryCount: Byte;
+begin
+ result := fConnection.Session.LockRetryCount;
+end;
+
+procedure TDAEDBISAMConnection.SetLockRetryCount(Value: Byte);
+begin
+ fConnection.Session.LockRetryCount := Value;
+end;
+
+function TDAEDBISAMConnection.GetLockWaitTime: Word;
+begin
+ result := fConnection.Session.LockWaitTime;
+end;
+
+procedure TDAEDBISAMConnection.SetLockWaitTime(Value: Word);
+begin
+ fConnection.Session.LockWaitTime := Value;
+end;
+
+function TDAEDBISAMConnection.GetPrivateDir: string;
+begin
+ result := fConnection.Session.PrivateDir;
+end;
+
+procedure TDAEDBISAMConnection.SetPrivateDir(const Value: string);
+begin
+ fConnection.Session.PrivateDir := Value;
+end;
+
+function TDAEDBISAMConnection.GetRemotePort: Integer;
+begin
+ result := fConnection.Session.RemotePort;
+end;
+
+procedure TDAEDBISAMConnection.SetRemotePort(Value: Integer);
+begin
+ fConnection.Session.RemotePort := Value;
+end;
+
+function TDAEDBISAMConnection.GetRemoteService: string;
+begin
+ result := fConnection.Session.RemoteService;
+end;
+
+procedure TDAEDBISAMConnection.SetRemoteService(const Value: string);
+begin
+ fConnection.Session.RemoteService := Value;
+end;
+
+function TDAEDBISAMConnection.GetRemoteTrace: Boolean;
+begin
+ result := fConnection.Session.RemoteTrace;
+end;
+
+procedure TDAEDBISAMConnection.SetRemoteTrace(Value: Boolean);
+begin
+ fConnection.Session.RemoteTrace := Value;
+end;
+
+{$IFDEF DBISAM_V3}
+
+function TDAEDBISAMConnection.GetRemoteType: TRemoteType;
+begin
+ result := fConnection.Session.RemoteType;
+end;
+
+procedure TDAEDBISAMConnection.SetRemoteType(Value: TRemoteType);
+begin
+ fConnection.Session.RemoteType := Value;
+end;
+{$ENDIF}
+
+{$IFDEF DBISAM_V4}
+
+function TDAEDBISAMConnection.GetRemoteCompression: Byte;
+begin
+ result := fConnection.Session.RemoteCompression;
+end;
+
+procedure TDAEDBISAMConnection.SetRemoteCompression(Value: Byte);
+begin
+ fConnection.Session.RemoteCompression := Value;
+end;
+
+function TDAEDBISAMConnection.GetRemoteEncryption: Boolean;
+begin
+ result := fConnection.Session.RemoteEncryption;
+end;
+
+procedure TDAEDBISAMConnection.SetRemoteEncryption(Value: Boolean);
+begin
+ fConnection.Session.RemoteEncryption := Value;
+end;
+
+function TDAEDBISAMConnection.GetRemoteEncryptionPassword: string;
+begin
+ result := fConnection.Session.RemoteEncryptionPassword;
+end;
+
+procedure TDAEDBISAMConnection.SetRemoteEncryptionPassword(const Value: string);
+begin
+ fConnection.Session.RemoteEncryptionPassword := Value;
+end;
+
+function TDAEDBISAMConnection.GetRemoteTimeout: Integer;
+begin
+ result := fConnection.Session.RemoteTimeout;
+end;
+
+procedure TDAEDBISAMConnection.SetRemoteTimeout(Value: Integer);
+begin
+ fConnection.Session.RemoteTimeout := Value;
+end;
+{$ENDIF}
+
+procedure TDAEDBISAMConnection.AddPassword( const aPassword: string);
+begin
+ fConnection.Session.AddPassword(aPassword);
+end;
+
+procedure TDAEDBISAMConnection.RemovePassword( const aPassword: string);
+begin
+ fConnection.Session.RemovePassword(aPassword);
+end;
+
+procedure TDAEDBISAMConnection.RemoveAllPasswords;
+begin
+ fConnection.Session.RemoveAllPasswords;
+end;
+
+function TDAEDBISAMConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+var
+ lQuery: IDADataset;
+begin
+ Result:= inherited DoGetLastAutoInc(GeneratorName);
+ if GeneratorName <> '' then begin
+ lQuery:=GetDatasetClass.Create(Self);
+ try
+ lQuery.SQL := 'SELECT LASTAUTOINC('''+GeneratorName+''') from '+QuoteIdentifierIfNeeded(GeneratorName);
+ lQuery.Open;
+ Result := lQuery.Fields[0].Value;
+ finally
+ lQuery:=nil;
+ end;
+ end;
+end;
+
+{$IFDEF DELPHI10UP}
+{$WARN SYMBOL_DEPRECATED OFF}
+{$ENDIF DELPHI10UP}
+procedure TDAEDBISAMConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+var
+ i: integer;
+ pos1: integer;
+ fld: TDAField;
+ {$IFDEF DBISAM_V4}
+ lofld:TDBISAMFieldDef;
+ {$ELSE}
+ lofld:TFieldDef;
+ {$ENDIF}
+ s: string;
+ ltable: TDBISAMTable;
+begin
+ Fields:=TDAFieldCollection.Create(nil);
+ ltable:=TDBISAMTable.Create(nil);
+ try
+ ltable.DatabaseName := fConnection.Database.DatabaseName;
+ ltable.SessionName := fConnection.Session.SessionName;
+ ltable.TableName := aTableName;
+ ltable.FieldDefs.Update;
+ for i:=0 to ltable.FieldDefs.Count-1 do begin
+ lofld:=ltable.FieldDefs[i];
+ fld:= Fields.Add;
+ fld.Name:= lofld.Name;
+ fld.DataType:= VCLTypeToDAType(lofld.DataType);
+ fld.Size:= lofld.Size;
+ fld.Required:= lofld.Required;
+ {$IFDEF DBISAM_V4}
+ fld.DefaultValue:=lofld.DefaultValue;
+ fld.Description:=lofld.Description;
+ {$ENDIF DBISAM_V4}
+ fld.ReadOnly:= DB.faReadonly in lofld.Attributes;
+ if fld.DataType in [datAutoInc, datLargeAutoInc] then fld.GeneratorName:= aTableName;
+ if fld.DataType = datDecimal then begin
+ case lofld.DataType of
+ ftBCD: begin
+ fld.DecimalPrecision:=20;
+ fld.DecimalScale:=lofld.Size;
+ end;
+ end;
+ end;
+ end;
+
+ //pk
+ ltable.IndexDefs.Update;
+ For i:=0 to ltable.IndexDefs.Count - 1 do
+ if ixPrimary in ltable.IndexDefs[i].Options then begin
+ Pos1 := 1;
+ s:=ltable.IndexDefs[i].Fields;
+ while Pos1 <= Length(s) do begin
+ fld := Fields.FindField(ExtractFieldName(s, Pos1));
+ if fld <> nil then fld.InPrimaryKey:=True;
+ end;
+ end;
+
+ finally
+ ltable.free;
+ end;
+end;
+{$IFDEF DELPHI10UP}
+{$WARN SYMBOL_DEPRECATED ON}
+{$ENDIF DELPHI10UP}
+
+function TDAEDBISAMConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(iIdentifier) or TestIdentifier(iIdentifier,dbisam_reservedwords);
+end;
+
+{ TDAEDBISAMDriver }
+
+procedure TDAEDBISAMDriver.GetAuxParams(const AuxDriver: string; out List: IROStrings);
+begin
+ inherited;
+
+ List.Add('ForceBufferFlush=False,True');
+ List.Add('KeepConnections=False,True');
+ List.Add('LockProtocol=lpOptimistic,lpPessimistic');
+ List.Add('LockRetryCount=');
+ List.Add('LockWaitTime=');
+ List.Add('PrivateDir=');
+ List.Add('RemotePort=');
+ List.Add('RemoteService=');
+ List.Add('RemoteTrace=False,True');
+ List.Add('TablePassword=');
+ {$IFDEF DBISAM_V3}
+ List.Add('RemoteType=rtLAN,rtInternet');
+ {$ENDIF}
+ {$IFDEF DBISAM_V4}
+ List.Add('RemoteCompression=');
+ List.Add('RemoteEncryption=False,True');
+ List.Add('RemoteEncryptionPassword=');
+ List.Add('RemoteTimeout=');
+ {$ENDIF}
+
+ List.Sorted := True;
+end;
+
+function TDAEDBISAMDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+function TDAEDBISAMDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEDBISAMConnection
+end;
+
+function TDAEDBISAMDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ Result:=DBISAM_DriverType;
+end;
+
+function TDAEDBISAMDriver.GetDescription: string;
+begin
+ {$IFDEF DBISAM_V3}
+ result := 'DBISAM3 Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+ {$ENDIF}
+ {$IFDEF DBISAM_V4}
+ result := 'DBISAM4 Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+ {$ENDIF}
+end;
+
+function TDAEDBISAMDriver.GetDriverID: string;
+begin
+ {$IFDEF DBISAM_V3}
+ result := 'DBISAM3';
+ {$ENDIF}
+ {$IFDEF DBISAM_V4}
+ result := 'DBISAM4';
+ {$ENDIF}
+end;
+
+{ TDAEDBISAMQuery }
+
+function TDAEDBISAMQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TDBISAMQuery.Create(nil);
+
+ with TDBISAMQuery(result) do begin
+ DatabaseName := TDAEDBISAMConnection(aConnection).fConnection.Database.DatabaseName;
+ SessionName := TDAEDBISAMConnection(aConnection).fConnection.Session.SessionName;
+ ReadOnly := True;
+ RequestLive := True;
+ end;
+end;
+
+function TDAEDBISAMQuery.DoExecute: integer;
+begin
+ with TDBISAMQuery(Dataset) do begin
+ ExecSQL;
+ result := RowsAffected;
+ end;
+end;
+
+function TDAEDBISAMQuery.DoGetSQL: string;
+begin
+ result := TDBISAMQuery(Dataset).SQL.Text
+end;
+
+procedure TDAEDBISAMQuery.DoPrepare(Value: Boolean);
+begin
+ TDBISAMQuery(Dataset).Prepared := Value;
+end;
+
+procedure TDAEDBISAMQuery.SetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ par: uDAInterfaces.TDAParam;
+ {$IFDEF DBISAM_V4}
+ outpar: TDBISAMParam;
+ {$ELSE}
+ outpar: TParam;
+ {$ENDIF}
+ ft: TFieldType;
+ lParIsEmpty: Boolean;
+begin
+ for i := 0 to (AParams.Count - 1) do begin
+ par := AParams[i];
+ outpar := TDBISAMQuery(Dataset).Params.ParamByName(par.Name);
+
+ ft := DATypeToVCLType(par.DataType);
+ {$IFNDEF DBISAM_V4}
+ case par.ParamType of
+ daptInput: outpar.ParamType := ptInput;
+ daptOutput: outpar.ParamType := ptOutput;
+ daptInputOutput: outpar.ParamType := ptInputOutput;
+ daptResult: outpar.ParamType := ptResult;
+ end;
+ {$ENDIF DBISAM_V3}
+ lParIsEmpty := VarIsEmpty(par.Value) or VarIsNull(par.Value);
+
+ if par.DataType = datBlob then begin
+ outpar.DataType := ftBlob;
+ if not (par.ParamType in [daptOutput, daptResult]) then begin
+ if lParIsEmpty then
+ outpar.Value := Null
+ else
+ outpar.Value := VariantToAnsiString(par.Value);
+ end;
+ end
+ else begin
+ if (outpar.DataType <> ft) and (ft <> ftUnknown) then outpar.DataType := ft;
+ if not (par.ParamType in [daptOutput, daptResult]) then outpar.Value := par.Value;
+ end;
+
+ if lParIsEmpty and (par.DataType <> datUnknown) then begin
+ if (outpar.DataType <> ft) and (ft <> ftUnknown) then outpar.DataType := ft;
+ end;
+ end;
+end;
+
+procedure TDAEDBISAMQuery.GetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ par: uDAInterfaces.TDAParam;
+begin
+ for i := 0 to (AParams.Count - 1) do begin
+ par := AParams[i];
+ if Par.ParamType in [daptOutput, daptInputOutput, daptResult] then
+ Par.Value := TDBISAMQuery(Dataset).Params.ParamByName(par.Name).Value;
+ end;
+end;
+
+procedure TDAEDBISAMQuery.DoSetSQL(const Value: string);
+begin
+ TDBISAMQuery(Dataset).SQL.Text := Value;
+end;
+
+{$IFDEF DBISAM_V4}
+procedure TDAEDBISAMQuery.RefreshParams;
+var
+ i: Integer;
+ par: TDAParam;
+ outpar: TDBISAMParam;
+ ds: TDBISAMQuery;
+begin
+ inherited;
+ ds := TDBISAMQuery(Dataset);
+ if not Assigned(ds.Params) then
+ Exit;
+ for i := 0 to ds.Params.Count -1 do begin
+ outpar := ds.Params[i];
+
+ par := self.ParamByName(outpar.Name);
+
+ if outpar.DataType <> ftUnknown then begin
+ par.DataType := VCLTypeToDAType(outpar.DataType);
+ end;
+ end;
+end;
+{$ENDIF}
+
+exports GetDriverObject name func_GetDriverObject;
+
+procedure TDAEDBISAMQuery.ClearParams;
+begin
+ inherited;
+ TDBISAMQuery(Dataset).Params.Clear;
+end;
+
+procedure dbisam_InitializeReservedWords;
+begin
+ SetLength(dbisam_reservedwords, 220);
+ // sorted with TStringList.Sort (bds2007)
+ dbisam_reservedwords[0] := 'ABS';
+ dbisam_reservedwords[1] := 'ACOS';
+ dbisam_reservedwords[2] := 'ADD';
+ dbisam_reservedwords[3] := 'ALL';
+ dbisam_reservedwords[4] := 'ALLTRIM';
+ dbisam_reservedwords[5] := 'ALTER';
+ dbisam_reservedwords[6] := 'AND';
+ dbisam_reservedwords[7] := 'AS';
+ dbisam_reservedwords[8] := 'ASC';
+ dbisam_reservedwords[9] := 'ASCENDING';
+ dbisam_reservedwords[10] := 'ASIN';
+ dbisam_reservedwords[11] := 'AT';
+ dbisam_reservedwords[12] := 'ATAN';
+ dbisam_reservedwords[13] := 'ATAN2';
+ dbisam_reservedwords[14] := 'AUTOINC';
+ dbisam_reservedwords[15] := 'AVG';
+ dbisam_reservedwords[16] := 'BETWEEN';
+ dbisam_reservedwords[17] := 'BINARY';
+ dbisam_reservedwords[18] := 'BIT';
+ dbisam_reservedwords[19] := 'BLOB';
+ dbisam_reservedwords[20] := 'BLOCK';
+ dbisam_reservedwords[21] := 'BOOL';
+ dbisam_reservedwords[22] := 'BOOLEAN';
+ dbisam_reservedwords[23] := 'BOTH';
+ dbisam_reservedwords[24] := 'BY';
+ dbisam_reservedwords[25] := 'BYTES';
+ dbisam_reservedwords[26] := 'CAST';
+ dbisam_reservedwords[27] := 'CEIL';
+ dbisam_reservedwords[28] := 'CEILING';
+ dbisam_reservedwords[29] := 'CHAR';
+ dbisam_reservedwords[30] := 'CHARACTER';
+ dbisam_reservedwords[31] := 'CHARCASE';
+ dbisam_reservedwords[32] := 'CHARS';
+ dbisam_reservedwords[33] := 'COALESCE';
+ dbisam_reservedwords[34] := 'COLUMN';
+ dbisam_reservedwords[35] := 'COLUMNS';
+ dbisam_reservedwords[36] := 'COMMIT';
+ dbisam_reservedwords[37] := 'COMPRESS';
+ dbisam_reservedwords[38] := 'CONCAT';
+ dbisam_reservedwords[39] := 'CONSTRAINT';
+ dbisam_reservedwords[40] := 'COS';
+ dbisam_reservedwords[41] := 'COT';
+ dbisam_reservedwords[42] := 'COUNT';
+ dbisam_reservedwords[43] := 'CREATE';
+ dbisam_reservedwords[44] := 'CURRENT_DATE';
+ dbisam_reservedwords[45] := 'CURRENT_GUID';
+ dbisam_reservedwords[46] := 'CURRENT_TIME';
+ dbisam_reservedwords[47] := 'CURRENT_TIMESTAMP';
+ dbisam_reservedwords[48] := 'DAY';
+ dbisam_reservedwords[49] := 'DAYOFWEEK';
+ dbisam_reservedwords[50] := 'DAYOFYEAR';
+ dbisam_reservedwords[51] := 'DAYSFROMMSECS';
+ dbisam_reservedwords[52] := 'DECIMAL';
+ dbisam_reservedwords[53] := 'DEFAULT';
+ dbisam_reservedwords[54] := 'DEGREES';
+ dbisam_reservedwords[55] := 'DELETE';
+ dbisam_reservedwords[56] := 'DELIMITER';
+ dbisam_reservedwords[57] := 'DESC';
+ dbisam_reservedwords[58] := 'DESCENDING';
+ dbisam_reservedwords[59] := 'DESCRIPTION';
+ dbisam_reservedwords[60] := 'DISTINCT';
+ dbisam_reservedwords[61] := 'DROP';
+ dbisam_reservedwords[62] := 'DUPBYTE';
+ dbisam_reservedwords[63] := 'ELSE';
+ dbisam_reservedwords[64] := 'EMPTY';
+ dbisam_reservedwords[65] := 'ENCRYPTED';
+ dbisam_reservedwords[66] := 'ESCAPE';
+ dbisam_reservedwords[67] := 'EXCEPT';
+ dbisam_reservedwords[68] := 'EXISTS';
+ dbisam_reservedwords[69] := 'EXP';
+ dbisam_reservedwords[70] := 'EXPORT';
+ dbisam_reservedwords[71] := 'EXTRACT';
+ dbisam_reservedwords[72] := 'FALSE';
+ dbisam_reservedwords[73] := 'FLOAT';
+ dbisam_reservedwords[74] := 'FLOOR';
+ dbisam_reservedwords[75] := 'FLUSH';
+ dbisam_reservedwords[76] := 'FOR';
+ dbisam_reservedwords[77] := 'FORCEINDEXREBUILD';
+ dbisam_reservedwords[78] := 'FROM';
+ dbisam_reservedwords[79] := 'FULL';
+ dbisam_reservedwords[80] := 'GRAPHIC';
+ dbisam_reservedwords[81] := 'GROUP';
+ dbisam_reservedwords[82] := 'GUID';
+ dbisam_reservedwords[83] := 'HAVING';
+ dbisam_reservedwords[84] := 'HEADERS';
+ dbisam_reservedwords[85] := 'HOUR';
+ dbisam_reservedwords[86] := 'HOURSFROMMSECS';
+ dbisam_reservedwords[87] := 'IDENT_CURRENT';
+ dbisam_reservedwords[88] := 'IDENTITY';
+ dbisam_reservedwords[89] := 'IF';
+ dbisam_reservedwords[90] := 'IFNULL';
+ dbisam_reservedwords[91] := 'IMPORT';
+ dbisam_reservedwords[92] := 'IN';
+ dbisam_reservedwords[93] := 'INCLUDE';
+ dbisam_reservedwords[94] := 'INDEX';
+ dbisam_reservedwords[95] := 'INNER';
+ dbisam_reservedwords[96] := 'INSERT';
+ dbisam_reservedwords[97] := 'INT';
+ dbisam_reservedwords[98] := 'INTEGER';
+ dbisam_reservedwords[99] := 'INTERSECT';
+ dbisam_reservedwords[100] := 'INTERVAL';
+ dbisam_reservedwords[101] := 'INTO';
+ dbisam_reservedwords[102] := 'IS';
+ dbisam_reservedwords[103] := 'JOIN';
+ dbisam_reservedwords[104] := 'KEY';
+ dbisam_reservedwords[105] := 'LARGEINT';
+ dbisam_reservedwords[106] := 'LAST';
+ dbisam_reservedwords[107] := 'LASTAUTOINC';
+ dbisam_reservedwords[108] := 'LCASE';
+ dbisam_reservedwords[109] := 'LEADING';
+ dbisam_reservedwords[110] := 'LEFT';
+ dbisam_reservedwords[111] := 'LENGTH';
+ dbisam_reservedwords[112] := 'LIKE';
+ dbisam_reservedwords[113] := 'LOCALE';
+ dbisam_reservedwords[114] := 'LOG';
+ dbisam_reservedwords[115] := 'LOG10';
+ dbisam_reservedwords[116] := 'LONGVARBINARY';
+ dbisam_reservedwords[117] := 'LONGVARCHAR';
+ dbisam_reservedwords[118] := 'LOWER';
+ dbisam_reservedwords[119] := 'LTRIM';
+ dbisam_reservedwords[120] := 'MAJOR';
+ dbisam_reservedwords[121] := 'MAX';
+ dbisam_reservedwords[122] := 'MAXIMUM';
+ dbisam_reservedwords[123] := 'MEMO';
+ dbisam_reservedwords[124] := 'MIN';
+ dbisam_reservedwords[125] := 'MINIMUM';
+ dbisam_reservedwords[126] := 'MINOR';
+ dbisam_reservedwords[127] := 'MINSFROMMSECS';
+ dbisam_reservedwords[128] := 'MINUTE';
+ dbisam_reservedwords[129] := 'MOD';
+ dbisam_reservedwords[130] := 'MONEY';
+ dbisam_reservedwords[131] := 'MONTH';
+ dbisam_reservedwords[132] := 'MSECOND';
+ dbisam_reservedwords[133] := 'MSECSFROMMSECS';
+ dbisam_reservedwords[134] := 'NOBACKUP';
+ dbisam_reservedwords[135] := 'NOCASE';
+ dbisam_reservedwords[136] := 'NOCHANGE';
+ dbisam_reservedwords[137] := 'NOJOINOPTIMIZE';
+ dbisam_reservedwords[138] := 'NONE';
+ dbisam_reservedwords[139] := 'NOT';
+ dbisam_reservedwords[140] := 'NULL';
+ dbisam_reservedwords[141] := 'NUMERIC';
+ dbisam_reservedwords[142] := 'OCCURS';
+ dbisam_reservedwords[143] := 'ON';
+ dbisam_reservedwords[144] := 'OPTIMIZE';
+ dbisam_reservedwords[145] := 'OR';
+ dbisam_reservedwords[146] := 'ORDER';
+ dbisam_reservedwords[147] := 'OUTER';
+ dbisam_reservedwords[148] := 'PAGE';
+ dbisam_reservedwords[149] := 'PI';
+ dbisam_reservedwords[150] := 'POS';
+ dbisam_reservedwords[151] := 'POSITION';
+ dbisam_reservedwords[152] := 'POWER';
+ dbisam_reservedwords[153] := 'PRIMARY';
+ dbisam_reservedwords[154] := 'RADIANS';
+ dbisam_reservedwords[155] := 'RAND';
+ dbisam_reservedwords[156] := 'RANGE';
+ dbisam_reservedwords[157] := 'REDEFINE';
+ dbisam_reservedwords[158] := 'RENAME';
+ dbisam_reservedwords[159] := 'REPAIR';
+ dbisam_reservedwords[160] := 'REPEAT';
+ dbisam_reservedwords[161] := 'REPLACE';
+ dbisam_reservedwords[162] := 'RIGHT';
+ dbisam_reservedwords[163] := 'ROLLBACK';
+ dbisam_reservedwords[164] := 'ROUND';
+ dbisam_reservedwords[165] := 'RTRIM';
+ dbisam_reservedwords[166] := 'RUNSUM';
+ dbisam_reservedwords[167] := 'SECOND';
+ dbisam_reservedwords[168] := 'SECSFROMMSECS';
+ dbisam_reservedwords[169] := 'SELECT';
+ dbisam_reservedwords[170] := 'SET';
+ dbisam_reservedwords[171] := 'SIGN';
+ dbisam_reservedwords[172] := 'SIN';
+ dbisam_reservedwords[173] := 'SIZE';
+ dbisam_reservedwords[174] := 'SMALLINT';
+ dbisam_reservedwords[175] := 'SPACE';
+ dbisam_reservedwords[176] := 'SQRT';
+ dbisam_reservedwords[177] := 'START';
+ dbisam_reservedwords[178] := 'STDDEV';
+ dbisam_reservedwords[179] := 'STOP';
+ dbisam_reservedwords[180] := 'SUBSTRING';
+ dbisam_reservedwords[181] := 'SUM';
+ dbisam_reservedwords[182] := 'TABLE';
+ dbisam_reservedwords[183] := 'TAN';
+ dbisam_reservedwords[184] := 'TEXT';
+ dbisam_reservedwords[185] := 'TEXTOCCURS';
+ dbisam_reservedwords[186] := 'TEXTSEARCH';
+ dbisam_reservedwords[187] := 'THEN';
+ dbisam_reservedwords[188] := 'TIME';
+ dbisam_reservedwords[189] := 'TIMESTAMP';
+ dbisam_reservedwords[190] := 'TO';
+ dbisam_reservedwords[191] := 'TOP';
+ dbisam_reservedwords[192] := 'TRAILBYTE';
+ dbisam_reservedwords[193] := 'TRAILING';
+ dbisam_reservedwords[194] := 'TRANSACTION';
+ dbisam_reservedwords[195] := 'TRIM';
+ dbisam_reservedwords[196] := 'TRUE';
+ dbisam_reservedwords[197] := 'TRUNC';
+ dbisam_reservedwords[198] := 'TRUNCATE';
+ dbisam_reservedwords[199] := 'UCASE';
+ dbisam_reservedwords[200] := 'UNION';
+ dbisam_reservedwords[201] := 'UNIQUE';
+ dbisam_reservedwords[202] := 'UPDATE';
+ dbisam_reservedwords[203] := 'UPGRADE';
+ dbisam_reservedwords[204] := 'UPPER';
+ dbisam_reservedwords[205] := 'USER';
+ dbisam_reservedwords[206] := 'VALUES';
+ dbisam_reservedwords[207] := 'VARBINARY';
+ dbisam_reservedwords[208] := 'VARBYTES';
+ dbisam_reservedwords[209] := 'VARCHAR';
+ dbisam_reservedwords[210] := 'VERIFY';
+ dbisam_reservedwords[211] := 'VERSION';
+ dbisam_reservedwords[212] := 'WEEK';
+ dbisam_reservedwords[213] := 'WHERE';
+ dbisam_reservedwords[214] := 'WITH';
+ dbisam_reservedwords[215] := 'WORD';
+ dbisam_reservedwords[216] := 'WORDS';
+ dbisam_reservedwords[217] := 'WORK';
+ dbisam_reservedwords[218] := 'YEAR';
+ dbisam_reservedwords[219] := 'YEARSFROMMSECS';
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+ dbisam_InitializeReservedWords;
+finalization
+ dbisam_reservedwords := nil;
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADBXDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADBXDriver.pas
new file mode 100644
index 0000000..19938af
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADBXDriver.pas
@@ -0,0 +1,1046 @@
+unit uDADBXDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up, Kylix 3 and up
+{ platform: Win32, Linux
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+
+{$R DataAbstract_DBXDriver_Glyphs.res}
+
+interface
+
+uses Windows,Classes, DB, uDAEngine, uDAInterfaces, uROClasses, SqlExpr,{$IFNDEF DELPHI11UP}DBXpress,{$ENDIF}
+ SqlConst, uDAUtils, uDAIBInterfaces, uDAAdoInterfaces,uDAMySQLInterfaces, {$IFDEF DELPHI9UP}uDASybaseInterfaces,{$ENDIF}
+ uDADB2Interfaces, uDAOracleInterfaces;
+
+const
+ // Standard dbExpress driver identifiers
+ dbx_UnknownId = '???';
+ dbx_MSSQLId = 'MSSQL';
+ dbx_InterbaseId = 'Interbase';
+ dbx_OracleId = 'Oracle';
+ dbx_DB2Id = 'DB2';
+ dbx_MySQLId = 'MYSQL';
+ dbx_InformixId = 'Informix';
+ {$IFDEF DELPHI9UP}
+ dbx_ASAid = 'ASA';
+ dbx_ASEid = 'ASE';
+ {$ENDIF}
+ {$IFDEF DELPHI14UP}
+ dbx_FirebirdID = 'Firebird';
+ {$ENDIF}
+
+
+
+type
+ // Standard dbExpress driver enumerated
+ TDADBXDriverType = (dbx_Unknown,
+ dbx_MSSQL,
+ dbx_Interbase,
+ dbx_Oracle,
+ dbx_DB2,
+ dbx_MySQL,
+ dbx_Informix
+ {$IFDEF DELPHI9UP}
+ , dbx_ASA, dbx_ASE
+ {$ENDIF DELPHI9UP}
+ {$IFDEF DELPHI14UP}
+ , dbx_Firebird
+ {$ENDIF}
+ );
+
+const
+ // Standard dbExpress driver identifier array (useful for lookups)
+ DBXDrivers: array[TDADBXDriverType] of string = (
+ dbx_UnknownId,
+ dbx_MSSQLId,
+ dbx_InterbaseId,
+ dbx_OracleId,
+ dbx_DB2Id,
+ dbx_MySQLId,
+ dbx_InformixId
+ {$IFDEF DELPHI9UP}
+ ,dbx_ASAid, dbx_ASEid
+ {$ENDIF DELPHI9UP}
+ {$IFDEF DELPHI14UP}
+ , dbx_FirebirdID
+ {$ENDIF}
+ );
+
+type
+ { TDADBXDriver }
+ TDADBXDriver = class(TDADriverReference)
+ end;
+
+ { TDAEDBXDriver }
+ TDAEDBXDriver = class(TDAEDriver, IDADriver40)
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+
+ procedure GetAuxDrivers(out List: IROStrings); override;
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override;
+ // IDADriver40
+ function GetProviderDefaultCustomParameters(Provider: string): string; safecall;
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; safecall;
+ public
+ end;
+
+ { IDBXConnection
+ For identification purposes. }
+ IDBXConnection = interface
+ ['{D4E8FE6C-76B5-46FA-A850-2FD626960775}']
+ function GetDriverName: string;
+ function GetDriverType: TDADBXDriverType;
+
+ property DriverName: string read GetDriverName;
+ property DriverType: TDADBXDriverType read GetDriverType;
+ end;
+
+ { TDBXConnection }
+ TDBXConnection = class(TDAConnectionWrapper)
+ private
+ fSQLConnection: TSQLConnection;
+ fTransDesc: TTransactionDesc;
+
+ protected
+ function GetConnected: Boolean; override;
+ procedure SetConnected(Value: Boolean); override;
+
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+
+ property SQLConnection: TSQLConnection read fSQLConnection;
+ property TransDesc: TTransactionDesc read fTransDesc;
+ end;
+
+
+ { TDAEDBXConnection }
+ TDAEDBXConnection = class(TDAEConnection, IDAFileBasedDatabase,
+ IDACanQueryDatabaseNames, IDAUseGenerators ,IDAUseGenerators2 ,{IDAADOConnection,}
+ IDAInterbaseConnection, IDACanQueryGeneratorsNames,
+ {$IFDEF DELPHI9UP}IDASybaseConnection,{$ENDIF}
+ IDADB2Connection, IDAMySQLConnection,IDAOracleConnection)
+ private
+ fConnection: TDBXConnection;
+ fDriverName: string;
+ fDriverType: TDADBXDriverType;
+ fMSSQLSchemaEnabled: Boolean;
+ fSqlDialect: Integer;
+ FMySQLVersion: integer;
+ function GetMySQLVersion: integer;
+ protected
+ function QueryInterface(const IID: TGUID; out Obj): HResult; override; stdcall;
+ // TDAEConnection
+ function CreateCustomConnection: TCustomConnection; override;
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+
+ function GetUserID: string; override; safecall;
+ procedure SetUserID(const Value: string); override; safecall;
+ function GetPassword: string; override; safecall;
+ procedure SetPassword(const Value: string); override; safecall;
+
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; safecall;
+ function GetQuoteChars: TDAQuoteCharArray; override;
+ // IDBXConnection
+ function GetDriverName: string;
+ function GetDriverType: TDADBXDriverType;
+ function GetSPSelectSyntax(HasArguments: Boolean): string; override;
+ safecall;
+ //IDAFileBasedDatabase
+ function GetFileExtensions: IROStrings;
+ //IDACanQueryDatabaseNames
+ function GetDatabaseNames: IROStrings;
+ //IDAUseGenerators
+ function GetNextAutoinc(const GeneratorName: string): integer; safecall;
+ //IDAUseGenerators2
+ function GetNextAutoinc2(const GeneratorName: string): variant; safecall;
+ // IDACanQueryGeneratorsNames
+ function GetGeneratorNames: IROStrings;
+ public
+ property MSSQLSchemaEnabled: Boolean read fMSSQLSchemaEnabled write fMSSQLSchemaEnabled;
+ end;
+
+ { TDAEDBXQuery }
+ TDAEDBXQuery = class(TDAEDataset,IDAMustSetParams)
+ private
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ function IsNeedToFixFMTBCDIssue: Boolean; override;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: boolean); override;
+ procedure ClearParams; override;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAEDBXStoredProcedure }
+ TDAEDBXStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Execute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function DBXDriverIdToDBXDriverType(const anID: string): TDADBXDriverType;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses SysUtils, Variants, SqlTimSt, INIFiles,
+ {$IFDEF DELPHI12UP}
+ // full set of files
+ DbxDb2,DbxInformix,DbxInterbase,DbxMSSQL,DbxMySql,DbxOracle,DbxSybaseASA,DbxSybaseASE,
+ {$ENDIF}
+ {$IFDEF DELPHI14UP}
+ DbxFirebird,
+ {$ENDIF}
+ uDADriverManager, uDARes, uDAMacroProcessors,
+ uROBinaryHelpers,uDASQL92Interfaces;
+
+// TODO: Add support for IADOConnection and IInterbaseConnection, etc by redefining QueryInterface in TDAEDBXConnection
+
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDADBXDriver]);
+end;
+
+function GetDriverObject: IDADriver;
+begin
+ if (_driver = nil) then _driver := TDAEDBXDriver.Create(nil);
+ result := _driver;
+end;
+
+function DBXDriverIdToDBXDriverType(const anID: string): TDADBXDriverType;
+var
+ x: TDADBXDriverType;
+begin
+ result := dbx_Unknown;
+
+ for x := Low(TDADBXDriverType) to High(TDADBXDriverType) do
+ if AnsiSameText(DBXDrivers[x], anID) then begin
+ result := x;
+ Exit;
+ end;
+ //RaiseError('Unknown dbExpress driver %s', [anID]);
+end;
+
+{ TDBXConnection }
+
+constructor TDBXConnection.Create(AOwner: TComponent);
+begin
+ inherited;
+ fSQLConnection := TSQLConnection.Create(nil);
+end;
+
+destructor TDBXConnection.Destroy;
+begin
+ inherited;
+ fSQLConnection.Free;
+end;
+
+function TDBXConnection.GetConnected: Boolean;
+begin
+ result := fSQLConnection.Connected
+end;
+
+procedure TDBXConnection.SetConnected(Value: Boolean);
+begin
+ fSQLConnection.Connected := Value;
+end;
+
+{ TDAEDBXConnection }
+{$IFDEF DELPHI2009UP}
+const
+ SDriverNotInConfigFile = 'Driver (%s) not found in Cfg file (%s)';
+{$ENDIF}
+
+procedure TDAEDBXConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+
+ function GetProfileString(Section, Setting, IniFileName: string): string;
+ var
+ IniFile: TMemIniFile;
+ List: TStrings;
+ begin
+ List := TStringList.Create;
+ try
+ IniFile := TMemIniFile.Create(IniFileName);
+ IniFile.ReadSectionValues(Section, List);
+ try
+ Result := List.Values[Setting];
+ finally
+ IniFile.Free;
+ end;
+ finally
+ List.Free;
+ end;
+ end;
+
+var
+ i: integer;
+ drvregfile: string;
+begin
+ inherited;
+ FMySQLVersion := -1;
+ with aConnStrParser do begin
+
+ with TDBXConnection(aConnectionObject).SQLConnection do begin
+ DriverName := AuxDriver;
+
+ fDriverType := DBXDriverIdToDBXDriverType(AuxDriver);
+
+ drvregfile := GetDriverRegistryFile(false);
+
+ try
+ VendorLib := GetProfileString(DriverName, VENDORLIB_KEY, drvregfile);
+ LibraryName := GetProfileString(DriverName, DLLLIB_KEY, drvregfile);
+ GetDriverFunc := GetProfileString(DriverName, GETDRIVERFUNC_KEY, drvregfile);
+ except
+ DatabaseErrorFmt(SDriverNotInConfigFile, [DriverName, drvregfile]);
+ end;
+
+ Params.Clear;
+ Params.Values[szUSERNAME] := UserID;
+ Params.Values[szPASSWORD] := Password;
+ if fDriverType in [dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}] then begin // Dbx requires a seperate host field for Interbase
+ if Trim(Server) <> '(local)' then
+ Params.Values[DATABASENAME_KEY] := Server + ':' + Database
+ else
+ Params.Values[DATABASENAME_KEY] := Database;
+ if auxParams[SQLDIALECT_KEY] = '' then begin
+ AuxParams[SQLDIALECT_KEY] := '3'; // default to 3
+ end;
+ end else begin
+ Params.Values[HOSTNAME_KEY] := Server;
+ Params.Values[DATABASENAME_KEY] := Database;
+ end;
+ fMSSQLSchemaEnabled := false;
+ for i := 0 to (AuxParamsCount - 1) do begin
+ if AnsiSameText(AuxParamNames[i], 'DriverName') then
+ fConnection.fSQLConnection.DriverName:=AuxParams[AuxParamNames[i]]
+ else if AnsiSameText(AuxParamNames[i], 'GetDriverFunc') then
+ fConnection.fSQLConnection.GetDriverFunc:=AuxParams[AuxParamNames[i]]
+ else if AnsiSameText(AuxParamNames[i], 'LibraryName') then
+ fConnection.fSQLConnection.LibraryName:=AuxParams[AuxParamNames[i]]
+ else if AnsiSameText(AuxParamNames[i], 'TableScope') then begin
+ if AnsiSameText(AuxParams[AuxParamNames[i]], 'Synonyms') then
+ TableScope := [tsTable, tsView, tsSynonym]
+ else
+ TableScope := [tsTable, tsView]
+ end
+ else if AnsiSameText(AuxParamNames[i], 'Schemas') then
+ fMSSQLSchemaEnabled := AuxParams['Schemas'] = '1'
+ else begin
+ Params.Add(AuxParamNames[i] + '=' + AuxParams[AuxParamNames[i]]);
+ end;
+ end;
+ LoginPrompt := FALSE;
+ if fDriverType in [dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}] then fSqlDialect := StrToIntDef(AuxParams[SQLDIALECT_KEY],3);
+ end;
+ end;
+end;
+
+function TDAEDBXConnection.DoBeginTransaction: integer;
+begin
+ result := -1;
+
+ // TODO: allow more flexibility here...
+ fConnection.fTransDesc.TransactionID := 1;
+ fConnection.fTransDesc.IsolationLevel := xilREADCOMMITTED;
+{$IFDEF DELPHI10UP}{$WARN SYMBOL_DEPRECATED OFF}{$ENDIF}
+ fConnection.fSQLConnection.StartTransaction(fConnection.fTransDesc);
+{$IFDEF DELPHI10UP}{$WARN SYMBOL_DEPRECATED ON}{$ENDIF}
+end;
+
+procedure TDAEDBXConnection.DoCommitTransaction;
+begin
+{$IFDEF DELPHI10UP}{$WARN SYMBOL_DEPRECATED OFF}{$ENDIF}
+ fConnection.fSQLConnection.Commit(fConnection.fTransDesc);
+{$IFDEF DELPHI10UP}{$WARN SYMBOL_DEPRECATED ON}{$ENDIF}
+end;
+
+function TDAEDBXConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fConnection := TDBXConnection.Create(nil);
+ fConnection.SQLConnection.LoginPrompt := FALSE;
+ result := fConnection;
+end;
+
+function TDAEDBXConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEDBXQuery;
+end;
+
+function TDAEDBXConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEDBXStoredProcedure;
+end;
+
+procedure TDAEDBXConnection.DoGetStoredProcedureNames(out List: IROStrings);
+begin
+ inherited DoGetStoredProcedureNames(List);
+ case fDriverType of
+ dbx_MSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure, MSSQLSchemaEnabled);
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ dbx_MySQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure,fConnection.SQLConnection.Params.Values[DATABASENAME_KEY],GetMySQLVersion);
+ dbx_Oracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ else
+{$IFDEF DELPHI10UP}{$WARN SYMBOL_DEPRECATED OFF}{$ENDIF}
+ fConnection.fSQLConnection.GetProcedureNames(List.Strings);
+{$IFDEF DELPHI10UP}{$WARN SYMBOL_DEPRECATED ON}{$ENDIF}
+ end;
+end;
+
+procedure TDAEDBXConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ case fDriverType of
+ dbx_MySQL: MYSQL_DoGetStoredProcedureParams(aStoredProcedureName,GetDatasetClass.Create(Self),Params,fConnection.SQLConnection.Params.Values[DATABASENAME_KEY]);
+ dbx_MSSQL: MSSQL_DoGetStoredProcedureParams(aStoredProcedureName,GetDatasetClass.Create(Self),Params);
+ else
+ inherited;
+ end;
+end;
+
+procedure TDAEDBXConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited DoGetTableNames(List);
+ case fDriverType of
+ dbx_MSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable, MSSQLSchemaEnabled);
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotTable);
+ dbx_MySQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable,fConnection.SQLConnection.Params.Values[DATABASENAME_KEY],GetMySQLVersion);
+ dbx_Oracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotTable);
+ else
+ fConnection.fSQLConnection.GetTableNames(List.Strings);
+ end;
+end;
+
+procedure TDAEDBXConnection.DoRollbackTransaction;
+begin
+{$WARNINGS OFF}
+ fConnection.fSQLConnection.Rollback(fConnection.fTransDesc);
+{$WARNINGS ON}
+end;
+
+function TDAEDBXConnection.DoGetInTransaction: boolean;
+begin
+ result := fConnection.fSQLConnection.InTransaction
+end;
+
+function TDAEDBXConnection.GetDriverName: string;
+begin
+ result := fDriverName
+end;
+
+function TDAEDBXConnection.GetDriverType: TDADBXDriverType;
+begin
+ result := fDriverType
+end;
+
+function TDAEDBXConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ case fDriverType of
+ dbx_MSSQL: result := MSSQL_CreateMacroProcessor;
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: result := IB_CreateMacroProcessor;
+ dbx_Oracle: result := Oracle_CreateMacroProcessor;
+ else
+ result := inherited CreateMacroProcessor;
+ end;
+end;
+
+function TDAEDBXConnection.GetPassword: string;
+begin
+ Result := fConnection.SQLConnection.Params.Values[szPASSWORD];
+end;
+
+function TDAEDBXConnection.GetUserID: string;
+begin
+ Result := fConnection.SQLConnection.Params.Values[szUSERNAME];
+end;
+
+procedure TDAEDBXConnection.SetPassword(const Value: string);
+begin
+ fConnection.SQLConnection.Params.Values[szPASSWORD] := Value;
+end;
+
+procedure TDAEDBXConnection.SetUserID(const Value: string);
+begin
+ fConnection.SQLConnection.Params.Values[szUSERNAME] := Value;
+end;
+
+function TDAEDBXConnection.GetSPSelectSyntax(
+ HasArguments: Boolean): string;
+begin
+ case fDriverType of
+ dbx_MSSQL: Result := MSSQL_GetSPSelectSyntax(HasArguments);
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: Result := IB_GetSPSelectSyntax(HasArguments);
+ dbx_Oracle: Result := Oracle_GetSPSelectSyntax(HasArguments);
+ else
+ Result := inherited GetSPSelectSyntax(HasArguments);
+ end;
+end;
+
+function TDAEDBXConnection.GetFileExtensions: IROStrings;
+begin
+ case fDriverType of
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: result := IB_GetFileExtensions;
+ else
+ result := TROStrings.Create;
+ end;
+end;
+
+function TDAEDBXConnection.GetGeneratorNames: IROStrings;
+begin
+ case fDriverType of
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: Result:= IB_GetGeneratorNames(GetDatasetClass.Create(Self));
+ else
+ Result := NewROStrings;
+ end;
+end;
+
+function TDAEDBXConnection.QueryInterface(const IID: TGUID;
+ out Obj): HResult;
+begin
+ Result := E_NOINTERFACE;
+
+ {$IFDEF DELPHI9UP}
+ if IsEqualGUID(IID, IDASybaseConnection) then begin
+ if not (fDriverType in [dbx_ASA, dbx_ASE]) then Exit;
+ end
+ else
+ {$ENDIF}
+ if IsEqualGUID(IID, IDADB2Connection) then begin
+ if not (fDriverType in [dbx_DB2]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDAInterbaseConnection) then begin
+ if not (fDriverType in [dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDAADOConnection) then begin
+ if not (fDriverType in [dbx_MSSQL]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDAMySQLConnection) then begin
+ if not (fDriverType in [dbx_MySQL]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDAOracleConnection) then begin
+ if not (fDriverType in [dbx_Oracle]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDAUseGenerators) or IsEqualGUID(IID, IDAUseGenerators2) then begin
+ if not (fDriverType in [dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF},dbx_Oracle]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDACanQueryGeneratorsNames) then begin
+ if not (fDriverType in [dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDAFileBasedDatabase) then begin
+ if not (fDriverType in [dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}]) then Exit;
+ end
+ else if IsEqualGUID(IID, IDACanQueryDatabaseNames) then begin
+ if not (fDriverType in [dbx_MSSQL, dbx_Oracle, dbx_MySQL {$IFDEF DELPHI9UP}, dbx_ASA, dbx_ASE{$ENDIF DELPHI9UP}]) then Exit;
+ end;
+
+ Result := inherited QueryInterface(IID, Obj);
+end;
+
+function TDAEDBXConnection.GetDatabaseNames: IROStrings;
+begin
+ case fDriverType of
+ dbx_MSSQL: Result:=MSSQL_GetDatabaseNames(Self);
+ dbx_MySQL: Result:=MYSQL_GetDatabaseNames(Self);
+ else
+ Result := NewROStrings;
+ end;
+end;
+
+procedure TDAEDBXConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited DoGetViewNames(List);
+ case fDriverType of
+ dbx_MSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView, MSSQLSchemaEnabled);
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotView);
+ dbx_MySQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView,fConnection.SQLConnection.Params.Values[DATABASENAME_KEY],GetMySQLVersion);
+ dbx_Oracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotView);
+ else
+ //
+ end;
+end;
+
+procedure TDAEDBXConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ inherited DoGetForeignKeys(ForeignKeys);
+ case fDriverType of
+ dbx_MSSQL: MSSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, MSSQLSchemaEnabled);
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: IB_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ dbx_MySQL: MYSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys,fConnection.SQLConnection.Params.Values[DATABASENAME_KEY],GetMySQLVersion);
+ dbx_ORACLE: Oracle_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ else
+ //
+ end;
+end;
+
+procedure TDAEDBXConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ case fDriverType of
+ dbx_MSSQL: MSSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: IB_GetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ dbx_MySQL: MYSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields,fConnection.SQLConnection.Params.Values[DATABASENAME_KEY],GetMySQLVersion);
+ dbx_Oracle: Oracle_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ else
+ inherited DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), Fields);
+ end;
+end;
+
+function TDAEDBXConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+begin
+ case fDriverType of
+ dbx_MSSQL: Result := MSSQL_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: Result := IB_GetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ dbx_Oracle: Result := Oracle_DoGetLastAutoInc(GeneratorName,GetDatasetClass.Create(Self));
+ dbx_MySQL: Result := MySQL_GetLastAutoInc(GeneratorName,GetDatasetClass.Create(Self));
+ else
+ Result := inherited DoGetLastAutoInc(GeneratorName);
+ end;
+end;
+
+function TDAEDBXConnection.GetNextAutoinc(
+ const GeneratorName: string): integer;
+begin
+ Result := GetNextAutoinc2(GeneratorName);
+end;
+
+function TDAEDBXConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(iIdentifier);
+ if not Result then
+ case fDriverType of
+ dbx_MSSQL: Result := MSSQL_IdentifierNeedsQuoting(iIdentifier);
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: Result := IB_IdentifierNeedsQuoting(iIdentifier, fSqlDialect);
+ dbx_MySQL: Result := MYSQL_IdentifierNeedsQuoting(iIdentifier);
+ dbx_ORACLE: Result := Oracle_IdentifierNeedsQuoting(iIdentifier);
+ dbx_DB2: Result := DB2_IdentifierNeedsQuoting(iIdentifier);
+ {$IFDEF DELPHI9UP}
+ dbx_ASA, dbx_ASE: Result := Sybase_IdentifierNeedsQuoting(iIdentifier);
+ {$ENDIF DELPHI9UP}
+ else
+ Result:= SQL92_IdentifierNeedsQuoting(iIdentifier);
+ end;
+end;
+
+function TDAEDBXConnection.GetQuoteChars: TDAQuoteCharArray;
+begin
+ case fDriverType of
+ dbx_Oracle: Result:=Oracle_GetQuoteChars;
+ else
+ Result:= inherited GetQuoteChars;
+ end;
+end;
+
+function TDAEDBXConnection.GetMySQLVersion: integer;
+begin
+ if FMySQLVersion = -1 then FMySQLVersion := MYSQL_GetVersion(GetDatasetClass.Create(Self));
+ Result := FMySQLVersion;
+end;
+
+{ TDAEDBXDriver }
+
+function TDAEDBXDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doAuxDriver, doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+function TDAEDBXDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEDBXConnection;
+end;
+
+function TDAEDBXDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ case DBXDriverIdToDBXDriverType(AuxDriver) of
+ dbx_MSSQL: Result:=MSSQL_DriverType;
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: Result:=IB_DriverType;
+ dbx_Oracle: Result:=Oracle_DriverType;
+ dbx_DB2: Result:=DB2_DriverType;
+ dbx_MySQL: Result:=MySQL_DriverType;
+ dbx_Informix: Result:=Informix_DriverType;
+ {$IFDEF DELPHI9UP}
+ dbx_ASA,dbx_ASE : Result:=ASA_DriverType;
+ {$ENDIF DELPHI9UP}
+ else
+ Result := inherited GetDefaultConnectionType(AuxDriver);
+ end;
+end;
+
+function TDAEDBXDriver.GetDescription: string;
+begin
+ result := 'Borland DBXExpress Driver';
+end;
+
+function TDAEDBXDriver.GetDriverID: string;
+begin
+ result := 'DBX';
+end;
+
+procedure TDAEDBXDriver.GetAuxDrivers(out List: IROStrings);
+var
+ i: Integer;
+ lDriversIni: string;
+ x: TDADBXDriverType;
+begin
+ List := NewROStrings;
+
+ lDriversIni := GetDriverRegistryFile(false);
+ if FileExists(lDriversIni) then begin
+ with TMemIniFile.Create(lDriversIni) do try
+ ReadSections(List.Strings);
+ for i := List.Count - 1 downto 0 do begin
+ if not ValueExists(List[i], 'LibraryName') then List.Delete(i);
+ end; { for }
+ finally
+ Free();
+ end;
+ end
+ else begin
+ for x := Low(TDADBXDriverType) to High(TDADBXDriverType) do
+ if (x <> dbx_Unknown) {// Redundant but safe if I change the enum later...} then
+ List.Add(DBXDrivers[x])
+ end;
+ List.Sorted:=True;
+end;
+
+procedure TDAEDBXDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ List.Add('TableScope=Synonyms');
+ List.Add('DriverName=');
+ List.Add('GetDriverFunc=');
+ List.Add('LibraryName=');
+ case DBXDriverIdToDBXDriverType(AuxDriver) of
+ dbx_MSSQL: List.Add('Schemas=(0,1)');
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: List.Add('Interbase TransIsolation=(ReadCommited,RepeatableRead)');
+ end;
+end;
+
+function TDAEDBXDriver.GetProviderDefaultCustomParameters(
+ Provider: string): string;
+begin
+ Result := '';
+ case DBXDriverIdToDBXDriverType(Provider) of
+ dbx_MSSQL: Result := 'Schemas=0;';
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: Result:='Interbase TransIsolation=ReadCommited;';
+ end;
+end;
+
+{ TDAEDBXQuery }
+
+procedure TDAEDBXQuery.ClearParams;
+begin
+ inherited;
+ TSQLQuery(Dataset).Params.Clear;
+end;
+
+function TDAEDBXQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TSQLQuery.Create(nil);
+
+ //TSQLQuery(result).rea
+ //TSQLQuery(result).CursorLocation := clUseClient;
+ //TSQLQuery(result).CursorType := ctOpenForwardOnly;
+ TSQLQuery(result).SQLConnection := TDAEDBXConnection(aConnection).fConnection.fSQLConnection;
+end;
+
+{$IFNDEF DELPHI12UP}
+function GetBlobValue(const val: Variant): string;
+var
+ lsize: integer;
+ p: Pointer;
+begin
+ if VarType(val) = 8209 then
+ begin
+ lSize := VarArrayHighBound(val, 1) - VarArrayLowBound(val, 1) + 1;
+ p := VarArrayLock(val);
+ try
+ setlength(REsult, lSize);
+ move(p^, Result[1], lSize);
+ finally
+ VarArrayUnlock(val);
+ end;
+ end else if vartype(val) = varEmpty then
+ result := ''
+ else
+ result := val;
+end;
+{$ELSE}
+function GetBlobValue(const val: Variant): TBytes;
+var
+ Data: UnicodeString;
+ lData: Ansistring;
+ Len: Integer;
+ lsize: integer;
+ p: Pointer;
+begin
+ if VarType(val) = 8209 then begin
+ lSize := VarArrayHighBound(val, 1) - VarArrayLowBound(val, 1) + 1;
+ p := VarArrayLock(val);
+ try
+ setlength(Result, lSize);
+ move(p^, Result[0], lSize);
+ finally
+ VarArrayUnlock(val);
+ end;
+ end
+ else if vartype(val) = varEmpty then
+ Result := Null
+ else if (VarType(Val) = varOleStr) or (VarType(Val) = varUString) then begin
+ Data := VarToStr(Val);
+ Len := Length(Data);
+ SetLength(Result, Len * SizeOf(Char));
+ Move(Pointer(Data)^, Pointer(Result)^, Len * SizeOf(Char));
+ end
+ else if VarType(Val) = varString then begin
+ lData := PAnsiChar(TVarData(Val).vString);
+ Len := Length(lData);
+ SetLength(Result, Len);
+ Move(Pointer(lData)^, Pointer(Result)^, Len);
+ end
+ else
+ Result := val;
+end;
+{$ENDIF}
+
+function TDAEDBXQuery.DoExecute: integer;
+var
+ i: Integer;
+ refParams: TParams;
+ dapar: TDAParam;
+ lDriverName: string;
+begin
+ if Assigned(DataSet) and Assigned(TSQLQuery(DataSet).SQLConnection) and
+ Assigned(TSQLQuery(DataSet).Params) then begin
+ lDriverName := TSQLQuery(DataSet).SQLConnection.DriverName;
+ refParams := TSQLQuery(DataSet).Params;
+ case DBXDriverIdToDBXDriverType(lDriverName) of
+ dbx_Oracle: begin
+ for i := 0 to refParams.Count - 1 do begin
+ case VarType(refParams[i].Value) of
+ varInteger,
+ varSmallInt,
+ varShortInt,
+ varWord,
+ varByte,
+ varLongWord:
+ refParams[i].AsString := VarToStr(refParams[i].Value);
+ varSingle,
+ varDouble,
+ varCurrency:
+ refParams[i].AsBCD := StrToCurr(VarToStr(refParams[i].Value));
+ varDate:
+ refParams[i].AsSQLTimeStamp := DateTimeToSQLTimeStamp(VarToDateTime(refParams[i].Value));
+ end;
+ end;
+ end;
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: begin
+ for i := 0 to refParams.Count - 1 do begin
+ dapar := GetParams.FindParam(refParams[i].Name);
+ if (dapar <> nil) then begin
+ if dapar.DataType = datBlob then begin
+ refParams[i].AsBlob := GetBlobValue(dapar.AsVariant);
+ continue;
+ end;
+ if dapar.DataType = datMemo then begin
+ refParams[i].AsMemo := dapar.AsVariant;
+ continue;
+ end;
+ end;
+ case VarType(refParams[i].Value) of
+ varDate:
+ refParams[i].AsSQLTimeStamp := DateTimeToSQLTimeStamp(VarToDateTime(refParams[i].Value));
+ end;
+ end;
+ end;
+ dbx_MySQL: begin
+ if UpperCase(TSQLQuery(DataSet).SQLConnection.LibraryName) = 'DBXOPENMYSQL50.DLL' then
+ for i := 0 to refParams.Count - 1 do begin
+ case VarType(refParams[i].Value) of
+ varDate:
+ refParams[i].AsSQLTimeStamp := DateTimeToSQLTimeStamp(VarToDateTime(refParams[i].Value));
+ end;
+ end;
+ end
+ else ;
+ end;
+ end;
+
+ Result := TSQLQuery(Dataset).ExecSQL;
+end;
+
+function TDAEDBXQuery.DoGetSQL: string;
+begin
+ result := TSQLQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEDBXQuery.DoPrepare(Value: boolean);
+begin
+ TSQLQuery(Dataset).Prepared := Value;
+end;
+
+procedure TDAEDBXQuery.DoSetSQL(const Value: string);
+begin
+ TSQLQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEDBXQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TSQLQuery(Dataset).Params);
+end;
+
+function TDAEDBXQuery.IsNeedToFixFMTBCDIssue: Boolean;
+var
+ i: integer;
+begin
+ Result:=False;
+ For i:=0 to TSQLQuery(Dataset).FieldCount-1 do begin
+ Result:= TSQLQuery(Dataset).Fields[i].DataType = ftFMTBcd;
+ if Result then Break;
+ end;
+end;
+
+procedure TDAEDBXQuery.SetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ p: TParams;
+begin
+ SetParamValuesStd(AParams, TSQLQuery(Dataset).Params);
+ p := TSQLQuery(Dataset).Params;
+ for I := 0 to p.Count - 1 do
+ if p[i].DataType = ftLargeint then
+ p[i].DataType := ftFMTBcd;
+end;
+
+{ TDAEDBXStoredProcedure }
+
+function TDAEDBXStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ result := TSQLStoredProc.Create(nil);
+ TSQLStoredProc(result).SQLConnection := TDAEDBXConnection(aConnection).fConnection.fSQLConnection;
+end;
+
+procedure TDAEDBXStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TSQLStoredProc(Dataset).Params);
+end;
+
+procedure TDAEDBXStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TSQLStoredProc(Dataset).Params);
+end;
+
+function TDAEDBXStoredProcedure.Execute: integer;
+begin
+ SetParamValues(GetParams);
+ Result:= DoExecute;
+ GetParamValues(GetParams);
+end;
+
+function TDAEDBXStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TSQLStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEDBXStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TSQLStoredProc(Dataset).StoredProcName := Name;
+end;
+
+procedure TDAEDBXStoredProcedure.RefreshParams;
+begin
+ TSQLStoredProc(Dataset).Prepared := True;
+ RefreshParamsStd(TSQLStoredProc(Dataset).Params)
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+function TDAEDBXStoredProcedure.DoExecute: integer;
+begin
+ Result := TSQLStoredProc(Dataset).ExecProc;
+end;
+
+function TDAEDBXConnection.GetNextAutoinc2(
+ const GeneratorName: string): variant;
+begin
+ case fDriverType of
+ dbx_Interbase{$IFDEF DELPHI14UP},dbx_Firebird{$ENDIF}: Result := IB_GetNextAutoinc(GeneratorName, GetDatasetClass.Create(Self));
+ dbx_Oracle: Result := Oracle_GetNextAutoinc(GeneratorName, GetDatasetClass.Create(Self));
+ else
+ result := -1;
+ end;
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADOADriver.dcr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADOADriver.dcr
new file mode 100644
index 0000000..3e5d914
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADOADriver.dcr differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADOADriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADOADriver.pas
new file mode 100644
index 0000000..52fdd6c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDADOADriver.pas
@@ -0,0 +1,692 @@
+unit uDADOADriver;
+
+// if using DOA 4.0 or higher activate this define
+{$DEFINE DOA4}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_DOADriver_Glyphs.res}
+
+interface
+
+uses
+ DB,
+ Classes,
+ uROClasses,
+ uDAEngine,
+ uDAInterfaces,
+ uDAOracleInterfaces,
+ uDAUtils,
+ Oracle,
+ OracleData;
+
+type
+
+ TDADOADriver = class(TDADriverReference)
+ end;
+
+ TDAEDOADriver = class(TDAOracleDriver)
+ private
+ fTraceCallBack: TDALogTraceEvent; // UKO 26.09.2003
+ protected
+ procedure DoSetTraceOptions(TraceActive: Boolean; TraceOptions:
+ TDATraceOptions; Callback: TDALogTraceEvent); override;
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override;
+ function GetConnectionClass: TDAEConnectionClass; override;
+ function GetDefaultCustomParameters: string; override;
+ function GetDescription: string; override;
+ function GetDriverID: string; override;
+
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ end;
+
+ TDAEDOAConnection = class(TDAOracleConnection)
+ private
+ function GetOracleSession: TOracleSession;
+ protected
+ function CreateCompatibleQuery: IDADataset; override;
+ function CreateCustomConnection: TCustomConnection; override;
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+
+ function DoGetInTransaction: boolean; override;
+ function DoBeginTransaction: Integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function GetDataSetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+ property OracleSession: TOracleSession read GetOracleSession;
+ end;
+
+ TDAEDOAQuery = class(TDAEDataSet, IOracleDataSet)
+ private
+ function LockModeDaToDoa(LockMode: TDAOracleLockMode): TLockingModeOptions;
+ function LockModeDoaToDa(LockMode: TLockingModeOptions): TDAOracleLockMode;
+ protected
+ procedure ClearParams; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ function DoExecute: Integer; override;
+ function DoGetSQL: string; override;
+ procedure DoPrepare(Value: Boolean); override;
+ procedure DoSetSQL(const Value: string); override;
+ function GetLockMode: TDAOracleLockMode;
+ function GetOptions: TDAOracleOptions;
+ procedure SetLockMode(Value: TDAOracleLockMode);
+ procedure SetOptions(Value: TDAOracleOptions);
+ procedure SetParamValues(Params: TDAParamCollection); override; safecall;
+ procedure GetParamValues(Params: TDAParamCollection); override; safecall;
+ end;
+
+ TDAEDOAStoredProcedure = class(TDAEStoredProcedure)
+ private
+ fProcedureName: string;
+ FConnection: TDAEDOAConnection;
+ procedure DoGetParams;
+ function DoGetParamsResult: TDAParam;
+ procedure DoSetSource;
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ function Execute: Integer; override;
+ function GetStoredProcedureName: string; override;
+ procedure RefreshParams; override;
+ procedure SetParamValues(Params: TDAParamCollection); override; safecall;
+ procedure GetParamValues(Params: TDAParamCollection); override; safecall;
+ procedure SetStoredProcedureName(const Name: string); override;
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ SysUtils,
+ uDADriverManager,
+ uDARes;
+
+type
+ TDADOAInternalConnection = class(TCustomConnection)
+ private
+ fOracleSession: TOracleSession;
+ protected
+ procedure DoConnect; override;
+ procedure DoDisconnect; override;
+ function GetConnected: Boolean; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Session: TOracleSession read fOracleSession;
+ end;
+
+ TOraPath = record
+ aScheme: string;
+ aPackage: string;
+ aObject: string;
+ end;
+
+var
+ _Driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDADOADriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEDOADriver.Create(nil);
+ result := _driver;
+end;
+
+
+function HandleSqlName(AParamName: string; AParamType: TDAParamType): string;
+begin
+ Result := AParamName;
+ if AParamType = daptResult then Result := 'result';
+end;
+
+function DataTypeDaToOra(AType: TDADataType): Integer;
+const
+ Error = 'INTERNAL: not supported by DOA';
+begin
+ Result := otString;
+ case AType of
+ datUnknown: raise Exception.Create(Error);
+ datGuid, datString: Result := otString;
+ datDateTime: Result := otDate;
+ datSingleFloat, datFloat, datCurrency: Result := otFloat;
+ datByte,
+ datShortInt,
+ datWord,
+ datCardinal,
+ datAutoInc,
+ datInteger,
+ datLargeInt: Result := otInteger;
+ datBoolean: Result := otInteger; // needs a special handling
+ datMemo: Result := otClob;
+ datBlob: Result := otBlob;
+ datWideString: Result := otVarchar2;
+ datXml,
+ datWideMemo : Result := otNCLOB;
+ datLargeAutoInc, datLargeUInt,datDecimal : Result := otNumber;
+ end;
+end;
+
+procedure SetDataSetParams(Params: TDAParamCollection; DataSet: TDataSet);
+var
+ I: Integer;
+ Ds: TOracleDataSet;
+ ParamIndex, OraType: Integer;
+ Name: string;
+begin
+ Ds := TOracleDataSet(DataSet);
+ if Ds.Variables.Count > Params.Count then
+ for I := Ds.VariableCount - 1 downto 0 do
+ if Params.ParamByName(Ds.VariableName(I)) = nil then
+ Ds.DeleteVariable(Ds.VariableName(I));
+
+ for I := 0 to Params.Count - 1 do
+ begin
+ ParamIndex := Ds.VariableIndex(Params[I].Name);
+ Name := HandleSqlName(Params[I].Name, Params[I].ParamType);
+ OraType := DataTypeDaToOra(Params[I].DataType);
+ // New Param
+ if ParamIndex = -1 then
+ Ds.DeclareVariable(Name, OraType);
+ // Changed Param
+ if (ParamIndex > -1) and (Ds.VariableType(ParamIndex) <> DataTypeDaToOra(
+ Params[I].DataType)) then
+ begin
+ Ds.DeleteVariable(Params[I].Name);
+ Ds.DeclareVariable(Name, OraType);
+ end;
+ // Set value
+ if Params[I].DataType = datBoolean then
+ Ds.SetVariable(Name, Integer(Params[I].Value))
+ else
+ Ds.SetVariable(Name, Params[I].Value);
+ end;
+end;
+
+{ INTERNAL CLASSES *********************************************************** }
+{
+*************************** TDADOAInternalConnection ***************************
+}
+
+constructor TDADOAInternalConnection.Create(AOwner: TComponent);
+begin
+ inherited;
+ fOracleSession := TOracleSession.Create(nil);
+end;
+
+destructor TDADOAInternalConnection.Destroy;
+begin
+ fOracleSession.Free;
+ inherited;
+end;
+
+procedure TDADOAInternalConnection.DoConnect;
+begin
+ fOracleSession.LogOn;
+end;
+
+procedure TDADOAInternalConnection.DoDisconnect;
+begin
+ fOracleSession.LogOff;
+end;
+
+function TDADOAInternalConnection.GetConnected: Boolean;
+begin
+ Result := fOracleSession.Connected;
+end;
+
+{ PUBLIC CLASSES ************************************************************* }
+{
+******************************** TDAEDOADriver *********************************
+}
+
+// -----------------------------------------------------------------------------
+// TDAEDOADriver.DoSetTraceOptions
+//
+// Tracing can only be enabled when DOA Version 4.0 or higher is used.
+// UKO 26.09.2003 21:14:47
+//
+
+procedure TDAEDOADriver.DoSetTraceOptions(TraceActive: Boolean; TraceOptions:
+ TDATraceOptions; Callback: TDALogTraceEvent);
+begin
+ inherited;
+
+ if TraceActive then
+ begin
+ fTraceCallBack := Callback;
+
+ {$IFDEF DOA4}
+ EnableMonitor;
+ {$ENDIF}
+ end
+ else
+ begin
+ fTraceCallBack := nil;
+
+ {$IFDEF DOA4}
+ DisableMonitor;
+ {$ENDIF}
+ end;
+
+end;
+
+procedure TDAEDOADriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+end;
+
+// -----------------------------------------------------------------------------
+// TDAEDOADriver.GetAvailableDriverOptions
+//
+// Only Database, Login and Custom needed. doServerName is not needed !
+//
+// UKO 25.09.2003 17:51:31
+//
+
+function TDAEDOADriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ Result := [doDatabaseName, doLogin{, doCustom}];
+end;
+
+function TDAEDOADriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ Result := TDAEDOAConnection;
+end;
+
+function TDAEDOADriver.GetDefaultCustomParameters: string;
+begin
+ Result:='';
+end;
+
+function TDAEDOADriver.GetDescription: string;
+begin
+ Result := 'Direct Oracle Access Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};;
+end;
+
+function TDAEDOADriver.GetDriverID: string;
+begin
+ Result := 'DOA';
+end;
+
+{
+****************************** TDAEDOAConnection *******************************
+}
+
+function TDAEDOAConnection.CreateCompatibleQuery: IDADataset;
+begin
+ Result := inherited CreateCompatibleQuery;
+ OracleSession.LogOn;
+end;
+
+function TDAEDOAConnection.CreateCustomConnection: TCustomConnection;
+begin
+ Result := TDADOAInternalConnection.Create(nil);
+end;
+
+// -----------------------------------------------------------------------------
+// TDAEDOAConnection.CreateMacroProcessor
+//
+// UKO 25.09.2003 18:43:06
+//
+
+
+// -----------------------------------------------------------------------------
+// TDAEDOAConnection.DoApplyConnectionString
+//
+// Use Database instead of Server. Server has no meaning in Oracle
+// UKO 25.09.2003 17:54:25
+//
+
+procedure TDAEDOAConnection.DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+begin
+ inherited;
+ with aConnStrParser do begin
+ OracleSession.LogonDatabase := Database;
+ OracleSession.LogonUsername := UpperCase(UserID);
+ OracleSession.LogonPassword := Password;
+ end;
+end;
+
+function TDAEDOAConnection.DoBeginTransaction: Integer;
+begin
+ // DOA doesn't have any special transaction starting routines
+ Result := 0;
+end;
+
+procedure TDAEDOAConnection.DoCommitTransaction;
+begin
+ OracleSession.Commit;
+end;
+
+function TDAEDOAConnection.DoGetInTransaction: boolean;
+begin
+ Result := OracleSession.InTransaction;
+end;
+
+procedure TDAEDOAConnection.DoRollbackTransaction;
+begin
+ OracleSession.Rollback;
+end;
+
+function TDAEDOAConnection.GetDataSetClass: TDAEDatasetClass;
+begin
+ Result := TDAEDOAQuery;
+end;
+
+function TDAEDOAConnection.GetOracleSession: TOracleSession;
+begin
+ Result := TDADOAInternalConnection(inherited ConnectionObject).Session;
+end;
+
+
+
+function TDAEDOAConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ Result := TDAEDOAStoredProcedure;
+end;
+
+// -----------------------------------------------------------------------------
+// TDAEDOAConnection.IdentifierNeedsQuoting
+//
+// Default behavior not enough, as '$' and '.' are also a valid character which doesn´t need quoting
+//
+// UKO 25.09.2003 11:48:13
+//
+
+{
+********************************* TDAEDOAQuery *********************************
+}
+
+procedure TDAEDOAQuery.ClearParams;
+begin
+ inherited;
+ TOracleDataSet(Dataset).ClearVariables;
+end;
+
+function TDAEDOAQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ Result := TOracleDataSet.Create(nil);
+ TOracleDataSet(Result).ReadOnly := True;
+ TOracleDataSet(Result).Session := TDAEDOAConnection(aConnection).OracleSession;
+end;
+
+function TDAEDOAQuery.DoExecute: Integer;
+begin
+ TOracleDataSet(DataSet).ExecSQL;
+ Result := -1;
+end;
+
+function TDAEDOAQuery.DoGetSQL: string;
+begin
+ Result := TOracleDataSet(Dataset).SQL.Text;
+end;
+
+procedure TDAEDOAQuery.DoPrepare(Value: Boolean);
+begin
+ TOracleDataSet(DataSet).Optimize := Value;
+end;
+
+procedure TDAEDOAQuery.DoSetSQL(const Value: string);
+begin
+ TOracleDataSet(Dataset).SQL.Text := Value;
+end;
+
+function TDAEDOAQuery.GetLockMode: TDAOracleLockMode;
+begin
+ Result := LockModeDoaToDa(TOracleDataSet(Dataset).LockingMode)
+end;
+
+function TDAEDOAQuery.GetOptions: TDAOracleOptions;
+begin
+ // Can't be implemented
+end;
+
+procedure TDAEDOAQuery.GetParamValues(Params: TDAParamCollection);
+var
+ i: integer;
+ par: TDAParam;
+ ds: TOracleDataSet;
+begin
+ ds := TOracleDataSet(Dataset);
+ if not Assigned(ds.Variables) then Exit;
+
+ for i := 0 to (ds.VariableCount - 1) do begin
+ par := Params.ParamByName(copy(ds.VariableName(i),2,MaxInt));
+ if par.ParamType in [daptOutput, daptInputOutput, daptResult] then
+ par.Value := ds.GetVariable(i);
+ end;
+end;
+
+function TDAEDOAQuery.LockModeDaToDoa(LockMode: TDAOracleLockMode):
+ TLockingModeOptions;
+begin
+ Result := lmNone;
+ case LockMode of
+ olmLockImmediate: Result := lmLockImmediate;
+ olmLockDelayed: Result := lmLockDelayed;
+ end;
+end;
+
+function TDAEDOAQuery.LockModeDoaToDa(LockMode: TLockingModeOptions):
+ TDAOracleLockMode;
+begin
+ Result := olmNone;
+ case LockMode of
+ lmLockImmediate: Result := olmLockImmediate;
+ lmLockDelayed: Result := olmLockDelayed;
+ end;
+end;
+
+procedure TDAEDOAQuery.SetLockMode(Value: TDAOracleLockMode);
+begin
+ TOracleDataSet(Dataset).LockingMode := LockModeDaToDoa(Value);
+end;
+
+procedure TDAEDOAQuery.SetOptions(Value: TDAOracleOptions);
+begin
+ // Can't be implemented
+end;
+
+procedure TDAEDOAQuery.SetParamValues(Params: TDAParamCollection);
+begin
+ SetDataSetParams(Params, DataSet);
+end;
+
+{
+**************************** TDAEDOAStoredProcedure ****************************
+}
+
+function TDAEDOAStoredProcedure.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ Result := TOracleDataSet.Create(nil);
+ FConnection := TDAEDOAConnection(aConnection);
+ TOracleDataSet(Result).Session := TDAEDOAConnection(aConnection).OracleSession;
+end;
+
+procedure TDAEDOAStoredProcedure.DoGetParams;
+var
+ Ds: TOracleDataSet;
+ I: Integer;
+ Params: TDAParamCollection;
+begin
+ Params := GetParams;
+ Ds := TOracleDataSet(DataSet);
+ for I := 0 to Params.Count - 1 do
+ if Params[I].ParamType in [daptOutput, daptInputOutput, daptResult] then
+ Params[I].Value := Ds.GetVariable(HandleSqlName(Params[I].Name, Params[I].ParamType));
+end;
+
+function TDAEDOAStoredProcedure.DoGetParamsResult: TDAParam;
+var
+ I: Integer;
+ Params: TDAParamCollection;
+begin
+ Result := nil;
+ Params := GetParams;
+ for I := 0 to Params.Count - 1 do
+ if Params[I].ParamType = daptResult then
+ begin
+ Result := Params[I];
+ Exit;
+ end;
+end;
+
+procedure TDAEDOAStoredProcedure.DoSetSource;
+var
+ Ds: TOracleDataSet;
+ I: Integer;
+ Params: TDaParamCollection;
+ ParamResult: TDAParam;
+ ParamsExist: Boolean;
+
+const
+ SQLHeader = 'declare' + sLineBreak +
+ ' result boolean;' + sLineBreak +
+ 'begin' + sLineBreak;
+ SQLHandleBoolean = ':result := sys.diutil.bool_to_int(function_result);';
+ SQLFooter = 'end;';
+
+ function CaseOfParam(const AParamResult: TDAParam): Integer;
+ begin
+ Result := 0;
+ if AParamResult <> nil then
+ if AParamResult.DataType = datBoolean then
+ Result := 1
+ else
+ Result := 2;
+ end;
+
+ function ConvertParam(const AName: string; const ADataType: TDADataType):
+ string;
+ begin
+ if ADataType = datBoolean then
+ begin
+ Result := Format('%s => sys.diutil.int_to_bool(:%s), ', [AName, AName]);
+ Exit;
+ end;
+ Result := Format('%s => :%s, ', [AName, AName]);
+ end;
+
+ function TrimSqlParams(const SQL: string): string;
+ var
+ S: string;
+ begin
+ S := SQL;
+ Delete(S, Length(S) - 3, 4);
+ Result := S;
+ end;
+
+begin
+ Ds := TOracleDataSet(DataSet);
+ Params := GetParams;
+ ParamResult := DoGetParamsResult;
+ // PL/SQL Block - header + stored proc name
+ Ds.SQL.Text := SQLHeader;
+ case CaseOfParam(ParamResult) of // 0 = no result, 1 = boolean, 2 = misc
+ 0: Ds.SQL.Add(Format(' %s(', [fProcedureName]));
+ 1: Ds.SQL.Add(Format(' result := %s(', [fProcedureName]));
+ 2: Ds.SQL.Add(Format(' :result := %s(', [fProcedureName]));
+ end;
+ // PL/SQL Block - params if any;
+ ParamsExist := False;
+ for I := 0 to Params.Count - 1 do
+ if (Params.Items[I] <> ParamResult) then
+ begin
+ ParamsExist := True;
+ Ds.SQL.Add(ConvertParam(Params[I].Name, Params[I].DataType));
+ end;
+ // PL/SQL Block - params - remove the last half-stop
+ if ParamsExist then
+ Ds.SQL.Text := TrimSQLParams(Ds.SQL.Text);
+ Ds.SQL.Add(');');
+ // PL/SQL Block - special treatment for functions with boolean results
+ if ParamResult.DataType = datBoolean then
+ Ds.SQL.Add(SQLHandleBoolean);
+ Ds.SQL.Add(SQLFooter);
+end;
+
+function TDAEDOAStoredProcedure.Execute: Integer;
+var
+ Params: TDAParamCollection;
+begin
+ Params := GetParams;
+ SetDataSetParams(Params, DataSet);
+ DoSetSource;
+ TOracleDataSet(DataSet).ExecSQL;
+ DoGetParams;
+ Result := -1;
+end;
+
+function TDAEDOAStoredProcedure.GetStoredProcedureName: string;
+begin
+ Result := fProcedureName;
+end;
+
+procedure TDAEDOAStoredProcedure.RefreshParams;
+var
+ OraParams: TDAParamCollection;
+begin
+ Oracle_DoGetStoredProcedureParams(fProcedureName, FConnection.CreateCompatibleQuery,OraParams);
+ GetParams.AssignParamCollection(OraParams);
+end;
+
+procedure TDAEDOAStoredProcedure.GetParamValues(Params: TDAParamCollection);
+var
+ i: integer;
+ par: TDAParam;
+ ds: TOracleDataSet;
+begin
+ ds := TOracleDataSet(Dataset);
+ if not Assigned(ds.Variables) then Exit;
+
+ for i := 0 to (ds.VariableCount - 1) do begin
+ par := Params.ParamByName(ds.VariableName(i));
+ if par.ParamType in [daptOutput, daptInputOutput, daptResult] then
+ par.Value := ds.GetVariable(i);
+ end;
+end;
+
+procedure TDAEDOAStoredProcedure.SetParamValues(Params: TDAParamCollection);
+begin
+ SetDataSetParams(Params, DataSet);
+end;
+
+procedure TDAEDOAStoredProcedure.SetStoredProcedureName(const Name: string);
+begin
+ fProcedureName := Name;
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+initialization
+ _Driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNil(_Driver);
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAElevateDBDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAElevateDBDriver.pas
new file mode 100644
index 0000000..d2752b0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAElevateDBDriver.pas
@@ -0,0 +1,1496 @@
+unit uDAElevateDBDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_ElevateDBDriver_Glyphs.res}
+
+interface
+uses Classes, DB,
+ uDAElevateDBInterfaces, edbType, edbcomps,
+ uROClasses, uDAEngine, uDAInterfaces, uDAInterfacesEx, uDAUtils;
+
+type { TDAElevateDBDriver }
+ TDAElevateDBDriver = class(TDADriverReference)
+ end;
+
+ { TDAEElevateDBDriver }
+ TDAEElevateDBDriver = class(uDAElevateDBInterfaces.TDAElevateDBDriver ,IDADriver40)
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ //procedure CustomizeConnectionObject(aConnection: TDAEConnection); override;
+ //procedure DoSetTraceOptions(TraceActive: boolean; TraceFlags: TDATraceOptions; Callback: TDALogTraceEvent); override;
+
+ { IDADriver }
+ function GetDriverID: string; override; safecall;
+ function GetDescription: string; override; safecall;
+ // function GetMajVersion: byte; override; safecall;
+ // function GetMinVersion: byte; override; safecall;
+ procedure GetAuxDrivers(out List: IROStrings); override; safecall;
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override; safecall;
+ // procedure Initialize; override; safecall;
+ // procedure Finalize; override; safecall;
+ // function GetDefaultCustomParameters: string; override; safecall;
+
+ { IDADriver40 }
+ function GetProviderDefaultCustomParameters(Provider: string): string; safecall;
+ public
+ end;
+
+ IElevateDBEngineProperties = interface
+ function GetBackupExtension: TEDBString;
+ function GetCatalogExtension: TEDBString;
+ function GetCatalogName: TEDBString;
+ function GetConfigExtension: TEDBString;
+ function GetConfigName: TEDBString;
+ function GetConfigPath: TEDBString;
+ function GetEncryptionPassword: TEDBString;
+ function GetEngineType: TEDBEngineType;
+ function GetLargeFileSupport: Boolean;
+ function GetLicensedSessions: Integer;
+ function GetLockExtension: TEDBString;
+ function GetLogCategories: TEDBLogCategories;
+ function GetLogExtension: TEDBString;
+ function GetMaxLogFileSize: Integer;
+ function GetServerAddress: TEDBString;
+ function GetServerAuthorizedAddresses: TEDBStrings;
+ function GetServerBlockedAddresses: TEDBStrings;
+ function GetServerDeadSessionExpiration: Integer;
+ function GetServerDeadSessionInterval: Integer;
+ function GetServerDescription: TEDBString;
+ function GetServerEncryptedOnly: Boolean;
+ function GetServerJobCategory: TEDBString;
+ function GetServerMaxDeadSessions: Integer;
+ function GetServerName: TEDBString;
+ function GetServerPort: Integer;
+ function GetServerRunJobs: Boolean;
+ function GetServerSessionTimeout: Integer;
+ function GetServerThreadCacheSize: Integer;
+ function GetSignature: TEDBString;
+ function GetTableBlobExtension: TEDBString;
+ function GetTableExtension: TEDBString;
+ function GetTableIndexExtension: TEDBString;
+ function GetTempTablesPathProperty: TEDBString;
+ procedure SetBackupExtension(const Value: TEDBString);
+ procedure SetCatalogExtension(const Value: TEDBString);
+ procedure SetCatalogName(const Value: TEDBString);
+ procedure SetConfigExtension(const Value: TEDBString);
+ procedure SetConfigName(const Value: TEDBString);
+ procedure SetConfigPath(const Value: TEDBString);
+ procedure SetEncryptionPassword(const Value: TEDBString);
+ procedure SetEngineType(const Value: TEDBEngineType);
+ procedure SetLargeFileSupport(const Value: Boolean);
+ procedure SetLicensedSessions(const Value: Integer);
+ procedure SetLockExtension(const Value: TEDBString);
+ procedure SetLogCategories(const Value: TEDBLogCategories);
+ procedure SetLogExtension(const Value: TEDBString);
+ procedure SetMaxLogFileSize(const Value: Integer);
+ procedure SetServerAddress(const Value: TEDBString);
+ procedure SetServerAuthorizedAddresses(const Value: TEDBStrings);
+ procedure SetServerBlockedAddresses(const Value: TEDBStrings);
+ procedure SetServerDeadSessionExpiration(const Value: Integer);
+ procedure SetServerDeadSessionInterval(const Value: Integer);
+ procedure SetServerDescription(const Value: TEDBString);
+ procedure SetServerEncryptedOnly(const Value: Boolean);
+ procedure SetServerJobCategory(const Value: TEDBString);
+ procedure SetServerMaxDeadSessions(const Value: Integer);
+ procedure SetServerName(const Value: TEDBString);
+ procedure SetServerPort(const Value: Integer);
+ procedure SetServerRunJobs(const Value: Boolean);
+ procedure SetServerSessionTimeout(const Value: Integer);
+ procedure SetServerThreadCacheSize(const Value: Integer);
+ procedure SetSignature(const Value: TEDBString);
+ procedure SetTableBlobExtension(const Value: TEDBString);
+ procedure SetTableExtension(const Value: TEDBString);
+ procedure SetTableIndexExtension(const Value: TEDBString);
+ procedure SetTempTablesPath(const Value: TEDBString);
+ property EngineType: TEDBEngineType read GetEngineType write SetEngineType;
+ property Signature: TEDBString read GetSignature write SetSignature;
+ property EncryptionPassword: TEDBString read GetEncryptionPassword write SetEncryptionPassword;
+ property LargeFileSupport: Boolean read GetLargeFileSupport write SetLargeFileSupport;
+ property LicensedSessions: Integer read GetLicensedSessions write SetLicensedSessions;
+ property ConfigPath: TEDBString read GetConfigPath write SetConfigPath;
+ property ConfigName: TEDBString read GetConfigName write SetConfigName;
+ property ConfigExtension: TEDBString read GetConfigExtension write SetConfigExtension;
+ property LockExtension: TEDBString read GetLockExtension write SetLockExtension;
+ property LogExtension: TEDBString read GetLogExtension write SetLogExtension;
+ property MaxLogFileSize: Integer read GetMaxLogFileSize write SetMaxLogFileSize;
+ property LogCategories: TEDBLogCategories read GetLogCategories write SetLogCategories;
+ property CatalogName: TEDBString read GetCatalogName write SetCatalogName;
+ property CatalogExtension: TEDBString read GetCatalogExtension write SetCatalogExtension;
+ property BackupExtension: TEDBString read GetBackupExtension write SetBackupExtension;
+ property TableExtension: TEDBString read GetTableExtension write SetTableExtension;
+ property TableIndexExtension: TEDBString read GetTableIndexExtension write SetTableIndexExtension;
+ property TableBlobExtension: TEDBString read GetTableBlobExtension write SetTableBlobExtension;
+ property TempTablesPath: TEDBString read GetTempTablesPathProperty write SetTempTablesPath;
+ property ServerName: TEDBString read GetServerName write SetServerName;
+ property ServerDescription: TEDBString read GetServerDescription write SetServerDescription;
+ property ServerAddress: TEDBString read GetServerAddress write SetServerAddress;
+ property ServerPort: Integer read GetServerPort write SetServerPort;
+ property ServerThreadCacheSize: Integer read GetServerThreadCacheSize write SetServerThreadCacheSize;
+ property ServerEncryptedOnly: Boolean read GetServerEncryptedOnly write SetServerEncryptedOnly;
+ property ServerSessionTimeout: Integer read GetServerSessionTimeout write SetServerSessionTimeout;
+ property ServerDeadSessionInterval: Integer read GetServerDeadSessionInterval write SetServerDeadSessionInterval;
+ property ServerDeadSessionExpiration: Integer read GetServerDeadSessionExpiration write SetServerDeadSessionExpiration;
+ property ServerMaxDeadSessions: Integer read GetServerMaxDeadSessions write SetServerMaxDeadSessions;
+ property ServerAuthorizedAddresses: TEDBStrings read GetServerAuthorizedAddresses write SetServerAuthorizedAddresses;
+ property ServerBlockedAddresses: TEDBStrings read GetServerBlockedAddresses write SetServerBlockedAddresses;
+ property ServerRunJobs: Boolean read GetServerRunJobs write SetServerRunJobs;
+ property ServerJobCategory: TEDBString read GetServerJobCategory write SetServerJobCategory;
+ end;
+
+ TElevateDBEngineProperties = class(TInterfacedObject,IElevateDBEngineProperties)
+ protected
+ function GetBackupExtension: TEDBString;
+ function GetCatalogExtension: TEDBString;
+ function GetCatalogName: TEDBString;
+ function GetConfigExtension: TEDBString;
+ function GetConfigName: TEDBString;
+ function GetConfigPath: TEDBString;
+ function GetEncryptionPassword: TEDBString;
+ function GetEngineType: TEDBEngineType;
+ function GetLargeFileSupport: Boolean;
+ function GetLicensedSessions: Integer;
+ function GetLockExtension: TEDBString;
+ function GetLogCategories: TEDBLogCategories;
+ function GetLogExtension: TEDBString;
+ function GetMaxLogFileSize: Integer;
+ function GetServerAddress: TEDBString;
+ function GetServerAuthorizedAddresses: TEDBStrings;
+ function GetServerBlockedAddresses: TEDBStrings;
+ function GetServerDeadSessionExpiration: Integer;
+ function GetServerDeadSessionInterval: Integer;
+ function GetServerDescription: TEDBString;
+ function GetServerEncryptedOnly: Boolean;
+ function GetServerJobCategory: TEDBString;
+ function GetServerMaxDeadSessions: Integer;
+ function GetServerName: TEDBString;
+ function GetServerPort: Integer;
+ function GetServerRunJobs: Boolean;
+ function GetServerSessionTimeout: Integer;
+ function GetServerThreadCacheSize: Integer;
+ function GetSignature: TEDBString;
+ function GetTableBlobExtension: TEDBString;
+ function GetTableExtension: TEDBString;
+ function GetTableIndexExtension: TEDBString;
+ function GetTempTablesPathProperty: TEDBString;
+ procedure SetBackupExtension(const Value: TEDBString);
+ procedure SetCatalogExtension(const Value: TEDBString);
+ procedure SetCatalogName(const Value: TEDBString);
+ procedure SetConfigExtension(const Value: TEDBString);
+ procedure SetConfigName(const Value: TEDBString);
+ procedure SetConfigPath(const Value: TEDBString);
+ procedure SetEncryptionPassword(const Value: TEDBString);
+ procedure SetEngineType(const Value: TEDBEngineType);
+ procedure SetLargeFileSupport(const Value: Boolean);
+ procedure SetLicensedSessions(const Value: Integer);
+ procedure SetLockExtension(const Value: TEDBString);
+ procedure SetLogCategories(const Value: TEDBLogCategories);
+ procedure SetLogExtension(const Value: TEDBString);
+ procedure SetMaxLogFileSize(const Value: Integer);
+ procedure SetServerAddress(const Value: TEDBString);
+ procedure SetServerAuthorizedAddresses(const Value: TEDBStrings);
+ procedure SetServerBlockedAddresses(const Value: TEDBStrings);
+ procedure SetServerDeadSessionExpiration(const Value: Integer);
+ procedure SetServerDeadSessionInterval(const Value: Integer);
+ procedure SetServerDescription(const Value: TEDBString);
+ procedure SetServerEncryptedOnly(const Value: Boolean);
+ procedure SetServerJobCategory(const Value: TEDBString);
+ procedure SetServerMaxDeadSessions(const Value: Integer);
+ procedure SetServerName(const Value: TEDBString);
+ procedure SetServerPort(const Value: Integer);
+ procedure SetServerRunJobs(const Value: Boolean);
+ procedure SetServerSessionTimeout(const Value: Integer);
+ procedure SetServerThreadCacheSize(const Value: Integer);
+ procedure SetSignature(const Value: TEDBString);
+ procedure SetTableBlobExtension(const Value: TEDBString);
+ procedure SetTableExtension(const Value: TEDBString);
+ procedure SetTableIndexExtension(const Value: TEDBString);
+ procedure SetTempTablesPath(const Value: TEDBString);
+ public
+ property EngineType: TEDBEngineType read GetEngineType write SetEngineType;
+ property Signature: TEDBString read GetSignature write SetSignature;
+ property EncryptionPassword: TEDBString read GetEncryptionPassword write SetEncryptionPassword;
+ property LargeFileSupport: Boolean read GetLargeFileSupport write SetLargeFileSupport;
+ property LicensedSessions: Integer read GetLicensedSessions write SetLicensedSessions;
+ property ConfigPath: TEDBString read GetConfigPath write SetConfigPath;
+ property ConfigName: TEDBString read GetConfigName write SetConfigName;
+ property ConfigExtension: TEDBString read GetConfigExtension write SetConfigExtension;
+ property LockExtension: TEDBString read GetLockExtension write SetLockExtension;
+ property LogExtension: TEDBString read GetLogExtension write SetLogExtension;
+ property MaxLogFileSize: Integer read GetMaxLogFileSize write SetMaxLogFileSize;
+ property LogCategories: TEDBLogCategories read GetLogCategories write SetLogCategories;
+ property CatalogName: TEDBString read GetCatalogName write SetCatalogName;
+ property CatalogExtension: TEDBString read GetCatalogExtension write SetCatalogExtension;
+ property BackupExtension: TEDBString read GetBackupExtension write SetBackupExtension;
+ property TableExtension: TEDBString read GetTableExtension write SetTableExtension;
+ property TableIndexExtension: TEDBString read GetTableIndexExtension write SetTableIndexExtension;
+ property TableBlobExtension: TEDBString read GetTableBlobExtension write SetTableBlobExtension;
+ property TempTablesPath: TEDBString read GetTempTablesPathProperty write SetTempTablesPath;
+ property ServerName: TEDBString read GetServerName write SetServerName;
+ property ServerDescription: TEDBString read GetServerDescription write SetServerDescription;
+ property ServerAddress: TEDBString read GetServerAddress write SetServerAddress;
+ property ServerPort: Integer read GetServerPort write SetServerPort;
+ property ServerThreadCacheSize: Integer read GetServerThreadCacheSize write SetServerThreadCacheSize;
+ property ServerEncryptedOnly: Boolean read GetServerEncryptedOnly write SetServerEncryptedOnly;
+ property ServerSessionTimeout: Integer read GetServerSessionTimeout write SetServerSessionTimeout;
+ property ServerDeadSessionInterval: Integer read GetServerDeadSessionInterval write SetServerDeadSessionInterval;
+ property ServerDeadSessionExpiration: Integer read GetServerDeadSessionExpiration write SetServerDeadSessionExpiration;
+ property ServerMaxDeadSessions: Integer read GetServerMaxDeadSessions write SetServerMaxDeadSessions;
+ property ServerAuthorizedAddresses: TEDBStrings read GetServerAuthorizedAddresses write SetServerAuthorizedAddresses;
+ property ServerBlockedAddresses: TEDBStrings read GetServerBlockedAddresses write SetServerBlockedAddresses;
+ property ServerRunJobs: Boolean read GetServerRunJobs write SetServerRunJobs;
+ property ServerJobCategory: TEDBString read GetServerJobCategory write SetServerJobCategory;
+ end;
+
+ IElevateDBEngine = interface
+ function EngineProperties: IElevateDBEngineProperties;
+ end;
+
+ IElevateDBSessionProperties = interface
+ function GetForceBufferFlush: Boolean;
+ function GetKeepConnections: Boolean;
+ function GetKeepTablesOpen: Boolean;
+ function GetProgressTimeInterval: Integer;
+ function GetRecordChangeDetection: Boolean;
+ function GetRecordLockProtocol: TEDBRecordLockProtocol;
+ function GetRecordLockRetryCount: Integer;
+ function GetRecordLockWaitTime: Integer;
+ function GetRemoteAddress: TEDBString;
+ function GetRemoteCompression: Integer;
+ function GetRemoteEncryption: Boolean;
+ function GetRemoteHost: TEDBString;
+ function GetRemotePing: Boolean;
+ function GetRemotePingInterval: Integer;
+ function GetRemotePort: Integer;
+ function GetRemoteService: TEDBString;
+ function GetRemoteTimeout: Integer;
+ function GetRemoteTrace: Boolean;
+ function GetSessionType: TEDBSessionType;
+ procedure SetForceBufferFlush(const Value: Boolean);
+ procedure SetKeepTablesOpen(const Value: Boolean);
+ procedure SetKeepConnections(const Value: Boolean);
+ procedure SetProgressTimeInterval(const Value: Integer);
+ procedure SetRecordChangeDetection(const Value: Boolean);
+ procedure SetRecordLockProtocol(const Value: TEDBRecordLockProtocol);
+ procedure SetRecordLockRetryCount(const Value: Integer);
+ procedure SetRecordLockWaitTime(const Value: Integer);
+ procedure SetRemoteAddress(const Value: TEDBString);
+ procedure SetRemoteCompression(const Value: Integer);
+ procedure SetRemoteEncryption(const Value: Boolean);
+ procedure SetRemoteHost(const Value: TEDBString);
+ procedure SetRemotePing(const Value: Boolean);
+ procedure SetRemotePingInterval(const Value: Integer);
+ procedure SetRemotePort(const Value: Integer);
+ procedure SetRemoteService(const Value: TEDBString);
+ procedure SetRemoteTimeout(const Value: Integer);
+ procedure SetRemoteTrace(const Value: Boolean);
+ procedure SetSessionType(const Value: TEDBSessionType);
+ property ForceBufferFlush: Boolean read GetForceBufferFlush write SetForceBufferFlush;
+ property KeepConnections: Boolean read GetKeepConnections write SetKeepConnections;
+ property KeepTablesOpen: Boolean read GetKeepTablesOpen write SetKeepTablesOpen;
+ property RecordLockProtocol: TEDBRecordLockProtocol read GetRecordLockProtocol write SetRecordLockProtocol;
+ property RecordLockRetryCount: Integer read GetRecordLockRetryCount write SetRecordLockRetryCount;
+ property RecordLockWaitTime: Integer read GetRecordLockWaitTime write SetRecordLockWaitTime;
+ property RecordChangeDetection: Boolean read GetRecordChangeDetection write SetRecordChangeDetection;
+ property ProgressTimeInterval: Integer read GetProgressTimeInterval write SetProgressTimeInterval;
+ property SessionType: TEDBSessionType read GetSessionType write SetSessionType;
+ property RemoteCompression: Integer read GetRemoteCompression write SetRemoteCompression;
+ property RemoteEncryption: Boolean read GetRemoteEncryption write SetRemoteEncryption;
+ property RemoteHost: TEDBString read GetRemoteHost write SetRemoteHost;
+ property RemoteAddress: TEDBString read GetRemoteAddress write SetRemoteAddress;
+ property RemotePort: Integer read GetRemotePort write SetRemotePort;
+ property RemoteService: TEDBString read GetRemoteService write SetRemoteService;
+ property RemoteTrace: Boolean read GetRemoteTrace write SetRemoteTrace;
+ property RemoteTimeout: Integer read GetRemoteTimeout write SetRemoteTimeout;
+ property RemotePing: Boolean read GetRemotePing write SetRemotePing;
+ property RemotePingInterval: Integer read GetRemotePingInterval write SetRemotePingInterval;
+ end;
+
+ { TDAEEDBConnection }
+ TDAEEDBConnection = class(TDAElevateDBConnection,IElevateDBEngine,IElevateDBSessionProperties)
+ private
+ FNativeSession: TEDBSession;
+ fNativeDatabase: TEDBDatabase;
+ FDataBasePath: String;
+ FDataBaseName: string;
+ function CreateConfigQuery: TDAEDataset;
+ protected
+ procedure CheckConnected; override;
+ function GetForceBufferFlush: Boolean;
+ function GetKeepConnections: Boolean;
+ function GetKeepTablesOpen: Boolean;
+ function GetProgressTimeInterval: Integer;
+ function GetRecordChangeDetection: Boolean;
+ function GetRecordLockProtocol: TEDBRecordLockProtocol;
+ function GetRecordLockRetryCount: Integer;
+ function GetRecordLockWaitTime: Integer;
+ function GetRemoteAddress: TEDBString;
+ function GetRemoteCompression: Integer;
+ function GetRemoteEncryption: Boolean;
+ function GetRemoteHost: TEDBString;
+ function GetRemotePing: Boolean;
+ function GetRemotePingInterval: Integer;
+ function GetRemotePort: Integer;
+ function GetRemoteService: TEDBString;
+ function GetRemoteTimeout: Integer;
+ function GetRemoteTrace: Boolean;
+ function GetSessionType: TEDBSessionType;
+ procedure SetForceBufferFlush(const Value: Boolean);
+ procedure SetKeepTablesOpen(const Value: Boolean);
+ procedure SetKeepConnections(const Value: Boolean);
+ procedure SetProgressTimeInterval(const Value: Integer);
+ procedure SetRecordChangeDetection(const Value: Boolean);
+ procedure SetRecordLockProtocol(const Value: TEDBRecordLockProtocol);
+ procedure SetRecordLockRetryCount(const Value: Integer);
+ procedure SetRecordLockWaitTime(const Value: Integer);
+ procedure SetRemoteAddress(const Value: TEDBString);
+ procedure SetRemoteCompression(const Value: Integer);
+ procedure SetRemoteEncryption(const Value: Boolean);
+ procedure SetRemoteHost(const Value: TEDBString);
+ procedure SetRemotePing(const Value: Boolean);
+ procedure SetRemotePingInterval(const Value: Integer);
+ procedure SetRemotePort(const Value: Integer);
+ procedure SetRemoteService(const Value: TEDBString);
+ procedure SetRemoteTimeout(const Value: Integer);
+ procedure SetRemoteTrace(const Value: Boolean);
+ procedure SetSessionType(const Value: TEDBSessionType);
+ protected
+ procedure SetConnected(Value: boolean); override; safecall;
+ function CreateCustomConnection: TCustomConnection; override;
+ //function CreateMacroProcessor: TDASQLMacroProcessor; override;
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+ // transaction support
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+
+ // procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ // procedure DoGetQueryFields(const aSQL: string; aParamsIfNeeded: TDAParamCollection; out Fields: TDAFieldCollection); override;
+ // procedure DoGetViewFields(const aViewName: string; out Fields: TDAFieldCollection); override;
+
+ // procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ // function DoGetLastAutoInc(const GeneratorName: string): integer; override;
+
+ { IDAConnection }
+ // UserID/Password
+ // function GetUserID: string; override; safecall;
+ // procedure SetUserID(const Value: string); override; safecall;
+ // function GetPassword: string; override; safecall;
+ // procedure SetPassword(const Value: string); override; safecall;
+
+ function GetSPSelectSyntax(HasArguments: Boolean): string; override; safecall;
+ // function GetQuoteChars: TDAQuoteCharArray; override; safecall;
+ // function IdentifierIsQuoted(const iIdentifier: string): boolean; override; safecall;
+ // function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; safecall;
+ // function QuoteIdentifierIfNeeded(const iIdentifier: string): string; override; safecall;
+ // function QuoteIdentifier(const iIdentifier: string): string; override; safecall;
+ // function QuoteFieldNameIfNeeded(const aTableName, aFieldName: string): string; override;safecall;
+ // function QuoteFieldName(const aTableName, aFieldName: string): string; override; safecall;
+
+ // function NewCommand(const Text: string; CommandType: TDASQLStatementType; const aCommandName: string = ''): IDASQLCommand; override; safecall;
+ // function NewDataset(const SQL: string; const aDatasetName: string = ''): IDADataset; override; safecall;
+ // function GetLastAutoInc(const GeneratorName: string = ''): integer; safecall;
+
+ // function isAlive: Boolean; override; safecall;
+ // function GetQueryBuilder: TDAQueryBuilder; override; safecall;
+
+ { IDAUseGenerators }
+ // function GetNextAutoinc(const GeneratorName: string): integer; safecall;
+ { IElevateDBEngine }
+ function EngineProperties: IElevateDBEngineProperties;
+ public
+ destructor Destroy; override;
+ end;
+
+ { TDAEElevDBQuery }
+ TDAEElevDBQuery = class(TDAEDataset, IDASQLCommand , IDAMustSetParams)
+ protected
+ // procedure PrepareSQLStatement; override;
+ procedure ClearParams; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure DoPrepare(Value: boolean); override; safecall;
+ function DoExecute: integer; override; safecall;
+ procedure DoSetSQL(const Value: string); override; safecall;
+ function DoGetSQL: string; override; safecall;
+ // function intVCLTypeToDAType(aFieldType: TFieldType): TDADataType;override;
+
+ { IDASQLCommand }
+ // procedure RefreshParams; override; safecall;
+ function Execute: integer; override; safecall;
+ // function DoGetRecordCount: integer; override;
+ // function DoGetActive: boolean; override;
+ // procedure DoSetActive(Value: boolean); override;
+ // function DoGetBOF: boolean; override;
+ // function DoGetEOF: boolean; override;
+ // procedure DoNext; override;
+ // function DoLocate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAEElevDBStoredProcedure }
+ TDAEElevDBStoredProcedure = class(TDAEStoredProcedure, IDAStoredProcedure , IDAMustSetParams)
+ protected
+ // IDAStoredProcedure
+ function GetStoredProcedureName: string; override; safecall;
+ procedure SetStoredProcedureName(const Name: string); override; safecall;
+
+ // procedure PrepareSQLStatement; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure DoPrepare(Value: boolean); override; safecall;
+ function DoExecute: integer; override; safecall;
+ procedure DoSetSQL(const Value: string); override; safecall;
+ function DoGetSQL: string; override; safecall;
+ // function intVCLTypeToDAType(aFieldType: TFieldType): TDADataType;override;
+
+ { IDASQLCommand }
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Execute: integer; override; safecall;
+ // function DoGetRecordCount: integer; override;
+ // function DoGetActive: boolean; override;
+ // procedure DoSetActive(Value: boolean); override;
+ // function DoGetBOF: boolean; override;
+ // function DoGetEOF: boolean; override;
+ // procedure DoNext; override;
+ // function DoLocate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses SysUtils, uDADriverManager, uDARes, Variants, uDAMacroProcessors,
+ Math, uDAHelpers, uROBinaryHelpers, Windows;
+
+var
+ _driver: TDAEDriver = nil;
+ gEngineProperties: TElevateDBEngineProperties;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAElevateDBDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEElevateDBDriver.Create(nil);
+ result := _driver;
+end;
+
+{ TDAEEDBConnection }
+
+procedure TDAEEDBConnection.DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+var
+ i: Integer;
+ sName, sValue: string;
+begin
+ inherited;
+ with aConnStrParser do begin
+ if (Self.UserID <> '') then
+ FNativeSession.LoginUser := Self.UserID
+ else
+ FNativeSession.LoginUser := UserID;
+
+ if (Self.Password <> '') then
+ FNativeSession.LoginPassword := Self.Password
+ else
+ FNativeSession.LoginPassword := Password;
+
+ Session.RemoteAddress := Server;
+// Engine.ConfigPath := Database;
+ FDataBasePath := Database;
+ FDataBaseName := '';
+ for i := 0 to AuxParamsCount - 1 do begin
+ sName := AuxParamNames[i];
+ if sName = '' then Continue;
+ sValue := AuxParams[AuxParamNames[i]];
+ // engine settings
+ if SameText(sName,'EngineType') then begin
+ if SameText(sValue,'etClient') then gEngineProperties.EngineType:=etClient
+ else if SameText(sValue,'etServer') then gEngineProperties.EngineType:=etServer;
+ end
+ else if SameText(sName,'Signature') then gEngineProperties.Signature := sValue
+ else if SameText(sName,'EncryptionPassword') then gEngineProperties.EncryptionPassword := sValue
+ else if SameText(sName,'LargeFileSupport') then gEngineProperties.LargeFileSupport := StrToBoolDef(sValue, gEngineProperties.LargeFileSupport)
+ else if SameText(sName,'LicensedSessions') then gEngineProperties.LicensedSessions := StrToIntDef(sValue, gEngineProperties.LicensedSessions)
+ else if SameText(sName,'ConfigPath') then gEngineProperties.ConfigPath := sValue
+ else if SameText(sName,'ConfigName') then gEngineProperties.ConfigName := sValue
+ else if SameText(sName,'ConfigExtension') then gEngineProperties.ConfigExtension := sValue
+ else if SameText(sName,'LockExtension') then gEngineProperties.LockExtension := sValue
+ else if SameText(sName,'LogExtension') then gEngineProperties.LogExtension := sValue
+ else if SameText(sName,'MaxLogFileSize') then gEngineProperties.MaxLogFileSize := StrToIntDef(sValue, gEngineProperties.MaxLogFileSize)
+ else if SameText(sName,'CatalogName') then gEngineProperties.CatalogName := sValue
+ else if SameText(sName,'CatalogExtension') then gEngineProperties.CatalogExtension := sValue
+ else if SameText(sName,'BackupExtension') then gEngineProperties.BackupExtension := sValue
+ else if SameText(sName,'TableExtension') then gEngineProperties.TableExtension := sValue
+ else if SameText(sName,'TableIndexExtension') then gEngineProperties.TableIndexExtension := sValue
+ else if SameText(sName,'TableBlobExtension') then gEngineProperties.TableBlobExtension := sValue
+ else if SameText(sName,'TempTablesPath') then gEngineProperties.TempTablesPath := sValue
+ else if SameText(sName,'ServerName') then gEngineProperties.ServerName := sValue
+ else if SameText(sName,'ServerDescription') then gEngineProperties.ServerDescription := sValue
+ else if SameText(sName,'ServerPort') then gEngineProperties.ServerPort := StrToIntDef(sValue, gEngineProperties.ServerPort)
+ else if SameText(sName,'ServerThreadCacheSize') then gEngineProperties.ServerThreadCacheSize := StrToIntDef(sValue, gEngineProperties.ServerThreadCacheSize)
+ else if SameText(sName,'ServerEncryptedOnly') then gEngineProperties.ServerEncryptedOnly := StrToBoolDef(sValue, gEngineProperties.ServerEncryptedOnly)
+ else if SameText(sName,'ServerSessionTimeout') then gEngineProperties.ServerSessionTimeout := StrToIntDef(sValue, gEngineProperties.ServerSessionTimeout)
+ else if SameText(sName,'ServerDeadSessionInterval') then gEngineProperties.ServerDeadSessionInterval := StrToIntDef(sValue, gEngineProperties.ServerDeadSessionInterval)
+ else if SameText(sName,'ServerDeadSessionExpiration') then gEngineProperties.ServerDeadSessionExpiration := StrToIntDef(sValue, gEngineProperties.ServerDeadSessionExpiration)
+ else if SameText(sName,'ServerMaxDeadSessions') then gEngineProperties.ServerMaxDeadSessions := StrToIntDef(sValue, gEngineProperties.ServerMaxDeadSessions)
+ else if SameText(sName,'ServerRunJobs') then gEngineProperties.ServerRunJobs := StrToBoolDef(sValue, gEngineProperties.ServerRunJobs)
+ else if SameText(sName,'ServerJobCategory') then gEngineProperties.ServerJobCategory := sValue
+ // session settings
+ else if SameText(sName,'ForceBufferFlush') then FNativeSession.ForceBufferFlush := StrToBoolDef(sValue, FNativeSession.ForceBufferFlush)
+ else if SameText(sName,'KeepConnections') then FNativeSession.KeepConnections := StrToBoolDef(sValue, FNativeSession.KeepConnections)
+ else if SameText(sName,'KeepTablesOpen') then FNativeSession.KeepTablesOpen := StrToBoolDef(sValue, FNativeSession.KeepTablesOpen)
+ else if SameText(sName,'RecordLockProtocol') then begin
+ if SameText(sValue,'lpPessimistic') then FNativeSession.RecordLockProtocol:=lpPessimistic
+ else if SameText(sValue,'lpOptimistic') then FNativeSession.RecordLockProtocol:=lpOptimistic;
+ end
+ else if SameText(sName,'RecordLockRetryCount') then FNativeSession.RecordLockRetryCount := StrToIntDef(sValue, fNativeSession.RecordLockRetryCount)
+ else if SameText(sName,'RecordLockWaitTime') then fNativeSession.RecordLockWaitTime := StrToIntDef(sValue, fNativeSession.RecordLockWaitTime)
+ else if SameText(sName,'RecordChangeDetection') then FNativeSession.RecordChangeDetection := StrToBoolDef(sValue, FNativeSession.RecordChangeDetection)
+ else if SameText(sName,'ProgressTimeInterval') then fNativeSession.ProgressTimeInterval := StrToIntDef(sValue, fNativeSession.ProgressTimeInterval)
+ else if SameText(sName,'SessionType') then begin
+ if SameText(sValue,'stLocal') then FNativeSession.SessionType:=stLocal
+ else if SameText(sValue,'stRemote') then FNativeSession.SessionType:=stRemote;
+ end
+ else if SameText(sName,'RemoteCompression') then fNativeSession.RemoteCompression := StrToIntDef(sValue, fNativeSession.RemoteCompression)
+ else if SameText(sName,'RemoteEncryption') then FNativeSession.RemoteEncryption := StrToBoolDef(sValue, FNativeSession.RemoteEncryption)
+ else if SameText(sName,'RemoteHost') then fNativeSession.RemoteHost := sValue
+ else if SameText(sName,'RemoteAddress') then fNativeSession.RemoteAddress := sValue
+ else if SameText(sName,'RemotePort') then fNativeSession.RemotePort := StrToIntDef(sValue, fNativeSession.RemotePort)
+ else if SameText(sName,'RemoteService') then fNativeSession.RemoteService := sValue
+ else if SameText(sName,'RemoteTrace') then FNativeSession.RemoteTrace := StrToBoolDef(sValue, FNativeSession.RemoteTrace)
+ else if SameText(sName,'RemoteTimeout') then fNativeSession.RemoteTimeout := StrToIntDef(sValue, fNativeSession.RemoteTimeout)
+ else if SameText(sName,'RemotePing') then FNativeSession.RemotePing := StrToBoolDef(sValue, FNativeSession.RemotePing)
+ else if SameText(sName,'RemotePingInterval') then fNativeSession.RemotePingInterval := StrToIntDef(sValue, fNativeSession.RemotePingInterval)
+ //
+ else if SameText(sName,'DataBaseName') then FDataBaseName:=sValue;
+ end;
+ fNativeDatabase.DatabaseName := FDataBaseName;
+ fNativeDatabase.Database := FDataBaseName;
+ if gEngineProperties.ConfigPath = '' then gEngineProperties.ConfigPath := '.';
+ end;
+end;
+
+function TDAEEDBConnection.DoBeginTransaction: integer;
+begin
+ CheckConnected;
+ fNativeDatabase.StartTransaction(EmptyEDBStringsArray);
+ Result := 0;
+end;
+
+procedure TDAEEDBConnection.DoCommitTransaction;
+begin
+ CheckConnected;
+ fNativeDatabase.Commit;
+end;
+
+function TDAEEDBConnection.CreateCustomConnection: TCustomConnection;
+begin
+ FNativeSession := TEDBSession.Create(nil);
+ FNativeSession.AutoSessionName:=True;
+ fNativeDatabase := TEDBDatabase.Create(nil);
+ fNativeDatabase.SessionName := FNativeSession.SessionName;
+ result := fNativeDatabase;
+end;
+
+function TDAEEDBConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEElevDBQuery;
+end;
+
+function TDAEEDBConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEElevDBStoredProcedure;
+end;
+
+procedure TDAEEDBConnection.DoRollbackTransaction;
+begin
+ CheckConnected;
+ fNativeDatabase.Rollback;
+end;
+
+function TDAEEDBConnection.DoGetInTransaction: boolean;
+begin
+ CheckConnected;
+ Result := fNativeDatabase.InTransaction;
+end;
+
+
+procedure TDAEEDBConnection.SetConnected(Value: boolean);
+begin
+ if (fNativeDatabase <> nil) then
+ if Value then begin
+ FNativeSession.Connected:=True;
+ ElevateDB_RegisterDatabase(CreateConfigQuery,fNativeDatabase.DatabaseName,FDataBasePath);
+ fNativeDatabase.Connected:=True;
+ end
+ else begin
+ fNativeDatabase.Connected:=False;
+ FNativeSession.Connected:=False;
+ end;
+end;
+
+procedure TDAEEDBConnection.CheckConnected;
+begin
+ if not fNativeDatabase.Connected then SetConnected(True);
+end;
+
+destructor TDAEEDBConnection.Destroy;
+begin
+ FNativeSession.Free;
+ if Engine.SessionCount = 0 then Engine.Active:=False;
+ inherited;
+end;
+
+function TDAEEDBConnection.CreateConfigQuery: TDAEDataset;
+begin
+ Result:= GetDatasetClass.Create(Self);
+ TEDBQuery(TDAEElevDBQuery(Result).Dataset).DatabaseName := ElevateDB_ConfigDBName;
+end;
+
+function TDAEEDBConnection.EngineProperties: IElevateDBEngineProperties;
+begin
+ Result:= gEngineProperties;
+end;
+
+function TDAEEDBConnection.GetForceBufferFlush: Boolean;
+begin
+ Result := FNativeSession.ForceBufferFlush;
+end;
+
+function TDAEEDBConnection.GetKeepConnections: Boolean;
+begin
+ Result := FNativeSession.KeepConnections;
+end;
+
+function TDAEEDBConnection.GetKeepTablesOpen: Boolean;
+begin
+ Result := FNativeSession.KeepTablesOpen;
+end;
+
+function TDAEEDBConnection.GetProgressTimeInterval: Integer;
+begin
+ Result := FNativeSession.ProgressTimeInterval;
+end;
+
+function TDAEEDBConnection.GetRecordChangeDetection: Boolean;
+begin
+ Result := FNativeSession.RecordChangeDetection;
+end;
+
+function TDAEEDBConnection.GetRecordLockProtocol: TEDBRecordLockProtocol;
+begin
+ Result := FNativeSession.RecordLockProtocol;
+end;
+
+function TDAEEDBConnection.GetRecordLockRetryCount: Integer;
+begin
+ Result := FNativeSession.RecordLockRetryCount;
+end;
+
+function TDAEEDBConnection.GetRecordLockWaitTime: Integer;
+begin
+ Result := FNativeSession.RecordLockWaitTime;
+end;
+
+function TDAEEDBConnection.GetRemoteAddress: TEDBString;
+begin
+ Result := FNativeSession.RemoteAddress;
+end;
+
+function TDAEEDBConnection.GetRemoteCompression: Integer;
+begin
+ Result := FNativeSession.RemoteCompression;
+end;
+
+function TDAEEDBConnection.GetRemoteEncryption: Boolean;
+begin
+ Result := FNativeSession.RemoteEncryption;
+end;
+
+function TDAEEDBConnection.GetRemoteHost: TEDBString;
+begin
+ Result := FNativeSession.RemoteHost;
+end;
+
+function TDAEEDBConnection.GetRemotePing: Boolean;
+begin
+ Result := FNativeSession.RemotePing;
+end;
+
+function TDAEEDBConnection.GetRemotePingInterval: Integer;
+begin
+ Result := FNativeSession.RemotePingInterval;
+end;
+
+function TDAEEDBConnection.GetRemotePort: Integer;
+begin
+ Result := FNativeSession.RemotePort;
+end;
+
+function TDAEEDBConnection.GetRemoteService: TEDBString;
+begin
+ Result := FNativeSession.RemoteService;
+end;
+
+function TDAEEDBConnection.GetRemoteTimeout: Integer;
+begin
+ Result := FNativeSession.RemoteTimeout;
+end;
+
+function TDAEEDBConnection.GetRemoteTrace: Boolean;
+begin
+ Result := FNativeSession.RemoteTrace;
+end;
+
+function TDAEEDBConnection.GetSessionType: TEDBSessionType;
+begin
+ Result := FNativeSession.SessionType;
+end;
+
+procedure TDAEEDBConnection.SetForceBufferFlush(const Value: Boolean);
+begin
+ FNativeSession.ForceBufferFlush := Value;
+end;
+
+procedure TDAEEDBConnection.SetKeepConnections(const Value: Boolean);
+begin
+ FNativeSession.KeepConnections := Value;
+end;
+
+procedure TDAEEDBConnection.SetKeepTablesOpen(const Value: Boolean);
+begin
+ FNativeSession.KeepTablesOpen := Value;
+end;
+
+procedure TDAEEDBConnection.SetProgressTimeInterval(const Value: Integer);
+begin
+ FNativeSession.ProgressTimeInterval := Value;
+end;
+
+procedure TDAEEDBConnection.SetRecordChangeDetection(const Value: Boolean);
+begin
+ FNativeSession.RecordChangeDetection := Value;
+end;
+
+procedure TDAEEDBConnection.SetRecordLockProtocol(
+ const Value: TEDBRecordLockProtocol);
+begin
+ FNativeSession.RecordLockProtocol := Value;
+end;
+
+procedure TDAEEDBConnection.SetRecordLockRetryCount(const Value: Integer);
+begin
+ FNativeSession.RecordLockRetryCount := Value;
+end;
+
+procedure TDAEEDBConnection.SetRecordLockWaitTime(const Value: Integer);
+begin
+ FNativeSession.RecordLockWaitTime := Value;
+end;
+
+procedure TDAEEDBConnection.SetRemoteAddress(const Value: TEDBString);
+begin
+ FNativeSession.RemoteAddress := Value;
+end;
+
+procedure TDAEEDBConnection.SetRemoteCompression(const Value: Integer);
+begin
+ FNativeSession.RemoteCompression := Value;
+end;
+
+procedure TDAEEDBConnection.SetRemoteEncryption(const Value: Boolean);
+begin
+ FNativeSession.RemoteEncryption := Value;
+end;
+
+procedure TDAEEDBConnection.SetRemoteHost(const Value: TEDBString);
+begin
+ FNativeSession.RemoteHost := Value;
+end;
+
+procedure TDAEEDBConnection.SetRemotePing(const Value: Boolean);
+begin
+ FNativeSession.RemotePing := Value;
+end;
+
+procedure TDAEEDBConnection.SetRemotePingInterval(const Value: Integer);
+begin
+ FNativeSession.RemotePingInterval := Value;
+end;
+
+procedure TDAEEDBConnection.SetRemotePort(const Value: Integer);
+begin
+ FNativeSession.RemotePort := Value;
+end;
+
+procedure TDAEEDBConnection.SetRemoteService(const Value: TEDBString);
+begin
+ FNativeSession.RemoteService := Value;
+end;
+
+procedure TDAEEDBConnection.SetRemoteTimeout(const Value: Integer);
+begin
+ FNativeSession.RemoteTimeout := Value;
+end;
+
+procedure TDAEEDBConnection.SetRemoteTrace(const Value: Boolean);
+begin
+ FNativeSession.RemoteTrace := Value;
+end;
+
+procedure TDAEEDBConnection.SetSessionType(const Value: TEDBSessionType);
+begin
+ FNativeSession.SessionType := Value;
+end;
+
+function TDAEEDBConnection.GetSPSelectSyntax(
+ HasArguments: Boolean): string;
+begin
+ Result:= ''; // not supported!
+end;
+
+{ TDAEElevateDBDriver }
+
+procedure TDAEElevateDBDriver.GetAuxDrivers(out List: IROStrings);
+begin
+ inherited;
+ // List.Add('Driver1');
+ // List.Add('Driver2');
+end;
+
+procedure TDAEElevateDBDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ List.Add('DataBaseName=');
+ List.Add('ForceBufferFlush=(True,False)');
+ List.Add('KeepConnections=(True,False)');
+ List.Add('KeepTablesOpen=(True,False)');
+ List.Add('RecordLockProtocol=(lpPessimistic,lpOptimistic)');
+ List.Add('RecordLockRetryCount=');
+ List.Add('RecordLockWaitTime=');
+ List.Add('RecordChangeDetection=(True,False)');
+ List.Add('ProgressTimeInterval=');
+ List.Add('SessionType=(stLocal,stRemote)');
+ List.Add('RemoteCompression=');
+ List.Add('RemoteEncryption=(True,False)');
+ List.Add('RemoteHost=');
+ List.Add('RemoteAddress=');
+ List.Add('RemotePort=');
+ List.Add('RemoteService=');
+ List.Add('RemoteTrace=(True,False)');
+ List.Add('RemoteTimeout=');
+ List.Add('RemotePing=(True,False)');
+ List.Add('RemotePingInterval=');
+ List.Add('');
+ List.Add('=== Global Engine Options ===');
+ List.Add('EngineType=(etClient,etServer)');
+ List.Add('Signature=');
+ List.Add('EncryptionPassword=');
+ List.Add('LargeFileSupport=(True,False)');
+ List.Add('LicensedSessions=');
+ List.Add('ConfigPath=');
+ List.Add('ConfigName=');
+ List.Add('ConfigExtension=');
+ List.Add('LockExtension=');
+ List.Add('LogExtension=');
+ List.Add('MaxLogFileSize=');
+ List.Add('CatalogName=');
+ List.Add('CatalogExtension=');
+ List.Add('BackupExtension=');
+ List.Add('TableExtension=');
+ List.Add('TableIndexExtension=');
+ List.Add('TableBlobExtension=');
+ List.Add('TempTablesPath=');
+ List.Add('ServerName=');
+ List.Add('ServerDescription=');
+ List.Add('ServerPort=');
+ List.Add('ServerThreadCacheSize=');
+ List.Add('ServerEncryptedOnly=(True,False)');
+ List.Add('ServerSessionTimeout=');
+ List.Add('ServerDeadSessionInterval=');
+ List.Add('ServerDeadSessionExpiration=');
+ List.Add('ServerMaxDeadSessions=');
+ List.Add('ServerRunJobs=(True,False)');
+ List.Add('ServerJobCategory=');
+end;
+
+function TDAEElevateDBDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ Result:=[doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+function TDAEElevateDBDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEEDBConnection;
+end;
+
+
+function TDAEElevateDBDriver.GetDescription: string;
+begin
+ result := 'ElevateDB Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEElevateDBDriver.GetDriverID: string;
+begin
+ result := 'ElevateDB';
+end;
+
+function TDAEElevateDBDriver.GetProviderDefaultCustomParameters(
+ Provider: string): string;
+begin
+ Result:='DataBaseName=';
+end;
+
+{ TDAEElevDBQuery }
+
+procedure TDAEElevDBQuery.ClearParams;
+begin
+ inherited;
+ TEDBQuery(Dataset).Params.Clear;
+end;
+
+function TDAEElevDBQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ Result := TEDBQuery.Create(nil);
+ TEDBQuery(Result).SessionName := TDAEEDBConnection(aConnection).fNativeDatabase.SessionName;
+ TEDBQuery(Result).DatabaseName := TDAEEDBConnection(aConnection).fNativeDatabase.DatabaseName;
+end;
+
+function TDAEElevDBQuery.DoExecute: integer;
+begin
+ TEDBQuery(Dataset).ExecSQL;
+ Result:=TEDBQuery(Dataset).RowsAffected;
+end;
+
+function TDAEElevDBQuery.DoGetSQL: string;
+begin
+ Result := TEDBQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEElevDBQuery.DoPrepare(Value: boolean);
+begin
+//nothing
+ TEDBQuery(Dataset).Prepared:= Value;
+end;
+
+procedure TDAEElevDBQuery.DoSetSQL(const Value: string);
+begin
+ TEDBQuery(Dataset).SQL.Text := Value;
+end;
+
+function TDAEElevDBQuery.Execute: integer;
+begin
+ SetParamValues(GetParams);
+ Result:= DoExecute;
+ GetParamValues(GetParams);
+end;
+
+procedure TDAEElevDBQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TEDBQuery(Dataset).Params);
+end;
+
+procedure TDAEElevDBQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TEDBQuery(Dataset).Params);
+end;
+
+{ TDAEElevDBStoredProcedure }
+
+function TDAEElevDBStoredProcedure.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TEDBStoredProc.Create(nil);
+ TEDBStoredProc(Result).SessionName := TDAEEDBConnection(aConnection).fNativeDatabase.SessionName;
+ TEDBStoredProc(Result).DatabaseName := TDAEEDBConnection(aConnection).fNativeDatabase.DatabaseName;
+end;
+
+function TDAEElevDBStoredProcedure.Execute: integer;
+begin
+ TEDBStoredProc(Dataset).Prepare;
+ SetParamValues(GetParams);
+ Result:= DoExecute;
+ //Result:=TEDBStoredProc(Dataset).RecordCount;
+ GetParamValues(GetParams);
+end;
+
+function TDAEElevDBStoredProcedure.DoGetSQL: string;
+begin
+ Result := '';
+end;
+
+procedure TDAEElevDBStoredProcedure.DoPrepare(Value: boolean);
+begin
+ TEDBStoredProc(Dataset).Prepared:=Value;
+end;
+
+procedure TDAEElevDBStoredProcedure.DoSetSQL(const Value: string);
+begin
+ //
+end;
+
+procedure TDAEElevDBStoredProcedure.GetParamValues(
+ AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TEDBStoredProc(Dataset).Params);
+end;
+
+function TDAEElevDBStoredProcedure.GetStoredProcedureName: string;
+begin
+ Result := TEDBStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEElevDBStoredProcedure.RefreshParams;
+var
+ lField: TField;
+ i: integer;
+ par: TDAParam;
+begin
+ DoPrepare(False);
+ DoPrepare(True);
+ RefreshParamsStd(TEDBStoredProc(Dataset).Params);
+ For i:=0 to TEDBStoredProc(Dataset).FieldCount-1 do begin
+ par := GetParams.Add;
+ lField:=TEDBStoredProc(Dataset).Fields[i];
+ par.Name := lField.Name;
+ par.DataType := intVCLTypeToDAType(lField.DataType,lField.Size);
+ par.ParamType := daptOutput;
+ par.Size := lField.Size;
+ end;
+end;
+
+procedure TDAEElevDBStoredProcedure.SetParamValues(
+ AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TEDBStoredProc(Dataset).Params);
+end;
+
+procedure TDAEElevDBStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TEDBStoredProc(Dataset).StoredProcName := Name;
+end;
+
+function TDAEElevDBStoredProcedure.DoExecute: integer;
+begin
+ TEDBStoredProc(Dataset).ExecProc;
+ Result:=0;
+end;
+
+{ TElevateDBEngineProperties }
+
+function TElevateDBEngineProperties.GetBackupExtension: TEDBString;
+begin
+ Result := edbcomps.Engine.BackupExtension;
+end;
+
+function TElevateDBEngineProperties.GetCatalogExtension: TEDBString;
+begin
+ Result := edbcomps.Engine.CatalogExtension;
+end;
+
+function TElevateDBEngineProperties.GetCatalogName: TEDBString;
+begin
+ Result := edbcomps.Engine.CatalogName;
+end;
+
+function TElevateDBEngineProperties.GetConfigExtension: TEDBString;
+begin
+ Result := edbcomps.Engine.ConfigExtension;
+end;
+
+function TElevateDBEngineProperties.GetConfigName: TEDBString;
+begin
+ Result := edbcomps.Engine.ConfigName;
+end;
+
+function TElevateDBEngineProperties.GetConfigPath: TEDBString;
+begin
+ Result := edbcomps.Engine.ConfigPath;
+end;
+
+function TElevateDBEngineProperties.GetEncryptionPassword: TEDBString;
+begin
+ Result := edbcomps.Engine.EncryptionPassword;
+end;
+
+function TElevateDBEngineProperties.GetEngineType: TEDBEngineType;
+begin
+ Result := edbcomps.Engine.EngineType;
+end;
+
+function TElevateDBEngineProperties.GetLargeFileSupport: Boolean;
+begin
+ Result := edbcomps.Engine.LargeFileSupport;
+end;
+
+function TElevateDBEngineProperties.GetLicensedSessions: Integer;
+begin
+ Result := edbcomps.Engine.LicensedSessions;
+end;
+
+function TElevateDBEngineProperties.GetLockExtension: TEDBString;
+begin
+ Result := edbcomps.Engine.LockExtension;
+end;
+
+function TElevateDBEngineProperties.GetLogCategories: TEDBLogCategories;
+begin
+ Result := edbcomps.Engine.LogCategories;
+end;
+
+function TElevateDBEngineProperties.GetLogExtension: TEDBString;
+begin
+ Result := edbcomps.Engine.LogExtension;
+end;
+
+function TElevateDBEngineProperties.GetMaxLogFileSize: Integer;
+begin
+ Result := edbcomps.Engine.MaxLogFileSize;
+end;
+
+function TElevateDBEngineProperties.GetServerAddress: TEDBString;
+begin
+ Result := edbcomps.Engine.ServerAddress;
+end;
+
+function TElevateDBEngineProperties.GetServerAuthorizedAddresses: TEDBStrings;
+begin
+ Result := edbcomps.Engine.ServerAuthorizedAddresses;
+end;
+
+function TElevateDBEngineProperties.GetServerBlockedAddresses: TEDBStrings;
+begin
+ Result := edbcomps.Engine.ServerBlockedAddresses;
+end;
+
+function TElevateDBEngineProperties.GetServerDeadSessionExpiration: Integer;
+begin
+ Result := edbcomps.Engine.ServerDeadSessionExpiration;
+end;
+
+function TElevateDBEngineProperties.GetServerDeadSessionInterval: Integer;
+begin
+ Result := edbcomps.Engine.ServerDeadSessionInterval;
+end;
+
+function TElevateDBEngineProperties.GetServerDescription: TEDBString;
+begin
+ Result := edbcomps.Engine.ServerDescription;
+end;
+
+function TElevateDBEngineProperties.GetServerEncryptedOnly: Boolean;
+begin
+ Result := edbcomps.Engine.ServerEncryptedOnly;
+end;
+
+function TElevateDBEngineProperties.GetServerJobCategory: TEDBString;
+begin
+ Result := edbcomps.Engine.ServerJobCategory;
+end;
+
+function TElevateDBEngineProperties.GetServerMaxDeadSessions: Integer;
+begin
+ Result := edbcomps.Engine.ServerMaxDeadSessions;
+end;
+
+function TElevateDBEngineProperties.GetServerName: TEDBString;
+begin
+ Result := edbcomps.Engine.ServerName;
+end;
+
+function TElevateDBEngineProperties.GetServerPort: Integer;
+begin
+ Result := edbcomps.Engine.ServerPort;
+end;
+
+function TElevateDBEngineProperties.GetServerRunJobs: Boolean;
+begin
+ Result := edbcomps.Engine.ServerRunJobs;
+end;
+
+function TElevateDBEngineProperties.GetServerSessionTimeout: Integer;
+begin
+ Result := edbcomps.Engine.ServerSessionTimeout;
+end;
+
+function TElevateDBEngineProperties.GetServerThreadCacheSize: Integer;
+begin
+ Result := edbcomps.Engine.ServerThreadCacheSize;
+end;
+
+function TElevateDBEngineProperties.GetSignature: TEDBString;
+begin
+ Result := edbcomps.Engine.Signature;
+end;
+
+function TElevateDBEngineProperties.GetTableBlobExtension: TEDBString;
+begin
+ Result := edbcomps.Engine.TableBlobExtension;
+end;
+
+function TElevateDBEngineProperties.GetTableExtension: TEDBString;
+begin
+ Result := edbcomps.Engine.TableExtension;
+end;
+
+function TElevateDBEngineProperties.GetTableIndexExtension: TEDBString;
+begin
+ Result := edbcomps.Engine.TableIndexExtension;
+end;
+
+function TElevateDBEngineProperties.GetTempTablesPathProperty: TEDBString;
+begin
+ Result := edbcomps.Engine.TempTablesPath;
+end;
+
+procedure TElevateDBEngineProperties.SetBackupExtension(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.BackupExtension := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetCatalogExtension(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.CatalogExtension := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetCatalogName(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.CatalogName := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetConfigExtension(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.ConfigExtension := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetConfigName(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.ConfigName := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetConfigPath(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.ConfigPath := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetEncryptionPassword(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.EncryptionPassword := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetEngineType(
+ const Value: TEDBEngineType);
+begin
+ edbcomps.Engine.EngineType := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetLargeFileSupport(
+ const Value: Boolean);
+begin
+ edbcomps.Engine.LargeFileSupport := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetLicensedSessions(
+ const Value: Integer);
+begin
+ edbcomps.Engine.LicensedSessions := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetLockExtension(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.LockExtension := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetLogCategories(
+ const Value: TEDBLogCategories);
+begin
+ edbcomps.Engine.LogCategories := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetLogExtension(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.LogExtension := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetMaxLogFileSize(
+ const Value: Integer);
+begin
+ edbcomps.Engine.MaxLogFileSize := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerAddress(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.ServerAddress := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerAuthorizedAddresses(
+ const Value: TEDBStrings);
+begin
+ edbcomps.Engine.ServerAuthorizedAddresses := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerBlockedAddresses(
+ const Value: TEDBStrings);
+begin
+ edbcomps.Engine.ServerBlockedAddresses := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerDeadSessionExpiration(
+ const Value: Integer);
+begin
+ edbcomps.Engine.ServerDeadSessionExpiration := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerDeadSessionInterval(
+ const Value: Integer);
+begin
+ edbcomps.Engine.ServerDeadSessionInterval := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerDescription(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.ServerDescription := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerEncryptedOnly(
+ const Value: Boolean);
+begin
+ edbcomps.Engine.ServerEncryptedOnly := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerJobCategory(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.ServerJobCategory := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerMaxDeadSessions(
+ const Value: Integer);
+begin
+ edbcomps.Engine.ServerMaxDeadSessions := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerName(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.ServerName := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerPort(const Value: Integer);
+begin
+ edbcomps.Engine.ServerPort := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerRunJobs(
+ const Value: Boolean);
+begin
+ edbcomps.Engine.ServerRunJobs := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerSessionTimeout(
+ const Value: Integer);
+begin
+ edbcomps.Engine.ServerSessionTimeout := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetServerThreadCacheSize(
+ const Value: Integer);
+begin
+ edbcomps.Engine.ServerThreadCacheSize := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetSignature(const Value: TEDBString);
+begin
+ edbcomps.Engine.Signature := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetTableBlobExtension(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.TableBlobExtension := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetTableExtension(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.TableExtension := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetTableIndexExtension(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.TableIndexExtension := Value;
+end;
+
+procedure TElevateDBEngineProperties.SetTempTablesPath(
+ const Value: TEDBString);
+begin
+ edbcomps.Engine.TempTablesPath := Value;
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+ gEngineProperties := TElevateDBEngineProperties.Create;
+finalization
+ gEngineProperties := nil;
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAFIBDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAFIBDriver.pas
new file mode 100644
index 0000000..d596d87
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAFIBDriver.pas
@@ -0,0 +1,682 @@
+unit uDAFIBDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_FIBDriver_Glyphs.res}
+
+{.$DEFINE MANUAL_STARTTRANSACTION}
+interface
+
+uses
+ Classes, DB, uDAEngine, uDAInterfaces, uDAIBInterfaces, FIBDatabase,
+ uROClasses, pFIBDatabase, FIBQuery, pFIBQuery, pFIBStoredProc, uDAUtils,
+ FIBDataSet, ibase, FIBSQLMonitor;
+
+type
+ { TDAFIBDriver }
+ TDAFIBDriver = class(TDADriverReference)
+ end;
+
+ { TFIBConnection }
+ TFIBConnection = class(TDAConnectionWrapper)
+ private
+ fDatabase: TpFIBDatabase;
+ fTransaction: TFIBTransaction;
+
+ protected
+ function GetConnected: Boolean; override;
+ procedure SetConnected(Value: boolean); override;
+
+ public
+ constructor Create(AOwner: TComponent); override;
+
+ property Database: TpFIBDatabase read fDatabase;
+ property Transaction: TFIBTransaction read fTransaction;
+ end;
+
+ { TDAEFIBDriver }
+ TDAEFIBDriver = class(TDAIBDriver)
+ private
+ fFIBTraceOptions: TFIBTraceFlags;
+ fTraceCallback: TDALogTraceEvent;
+ fMonitor: TFIBSQLMonitor;
+ procedure OnTrace(EventText: string; EventTime: TDateTime);
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ procedure CustomizeConnectionObject(aConnection: TDAEConnection); override;
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent); override;
+
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+ public
+ end;
+
+ { TDAEFIBConnection }
+ TDAEFIBConnection = class(TDAIBConnection, IDAInterbaseConnection, IDAIBTransactionAccess, IDAIBConnectionProperties, IDAUseGenerators, IDAFileBasedDatabase)
+ private
+ fConnection: TFIBConnection;
+ procedure IntOpen;
+ protected
+
+ // IIBTransactionAccess
+ function GetTransaction: TObject; safecall;
+
+ procedure Commit; safecall;
+ procedure CommitRetaining; safecall;
+ procedure Rollback; safecall;
+ procedure RollbackRetaining; safecall;
+
+ // IIBConnectionProperties
+ function GetRole: string; safecall;
+ procedure SetRole(const Value: string); safecall;
+ function GetSQLDialect: integer; override; safecall;
+ procedure SetSQLDialect(Value: integer); safecall;
+ function GetCharset: string; safecall;
+ procedure SetCharset(const Value: string); safecall;
+
+ // IDAConnection
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+ public
+ end;
+
+ { TDAEFIBQuery }
+ TDAEFIBQuery = class(TDAEDataset, IDAMustSetParams)
+ private
+ protected
+ function DoGetRecordCount: integer; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: boolean); override;
+ procedure RefreshParams; override;
+ procedure DoSetActive(Value: Boolean); override;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAEFIBStoredProcedure }
+ TDAEFIBStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ private
+ FSP: TpFIBStoredProc;
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoExecute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Execute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses SysUtils, uDADriverManager, uDARes,
+ pFIBProps;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAFIBDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEFIBDriver.Create(nil);
+ result := _driver;
+end;
+
+
+{ TFIBConnection }
+
+constructor TFIBConnection.Create(AOwner: TComponent);
+begin
+ inherited;
+
+ fDatabase := TpFIBDatabase.Create(Self);
+ fTransaction := TFIBTransaction.Create(Self);
+
+ fDatabase.UseLoginPrompt := FALSE;
+ fDatabase.DefaultTransaction := fTransaction;
+end;
+
+function TFIBConnection.GetConnected: Boolean;
+begin
+ result := fDatabase.Connected
+end;
+
+procedure TFIBConnection.SetConnected(Value: boolean);
+begin
+ // This first check is required.
+ // I think there's a bug in the FIB destroying sequence and the notification. TCustomConnection gets to this point *after*
+ // the owned components are destroyed. Only happens with FIB...
+
+ if (csDestroying in ComponentState) then Exit;
+ fDatabase.Connected := Value
+end;
+
+{ TDAEFIBConnection }
+
+procedure TDAEFIBConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+begin
+ inherited;
+
+ fConnection.Database.SQLDialect := 3;
+ with aConnStrParser do begin
+ if (Self.UserID <> '') then
+ fConnection.Database.ConnectParams.UserName := Self.UserID
+ else
+ fConnection.Database.ConnectParams.UserName := UserID;
+
+ if (Self.Password <> '') then
+ fConnection.Database.ConnectParams.Password := Self.Password
+ else
+ fConnection.Database.ConnectParams.Password := Password;
+
+ if Server <> '' then
+ fConnection.Database.DatabaseName := Server + ':' + Database
+ else
+ fConnection.Database.DatabaseName := Database;
+
+ if AuxParams['Dialect'] <> '' then
+ fConnection.Database.SQLDialect := StrtoInt(AuxParams['Dialect'])
+ else if AuxParams['SQLDialect'] <> '' then
+ fConnection.Database.SQLDialect := StrtoInt(AuxParams['SQLDialect']);
+
+ if AuxParams['Role'] <> '' then
+ fConnection.Database.ConnectParams.RoleName := AuxParams['Role'];
+
+ if AuxParams['Charset'] <> '' then
+ SetCharset(AuxParams['Charset']);
+
+ end;
+end;
+
+function TDAEFIBConnection.DoBeginTransaction: integer;
+begin
+ result := -1;
+ fConnection.Database.DefaultTransaction.StartTransaction;
+end;
+
+procedure TDAEFIBConnection.DoCommitTransaction;
+begin
+ fConnection.Database.DefaultTransaction.Commit;
+end;
+
+function TDAEFIBConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fConnection := TFIBConnection.Create(nil);
+ result := fConnection;
+end;
+
+function TDAEFIBConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEFIBQuery
+end;
+
+function TDAEFIBConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEFIBStoredProcedure
+end;
+
+function TDAEFIBConnection.GetTransaction: TObject;
+begin
+ result := fConnection.fTransaction;
+end;
+
+procedure TDAEFIBConnection.DoRollbackTransaction;
+begin
+ fConnection.Database.DefaultTransaction.Rollback;
+end;
+
+function TDAEFIBConnection.GetRole: string;
+begin
+ result := fConnection.Database.ConnectParams.RoleName;
+end;
+
+function TDAEFIBConnection.GetSQLDialect: integer;
+begin
+ result := fConnection.Database.SQLDialect
+end;
+
+function TDAEFIBConnection.GetCharset: string;
+begin
+ result := fConnection.Database.ConnectParams.CharSet
+end;
+
+procedure TDAEFIBConnection.SetRole(const Value: string);
+begin
+ fConnection.Database.ConnectParams.RoleName := Value
+end;
+
+procedure TDAEFIBConnection.SetSQLDialect(Value: integer);
+begin
+ fConnection.Database.SQLDialect := Value
+end;
+
+procedure TDAEFIBConnection.SetCharset(const Value: string);
+begin
+ fConnection.Database.ConnectParams.CharSet := Value;
+end;
+
+procedure TDAEFIBConnection.Commit;
+begin
+ fConnection.fTransaction.Commit
+end;
+
+procedure TDAEFIBConnection.CommitRetaining;
+begin
+ fConnection.fTransaction.CommitRetaining
+end;
+
+procedure TDAEFIBConnection.Rollback;
+begin
+ fConnection.fTransaction.Rollback
+end;
+
+procedure TDAEFIBConnection.RollbackRetaining;
+begin
+ fConnection.fTransaction.RollbackRetaining
+end;
+
+function TDAEFIBConnection.DoGetInTransaction: boolean;
+begin
+ result := fConnection.fTransaction.InTransaction
+end;
+
+procedure TDAEFIBConnection.IntOpen;
+begin
+ {$IFNDEF MANUAL_STARTTRANSACTION}
+ if not fConnection.Connected then fConnection.Open;
+ if not fConnection.Transaction.InTransaction then fConnection.Transaction.StartTransaction;
+ {$ENDIF}
+end;
+
+{ TDAEFIBDriver }
+
+procedure TDAEFIBDriver.CustomizeConnectionObject(aConnection: TDAEConnection);
+begin
+ // 25/04/06 13:05 Donald Shimoda . To do.
+ //TDAEFIBConnection(aConnection).fConnection.Database.TraceFlags := fIBTraceOptions;
+end;
+
+procedure TDAEFIBDriver.DoSetTraceOptions(TraceActive: boolean;
+ TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent);
+begin
+ inherited;
+
+ if TraceActive then begin
+ if (fMonitor = nil) then fMonitor := TFIBSQLMonitor.Create(Self);
+
+ fMonitor.Active := False;
+ fMonitor.OnSQL := OnTrace;
+
+ fFIBTraceOptions := [];
+ if (toPrepare in TraceOptions) then fFIBTraceOptions := fFIBTraceOptions + [tfQPrepare];
+ if (toExecute in TraceOptions) then fFIBTraceOptions := fFIBTraceOptions + [tfQExecute];
+ if (toFetch in TraceOptions) then fFIBTraceOptions := fFIBTraceOptions + [tfQFetch];
+ if (toConnect in TraceOptions) then fFIBTraceOptions := fFIBTraceOptions + [tfConnect];
+ if (toTransact in TraceOptions) then fFIBTraceOptions := fFIBTraceOptions + [tfTransact];
+ if (toService in TraceOptions) then fFIBTraceOptions := fFIBTraceOptions + [tfService];
+ if (toMisc in TraceOptions) then fFIBTraceOptions := fFIBTraceOptions + [tfMisc];
+
+ fTraceCallBack := Callback;
+
+ fMonitor.TraceFlags := fFIBTraceOptions;
+ fMonitor.Active := True;
+ end
+ else begin
+ FreeAndNIL(fMonitor);
+ fTraceCallback := nil;
+ end;
+end;
+
+
+function TDAEFIBDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEFIBConnection;
+end;
+
+function TDAEFIBDriver.GetDescription: string;
+begin
+ result := 'FIBPlus Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEFIBDriver.GetDriverID: string;
+begin
+ result := 'FIB';
+end;
+
+procedure CreateParams(FQuery: TFIBQuery; Pars: TDAParamCollection; CreateOutputParams: Boolean = False);
+var
+ i: Integer;
+ par: TDAParam;
+ sqPar: TFIBXSQLVAR;
+begin
+ if FQuery.Database.Handle = nil then
+ FQuery.Database.Open;
+
+ if not FQuery.Prepared then
+ FQuery.Prepare;
+ pars.Clear;
+ for i := 0 to FQuery.ParamCount -1 do begin
+ sqpar := FQuery.Params[i];
+ if sqpar.IsParam then begin
+ par := pars.Add;
+ par.Name := sqPar.Name;
+ par.ParamType:= daptInput;
+ case sqpar.SQLType and not 1 of
+ SQL_VARYING, SQL_TEXT:
+ begin
+ if sqPar.CharacterSet = 'UNICODE_FSS' then
+ par.DataType := datWideString
+ else
+ par.DataType := datString;
+ par.Size := sqPar.Size;
+ end;
+ SQL_DOUBLE, SQL_FLOAT,SQL_D_FLOAT:par.DataType := datFloat;
+ SQL_SHORT, SQL_LONG: begin
+ if sqPar.Scale <> 0 then
+ par.DataType := datFloat
+ else
+ par.DataType := datInteger;
+ end;
+ SQL_INT64: begin
+ if sqPar.Scale <> 0 then
+ par.DataType := datFloat
+ else
+ par.DataType := datLargeInt;
+ end;
+ SQL_TIMESTAMP,
+ SQL_TYPE_TIME,
+ SQL_TYPE_DATE: par.DataType := datDateTime;
+ SQL_BLOB:
+ if sqPar.SQLSubtype = 1 then
+ par.DataType := datMemo
+ else
+ par.DataType := datBlob;
+ SQL_BOOLEAN: par.DataType := datBoolean;
+ else
+ par.DataType := datUnknown;
+ end;
+ end;
+ end;
+
+ if CreateOutputParams then
+ for i := 0 to FQuery.FieldCount -1 do begin
+ sqpar := FQuery.Fields[i];
+ par := pars.Add;
+ par.Name := sqPar.Name;
+ par.ParamType:= daptOutput;
+ case sqpar.SQLType and not 1 of
+ SQL_VARYING, SQL_TEXT:
+ begin
+ if sqPar.CharacterSet = 'UNICODE_FSS' then
+ par.DataType := datWideString
+ else
+ par.DataType := datString;
+ par.Size := sqPar.Size;
+ end;
+ SQL_DOUBLE, SQL_FLOAT,SQL_D_FLOAT:par.DataType := datFloat;
+ SQL_SHORT, SQL_LONG: begin
+ if sqPar.Scale <> 0 then
+ par.DataType := datFloat
+ else
+ par.DataType := datInteger;
+ end;
+ SQL_INT64: begin
+ if sqPar.Scale <> 0 then
+ par.DataType := datFloat
+ else
+ par.DataType := datLargeInt;
+ end;
+ SQL_TIMESTAMP,
+ SQL_TYPE_TIME,
+ SQL_TYPE_DATE: par.DataType := datDateTime;
+ SQL_BLOB:
+ if sqPar.SQLSubtype = 1 then
+ par.DataType := datMemo
+ else
+ par.DataType := datBlob;
+ SQL_BOOLEAN: par.DataType := datBoolean;
+ else
+ par.DataType := datUnknown;
+ end;
+ end;
+end;
+
+
+{ TDAEFIBQuery }
+
+
+procedure TDAEFIBDriver.OnTrace(EventText: string; EventTime: TDateTime);
+begin
+ if Assigned(fTraceCallback) then fTraceCallback(fMonitor, EventText, 0);
+end;
+
+procedure TDAEFIBQuery.ClearParams;
+begin
+ inherited;
+ TFIBDataSet(Dataset).Params.ClearValues;
+end;
+
+{ TDAEFIBStoredProcedure }
+
+function TDAEFIBStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ FreeAndNil(FSP);
+ FSP := TpFIBStoredProc.Create(nil);
+ FSP.Database := TDAEFIBConnection(aConnection).fConnection.Database;
+ result := nil;
+end;
+
+function TDAEFIBStoredProcedure.Execute: integer;
+begin
+ TDAEFIBConnection(Connection).IntOpen;
+ if FSP.Database.Handle = nil then FSP.Database.Open;
+
+ SetParamValues(GetParams);
+ Result:= DoExecute;
+ GetParamValues(GetParams);
+end;
+
+procedure TDAEFIBStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ sqPar: TFIBXSQLVAR;
+begin
+ FSP.Prepare;
+ for i := 0 to AParams.Count - 1 do begin
+ if (AParams[i].ParamType in [daptInput, daptInputOutput, daptUnknown]) then begin
+ sqPar:= FSP.ParamByName(AParams[i].Name);
+ if (sqPar <> nil) and sqPar.IsParam then sqPar.Value:=AParams[i].Value;
+ end;
+ end;
+end;
+
+procedure TDAEFIBStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ sqPar: TFIBXSQLVAR;
+begin
+ for i := 0 to AParams.Count - 1 do begin
+ if (AParams[i].ParamType in [daptOutput, daptInputOutput, daptResult]) then begin
+ sqPar:= FSP.FieldByName(AParams[i].Name);
+ if (sqPar <> nil) then AParams[i].Value:=sqPar.Value;
+ end;
+ end;
+end;
+
+
+function TDAEFIBStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := FSP.StoredProcName;
+end;
+
+procedure TDAEFIBStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TDAEFIBConnection(Connection).IntOpen;
+ FSP.StoredProcName := Name;
+end;
+
+procedure TDAEFIBStoredProcedure.RefreshParams;
+begin
+ TDAEFIBConnection(Connection).IntOpen;
+ CreateParams(FSP, GetParams,True);
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+function TDAEFIBStoredProcedure.DoExecute: integer;
+begin
+ FSP.ExecQuery;
+ result := FSP.RowsAffected;
+end;
+
+{ TDAEFIBQuery }
+
+function TDAEFIBQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+var
+ ds: TFIBDataSet;
+begin
+ ds := TFIBDataSet.Create(nil);
+ ds.Database := TDAEFIBConnection(aConnection).fConnection.Database;
+ ds.Transaction := TDAEFIBConnection(aConnection).fConnection.Transaction;
+ ds.PrepareOptions := ds.PrepareOptions + [psUseLargeIntField];
+ result := ds;
+end;
+
+function TDAEFIBQuery.DoExecute: integer;
+begin
+ TDAEFIBConnection(Connection).IntOpen;
+ TFIBDataSet(Dataset).QSelect.ExecQuery;
+ result := TFIBDataSet(Dataset).QSelect.RowsAffected;
+end;
+
+function TDAEFIBQuery.DoGetRecordCount: integer;
+begin
+ result := TFIBDataSet(DAtaset).QSelect.RecordCount;
+end;
+
+function TDAEFIBQuery.DoGetSQL: string;
+begin
+ result := TFIBDataSet(DAtaset).QSelect.SQL.Text;
+end;
+
+procedure TDAEFIBQuery.DoPrepare(Value: boolean);
+begin
+ TDAEFIBConnection(Connection).IntOpen;
+ if Value then TFIBDataSet(DAtaset).QSelect.Prepare;
+end;
+
+procedure TDAEFIBQuery.DoSetActive(Value: Boolean);
+begin
+ TDAEFIBConnection(Connection).IntOpen;
+ if Value then begin
+ if not TFIBDataSet(Dataset).Database.Connected then
+ TFIBDataSet(Dataset).Database.Connected := true;
+ end;
+ inherited DoSetActive(Value);
+end;
+
+procedure TDAEFIBQuery.DoSetSQL(const Value: string);
+begin
+ TFIBDataSet(DAtaset).QSelect.SQL.Text := Value;
+end;
+
+
+
+procedure TDAEFIBQuery.RefreshParams;
+begin
+ CreateParams(TFIBDataSet(Dataset).QSelect, GetParams);
+end;
+
+
+procedure TDAEFIBQuery.SetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ _par: TDAParam;
+begin
+ TFIBDataSet(Dataset).Prepare;
+ for i := 0 to TFIBDataSet(Dataset).ParamCount - 1 do begin
+ _Par := AParams.ParamByName(TFIBDataSet(Dataset).Params[i].Name);
+ if (_Par.ParamType in [daptInput, daptInputOutput, daptUnknown]) then
+ if (TFIBDataSet(Dataset).Params[i].IsParam) then
+ TFIBDataSet(Dataset).Params[i].Value := _Par.Value;
+ end;
+end;
+
+procedure TDAEFIBQuery.GetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ _Par: TDAParam;
+begin
+ for i := 0 to TFIBDataSet(Dataset).ParamCount - 1 do begin
+ _Par := AParams.ParamByName(TFIBDataSet(Dataset).Params[i].Name);
+ if (_Par.ParamType in [daptOutput, daptInputOutput, daptResult]) then
+ _Par.Value := TFIBDataSet(Dataset).Params[i].Value;
+ end;
+end;
+
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAIBDACDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAIBDACDriver.pas
new file mode 100644
index 0000000..550449f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAIBDACDriver.pas
@@ -0,0 +1,579 @@
+unit uDAIBDACDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_IBDACDriver_Glyphs.res}
+
+interface
+
+uses
+ DB, Classes, uDAEngine, uDAInterfaces, uDAADOInterfaces, uROClasses,
+ DBAccess, IBC, DASQLMonitor,
+ IBCSQLMonitor, Variants, uDAUtils, uDAIBInterfaces;
+
+type { TDAIBDACDriver }
+ TDAIBDACDriver = class(TDADriverReference)
+ end;
+
+ { TDAEIBDACDriver }
+ TDAEIBDACDriver = class(TDAIBDriver)
+ private
+ fMonitor: TIBCSQLMonitor;
+ fTraceCallBack: TDALogTraceEvent;
+ procedure OnIBDACTrace(Sender: TObject; Text: string; Flag: TDATraceFlag);
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent); override;
+ procedure CustomizeConnectionObject(aConnection: TDAEConnection); override;
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ end;
+
+ { TDAEIBDACConnection }
+ TDAEIBDACConnection = class(TDAIBConnection, IDAInterbaseConnection, IDAIBTransactionAccess, IDAIBConnectionProperties, IDAUseGenerators, IDAFileBasedDatabase)
+ private
+ fConnection: TIBCConnection;
+ protected
+ // IIBTransactionAccess
+ function GetTransaction: TObject; safecall;
+
+ procedure Commit; safecall;
+ procedure CommitRetaining; safecall;
+ procedure Rollback; safecall;
+ procedure RollbackRetaining; safecall;
+
+ // IIBConnectionProperties
+ function GetRole: string; safecall;
+ procedure SetRole(const Value: string); safecall;
+ function GetSQLDialect: integer;override; safecall;
+ procedure SetSQLDialect(Value: integer); safecall;
+ function GetCharset: string; safecall;
+ procedure SetCharset(const Value: string); safecall;
+
+
+ // IDAConnection
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+ end;
+
+ { TDAEIBDACQuery }
+ TDAEIBDACQuery = class(TDAEDataset, IDAMustSetParams)
+ private
+
+ protected
+ function DoGetRecordCount: integer; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: boolean); override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ public
+ end;
+
+ { TDAEIBDACStoredProcedure }
+ TDAEIBDACStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: Integer; override;
+ function Execute: integer; override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ SysUtils,
+ uDADriverManager, uDARes,
+ uROBinaryHelpers;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAIBDACDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+{$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+{$ENDIF}
+ if (_driver = nil) then _driver := TDAEIBDACDriver.Create(nil);
+ result := _driver;
+end;
+
+{$I uDACRLabsUtils.inc}
+
+{ TDAEIBDACConnection }
+
+procedure TDAEIBDACConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+begin
+ inherited;
+ SetSQLDialect(3);
+ with aConnStrParser do begin
+ if (Self.UserID <> '') then
+ fConnection.Username := Self.UserID
+ else
+ fConnection.Username := UserID;
+
+ if (Self.Password <> '') then
+ fConnection.Password := Self.Password
+ else
+ fConnection.Password := Password;
+
+ if Server <> '' then
+ fConnection.Database := Server + ':' + Database
+ else
+ fConnection.Database := Database;
+
+ if AuxParams['Dialect'] <> '' then
+ SetSQLDialect(StrToInt(AuxParams['Dialect']))
+ else if AuxParams['SQLDialect'] <> '' then
+ SetSQLDialect(StrToInt(AuxParams['SQLDialect']));
+
+ if AuxParams['Role'] <> '' then SetRole(AuxParams['Role']);
+
+ if AuxParams['Charset'] <> '' then SetCharset(AuxParams['Charset']);
+ if AuxParams['EnableMemos'] <> '' then fConnection.Options.EnableMemos := StrToBool(AuxParams['EnableMemos']);
+ if AuxParams['UseUnicode'] <> '' then fConnection.Options.UseUnicode := StrToBool(AuxParams['UseUnicode']);
+ end;
+end;
+
+function TDAEIBDACConnection.DoBeginTransaction: integer;
+begin
+ result := -1;
+ fConnection.StartTransaction;
+end;
+
+procedure TDAEIBDACConnection.DoCommitTransaction;
+begin
+ fConnection.Commit;
+end;
+
+function TDAEIBDACConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fConnection := TIBCConnection.Create(nil);
+ fConnection.LoginPrompt := FALSE;
+
+ result := fConnection;
+end;
+
+function TDAEIBDACConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEIBDACQuery;
+end;
+
+function TDAEIBDACConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEIBDACStoredProcedure;
+end;
+
+(*function SqlServerToDAType(aType:integer):TDADataType;
+begin
+ case aType of
+ 34:result := datBlob;
+ 35:result := datMemo;
+ 36:result := datString; //uniqueidentifier
+ 48:result := datInteger;
+ 52:result := datInteger;
+ 56:result := datInteger;
+ 58:result := datDateTime;
+ 59:result := datFloat;
+ 60:result := datCurrency;
+ 61:result := datDateTime;
+ 62:result := datFloat;
+ //98 sql_variant
+ 99:result := datMemo;// ntext
+ 104:result := datBoolean;
+ 106:result := datFloat;
+ 108:result := datFloat;
+ 122:result := datCurrency;
+ 127:result := datInteger;
+ 165:result := datBlob; // varbinary
+ 167:result := datString;
+ 173:result := datBlob; // binary
+ 175:result := datString; // char
+ 189:result := datBlob; // timestamp
+ 231:result := datString; // nvarchar
+ 239:result := datString; //nchar
+ 240:result := datDateTime;
+ 241:result := datBlob;// xml
+ else result := datUnknown;
+ end;
+end;
+
+procedure TDAEIBDACConnection.DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection);
+var
+ ds : TIBCQuery;
+ lID:string;
+begin
+ ds := TIBCQuery.Create(NIL);
+ try
+
+ ds.Connection := fConnection;
+ ds.SQL.Text := 'select * from sysobjects where xtype=''P'' and name='''+aStoredProcedureName+'''';
+ ds.Open;
+ try
+ if ds.EOF then RaiseError('Stored Procedure %s not found in database',[aStoredProcedureName]);
+ lID := ds.FieldbyName('id').AsString;
+ finally
+ ds.Close();
+ end;
+
+ ds.SQL.Text := 'select * from sys.parameters where object_id='''+lID+''' ORDER BY parameter_id';
+ ds.Open;
+ try
+ Params := TDAParamCollection.Create(nil);
+ while not ds.Eof do begin
+ with Params.Add() do begin
+ Name := ds.FieldByName('name').AsString;
+
+ DataType := SqlServerToDAType(ds.FieldByName('system_type_id').AsInteger);
+ Size := ds.FieldByName('max_length').AsInteger;
+
+ {if ds.FieldByName('has_default_value').AsBoolean then
+ DefaultValue := ds.FieldByName('default_Value').AsInteger;}
+
+ if ds.FieldByName('is_output').AsBoolean then
+ ParamType := daptOutput
+ else
+ ParamType := daptInput;
+
+ end;
+ ds.Next();
+ end;
+ finally
+ Close();
+ end;
+
+ finally
+ ds.Free;
+ end;
+end;*)
+
+procedure TDAEIBDACConnection.DoRollbackTransaction;
+begin
+ fConnection.Rollback;
+end;
+
+function TDAEIBDACConnection.DoGetInTransaction: boolean;
+begin
+ result := fConnection.InTransaction
+end;
+
+procedure TDAEIBDACConnection.Commit;
+begin
+ fConnection.Commit;
+end;
+
+procedure TDAEIBDACConnection.CommitRetaining;
+begin
+ fConnection.CommitRetaining;
+end;
+
+function TDAEIBDACConnection.GetCharset: string;
+begin
+ result := fConnection.Options.Charset;
+end;
+
+function TDAEIBDACConnection.GetRole: string;
+begin
+ Result := fConnection.Options.Role;
+end;
+
+function TDAEIBDACConnection.GetSQLDialect: integer;
+begin
+ Result := fConnection.SQLDialect;
+end;
+
+function TDAEIBDACConnection.GetTransaction: TObject;
+begin
+ Result := fConnection.DefaultTransaction;
+end;
+
+procedure TDAEIBDACConnection.Rollback;
+begin
+ fConnection.Rollback;
+end;
+
+procedure TDAEIBDACConnection.RollbackRetaining;
+begin
+ fConnection.RollbackRetaining;
+end;
+
+procedure TDAEIBDACConnection.SetCharset(const Value: string);
+begin
+ fConnection.Options.Charset := Value;
+end;
+
+procedure TDAEIBDACConnection.SetRole(const Value: string);
+begin
+ fConnection.Options.Role := Value;
+end;
+
+procedure TDAEIBDACConnection.SetSQLDialect(Value: integer);
+begin
+ fConnection.SQLDialect := Value;
+end;
+
+{ TDAEIBDACDriver }
+
+procedure TDAEIBDACDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+// List.Add('EnableMemos={True,False}');
+// List.Add('UseUnicode={True,False}');
+end;
+
+function TDAEIBDACDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEIBDACConnection;
+end;
+
+function TDAEIBDACDriver.GetDescription: string;
+begin
+ result := 'Core Lab IBDAC Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEIBDACDriver.GetDriverID: string;
+begin
+ result := 'IBDAC';
+end;
+
+procedure TDAEIBDACDriver.OnIBDACTrace(Sender: TObject; Text: string; Flag: TDATraceFlag);
+begin
+ inherited;
+ // if Assigned(fTraceCallback) then fTraceCallback(Sender, Text, integer(Flag));
+end;
+
+procedure TDAEIBDACDriver.DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent);
+var
+ IBDACopts: TDATraceFlags;
+begin
+ inherited;
+ exit;
+ if TraceActive then begin
+ if (fMonitor = nil) then fMonitor := TIBCSQLMonitor.Create(Self);
+
+ fMonitor.Active := FALSE;
+ fMonitor.OnSQL := OnIBDACTrace;
+
+ IBDACopts := [];
+ if (toPrepare in TraceOptions) then IBDACopts := IBDACopts + [tfQPrepare];
+ if (toExecute in TraceOptions) then IBDACopts := IBDACopts + [tfQExecute];
+ if (toFetch in TraceOptions) then IBDACopts := IBDACopts + [tfQFetch];
+ if (toError in TraceOptions) then IBDACopts := IBDACopts + [tfError];
+ if (toStmt in TraceOptions) then IBDACopts := IBDACopts + [tfStmt];
+ if (toConnect in TraceOptions) then IBDACopts := IBDACopts + [tfConnect];
+ if (toTransact in TraceOptions) then IBDACopts := IBDACopts + [tfTransact];
+ if (toBlob in TraceOptions) then IBDACopts := IBDACopts + [tfBlob];
+ if (toService in TraceOptions) then IBDACopts := IBDACopts + [tfService];
+ if (toMisc in TraceOptions) then IBDACopts := IBDACopts + [tfMisc];
+ if (toParams in TraceOptions) then IBDACopts := IBDACopts + [tfParams];
+
+ fTraceCallBack := Callback;
+
+ fMonitor.TraceFlags := IBDACopts;
+ fMonitor.Active := TRUE;
+ end
+ else begin
+ FreeAndNIL(fMonitor);
+ fTraceCallback := nil;
+ end;
+end;
+
+procedure TDAEIBDACDriver.CustomizeConnectionObject(
+ aConnection: TDAEConnection);
+begin
+ //
+end;
+
+{ TDAEIBDACQuery }
+
+procedure TDAEIBDACQuery.ClearParams;
+begin
+ inherited;
+ TIBCQuery(Dataset).Params.Clear;
+end;
+
+function TDAEIBDACQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TIBCQuery.Create(nil);
+ TIBCQuery(result).FetchAll := True; //for preventing creating an additional session when you call StartTransaction (an known issue of OLEDB)
+ TIBCQuery(result).Unidirectional := True;
+ TIBCQuery(result).ReadOnly := TRUE;
+ TIBCQuery(result).Connection := TDAEIBDACConnection(aConnection).fConnection;
+ TIBCQuery(result).AutoCommit := False;
+end;
+
+function TDAEIBDACQuery.DoExecute: integer;
+begin
+ TIBCQuery(Dataset).ExecSQL;
+ result := TIBCQuery(Dataset).RowsAffected;
+end;
+
+function TDAEIBDACQuery.DoGetRecordCount: integer;
+begin
+ Result := TIBCQuery(Dataset).RecordCount;
+end;
+
+function TDAEIBDACQuery.DoGetSQL: string;
+begin
+ result := TIBCQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEIBDACQuery.DoPrepare(Value: boolean);
+begin
+ TIBCQuery(Dataset).Prepared := Value;
+end;
+
+procedure TDAEIBDACQuery.DoSetSQL(const Value: string);
+begin
+ TIBCQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEIBDACQuery.GetParamValues(AParams: TDAParamCollection);
+var
+ I: Integer;
+ lParam: TIBCParam;
+begin
+ for i := 0 to TIBCQuery(DataSet).Params.Count - 1 do begin
+ lParam:=TIBCQuery(DataSet).Params[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ AParams.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+end;
+
+procedure TDAEIBDACQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteCrLabsParamValues(AParams, TIBCQuery(Dataset).Params, true);
+end;
+
+{ TDAEIBDACStoredProcedure }
+
+function TDAEIBDACStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ result := TIBCStoredProc.Create(nil);
+ TIBCStoredProc(result).Connection := TDAEIBDACConnection(aConnection).fConnection;
+ TIBCStoredProc(result).AutoCommit := False;
+end;
+
+function TDAEIBDACStoredProcedure.Execute: integer;
+begin
+ TIBCStoredProc(Dataset).Prepare;
+ SetParamValues(GetParams);
+ Result:=DoExecute;
+ GetParamValues(GetParams);
+end;
+
+
+procedure TDAEIBDACStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+var
+ i: Integer;
+ lParam: TIBCParam;
+begin
+ for i := 0 to TIBCStoredProc(DataSet).Params.Count - 1 do begin
+ lParam:=TIBCStoredProc(DataSet).Params[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ AParams.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+end;
+
+function TDAEIBDACStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TIBCStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEIBDACStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TIBCStoredProc(Dataset).StoredProcName := Name;
+end;
+
+procedure TDAEIBDACStoredProcedure.RefreshParams;
+begin
+ TIBCStoredProc(Dataset).Prepare;
+ RefreshParamsStd(TIBCStoredProc(Dataset).Params);
+end;
+
+procedure TDAEIBDACStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteCrLabsParamValues(AParams, TIBCStoredProc(Dataset).Params);
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+function TDAEIBDACStoredProcedure.DoExecute: Integer;
+begin
+ TIBCStoredProc(Dataset).ExecProc;
+ result := TIBCStoredProc(Dataset).RowsAffected;
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAIBODriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAIBODriver.pas
new file mode 100644
index 0000000..cc2d92a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAIBODriver.pas
@@ -0,0 +1,530 @@
+unit uDAIBODriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up, Kylix 3 and up
+{ platform: Win32, Linux
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_IBODriver_Glyphs.res}
+
+interface
+
+uses DB, Classes, uDAEngine, uDAInterfaces, uDAIBInterfaces, uROClasses,
+ IBODataset, IB_Components, IB_Monitor, uDAUtils;
+
+type
+ { TDAIBODriver }
+ TDAIBODriver = class(TDADriverReference)
+ end;
+
+ { TIBOConnection }
+ TIBOConnection = class(TDAConnectionWrapper)
+ private
+ fDatabase: TIBODatabase;
+
+ protected
+ function GetConnected: Boolean; override;
+ procedure SetConnected(Value: boolean); override;
+
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Database: TIBODatabase read fDatabase;
+ end;
+
+ { TDAEIBODriver }
+ TDAEIBODriver = class(TDAIBDriver)
+ private
+ fTraceCallback: TDALogTraceEvent;
+ fMonitor: TIB_Monitor;
+ procedure OnIBOTrace(Sender: TObject; const NewString: string);
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions;
+ Callback: TDALogTraceEvent); override;
+
+ public
+ end;
+
+ { TDAEIBOConnection }
+ TDAEIBOConnection = class(TDAIBConnection, IDAInterbaseConnection, IDAIBTransactionAccess, IDAIBConnectionProperties, IDAUseGenerators,
+ IDAFileBasedDatabase)
+ private
+ fConnection: TIBOConnection;
+ fSQLDialect: integer; // See TDAEIBOConnection.GetSQLDialect for more details
+
+ protected
+
+ // IIBTransactionAccess
+ function GetTransaction: TObject; safecall;
+
+ procedure Commit; safecall;
+ procedure CommitRetaining; safecall;
+ procedure Rollback; safecall;
+ procedure RollbackRetaining; safecall;
+
+ // IIBConnectionProperties
+ function GetRole: string; safecall;
+ procedure SetRole(const Value: string); safecall;
+ function GetSQLDialect: integer; override;safecall;
+ procedure SetSQLDialect(Value: integer); safecall;
+ function GetCharset: string; safecall;
+ procedure SetCharset(const Value: string); safecall;
+
+ // IDAConnection
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+ public
+ end;
+
+ { TDAEIBOQuery }
+ TDAEIBOQuery = class(TDAEDataset, IDAMustSetParams)
+ private
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: boolean); override;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ public
+ end;
+
+ { TDAEIBOStoredProcedure }
+ TDAEIBOStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ private
+
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override;
+ function Execute: integer; override;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses SysUtils, uDADriverManager, uDARes, uROBinaryHelpers, Variants;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAIBODriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEIBODriver.Create(nil);
+ result := _driver;
+end;
+
+
+
+{ TIBOConnection }
+
+constructor TIBOConnection.Create(AOwner: TComponent);
+begin
+ inherited;
+
+ fDatabase := TIBODatabase.Create(Self);
+ fDatabase.LoginPrompt := FALSE;
+end;
+
+destructor TIBOConnection.Destroy;
+begin
+ FreeAndNil(fDatabase);
+ inherited;
+end;
+
+function TIBOConnection.GetConnected: Boolean;
+begin
+ result := fDatabase.Connected
+end;
+
+procedure TIBOConnection.SetConnected(Value: boolean);
+begin
+ if fDatabase <> nil then fDatabase.Connected := Value;
+end;
+
+{ TDAEIBOConnection }
+
+procedure TDAEIBOConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+begin
+ inherited;
+
+ with aConnStrParser do begin
+ if (Self.UserID <> '') then
+ fConnection.Database.Username := Self.UserID
+ else
+ fConnection.Database.Username := UserID;
+
+ if (Self.Password <> '') then
+ fConnection.Database.Password := Self.Password
+ else
+ fConnection.Database.Password := Password;
+
+ if (Server <> '') then
+ fConnection.Database.DatabaseName := Server + ':' + Database
+ else
+ fConnection.Database.DatabaseName := Database;
+
+ if AuxParams['Dialect'] <> '' then
+ SetSQLDialect(StrToInt(AuxParams['Dialect']))
+ else if AuxParams['SQLDialect'] <> '' then
+ SetSQLDialect(StrToInt(AuxParams['SQLDialect']));
+
+ if AuxParams['Role'] <> '' then
+ SetRole(AuxParams['Role']);
+
+ if AuxParams['Charset'] <> '' then
+ fConnection.Database.CharSet := AuxParams['Charset'];
+
+ end;
+end;
+
+function TDAEIBOConnection.DoBeginTransaction: integer;
+begin
+ fConnection.Database.DefaultTransaction.StartTransaction;
+ result := -1;
+end;
+
+procedure TDAEIBOConnection.DoCommitTransaction;
+begin
+ fConnection.Database.DefaultTransaction.Commit;
+end;
+
+function TDAEIBOConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fConnection := TIBOConnection.Create(nil);
+ fSQLDialect := fConnection.Database.SQLDialect;
+ result := fConnection;
+end;
+
+function TDAEIBOConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEIBOQuery
+end;
+
+function TDAEIBOConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEIBOStoredProcedure
+end;
+
+function TDAEIBOConnection.GetTransaction: TObject;
+begin
+ result := fConnection.Database.DefaultTransaction;
+end;
+
+procedure TDAEIBOConnection.DoRollbackTransaction;
+begin
+ fConnection.Database.DefaultTransaction.Rollback;
+end;
+
+function TDAEIBOConnection.GetRole: string;
+begin
+ result := fConnection.Database.SQLRole
+end;
+
+function TDAEIBOConnection.GetSQLDialect: integer;
+begin
+ // AleF: I modified this because somehow IBO returned 3 even after setting this value to 2 or else.
+ // Somewhere in the IBO code this calue gets reset. This is a work around that basically makes QuoteIdentifier work correctly
+
+ result := fSQLDialect; // fConnection.Database.SQLDialect;
+end;
+
+procedure TDAEIBOConnection.SetSQLDialect(Value: integer);
+begin
+ fSQLDialect := Value;
+ fConnection.Database.SQLDialect := Value;
+end;
+
+procedure TDAEIBOConnection.SetRole(const Value: string);
+begin
+ fConnection.Database.SQLRole := Value
+end;
+
+procedure TDAEIBOConnection.Commit;
+begin
+ fConnection.Database.Commit
+end;
+
+procedure TDAEIBOConnection.CommitRetaining;
+begin
+ fConnection.Database.CommitRetaining
+end;
+
+procedure TDAEIBOConnection.Rollback;
+begin
+ fConnection.Database.Rollback
+end;
+
+procedure TDAEIBOConnection.RollbackRetaining;
+begin
+ fConnection.Database.RollbackRetaining
+end;
+
+function TDAEIBOConnection.DoGetInTransaction: boolean;
+begin
+ result := fConnection.Database.InTransaction
+end;
+
+function TDAEIBOConnection.GetCharset: string;
+begin
+ result := fConnection.Database.CharSet;
+end;
+
+procedure TDAEIBOConnection.SetCharset(const Value: string);
+begin
+ fConnection.Database.CharSet := Value;
+end;
+
+{ TDAEIBODriver }
+
+function TDAEIBODriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEIBOConnection
+end;
+
+function TDAEIBODriver.GetDescription: string;
+begin
+ result := 'Interbase Objects (IBO) Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEIBODriver.GetDriverID: string;
+begin
+ result := 'IBO';
+end;
+
+procedure TDAEIBODriver.OnIBOTrace(Sender: TObject; const NewString: string);
+begin
+ if Assigned(fTraceCallback) then fTraceCallback(fMonitor, NewString, 0);
+end;
+
+procedure TDAEIBODriver.DoSetTraceOptions(TraceActive: boolean; TraceOptions:
+ TDATraceOptions; Callback: TDALogTraceEvent);
+begin
+ inherited;
+
+ if TraceActive then begin
+ if (fMonitor = nil) then fMonitor := TIB_Monitor.Create(Self);
+
+ fMonitor.Enabled := FALSE;
+ fMonitor.OnMonitorOutputItem := OnIBOTrace;
+ fMonitor.IncludeTimeStamp := True;
+ fMonitor.ItemStart := '';
+ fMonitor.ItemEnd := '';
+ fMonitor.NewLineText := ',';
+
+ FMonitor.MonitorGroups := [];
+ FMonitor.StatementGroups := [];
+
+ if (toPrepare in TraceOptions) then begin
+ FMonitor.MonitorGroups := FMonitor.MonitorGroups + [mgStatement];
+ FMonitor.StatementGroups := FMonitor.StatementGroups + [sgPrepare, sgAllocate, sgStatementInfo, sgDescribe];
+ end;
+
+ if (toExecute in TraceOptions) then begin
+ FMonitor.MonitorGroups := FMonitor.MonitorGroups + [mgStatement];
+ FMonitor.StatementGroups := FMonitor.StatementGroups + [sgExecute];
+ end;
+
+ if (toFetch in TraceOptions) then begin
+ FMonitor.MonitorGroups := FMonitor.MonitorGroups + [mgStatement, mgRow];
+ FMonitor.StatementGroups := FMonitor.StatementGroups + [sgDescribe, sgStatementInfo];
+ end;
+
+ if (toStmt in TraceOptions) then begin
+ FMonitor.MonitorGroups := FMonitor.MonitorGroups + [mgStatement];
+ FMonitor.StatementGroups := FMonitor.StatementGroups + [sgDescribe, sgStatementInfo];
+ end;
+
+ if (toConnect in TraceOptions) then FMonitor.MonitorGroups := FMonitor.MonitorGroups + [mgConnection];
+ if (toTransact in TraceOptions) then FMonitor.MonitorGroups := FMonitor.MonitorGroups + [mgtransaction];
+
+ if (toBlob in TraceOptions) then FMonitor.MonitorGroups := FMonitor.MonitorGroups + [mgBlob];
+
+ if (toMisc in TraceOptions) then begin
+ FMonitor.MonitorGroups := FMonitor.MonitorGroups + [mgBlob, mgArray, mgClientTrace];
+ FMonitor.StatementGroups := FMonitor.StatementGroups + [sgStatementInfo, sgServerCursor, sgServerCursor];
+ end;
+
+ fTraceCallBack := Callback;
+
+ fMonitor.Enabled := TRUE;
+ end
+ else begin
+ FreeAndNIL(fMonitor);
+ fTraceCallback := nil;
+ end;
+end;
+
+{ TDAEIBOQuery }
+
+procedure TDAEIBOQuery.ClearParams;
+begin
+ inherited;
+ TIBOQuery(Dataset).Params.Clear;
+end;
+
+function TDAEIBOQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TIBOQuery.Create(nil);
+ TIBOQuery(result).IB_Connection := TDAEIBOConnection(aConnection).fConnection.Database;
+ TIBOQuery(result).AutoFetchAll := TRUE;
+ TIBOQuery(result).RecordCountAccurate := TRUE;
+end;
+
+function TDAEIBOQuery.DoExecute: integer;
+begin
+ TIBOQuery(Dataset).ExecSQL;
+ result := TIBOQuery(Dataset).RowsAffected;
+end;
+
+function TDAEIBOQuery.DoGetSQL: string;
+begin
+ result := TIBOQuery(Dataset).SQL.Text
+end;
+
+procedure TDAEIBOQuery.DoPrepare(Value: boolean);
+begin
+ TIBOQuery(Dataset).Prepared := Value;
+end;
+
+procedure TDAEIBOQuery.DoSetSQL(const Value: string);
+begin
+ TIBOQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEIBOQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TIBOQuery(Dataset).Params);
+end;
+
+procedure TDAEIBOQuery.SetParamValues(AParams: TDAParamCollection);
+var i: Integer;
+begin
+ for i := 0 to AParams.Count - 1 do
+ if (VarType(AParams[i].Value) = varOleStr) and (AParams[i].Value = '') then
+ AParams[i].Value := Unassigned;
+ SetParamValuesStd(AParams, TIBOQuery(Dataset).Params);
+end;
+
+{ TDAEIBOStoredProcedure }
+
+function TDAEIBOStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ result := TIBOStoredProc.Create(nil);
+ TIBOStoredProc(result).IB_Connection := TDAEIBOConnection(aConnection).fConnection.Database;
+end;
+
+function TDAEIBOStoredProcedure.Execute: integer;
+begin
+ with TIBOStoredProc(Dataset) do begin
+ Unprepare;
+ Prepare;
+ end;
+
+ SetParamValues(GetParams);
+ Result := DoExecute;
+ GetParamValues(GetParams);
+end;
+
+function TDAEIBOStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TIBOStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEIBOStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TIBOStoredProc(Dataset).StoredProcName := Name;
+end;
+
+procedure TDAEIBOStoredProcedure.RefreshParams;
+begin
+ // Apparently a bug in IBO requires to do so... Automatic gathering only works at runtime
+ TIBOStoredProc(Dataset).Prepare;
+ RefreshParamsStd(TIBOStoredProc(Dataset).Params);
+end;
+
+procedure TDAEIBOStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TIBOStoredProc(Dataset).Params);
+end;
+
+procedure TDAEIBOStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TIBOStoredProc(Dataset).Params);
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+function TDAEIBOStoredProcedure.DoExecute: integer;
+begin
+ TIBOStoredProc(Dataset).ExecProc;
+ result := TIBOStoredProc(Dataset).RowsAffected;
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAIBXDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAIBXDriver.pas
new file mode 100644
index 0000000..938d609
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAIBXDriver.pas
@@ -0,0 +1,538 @@
+unit uDAIBXDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_IBXDriver_Glyphs.res}
+
+interface
+
+uses
+ Classes, DB, uDAEngine, uDAInterfaces, uDAIBInterfaces, IBDatabase,
+ uROClasses, IBQuery, IBStoredProc, IBSQLMonitor, IB, uDAUtils;
+
+type
+ { TDAIBXDriver }
+ TDAIBXDriver = class(TDADriverReference)
+ end;
+
+ { TIBXConnection }
+ TIBXConnection = class(TDAConnectionWrapper)
+ private
+ fDatabase: TIBDatabase;
+ fTransaction: TIBTransaction;
+
+ protected
+ function GetConnected: Boolean; override;
+ procedure SetConnected(Value: boolean); override;
+
+ public
+ constructor Create(AOwner: TComponent); override;
+
+ property Database: TIBDatabase read fDatabase;
+ property Transaction: TIBTransaction read fTransaction;
+ end;
+
+ { TDAEIBXDriver }
+ TDAEIBXDriver = class(TDAIBDriver)
+ private
+ fIBTraceOptions: TTraceFlags;
+ fTraceCallback: TDALogTraceEvent;
+ fMonitor: TIBSQLMonitor;
+
+ procedure OnIBXTrace(EventText: string; EventTime: TDateTime);
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ procedure CustomizeConnectionObject(aConnection: TDAEConnection); override;
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent); override;
+
+ // IDADriver
+ procedure Finalize; override;
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+ public
+ end;
+
+ { TDAEIBXConnection }
+ TDAEIBXConnection = class(TDAIBConnection, IDAInterbaseConnection, IDAIBTransactionAccess, IDAIBConnectionProperties, IDAUseGenerators, IDAFileBasedDatabase)
+ private
+ fConnection: TIBXConnection;
+
+ protected
+ // IIBTransactionAccess
+ function GetTransaction: TObject; safecall;
+
+ procedure Commit; safecall;
+ procedure CommitRetaining; safecall;
+ procedure Rollback; safecall;
+ procedure RollbackRetaining; safecall;
+
+ // IIBConnectionProperties
+ function GetRole: string; safecall;
+ procedure SetRole(const Value: string); safecall;
+ function GetSQLDialect: integer; override;safecall;
+ procedure SetSQLDialect(Value: integer); safecall;
+ function GetCharset: string; safecall;
+ procedure SetCharset(const Value: string); safecall;
+
+
+ // IDAConnection
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+
+ end;
+
+ { TDAEIBXQuery }
+ TDAEIBXQuery = class(TDAEDataset,IDAMustSetParams)
+
+ protected
+ function DoGetRecordCount: integer; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: boolean); override;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAEIBXStoredProcedure }
+ TDAEIBXStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override;
+ function Execute: integer; override;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses SysUtils, uDADriverManager, uDARes, IBCustomDataSet, IBSQL,uROBinaryHelpers;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAIBXDriver]);
+end;
+
+function GetDriverObject: IDADriver;
+begin
+ if (_driver = nil) then _driver := TDAEIBXDriver.Create(nil);
+ result := _driver;
+end;
+
+{ TIBXConnection }
+
+constructor TIBXConnection.Create(AOwner: TComponent);
+begin
+ inherited;
+
+ fDatabase := TIBDatabase.Create(Self);
+ fTransaction := TIBTransaction.Create(Self);
+ fTransaction.AutoStopAction := saNone;
+ //fTransaction.AutoStopAction := saCommit;
+ // ^ new per recommendation from Andy Gibson, to fix the "Transaction in progress" error.
+
+ fDatabase.LoginPrompt := FALSE;
+ fDatabase.DefaultTransaction := fTransaction;
+end;
+
+function TIBXConnection.GetConnected: Boolean;
+begin
+ result := fDatabase.Connected
+end;
+
+procedure TIBXConnection.SetConnected(Value: boolean);
+begin
+ // This first check is required.
+ // I think there's a bug in the IBX destroying sequence and the notification. TCustomConnection gets to this point *after*
+ // the owned components are destroyed. Only happens with IBX...
+
+ if (csDestroying in ComponentState) then Exit;
+ fDatabase.Connected := Value
+end;
+
+{ TDAEIBXConnection }
+
+procedure TDAEIBXConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+begin
+ inherited;
+
+ with aConnStrParser do begin
+ if (Self.UserID <> '') then
+ fConnection.Database.Params.Add('user_name=' + Self.UserID)
+ else
+ fConnection.Database.Params.Add('user_name=' + UserID);
+
+ if (Self.Password <> '') then
+ fConnection.Database.Params.Add('password=' + Self.Password)
+ else
+ fConnection.Database.Params.Add('password=' + Password);
+
+ if Server <> '' then { Change: Aleksander Oven, 27. july 2003 }
+ fConnection.Database.DatabaseName := Server + ':' + Database
+ else
+ fConnection.Database.DatabaseName := Database;
+
+ if AuxParams['Dialect'] <> '' then
+ SetSQLDialect(StrToInt(AuxParams['Dialect']))
+ else if AuxParams['SQLDialect'] <> '' then
+ SetSQLDialect(StrToInt(AuxParams['SQLDialect']));
+
+ if AuxParams['Role'] <> '' then
+ SetRole(AuxParams['Role']);
+
+ if AuxParams['Charset'] <> '' then
+ SetCharset(AuxParams['Charset']);
+
+ end;
+end;
+
+function TDAEIBXConnection.DoBeginTransaction: integer;
+begin
+ result := -1;
+ fConnection.Database.DefaultTransaction.StartTransaction;
+end;
+
+procedure TDAEIBXConnection.DoCommitTransaction;
+begin
+ fConnection.Database.DefaultTransaction.Commit;
+end;
+
+function TDAEIBXConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fConnection := TIBXConnection.Create(nil);
+ result := fConnection;
+end;
+
+function TDAEIBXConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEIBXQuery
+end;
+
+function TDAEIBXConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEIBXStoredProcedure
+end;
+
+function TDAEIBXConnection.GetTransaction: TObject;
+begin
+ result := fConnection.fTransaction;
+end;
+
+procedure TDAEIBXConnection.DoRollbackTransaction;
+begin
+ fConnection.Database.DefaultTransaction.Rollback;
+end;
+
+function TDAEIBXConnection.GetRole: string;
+begin
+ result := fConnection.Database.Params.Values['sql_role_name']
+end;
+
+function TDAEIBXConnection.GetSQLDialect: integer;
+begin
+ result := fConnection.Database.SQLDialect
+end;
+
+function TDAEIBXConnection.GetCharset: string;
+begin
+ result := fConnection.Database.Params.Values['lc_ctype']
+end;
+
+procedure TDAEIBXConnection.SetRole(const Value: string);
+begin
+ fConnection.Database.Params.Values['sql_role_name'] := Value
+end;
+
+procedure TDAEIBXConnection.SetSQLDialect(Value: integer);
+begin
+ fConnection.Database.SQLDialect := Value
+end;
+
+procedure TDAEIBXConnection.SetCharset(const Value: string);
+begin
+ fConnection.Database.Params.Values['lc_ctype'] := Value;
+end;
+
+procedure TDAEIBXConnection.Commit;
+begin
+ fConnection.fTransaction.Commit
+end;
+
+procedure TDAEIBXConnection.CommitRetaining;
+begin
+ fConnection.fTransaction.CommitRetaining
+end;
+
+procedure TDAEIBXConnection.Rollback;
+begin
+ fConnection.fTransaction.Rollback
+end;
+
+procedure TDAEIBXConnection.RollbackRetaining;
+begin
+ fConnection.fTransaction.RollbackRetaining
+end;
+
+function TDAEIBXConnection.DoGetInTransaction: boolean;
+begin
+ result := fConnection.fTransaction.InTransaction
+end;
+
+{ TDAEIBXDriver }
+
+procedure TDAEIBXDriver.CustomizeConnectionObject(aConnection: TDAEConnection);
+begin
+ TDAEIBXConnection(aConnection).fConnection.Database.TraceFlags := fIBTraceOptions;
+end;
+
+function TDAEIBXDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEIBXConnection;
+end;
+
+function TDAEIBXDriver.GetDescription: string;
+begin
+ result := 'Borland Interbase Express Driver';
+end;
+
+function TDAEIBXDriver.GetDriverID: string;
+begin
+ result := 'IBX';
+end;
+
+procedure TDAEIBXDriver.OnIBXTrace(EventText: string; EventTime: TDateTime);
+begin
+ if Assigned(fTraceCallback) then fTraceCallback(fMonitor, EventText, 0);
+end;
+
+procedure TDAEIBXDriver.DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent);
+begin
+ inherited;
+
+ if TraceActive then begin
+ if (fMonitor = nil) then fMonitor := TIBSQLMonitor.Create(Self);
+
+ fMonitor.Enabled := FALSE;
+ fMonitor.OnSQL := OnIBXTrace;
+
+ fIBTraceOptions := [];
+ if (toPrepare in TraceOptions) then fIBTraceOptions := fIBTraceOptions + [tfQPrepare];
+ if (toExecute in TraceOptions) then fIBTraceOptions := fIBTraceOptions + [tfQExecute];
+ if (toFetch in TraceOptions) then fIBTraceOptions := fIBTraceOptions + [tfQFetch];
+ if (toError in TraceOptions) then fIBTraceOptions := fIBTraceOptions + [tfError];
+ if (toStmt in TraceOptions) then fIBTraceOptions := fIBTraceOptions + [tfStmt];
+ if (toConnect in TraceOptions) then fIBTraceOptions := fIBTraceOptions + [tfConnect];
+ if (toTransact in TraceOptions) then fIBTraceOptions := fIBTraceOptions + [tfTransact];
+ if (toBlob in TraceOptions) then fIBTraceOptions := fIBTraceOptions + [tfBlob];
+ if (toService in TraceOptions) then fIBTraceOptions := fIBTraceOptions + [tfService];
+ if (toMisc in TraceOptions) then fIBTraceOptions := fIBTraceOptions + [tfMisc];
+
+ fTraceCallBack := Callback;
+
+ fMonitor.TraceFlags := fIBTraceOptions;
+ fMonitor.Enabled := TRUE;
+ end
+ else begin
+ FreeAndNIL(fMonitor);
+ fTraceCallback := nil;
+ end;
+ if TraceActive then
+ EnableMonitoring
+ else
+ DisableMonitoring;
+end;
+
+procedure TDAEIBXDriver.Finalize;
+begin
+ inherited;
+end;
+
+{ TDAEIBXQuery }
+
+procedure TDAEIBXQuery.ClearParams;
+begin
+ inherited;
+ TIBQuery(Dataset).Params.Clear;
+end;
+
+function TDAEIBXQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TIBQuery.Create(nil);
+ TIBQuery(result).UniDirectional := true;
+ TIBQuery(result).Database := TDAEIBXConnection(aConnection).fConnection.Database;
+end;
+
+function TDAEIBXQuery.DoExecute: integer;
+begin
+ TIBQuery(Dataset).ExecSQL;
+ result := TIBQuery(Dataset).RowsAffected;
+end;
+
+function TDAEIBXQuery.DoGetRecordCount: integer;
+begin
+ TIBQuery(Dataset).FetchAll;
+ Result := inherited DoGetRecordCount;
+end;
+
+function TDAEIBXQuery.DoGetSQL: string;
+begin
+ result := TIBQuery(Dataset).SQL.Text
+end;
+
+procedure TDAEIBXQuery.DoPrepare(Value: boolean);
+begin
+ TIBQuery(Dataset).Prepared := Value
+end;
+
+procedure TDAEIBXQuery.DoSetSQL(const Value: string);
+begin
+ TIBQuery(Dataset).SQL.Text := Value;
+end;
+
+
+procedure TDAEIBXQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams,TIBQuery(Dataset).Params);
+end;
+
+procedure TDAEIBXQuery.SetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ k: UnicodeString;
+begin
+ for I := 0 to AParams.Count - 1 do
+ if AParams[i].DataType = datWideMemo then begin
+ k := AParams[i].AsWideString;
+ {$IFDEF UNICODE}
+ AParams[i].DataType := datMemo;
+ {$ELSE}
+ AParams[i].DataType := datBlob;
+ {$ENDIF}
+ AParams[i].AsWideString:=k;
+ end;
+ SetParamValuesStd(AParams,TIBQuery(Dataset).Params);
+end;
+
+{ TDAEIBXStoredProcedure }
+
+function TDAEIBXStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ result := TIBStoredProc.Create(nil);
+ TIBStoredProc(result).Database := TDAEIBXConnection(aConnection).fConnection.Database;
+end;
+
+function TDAEIBXStoredProcedure.Execute: integer;
+begin
+ SetParamValues(GetParams);
+ Result:=DoExecute;
+ GetParamValues(GetParams);
+end;
+
+procedure TDAEIBXStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ k: UnicodeString;
+begin
+ for I := 0 to AParams.Count - 1 do
+ if AParams[i].DataType = datWideMemo then begin
+ k := AParams[i].AsWideString;
+ {$IFDEF UNICODE}
+ AParams[i].DataType := datMemo;
+ {$ELSE}
+ AParams[i].DataType := datBlob;
+ {$ENDIF}
+ AParams[i].AsWideString:=k;
+ end;
+ SetParamValuesStd(AParams,TIBStoredProc(Dataset).Params);
+end;
+
+procedure TDAEIBXStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams,TIBStoredProc(Dataset).Params);
+end;
+
+function TDAEIBXStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TIBStoredProc(Dataset).StoredProcName
+end;
+
+procedure TDAEIBXStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TIBStoredProc(Dataset).StoredProcName := Name;
+end;
+
+procedure TDAEIBXStoredProcedure.RefreshParams;
+begin
+ // Apparently a bug in IBX requires to do so... Automatic gathering only works at runtime
+ TIBStoredProc(Dataset).Prepare;
+ RefreshParamsStd(TIBStoredProc(Dataset).Params);
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+function TDAEIBXStoredProcedure.DoExecute: integer;
+begin
+ TIBStoredProc(Dataset).ExecProc;
+ result := TIBStoredProc(Dataset).RowsAffected;
+end;
+
+var
+ FOldMonitoringEnabled : Boolean;
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+ FOldMonitoringEnabled := MonitoringEnabled;
+ DisableMonitoring;
+
+finalization
+ if FOldMonitoringEnabled then
+ EnableMonitoring
+ else
+ DisableMonitoring;
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAMyDACDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAMyDACDriver.pas
new file mode 100644
index 0000000..f8d68d9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAMyDACDriver.pas
@@ -0,0 +1,544 @@
+unit uDAMyDACDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up, Kylix 3 and up
+{ platform: Win32, Linux
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_MyDACDriver_Glyphs.res}
+{.$DEFINE ENABLE_SQLMonitor}
+{.$DEFINE MYSQL4Compatible}
+
+interface
+
+uses DB, Classes, uDAEngine, uDAInterfaces, {uDAADOInterfaces,} uROClasses, DBAccess, MyAccess,
+ {$IFDEF ENABLE_SQLMonitor}DASQLMonitor, MySQLMonitor,{$ENDIF ENABLE_SQLMonitor} uROBinaryHelpers, uDAUtils, uDAMySQLInterfaces;
+
+type { TDAMyDACDriver }
+ TDAMyDACDriver = class(TDADriverReference)
+ end;
+
+ { TDAEADODriver }
+ TDAEADODriver = class(TDAMySQLDriver)
+ private
+ {$IFDEF ENABLE_SQLMonitor}
+ fMonitor: TMySQLMonitor;
+ fTraceCallBack: TDALogTraceEvent;
+
+ procedure OnMyDACTrace(Sender: TObject; Text: string; Flag: TDATraceFlag);
+ {$ENDIF ENABLE_SQLMonitor}
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ {$IFDEF ENABLE_SQLMonitor}
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent); override;
+ {$ENDIF ENABLE_SQLMonitor}
+ // IDADriver
+ function GetDriverID: string; override; safecall;
+ function GetDescription: string; override; safecall;
+ function GetDefaultCustomParameters: string; override; safecall;
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ end;
+
+ { TDAEMyConnection }
+ TDAEMyConnection = class(TDAMySQLConnection, IDAMySQLConnection,IDACanQueryDatabaseNames)
+ private
+ function GetMyConnection: TMyConnection;
+
+ protected
+ function GetTableSchema: string; override;
+ function useUnicode:Boolean; override;
+
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ function GetDatabaseNames: IROStrings;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ property MyConnection: TMyConnection read GetMyConnection;
+ public
+ end;
+
+ { TDAEMyQuery }
+ TDAEMyQuery = class(TDAEDataset, IDAMustSetParams)
+ private
+
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: boolean); override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ public
+ end;
+
+ { TDAEADOStoredProcedure }
+ TDAEADOStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override;
+ function Execute: integer; override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ SysUtils,Variants,
+ uDADriverManager, uDARes;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAMyDACDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEADODriver.Create(nil);
+ result := _driver;
+end;
+
+{$IFDEF LATEST_MyDAC}
+{$I uDACRLabsUtils.inc}
+{$ENDIF LATEST_MyDAC}
+
+
+{$I uDACRLabsUtils.inc}
+{ TDAEMyConnection }
+
+function TDAEMyConnection.DoBeginTransaction: integer;
+begin
+ MyConnection.StartTransaction;
+ result := 0;
+end;
+
+procedure TDAEMyConnection.DoCommitTransaction;
+begin
+ MyConnection.Commit;
+end;
+
+function TDAEMyConnection.GetMyConnection: TMyConnection;
+begin
+ result := TMyConnection(inherited ConnectionObject);
+end;
+
+function TDAEMyConnection.CreateCustomConnection: TCustomConnection;
+begin
+ result := TMyConnection.Create(nil);
+ TMyConnection(result).LoginPrompt := FALSE;
+end;
+
+function TDAEMyConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEMyQuery;
+end;
+
+function TDAEMyConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEADOStoredProcedure;
+end;
+
+procedure TDAEMyConnection.DoGetStoredProcedureNames(out List: IROStrings);
+begin
+ {$IFDEF MYSQL4Compatible}
+ List := TROStrings.Create;
+ MyConnection.GetStoredProcNames(List.Strings);
+ {$ELSE}
+ inherited DoGetStoredProcedureNames(List);
+ {$ENDIF}
+end;
+
+procedure TDAEMyConnection.DoGetTableNames(out List: IROStrings);
+begin
+ {$IFDEF MYSQL4Compatible}
+ List := TROStrings.Create;
+ MyConnection.GetTableNames(List.Strings);
+ {$ELSE}
+ inherited DoGetTableNames(List);
+ {$ENDIF MYSQL4Compatible}
+end;
+
+procedure TDAEMyConnection.DoRollbackTransaction;
+begin
+ MyConnection.Rollback;
+end;
+
+function TDAEMyConnection.DoGetInTransaction: boolean;
+begin
+ result := MyConnection.InTransaction
+end;
+
+
+procedure TDAEMyConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+const
+ stdMSSQL_ConnectionString = 'User ID=%s;Password=%s;Initial Catalog=%s;Data Source=%s';
+var
+ adoconn: string;
+ i: integer;
+ sName,sValue: string;
+begin
+ inherited;
+
+ with aConnStrParser do begin
+ adoconn := Format(stdMSSQL_ConnectionString, [UserID, Password, Database, Server]);
+
+ MyConnection.Database := Database;
+
+ MyConnection.Server := Server;
+
+ if (Self.UserID <> '') then
+ MyConnection.Username := Self.UserID
+ else
+ MyConnection.Username := UserID;
+
+ if (Self.Password <> '') then
+ MyConnection.Password := Self.Password
+ else
+ MyConnection.Password := Password;
+ for i := 0 to AuxParamsCount -1 do
+ begin
+ sName := AuxParamNames[i];
+ sValue := AuxParams[AuxParamNames[i]];
+ if SameText('Port', sName) then MyConnection.Port:= StrToIntDef(sValue,3306);
+ if SameText('useUnicode', sName) then MyConnection.Options.UseUnicode:=StrToBoolDef(sValue,False);
+ end;
+ end;
+end;
+
+function TDAEMyConnection.GetTableSchema: string;
+begin
+ Result:=MyConnection.Database;
+end;
+
+function TDAEMyConnection.useUnicode: Boolean;
+begin
+ Result:= GetMyConnection.Options.UseUnicode;
+end;
+
+function TDAEMyConnection.GetDatabaseNames: IROStrings;
+begin
+ {$IFDEF MYSQL4Compatible}
+ Result := TROStrings.Create();
+ MyConnection.GetDatabaseNames(Result.Strings);
+ {$ELSE}
+ Result := inherited GetDatabaseNames;
+ {$ENDIF MYSQL4Compatible}
+end;
+
+procedure TDAEMyConnection.DoGetViewNames(out List: IROStrings);
+begin
+ {$IFDEF MYSQL4Compatible}
+ List := TROStrings.Create;
+ GetTablesList(MyConnection, List.Strings);
+ {$ELSE}
+ inherited DoGetViewNames(List);
+ {$ENDIF MYSQL4Compatible}
+end;
+
+procedure TDAEMyConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ {$IFDEF MYSQL4Compatible}
+ ForeignKeys := TDADriverForeignKeyCollection.Create(nil);
+ {$ELSE}
+ inherited DoGetForeignKeys(ForeignKeys);
+ {$ENDIF MYSQL4Compatible}
+end;
+
+procedure TDAEMyConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+{$IFDEF MYSQL4Compatible}
+var
+ cmd: IDASQLCommand;
+ {$ENDIF MYSQL4Compatible}
+begin
+ {$IFDEF MYSQL4Compatible}
+ cmd := NewCommand(aStoredProcedureName, stStoredProcedure);
+ cmd.RefreshParams;
+ Params := TDAParamCollection.Create(nil);
+ Params.AssignParamCollection(cmd.Params);
+ {$ELSE}
+ inherited DoGetStoredProcedureParams(aStoredProcedureName, Params);
+ {$ENDIF MYSQL4Compatible}
+end;
+
+procedure TDAEMyConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+{$IFDEF MYSQL4Compatible}
+ var
+ qry: IDADataset;
+{$ENDIF}
+begin
+ {$IFDEF MYSQL4Compatible}
+ Fields := TDAFieldCollection.Create(nil);
+ qry := GetDatasetClass.Create(Self);
+ try
+ qry.SQL := 'SELECT * FROM ' + QuoteIdentifierIfNeeded(aTableName) + ' WHERE 1=0';
+ qry.Open;
+ Fields.Assign(qry.Fields);
+ finally
+ qry := nil;
+ end;
+ {$ELSE}
+ inherited DoGetTableFields(aTableName, Fields);
+ {$ENDIF MYSQL4Compatible}
+end;
+
+{ TDAEADODriver }
+
+procedure TDAEADODriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ List.Add('useUnicode=(True;False)');
+end;
+
+function TDAEADODriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEMyConnection;
+end;
+
+function TDAEADODriver.GetDefaultCustomParameters: string;
+begin
+ Result:= inherited GetDefaultCustomParameters + 'useUnicode=False;';
+end;
+
+function TDAEADODriver.GetDescription: string;
+begin
+ result := 'Core Lab MyDAC Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEADODriver.GetDriverID: string;
+begin
+ result := 'MyDAC';
+end;
+
+{$IFDEF ENABLE_SQLMonitor}
+procedure TDAEADODriver.OnMyDACTrace(Sender: TObject; Text: string; Flag: TDATraceFlag);
+begin
+ if Assigned(fTraceCallback) then fTraceCallback(Sender, Text, integer(Flag));
+end;
+
+procedure TDAEADODriver.DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent);
+var
+ MyDACopts: TDATraceFlags;
+begin
+ inherited;
+
+ if TraceActive then begin
+ if (fMonitor = nil) then fMonitor := TMySQLMonitor.Create(Self);
+
+ fMonitor.Active := FALSE;
+ fMonitor.OnSQL := OnMyDACTrace;
+
+ MyDACopts := [];
+ if (toPrepare in TraceOptions) then MyDACopts := MyDACopts + [tfQPrepare];
+ if (toExecute in TraceOptions) then MyDACopts := MyDACopts + [tfQExecute];
+ if (toFetch in TraceOptions) then MyDACopts := MyDACopts + [tfQFetch];
+ if (toError in TraceOptions) then MyDACopts := MyDACopts + [tfError];
+ if (toStmt in TraceOptions) then MyDACopts := MyDACopts + [tfStmt];
+ if (toConnect in TraceOptions) then MyDACopts := MyDACopts + [tfConnect];
+ if (toTransact in TraceOptions) then MyDACopts := MyDACopts + [tfTransact];
+ if (toBlob in TraceOptions) then MyDACopts := MyDACopts + [tfBlob];
+ if (toService in TraceOptions) then MyDACopts := MyDACopts + [tfService];
+ if (toMisc in TraceOptions) then MyDACopts := MyDACopts + [tfMisc];
+ if (toParams in TraceOptions) then MyDACopts := MyDACopts + [tfParams];
+
+ fTraceCallBack := Callback;
+
+ fMonitor.TraceFlags := MyDACopts;
+ fMonitor.Active := TRUE;
+ end
+ else begin
+ FreeAndNIL(fMonitor);
+ fTraceCallback := nil;
+ end;
+end;
+{$ENDIF ENABLE_SQLMonitor}
+
+{ TDAEMyQuery }
+
+function TDAEMyQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TMyQuery.Create(nil);
+ TMyQuery(result).ReadOnly := TRUE;
+ TMyQuery(result).Connection := TDAEMyConnection(aConnection).MyConnection;
+ TMyQuery(result).FetchAll := True; //for preventing creating an additional session when you call StartTransaction (an known issue of OLEDB)
+
+// GetLastAutoInc will work in case these options is commented
+// TMyQuery(result).FetchAll := False;
+// TMyQuery(result).Unidirectional := True;
+end;
+
+function TDAEMyQuery.DoExecute: integer;
+begin
+ TMyQuery(Dataset).Execute;
+ result := TMyQuery(Dataset).RowsAffected;
+end;
+
+function TDAEMyQuery.DoGetSQL: string;
+begin
+ result := TMyQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEMyQuery.DoPrepare(Value: boolean);
+begin
+ // Do not do inherited DoPrepare for MySQL.
+ {with TMyQuery(Dataset) do begin
+ if not Options.Direct then Prepared := Value;
+ end;}
+end;
+
+procedure TDAEMyQuery.DoSetSQL(const Value: string);
+begin
+ TMyQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEMyQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteCrLabsParamValues(AParams, TMyQuery(Dataset).Params);
+end;
+
+procedure TDAEMyQuery.GetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+ par: uDAInterfaces.TDAParam;
+ inpar: TParam;
+begin
+ for i := 0 to (AParams.Count - 1) do begin
+ par := AParams[i];
+ inpar := TMyQuery(Dataset).Params.ParamByName(par.Name);
+ par.Value := inpar.Value;
+ end;
+end;
+
+procedure TDAEMyQuery.ClearParams;
+begin
+ inherited;
+ TMyQuery(Dataset).Params.Clear;
+end;
+
+{ TDAEADOStoredProcedure }
+
+function TDAEADOStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ result := TMyStoredProc.Create(nil);
+ TMyStoredProc(result).Connection := TDAEMyConnection(aConnection).MyConnection;
+end;
+
+function TDAEADOStoredProcedure.Execute: integer;
+begin
+ SetParamValues(GetParams);
+ Result:= DoExecute;
+ GetParamValues(GetParams);
+end;
+
+function TDAEADOStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TMyStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEADOStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TMyStoredProc(Dataset).StoredProcName := Name;
+end;
+
+procedure TDAEADOStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteCrLabsParamValues(AParams, TMyStoredProc(Dataset).Params);
+end;
+
+procedure TDAEADOStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+var
+ i: Integer;
+ lParam: DBAccess.TDAParam;
+begin
+ for i := 0 to TMyStoredProc(DataSet).Params.Count - 1 do begin
+ lParam:=TMyStoredProc(DataSet).Params[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ Aparams.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+procedure TDAEADOStoredProcedure.RefreshParams;
+begin
+ TMyStoredProc(Dataset).Prepare;
+ RefreshParamsStd(TMyStoredProc(DataSet).Params);
+end;
+
+function TDAEADOStoredProcedure.DoExecute: integer;
+begin
+ TMyStoredProc(Dataset).ExecProc;
+ Result := -1;
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAMySQLDACDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAMySQLDACDriver.pas
new file mode 100644
index 0000000..bc9702a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAMySQLDACDriver.pas
@@ -0,0 +1,366 @@
+unit uDAMySQLDACDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up, Kylix 3 and up
+{ platform: Win32, Linux
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_MySQLDACDriver_Glyphs.res}
+
+interface
+
+uses DB, Classes, uDAEngine, uDAInterfaces, uDAADOInterfaces, uROClasses,
+ uROBinaryHelpers, uDAUtils, mySQLAccess, mySQLDbTables, mySQLTypes, uDAMySQLInterfaces;
+
+type { TDAMySQLDACDriver }
+ TDAMySQLDacDriver = class(TDADriverReference)
+ end;
+
+ { TDAEMySQLDacDriver }
+ TDAEMySQLDacDriver = class(TDAMySQLDriver)
+ private
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+
+ // IDADriver
+ function GetDriverID: string; override; safecall;
+ function GetDescription: string; override; safecall;
+ end;
+
+ { TDAEMyConnection }
+ TDAEMySQLDacConnection = class(TDAMySQLConnection, IDACanQueryDatabaseNames,IDAMySQLConnection)
+ private
+ function GetConnection: TmySQLDatabase;
+
+ protected
+ function GetTableSchema: string; override;
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+
+ property Connection: TmySQLDatabase read GetConnection;
+ public
+ end;
+
+ { TDAEMySQLDacQuery }
+ TDAEMySQLDacQuery = class(TDAEDataset, IDAMustSetParams)
+ private
+
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: boolean); override;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ public
+ end;
+
+ { TDAEMySQLDacStoredProcedure }
+ TDAEMySQLDacStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override;
+ function Execute: integer; override;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ SysUtils,
+ uDADriverManager, uDARes, uDAMacroProcessors;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAMySQLDACDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEMySQLDacDriver.Create(nil);
+ result := _driver;
+end;
+
+{$IFDEF LATEST_MyDAC}
+{$I uDACRLabsUtils.inc}
+{$ENDIF LATEST_MyDAC}
+
+{ TDAEMySQLDacConnection }
+
+function TDAEMySQLDacConnection.DoBeginTransaction: integer;
+begin
+ Connection.StartTransaction;
+ result := 0;
+end;
+
+procedure TDAEMySQLDacConnection.DoCommitTransaction;
+begin
+ Connection.Commit;
+end;
+
+function TDAEMySQLDacConnection.GetConnection: TmySQLDatabase;
+begin
+ result := TmySQLDatabase(inherited ConnectionObject);
+end;
+
+function TDAEMySQLDacConnection.CreateCustomConnection: TCustomConnection;
+begin
+ result := TmySQLDatabase.Create(nil);
+ TmySQLDatabase(result).LoginPrompt := false;
+end;
+
+function TDAEMySQLDacConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEMySQLDacQuery;
+end;
+
+function TDAEMySQLDacConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEMySQLDacStoredProcedure;
+end;
+
+
+procedure TDAEMySQLDacConnection.DoRollbackTransaction;
+begin
+ Connection.Rollback;
+end;
+
+function TDAEMySQLDacConnection.DoGetInTransaction: boolean;
+begin
+ result := Connection.InTransaction
+end;
+
+
+
+procedure TDAEMySQLDacConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+var
+ i: Integer;
+begin
+ inherited;
+
+ with aConnStrParser do begin
+ Connection.DatabaseName := Database;
+
+ Connection.Host := Server;
+
+ if (Self.UserID <> '') then
+ Connection.Username := Self.UserID
+ else
+ Connection.Username := UserID;
+
+ if (Self.Password <> '') then
+ Connection.UserPassword := Self.Password
+ else
+ Connection.UserPassword := Password;
+ if AuxParams['Port'] <> '' then Connection.Port := StrToIntDef(AuxParams['Port'],3306);
+
+ for i := 0 to AuxParamsCount -1 do
+ begin
+ if SameText(AuxParamNames[i], 'Port') then continue;
+ if AuxParams[AuxParamNames[i]] <> '' then
+ Connection.Params.Add(AuxParamNames[i]+'='+AuxParams[AuxParamNames[i]]);
+ end;
+ end;
+end;
+
+
+function TDAEMySQLDacConnection.GetTableSchema: string;
+begin
+ Result:=Connection.DatabaseName;
+end;
+
+{ TDAEMySQLDacDriver }
+
+
+function TDAEMySQLDacDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEMySQLDacConnection;
+end;
+
+function TDAEMySQLDacDriver.GetDescription: string;
+begin
+ result := 'MicroOlap DAC for MySQL Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEMySQLDacDriver.GetDriverID: string;
+begin
+ result := 'MySQLDAC';
+end;
+
+
+{ TDAEMySQLDacQuery }
+
+procedure TDAEMySQLDacQuery.ClearParams;
+begin
+ inherited;
+ TmySQLQuery(Dataset).Params.Clear;
+end;
+
+function TDAEMySQLDacQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TmySQLQuery.Create(nil);
+
+ TmySQLQuery(result).RequestLive := false;
+ TmySQLQuery(result).UniDirectional:=True;
+ TMySqlQuery(result).Database := TDAEMySQLDacConnection(aConnection).Connection;
+end;
+
+function TDAEMySQLDacQuery.DoExecute: integer;
+begin
+ TmySQLQuery(Dataset).ExecSQL;
+ result := TmySQLQuery(Dataset).RowsAffected;
+end;
+
+function TDAEMySQLDacQuery.DoGetSQL: string;
+begin
+ result := TmySQLQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEMySQLDacQuery.DoPrepare(Value: boolean);
+begin
+ TmySQLQuery(Dataset).Prepared := Value;
+end;
+
+procedure TDAEMySQLDacQuery.DoSetSQL(const Value: string);
+begin
+ TmySQLQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEMySQLDacQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TmySQLQuery(Dataset).Params);
+end;
+
+procedure TDAEMySQLDacQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TmySQLQuery(Dataset).Params);
+end;
+
+
+{ TDAEADOStoredProcedure }
+
+function TDAEMySQLDacStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ result := TmySQLStoredProc.Create(nil);
+ TmySQLStoredProc(result).Database := TDAEMySQLDacConnection(aConnection).Connection;
+end;
+
+function TDAEMySQLDacStoredProcedure.Execute: integer;
+var
+ i: integer;
+ _params: TDAParamCollection;
+ lParam: TmySQLSPParam;
+begin
+ _params := GetParams;
+
+ with TmySQLStoredProc(Dataset) do begin
+ for i := 0 to (Params.Count-1) do begin
+ lParam:=Params[i];
+ if (lParam.ParamType in [ptInput, ptInputOutput]) then
+ lParam.Value := _params.ParamByName(lParam.Name).Value;
+ end;
+
+ Result:= DoExecute;
+
+ for i := 0 to (Params.Count-1) do begin
+ lParam:=Params[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ _params.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+ end;
+end;
+
+function TDAEMySQLDacStoredProcedure.GetStoredProcedureName: string;
+begin
+ Result := TmySQLStoredProc(Dataset).ProcedureName;
+end;
+
+procedure TDAEMySQLDacStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TmySQLStoredProc(Dataset).ProcedureName := Name;
+end;
+
+procedure TDAEMySQLDacStoredProcedure.RefreshParams;
+begin
+ RefreshParamsStd(TmySQLStoredProc(Dataset).Params);
+end;
+
+procedure TDAEMySQLDacStoredProcedure.GetParamValues(
+ AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TmySQLStoredProc(Dataset).Params);
+end;
+
+procedure TDAEMySQLDacStoredProcedure.SetParamValues(
+ AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TmySQLStoredProc(Dataset).Params);
+end;
+
+exports GetDriverObject name func_GetDriverObject;
+
+function TDAEMySQLDacStoredProcedure.DoExecute: integer;
+begin
+ TmySQLStoredProc(Dataset).ExecProc;
+ result := -1;
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDANexusDBDriver.dcr b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDANexusDBDriver.dcr
new file mode 100644
index 0000000..52a0cec
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDANexusDBDriver.dcr differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDANexusDBDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDANexusDBDriver.pas
new file mode 100644
index 0000000..5d82280
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDANexusDBDriver.pas
@@ -0,0 +1,1149 @@
+unit uDANexusDBDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{ (c)opyright Nexus Database Systems Pty. Ltd.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+interface
+
+uses
+ Classes,
+ DB,
+
+ uDAEngine,
+ uDAInterfaces,
+ uROClasses,
+
+ nxllMemoryManager,
+ nxllSync,
+ nxllComponent,
+ nxllTransport,
+
+ nxsdServerEngine,
+
+ nxdb,
+
+ {$IFNDEF DataAbstract_NexusDBPack}
+ nxptBasePooledTransport,
+ nxtwWinsockTransport,
+ nxtnNamedPipeTransport,
+
+ nxreRemoteServerEngine,
+ {$ENDIF}
+
+ nxsrSqlEngineBase,
+ nxsrServerEngine,
+
+ nxsqlEngine,
+
+ //nx1xAllEngines,
+ nxseAllEngines, // // NXDB2: Renamed
+ uDAUtils;
+
+type
+ TDANexusDBDriver = class(TDADriverReference)
+ end;
+
+ INexusDBConnection = interface
+ ['{DFF41623-A766-44C0-A61A-CC18FB80CAE3}']
+ end;
+
+ INexusDBDriver = interface
+ ['{CFE4B5BB-3C38-40BF-BE57-5BE3C627A6C3}']
+ procedure RegisterServerEngine(aServerEngine: TnxBaseServerEngine;
+ const aName: string); safecall;
+
+ procedure UnregisterServerEngine(aServerEngine: TnxBaseServerEngine); overload; safecall;
+ procedure UnregisterServerEngine(const aName: string); overload; safecall;
+ end;
+
+ TNexusDBConnection = class;
+
+ TNexusDBBaseEngineContainer = class(TnxObject)
+ protected {private}
+ becServerName: string;
+
+ becConnectionsHead : TNexusDBConnection;
+ becConnectionsTail : TNexusDBConnection;
+ protected
+ function becGetEngine: TnxBaseServerEngine; virtual; abstract;
+ public
+ constructor Create(aServerName: string);
+ destructor Destroy; override;
+
+ procedure CheckedFree; virtual;
+
+ property Engine: TnxBaseServerEngine
+ read becGetEngine;
+ end;
+
+ TNexusDBConnection = class(TDAConnectionWrapper)
+ protected {private}
+ conEngineContainer : TNexusDBBaseEngineContainer;
+ conEngineContainerNext : TNexusDBConnection;
+ conEngineContainerPrev : TNexusDBConnection;
+ conEngineContainerAdded : Boolean;
+
+ conSession : TnxSession;
+ conDatabase : TnxDatabase;
+
+ procedure conSetEngineContainer(aContainer: TNexusDBBaseEngineContainer);
+ protected
+ function GetConnected: Boolean; override;
+ procedure SetConnected(Value: Boolean); override;
+
+ procedure conAddToEngineContainer;
+ procedure conRemoveFromEngineContainer;
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ property EngineContainer: TNexusDBBaseEngineContainer read conEngineContainer write conSetEngineContainer;
+ property Session: TnxSession read conSession;
+ property Database: TnxDatabase read conDatabase;
+ end;
+
+ TDAENexusDBDriver = class(TDAEDriver, INexusDBDriver)
+ protected {private}
+ nxdEnginesPadlock: TnxPadlock;
+ nxdEngines: TStringList;
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+
+ { IDADriver }
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override;
+ function GetDefaultCustomParameters: string; override; safecall;
+ { INexusDBDriver }
+ procedure RegisterServerEngine(aServerEngine: TnxBaseServerEngine;const aName: string); safecall;
+
+ procedure UnregisterServerEngine(aServerEngine: TnxBaseServerEngine); overload; safecall;
+ procedure UnregisterServerEngine(const aName: string); overload; safecall;
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; safecall;
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ end;
+
+ { TDAENexusDBConnection }
+ TDAENexusDBConnection = class(TDAEConnection, INexusDBConnection)
+ private
+ dacConnection: TNexusDBConnection;
+ protected
+ { IDAConnection }
+ function CreateCustomConnection: TCustomConnection; override;
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject : TCustomConnection); override;
+ function DoBeginTransaction: Integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: Boolean; override;
+
+ procedure DoGetTableNames(out aList: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetTableFields(const aTableName : string;
+ out aFields : TDAFieldCollection); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAENexusDBQuery }
+ TDAENexusDBQuery = class(TDAEDataset, IDAMustSetParams)
+ private
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataSet; override;
+ procedure ClearParams; override;
+ function DoExecute: Integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: Boolean); override;
+
+ { IDAMustSetParams }
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAENexusStoredProcedure }
+ TDAENexusStoredProcedure = class(TDAEStoredProcedure, IDAStoredProcedure, IDAMustSetParams)
+ protected
+ // Internal
+ // function DoGetStoredProcedureName: string; override;
+ // procedure DoSetStoredProcedureName(const Name: string); override;
+
+ // IDAStoredProcedure
+ function GetStoredProcedureName: string; override; safecall;
+ procedure SetStoredProcedureName(const Name: string); override; safecall;
+
+ // procedure PrepareSQLStatement; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure DoPrepare(Value: boolean); override; safecall;
+ function DoExecute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Execute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoSetSQL(const Value: string); override; safecall;
+ function DoGetSQL: string; override; safecall;
+ // function intVCLTypeToDAType(aFieldType: TFieldType): TDADataType;override;
+
+ { IDASQLCommand }
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function DoGetRecordCount: integer; override;
+ // function DoGetActive: boolean; override;
+ // procedure DoSetActive(Value: boolean); override;
+ // function DoGetBOF: boolean; override;
+ // function DoGetEOF: boolean; override;
+ // procedure DoNext; override;
+ // function DoLocate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+const
+ Nexus_DriverType = 'Nexus';
+implementation
+
+uses
+ SysUtils,
+
+ nxllUtils,nxsdTypes,nxsqlBase,
+
+ uDADriverManager,
+ uDARes,
+ uDAMacroProcessors,
+
+ TypInfo;
+
+const
+ csUrlSeperator = '://';
+
+ csEmbedded = 'embedded';
+ csRegistered = 'registered';
+ csEmbeddedDefault = 'embedded://default';
+
+ csAlias = 'alias';
+ csPath = 'path';
+
+ csNexusDB = 'NexusDB';
+ csNexusDBDriver = 'NexusDB Driver';
+
+resourcestring
+ rsEmbeddedOnly = ' [embedded only]';
+ rsThisDriverOnlySupportsEmbeddedServerEngines = 'This driver only supports embedded server engines. Connections to remote server engines require a full NexusDB license.';
+ rsNoProtocolHasBeenSpecified = 'No protocol has been specified';
+ rsNoServerEngineHasBeenRegisteredAs = 'No Server Engine has been registered as "%s"';
+ rsNoTransportAvailableForProtocol = 'No transport available for protocol "%s"';
+ rsUnknownDatabaseType = 'Unknown database type "%s"';
+
+var
+ _driver : TDAENexusDBDriver = nil;
+
+{===Register===================================================================}
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDANexusDBDriver]);
+end;
+{==============================================================================}
+
+
+
+{===GetDriverObject============================================================}
+{$IFDEF DataAbstract_SchemaModelerOnly}{$INCLUDE DataAbstract_SchemaModelerOnly.inc}{$ENDIF DataAbstract_SchemaModelerOnly}
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ Result := nil;
+ Exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAENexusDBDriver.Create(nil);
+ Result := _driver;
+end;
+{==============================================================================}
+
+
+
+{===TNexusDBBaseEngineContainer================================================}
+procedure TNexusDBBaseEngineContainer.CheckedFree;
+begin
+ if not Assigned(becConnectionsHead) then
+ Free;
+end;
+{------------------------------------------------------------------------------}
+constructor TNexusDBBaseEngineContainer.Create(aServerName: string);
+begin
+ becServerName := aServerName;
+
+ inherited Create;
+
+ _driver.nxdEnginesPadlock.Lock;
+ try
+ _driver.nxdEngines.AddObject(aServerName, Self);
+ finally
+ _driver.nxdEnginesPadlock.Unlock;
+ end;
+end;
+{------------------------------------------------------------------------------}
+destructor TNexusDBBaseEngineContainer.Destroy;
+var
+ i : Integer;
+begin
+ if Assigned(_driver) then begin
+ _driver.nxdEnginesPadlock.Lock;
+ try
+ with _driver.nxdEngines do
+ if Find(becServerName, i) and (Objects[i] = Self) then
+ Delete(i);
+ while Assigned(becConnectionsHead) do try
+ becConnectionsHead.EngineContainer := nil;
+ except end;
+ finally
+ _driver.nxdEnginesPadlock.Unlock;
+ end;
+ end;
+
+ inherited;
+end;
+{==============================================================================}
+
+
+
+{===TNexusDBEmbeddedEngineContainer============================================}
+type
+ TNexusDBEmbeddedEngineContainer = class(TNexusDBBaseEngineContainer)
+ protected {private}
+ eecServerEngine: TnxServerEngine;
+ protected
+ function becGetEngine: TnxBaseServerEngine; override;
+ public
+ constructor Create(aServerName: string);
+ destructor Destroy; override;
+
+ procedure CheckedFree; override;
+ end;
+function TNexusDBEmbeddedEngineContainer.becGetEngine: TnxBaseServerEngine;
+begin
+ Result := eecServerEngine;
+end;
+{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
+procedure TNexusDBEmbeddedEngineContainer.CheckedFree;
+begin
+ if not SameText(becServerName, csEmbeddedDefault) then
+ inherited;
+end;
+{------------------------------------------------------------------------------}
+constructor TNexusDBEmbeddedEngineContainer.Create(aServerName: string);
+begin
+ eecServerEngine := TnxServerEngine.Create(nil);
+ eecServerEngine.SqlEngine := TnxSqlEngine.Create(eecServerEngine);
+ eecServerEngine.Open;
+
+ inherited Create(aServerName);
+end;
+{------------------------------------------------------------------------------}
+destructor TNexusDBEmbeddedEngineContainer.Destroy;
+begin
+ inherited;
+ FreeAndNil(eecServerEngine);
+end;
+{==============================================================================}
+
+
+
+{$IFNDEF DataAbstract_NexusDBPack}
+{==============================================================================}
+type
+ TNexusDBRemoteEngineContainer = class(TNexusDBBaseEngineContainer)
+ protected {private}
+ recTransport: TnxBaseTransport;
+ recServerEngine: TnxRemoteServerEngine;
+ protected
+ function becGetEngine: TnxBaseServerEngine; override;
+ public
+ constructor Create(aServerName, aAuxParamsString: string;
+ aTransportClass: TnxBaseTransportClass);
+ destructor Destroy; override;
+ end;
+{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
+function TNexusDBRemoteEngineContainer.becGetEngine: TnxBaseServerEngine;
+begin
+ Result := recServerEngine;
+end;
+{------------------------------------------------------------------------------}
+constructor TNexusDBRemoteEngineContainer.Create(aServerName, aAuxParamsString: string;
+ aTransportClass: TnxBaseTransportClass);
+var
+ S,
+ N,
+ V : string;
+ AuxParams : IROStrings;
+ i : integer;
+
+ procedure SetProperty(Instance: TObject; const Prefix, Name, Value: string);
+ begin
+ if (Pos(Prefix, Name) = 1) then
+ begin
+ SetPropValue(Instance,
+ Copy(Name, Length(Prefix) + 1, Length(Name)),
+ Value);
+ end;
+ end;
+
+begin
+ S := aServerName;
+ Delete(S, 1, Pos(csUrlSeperator, S) + 2);
+
+ AuxParams := ListStringElements(aAuxParamsString);
+
+ recTransport := aTransportClass.Create(nil);
+ recTransport.ServerName := S;
+
+ recServerEngine := TnxRemoteServerEngine.Create(nil);
+ recServerEngine.Transport := recTransport;
+
+ for i := 0 to AuxParams.Count-1 do
+ begin
+ N := AuxParams.Names[i];
+ V := AuxParams.Values[AuxParams.Names[i]];
+ SetProperty(recTransport, 'Transport.', N, V);
+ SetProperty(recServerEngine, 'Server.', N, V);
+ end;
+
+ recTransport.Open;
+ recServerEngine.Open;
+
+ inherited Create(aServerName);
+end;
+{------------------------------------------------------------------------------}
+destructor TNexusDBRemoteEngineContainer.Destroy;
+begin
+ inherited;
+ FreeAndNil(recServerEngine);
+ FreeAndNil(recTransport);
+end;
+{==============================================================================}
+{$ENDIF}
+
+
+
+{===TNexusDBRegisteredEngineContainer==========================================}
+type
+ TNexusDBRegisteredEngineContainer = class(TNexusDBBaseEngineContainer)
+ protected {private}
+ regecServerEngine: TnxBaseServerEngine;
+ protected
+ function becGetEngine: TnxBaseServerEngine; override;
+ public
+ constructor Create(aServerName: string;
+ aServerEngine: TnxBaseServerEngine);
+
+ procedure CheckedFree; override;
+ end;
+{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
+function TNexusDBRegisteredEngineContainer.becGetEngine: TnxBaseServerEngine;
+begin
+ Result := regecServerEngine;
+end;
+{------------------------------------------------------------------------------}
+procedure TNexusDBRegisteredEngineContainer.CheckedFree;
+begin
+ {never}
+end;
+{------------------------------------------------------------------------------}
+constructor TNexusDBRegisteredEngineContainer.Create(aServerName: string;
+ aServerEngine: TnxBaseServerEngine);
+begin
+ regecServerEngine := aServerEngine;
+ inherited Create(aServerName);
+end;
+{==============================================================================}
+
+
+
+{===TNexusDBConnection=========================================================}
+procedure TNexusDBConnection.conAddToEngineContainer;
+begin
+ if conEngineContainerAdded then
+ Exit;
+ if not Assigned(conEngineContainer) then
+ Exit;
+
+ _driver.nxdEnginesPadlock.Lock;
+ try
+ conEngineContainerPrev := conEngineContainer.becConnectionsTail;
+ conEngineContainer.becConnectionsTail := Self;
+ if Assigned(conEngineContainerPrev) then
+ conEngineContainerPrev.conEngineContainerNext := Self;
+ if not Assigned(conEngineContainer.becConnectionsHead) then
+ conEngineContainer.becConnectionsHead := Self;
+ finally
+ _driver.nxdEnginesPadlock.Unlock;
+ end;
+
+ conEngineContainerAdded := True;
+end;
+{------------------------------------------------------------------------------}
+procedure TNexusDBConnection.conRemoveFromEngineContainer;
+begin
+ if not conEngineContainerAdded then
+ Exit;
+
+ _driver.nxdEnginesPadlock.Lock;
+ try
+ if Assigned(conEngineContainerNext) then
+ conEngineContainerNext.conEngineContainerPrev := conEngineContainerPrev
+ else
+ if conEngineContainer.becConnectionsTail = Self then
+ conEngineContainer.becConnectionsTail := conEngineContainerPrev;
+
+ if Assigned(conEngineContainerPrev) then
+ conEngineContainerPrev.conEngineContainerNext := conEngineContainerNext
+ else
+ if conEngineContainer.becConnectionsHead = Self then
+ conEngineContainer.becConnectionsHead := conEngineContainerNext;
+
+ conEngineContainerNext := nil;
+ conEngineContainerPrev := nil;
+
+ conEngineContainer.CheckedFree;
+ conEngineContainer := nil;
+ finally
+ _driver.nxdEnginesPadlock.Unlock;
+ end;
+ conEngineContainerAdded := False;
+end;
+{------------------------------------------------------------------------------}
+procedure TNexusDBConnection.conSetEngineContainer(aContainer: TNexusDBBaseEngineContainer);
+begin
+ if conEngineContainer <> aContainer then begin
+ conSession.Close;
+ conSession.ServerEngine := nil;
+
+ conRemoveFromEngineContainer;
+
+ conEngineContainer := aContainer;
+ if Assigned(conEngineContainer) then
+ conSession.ServerEngine := conEngineContainer.Engine;
+
+ conAddToEngineContainer;
+ end;
+end;
+{------------------------------------------------------------------------------}
+constructor TNexusDBConnection.Create(aOwner: TComponent);
+begin
+ inherited;
+
+ conSession := TnxSession.Create(Self);
+ conDatabase := TnxDatabase.Create(Self);
+ conDatabase.Session := conSession;
+end;
+{------------------------------------------------------------------------------}
+destructor TNexusDBConnection.Destroy;
+begin
+ EngineContainer := nil;
+ inherited;
+end;
+{------------------------------------------------------------------------------}
+function TNexusDBConnection.GetConnected: Boolean;
+begin
+ Result := conDatabase.Connected;
+end;
+{------------------------------------------------------------------------------}
+procedure TNexusDBConnection.SetConnected(Value: Boolean);
+begin
+ if (csDestroying in ComponentState) then Exit;
+
+ try
+ conSession.Active := Value;
+ conDatabase.Connected := Value;
+ except
+ conSession.Active := False;
+ conDatabase.Connected := False;
+ raise;
+ end;
+end;
+{==============================================================================}
+
+
+
+{===TDAENexusDBDriver==========================================================}
+constructor TDAENexusDBDriver.Create(aOwner: TComponent);
+begin
+ inherited;
+ nxdEnginesPadlock := TnxPadlock.Create;
+ nxdEngines := TStringList.Create;
+end;
+{------------------------------------------------------------------------------}
+destructor TDAENexusDBDriver.Destroy;
+var
+ i : Integer;
+begin
+ if Assigned(nxdEnginesPadlock) then begin
+ nxdEnginesPadlock.Lock;
+ try
+ if Assigned(nxdEngines) then begin
+ for i := Pred(nxdEngines.Count) downto 0 do
+ nxdEngines.Objects[i].Free;
+ nxdEngines.Clear;
+ end;
+ finally
+ nxdEnginesPadlock.Unlock;
+ end;
+ end;
+ inherited;
+ FreeAndNil(nxdEnginesPadlock);
+ FreeAndNil(nxdEngines);
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBDriver.GetAuxParams(const AuxDriver: string; out List: IROStrings);
+begin
+ inherited;
+end;
+{------------------------------------------------------------------------------}
+function TDAENexusDBDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ {$IFDEF DataAbstract_NexusDBPack}
+ Result := [doDatabaseName];
+ {$ELSE}
+ Result := [doServerName, doDatabaseName, doLogin, doCustom];
+ {$ENDIF}
+end;
+{------------------------------------------------------------------------------}
+function TDAENexusDBDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ Result := TDAENexusDBConnection;
+end;
+{------------------------------------------------------------------------------}
+function TDAENexusDBDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ Result:=Nexus_DriverType;
+end;
+
+function TDAENexusDBDriver.GetDefaultCustomParameters: string;
+begin
+ Result:='';
+end;
+
+function TDAENexusDBDriver.GetDescription: string;
+begin
+ Result := csNexusDBDriver
+ {$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF}
+ {$IFDEF DataAbstract_NexusDBPack} + rsEmbeddedOnly{$ENDIF};
+end;
+{------------------------------------------------------------------------------}
+function TDAENexusDBDriver.GetDriverID: string;
+begin
+ Result := csNexusDB;
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBDriver.RegisterServerEngine(aServerEngine : TnxBaseServerEngine;
+ const aName : string);
+begin
+ TNexusDBRegisteredEngineContainer.Create(csRegistered + csUrlSeperator + aName, aServerEngine);
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBDriver.UnregisterServerEngine(aServerEngine : TnxBaseServerEngine);
+var
+ i : Integer;
+begin
+ _driver.nxdEnginesPadlock.Lock;
+ try
+ for i := Pred(_driver.nxdEngines.Count) downto 0 do
+ if _driver.nxdEngines.Objects[i] is TNexusDBRegisteredEngineContainer then
+ if TNexusDBRegisteredEngineContainer(_driver.nxdEngines.Objects[i]).regecServerEngine = aServerEngine then
+ _driver.nxdEngines.Objects[i].Free;
+ finally
+ _driver.nxdEnginesPadlock.Unlock;
+ end;
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBDriver.UnregisterServerEngine(const aName : string);
+var
+ i : Integer;
+begin
+ _driver.nxdEnginesPadlock.Lock;
+ try
+ if _driver.nxdEngines.Find(csRegistered + csUrlSeperator + aName, i) then
+ _driver.nxdEngines.Objects[i].Free;
+ finally
+ _driver.nxdEnginesPadlock.Unlock;
+ end;
+end;
+{==============================================================================}
+
+
+
+{===TDAENexusDBConnection======================================================}
+function TDAENexusDBConnection.CreateCustomConnection: TCustomConnection;
+begin
+ Result := TNexusDBConnection.Create(nil);
+ dacConnection := TNexusDBConnection(Result);
+end;
+{------------------------------------------------------------------------------}
+function TDAENexusDBConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ Result := TOracleMacroProcessor.Create;
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBConnection.DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject : TCustomConnection);
+var
+ S, T : string;
+ i : Integer;
+ sl : TStringList;
+ tpc : TnxBaseTransportClass;
+begin
+ inherited;
+
+ with aConnStrParser do begin
+ (aConnectionObject as TNexusDBConnection).Session.Close;
+
+ if Self.UserID <> '' then
+ dacConnection.Session.Username := Self.UserID
+ else
+ dacConnection.Session.Username := UserID;
+
+ if Self.Password <> '' then
+ dacConnection.Session.Password := Self.Password
+ else
+ dacConnection.Session.Password := Password;
+
+ Server := Trim(Server);
+
+ if Server = '' then
+ Server := csEmbeddedDefault;
+
+ _driver.nxdEnginesPadlock.Lock;
+ try
+ S := Server;
+ SetLength(S, nxMaxI32(0, Pred(Pos(csUrlSeperator, S))));
+
+ if S = '' then
+ raise EDADriverException.Create(rsNoProtocolHasBeenSpecified);
+
+ if not _driver.nxdEngines.Find(Server, i) then begin
+
+ if SameText(S, csEmbedded) then begin
+ (aConnectionObject as TNexusDBConnection).EngineContainer :=
+ TNexusDBEmbeddedEngineContainer.Create(Server);
+ end else if SameText(S, csRegistered) then begin
+ raise EDADriverException.CreateFmt(rsNoServerEngineHasBeenRegisteredAs, [Server]);
+ end else begin
+ {$IFDEF DataAbstract_NexusDBPack}
+ raise EDADriverException.Create(rsThisDriverOnlySupportsEmbeddedServerEngines);
+ {$ELSE}
+ sl := TStringList.Create;
+ try
+ TnxBaseDirectTransport.GetRegisteredClasses(sl);
+ tpc := nil;
+ for i := 0 to Pred(sl.Count) do
+ if SameText(S, TnxBaseTransportClass(sl.Objects[i]).ProtocolName) then begin
+ tpc := TnxBaseTransportClass(sl.Objects[i]);
+ Break;
+ end;
+ if not Assigned(tpc) then
+ raise EDADriverException.CreateFmt(rsNoTransportAvailableForProtocol, [S]);
+ (aConnectionObject as TNexusDBConnection).EngineContainer :=
+ TNexusDBRemoteEngineContainer.Create(Server, AuxParamsString, tpc);
+ finally
+ FreeAndNil(sl);
+ end;
+ {$ENDIF}
+ end;
+ end else
+ (aConnectionObject as TNexusDBConnection).EngineContainer :=
+ (_driver.nxdEngines.Objects[i] as TNexusDBBaseEngineContainer);
+ finally
+ _driver.nxdEnginesPadlock.Unlock;
+ end;
+
+ Database := Trim(Database);
+
+ S := Database;
+ SetLength(S, nxMaxI32(0, Pred(Pos(csUrlSeperator, S))));
+ if Pos(csUrlSeperator, Database) > 0 then
+ T := Copy(Database, Length(S) + 4, High(Integer))
+ else
+ T := Database;
+
+ if S = '' then
+ if (aConnectionObject as TNexusDBConnection).EngineContainer.becGetEngine is TnxServerEngine then
+ S := csPath
+ else
+ S := csAlias;
+
+ if SameText(S, csAlias) then
+ (aConnectionObject as TNexusDBConnection).Database.AliasName := T
+ else if SameText(S, csPath) then
+ (aConnectionObject as TNexusDBConnection).Database.AliasPath := T
+ else
+ raise EDADriverException.CreateFmt(rsUnknownDatabaseType, [S]);
+
+ end;
+end;
+{------------------------------------------------------------------------------}
+function TDAENexusDBConnection.DoBeginTransaction: Integer;
+begin
+ Result := -1;
+ dacConnection.Database.StartTransaction;
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBConnection.DoCommitTransaction;
+begin
+ dacConnection.Database.Commit;
+end;
+{------------------------------------------------------------------------------}
+function TDAENexusDBConnection.DoGetInTransaction: Boolean;
+begin
+ Result := dacConnection.Database.InTransaction;
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBConnection.DoGetTableFields(const aTableName : string;
+ out aFields : TDAFieldCollection);
+var
+ i : Integer;
+ fld: TField;
+ dafld: TDAField;
+begin
+ dacConnection.Open;
+
+ with TnxQuery.Create(nil) do try
+ SQL.Text := 'SELECT * FROM "' + aTableName + '" WHERE ''c'' <> ''c''';
+ Database := dacConnection.Database;
+ Open;
+
+ aFields := TDAFieldCollection.Create(nil);
+ try
+ for i := 0 to Pred(FieldCount) do begin
+ fld:=Fields.Fields[i];
+ with aFields.Add do begin
+ Name := fld.FieldName;
+ Size := fld.Size;
+ Required := fld.Required;
+ ReadOnly := fld.ReadOnly;
+ Calculated := fld.Calculated;
+ DisplayWidth := fld.DisplayWidth;
+ DisplayLabel := fld.DisplayLabel;
+ DataType := VCLTypeToDAType(fld.DataType);
+ if DataType = datDecimal then begin
+ case fld.DataType of
+ ftBCD: begin
+ DecimalPrecision:= TBCDField(fld).Precision;
+ DecimalScale:= TBCDField(fld).Size;
+ end;
+ ftFMTBCD: begin
+ DecimalPrecision:= TFMTBCDField(fld).Precision;
+ DecimalScale:= TFMTBCDField(fld).Size;
+ end;
+ end;
+ end;
+ end;
+ end;
+ except
+ FreeAndNil(aFields);
+ raise;
+ end;
+ close;
+ //pk
+ sql.Text := 'SELECT SEGMENT_FIELD FROM #INDEXFIELDS '+
+ 'WHERE INDEX_NAME = ''$SQL$PRIMARYKEY$INDEX#0'' AND TABLE_NAME = '''+aTableName+''' '+
+ 'ORDER BY TABLE_NAME, SEGMENT_INDEX';
+ Open;
+ while not Eof do begin
+ daFld := aFields.FindField(Fields[0].AsString);
+ if dafld <> nil then begin
+ daFld.InPrimaryKey := True;
+ dafld.Required := True;
+ end;
+ Next;
+ end;
+ // field description
+ close;
+ sql.Text := 'SELECT FIELD_NAME, FIELD_DESC, FIELD_TYPE_SQL FROM #FIELDS WHERE TABLE_NAME = '''+aTableName+''' ORDER BY FIELD_INDEX';
+ Open;
+ while not Eof do begin
+ daFld := aFields.FindField(Fields[0].AsString);
+ if dafld <> nil then begin
+ if not Fields[1].IsNull then daFld.Description := Fields[1].AsString;
+ if Fields[2].AsString = 'AUTOINC' then begin
+ dafld.DataType:= datAutoInc;
+ dafld.GeneratorName := aTableName;
+ end;
+ end;
+ Next;
+ end;
+ finally
+ Free;
+ end;
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBConnection.DoGetTableNames(out aList: IROStrings);
+begin
+ inherited;
+ dacConnection.Database.Open;
+ dacConnection.Database.GetTableNames(aList.Strings);
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBConnection.DoRollbackTransaction;
+begin
+ dacConnection.Database.Rollback;
+end;
+{------------------------------------------------------------------------------}
+function TDAENexusDBConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ Result := TDAENexusDBQuery;
+end;
+
+function TDAENexusDBConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ Result:=TDAENexusStoredProcedure;
+end;
+
+{------------------------------------------------------------------------------}
+function TDAENexusDBConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+var
+ lvalue: cardinal;
+begin
+ // dacConnection.Database.GetAutoIncValue(GeneratorName, Cardinal(Result)); // NXDB2: Changed
+ dacConnection.Database.GetAutoIncValue(GeneratorName,
+ dacConnection.Session.Password,
+ lValue);
+ result := lValue;
+// Dec(Result);
+end;
+{==============================================================================}
+
+
+
+{===TDAENexusDBQuery===========================================================}
+function TDAENexusDBQuery.CreateDataset(aConnection: TDAEConnection): TDataSet;
+begin
+ Result := TnxQuery.Create(nil);
+ with TnxQuery(Result) do begin
+ Database := TDAENexusDBConnection(aConnection).dacConnection.Database;
+ RequestLive := False;
+ end;
+end;
+{------------------------------------------------------------------------------}
+function TDAENexusDBQuery.DoExecute: Integer;
+begin
+ with TnxQuery(DataSet) do begin
+ ExecSQL;
+ Result := RowsAffected;
+ end;
+end;
+{------------------------------------------------------------------------------}
+function TDAENexusDBQuery.DoGetSQL: string;
+begin
+ Result := TnxQuery(DataSet).SQL.Text
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBQuery.DoPrepare(Value: Boolean);
+begin
+ TnxQuery(DataSet).Prepared := Value;
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBQuery.DoSetSQL(const Value: string);
+begin
+ TnxQuery(DataSet).SQL.Text := Value;
+end;
+{------------------------------------------------------------------------------}
+procedure TDAENexusDBQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TnxQuery(DataSet).Params);
+end;
+
+procedure TDAENexusDBQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TnxQuery(DataSet).Params);
+end;
+
+procedure TDAENexusDBQuery.ClearParams;
+begin
+ inherited;
+ TnxQuery(DataSet).Params.Clear;
+end;
+
+
+{==============================================================================}
+
+exports GetDriverObject Name func_GetDriverObject;
+
+procedure TDAENexusDBConnection.DoGetStoredProcedureNames(
+ out List: IROStrings);
+begin
+ inherited;
+ dacConnection.Database.Open;
+ dacConnection.Database.GetStoredProcNames(List.Strings);
+end;
+
+
+{ TDAENexusStoredProcedure }
+
+function TDAENexusStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ Result := TnxStoredProc.Create(nil);
+ with TnxStoredProc(Result) do begin
+ Database := TDAENexusDBConnection(aConnection).dacConnection.Database;
+ RequestLive := False;
+ end;
+end;
+
+function TDAENexusStoredProcedure.Execute: integer;
+begin
+ SetParamValues(GetParams);
+ Result:=DoExecute;
+ GetParamValues(GetParams);
+end;
+
+function TDAENexusStoredProcedure.DoGetSQL: string;
+begin
+ Result:='';
+end;
+
+procedure TDAENexusStoredProcedure.DoSetSQL(const Value: string);
+begin
+//
+end;
+
+procedure TDAENexusStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams,TnxStoredProc(Dataset).Params);
+end;
+
+function TDAENexusStoredProcedure.GetStoredProcedureName: string;
+begin
+ Result:=TnxStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAENexusStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams,TnxStoredProc(Dataset).Params);
+end;
+
+procedure TDAENexusStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TnxStoredProc(Dataset).StoredProcName:=Name;
+end;
+
+procedure TDAENexusStoredProcedure.RefreshParams;
+begin
+ TnxStoredProc(DataSet).RefreshParam;
+ RefreshParamsStd(TnxStoredProc(DataSet).Params);
+end;
+
+procedure TDAENexusStoredProcedure.DoPrepare(Value: boolean);
+begin
+ TnxStoredProc(DataSet).Prepared:=Value;
+end;
+
+
+function TDAENexusStoredProcedure.DoExecute: integer;
+begin
+ TnxStoredProc(Dataset).ExecProc;
+ Result:=-1;
+end;
+
+
+function TDAENexusDBConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(iIdentifier) or IsReservedName(iIdentifier);
+end;
+
+procedure TDAENexusDBConnection.DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection);
+const
+ sFK_SQL =
+ 'SELECT fkc.fk_constraint_name, fkc.fk_constraint_table_name as table_name, fkc.fk_constraint_references_table_name as target_table, '+
+ 'srccols.fk_constraint_referencing_columns_name as srccol, destcols.fk_constraint_referenced_columns_name as destcol '+
+ 'from #foreignkey_constraints fkc '+
+ 'join #foreignkey_constraints_referencing_columns srccols on (fkc.fk_constraint_name = srccols.fk_constraint_name and fkc.fk_constraint_table_name = srccols.fk_constraint_table_name) '+
+ 'join #foreignkey_constraints_referenced_columns destcols on (fkc.fk_constraint_name = destcols.fk_constraint_name and fkc.fk_constraint_table_name = destcols.fk_constraint_table_name '+
+ 'and srccols.fk_constraint_referencing_columns_index = destcols.fk_constraint_referenced_columns_index) '+
+ 'order by fkc.fk_constraint_table_name, fkc.fk_constraint_name, srccols.fk_constraint_referencing_columns_index';
+var
+ lCurrConstraint: string;
+ lCurrFK: TDADriverForeignKey;
+ Query: TnxQuery;
+begin
+ inherited DoGetForeignKeys(ForeignKeys);
+ lCurrConstraint := '';
+ lCurrFK := nil;
+ Query := TnxQuery.Create(nil);
+ try
+ Query.SQL.Text := sFK_SQL;
+ Query.Database := dacConnection.Database;
+ Query.Open;
+
+ ForeignKeys.Clear;
+ while (not Query.EOF) do begin
+
+ if lCurrConstraint <> Query.Fields[0].AsString then begin
+ lCurrConstraint := Query.Fields[0].AsString;
+
+ lCurrFK := ForeignKeys.Add();
+ with lCurrFK do begin
+ FKField := TrimRight(Query.Fields[3].AsString);
+ PKField := TrimRight(Query.Fields[4].AsString);
+ FKTable := TrimRight(Query.Fields[1].AsString);
+ PKTable := TrimRight(Query.Fields[2].AsString);
+ end;
+ end else begin
+ with lCurrFK do begin
+ FKField := FKField + ';' + TrimRight(Query.Fields[4].AsString);
+ PKField := PKField + ';' + TrimRight(Query.Fields[3].AsString);
+ end;
+ end;
+ Query.Next;
+ end;
+ finally
+ Query.Free;
+ end;
+
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ try
+ _driver.Free;
+ except end;
+ _driver := nil;
+end.
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAODACDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAODACDriver.pas
new file mode 100644
index 0000000..1086617
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAODACDriver.pas
@@ -0,0 +1,677 @@
+unit uDAODACDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_ODACDriver_Glyphs.res}
+
+{
+ If you have the version with source code, uncomment the following conditional to
+ make this unit compile.
+}
+
+{.$DEFINE SOURCECODEVERSION}
+
+interface
+
+uses DB, Classes, uDAEngine, uDAInterfaces, uDAADOInterfaces, uROClasses, Variants,
+ uDAOracleInterfaces, Ora, DBAccess, DASQLMonitor, OraSQLMonitor, OraSmart, uDAMacroProcessors, uDAUtils, OraClasses;
+
+type { TDAODACDriver }
+ TDAODACDriver = class(TDADriverReference)
+ end;
+
+ { TDAEODACDriver }
+ TDAEODACDriver = class(TDAOracleDriver)
+ private
+ fMonitor: TOraSQLMonitor;
+ fTraceCallBack: TDALogTraceEvent;
+
+ procedure OnODACTrace(Sender: TObject; Text: string; Flag: TDATraceFlag);
+
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent); override;
+
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override;
+ function GetDefaultCustomParameters: string; override;
+
+ public
+ end;
+
+ { TDAEODACConnection }
+ TDAEODACConnection = class(TDAOracleConnection)
+ private
+ fConnection: TORASession;
+ protected
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+
+ public
+ function GetDatabaseNames: IROStrings;
+ end;
+
+ { TDAEODACQuery }
+ TDAEODACQuery = class(TDAEDataset, IDAOracleDataset, IDAMustSetParams)
+ private
+
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ function intVCLTypeToDAType(aFieldType: TFieldType; ASize: integer = 0; ADecimalPrecision: integer = 0; aDecimalScale: integer = 0): TDADataType;override;
+ procedure ClearParams; override;
+ // IDADataset
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: boolean); override;
+ procedure DoSetActive(Value: boolean); override;
+
+ // IOracleDataset
+ function GetLockMode: TDAOracleLockMode;
+ procedure SetLockMode(Value: TDAOracleLockMode);
+ function GetOptions: TDAOracleOptions;
+ procedure SetOptions(Value: TDAOracleOptions);
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAEODACStoredProcedure }
+ TDAEODACStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ function intVCLTypeToDAType(aFieldType: TFieldType; ASize: integer = 0; ADecimalPrecision: integer = 0; aDecimalScale: integer = 0): TDADataType;override;
+
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoExecute: integer; override;
+ function Execute: integer; override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ SysUtils,
+ uDADriverManager, uDARes, uROBinaryHelpers;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAODACDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEODACDriver.Create(nil);
+ result := _driver;
+end;
+
+
+procedure ReadODACParamValues(AParams: TDAParamCollection;aDACParams: TOraParams;pvSession: TOraSession);
+var
+ i: integer;
+ lParam: TOraParam;
+ ms: IROStream;
+begin
+ for i := 0 to aDACParams.Count - 1 do begin
+ lParam := aDACParams[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ if ord(lParam.DataType) = ftBFile then begin
+ ms := TROStream.Create;
+ lParam.AsBFile.SaveToStream(ms.Stream);
+ ms.Position:=0;
+ Aparams.ParamByName(lParam.Name).LoadFromStream(ms);
+ ms:=nil;
+ end
+ else
+ Aparams.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+end;
+
+
+procedure WriteODACParamValues(InputParams: TDAParamCollection;OutputParams: TOraParams;pvSession: TOraSession);
+var i : integer;
+ par : uDAInterfaces.TDAParam;
+ outpar : TOraParam;
+ ms: IROStream;
+ blobtype : TFieldType;
+ lvOraLob : TOralob;
+begin
+ for i := 0 to (InputParams.Count-1) do begin
+ par := InputParams[i];
+ outpar := OutputParams.ParamByName(par.Name);
+
+ // If no blob type is specified, then gets the default field type.
+ // BlobType is only meaningful to Oracle. MSSQL works fine just setting the DataType
+ blobtype := BlobTypeMappings[par.BlobType];
+ if (blobtype=ftUnknown) then blobtype := DADataTypesMappings[par.DataType];
+
+ case par.DataType of
+ datBlob : begin
+ outpar.ParamType := TParamType(par.ParamType);
+ outpar.DataType := DADataTypesMappings[par.DataType];
+ if par.ParamType <> daptOutput then begin
+ ms := TROStream.Create;
+ par.SaveToStream(ms);
+ ms.Position := 0;
+ lvOraLob := TOralob.Create(pvSession.OCISvcCtx);
+ try
+ lvOraLob.CreateTemporary(ltBlob);
+ if ms.Size>0 then lvOraLob.LoadFromStream(ms.Stream);
+ lvOraLob.WriteLob;
+ outpar.AsOraBLOB := lvOraLob;
+ finally
+ lvOraLob.Free;
+ end;
+ end;
+
+ end;
+ datMemo : begin
+ outpar.ParamType := TParamType(par.ParamType);
+ outpar.DataType := ftMemo;
+
+ // Only happens with Oracle
+ if (blobtype<>ftUnknown) then outpar.DataType := blobtype;
+ if par.ParamType <> daptOutput then outpar.Value := par.Value;
+ end;
+ else begin
+ outpar.ParamType := TParamType(par.ParamType);
+ case par.DataType of
+ datAutoInc : outpar.DataType := ftInteger;
+ datLargeAutoInc: outpar.DataType := ftLargeInt;
+ else
+ outpar.DataType := DADataTypesMappings[par.DataType];
+ end;
+ if par.ParamType <> daptOutput then outpar.Value := par.Value;
+ end;
+ end;
+ end;
+end;
+
+{ TDAEODACConnection }
+
+procedure TDAEODACConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+begin
+ inherited;
+
+ with aConnStrParser do begin
+
+ if (Self.UserID <> '') then
+ fConnection.Username := Self.UserID
+ else
+ fConnection.Username := UserID;
+
+ if (Self.Password <> '') then
+ fConnection.Password := Self.Password
+ else
+ fConnection.Password := Password;
+
+ fConnection.Server := Server;
+ fConnection.ConnectPrompt := FALSE;
+ fConnection.Debug := (AuxParams['Debug']='1');
+
+ fConnection.Options.Net := AuxParams['Net'] = '1';
+ end;
+end;
+
+function TDAEODACConnection.DoBeginTransaction: integer;
+begin
+ fConnection.StartTransaction;
+ result := 0;
+end;
+
+procedure TDAEODACConnection.DoCommitTransaction;
+begin
+ fConnection.Commit;
+end;
+
+function TDAEODACConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fConnection := TORASession.Create(nil);
+ fConnection.LoginPrompt := FALSE;
+
+ { ToDo: add a COnnectionString parameter to set
+ fConnection.Debug := TRUE; }
+
+ result := fConnection;
+end;
+
+function TDAEODACConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEODACQuery;
+end;
+
+function TDAEODACConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEODACStoredProcedure;
+end;
+
+procedure TDAEODACConnection.DoRollbackTransaction;
+begin
+ fConnection.Rollback;
+end;
+
+function TDAEODACConnection.DoGetInTransaction: boolean;
+begin
+ result := fConnection.InTransaction
+end;
+
+function TDAEODACConnection.GetDatabaseNames: IROStrings;
+begin
+ Result := TROStrings.Create();
+ fConnection.GetDatabaseNames(Result.Strings);
+end;
+
+
+{ TDAEODACDriver }
+
+function TDAEODACDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doServerName, doLogin, doCustom];
+end;
+
+function TDAEODACDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEODACConnection;
+end;
+
+function TDAEODACDriver.GetDefaultCustomParameters: string;
+begin
+ result := 'Net=0';
+end;
+
+function TDAEODACDriver.GetDescription: string;
+begin
+ result := 'Core Lab ODAC Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEODACDriver.GetDriverID: string;
+begin
+ result := 'ODAC';
+end;
+
+procedure TDAEODACDriver.GetAuxParams(const AuxDriver: string; out List: IROStrings);
+begin
+ inherited;
+ List.Add('Net=0,1');
+end;
+
+procedure TDAEODACDriver.OnODACTrace(Sender: TObject; Text: string; Flag: TDATraceFlag);
+begin
+ if Assigned(fTraceCallback) then fTraceCallback(Sender, Text, integer(Flag));
+end;
+
+procedure TDAEODACDriver.DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent);
+var
+ sdacopts: TDATraceFlags;
+begin
+ inherited;
+
+ if TraceActive then begin
+ if (fMonitor = nil) then fMonitor := TOraSQLMonitor.Create(Self);
+
+ fMonitor.Active := FALSE;
+ fMonitor.OnSQL := OnODACTrace;
+
+ sdacopts := [];
+ if (toPrepare in TraceOptions) then sdacopts := sdacopts + [tfQPrepare];
+ if (toExecute in TraceOptions) then sdacopts := sdacopts + [tfQExecute];
+ if (toFetch in TraceOptions) then sdacopts := sdacopts + [tfQFetch];
+ if (toError in TraceOptions) then sdacopts := sdacopts + [tfError];
+ if (toStmt in TraceOptions) then sdacopts := sdacopts + [tfStmt];
+ if (toConnect in TraceOptions) then sdacopts := sdacopts + [tfConnect];
+ if (toTransact in TraceOptions) then sdacopts := sdacopts + [tfTransact];
+ if (toBlob in TraceOptions) then sdacopts := sdacopts + [tfBlob];
+ if (toService in TraceOptions) then sdacopts := sdacopts + [tfService];
+ if (toMisc in TraceOptions) then sdacopts := sdacopts + [tfMisc];
+ if (toParams in TraceOptions) then sdacopts := sdacopts + [tfParams];
+
+ fTraceCallBack := Callback;
+
+ fMonitor.TraceFlags := sdacopts;
+ fMonitor.Active := TRUE;
+ end
+ else begin
+ FreeAndNIL(fMonitor);
+ fTraceCallback := nil;
+ end;
+end;
+
+{ TDAEODACQuery }
+
+function TDAEODACQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TSmartQuery.Create(nil);
+ TSmartQuery(result).Debug := TDAEODACConnection(aConnection).fConnection.Debug;
+ TSmartQuery(result).ReadOnly := TRUE;
+ TSmartQuery(result).FetchAll := True; //for preventing creating an additional session when you call StartTransaction (an known issue of OLEDB)
+ TSmartQuery(result).Unidirectional := True;
+ TSmartQuery(result).Session := TDAEODACConnection(aConnection).fConnection;
+end;
+
+function TDAEODACQuery.DoGetSQL: string;
+begin
+ result := TSmartQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEODACQuery.DoSetSQL(const Value: string);
+begin
+ TSmartQuery(Dataset).SQL.Text := Value;
+end;
+
+function TDAEODACQuery.GetLockMode: TDAOracleLockMode;
+begin
+ result := TDAOracleLockMode(TSmartQuery(Dataset).LockMode)
+end;
+
+procedure TDAEODACQuery.SetLockMode(Value: TDAOracleLockMode);
+begin
+ TSmartQuery(Dataset).LockMode := Ora.TLockMode(Value)
+end;
+
+procedure TDAEODACQuery.SetOptions(Value: TDAOracleOptions);
+var
+ {$IFDEF SOURCECODEVERSION}
+ dsopts: TOraDataSetOptions;
+ {$ELSE}
+ dsopts: TOraDataSetOptionsDS;
+ {$ENDIF}
+begin
+ {$IFDEF SOURCECODEVERSION}
+ dsopts := TSmartQuery(Dataset).Options;
+ {$ELSE}
+ dsopts := TSmartQuery(Dataset).OptionsDS;
+ {$ENDIF}
+
+ TSmartQuery(Dataset).DMLRefresh := True; // To get the output params when we exec SPs
+ dsopts.AutoClose := opAutoClose in Value;
+ dsopts.DefaultValues := opDefaultValues in Value;
+ dsopts.LongStrings := opLongStrings in Value;
+ dsopts.QueryRecCount := opQueryRecCount in Value;
+ dsopts.CacheLobs := opCacheLobs in Value;
+ dsopts.DeferredLobRead := opDeferredLobRead in Value;
+ dsopts.KeepPrepared := opKeepPrepared in Value;
+end;
+
+function TDAEODACQuery.GetOptions: TDAOracleOptions;
+var
+ {$IFDEF SOURCECODEVERSION}
+ dsopts: TOraDataSetOptions;
+ {$ELSE}
+ dsopts: TOraDataSetOptionsDS;
+ {$ENDIF}
+begin
+ {$IFDEF SOURCECODEVERSION}
+ dsopts := TSmartQuery(Dataset).Options;
+ {$ELSE}
+ dsopts := TSmartQuery(Dataset).OptionsDS;
+ {$ENDIF}
+
+ result := [];
+
+ if dsopts.AutoClose then result := result + [opAutoClose];
+ if dsopts.DefaultValues then result := result + [opDefaultValues];
+ if dsopts.LongStrings then result := result + [opLongStrings];
+ if dsopts.QueryRecCount then result := result + [opQueryRecCount];
+ if dsopts.CacheLobs then result := result + [opCacheLobs];
+ if dsopts.DeferredLobRead then result := result + [opDeferredLobRead];
+ if dsopts.KeepPrepared then result := result + [opKeepPrepared];
+end;
+
+procedure TDAEODACQuery.DoPrepare(Value: boolean);
+begin
+ TSmartQuery(Dataset).Prepared := Value
+end;
+
+function TDAEODACQuery.DoExecute: integer;
+begin
+ TSmartQuery(Dataset).ExecSQL;
+ result := TSmartQuery(Dataset).RowsAffected;
+end;
+
+procedure TDAEODACQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteODACParamValues(AParams, TSmartQuery(Dataset).Params, TSmartQuery(Dataset).Session);
+end;
+
+procedure TDAEODACQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ ReadODACParamValues(AParams, TSmartQuery(Dataset).Params, TSmartQuery(Dataset).Session)
+end;
+
+
+function ExtractTableName(aSQLStatement: string): string;
+var sql: string;
+ idx, i, x: integer;
+begin
+ result := '';
+
+ sql := UpperCase(aSQLStatement);
+ ReplaceChar(sql, [#13, #9, #10], #32);
+
+ idx := Pos(' FROM ', sql);
+ if (idx=0) then Exit;
+
+ for i := idx+6 to Length(sql) do begin
+ if (sql[i]<>#32) then begin
+ for x := i to Length(sql) do
+ if not (sql[x] in ['A'..'Z', '0'..'9', '.', '_']) then begin
+ result := Trim(Copy(sql, i, x-i));
+ Exit;
+ end;
+ end;
+ end;
+end;
+
+procedure TDAEODACQuery.DoSetActive(Value: boolean);
+var willCreateFields: boolean;
+ fieldColl: TDAFieldCollection;
+ tableName: string;
+ fld: TDAField;
+ qry: TSmartQuery;
+begin
+ fieldColl:=nil; // prevent warnings
+ willCreateFields := FALSE;
+ if Value then begin
+ fieldColl := inherited GetFields;
+ willCreateFields := fieldColl.Count=0;
+ end;
+
+ inherited;
+
+ if not willCreateFields then Exit;
+
+ { Determines which ones are part of the PK }
+ tableName := UpperCase(ExtractTableName(DoGetSQL));
+
+ if (tableName='') then Exit;
+ qry := TSmartQuery.Create(NIL);
+ try
+ qry.Assign(Dataset);
+ qry.SQL.Text := Format(
+ 'SELECT cols.column_name, cols.position '+
+ 'FROM all_constraints cons, all_cons_columns cols '+
+ 'WHERE cols.table_name = ''%s'' AND cons.constraint_type = ''P'' AND cons.constraint_name = cols.constraint_name '+
+ 'AND cons.owner = cols.owner ORDER BY cols.position', [tableName]);
+ qry.Open;
+ if (qry.RecordCount=0) then Exit;
+
+ while not qry.Eof do try
+ fld := fieldColl.FindField(qry.Fields[0].AsString);
+ if (fld<>NIL) then begin
+ fld.InPrimaryKey := TRUE;
+ fld.Required := TRUE;
+ end;
+ finally
+ qry.Next;
+ end;
+ finally
+ qry.Free;
+ end;
+end;
+
+function TDAEODACQuery.intVCLTypeToDAType(aFieldType: TFieldType; ASize: integer = 0; ADecimalPrecision: integer = 0; aDecimalScale: integer = 0): TDADataType;
+begin
+ if ord(aFieldType) in [ftTimeStampTZ,ftTimeStampLTZ] then aFieldType:=ftTimeStamp;
+ if ord(aFieldType) in [ftBFile] then aFieldType:=ftBlob;
+ with TSmartQuery(Dataset).Session do
+ if ord(aFieldType) in [ftNumber] then begin
+ if (Options.EnableIntegers) and (aDecimalScale = 0) and (ADecimalPrecision < IntegerPrecision) then aFieldType := ftInteger
+ else if (Options.EnableIntegers) and (aDecimalScale = 0) and (ADecimalPrecision < LargeIntPrecision) then aFieldType := ftLargeint
+ else if (Options.EnableNumbers) and (ADecimalPrecision > FloatPrecision) then aFieldType := ftFMTBcd
+ else aFieldType := ftFloat;
+ end;
+ Result:= inherited intVCLTypeToDAType(aFieldType,ASize,ADecimalPrecision,aDecimalScale);
+end;
+
+procedure TDAEODACQuery.ClearParams;
+begin
+ inherited;
+ TSmartQuery(Dataset).Params.Clear;
+end;
+
+{ TDAEODACStoredProcedure }
+
+function TDAEODACStoredProcedure.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TOraStoredProc.Create(nil);
+ TOraStoredProc(result).Debug := TDAEODACConnection(aConnection).fConnection.Debug;
+ TOraStoredProc(result).Session := TDAEODACConnection(aConnection).fConnection;
+end;
+
+function TDAEODACStoredProcedure.Execute: integer;
+var
+// i: integer;
+ _params: TDAParamCollection;
+ // lParam: DBAccess.TDAParam;
+begin
+ _params := GetParams;
+ setParamValues(_Params);
+{
+ with TOraStoredProc(Dataset) do begin
+ if (Params.Count <> _Params.Count) then TOraStoredProc(Dataset).PrepareSQL;
+
+ for i := 0 to (Params.Count - 1) do
+ if (Params[i].ParamType in [ptInput, ptInputOutput]) then
+ Params[i].Value := _params.ParamByName(Params[i].Name).Value;
+
+ for i := 0 to (_params.Count - 1) do begin
+ lParam := Params.ParamByName(_params[i].Name);
+ if (_params[i].DataType = datString) and (_params[i].Size > 4000) and (lParam.ParamType in [ptOutput, ptInputOutput]) then
+ lParam.Size := _params[i].Size;
+ end;
+ end;
+}
+ result := DoExecute;
+ GetParamValues(_Params);
+end;
+
+function TDAEODACStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TOraStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEODACStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TOraStoredProc(Dataset).StoredProcName := Name;
+end;
+
+procedure TDAEODACStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+begin
+ if (AParams.Count <> TOraStoredProc(Dataset).Params.Count) then TOraStoredProc(Dataset).PrepareSQL;
+ WriteODACParamValues(AParams, TOraStoredProc(Dataset).Params, TOraStoredProc(Dataset).Session);
+end;
+
+procedure TDAEODACStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+begin
+ ReadODACParamValues(AParams, TOraStoredProc(Dataset).Params, TOraStoredProc(Dataset).Session)
+end;
+
+procedure TDAEODACStoredProcedure.RefreshParams;
+begin
+ TOraStoredProc(Dataset).PrepareSQL;
+ RefreshParamsStd(TOraStoredProc(Dataset).Params);
+end;
+
+function TDAEODACStoredProcedure.intVCLTypeToDAType(aFieldType: TFieldType; ASize: integer = 0; ADecimalPrecision: integer = 0; aDecimalScale: integer = 0): TDADataType;
+begin
+ if ord(aFieldType) in [ftTimeStampTZ,ftTimeStampLTZ] then aFieldType:=ftTimeStamp;
+ if ord(aFieldType) in [ftNumber] then aFieldType := ftFloat;
+ Result:= inherited intVCLTypeToDAType(aFieldType,ASize,ADecimalPrecision,aDecimalScale);
+end;
+
+exports GetDriverObject name func_GetDriverObject;
+
+function TDAEODACStoredProcedure.DoExecute: integer;
+begin
+ with TOraStoredProc(Dataset) do begin
+ ExecProc;
+ result := RowsAffected;
+ end;
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAPgDACDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAPgDACDriver.pas
new file mode 100644
index 0000000..593a0ab
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAPgDACDriver.pas
@@ -0,0 +1,455 @@
+unit uDAPGDACDriver;
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_PgDACDriver_Glyphs.res}
+interface
+
+uses
+ DB, Classes,
+ DBAccess, PgAccess, DASQLMonitor, PgSQLMonitor,
+ uDAEngine, uDAInterfaces, uDAADOInterfaces, uROClasses,
+ uROBinaryHelpers, uDAUtils, uDAPostgresInterfaces;
+
+type
+ { TDAPgDACDriver }
+ TDAPgDACDriver = class(TDADriverReference)
+ end;
+
+ { TDAEPgDACDriver }
+ TDAEPgDACDriver = class(TDAPostgresDriver)
+ private
+ fMonitor: TPgSQLMonitor;
+ fTraceCallBack: TDALogTraceEvent;
+ procedure OnSDACTrace(Sender: TObject; Text: string; Flag: TDATraceFlag);
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent); override;
+ // IDADriver
+ function GetDriverID: string; override; safecall;
+ function GetDescription: string; override; safecall;
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+
+ end;
+
+ { TDAEMyConnection }
+ TDAEPgDACConnection = class(TDAEPostgresConnection)
+ private
+ fConnection: TPgConnection;
+ protected
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+ public
+ end;
+
+ { TDAEPgDACQuery }
+ TDAEPgDACQuery = class(TDAEDataset,IDAMustSetParams)
+ private
+
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: integer; override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoGetSQL: string; override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoSetSQL(const Value: string); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoPrepare(Value: boolean); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ public
+ end;
+
+ { TDAEPgDACStoredProcedure }
+ TDAEPgDACStoredProcedure = class(TDAEStoredProcedure,IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override;
+ function Execute: integer; override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+
+
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ SysUtils, Variants,TypInfo,
+ uDADriverManager, uDARes;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAPgDACDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEPgDacDriver.Create(nil);
+ result := _driver;
+end;
+
+{$I uDACRLabsUtils.inc}
+
+
+exports GetDriverObject name func_GetDriverObject;
+
+
+{ TDAEPgDACDriver }
+
+procedure TDAEPgDACDriver.DoSetTraceOptions(TraceActive: boolean;
+ TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent);
+var
+ sdacopts: TDATraceFlags;
+begin
+ inherited;
+ if TraceActive then begin
+ if (fMonitor = nil) then fMonitor := TPgSQLMonitor.Create(Self);
+
+ fMonitor.Active := FALSE;
+ fMonitor.OnSQL := OnSDACTrace;
+
+ sdacopts := [];
+ if (toPrepare in TraceOptions) then sdacopts := sdacopts + [tfQPrepare];
+ if (toExecute in TraceOptions) then sdacopts := sdacopts + [tfQExecute];
+ if (toFetch in TraceOptions) then sdacopts := sdacopts + [tfQFetch];
+ if (toError in TraceOptions) then sdacopts := sdacopts + [tfError];
+ if (toStmt in TraceOptions) then sdacopts := sdacopts + [tfStmt];
+ if (toConnect in TraceOptions) then sdacopts := sdacopts + [tfConnect];
+ if (toTransact in TraceOptions) then sdacopts := sdacopts + [tfTransact];
+ if (toBlob in TraceOptions) then sdacopts := sdacopts + [tfBlob];
+ if (toService in TraceOptions) then sdacopts := sdacopts + [tfService];
+ if (toMisc in TraceOptions) then sdacopts := sdacopts + [tfMisc];
+ if (toParams in TraceOptions) then sdacopts := sdacopts + [tfParams];
+
+ fTraceCallBack := Callback;
+
+ fMonitor.TraceFlags := sdacopts;
+ fMonitor.Active := TRUE;
+ end
+ else begin
+ FreeAndNIL(fMonitor);
+ fTraceCallback := nil;
+ end;
+end;
+
+procedure TDAEPgDACDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ List.Add('Options. =');
+ List.Add('PoolingOptions. =');
+ List.Add('Port=5432');
+ List.Add('SSLOptions. =');
+ List.Add('');
+ List.Add('Consult to PgDAC documentation about Options, PoolingOptions and SSLOptions options.');
+end;
+
+function TDAEPgDACDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEPgDacConnection;
+end;
+
+function TDAEPgDACDriver.GetDescription: string;
+begin
+ result := 'Devart''s PostgreSQL Data Access Components'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEPgDACDriver.GetDriverID: string;
+begin
+ Result := 'PgDAC';
+end;
+
+procedure TDAEPgDACDriver.OnSDACTrace(Sender: TObject; Text: string;
+ Flag: TDATraceFlag);
+begin
+ if Assigned(fTraceCallback) then fTraceCallback(Sender, Text, integer(Flag));
+end;
+
+{ TDAEPgDACConnection }
+
+function TDAEPgDACConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fConnection := TPgConnection.Create(nil);
+ fConnection.LoginPrompt := FALSE;
+
+ result := fConnection;
+end;
+
+procedure TDAEPgDACConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection);
+var
+ i: integer;
+ sName, sValue: string;
+begin
+ inherited;
+
+ with aConnStrParser do begin
+ fConnection.Database := Database;
+
+ fConnection.Server := Server;
+
+ if (Self.UserID <> '') then
+ fConnection.Username := Self.UserID
+ else
+ fConnection.Username := UserID;
+
+ if (Self.Password <> '') then
+ fConnection.Password := Self.Password
+ else
+ fConnection.Password := Password;
+
+ for i := 0 to AuxParamsCount -1 do begin
+ sName := AuxParamNames[i];
+ sValue := AuxParams[sName];
+
+ if Pos('options.', AnsiLowerCase(sName)) = 1 then begin
+ sName := Copy(sName,9, Length(sName)-8);
+ SetPropValue(fConnection.Options, sName, sValue);
+ end
+ else if Pos('poolingoptions.', AnsiLowerCase(sName)) = 1 then begin
+ sName := Copy(sName,16, Length(sName)-15);
+ SetPropValue(fConnection.PoolingOptions, sName, sValue);
+ end
+ else if AnsiSameStr(sName, 'PORT') then begin
+ fConnection.Port := StrToIntDef(sValue,0);
+ end
+ else if Pos('ssloptions.', AnsiLowerCase(sName)) = 1 then begin
+ sName := Copy(sName,12, Length(sName)-11);
+ SetPropValue(fConnection.SSLOptions, sName, sValue);
+ end;
+ end;
+ end;
+end;
+
+function TDAEPgDACConnection.DoBeginTransaction: integer;
+begin
+ fConnection.StartTransaction;
+ result := 0;
+end;
+
+procedure TDAEPgDACConnection.DoCommitTransaction;
+begin
+ fConnection.Commit;
+end;
+
+function TDAEPgDACConnection.DoGetInTransaction: boolean;
+begin
+ Result := fConnection.InTransaction;
+end;
+
+procedure TDAEPgDACConnection.DoRollbackTransaction;
+begin
+ fConnection.Rollback;
+end;
+
+
+function TDAEPgDACConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ Result := TDAEPgDACQuery;
+end;
+
+function TDAEPgDACConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ Result := TDAEPgDACStoredProcedure;
+end;
+
+{ TDAEPgDACQuery }
+
+procedure TDAEPgDACQuery.ClearParams;
+begin
+ inherited;
+ TPgQuery(Dataset).Params.Clear;
+end;
+
+function TDAEPgDACQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TPgQuery.Create(nil);
+
+ TPgQuery(result).FetchAll := True; //for preventing creating an additional session when you call StartTransaction (an known issue of OLEDB)
+ TPgQuery(result).Unidirectional := True;
+ TPgQuery(result).ReadOnly := TRUE;
+ TPgQuery(result).Connection := TDAEPgDACConnection(aConnection).fConnection;
+end;
+
+function TDAEPgDACQuery.DoExecute: integer;
+begin
+ TPgQuery(Dataset).Execute;
+ result := TPgQuery(Dataset).RowsAffected;
+end;
+
+function TDAEPgDACQuery.DoGetSQL: string;
+begin
+ result := TPgQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEPgDACQuery.DoPrepare(Value: boolean);
+var
+ i: integer;
+ par: TPgParam;
+begin
+ if Value and not TPgQuery(Dataset).Prepared and (TPgQuery(Dataset).ParamCount<>0) then begin
+ for I := 0 to GetParams.Count - 1 do begin
+ par:=TPgQuery(Dataset).ParamByName(GetParams[i].Name);
+ par.DataType:= DATypeToVCLType(GetParams[i].DataType);
+ if par.DataType = ftAutoInc then par.DataType:= ftInteger;
+ end;
+ end;
+ TPgQuery(Dataset).Prepared := Value;
+end;
+
+procedure TDAEPgDACQuery.DoSetSQL(const Value: string);
+begin
+ TPgQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEPgDACQuery.GetParamValues(AParams: TDAParamCollection);
+var
+ I: Integer;
+ lParam: TPgParam;
+begin
+ for i := 0 to TPgQuery(DataSet).Params.Count - 1 do begin
+ lParam:=TPgQuery(DataSet).Params[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ Aparams.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+end;
+
+procedure TDAEPgDACQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteCrLabsParamValues(AParams, TPgQuery(Dataset).Params, true);
+end;
+
+{ TDAEPgDACStoredProcedure }
+
+function TDAEPgDACStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ result := TPgStoredProc.Create(nil);
+ TPgStoredProc(result).Connection := TDAEPgDACConnection(aConnection).fConnection;
+end;
+
+function TDAEPgDACStoredProcedure.DoExecute: integer;
+begin
+ with TPgStoredProc(Dataset) do begin
+ ExecProc;
+ result := RowsAffected;
+ end;
+end;
+
+function TDAEPgDACStoredProcedure.Execute: integer;
+var
+ i: integer;
+ _params: TDAParamCollection;
+ lParam: uDAInterfaces.TDAParam;
+begin
+ _params := GetParams;
+
+ with TPgStoredProc(Dataset) do begin
+ for i := 0 to (Params.Count - 1) do
+ if (Params[i].ParamType in [ptInput, ptInputOutput]) then begin
+ lParam := _params.ParamByName(Params[i].Name);
+ if (Params[i].DataType in [ftMemo, ftBlob, ftGraphic]) and VarIsArray(lParam.Value)then
+ Params[i].Value := VariantToAnsiString(lParam.Value)
+ else
+ Params[i].Value := lParam.Value;
+ end;
+
+ result := DoExecute;
+
+ for i := 0 to (_params.Count-1) do
+ if (_params[i].ParamType in [daptOutput, daptInputOutput, daptResult])
+ then _params[i].Value := params.ParamByName(_params[i].Name).Value;
+ end;
+end;
+
+procedure TDAEPgDACStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+var
+ i: Integer;
+ lParam: TPgParam;
+begin
+ for i := 0 to TPgStoredProc(DataSet).Params.Count - 1 do begin
+ lParam:=TPgStoredProc(DataSet).Params[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ Aparams.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+end;
+
+function TDAEPgDACStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TPgStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEPgDACStoredProcedure.RefreshParams;
+begin
+ TPgStoredProc(Dataset).Prepare;
+ RefreshParamsStd(TPgStoredProc(Dataset).Params);
+end;
+
+procedure TDAEPgDACStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteCrLabsParamValues(AParams, TPgStoredProc(Dataset).Params);
+end;
+
+procedure TDAEPgDACStoredProcedure.SetStoredProcedureName(const Name: string);
+begin
+ TPgStoredProc(Dataset).StoredProcName := Name;
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAPostgresDACDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAPostgresDACDriver.pas
new file mode 100644
index 0000000..6e20c81
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAPostgresDACDriver.pas
@@ -0,0 +1,353 @@
+unit uDAPostgresDACDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up, Kylix 3 and up
+{ platform: Win32, Linux
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_PostgresDACDriver_Glyphs.res}
+
+interface
+
+uses DB, Classes, uDAEngine, uDAInterfaces, uDAADOInterfaces, uROClasses,
+ uROBinaryHelpers, uDAUtils, PSQLDbTables, uDAPostgresInterfaces;
+
+type { TDAPostgresDACDriver }
+ TDAPostgresDACDriver = class(TDADriverReference)
+ end;
+
+ { TDAEPostgresDACDriver }
+ TDAEPostgresDACDriver = class(TDAPostgresDriver)
+ private
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+
+ // IDADriver
+ function GetDriverID: string; override; safecall;
+ function GetDescription: string; override; safecall;
+ end;
+
+ { TDAEMyConnection }
+ TDAEPostgresDACConnection = class(TDAEPostgresConnection)
+ private
+ function GetConnection: TPSQLDatabase;
+ protected
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+ property Connection: TPSQLDatabase read GetConnection;
+ public
+ end;
+
+ { TDAEPostgresDACQuery }
+ TDAEPostgresDACQuery = class(TDAEDataset,IDAMustSetParams)
+ private
+
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: boolean); override;
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAEPostgresDACStoredProcedure }
+ TDAEPostgresDACStoredProcedure = class(TDAEStoredProcedure,IDAMustSetParams)
+ private
+ fConnection:TDAEConnection;
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ function GetStoredProcedureName: string; override; safecall;
+ procedure SetStoredProcedureName(const Name: string); override; safecall;
+ function DoExecute: integer; override;safecall;
+ function Execute: integer; override;safecall;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ SysUtils,
+ uDADriverManager, uDARes;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAPostgresDACDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEPostgresDacDriver.Create(nil);
+ result := _driver;
+end;
+
+{$IFDEF LATEST_MyDAC}
+{$I uDACRLabsUtils.inc}
+{$ENDIF LATEST_MyDAC}
+
+{ TDAEPostgresDacConnection }
+
+function TDAEPostgresDacConnection.DoBeginTransaction: integer;
+begin
+ Connection.StartTransaction;
+ result := 0;
+end;
+
+procedure TDAEPostgresDacConnection.DoCommitTransaction;
+begin
+ Connection.Commit;
+end;
+
+function TDAEPostgresDacConnection.GetConnection: TPsqlDatabase;
+begin
+ result := TPsqlDatabase(inherited ConnectionObject);
+end;
+
+function TDAEPostgresDacConnection.CreateCustomConnection: TCustomConnection;
+begin
+ result := TPsqlDatabase.Create(nil);
+ TPsqlDatabase(result).LoginPrompt := false;
+end;
+
+function TDAEPostgresDacConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEPostgresDacQuery;
+end;
+
+function TDAEPostgresDacConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEPostgresDacStoredProcedure;
+end;
+
+procedure TDAEPostgresDacConnection.DoRollbackTransaction;
+begin
+ Connection.Rollback;
+end;
+
+function TDAEPostgresDacConnection.DoGetInTransaction: boolean;
+begin
+ result := Connection.InTransaction
+end;
+
+
+procedure TDAEPostgresDacConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+var
+ i: Integer;
+begin
+ inherited;
+
+ with aConnStrParser do begin
+ Connection.DatabaseName := Database;
+
+ Connection.Host := Server;
+
+ if (Self.UserID <> '') then
+ Connection.Username := Self.UserID
+ else
+ Connection.Username := UserID;
+
+ if (Self.Password <> '') then
+ Connection.UserPassword := Self.Password
+ else
+ Connection.UserPassword := Password;
+
+ for i := 0 to AuxParamsCount -1 do
+ begin
+ if AuxParams[AuxParamNames[i]] <> '' then
+ Connection.Params.Add(AuxParamNames[i]+'='+AuxParams[AuxParamNames[i]]);
+ end;
+ end;
+end;
+
+
+{ TDAEPostgresDacDriver }
+
+
+function TDAEPostgresDacDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEPostgresDacConnection;
+end;
+
+function TDAEPostgresDacDriver.GetDescription: string;
+begin
+ result := 'MicroOlap DAC for Postgres Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEPostgresDacDriver.GetDriverID: string;
+begin
+ result := 'PostgresDAC';
+end;
+
+
+{ TDAEPostgresDacQuery }
+
+procedure TDAEPostgresDACQuery.ClearParams;
+begin
+ inherited;
+ TPSQLQuery(Dataset).Params.Clear;
+end;
+
+function TDAEPostgresDacQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TPSQLQuery.Create(nil);
+ TPSQLQuery(result).UniDirectional := True;
+ TPSQLQuery(result).RequestLive := false;
+ TPSQLQuery(result).Database := TDAEPostgresDacConnection(aConnection).Connection;
+end;
+
+function TDAEPostgresDacQuery.DoExecute: integer;
+begin
+ TPSQLQuery(Dataset).ExecSQL;
+ result := TPSQLQuery(Dataset).RowsAffected;
+end;
+
+function TDAEPostgresDacQuery.DoGetSQL: string;
+begin
+ result := TPSQLQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEPostgresDacQuery.DoPrepare(Value: boolean);
+begin
+ TPSQLQuery(Dataset).Prepared := Value;
+end;
+
+procedure TDAEPostgresDacQuery.DoSetSQL(const Value: string);
+begin
+ TPSQLQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEPostgresDACQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TPSQLQuery(Dataset).Params);
+end;
+
+procedure TDAEPostgresDACQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TPSQLQuery(Dataset).Params);
+end;
+
+
+{ TDAEADOStoredProcedure }
+
+function TDAEPostgresDacStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ fConnection := aConnection;
+ result := TPSQLStoredProc.Create(nil);
+ TPSQLStoredProc(result).Database := TDAEPostgresDacConnection(aConnection).Connection;
+end;
+
+function TDAEPostgresDACStoredProcedure.DoExecute: integer;
+begin
+ TPSQLStoredProc(Dataset).ExecProc;
+ result := -1;
+end;
+
+function TDAEPostgresDacStoredProcedure.Execute: integer;
+var
+ i: integer;
+ _params: TDAParamCollection;
+begin
+ _params := GetParams;
+
+ with TPSQLStoredProc(Dataset) do begin
+ for i := 0 to (ParamCount-1) do
+ if (Params[i].ParamType in [ptInput, ptInputOutput]) then
+ Params[i].Value := _params.ParamByName(Params[i].Name).Value;
+
+ result := DoExecute;
+
+ for i := 0 to (ParamCount-1) do
+ if (Params[i].ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ _params.ParamByName(Params[i].Name).Value := Params[i].Value;
+ end;
+end;
+
+procedure TDAEPostgresDACStoredProcedure.GetParamValues(
+ AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams,TPSQLStoredProc(Dataset).Params);
+end;
+
+function TDAEPostgresDacStoredProcedure.GetStoredProcedureName: string;
+begin
+ Result := TPSQLStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEPostgresDACStoredProcedure.RefreshParams;
+begin
+ TPSQLStoredProc(Dataset).RefreshParams;
+ RefreshParamsStd(TPSQLStoredProc(Dataset).Params);
+end;
+
+procedure TDAEPostgresDACStoredProcedure.SetParamValues(
+ AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams,TPSQLStoredProc(Dataset).Params);
+end;
+
+procedure TDAEPostgresDacStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TPSQLStoredProc(Dataset).StoredProcName := Name;
+end;
+
+exports GetDriverObject name func_GetDriverObject;
+
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDASDACDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDASDACDriver.pas
new file mode 100644
index 0000000..5d1f139
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDASDACDriver.pas
@@ -0,0 +1,506 @@
+unit uDASDACDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_SDACDriver_Glyphs.res}
+
+interface
+
+uses
+ DB, Classes, uDAEngine, uDAInterfaces, uDAADOInterfaces, uROClasses,
+ DBAccess, MSAccess, DASQLMonitor,
+ MSSQLMonitor, Variants, uDAUtils;
+
+type { TDASDACDriver }
+ TDASDACDriver = class(TDADriverReference)
+ end;
+
+ { TDAEADODriver }
+ TDAEADODriver = class(TDAMSSQLDriver)
+ private
+ fMonitor: TMSSQLMonitor;
+ fTraceCallBack: TDALogTraceEvent;
+
+ procedure OnSDACTrace(Sender: TObject; Text: string; Flag: TDATraceFlag);
+
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent); override;
+
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override; safecall;
+ function GetDefaultCustomParameters: String; override; safecall;
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ end;
+
+ { TDAEMSConnection }
+ TDAEMSConnection = class(TDAMSConnection, IDAADOConnection, IDACanQueryDatabaseNames)
+ private
+ fMSConnection: TMSConnection;
+
+// procedure GetSysObjects(const aCondition: string; aList: TStrings);
+
+ protected
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+ // IADOConnection
+ function GetProviderName: string; safecall;
+ function GetProviderType: TDAOleDBProviderType; safecall;
+ function GetCommandTimeout: Integer; safecall;
+ procedure SetCommandTimeout(const Value: Integer); safecall;
+ end;
+
+ { TDAEMSQuery }
+ TDAEMSQuery = class(TDAEDataset, IDAMustSetParams)
+ private
+
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure DoPrepare(Value: boolean); override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ public
+ end;
+
+ { TDAEADOStoredProcedure }
+ TDAEADOStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override;
+ function Execute: integer; override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ SysUtils,
+ uDADriverManager, uDARes, OLEDBAccess,
+ uROBinaryHelpers;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDASDACDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEADODriver.Create(nil);
+ result := _driver;
+end;
+
+{$I uDACRLabsUtils.inc}
+
+{ TDAEMSConnection }
+
+procedure TDAEMSConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+var
+ adoconn: string;
+ i: integer;
+begin
+ inherited;
+
+ with aConnStrParser do begin
+ adoconn := Format(stdMSSQL_ConnectionString, [UserID, Password, Database, Server]);
+ adoconn := '';
+ if UserId <> '' then begin
+ if adoconn = '' then
+ AdoConn := 'User ID='+UserID
+ else
+ AdoConn := ADoConn + ';User ID='+UserID;
+ end;
+ if Password <> '' then begin
+ if adoconn = '' then
+ AdoConn := 'Password='+Password
+ else
+ AdoConn := ADoConn + ';Password='+Password;
+ end;
+ if DataBase <> '' then begin
+ if adoconn = '' then
+ AdoConn := 'Initial Catalog='+Database
+ else
+ AdoConn := ADoConn + ';Initial Catalog='+Database;
+ end;
+ if Server <> '' then begin
+ if adoconn = '' then
+ AdoConn := 'Data Source='+Server
+ else
+ AdoConn := ADoConn + ';Data Source='+Server;
+ end;
+
+ AdoConn := ADoConn + ';';
+ MSSQLSchemaEnabled := True; // by default
+ for i := 0 to AuxParamsCount -1 do
+ begin
+ if Uppercase(AuxParamNames[i]) = 'SCHEMAS' then
+ MSSQLSchemaEnabled := AuxParams['Schemas'] = '1'
+ else
+ adoconn := adoconn + AuxParamNames[i] + '=' + AuxParams[AuxParamNames[i]]+';';
+ end;
+
+ fMSConnection.ConnectString := adoconn;
+
+ if (Self.UserID <> '') then fMSConnection.Username := Self.UserID;
+
+ if (Self.Password <> '') then fMSConnection.Password := Self.Password;
+ end;
+end;
+
+function TDAEMSConnection.DoBeginTransaction: integer;
+begin
+ fMSConnection.StartTransaction;
+ result := 0;
+end;
+
+procedure TDAEMSConnection.DoCommitTransaction;
+begin
+ fMSConnection.Commit;
+end;
+
+function TDAEMSConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fMSConnection := TMSConnection.Create(nil);
+ fMSConnection.LoginPrompt := FALSE;
+
+ result := fMSConnection;
+end;
+
+function TDAEMSConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAEMSQuery;
+end;
+
+function TDAEMSConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAEADOStoredProcedure;
+end;
+
+procedure TDAEMSConnection.DoRollbackTransaction;
+begin
+ fMSConnection.Rollback;
+end;
+
+function TDAEMSConnection.DoGetInTransaction: boolean;
+begin
+ result := fMSConnection.InTransaction
+end;
+
+function TDAEMSConnection.GetProviderName: string;
+begin
+ result := oledb_MSSQLId;
+end;
+
+function TDAEMSConnection.GetProviderType: TDAOleDBProviderType;
+begin
+ result := oledb_MSSQL;
+end;
+
+function TDAEMSConnection.GetCommandTimeout: Integer;
+begin
+ if fMSConnection <> nil then
+ Result := fMSConnection.ConnectionTimeout
+ else
+ Result:=0;
+end;
+
+procedure TDAEMSConnection.SetCommandTimeout(const Value: Integer);
+begin
+ if fMSConnection <> nil then
+ fMSConnection.ConnectionTimeout := Value;
+end;
+
+{ TDAEADODriver }
+
+function TDAEADODriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEMSConnection;
+end;
+
+function TDAEADODriver.GetDescription: string;
+begin
+ result := 'Core Lab SDAC Driver'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEADODriver.GetDriverID: string;
+begin
+ result := 'SDAC';
+end;
+
+procedure TDAEADODriver.OnSDACTrace(Sender: TObject; Text: string; Flag: TDATraceFlag);
+begin
+ if Assigned(fTraceCallback) then fTraceCallback(Sender, Text, integer(Flag));
+end;
+
+procedure TDAEADODriver.DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent);
+var
+ sdacopts: TDATraceFlags;
+begin
+ inherited;
+
+ if TraceActive then begin
+ if (fMonitor = nil) then fMonitor := TMSSQLMonitor.Create(Self);
+
+ fMonitor.Active := FALSE;
+ fMonitor.OnSQL := OnSDACTrace;
+
+ sdacopts := [];
+ if (toPrepare in TraceOptions) then sdacopts := sdacopts + [tfQPrepare];
+ if (toExecute in TraceOptions) then sdacopts := sdacopts + [tfQExecute];
+ if (toFetch in TraceOptions) then sdacopts := sdacopts + [tfQFetch];
+ if (toError in TraceOptions) then sdacopts := sdacopts + [tfError];
+ if (toStmt in TraceOptions) then sdacopts := sdacopts + [tfStmt];
+ if (toConnect in TraceOptions) then sdacopts := sdacopts + [tfConnect];
+ if (toTransact in TraceOptions) then sdacopts := sdacopts + [tfTransact];
+ if (toBlob in TraceOptions) then sdacopts := sdacopts + [tfBlob];
+ if (toService in TraceOptions) then sdacopts := sdacopts + [tfService];
+ if (toMisc in TraceOptions) then sdacopts := sdacopts + [tfMisc];
+ if (toParams in TraceOptions) then sdacopts := sdacopts + [tfParams];
+
+ fTraceCallBack := Callback;
+
+ fMonitor.TraceFlags := sdacopts;
+ fMonitor.Active := TRUE;
+ end
+ else begin
+ FreeAndNIL(fMonitor);
+ fTraceCallback := nil;
+ end;
+end;
+
+function TDAEADODriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+function TDAEADODriver.GetDefaultCustomParameters: String;
+begin
+ Result := 'Schemas=1;Integrated Security=SSPI';
+end;
+
+
+
+procedure TDAEADODriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ MSSQL_GetAuxParams(List);
+end;
+
+{ TDAEMSQuery }
+
+procedure TDAEMSQuery.ClearParams;
+begin
+ inherited;
+ TMSQuery(Dataset).Params.Clear;
+end;
+
+function TDAEMSQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TMSQuery.Create(nil);
+
+ TMSQuery(result).FetchAll := True; //for preventing creating an additional session when you call StartTransaction (an known issue of OLEDB)
+ TMSQuery(result).Unidirectional := True;
+ TMSQuery(result).ReadOnly := TRUE;
+ TMSQuery(result).Connection := TDAEMSConnection(aConnection).fMSConnection;
+// TMSQuery(result).Options.AutoPrepare:=True;
+end;
+
+function TDAEMSQuery.DoExecute: integer;
+begin
+ TMSQuery(Dataset).Execute;
+ result := TMSQuery(Dataset).RowsAffected;
+end;
+
+function TDAEMSQuery.DoGetSQL: string;
+begin
+ result := TMSQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEMSQuery.DoPrepare(Value: boolean);
+var
+ i: integer;
+ par: TMSParam;
+begin
+ if Value and not TMSQuery(Dataset).Prepared and (TMSQuery(Dataset).ParamCount<>0) then begin
+ for I := 0 to GetParams.Count - 1 do begin
+ par:=TMSQuery(Dataset).ParamByName(GetParams[i].Name);
+ par.DataType:= DATypeToVCLType(GetParams[i].DataType);
+ if par.DataType = ftAutoInc then par.DataType:= ftInteger;
+ end;
+ end;
+ TMSQuery(Dataset).Prepared := Value;
+end;
+
+procedure TDAEMSQuery.DoSetSQL(const Value: string);
+begin
+ TMSQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEMSQuery.GetParamValues(AParams: TDAParamCollection);
+var
+ I: Integer;
+ lParam: TMSParam;
+begin
+ for i := 0 to TMSQuery(DataSet).Params.Count - 1 do begin
+ lParam:=TMSQuery(DataSet).Params[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ Aparams.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+end;
+
+procedure TDAEMSQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteCrLabsParamValues(AParams, TMSQuery(Dataset).Params, true);
+end;
+
+{ TDAEADOStoredProcedure }
+
+function TDAEADOStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ result := TMSStoredProc.Create(nil);
+ TMSStoredProc(result).Connection := TDAEMSConnection(aConnection).fMSConnection;
+end;
+
+function TDAEADOStoredProcedure.Execute: integer;
+var
+ i: integer;
+ _params: TDAParamCollection;
+ lParam: uDAInterfaces.TDAParam;
+begin
+ _params := GetParams;
+
+ with TMSStoredProc(Dataset) do begin
+ for i := 0 to (Params.Count - 1) do
+ if (Params[i].ParamType in [ptInput, ptInputOutput]) then begin
+ lParam := _params.ParamByName(Params[i].Name);
+ if (Params[i].DataType in [ftMemo, ftBlob, ftGraphic]) and VarIsArray(lParam.Value)then
+ Params[i].Value := VariantToAnsiString(lParam.Value)
+ else
+ Params[i].Value := lParam.Value;
+ end;
+
+ result := DoExecute;
+
+ for i := 0 to (_params.Count-1) do
+ if (_params[i].ParamType in [daptOutput, daptInputOutput, daptResult])
+ then _params[i].Value := params.ParamByName(_params[i].Name).Value;
+ end;
+end;
+
+procedure TDAEADOStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+var
+ i: Integer;
+ lParam: TMSParam;
+begin
+ for i := 0 to TMSStoredProc(DataSet).Params.Count - 1 do begin
+ lParam:=TMSStoredProc(DataSet).Params[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ Aparams.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+end;
+
+
+function TDAEADOStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TMSStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEADOStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TMSStoredProc(Dataset).StoredProcName := Name;
+end;
+
+procedure TDAEADOStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteCrLabsParamValues(AParams, TMSStoredProc(Dataset).Params);
+end;
+
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+procedure TDAEADOStoredProcedure.RefreshParams;
+begin
+ TMSStoredProc(Dataset).PrepareSQL;
+ RefreshParamsStd(TMSStoredProc(Dataset).Params);
+end;
+
+function TDAEADOStoredProcedure.DoExecute: integer;
+begin
+ with TMSStoredProc(Dataset) do begin
+ ExecProc;
+ result := RowsAffected;
+ end;
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDASQLiteDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDASQLiteDriver.pas
new file mode 100644
index 0000000..18961a3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDASQLiteDriver.pas
@@ -0,0 +1,349 @@
+unit uDASQLiteDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library
+{
+{ compiler: Delphi 6 and up, Kylix 3 and up
+{ platform: Win32, Linux
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$R DataAbstract_SQLiteDriver_Glyphs.res}
+
+interface
+
+uses Windows, Classes, DB, uDAEngine, uDAInterfaces, uROClasses, uDAUtils, ASGSQLite3, uDASQLiteInterfaces;
+
+type
+ { TDASQLiteDriver }
+ TDASQLiteDriver = class(TDADriverReference)
+ end;
+
+ { TDAESQLiteDriver }
+ TDAESQLiteDriver = class(uDASQLiteInterfaces.TDASQLiteDriver, IDADriver40)
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ public
+ end;
+
+ // for access to protected methods
+ TDAASQLite3DB = class(TASQLite3DB)
+ private
+ public
+ function GetLastInsertRow: integer;
+ end;
+
+ { TSQLiteConnection }
+ TSQLiteConnection = class(TDAConnectionWrapper)
+ private
+ fConnection: TDAASQLite3DB;
+ protected
+ function GetConnected: Boolean; override;
+ procedure SetConnected(Value: Boolean); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Connection: TDAASQLite3DB read fConnection;
+ end;
+
+ { TDAESQLiteConnection }
+ TDAESQLiteConnection = class(TDASQLiteConnection)
+ private
+ FtransactionFlag: Boolean;
+ fConnection: TSQLiteConnection;
+ protected
+ // TDAEConnection
+ function CreateCustomConnection: TCustomConnection; override;
+ function GetDatasetClass: TDAEDatasetClass; override;
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; safecall;
+ public
+ constructor Create(aDriver: TDAEDriver; aName: string = ''); override;
+ end;
+
+ { TDAESQLiteQuery }
+ TDAESQLiteQuery = class(TDAEDataset,IDAMustSetParams)
+ private
+ protected
+ procedure ClearParams; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure DoPrepare(Value: boolean); override; safecall;
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses SysUtils, uDADriverManager, uDARes, Variants,
+ uROBinaryHelpers, uDASQL92Interfaces;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDASQLiteDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ if (_driver = nil) then _driver := TDAESQLiteDriver.Create(nil);
+ result := _driver;
+end;
+
+{ TSQLiteConnection }
+
+constructor TSQLiteConnection.Create(AOwner: TComponent);
+begin
+ inherited;
+ fConnection := TDAASQLite3DB.Create(nil);
+end;
+
+destructor TSQLiteConnection.Destroy;
+begin
+ inherited;
+ fConnection.Free;
+end;
+
+function TSQLiteConnection.GetConnected: Boolean;
+begin
+ result := fConnection.Connected;
+end;
+
+procedure TSQLiteConnection.SetConnected(Value: Boolean);
+begin
+ fConnection.Connected := Value;
+end;
+
+{ TDAESQLiteConnection }
+
+procedure TDAESQLiteConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+var
+ sName, sValue: string;
+ i: integer;
+begin
+ inherited;
+ with aConnStrParser do begin
+ TSQLiteConnection(aConnectionObject).Connection.Database := Database;
+ for i := 0 to (AuxParamsCount - 1) do begin
+ sName := AuxParamNames[i];
+ sValue := AuxParams[sName];
+ if AnsiSameText(sName, 'TransactionType') then begin
+ if AnsiSameText(sValue, 'DEFAULT') or
+ AnsiSameText(sValue, 'DEFERRED') or
+ AnsiSameText(sValue, 'IMMEDIATE') or
+ AnsiSameText(sValue, 'EXCLUSIVE') then
+ fConnection.fConnection.TransactionType := AnsiUpperCase(sValue);
+ end
+ else if AnsiSameText(sName, 'DriverDll') then begin
+ fConnection.fConnection.DriverDll := sValue
+ end
+ else if AnsiSameText(sName, 'CharacterEncoding') then begin
+ if AnsiSameText(sValue, 'STANDARD') or
+ AnsiSameText(sValue, 'UTF8') then
+ fConnection.fConnection.CharacterEncoding := AnsiUpperCase(sValue);
+ end;
+ end;
+ end;
+end;
+
+function TDAESQLiteConnection.DoBeginTransaction: integer;
+begin
+ result := -1;
+ fConnection.Connection.StartTransaction;
+ FtransactionFlag := True;
+end;
+
+procedure TDAESQLiteConnection.DoCommitTransaction;
+begin
+ fConnection.Connection.Commit;
+ FtransactionFlag := False;
+end;
+
+function TDAESQLiteConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fConnection := TSQLiteConnection.Create(nil);
+ result := fConnection;
+end;
+
+function TDAESQLiteConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAESQLiteQuery;
+end;
+
+procedure TDAESQLiteConnection.DoRollbackTransaction;
+begin
+ FtransactionFlag := False;
+ fConnection.Connection.RollBack;
+end;
+
+function TDAESQLiteConnection.DoGetInTransaction: boolean;
+begin
+ Result := FtransactionFlag;
+end;
+
+procedure TDAESQLiteConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+var
+ List: TList;
+ i: integer;
+ fld: TDAField;
+begin
+ inherited DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), Fields);
+ List := TList.Create;
+ try
+ fConnection.Connection.GetTableInfo(aTableName, List);
+ for i := 0 to List.Count - 1 do
+ with TASQLite3Field(List[i]) do begin
+ fld := Fields.FieldByName(FieldName);
+ fld.Required := FieldNN <> 0;
+ fld.InPrimaryKey := FieldPK <> 0;
+ if fld.InPrimaryKey then fld.Required := True;
+ fld.DefaultValue := FieldDefault;
+ end;
+ finally
+ List.Free;
+ end;
+end;
+
+function TDAESQLiteConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(iIdentifier) or
+ SQL92_IdentifierNeedsQuoting(iIdentifier);
+end;
+
+constructor TDAESQLiteConnection.Create(aDriver: TDAEDriver;
+ aName: string);
+begin
+ inherited;
+ FtransactionFlag := False;
+end;
+
+function TDAESQLiteConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+begin
+ Result := fConnection.Connection.GetLastInsertRow;
+end;
+
+{ TDAESQLiteDriver }
+
+function TDAESQLiteDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAESQLiteConnection;
+end;
+
+function TDAESQLiteDriver.GetDescription: string;
+begin
+ result := 'SQLite Driver';
+end;
+
+function TDAESQLiteDriver.GetDriverID: string;
+begin
+ result := 'SQLite';
+end;
+
+procedure TDAESQLiteDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ List.Add('TransactionType=(DEFAULT,DEFERRED,IMMEDIATE,EXCLUSIVE)');
+ List.Add('DriverDll=SQLite3.dll');
+ List.Add('CharacterEncoding=(STANDARD,UTF8)');
+end;
+
+{ TDAESQLiteQuery }
+
+procedure TDAESQLiteQuery.ClearParams;
+begin
+ inherited;
+ TASQLite3Query(Dataset).Params.Clear;
+end;
+
+function TDAESQLiteQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TASQLite3Query.Create(nil);
+ TASQLite3Query(result).Connection := TDAESQLiteConnection(aConnection).fConnection.Connection;
+end;
+
+function TDAESQLiteQuery.DoExecute: integer;
+begin
+ Result := -1;
+ TASQLite3Query(Dataset).ExecSQL;
+end;
+
+function TDAESQLiteQuery.DoGetSQL: string;
+begin
+ result := TASQLite3Query(Dataset).SQL.Text;
+end;
+
+procedure TDAESQLiteQuery.DoPrepare(Value: boolean);
+begin
+ // nothing
+end;
+
+procedure TDAESQLiteQuery.DoSetSQL(const Value: string);
+begin
+ TASQLite3Query(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAESQLiteQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TASQLite3Query(Dataset).Params);
+end;
+
+procedure TDAESQLiteQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TASQLite3Query(Dataset).Params);
+end;
+
+exports GetDriverObject name func_GetDriverObject;
+{ TDAASQLite3DB }
+
+function TDAASQLite3DB.GetLastInsertRow: integer;
+begin
+ result := SQLite3_LastInsertRow(DBHandle)
+end;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDASQLitePassDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDASQLitePassDriver.pas
new file mode 100644
index 0000000..854f51f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDASQLitePassDriver.pas
@@ -0,0 +1,390 @@
+unit uDASQLitePassDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{ }
+{ based on code of Giovanni Siano }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$IFNDEF FPC}
+{$R DataAbstract_SQLitePassDriver_Glyphs.res}
+{$ENDIF}
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF}
+ Classes, DB, uDAEngine, uDAInterfaces, uROClasses, uDAUtils, uDASQLiteInterfaces, SqlitePassDbo;
+
+type
+ { TDASQLitePassDriver }
+ TDASQLitePassDriver = class(TDADriverReference)
+ end;
+
+ { TDAESQLiteDriver }
+ TDAESQLiteDriver = class(uDASQLiteInterfaces.TDASQLiteDriver, IDADriver40)
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ procedure CustomizeConnectionObject(aConnection: TDAEConnection); override;
+ // IDADriver
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ public
+ end;
+
+ // for access to protected methods
+ TDASQLite3PassDB = class(TSqlitePassDatabase)
+ private
+ public
+ end;
+
+ { TSQLiteConnection }
+ TSQLiteConnection = class(TDAConnectionWrapper)
+ private
+ fConnection: TDASQLite3PassDB;
+ protected
+ function GetConnected: Boolean; override;
+ procedure SetConnected(Value: Boolean); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Connection: TDASQLite3PassDB read fConnection;
+ end;
+
+ { TDAESQLiteConnection }
+ TDAESQLiteConnection = class(TDASQLiteConnection)
+ private
+ FtransactionFlag: Boolean;
+ fConnection: TSQLiteConnection;
+ protected
+ procedure SetConnected(Value: boolean); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // TDAEConnection
+ function CreateCustomConnection: TCustomConnection; override;
+ function GetDatasetClass: TDAEDatasetClass; override;
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+ function DoGetLastAutoInc(const GeneratorName: string): integer; override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ procedure DoGetTableNames(out List: IROStrings); override;
+ public
+ constructor Create(aDriver: TDAEDriver; aName: string = ''); override;
+ end;
+
+ { TDAESQLiteQuery }
+ TDAESQLiteQuery = class(TDAEDataset,IDAMustSetParams)
+ private
+ protected
+ procedure ClearParams; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure DoPrepare(Value: boolean); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoExecute: integer; override;
+ function DoGetSQL: string; override;
+ procedure DoSetSQL(const Value: string); override;
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses SysUtils, uDADriverManager, uDARes, Variants, TypInfo,
+ uROBinaryHelpers, uDASQL92Interfaces, SqlitePassApi_v3, SqlitePassErrorLang;
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDASQLitePassDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ if (_driver = nil) then _driver := TDAESQLiteDriver.Create(nil);
+ result := _driver;
+end;
+
+{ TSQLiteConnection }
+
+constructor TSQLiteConnection.Create(AOwner: TComponent);
+begin
+ inherited;
+ fConnection := TDASQLite3PassDB.Create(nil);
+end;
+
+destructor TSQLiteConnection.Destroy;
+begin
+ inherited;
+ fConnection.Free;
+end;
+
+function TSQLiteConnection.GetConnected: Boolean;
+begin
+ result := fConnection.Connected;
+end;
+
+procedure TSQLiteConnection.SetConnected(Value: Boolean);
+begin
+ fConnection.Connected := Value;
+end;
+
+{ TDAESQLiteConnection }
+
+procedure TDAESQLiteConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+var
+ sName, sValue: string;
+ i: integer;
+begin
+ inherited;
+ with aConnStrParser do begin
+ for i := 0 to (AuxParamsCount - 1) do begin
+ sName := AuxParamNames[i];
+ sValue := AuxParams[sName];
+ if AnsiSameText(sName, 'SqliteLibrary') then begin
+ fConnection.fConnection.SQLiteLibrary := sValue;
+ end
+ else if AnsiSameText(sName, 'DatabaseType') then begin
+ if AnsiSameText(sValue, 'dbtSqlitePass') then fConnection.fConnection.DatabaseType := dbtSqlitePass
+ else if AnsiSameText(sValue, 'dbtKexi') then fConnection.fConnection.DatabaseType := dbtKexi
+ else if AnsiSameText(sValue, 'dbtSqliteAdmin') then fConnection.fConnection.DatabaseType := dbtSqliteAdmin
+ else if AnsiSameText(sValue, 'dbtSqlite4Fpc') then fConnection.fConnection.DatabaseType := dbtSqlite4Fpc
+ else if AnsiSameText(sValue, 'dbtSqliteExpert') then fConnection.fConnection.DatabaseType := dbtSqliteExpert
+ else fConnection.fConnection.DatabaseType := dbtUnknown;
+ end
+ else if Pos('datatypeoptions.', AnsiLowerCase(sName)) = 1 then begin
+ sName := Copy(sName,17, Length(sName)-16);
+ SetPropValue(fConnection.fConnection.DatatypeOptions, sName, sValue);
+ end
+ else if Pos('options.', AnsiLowerCase(sName)) = 1 then begin
+ sName := Copy(sName,9, Length(sName)-8);
+ SetPropValue(fConnection.fConnection.Options, sName, sValue);
+ end;
+ end;
+ TSQLiteConnection(aConnectionObject).Connection.Database := Database;
+ end;
+end;
+
+function TDAESQLiteConnection.DoBeginTransaction: integer;
+begin
+ result := -1;
+ fConnection.Connection.Engine.Transaction.Start;
+ FtransactionFlag := True;
+end;
+
+procedure TDAESQLiteConnection.DoCommitTransaction;
+begin
+ fConnection.Connection.Engine.Transaction.Commit;
+ FtransactionFlag := False;
+end;
+
+function TDAESQLiteConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fConnection := TSQLiteConnection.Create(nil);
+ result := fConnection;
+end;
+
+function TDAESQLiteConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAESQLiteQuery;
+end;
+
+procedure TDAESQLiteConnection.DoRollbackTransaction;
+begin
+ FtransactionFlag := False;
+ fConnection.Connection.Engine.Transaction.Rollback;
+end;
+
+function TDAESQLiteConnection.DoGetInTransaction: boolean;
+begin
+ Result := FtransactionFlag;
+end;
+
+procedure TDAESQLiteConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+var
+ i: integer;
+ fld: TDAField;
+ lSqlitePassTableDef: TSqlitePassTableDef;
+begin
+ inherited DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), Fields);
+
+ lSqlitePassTableDef := fConnection.Connection.TableDefs.TableByName(aTableName);
+
+ with lSqlitePassTableDef do begin
+ for i := 0 to Pred(Fields.Count - 1) do
+ with FieldDefs.FindFieldDef(Fields[i].Name) do
+ begin
+ fld := Fields[i];
+ fld.Required := NotNull;
+ fld.InPrimaryKey := PrimaryKey;
+ if fld.InPrimaryKey then fld.Required := True;
+ fld.DefaultValue := DefaultValue;
+ end;
+ end;
+end;
+
+procedure TDAESQLiteConnection.SetConnected(Value: boolean);
+var
+ lErrorCode: integer;
+ lMsg: String;
+ lDateTime: TDateTime;
+begin
+ inherited;
+ if not fConnection.fConnection.Connected then begin
+ fConnection.fConnection.DatabaseError.GetLastError(lErrorCode,lMsg, lDateTime);
+ if lMsg <> Msg1002 then raise Exception.Create(lMsg);
+ end;
+end;
+
+constructor TDAESQLiteConnection.Create(aDriver: TDAEDriver;
+ aName: string);
+begin
+ inherited;
+ FtransactionFlag := False;
+end;
+
+function TDAESQLiteConnection.DoGetLastAutoInc(
+ const GeneratorName: string): integer;
+begin
+ Result := SqliteDbv3_last_insert_rowid(fConnection.Connection);
+end;
+
+
+
+procedure TDAESQLiteConnection.DoGetTableNames(out List: IROStrings);
+var
+ i: integer;
+begin
+ inherited;
+ {Giovanni: to avoid return of system table names}
+ for i := Pred(List.Count) downto 0 do
+ if fConnection.fConnection.IsSystemTable(List.Strings[i]) then List.Delete(i);
+end;
+
+{ TDAESQLiteDriver }
+
+procedure TDAESQLiteDriver.CustomizeConnectionObject(
+ aConnection: TDAEConnection);
+begin
+ inherited;
+ //TODO:
+end;
+
+
+function TDAESQLiteDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAESQLiteConnection;
+end;
+
+function TDAESQLiteDriver.GetDescription: string;
+begin
+ result := 'SQLitePass Driver';
+end;
+
+function TDAESQLiteDriver.GetDriverID: string;
+begin
+ result := 'SQLitePass';
+end;
+
+procedure TDAESQLiteDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ //TODO: TDAESQLiteDriver.GetAuxParams()
+ //List.Add('TransactionType=(DEFAULT,DEFERRED,IMMEDIATE,EXCLUSIVE)');
+ List.Add('DatabaseType=(dbtSqlitePass, dbtKexi, dbtSqliteAdmin, dbtSqlite4Fpc, dbtSqliteExpert, dbtUnknown)');
+ List.Add('SqliteLibrary=path to sqlitepass3.dll or libsqlitepass3.so');
+ List.Add('DatatypeOptions. =');
+ List.Add('Options. =');
+
+ List.Add('');
+ List.Add('Consult to SQLitePass documentation about DatatypeOptions and Options options.');
+
+ //List.Add('CharacterEncoding=(STANDARD,UTF8)');
+end;
+
+{ TDAESQLiteQuery }
+
+procedure TDAESQLiteQuery.ClearParams;
+begin
+ inherited;
+ TSqlitePassDataset(Dataset).Params.Clear;
+end;
+
+function TDAESQLiteQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TSqlitePassDataset.Create(nil);
+ TSqlitePassDataset(Result).Database := TDAESQLiteConnection(aConnection).fConnection.Connection;
+ if not TDAESQLiteConnection(aConnection).GetConnected then TDAESQLiteConnection(aConnection).Open
+end;
+
+function TDAESQLiteQuery.DoExecute: integer;
+begin
+ Result := -1;
+ TSqlitePassDataset(Dataset).Open;
+end;
+
+function TDAESQLiteQuery.DoGetSQL: string;
+begin
+ result := TSqlitePassDataset(Dataset).SQL.Text;
+end;
+
+procedure TDAESQLiteQuery.DoPrepare(Value: boolean);
+begin
+ // nothing
+end;
+
+procedure TDAESQLiteQuery.DoSetSQL(const Value: string);
+begin
+ TSqlitePassDataset(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAESQLiteQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TSqlitePassDataset(Dataset).Params);
+end;
+
+procedure TDAESQLiteQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ SetParamValuesStd(AParams, TSqlitePassDataset(Dataset).Params);
+end;
+
+exports GetDriverObject name func_GetDriverObject;
+
+initialization
+{$IFDEF FPC}
+ {$I DataAbstract_SQLitePassDriver_Glyphs.lrs}
+{$ENDIF}
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAUniDACDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAUniDACDriver.pas
new file mode 100644
index 0000000..f0d68fd
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAUniDACDriver.pas
@@ -0,0 +1,1196 @@
+unit uDAUniDACDriver;
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+
+{.$DEFINE UNIDAC_NATIVE_ONLY}
+interface
+
+uses DB, Classes, uDAEngine, uROClasses,
+ uROBinaryHelpers, uDAUtils,
+ DBAccess, Uni, DASQLMonitor, UniSQLMonitor,
+ uDAInterfaces,
+ uDAADOInterfaces,
+ uDAIBInterfaces,
+ uDASQLiteInterfaces,
+ uDAOracleInterfaces,
+ uDAMySQLInterfaces,
+ uDADB2Interfaces,
+ uDASybaseInterfaces,
+ uDAPostgresInterfaces;
+
+type
+
+ TDAUnidacDriverType = (
+ dauUnknown,
+ dauAccess,
+ dauAdvantage,
+ dauASE,
+ dauIBMDB2,
+ dauInterBase,
+ dauMySQL,
+ dauOracle,
+ dauPostgreSQL,
+ dauSQLite,
+ dauMSSQL);
+
+const
+ uni_access = 'access';
+ uni_advantage = 'advantage';
+ uni_ase = 'ase';
+ uni_ibmdb2 = 'db2';
+ uni_interbase = 'interbase';
+ uni_mysql = 'mysql';
+ uni_oracle = 'oracle';
+ uni_postgresql = 'postgresql';
+ uni_sqlite = 'sqlite';
+ uni_sqlserver = 'sql server';
+
+type
+ { TDAUniDACDriver }
+ TDAUniDACDriver = class(TDADriverReference)
+ end;
+
+ { TDAEUniDACDriver }
+ TDAEUniDACDriver = class(TDAEDriver,IDADriver40)
+ private
+ fMonitor: TUniSQLMonitor;
+ fTraceCallBack: TDALogTraceEvent;
+ procedure OnSDACTrace(Sender: TObject; Text: string; Flag: TDATraceFlag);
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent); override;
+ // IDADriver
+ function GetDriverID: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDescription: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetAuxDrivers(out List: IROStrings); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAvailableDriverOptionsEx(AuxDriver: string): TDAAvailableDriverOptions; override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ //IDADriver40
+ function GetProviderDefaultCustomParameters(Provider: string): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ { TDAEMyConnection }
+ TDAEUniDACConnection = class(TDAEConnection, IDAConnection,
+ IDAInterbaseConnection, //IDAIBTransactionAccess, IDAIBConnectionProperties,
+ IDAOracleConnection,
+ IDAMySQLConnection,
+ IDASQLiteConnection,
+ IDADB2Connection,
+ IDASybaseConnection,
+ IDAPostgresConnection,
+ // IDAConnectionModelling,
+ IDACanQueryDatabaseNames,
+ IDAFileBasedDatabase,
+ // IDADirectoryBasedDatabase,
+ IDAUseGenerators,
+ IDAUseGenerators2,
+ IDACanQueryGeneratorsNames,
+ IDATestableObject)
+ private
+ fConnection: TUniConnection;
+ fDriverName: string;
+ fDriverType: TDAUnidacDriverType;
+ fMSSQLSchemaEnabled: Boolean;
+ FMySQLVersion: integer;
+ FSchemaSupported: integer;
+ function CombineSchemaWithName(aSchema, aName: string): string;
+ function GetMySQLVersion: integer;
+ procedure native_DoGetNames(AList: IROStrings; AObjectType: TDAObjecttype);
+ procedure native_DoGetForeignKeys(ForeignKeys: TDADriverForeignKeyCollection);
+ procedure native_GetGeneratorNames(AList: IROStrings);
+ procedure native_DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection);
+ function isSchemaSupported: Boolean;
+ protected
+ function QueryInterface(const IID: TGUID; out Obj): HResult; override; stdcall;
+ function CreateCustomConnection: TCustomConnection; override;
+
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection); override;
+
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ //rocedure DoGetQueryFields(const aSQL: string; aParamsIfNeeded: TDAParamCollection; out Fields: TDAFieldCollection); override;
+ //procedure DoGetViewFields(const aViewName: string; out Fields: TDAFieldCollection); override;
+
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+
+ { IDATestableObject }
+ // procedure Test; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDAConnection }
+
+ function GetSPSelectSyntax(HasArguments: Boolean): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetQuoteChars: TDAQuoteCharArray; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function IdentifierIsQuoted(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function QuoteIdentifierIfNeeded(const iIdentifier: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function QuoteIdentifier(const iIdentifier: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function QuoteFieldNameIfNeeded(const aTableName, aFieldName: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function QuoteFieldName(const aTableName, aFieldName: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // function NewCommand(const Text: string; CommandType: TDASQLStatementType; const aCommandName: string = ''): IDASQLCommand; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function NewDataset(const SQL: string; const aDatasetName: string = ''): IDADataset; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // function isAlive: Boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function GetQueryBuilder: TDAQueryBuilder; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDAInterbaseConnection }
+ // nothing
+
+ { IDAIBTransactionAccess }
+ //function GetTransaction: TObject; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ //procedure CommitRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ //procedure RollbackRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDAIBConnectionProperties }
+ function GetRole: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRole(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetSQLDialect: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetSQLDialect(Value: integer); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetCharset: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetCharset(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Commit; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // procedure CommitRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Rollback; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // procedure RollbackRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDAOracleConnection }
+ // nothing
+
+ { IDAConnectionModelling }
+ // function FieldToDeclaration(aField: TDAField): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function BuildCreateTableSQL(aDataSet: TDADataSet; const aOverrideName: string = ''): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // procedure CreateTable(aDataSet: TDADataSet; const aOverrideName: string = ''); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDACanQueryDatabaseNames }
+ function GetDatabaseNames: IROStrings;
+
+ { IDAFileBasedDatabase }
+ function GetFileExtensions: IROStrings;
+
+ { IDADirectoryBasedDatabase }
+ // nothing
+
+ { IDAUseGenerators }
+ function GetNextAutoinc(const GeneratorName: string): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ { IDAUseGenerators2 }
+ function GetNextAutoinc2(const GeneratorName: string): variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDACanQueryGeneratorsNames }
+ function GetGeneratorNames: IROStrings;
+ public
+ end;
+
+ { TDAEUniDACQuery }
+ TDAEUniDACQuery = class(TDAEDataset,IDAMustSetParams)
+ private
+
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure ClearParams; override;
+ function DoExecute: integer; override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoGetSQL: string; override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoSetSQL(const Value: string); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoPrepare(Value: boolean); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ public
+ end;
+
+ { TDAEUniDACStoredProcedure }
+ TDAEUniDACStoredProcedure = class(TDAEStoredProcedure,IDAMustSetParams)
+ protected
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+
+ function GetStoredProcedureName: string; override;
+ procedure SetStoredProcedureName(const Name: string); override;
+ function DoExecute: integer; override;
+ function Execute: integer; override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+
+
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ {$IFDEF FPC}LResources,{$ENDIF}
+ {$IFDEF MSWINDOWS}Windows, {$ENDIF}
+ SysUtils, Variants,
+ uDADriverManager, uDARes, TypInfo,
+ {$IFDEF MSWINDOWS}
+ AccessUniProvider,
+ AdvantageUniProvider,
+ ASEUniProvider,
+ DB2UniProvider,
+ ODBCUniProvider,
+ SQLServerUniProvider,
+ {$ENDIF}
+ InterBaseUniProvider,
+ MySQLUniProvider,
+ OracleUniProvider,
+ PostgreSQLUniProvider,
+ SQLiteUniProvider,
+ UniProvider;
+
+{$IFNDEF FPC}
+ {$R DataAbstract_UniDACDriver_Glyphs.res}
+{$ENDIF}
+
+
+
+function UNIDriverIdToUNIDriverType(aAuxDriver: string): TDAUnidacDriverType;
+begin
+ Result := dauUnknown;
+ aAuxDriver := LowerCase(aAuxDriver);
+ if uni_access = aAuxDriver then Result := dauAccess
+ else if uni_advantage = aAuxDriver then Result := dauAdvantage
+ else if uni_ase = aAuxDriver then Result := dauASE
+ else if uni_ibmdb2 = aAuxDriver then Result := dauIBMDB2
+ else if uni_interbase = aAuxDriver then Result := dauInterBase
+ else if uni_MySQL = aAuxDriver then Result := dauMySQL
+ else if uni_ORACLE = aAuxDriver then Result := dauOracle
+ else if uni_PostgreSQL = aAuxDriver then Result := dauPostgreSQL
+ else if uni_SQLite = aAuxDriver then Result := dauSQLite
+ else if uni_sqlserver = aAuxDriver then Result := dauMSSQL
+ else ;
+end;
+
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAUniDACDriver]);
+end;
+
+{$IFDEF DataAbstract_SchemaModelerOnly}
+{$INCLUDE ..\DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModelerOnly}
+
+function GetDriverObject: IDADriver;
+begin
+ {$IFDEF DataAbstract_SchemaModelerOnly}
+ if not RunningInSchemaModeler then begin
+ result := nil;
+ exit;
+ end;
+ {$ENDIF}
+ if (_driver = nil) then _driver := TDAEUniDACDriver.Create(nil);
+ result := _driver;
+end;
+
+{$I uDACRLabsUtils.inc}
+
+{ TDAEUniDACDriver }
+
+procedure TDAEUniDACDriver.DoSetTraceOptions(TraceActive: boolean;
+ TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent);
+var
+ sdacopts: TDATraceFlags;
+begin
+ inherited;
+ if TraceActive then begin
+ if (fMonitor = nil) then fMonitor := TUniSQLMonitor.Create(Self);
+
+ fMonitor.Active := FALSE;
+ fMonitor.OnSQL := OnSDACTrace;
+
+ sdacopts := [];
+ if (toPrepare in TraceOptions) then sdacopts := sdacopts + [tfQPrepare];
+ if (toExecute in TraceOptions) then sdacopts := sdacopts + [tfQExecute];
+ if (toFetch in TraceOptions) then sdacopts := sdacopts + [tfQFetch];
+ if (toError in TraceOptions) then sdacopts := sdacopts + [tfError];
+ if (toStmt in TraceOptions) then sdacopts := sdacopts + [tfStmt];
+ if (toConnect in TraceOptions) then sdacopts := sdacopts + [tfConnect];
+ if (toTransact in TraceOptions) then sdacopts := sdacopts + [tfTransact];
+ if (toBlob in TraceOptions) then sdacopts := sdacopts + [tfBlob];
+ if (toService in TraceOptions) then sdacopts := sdacopts + [tfService];
+ if (toMisc in TraceOptions) then sdacopts := sdacopts + [tfMisc];
+ if (toParams in TraceOptions) then sdacopts := sdacopts + [tfParams];
+
+ fTraceCallBack := Callback;
+
+ fMonitor.TraceFlags := sdacopts;
+ fMonitor.Active := TRUE;
+ end
+ else begin
+ FreeAndNIL(fMonitor);
+ fTraceCallback := nil;
+ end;
+end;
+
+procedure TDAEUniDACDriver.GetAuxDrivers(out List: IROStrings);
+var
+ i : integer;
+ str: TStringList;
+begin
+ inherited;
+ Str := TStringList.Create;
+ try
+ UniProviders.GetProviderNames(str);
+ for i := 0 to Str.Count - 1 do
+ if UNIDriverIdToUNIDriverType(str[i]) <> dauUnknown then
+ List.Add(str[i]);
+ List.Sorted := True;
+ finally
+ Str.Free;
+ end;
+end;
+
+procedure TDAEUniDACDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ case UNIDriverIdToUNIDriverType(AuxDriver) of
+ dauMSSQL: MSSQL_GetAuxParams(List);
+ end;
+ List.Add('Options. =');
+ List.Add('SpecificOptions. =');
+ case UNIDriverIdToUNIDriverType(AuxDriver) of
+ dauAccess, dauSQLite:;
+ else
+ List.Add('Port=');
+ end;
+ List.Add('');
+ List.Add('Consult to UniDAC documentation about Options and SpecificOptions options.');
+end;
+
+function TDAEUniDACDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ Result := [doAuxDriver, doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+function TDAEUniDACDriver.GetAvailableDriverOptionsEx(
+ AuxDriver: string): TDAAvailableDriverOptions;
+begin
+ case UNIDriverIdToUNIDriverType(AuxDriver) of
+ dauAccess : Result := [doAuxDriver, doDatabaseName, doLogin, doCustom];
+ dauSQLite : Result := [doAuxDriver, doDatabaseName, doCustom];
+ else
+ Result := [doAuxDriver, doServerName, doDatabaseName, doLogin, doCustom];
+ end;
+end;
+
+function TDAEUniDACDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEUniDACConnection;
+end;
+
+function TDAEUniDACDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ case UNIDriverIdToUNIDriverType(AuxDriver) of
+ dauAccess: Result := Access_DriverType;
+// dauAdvantage,
+// dauASE,
+ dauIBMDB2: Result:= DB2_DriverType;
+ dauInterBase: Result := IB_DriverType;
+ dauMySQL: Result := MySQL_DriverType;
+ dauOracle: Result := Oracle_DriverType;
+ dauPostgreSQL: Result := PostgreSQL_DriverType;
+ dauSQLite: Result:= SQLite_DriverType;
+ dauMSSQL: Result := MSSQL_DriverType;
+ else
+ Result:= inherited GetDefaultConnectionType(AuxDriver);
+ end;
+end;
+
+function TDAEUniDACDriver.GetDescription: string;
+begin
+ result := 'Devart''s UniDAC'{$IFDEF DataAbstract_SchemaModelerOnly} + SchemaModelerOnly{$ENDIF};
+end;
+
+function TDAEUniDACDriver.GetDriverID: string;
+begin
+ Result := 'UniDAC';
+end;
+
+function TDAEUniDACDriver.GetProviderDefaultCustomParameters(
+ Provider: string): string;
+begin
+ Result := '';
+ case UNIDriverIdToUNIDriverType(Provider) of
+ dauMySQL: Result := MYSQL_GetDefaultCustomParameters;
+ dauMSSQL: Result := 'Schemas=1;Integrated Security=SSPI';
+ end;
+end;
+
+procedure TDAEUniDACDriver.OnSDACTrace(Sender: TObject; Text: string;
+ Flag: TDATraceFlag);
+begin
+ if Assigned(fTraceCallback) then fTraceCallback(Sender, Text, integer(Flag));
+end;
+
+{ TDAEUniDACConnection }
+
+function TDAEUniDACConnection.CombineSchemaWithName(aSchema,
+ aName: string): string;
+begin
+ if not isSchemaSupported then begin
+ Result := aName
+ end
+ else begin
+ if (fDriverType = dauMSSQL) and (not fMSSQLSchemaEnabled) then begin
+ if aSchema = 'dbo' then
+ Result := aName
+ else
+ Result := aSchema + '.' + aName;
+ end
+ else
+ Result := aSchema + '.' + aName;
+ end;
+end;
+
+procedure TDAEUniDACConnection.Commit;
+begin
+ Self.DoCommitTransaction;
+end;
+
+function TDAEUniDACConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fConnection := TUniConnection.Create(nil);
+ fConnection.LoginPrompt := FALSE;
+
+ result := fConnection;
+end;
+
+procedure TDAEUniDACConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection);
+var
+ i: integer;
+ sName, lcName, sValue: string;
+begin
+ FSchemaSupported := -1;
+ FMySQLVersion := -1;
+ fMSSQLSchemaEnabled := True;
+ inherited;
+ with aConnStrParser do begin
+ fDriverName := AuxDriver;
+ fDriverType := UNIDriverIdToUNIDriverType(AuxDriver);
+
+ fConnection.ProviderName := AuxDriver;
+ if (Self.UserID <> '') then
+ fConnection.Username := Self.UserID
+ else
+ fConnection.Username := UserID;
+
+ if (Self.Password <> '') then
+ fConnection.Password := Self.Password
+ else
+ fConnection.Password := Password;
+ if Server <> '' then fConnection.Server := Server;
+ if Database <> '' then fConnection.Database := Database;
+
+ for i := 0 to AuxParamsCount - 1 do begin
+ sName := AuxParamNames[i];
+ if sName = '' then Continue;
+ lcName := AnsiLowerCase(sName);
+ sValue := AuxParams[AuxParamNames[i]];
+ if AnsiSameText(sName, 'port') then begin
+ if StrToIntDef(sValue, -1) <> -1 then fConnection.Port := StrToInt(sValue);
+ end
+ else if Pos('options.', lcName) = 1 then begin
+ sName := Copy(sName,9, Length(sName)-8);
+ SetPropValue(fConnection.Options, sName, sValue);
+ end
+ else if Pos('specificoptions.', lcName) = 1 then begin
+ sName := Copy(sName,17, Length(sName)- 16);
+ fConnection.SpecificOptions.Values[sValue]:=sName;
+ end
+ else if lcName = 'schemas' then begin
+ fMSSQLSchemaEnabled := AuxParams['Schemas'] = '1'
+ end
+ else if (fDriverType = dauMSSQL) and (lcname = 'integrated security') and (AnsiSameText(sValue, 'SSPI')) then begin
+ fConnection.SpecificOptions.Values['Authentication']:='auWindows';
+ end;
+ end;
+ end;
+end;
+
+function TDAEUniDACConnection.DoBeginTransaction: integer;
+begin
+ fConnection.StartTransaction;
+ result := 0;
+end;
+
+procedure TDAEUniDACConnection.DoCommitTransaction;
+begin
+ fConnection.Commit;
+end;
+
+procedure TDAEUniDACConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ inherited;
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauMSSQL: MSSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, fMSSQLSchemaEnabled);
+ dauInterBase: IB_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ dauMySQL: MYSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, fConnection.Database,GetMySQLVersion);
+ dauPostgreSQL: Postgres_DoGetForeignKeys(GetDatasetClass.Create(Self),ForeignKeys);
+ dauOracle: Oracle_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ dauSQLite: SQLite_DoGetForeignKeys(GetDatasetClass.Create(Self),ForeignKeys);
+ else
+ {$ENDIF}
+ native_DoGetForeignKeys(ForeignKeys);
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ end;
+ {$ENDIF}
+end;
+
+function TDAEUniDACConnection.DoGetInTransaction: boolean;
+begin
+ Result := fConnection.InTransaction;
+end;
+
+function TDAEUniDACConnection.DoGetLastAutoIncValue(
+ const GeneratorName: string): Variant;
+begin
+ Result := -1;
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauMSSQL: Result := MSSQL_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ dauInterBase: Result := IB_GetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ dauMySQL: Result := MySQL_GetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ dauOracle: Result := Oracle_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ dauPostgreSQL: Result := Postgres_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ else
+ end;
+ {$ENDIF}
+end;
+
+procedure TDAEUniDACConnection.native_DoGetForeignKeys(
+ ForeignKeys: TDADriverForeignKeyCollection);
+begin
+// not implemented yet
+end;
+
+procedure TDAEUniDACConnection.native_DoGetNames(AList: IROStrings;
+ AObjectType: TDAObjecttype);
+
+ procedure _GetNames(aRestriction: string);
+ var
+ FMetadata: TUniMetaData;
+ fld, fld2: TField;
+ begin
+ FMetadata := TUniMetaData(fConnection.CreateMetaData);
+ try
+ FMetadata.MetaDataKind := 'tables';
+ if (fDriverType = dauMSSQL) and not fMSSQLSchemaEnabled then
+ FMetadata.Restrictions.Values['TABLE_SCHEMA'] := 'dbo';
+ FMetadata.Restrictions.Values['TABLE_TYPE'] := aRestriction;
+ FMetadata.Open;
+ fld := FMetadata.FindField('TABLE_SCHEMA');
+ fld2 := FMetadata.FieldByName('TABLE_NAME');
+ while not FMetadata.Eof do begin
+ if isSchemaSupported and (fld <> nil) and (fld.AsString <> '') then
+ AList.Add(CombineSchemaWithName(fld.AsString,fld2.AsString))
+ else
+ AList.Add(fld2.AsString);
+ FMetadata.Next;
+ end;
+ finally
+ FMetadata.Free;
+ end;
+ end;
+
+begin
+ case AObjectType of
+ dotTable: _GetNames('TABLE');
+ dotView: _GetNames('VIEW');
+ dotProcedure: fConnection.GetStoredProcNames(AList.Strings);
+ end;
+end;
+
+procedure TDAEUniDACConnection.native_DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+var
+ FMetadata: TUniMetaData;
+ i: integer;
+ lSchemaName,lTableName: string;
+ lPK: string;
+ fld: TDAField;
+begin
+ inherited DoGetTableFields(aTableName,Fields);
+
+ FMetadata := TUniMetaData(fConnection.CreateMetaData);
+ try
+ FMetadata.MetaDataKind := 'constraints';
+ i := pos('.', aTableName);
+ if isSchemaSupported and (i <> 0) then begin
+ lSchemaName := Copy(aTableName, 1, i-1);
+ lTableName := Copy(aTableName, i+1, Length(aTableName)-i);
+ end
+ else begin
+ lSchemaName := '';
+ lTableName := aTableName;
+ end;
+
+ if (fDriverType = dauMSSQL) and not fMSSQLSchemaEnabled then
+ FMetadata.Restrictions.Values['TABLE_SCHEMA'] := 'dbo'
+ else
+ if lSchemaName <> '' then
+ FMetadata.Restrictions.Values['TABLE_SCHEMA'] := lSchemaName;
+ FMetadata.Restrictions.Values['TABLE_NAME'] := lTableName;
+ FMetadata.Restrictions.Values['CONSTRAINT_TYPE'] := 'PRIMARY KEY';
+ FMetadata.Open;
+ if not FMetadata.Eof then lPk := FMetadata.FieldByName('CONSTRAINT_NAME').AsString;
+ if lpk <> '' then begin
+ FMetadata.Close;
+ FMetadata.MetaDataKind := 'IndexColumns';
+ FMetadata.Restrictions.Values['INDEX_NAME'] := lPK;
+ FMetadata.Open;
+ While not FMetadata.Eof do begin
+ fld:= Fields.FindField(FMetadata.FieldByName('COLUMN_NAME').AsString);
+ if fld <> nil then begin
+ fld.InPrimaryKey := True;
+ fld.Required := True;
+ end;
+ FMetadata.Next;
+ end;
+ end;
+ finally
+ FMetadata.Free;
+ end;
+end;
+
+procedure TDAEUniDACConnection.native_GetGeneratorNames(AList: IROStrings);
+var
+ FMetadata: TUniMetaData;
+ s: string;
+begin
+ // nowadays, IB is only supported
+ FMetadata := TUniMetaData(fConnection.CreateMetaData);
+ try
+ FMetadata.MetaDataKind := 'generators';
+ FMetadata.Open;
+ while not FMetadata.Eof do begin
+ s:= FMetadata.Fields[0].AsString;
+ AList.Add(s);
+ FMetadata.Next;
+ end;
+ finally
+ FMetadata.Free;
+ end;
+end;
+
+procedure TDAEUniDACConnection.DoGetStoredProcedureNames(out List: IROStrings);
+begin
+ inherited;
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure, fMSSQLSchemaEnabled);
+ dauInterBase: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ dauMYSQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure, fConnection.Database,GetMySQLVersion);
+ dauSQLite: SQLite_GetObjectNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ dauPostgreSQL: Postgres_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ dauOracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ else
+ {$ENDIF}
+ native_DoGetNames(List, dotProcedure);
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ end;
+ {$ENDIF}
+end;
+
+procedure TDAEUniDACConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ inherited DoGetStoredProcedureParams(aStoredProcedureName,Params);
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauMySQL: MYSQL_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params, fConnection.Database);
+ dauOracle: Oracle_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+ dauPostgreSQL: Postgres_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+ dauMSSQL: MSSQL_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+ else
+ end;
+ {$ENDIF}
+end;
+
+procedure TDAEUniDACConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauMSSQL: MSSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ dauInterBase: IB_GetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ dauMySQL: MYSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName),GetDatasetClass.Create(Self),Fields, fConnection.Database,GetMySQLVersion);
+ dauOracle: Oracle_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ dauPostgreSQL: Postgres_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ else
+ {$ENDIF}
+ native_DoGetTableFields(aTableName, Fields);
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ end;
+ {$ENDIF}
+end;
+
+procedure TDAEUniDACConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited;
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable, fMSSQLSchemaEnabled);
+ dauInterBase: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotTable);
+ dauMYSQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable, fConnection.Database,GetMySQLVersion);
+ dauSQLite: SQLite_GetObjectNames(GetDatasetClass.Create(Self), List, dotTable);
+ dauPostgreSQL: Postgres_DoGetNames(GetDatasetClass.Create(Self), List, dotTable);
+ dauOracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotTable);
+ else
+ {$ENDIF}
+ native_DoGetNames(List, dotTable);
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ end;
+ {$ENDIF}
+end;
+
+procedure TDAEUniDACConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited;
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView, fMSSQLSchemaEnabled);
+ dauInterBase: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotView);
+ dauMYSQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView, fConnection.Database,GetMySQLVersion);
+ dauSQLite: SQLite_GetObjectNames(GetDatasetClass.Create(Self), List, dotView);
+ dauPostgreSQL: Postgres_DoGetNames(GetDatasetClass.Create(Self), List, dotView);
+ dauOracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotView);
+ else
+ {$ENDIF}
+ native_DoGetNames(List, dotView);
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ end;
+ {$ENDIF}
+end;
+
+procedure TDAEUniDACConnection.DoRollbackTransaction;
+begin
+ fConnection.Rollback;
+end;
+
+
+function TDAEUniDACConnection.GetCharset: string;
+begin
+ Result := fConnection.SpecificOptions.Values['Charset'];
+end;
+
+function TDAEUniDACConnection.GetDatabaseNames: IROStrings;
+begin
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauMSSQL: Result := MSSQL_GetDatabaseNames(Self);
+ dauMySQL: Result := MYSQL_GetDatabaseNames(Self);
+ dauPostgreSQL: Result := Postgres_GetDatabaseNames(Self);
+ else
+ {$ENDIF}
+ Result := NewROStrings;
+ fConnection.GetDatabaseNames(Result.Strings);
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ end;
+ {$ENDIF}
+end;
+
+function TDAEUniDACConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ Result := TDAEUniDACQuery;
+end;
+
+function TDAEUniDACConnection.GetFileExtensions: IROStrings;
+begin
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauInterBase: Result := IB_GetFileExtensions;
+ dauSQLite: Result := SQLite_GetFileExtensions;
+ dauAccess: Result := MSACCESS_GetFileExtensions;
+ else
+ {$ENDIF}
+ Result := NewROStrings;
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ end;
+ {$ENDIF}
+end;
+
+function TDAEUniDACConnection.GetGeneratorNames: IROStrings;
+begin
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauInterBase: Result:= IB_GetGeneratorNames(GetDatasetClass.Create(Self));
+ else
+ {$ENDIF}
+ Result := NewROStrings;
+ native_GetGeneratorNames(Result);
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ end;
+ {$ENDIF}
+end;
+
+function TDAEUniDACConnection.GetMySQLVersion: integer;
+begin
+ if FMySQLVersion = -1 then FMySQLVersion := MYSQL_GetVersion(GetDatasetClass.Create(Self));
+ Result := FMySQLVersion;
+end;
+
+function TDAEUniDACConnection.GetNextAutoinc(
+ const GeneratorName: string): integer;
+begin
+ Result := GetNextAutoinc2(GeneratorName);
+end;
+
+function TDAEUniDACConnection.GetNextAutoinc2(
+ const GeneratorName: string): variant;
+begin
+ Result := -1;
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauInterBase: Result := IB_GetNextAutoinc(GeneratorName, GetDatasetClass.Create(Self));
+ dauOracle: Result := Oracle_GetNextAutoinc(GeneratorName, GetDatasetClass.Create(Self));
+ dauPostgreSQL: Result := Postgres_GetNextAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ end;
+ {$ENDIF}
+end;
+
+function TDAEUniDACConnection.GetQuoteChars: TDAQuoteCharArray;
+begin
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauMSSQL: Result := MSSQL_GetQuoteChars;
+ dauOracle: Result:= Oracle_GetQuoteChars;
+ else
+ {$ENDIF}
+ Result := inherited GetQuoteChars;
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ end;
+ {$ENDIF}
+end;
+
+function TDAEUniDACConnection.GetRole: string;
+begin
+ Result := fConnection.SpecificOptions.Values['Role'];
+end;
+
+function TDAEUniDACConnection.GetSPSelectSyntax(HasArguments: Boolean): string;
+begin
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ case fDriverType of
+ dauMSSQL: Result := MSSQL_GetSPSelectSyntax(HasArguments);
+ dauInterBase: Result := IB_GetSPSelectSyntax(HasArguments);
+ dauOracle: Result := Oracle_GetSPSelectSyntax(HasArguments);
+ dauPostgreSQL: Result := Postgres_GetSPSelectSyntax(HasArguments);
+ else
+ {$ENDIF}
+ Result := inherited GetSPSelectSyntax(HasArguments);
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ end;
+ {$ENDIF}
+end;
+
+function TDAEUniDACConnection.GetSQLDialect: integer;
+begin
+ Result := StrToIntDef(fConnection.SpecificOptions.Values['SQLDialect'],3);
+end;
+
+function TDAEUniDACConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ Result := TDAEUniDACStoredProcedure;
+end;
+
+function TDAEUniDACConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result:= inherited IdentifierNeedsQuoting(iIdentifier);
+ {$IFNDEF UNIDAC_NATIVE_ONLY}
+ if not result then
+ case fDriverType of
+ dauMSSQL: Result := MSSQL_IdentifierNeedsQuoting(iIdentifier);
+ dauInterBase: Result := IB_IdentifierNeedsQuoting(iIdentifier, GetSQLDialect);
+ dauMySQL: Result := MYSQL_IdentifierNeedsQuoting(iIdentifier);
+ dauORACLE: Result := Oracle_IdentifierNeedsQuoting(iIdentifier);
+ dauPostgreSQL: Result:= Postgres_IdentifierNeedsQuoting(iIdentifier);
+ dauIBMDB2: Result := DB2_IdentifierNeedsQuoting(iIdentifier);
+ dauASE,dauAdvantage: Result := Sybase_IdentifierNeedsQuoting(iIdentifier);
+ else
+
+ end;
+ {$ENDIF}
+end;
+
+function TDAEUniDACConnection.isSchemaSupported: Boolean;
+var
+ Fld: TField;
+begin
+ if FSchemaSupported = -1 then begin
+ With fConnection.CreateMetaData do try
+ MetaDataKind := 'tables';
+ Restrictions.Values['TABLE_NAME']:='___';
+ Open;
+ Fld := FindField('TABLE_SCHEMA');
+ Result := Assigned(Fld) and (Fld.Size <> 0);
+ FSchemaSupported := ord(Result);
+ finally
+ Free;
+ end;
+ end
+ else
+ Result := FSchemaSupported = 1;
+end;
+
+function TDAEUniDACConnection.QueryInterface(const IID: TGUID;
+ out Obj): HResult;
+begin
+ Result := E_NOINTERFACE;
+ if IsEqualGUID(IID, IDAInterbaseConnection) then begin
+ if fDriverType <> dauInterbase then Exit;
+ end else if IsEqualGUID(IID, IDAIBTransactionAccess) then begin
+ if fDriverType <> dauInterbase then Exit;
+ end else if IsEqualGUID(IID, IDAIBConnectionProperties) then begin
+ if fDriverType <> dauInterbase then Exit;
+ end else if IsEqualGUID(IID, IDAOracleConnection) then begin
+ if fDriverType <> dauOracle then Exit;
+ end else if IsEqualGUID(IID, IDASQLiteConnection) then begin
+ if fDriverType <> dauSQLite then Exit;
+ end else if IsEqualGUID(IID, IDADB2Connection) then begin
+ if fDriverType <> dauIBMDB2 then Exit;
+ end else if IsEqualGUID(IID, IDASybaseConnection) then begin
+ if not (fDriverType in [dauAdvantage, dauASE]) then Exit;
+ end else if IsEqualGUID(IID, IDAPostgresConnection) then begin
+ if fDriverType <> dauPostgreSQL then Exit;
+ end else if IsEqualGUID(IID, IDAMySQLConnection) then begin
+ if fDriverType <> dauMySQL then Exit;
+ end else if IsEqualGUID(IID, IDACanQueryDatabaseNames) then begin
+ if (fDriverType in [dauInterBase, dauSQLite, dauAccess]) then Exit;
+ end else if IsEqualGUID(IID, IDAFileBasedDatabase) then begin
+ if not (fDriverType in [dauInterBase, dauSQLite, dauAccess]) then Exit;
+ end else if IsEqualGUID(IID, IDAUseGenerators) or IsEqualGUID(IID, IDAUseGenerators2) then begin
+ if not (fDriverType in [dauInterBase, dauOracle, dauPostgreSQL]) then Exit;
+ end else if IsEqualGUID(IID, IDACanQueryGeneratorsNames) then begin
+ if not (fDriverType in [dauInterBase]) then Exit;
+ end
+
+ // else if IsEqualGUID(IID, IDAConnectionModelling) then
+ // else if IsEqualGUID(IID, IDADirectoryBasedDatabase) then
+ ;
+ Result := inherited QueryInterface(IID, Obj);
+end;
+
+procedure TDAEUniDACConnection.Rollback;
+begin
+ Self.DoRollbackTransaction;
+end;
+
+procedure TDAEUniDACConnection.SetCharset(const Value: string);
+begin
+ fConnection.SpecificOptions.Values['Charset'] := Value;
+end;
+
+procedure TDAEUniDACConnection.SetRole(const Value: string);
+begin
+ fConnection.SpecificOptions.Values['Role'] := Value;
+end;
+
+procedure TDAEUniDACConnection.SetSQLDialect(Value: integer);
+begin
+ fConnection.SpecificOptions.Values['SQLDialect'] := IntToStr(Value);
+end;
+
+{ TDAEUniDACQuery }
+
+procedure TDAEUniDACQuery.ClearParams;
+begin
+ inherited;
+ TUniQuery(Dataset).Params.Clear;
+end;
+
+function TDAEUniDACQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TUniQuery.Create(nil);
+ TUniQuery(result).Unidirectional := True;
+ TUniQuery(result).ReadOnly := TRUE;
+ TUniQuery(result).Connection := TDAEUniDACConnection(aConnection).fConnection;
+end;
+
+function TDAEUniDACQuery.DoExecute: integer;
+begin
+ TUniQuery(Dataset).Execute;
+ result := TUniQuery(Dataset).RowsAffected;
+end;
+
+function TDAEUniDACQuery.DoGetSQL: string;
+begin
+ result := TUniQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAEUniDACQuery.DoPrepare(Value: boolean);
+var
+ i: integer;
+ par: TUniParam;
+begin
+ if Value and not TUniQuery(Dataset).Prepared and (TUniQuery(Dataset).ParamCount<>0) then begin
+ for I := 0 to GetParams.Count - 1 do begin
+ par:=TUniQuery(Dataset).ParamByName(GetParams[i].Name);
+ par.DataType:= DATypeToVCLType(GetParams[i].DataType);
+ if par.DataType = ftAutoInc then par.DataType:= ftInteger;
+ end;
+ end;
+ TUniQuery(Dataset).Prepared := Value;
+end;
+
+procedure TDAEUniDACQuery.DoSetSQL(const Value: string);
+begin
+ TUniQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAEUniDACQuery.GetParamValues(AParams: TDAParamCollection);
+var
+ I: Integer;
+ lParam: TUniParam;
+begin
+ for i := 0 to TUniQuery(DataSet).Params.Count - 1 do begin
+ lParam:=TUniQuery(DataSet).Params[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ Aparams.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+end;
+
+procedure TDAEUniDACQuery.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteCrLabsParamValues(AParams, TUniQuery(Dataset).Params, true);
+end;
+
+{ TDAEUniDACStoredProcedure }
+
+function TDAEUniDACStoredProcedure.CreateDataset(
+ aConnection: TDAEConnection): TDataset;
+begin
+ result := TUniStoredProc.Create(nil);
+ TUniStoredProc(result).Connection := TDAEUniDACConnection(aConnection).fConnection;
+end;
+
+function TDAEUniDACStoredProcedure.DoExecute: integer;
+begin
+ with TUniStoredProc(Dataset) do begin
+ ExecProc;
+ result := RowsAffected;
+ end;
+end;
+
+function TDAEUniDACStoredProcedure.Execute: integer;
+var
+ i: integer;
+ _params: TDAParamCollection;
+ lParam: uDAInterfaces.TDAParam;
+begin
+ _params := GetParams;
+
+ with TUniStoredProc(Dataset) do begin
+ for i := 0 to (Params.Count - 1) do
+ if (Params[i].ParamType in [ptInput, ptInputOutput]) then begin
+ lParam := _params.ParamByName(Params[i].Name);
+ if (Params[i].DataType in [ftMemo, ftBlob, ftGraphic]) and VarIsArray(lParam.Value)then
+ Params[i].Value := VariantToAnsiString(lParam.Value)
+ else
+ Params[i].Value := lParam.Value;
+ end;
+
+ result := DoExecute;
+
+ for i := 0 to (_params.Count-1) do
+ if (_params[i].ParamType in [daptOutput, daptInputOutput, daptResult])
+ then _params[i].Value := params.ParamByName(_params[i].Name).Value;
+ end;
+end;
+
+procedure TDAEUniDACStoredProcedure.GetParamValues(AParams: TDAParamCollection);
+var
+ i: Integer;
+ lParam: TUniParam;
+begin
+ for i := 0 to TUniStoredProc(DataSet).Params.Count - 1 do begin
+ lParam:=TUniStoredProc(DataSet).Params[i];
+ if (lParam.ParamType in [ptOutput, ptInputOutput, ptResult]) then
+ Aparams.ParamByName(lParam.Name).Value := lParam.Value;
+ end;
+end;
+
+function TDAEUniDACStoredProcedure.GetStoredProcedureName: string;
+begin
+ result := TUniStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAEUniDACStoredProcedure.RefreshParams;
+begin
+ TUniStoredProc(Dataset).PrepareSQL;
+ RefreshParamsStd(TUniStoredProc(Dataset).Params);
+end;
+
+procedure TDAEUniDACStoredProcedure.SetParamValues(AParams: TDAParamCollection);
+begin
+ WriteCrLabsParamValues(AParams, TUniStoredProc(Dataset).Params);
+end;
+
+procedure TDAEUniDACStoredProcedure.SetStoredProcedureName(const Name: string);
+begin
+ TUniStoredProc(Dataset).StoredProcName := Name;
+end;
+
+{$IFNDEF DARWIN}
+exports GetDriverObject name func_GetDriverObject;
+{$ENDIF}
+
+initialization
+{$IFDEF FPC}
+ {$I DataAbstract_UniDACDriver_Glyphs.lrs}
+{$ENDIF}
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAZeosDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAZeosDriver.pas
new file mode 100644
index 0000000..90798e5
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Drivers/uDAZeosDriver.pas
@@ -0,0 +1,1267 @@
+unit uDAZeosDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library }
+{ }
+{ compiler: Delphi 6 and up , FPC }
+{ platform: Win32 }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+interface
+
+uses
+ Classes, DB,
+ ZConnection, ZSqlMetadata,ZDbcIntfs, ZClasses,
+ uDAInterfaces,
+ uDAADOInterfaces,
+ uDAIBInterfaces,
+ uDASQLiteInterfaces,
+ uDAOracleInterfaces,
+ uDAMySQLInterfaces,
+ uDADB2Interfaces,
+ uDASybaseInterfaces,
+ uDAPostgresInterfaces,
+ uROClasses, uDAEngine, uDAUtils;
+
+// declare for Zeos7 under FPC
+{.$DEFINE ZEOS7}
+
+
+{$IFNDEF FPC}
+// it produces "Fatal: Internal error 200501152" under FPC
+{$IF ZEOS_VERSION > '7'}{$DEFINE ZEOS7}{$IFEND}
+{$ENDIF}
+
+{$IFNDEF ZEOS7}
+type
+ IZDatabaseInfo = IZDatabaseMetadata;
+{$ENDIF}
+
+type
+ TDAZEOSDriverType = (
+ dazUnknown,
+ dazADO,
+ dazASA,
+ dazIBMDB2,
+ dazInterBase,
+ dazMSSQL,
+ dazMySQL,
+ dazOracle,
+ dazPostgreSQL,
+ dazSQLite,
+ dazSybase);
+
+const
+ ZEOS_ADO = 'ado';
+ ZEOS_ASA = 'asa';
+ ZEOS_IBMDB2 = 'db2';
+ ZEOS_Interbase = 'interbase';
+ ZEOS_Firebird = 'firebird';
+ ZEOS_MSSQL = 'mssql';
+ ZEOS_MySQL = 'mysql';
+ ZEOS_ORACLE = 'oracle';
+ ZEOS_PostgreSQL = 'postgresql';
+ ZEOS_SQLite = 'sqlite';
+ ZEOS_SYBASE = 'sybase';
+
+type
+ { TDAZeosDriver }
+ TDAZeosDriver = class(TDADriverReference)
+ end;
+
+ { TDAESampleDriver }
+ TDAESampleDriver = class(TDAEDriver, IDADriver40)
+ // TDAESampleDriver = class(TDAIBDriver, IDADriver40)
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+ //procedure CustomizeConnectionObject(aConnection: TDAEConnection); override;
+ //procedure DoSetTraceOptions(TraceActive: boolean; TraceFlags: TDATraceOptions; Callback: TDALogTraceEvent); override;
+
+ { IDADriver }
+ function GetDriverID: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDescription: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function GetMajVersion: byte; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function GetMinVersion: byte; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetAuxDrivers(out List: IROStrings); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAvailableDriverOptionsEx(AuxDriver: string): TDAAvailableDriverOptions; override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // procedure Initialize; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // procedure Finalize; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function GetDefaultCustomParameters: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDADriver40 }
+ function GetProviderDefaultCustomParameters(Provider: string): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ TZEOSConnection = class(TDAConnectionWrapper)
+ private
+ fConnection: TZConnection;
+ fMetaData: TZSQLMetaData;
+ protected
+ function GetConnected: Boolean; override;
+ procedure SetConnected(Value: boolean); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Connection: TZConnection read fConnection write fConnection;
+ end;
+
+ { TDAESampleConnection }
+ TDAESampleConnection = class(TDAEConnection, IDAConnection,
+ IDAADOConnection,
+ IDAInterbaseConnection, //IDAIBTransactionAccess, IDAIBConnectionProperties,
+ IDAOracleConnection,
+ IDAMySQLConnection,
+ IDASQLiteConnection,
+ IDADB2Connection,
+ IDASybaseConnection,
+ IDAPostgresConnection,
+ // IDAConnectionModelling,
+ IDACanQueryDatabaseNames,
+ IDAFileBasedDatabase,
+ // IDADirectoryBasedDatabase,
+ IDAUseGenerators,
+ IDAUseGenerators2,
+ IDACanQueryGeneratorsNames,
+ IDATestableObject)
+ private
+ fNativeConnection: TZEOSConnection;
+ fDriverType: TDAZEOSDriverType;
+ fDriverName: string;
+ fADOProviderName: string;
+ fADOProviderType: TDAOleDBProviderType;
+ fMSSQLSchemaEnabled: Boolean;
+ FMySQLVersion: integer;
+ function GetMySQLVersion: integer;
+ procedure DoGetNames(AList: IROStrings; AObjectType: TDAObjecttype);
+ function ZEOS_GetMetaData: IZDatabaseMetadata;
+ function ZEOS_GetDataBaseInfo: IZDatabaseInfo;
+ procedure FixWideStringBug(AFields: TDAFieldCollection);
+ protected
+ function QueryInterface(const IID: TGUID; out Obj): HResult; override; stdcall;
+
+ function CreateCustomConnection: TCustomConnection; override;
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+ function GetDatasetClass: TDAEDatasetClass; override;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; override;
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+
+ // transaction support
+ function DoBeginTransaction: integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: boolean; override;
+
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ procedure DoGetQueryFields(const aSQL: string; aParamsIfNeeded: TDAParamCollection; out Fields: TDAFieldCollection); override;
+ //procedure DoGetViewFields(const aViewName: string; out Fields: TDAFieldCollection); override;
+
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+
+ { IDATestableObject }
+ // procedure Test; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDAConnection }
+
+ function GetSPSelectSyntax(HasArguments: Boolean): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetQuoteChars: TDAQuoteCharArray; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function IdentifierIsQuoted(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function QuoteIdentifierIfNeeded(const iIdentifier: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function QuoteIdentifier(const iIdentifier: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function QuoteFieldNameIfNeeded(const aTableName, aFieldName: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function QuoteFieldName(const aTableName, aFieldName: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // function NewCommand(const Text: string; CommandType: TDASQLStatementType; const aCommandName: string = ''): IDASQLCommand; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function NewDataset(const SQL: string; const aDatasetName: string = ''): IDADataset; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // function isAlive: Boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function GetQueryBuilder: TDAQueryBuilder; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDAADOConnection }
+ function GetProviderName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetProviderType: TDAOleDBProviderType; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetCommandTimeout: Integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetCommandTimeout(const Value: Integer); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDAInterbaseConnection }
+ // nothing
+
+ { IDAIBTransactionAccess }
+ //function GetTransaction: TObject; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ //procedure CommitRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ //procedure RollbackRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDAIBConnectionProperties }
+ function GetRole: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRole(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetSQLDialect: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetSQLDialect(Value: integer); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetCharset: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetCharset(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Commit; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // procedure CommitRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Rollback; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // procedure RollbackRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDAOracleConnection }
+ // nothing
+
+ { IDAConnectionModelling }
+ // function FieldToDeclaration(aField: TDAField): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function BuildCreateTableSQL(aDataSet: TDADataSet; const aOverrideName: string = ''): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // procedure CreateTable(aDataSet: TDADataSet; const aOverrideName: string = ''); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDACanQueryDatabaseNames }
+ function GetDatabaseNames: IROStrings;
+
+ { IDAFileBasedDatabase }
+ function GetFileExtensions: IROStrings;
+
+ { IDADirectoryBasedDatabase }
+ // nothing
+
+ { IDAUseGenerators }
+ function GetNextAutoinc(const GeneratorName: string): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ { IDAUseGenerators2 }
+ function GetNextAutoinc2(const GeneratorName: string): variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDACanQueryGeneratorsNames }
+ function GetGeneratorNames: IROStrings;
+
+ public
+ constructor Create(aDriver: TDAEDriver; aName: string = ''); override;
+ end;
+
+ { TDAESampleQuery }
+ TDAESampleQuery = class(TDAEDataset , IDAMustSetParams)
+ protected
+ // procedure PrepareSQLStatement; override;
+ procedure ClearParams; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ procedure DoPrepare(Value: boolean); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoExecute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoSetSQL(const Value: string); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoGetSQL: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function intVCLTypeToDAType(aFieldType: TFieldType): TDADataType;override;
+
+ { IDASQLCommand }
+ // procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function Execute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function DoGetRecordCount: integer; override;
+ // function DoGetActive: boolean; override;
+ // procedure DoSetActive(Value: boolean); override;
+ // function DoGetBOF: boolean; override;
+ // function DoGetEOF: boolean; override;
+ // procedure DoNext; override;
+ // function DoLocate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ { TDAESampleStoredProcedure }
+ TDAESampleStoredProcedure = class(TDAEStoredProcedure, IDAMustSetParams)
+ protected
+ // Internal
+ // function DoGetStoredProcedureName: string; override;
+ // procedure DoSetStoredProcedureName(const Name: string); override;
+ procedure DoPrepare(Value: boolean); override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDAStoredProcedure
+ function GetStoredProcedureName: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetStoredProcedureName(const Name: string); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // procedure PrepareSQLStatement; override;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; override;
+ function DoExecute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoSetSQL(const Value: string); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoGetSQL: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function intVCLTypeToDAType(aFieldType: TFieldType): TDADataType;override;
+
+ { IDASQLCommand }
+ // procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function Execute: integer; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // function DoGetRecordCount: integer; override;
+ // function DoGetActive: boolean; override;
+ // procedure DoSetActive(Value: boolean); override;
+ // function DoGetBOF: boolean; override;
+ // function DoGetEOF: boolean; override;
+ // procedure DoNext; override;
+ // function DoLocate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; override;
+
+ // IDAMustSetParams
+ procedure SetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(AParams: TDAParamCollection); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+procedure Register;
+
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+uses
+ {$IFDEF FPC}LResources,{$ENDIF}
+ {$IFDEF MSWINDOWS}Windows, {$ENDIF}
+ Variants, Types, SysUtils,
+ uDADriverManager, uDARes, uDASQL92Interfaces,
+ ZDataset, ZStoredProcedure;
+
+{$IFNDEF FPC}
+ {$R DataAbstract_ZeosDriver_Glyphs.res}
+{$ENDIF}
+
+var
+ _driver : TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAZeosDriver]);
+end;
+
+function GetDriverObject: IDADriver;
+begin
+ if (_driver = nil) then _driver := TDAESampleDriver.Create(nil);
+ result := _driver;
+end;
+
+function ZEOSDriverIdToZEOSDriverType(aAuxDriver: string): TDAZEOSDriverType;
+begin
+ aAuxDriver := LowerCase(aAuxDriver);
+ if aAuxDriver = '' then Result := dazUnknown
+ else if Pos(ZEOS_ADO, aAuxDriver) = 1 then Result := dazADO
+ else if Pos(ZEOS_ASA, aAuxDriver) = 1 then Result := dazASA
+ else if Pos(ZEOS_IBMDB2, aAuxDriver) = 1 then Result := dazIBMDB2
+ else if Pos(ZEOS_Interbase, aAuxDriver) = 1 then Result := dazInterBase
+ else if Pos(ZEOS_Firebird, aAuxDriver) = 1 then Result := dazInterBase
+ else if Pos(ZEOS_MSSQL, aAuxDriver) = 1 then Result := dazMSSQL
+ else if Pos(ZEOS_MySQL, aAuxDriver) = 1 then Result := dazMySQL
+ else if Pos(ZEOS_ORACLE, aAuxDriver) = 1 then Result := dazOracle
+ else if Pos(ZEOS_PostgreSQL, aAuxDriver) = 1 then Result := dazPostgreSQL
+ else if Pos(ZEOS_SQLite, aAuxDriver) = 1 then Result := dazSQLite
+ else if Pos(ZEOS_SYBASE, aAuxDriver) = 1 then Result := dazSybase
+ else Result := dazUnknown;
+end;
+
+{ TDAESampleConnection }
+
+procedure TDAESampleConnection.DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+var
+ i : Integer;
+ sName, sValue : string;
+begin
+ FMySQLVersion := -1;
+ inherited;
+ with aConnStrParser do begin
+ fDriverName := AuxDriver;
+ fDriverType := ZEOSDriverIdToZEOSDriverType(AuxDriver);
+ fADOProviderName := AuxParams['Provider'];
+ FADOProviderType := OleDBDriverIdToOleDBProviderType(FADOProviderName);
+
+ fNativeConnection.fConnection.Protocol := AuxDriver;
+ if (Self.UserID <> '') then
+ fNativeConnection.fConnection.User := Self.UserID
+ else
+ fNativeConnection.fConnection.User := UserID;
+
+ if (Self.Password <> '') then
+ fNativeConnection.fConnection.Password := Self.Password
+ else
+ fNativeConnection.fConnection.Password := Password;
+ if Server <> '' then fNativeConnection.fConnection.HostName := Server;
+ if Database <> '' then begin
+ fNativeConnection.fConnection.Database := Database;
+ if fDriverType <> dazSQLite then
+ fNativeConnection.fConnection.Catalog := Database;
+ end;
+
+ for i := 0 to AuxParamsCount - 1 do begin
+ sName := AuxParamNames[i];
+ if sName = '' then Continue;
+ sValue := AuxParams[AuxParamNames[i]];
+ if AnsiSameText(sName, 'role') then begin
+ if fDriverType = dazInterBase then sName := 'rolename';
+ end else if AnsiSameText(sName, 'charset') then begin
+ if fDriverType = dazInterBase then sName := 'codepage';
+ end else if AnsiSameText(sName, 'port') then begin
+ if StrToIntDef(sValue, -1) <> -1 then fNativeConnection.fConnection.Port := StrToInt(sValue);
+ end else begin
+ if sName[1] = '@' then sName := Pchar(sName) + 1;
+ end;
+ fNativeConnection.fConnection.Properties.Values[sName] := sValue;
+ end;
+
+ if fDriverType = dazADO then begin
+ if fADOProviderName = '' then
+ raise EDADriverException.Create('No proviver specified for ADO auxdriver');
+
+ fNativeConnection.fConnection.Properties.Values['User ID'] := fNativeConnection.fConnection.User;
+ fNativeConnection.fConnection.Properties.Values['Password'] := fNativeConnection.fConnection.Password;
+ if FADOProviderType = oledb_Jet then begin
+ fNativeConnection.fConnection.Properties.Values['Data Source'] := Database;
+ end else begin
+ if Database <> '' then begin
+ if fADOProviderType = oledb_Postgresql then
+ fNativeConnection.fConnection.Properties.Values['Location'] := Database
+ else
+ fNativeConnection.fConnection.Properties.Values['Initial Catalog'] := Database;
+ end;
+ if Server <> '' then fNativeConnection.fConnection.Properties.Values['Data Source'] := Server;
+ if fADOProviderType <> oledb_Postgresql then fNativeConnection.fConnection.Properties.Values['OLE DB SERVICES'] := '-2';
+ end;
+ fNativeConnection.fConnection.Database := '';
+ for i := 0 to fNativeConnection.fConnection.Properties.Count - 1 do begin
+ sName:=fNativeConnection.fConnection.Properties.Names[i];
+ sValue:=fNativeConnection.fConnection.Properties.Values[sName];
+ fNativeConnection.fConnection.Database:=fNativeConnection.fConnection.Database + sName+'='+sValue+';'
+ end;
+ end;
+ end;
+end;
+
+function TDAESampleConnection.DoBeginTransaction: integer;
+begin
+ fNativeConnection.fConnection.StartTransaction;
+ Result := 0;
+end;
+
+procedure TDAESampleConnection.DoCommitTransaction;
+begin
+ fNativeConnection.fConnection.Commit;
+end;
+
+function TDAESampleConnection.CreateCustomConnection: TCustomConnection;
+begin
+ fNativeConnection := TZEOSConnection.Create(nil);
+ result := fNativeConnection;
+end;
+
+function TDAESampleConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := TDAESampleQuery;
+end;
+
+function TDAESampleConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := TDAESampleStoredProcedure;
+end;
+
+procedure TDAESampleConnection.DoRollbackTransaction;
+begin
+ fNativeConnection.fConnection.Rollback;
+end;
+
+function TDAESampleConnection.DoGetInTransaction: boolean;
+begin
+ Result := fNativeConnection.fConnection.InTransaction
+end;
+
+function TDAESampleConnection.QueryInterface(const IID: TGUID; out Obj): HResult;
+begin
+ Result := E_NOINTERFACE;
+ if IsEqualGUID(IID, IDAADOConnection) then begin
+ if fDriverType <> dazADO then Exit;
+ end else if IsEqualGUID(IID, IDAInterbaseConnection) then begin
+ if fDriverType <> dazInterbase then Exit;
+ end else if IsEqualGUID(IID, IDAIBTransactionAccess) then begin
+ if fDriverType <> dazInterbase then Exit;
+ end else if IsEqualGUID(IID, IDAIBConnectionProperties) then begin
+ if fDriverType <> dazInterbase then Exit;
+ end else if IsEqualGUID(IID, IDAOracleConnection) then begin
+ if fDriverType <> dazOracle then Exit;
+ end else if IsEqualGUID(IID, IDASQLiteConnection) then begin
+ if fDriverType <> dazSQLite then Exit;
+ end else if IsEqualGUID(IID, IDADB2Connection) then begin
+ if fDriverType <> dazIBMDB2 then Exit;
+ end else if IsEqualGUID(IID, IDASybaseConnection) then begin
+ if not (fDriverType in [dazSybase, dazASA]) then Exit;
+ end else if IsEqualGUID(IID, IDAPostgresConnection) then begin
+ if fDriverType <> dazPostgreSQL then Exit;
+ end else if IsEqualGUID(IID, IDAMySQLConnection) then begin
+ if fDriverType <> dazMySQL then Exit;
+ end else if IsEqualGUID(IID, IDACanQueryDatabaseNames) then begin
+ if (fDriverType in [dazInterBase, dazSQLite]) then Exit;
+ end else if IsEqualGUID(IID, IDAFileBasedDatabase) then begin
+ if not (fDriverType in [dazInterBase, dazSQLite]) then Exit;
+ end else if IsEqualGUID(IID, IDAUseGenerators) or IsEqualGUID(IID, IDAUseGenerators2) then begin
+ if not (fDriverType in [dazInterBase, dazOracle, dazPostgreSQL]) then Exit;
+ end else if IsEqualGUID(IID, IDACanQueryGeneratorsNames) then begin
+ if not (fDriverType in [dazInterBase]) then Exit;
+ end
+
+ // else if IsEqualGUID(IID, IDAConnectionModelling) then
+ // else if IsEqualGUID(IID, IDADirectoryBasedDatabase) then
+ ;
+ Result := inherited QueryInterface(IID, Obj);
+end;
+
+constructor TDAESampleConnection.Create(aDriver: TDAEDriver; aName: string);
+begin
+ inherited Create(aDriver, aName);
+ fMSSQLSchemaEnabled := True;
+end;
+
+function TDAESampleConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ case fDriverType of
+ dazInterBase: Result := IB_CreateMacroProcessor;
+ dazMSSQL: Result := MSSQL_CreateMacroProcessor;
+ dazOracle: Result := Oracle_CreateMacroProcessor;
+ else
+ Result := inherited CreateMacroProcessor;
+ end;
+end;
+
+function TDAESampleConnection.GetFileExtensions: IROStrings;
+begin
+ case fDriverType of
+ dazInterBase: Result := IB_GetFileExtensions;
+ dazSQLite: Result := SQLite_GetFileExtensions;
+ else
+ Result := NewROStrings;
+ end;
+end;
+
+function TDAESampleConnection.GetGeneratorNames: IROStrings;
+begin
+ case fDriverType of
+ dazInterBase: Result:= IB_GetGeneratorNames(GetDatasetClass.Create(Self));
+ else
+ Result := NewROStrings;
+ end;
+end;
+
+procedure TDAESampleConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited;
+ case fDriverType of
+ dazMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable, fMSSQLSchemaEnabled);
+ dazInterBase: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotTable);
+ dazMYSQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable, fNativeConnection.fConnection.Catalog,GetMySQLVersion);
+ dazSQLite: SQLite_GetObjectNames(GetDatasetClass.Create(Self), List, dotTable);
+ dazPostgreSQL: Postgres_DoGetNames(GetDatasetClass.Create(Self), List, dotTable);
+ dazOracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotTable);
+ else
+ if (fDriverType = dazADO) and (fADOProviderType in [oledb_MSSQL, oledb_MSSQL2005]) then
+ MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable, fMSSQLSchemaEnabled)
+ else begin
+ DoGetNames(List, dotTable);
+ end;
+ end
+end;
+
+procedure TDAESampleConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited;
+ case fDriverType of
+ dazMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView, fMSSQLSchemaEnabled);
+ dazInterBase: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotView);
+ dazMYSQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView, fNativeConnection.fConnection.Catalog,GetMySQLVersion);
+ dazSQLite: SQLite_GetObjectNames(GetDatasetClass.Create(Self), List, dotView);
+ dazPostgreSQL: Postgres_DoGetNames(GetDatasetClass.Create(Self), List, dotView);
+ dazOracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotView);
+ else
+ if (fDriverType = dazADO) and (fADOProviderType in [oledb_MSSQL, oledb_MSSQL2005]) then
+ MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView, fMSSQLSchemaEnabled)
+ else begin
+ DoGetNames(List, dotView);
+ end;
+ end
+end;
+
+procedure TDAESampleConnection.DoGetStoredProcedureNames(
+ out List: IROStrings);
+begin
+ inherited;
+ case fDriverType of
+ dazMSSQL: MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure, fMSSQLSchemaEnabled);
+ dazInterBase: IB_GetObjectNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ dazMYSQL: MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure, fNativeConnection.fConnection.Catalog,GetMySQLVersion);
+ dazSQLite: SQLite_GetObjectNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ dazPostgreSQL: Postgres_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ dazOracle: Oracle_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure);
+ else
+ if (fDriverType = dazADO) and (fADOProviderType in [oledb_MSSQL, oledb_MSSQL2005]) then
+ MSSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure, fMSSQLSchemaEnabled)
+ else begin
+ DoGetNames(List, dotProcedure);
+ end;
+ end
+end;
+
+procedure TDAESampleConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+var
+ lschema, ltbl : string;
+ fld : TDAField;
+begin
+ case fDriverType of
+ dazMSSQL: MSSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ dazInterBase: IB_GetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ dazMySQL: MYSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName),GetDatasetClass.Create(Self),Fields, fNativeConnection.fConnection.Catalog,GetMySQLVersion);
+ dazOracle: Oracle_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ dazPostgreSQL: Postgres_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields);
+ else
+ if (fDriverType = dazADO) and (fADOProviderType in [oledb_MSSQL, oledb_MSSQL2005]) then
+ MSSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields)
+ else begin
+ inherited;
+ if Pos('.', aTableName) > 0 then begin
+ lschema := Trim(Copy(aTableName, 1, Pos('.', aTableName) - 1));
+ ltbl := Trim(Copy(aTableName, Pos('.', aTableName) + 1, Length(aTableName)));
+ end else begin
+ lschema := '';
+ ltbl := aTableName;
+ end;
+ // required+default value
+ with ZEOS_GetMetadata.GetColumns(fNativeConnection.fConnection.Catalog, lschema, ltbl, '') do
+ while Next do begin
+ fld := Fields.FindField(GetStringByName('COLUMN_NAME'));
+ if fld = nil then Continue;
+ fld.Required := GetStringByName('IS_NULLABLE') = 'NO';
+
+ fld.DefaultValue := GetStringByName('COLUMN_DEF');
+ if not TestDefaultValue(fld.DefaultValue, fld.DataType) then
+ fld.DefaultValue := '';
+ end;
+ // pk
+ with ZEOS_GetMetadata.GetPrimaryKeys(fNativeConnection.fConnection.Catalog, lschema, ltbl) do
+ while Next do begin
+ fld := Fields.FindField(GetStringByName('COLUMN_NAME'));
+ if fld = nil then Continue;
+ fld.Required := True;
+ fld.InPrimaryKey := True;
+ end;
+ end;
+ end;
+ FixWideStringBug(Fields);
+end;
+
+procedure TDAESampleConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+var
+ lSupportedSchema : boolean;
+begin
+ inherited;
+ case fDriverType of
+ dazMSSQL: MSSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, fMSSQLSchemaEnabled);
+ dazInterBase: IB_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ dazMySQL: MYSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, fNativeConnection.fConnection.Catalog,GetMySQLVersion);
+ dazPostgreSQL: Postgres_DoGetForeignKeys(GetDatasetClass.Create(Self),ForeignKeys);
+ dazOracle: Oracle_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys);
+ dazSQLite: SQLite_DoGetForeignKeys(GetDatasetClass.Create(Self),ForeignKeys);
+ else
+ if (fDriverType = dazADO) and (fADOProviderType in [oledb_MSSQL, oledb_MSSQL2005]) then
+ MSSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, fMSSQLSchemaEnabled)
+ else begin
+ lSupportedSchema := ZEOS_GetDataBaseInfo.SupportsSchemasInDataManipulation;
+ with ZEOS_GetMetadata.GetCrossReference(fNativeConnection.fConnection.Catalog, '', '', fNativeConnection.fConnection.Catalog, '', '') do
+ while Next do
+ with ForeignKeys.Add do begin
+ if lSupportedSchema then begin
+ PKTable := GetStringByName('PKTABLE_SCHEM') + '.' + GetStringByName('PKTABLE_NAME');
+ FKTable := GetStringByName('FKTABLE_SCHEM') + '.' + GetStringByName('FKTABLE_NAME');
+ end
+ else begin
+ PKTable := GetStringByName('PKTABLE_NAME');
+ FKTable := GetStringByName('FKTABLE_NAME');
+ end;
+ PKField := GetStringByName('PKCOLUMN_NAME');
+ FKField := GetStringByName('FKCOLUMN_NAME');
+ end;
+ end;
+ end;
+end;
+
+function TDAESampleConnection.GetDatabaseNames: IROStrings;
+begin
+ case fDriverType of
+ dazMSSQL: Result := MSSQL_GetDatabaseNames(Self);
+ dazMySQL: Result := MYSQL_GetDatabaseNames(Self);
+ dazPostgreSQL: Result := Postgres_GetDatabaseNames(Self);
+ else
+ if (fDriverType = dazADO) and (fADOProviderType in [oledb_MSSQL, oledb_MSSQL2005]) then
+ Result := MSSQL_GetDatabaseNames(Self)
+ else begin
+ Result := NewROStrings;
+ with ZEOS_GetMetadata.GetCatalogs do
+ while Next do
+ Result.Add(GetStringByName('TABLE_CAT'));
+ end;
+ end;
+end;
+
+function TDAESampleConnection.GetQuoteChars: TDAQuoteCharArray;
+var
+ s : string;
+begin
+ Result := inherited GetQuoteChars;
+ case fDriverType of
+ dazMSSQL: Result := MSSQL_GetQuoteChars;
+ dazOracle: Result:= Oracle_GetQuoteChars;
+ else
+ if (fDriverType = dazADO) and (fADOProviderType in [oledb_MSSQL, oledb_MSSQL2005]) then
+ Result := MSSQL_GetQuoteChars
+ else begin
+ s := ZEOS_GetDataBaseInfo.GetIdentifierQuoteString;
+ if Length(s) = 1 then begin
+ Result[0] := s[1];
+ Result[1] := s[1];
+ end
+ else if Length(s) = 2 then begin
+ Result[0] := s[1];
+ Result[1] := s[2];
+ end
+ end;
+ end;
+end;
+
+function TDAESampleConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+
+ function _getList: string;
+ begin
+ fNativeConnection.Connected:=True;
+ with ZEOS_GetDataBaseInfo do
+ Result :=
+ GetSQLKeywords + ',' +
+ GetNumericFunctions + ',' +
+ GetStringFunctions + ',' +
+ GetSystemFunctions + ',' +
+ GetTimeDateFunctions;
+ end;
+
+var
+ lList : TstringList;
+ i : integer;
+begin
+ Result:= inherited IdentifierNeedsQuoting(iIdentifier);
+ if not result then
+ case fDriverType of
+ dazMSSQL: Result := MSSQL_IdentifierNeedsQuoting(iIdentifier);
+ dazInterBase: Result := IB_IdentifierNeedsQuoting(iIdentifier, GetSQLDialect);
+ dazMySQL: Result := MYSQL_IdentifierNeedsQuoting(iIdentifier);
+ dazORACLE: Result := Oracle_IdentifierNeedsQuoting(iIdentifier);
+ dazPostgreSQL: Result:= Postgres_IdentifierNeedsQuoting(iIdentifier);
+ dazIBMDB2: Result := DB2_IdentifierNeedsQuoting(iIdentifier);
+ dazASA,dazSybase: Result := Sybase_IdentifierNeedsQuoting(iIdentifier);
+ else
+ if (fDriverType = dazADO) and (fADOProviderType in [oledb_MSSQL, oledb_MSSQL2005]) then
+ Result := MSSQL_IdentifierNeedsQuoting(iIdentifier)
+ else begin
+ lList := TStringList.Create;
+ try
+ lList.CommaText := _getList;
+ for i := 0 to lList.Count - 1 do
+ if CompareText(llist[i], iIdentifier) = 0 then begin
+ Result := True;
+ Exit;
+ end;
+ finally
+ lList.Free;
+ end
+ end;
+ end;
+end;
+
+function TDAESampleConnection.GetRole: string;
+begin
+ Result := fNativeConnection.fConnection.Properties.Values['rolename'];
+end;
+
+function TDAESampleConnection.GetSQLDialect: integer;
+begin
+ Result := StrToIntDef(fNativeConnection.fConnection.Properties.Values['dialect'], -1);
+ if Result = -1 then begin
+ if fDriverName = 'interbase-5' then
+ Result := 1
+ else
+ Result := 3;
+ end;
+end;
+
+procedure TDAESampleConnection.SetRole(const Value: string);
+begin
+ fNativeConnection.fConnection.Properties.Values['rolename'] := Value;
+end;
+
+procedure TDAESampleConnection.SetSQLDialect(Value: integer);
+begin
+ fNativeConnection.fConnection.Properties.Values['dialect'] := IntToStr(Value);
+end;
+
+function TDAESampleConnection.GetCharset: string;
+begin
+ Result := fNativeConnection.fConnection.Properties.Values['codepage'];
+end;
+
+procedure TDAESampleConnection.SetCharset(const Value: string);
+begin
+ fNativeConnection.fConnection.Properties.Values['codepage'] := Value;
+end;
+
+procedure TDAESampleConnection.Commit;
+begin
+ Self.DoCommitTransaction;
+end;
+
+procedure TDAESampleConnection.Rollback;
+begin
+ Self.DoRollbackTransaction;
+end;
+
+function TDAESampleConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+begin
+ Result := -1;
+ case fDriverType of
+ dazMSSQL: Result := MSSQL_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ dazInterBase: Result := IB_GetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ dazMySQL: Result := MySQL_GetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ dazOracle: Result := Oracle_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ dazPostgreSQL: Result := Postgres_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ else
+ if (fDriverType = dazADO) and (fADOProviderType in [oledb_MSSQL, oledb_MSSQL2005]) then
+ Result := MSSQL_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self))
+ else ;
+ end;
+end;
+
+function TDAESampleConnection.GetNextAutoinc(
+ const GeneratorName: string): integer;
+begin
+ Result := GetNextAutoinc2(GeneratorName);
+end;
+
+procedure TDAESampleConnection.DoGetNames(AList: IROStrings;
+ AObjectType: TDAObjecttype);
+var
+ lTableTypes : TStringDynArray;
+ lsupportSchema : Boolean;
+ lprocname : string;
+ i : integer;
+begin
+ fNativeConnection.fConnection.Connect;
+ lsupportSchema := ZEOS_GetDataBaseInfo.SupportsSchemasInDataManipulation;
+ if AObjectType = dotProcedure then begin
+ with ZEOS_GetMetadata.GetProcedures(fNativeConnection.fConnection.Catalog, '', '') do
+ while Next do begin
+ lprocname := GetStringByName('PROCEDURE_NAME');
+ i := pos(';', lprocname);
+ if i > 0 then lprocname := Copy(lprocname, 1, i - 1);
+ if lsupportSchema then
+ aList.Add(GetStringByName('PROCEDURE_SCHEM') + '.' + lprocname)
+ else
+ aList.Add(lprocname)
+ end;
+ end
+ else begin
+ SetLength(lTableTypes, 1);
+ if AObjectType = dotTable then
+ lTableTypes[0] := 'TABLE'
+ else
+ lTableTypes[0] := 'VIEW';
+ with ZEOS_GetMetadata.GetTables(fNativeConnection.fConnection.Catalog, '', '', lTableTypes) do
+ while Next do
+ if lsupportSchema then
+ aList.Add(GetStringByName('TABLE_SCHEM') + '.' + GetStringByName('TABLE_NAME'))
+ else
+ aList.Add(GetStringByName('TABLE_NAME'))
+ end;
+end;
+
+function TDAESampleConnection.GetSPSelectSyntax(
+ HasArguments: Boolean): string;
+begin
+ case fDriverType of
+ dazMSSQL: Result := MSSQL_GetSPSelectSyntax(HasArguments);
+ dazInterBase: Result := IB_GetSPSelectSyntax(HasArguments);
+ dazOracle: Result := Oracle_GetSPSelectSyntax(HasArguments);
+ dazPostgreSQL: Result := Postgres_GetSPSelectSyntax(HasArguments);
+ else
+ if (fDriverType = dazADO) and (fADOProviderType in [oledb_MSSQL, oledb_MSSQL2005]) then
+ Result := MSSQL_GetSPSelectSyntax(HasArguments)
+ else begin
+ Result := inherited GetSPSelectSyntax(HasArguments);
+ end;
+ end;
+end;
+
+function TDAESampleConnection.GetCommandTimeout: Integer;
+begin
+ Result := StrToIntDef(fNativeConnection.fConnection.Properties.Values['timeout'], 0);
+end;
+
+function TDAESampleConnection.GetProviderName: string;
+begin
+ Result := fADOProviderName;
+end;
+
+function TDAESampleConnection.GetProviderType: TDAOleDBProviderType;
+begin
+ Result := fADOProviderType;
+end;
+
+procedure TDAESampleConnection.SetCommandTimeout(const Value: Integer);
+begin
+ fNativeConnection.fConnection.Properties.Values['timeout'] := InttoStr(Value);
+end;
+
+procedure TDAESampleConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ case fDriverType of
+ dazMySQL: MYSQL_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params, fNativeConnection.fConnection.Catalog);
+ dazOracle: Oracle_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+ dazPostgreSQL: Postgres_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+ dazMSSQL: MSSQL_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+ else
+ inherited;
+ end;
+end;
+
+
+function TDAESampleConnection.ZEOS_GetDataBaseInfo: IZDatabaseInfo;
+begin
+ {$IFDEF ZEOS7}
+ Result := ZEOS_GetMetaData.GetDatabaseInfo;
+ {$ELSE}
+ Result := ZEOS_GetMetaData;
+ {$ENDIF}
+end;
+
+function TDAESampleConnection.ZEOS_GetMetaData: IZDatabaseMetadata;
+begin
+ fNativeConnection.Connected:=True;
+ Result:= fNativeConnection.fConnection.DbcConnection.GetMetadata;
+end;
+
+procedure TDAESampleConnection.FixWideStringBug(AFields: TDAFieldCollection);
+{$IFDEF DA_WideMemoSupport}
+var
+ i: integer;
+{$ENDIF}
+begin
+ {$IFDEF DA_WideMemoSupport}
+ For i:=0 to AFields.Count -1 do
+ with AFields[i] do
+ if (DataType = datWideString) and (Size = MaxInt div 2) then begin
+ DataType:= datWideMemo;
+ Size := 0;
+ end;
+ {$ENDIF}
+end;
+
+procedure TDAESampleConnection.DoGetQueryFields(const aSQL: string;
+ aParamsIfNeeded: TDAParamCollection; out Fields: TDAFieldCollection);
+begin
+ inherited;
+ FixWideStringBug(Fields);
+end;
+
+function TDAESampleConnection.GetMySQLVersion: integer;
+begin
+ if FMySQLVersion = -1 then FMySQLVersion := MYSQL_GetVersion(GetDatasetClass.Create(Self));
+ Result := FMySQLVersion;
+end;
+
+function TDAESampleConnection.GetNextAutoinc2(
+ const GeneratorName: string): variant;
+begin
+ Result := -1;
+ case fDriverType of
+ dazInterBase: Result := IB_GetNextAutoinc(GeneratorName, GetDatasetClass.Create(Self));
+ dazOracle: Result := Oracle_GetNextAutoinc(GeneratorName, GetDatasetClass.Create(Self));
+ dazPostgreSQL: Result := Postgres_GetNextAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+ end;
+end;
+
+{ TDAESampleDriver }
+
+procedure TDAESampleDriver.GetAuxDrivers(out List: IROStrings);
+var
+ i, j : integer;
+ lDrivers : IZCollection;
+ Protocols : TStringDynArray;
+begin
+ inherited;
+ lDrivers := ZDbcIntfs.DriverManager.GetDrivers;
+ for i := 0 to lDrivers.Count - 1 do begin
+ Protocols := (lDrivers[I] as IZDriver).GetSupportedProtocols;
+ for J := Low(Protocols) to High(Protocols) do
+ List.Add(Protocols[J]);
+ end;
+ List.Sorted := True;
+end;
+
+procedure TDAESampleDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+var
+ i : TDAOleDBProviderType;
+ s : string;
+begin
+ inherited;
+ case ZEOSDriverIdToZEOSDriverType(AuxDriver) of
+ dazADO: begin
+ s := '';
+ for i := Low(TDAOleDBProviderType) to High(TDAOleDBProviderType) do
+ if (i <> oledb_Unknown) {// Redundant but safe if I change the enum later...} then begin
+ if s <> '' then s := s + ';';
+ s := s + OleDBProviders[i];
+ end;
+ List.Add('Provider=(' + s + ')');
+ end;
+ dazInterBase: AddIBAuxParams(List);
+ end;
+ if not (ZEOSDriverIdToZEOSDriverType(AuxDriver) in [dazAdo, dazSQLite]) then List.Add('Port=');
+ List.Add('timeout=');
+end;
+
+function TDAESampleDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ Result := [doAuxDriver, doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+function TDAESampleDriver.GetAvailableDriverOptionsEx(
+ AuxDriver: string): TDAAvailableDriverOptions;
+begin
+ case ZEOSDriverIdToZEOSDriverType(AuxDriver) of
+ dazSQLite : Result := [doAuxDriver, doDatabaseName, doCustom];
+ else
+ Result := [doAuxDriver, doServerName, doDatabaseName, doLogin, doCustom];
+ end;
+end;
+
+function TDAESampleDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAESampleConnection;
+end;
+
+function TDAESampleDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ case ZEOSDriverIdToZEOSDriverType(AuxDriver) of
+ dazADO: Result := '';
+ dazMySQL: Result := MySQL_DriverType;
+ dazIBMDB2: Result:= DB2_DriverType;
+ dazInterBase: Result := IB_DriverType;
+ dazMSSQL: Result := MSSQL_DriverType;
+ dazOracle: Result := Oracle_DriverType;
+ dazPostgreSQL: Result := PostgreSQL_DriverType;
+ dazSQLite : Result:= SQLite_DriverType;
+ dazASA: Result:=ASA_DriverType;
+ dazSybase: Result:=Sybase_DriverType;
+ else
+ Result:= inherited GetDefaultConnectionType(AuxDriver);
+ end;
+end;
+
+function TDAESampleDriver.GetDescription: string;
+begin
+ result := 'DataAbstact Zeos Driver';
+end;
+
+function TDAESampleDriver.GetDriverID: string;
+begin
+ result := 'ZEOS';
+end;
+
+function TDAESampleDriver.GetProviderDefaultCustomParameters(
+ Provider: string): string;
+begin
+ Result := '';
+ case ZEOSDriverIdToZEOSDriverType(Provider) of
+ dazADO: Result := 'Provider=;';
+ dazMySQL: Result := MYSQL_GetDefaultCustomParameters;
+ end;
+end;
+
+{ TDAESampleQuery }
+
+function TDAESampleQuery.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TZReadOnlyQuery.Create(nil);
+ TZReadOnlyQuery(result).Connection := TDAESampleConnection(aConnection).fNativeConnection.fConnection;
+end;
+
+function TDAESampleQuery.DoExecute: integer;
+begin
+ TZReadOnlyQuery(Dataset).ExecSQL;
+ Result:=TZReadOnlyQuery(Dataset).RowsAffected;
+end;
+
+function TDAESampleQuery.DoGetSQL: string;
+begin
+ result := TZReadOnlyQuery(Dataset).SQL.Text;
+end;
+
+procedure TDAESampleQuery.DoPrepare(Value: boolean);
+begin
+ // nothing
+end;
+
+procedure TDAESampleQuery.DoSetSQL(const Value: string);
+begin
+ TZReadOnlyQuery(Dataset).SQL.Text := Value;
+end;
+
+procedure TDAESampleQuery.SetParamValues(AParams: TDAParamCollection);
+var
+ i: integer;
+begin
+ SetParamValuesStd(AParams, TZReadOnlyQuery(Dataset).Params);
+ // zeos doesn't support ftfmtBCD, ftBCD
+ for i:=0 to TZReadOnlyQuery(Dataset).Params.Count-1 do
+ with TZReadOnlyQuery(Dataset).Params[i] do begin
+ if DataType = ftBCD then AsCurrency := Value
+ else if DataType = ftFMTBCD then AsFloat := Value;
+ end;
+end;
+
+procedure TDAESampleQuery.GetParamValues(AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TZReadOnlyQuery(Dataset).Params);
+end;
+
+procedure TDAESampleQuery.ClearParams;
+begin
+ inherited;
+ TZReadOnlyQuery(Dataset).Params.Clear;
+end;
+
+{ TDAESampleStoredProcedure }
+
+function TDAESampleStoredProcedure.CreateDataset(aConnection: TDAEConnection): TDataset;
+begin
+ result := TZStoredProc.Create(nil);
+ TZStoredProc(result).Connection := TDAESampleConnection(aConnection).fNativeConnection.fConnection;
+end;
+
+function TDAESampleStoredProcedure.DoExecute: integer;
+begin
+ TZStoredProc(Dataset).ExecProc;
+ Result:=TZStoredProc(Dataset).RowsAffected;
+end;
+
+function TDAESampleStoredProcedure.DoGetSQL: string;
+begin
+ Result := '';
+end;
+
+procedure TDAESampleStoredProcedure.DoPrepare(Value: boolean);
+begin
+end;
+
+procedure TDAESampleStoredProcedure.DoSetSQL(const Value: string);
+begin
+end;
+
+procedure TDAESampleStoredProcedure.GetParamValues(
+ AParams: TDAParamCollection);
+begin
+ GetParamValuesStd(AParams, TZStoredProc(Dataset).Params);
+end;
+
+function TDAESampleStoredProcedure.GetStoredProcedureName: string;
+begin
+ Result := TZStoredProc(Dataset).StoredProcName;
+end;
+
+procedure TDAESampleStoredProcedure.RefreshParams;
+begin
+ RefreshParamsStd(TZStoredProc(Dataset).Params);
+end;
+
+procedure TDAESampleStoredProcedure.SetParamValues(
+ AParams: TDAParamCollection);
+var
+ i: integer;
+begin
+ SetParamValuesStd(AParams, TZStoredProc(Dataset).Params);
+ // zeos doesn't support ftfmtBCD, ftBCD
+ for i:=0 to TZStoredProc(Dataset).Params.Count-1 do
+ with TZStoredProc(Dataset).Params[i] do begin
+ if DataType = ftBCD then AsCurrency := Value
+ else if DataType = ftFMTBCD then AsFloat := Value;
+ end
+end;
+
+procedure TDAESampleStoredProcedure.SetStoredProcedureName(
+ const Name: string);
+begin
+ TZStoredProc(Dataset).Connection.Connect;
+ TZStoredProc(Dataset).StoredProcName := Name;
+end;
+
+{ TZEOSConnection }
+
+constructor TZEOSConnection.Create(AOwner: TComponent);
+begin
+ inherited;
+ fConnection := TZConnection.Create(nil);
+ fConnection.LoginPrompt := False;
+ fMetaData := TZSQLMetaData.Create(nil);
+ fMetaData.Connection := fConnection;
+end;
+
+destructor TZEOSConnection.Destroy;
+begin
+ inherited;
+ FreeAndNil(fMetaData);
+ FreeAndNil(fConnection);
+end;
+
+function TZEOSConnection.GetConnected: Boolean;
+begin
+ if fConnection <> nil then
+ Result := fConnection.Connected
+ else
+ Result:=False;
+end;
+
+procedure TZEOSConnection.SetConnected(Value: boolean);
+begin
+ fConnection.Connected := Value;
+end;
+
+{$IFNDEF DARWIN}
+exports
+ GetDriverObject name func_GetDriverObject;
+{$ENDIF}
+
+initialization
+{$IFDEF FPC}
+ {$I DataAbstract_ZeosDriver_Glyphs.lrs}
+{$ENDIF}
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_AdditionalResources.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_AdditionalResources.lrs
new file mode 100644
index 0000000..d9a86b7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_AdditionalResources.lrs
@@ -0,0 +1,76 @@
+LazarusResources.Add('dalogo','BMP',[
+ 'BMX'#8#0#0#0#0#0#0'6'#4#0#0'('#0#0#0' '#0#0#0' '#0#0#0#1#0#8#0#1#0#0#0'"'#4#0
+ +#0#194#30#0#0#194#30#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128
+ +#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#192#220#192#0#240#202
+ +#166#0#0#148#0#0#0'1'#0#0#0'J'#0#0#0'R'#0#0#0'c'#0#0#0'k'#0#0#0's'#0#0#0'{'#0
+ +#0#0#132#0#0#0#140#0#0#0#148#0#0#0#156#0#0#8#8#8#0#8#16#8#0#8#24#8#0#8'!'#8#0
+ +#8')'#8#0#8'1'#8#0#8'J'#8#0#8'R'#8#0#8'c'#8#0#8'k'#8#0#8#132#8#0#8#165#8#0#16
+ +#16#16#0#16#24#16#0#16')'#16#0#16'1'#16#0#16'9'#16#0#16'B'#16#0#16'R'#16#0#16
+ +'c'#16#0#16'{'#16#0#16#132#16#0#8#165#16#0#24#24#24#0#24')'#24#0#24'1'#24#0
+ +#24'9'#24#0#16#173#24#0'!!!'#0'!B!'#0#24#148'!'#0#24#181'!'#0')))'#0'!s)'#0
+ +'!'#148')'#0#24#181')'#0'111'#0'191'#0'1R1'#0')'#140'1'#0')'#156'1'#0'!'#189
+ +'1'#0'199'#0'999'#0'1R9'#0')'#165'9'#0')'#198'9'#0'9BB'#0'BBB'#0'9RB'#0'BZB'
+ +#0'9'#132'B'#0'1'#165'B'#0')'#181'B'#0'JJJ'#0'JRJ'#0'BkJ'#0'BsJ'#0'B{J'#0'B'
+ +#132'J'#0'9'#148'J'#0'1'#173'J'#0'1'#206'J'#0'JRR'#0'RRR'#0'J'#132'R'#0'B'
+ +#140'R'#0'B'#148'R'#0'9'#173'R'#0'B'#181'R'#0'1'#198'R'#0'1'#206'R'#0'ZZZ'#0
+ +'B'#181'Z'#0'B'#189'Z'#0'9'#206'Z'#0'9'#214'Z'#0'Zcc'#0'ccc'#0'ckc'#0'Z'#132
+ +'c'#0'J'#189'c'#0'B'#214'c'#0'B'#222'c'#0'cck'#0'kkk'#0'R'#165'k'#0'R'#189'k'
+ +#0'B'#222'k'#0'sss'#0'c'#148's'#0'Z'#173's'#0'J'#231's'#0'ss{'#0's{{'#0'{{{'
+ +#0'c'#173'{'#0'R'#239'{'#0'{'#132#132#0#132#132#132#0'Z'#231#132#0'R'#247#132
+ +#0#140#140#140#0'Z'#239#140#0'Z'#247#140#0#140#140#148#0#140#148#148#0#148
+ +#148#156#0#148#156#156#0#156#156#165#0#165#173#173#0#173#181#181#0#181#181
+ +#189#0#181#189#189#0#181#189#198#0#189#198#198#0#189#198#206#0#198#198#206#0
+ +#198#206#206#0#206#214#214#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+ +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+ +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+ +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+ +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+ +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+ +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+ +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+ +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+ +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+ +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+ +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+ +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+ +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+ +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+ +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+ +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+ +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+ +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255
+ +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#240#251
+ +#255#0#164#160#160#0#128#128#128#0#0#0#255#0#0#255#0#0#0#255#255#0#255#0#0#0
+ +#255#0#255#0#255#255#0#0#255#255#255#0#10#140#0#13#137'cA--""6At'#134#140#0
+ +#9#140#0#0#8#140#0#3#135'j2'#0#2'2'#4'-'#3'"'#2#22#0#3'A'#131#140#1#7#140#0#0
+ +#7#140#1'o'#3'6'#3'2'#4'-'#3'"'#3#22#0#3'A'#134#140#6#5#140#0#0#5#140#0#4#135
+ +'U:6'#2'6'#0#12'0('#30#17#16#16#15#14#28#26'"'#22#2#22#0#3'"'#140#0#4#140#0
+ +#0#4#140#0#3#133'F:'#0#2':'#2'6'#0#8'3('#30#17#17#16#16#15#2#15#0#3#14#27#22
+ +#0#3#22#1'x'#4#140#0#0#3#140#0#5#138'FAA:'#0#2':'#4'6'#0#6'/'#16#17#16#16#15
+ +#2#15#0#4#14#13#24#22#2#22#1''#3#140#0#0#3#140#1'd'#4'A'#3':'#4'6'#1#30#2#17
+ +#2#16#0#6#28'$##'#24#22#2#22#0#4'"'#134#140#140#0#0#2#140#1#128#2'F'#4'A'#3
+ +':'#3'6'#1#31#3#17#1''''#3'-'#3'"'#3#22#1'A'#2#140#0#0#0#7#140#138'VFFBA'#22
+ +#3'A'#3':'#4'6'#0#4'/0.-'#3'-'#3'"'#3#22#1#131#1#140#0#0#0#8#140'|LLG8FA'#3
+ +'A'#3':'#4'6'#3'2'#4'-'#0#7'"'#26#27#22#22'A'#140'F'#0#0#0#9#140'^LL=8FFA'#15
+ +#3'A'#3':'#4'6'#3'2'#4'-'#0#6'$'#14'"'#22#22#134#0#0#0#7#134'VLM?>F'#16#2'F'
+ +#4'A'#3':'#4'6'#3'2'#3'-'#0#6'$'#15#27'"'#22't'#0#0#1#130#2'V'#0#5'ODCLF'#17
+ +#2'F'#4'A'#3':'#4'6'#3'2'#2'-'#0#6'$'#15#28'""A'#0#0#1'|'#2'V'#0#6'XTJLLF'#2
+ +'F'#4'A'#3':'#4'6'#3'2'#0#7'-%'#15#14'""-L'#0#0#0#7's^V_]SL2'#2'L'#3'F'#4'A'
+ +#3':'#4'6'#3'2'#0#6'/'#16#15'-""'#0#0#1't'#2'^'#0#4'_bZL'#3'L'#3'F'#4'A'#3':'
+ +#4'6'#2'2'#1'0'#2#16#2'-'#1'"'#0#0#1'u'#2'^'#0#5'gh_VL:'#3'L'#3'F'#4'A'#3':'
+ +#1'3'#2'6'#0#6'0'''#15#17#16'-'#2'-'#0#0#0#9'ud^mnhWVL6'#3'L'#3'F'#4'A'#2':'
+ +#2#19#2#18#1#2#3#17#3'-'#0#0#1#130#2'd'#0#11'lrnhaZRIHLF'#7#2'F'#4'A'#1':'#3
+ +#19#2#18#0#6#2#17#31'2-A'#0#0#1#132#2'd'#0#12'fwrnhb]TNLLF'#2'F'#4'A'#1#10#3
+ +#19#2#18#0#5#2'(22VF'#0#0#1#137#3'd'#0#9'zwrnhb]QL'#0#2'L'#3'F'#2'A'#1';'#2
+ +#10#3#19#2#18#1'0'#2'2'#1''#0#0#0#17#140#248'ddq}wrnhb\PMLLFm'#2'F'#0#3'<*'
+ ,#10'L'#2#10#3#19#1#31#2'6'#1'2'#1#137#0#0#0#23#140#132'kde}}wrnhb]TKC>81,!'
+ +#21#10'A'#2#10#2#19#1'3'#2'6'#1'j'#1#140#0#0#2#140#0#22'okdp~}wrnhb]TD??91,!'
+ +#21#10#2#10#0#6'):66'#135#140#0#0#2#140#1#134#2'k'#0#22'dv~}wrnhb]TD??91,!'
+ +#21#10' :'#2':'#1'o'#2#140#0#0#3#140#1#129#2'k'#0#26'dv~}wrnhb]TD??91,!+;A:U'
+ +#137#140#140#0#0#4#140#1'y'#2'k'#0#18'dp}}wrnhb]TD??917A'#2'A'#0#3'F'#135#140
+ +#22#2#140#0#0#4#140#0#25#139'|kkdeqzwrnhb]TD?=GFFAF'#133#140#6#3#140#0#0#6
+ +#140#1#129#2'k'#3'd'#0#16'flmg__YPMLLFFd'#138#140#4#140#0#0#7#140#0#4#134'ok'
+ +'d'#3'd'#3'^'#3'V'#3'L'#0#3'V'#128#140'v'#6#140#0#0#9#140#0#3#132#248'd?'#3
+ +'d'#3'^'#3'V'#0#4'^|'#138#140#7#140#0#0#11#140#0#11#137#132#130'uuts|'#130
+ +#134#140']'#10#140#0#1
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_AdditionalResources.rc b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_AdditionalResources.rc
new file mode 100644
index 0000000..d480282
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_AdditionalResources.rc
@@ -0,0 +1 @@
+DALOGO BITMAP DISCARDABLE "dalogo.bmp"
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_AdditionalResources.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_AdditionalResources.res
new file mode 100644
index 0000000..6735fcb
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_AdditionalResources.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.bdsproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.bdsproj
new file mode 100644
index 0000000..67fa8e2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.bdsproj
@@ -0,0 +1,179 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {06DC969E-3DBF-4AD9-80A8-ADB03BFF41D1}
+
+
+
+
+ DataAbstract_IDE_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Data Abstract - IDE Package
+ False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\;..\..\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 361
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.1.361
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+
+ $00000000
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.cfg
new file mode 100644
index 0000000..f6e54d1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.cfg
@@ -0,0 +1,52 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Dcu\D10"
+-LN"..\..\Dcu\D10"
+-U"..\;..\..\Dcu\D10"
+-O"..\;..\..\Dcu\D10"
+-I"..\;..\..\Dcu\D10"
+-R"..\;..\..\Dcu\D10"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-SYMBOL_EXPERIMENTAL
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNIT_EXPERIMENTAL
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.dpk
new file mode 100644
index 0000000..fdc6b17
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.dpk
@@ -0,0 +1,51 @@
+package DataAbstract_IDE_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - IDE Package'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ DesignIDE,
+ vcldb,
+ dbrtl,
+ RemObjects_Core_D10,
+ RemObjects_IDE_D10,
+ RemObjects_Everwood_D10,
+ DataAbstract_Core_D10;
+
+contains
+ DataAbstract_IDE_Reg in 'DataAbstract_IDE_Reg.pas',
+ uDADataAbstractEditors in 'uDADataAbstractEditors.pas',
+ uDADBSessionManagerEditor in 'uDADBSessionManagerEditor.pas',
+ uDASchemaUnitsGenerator in 'uDASchemaUnitsGenerator.pas',
+ uDAIDEMenu in 'uDAIDEMenu.pas',
+ uDAIDEData in 'uDAIDEData.pas' {DAIdeData: TDataModule},
+ uDAIDERes in 'uDAIDERes.pas',
+ uDASelectDataTablesForm in 'uDASelectDataTablesForm.pas' {DASelectDataTablesForm},
+ uDADataTableMasterLinkWizardForm in 'uDADataTableMasterLinkWizardForm.pas' {DADataTableMasterLinkWizard},
+ uDAGuideWizardForm in 'uDAGuideWizardForm.pas' {DAGuideWizardForm},
+ uDADataTableWizards in 'uDADataTableWizards.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.res
new file mode 100644
index 0000000..669dbd3
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D10.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D11.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D11.dpk
new file mode 100644
index 0000000..906a394
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D11.dpk
@@ -0,0 +1,52 @@
+package DataAbstract_IDE_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - IDE Package'}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ DesignIDE,
+ vcldb,
+ dbrtl,
+ RemObjects_Core_D11,
+ RemObjects_IDE_D11,
+ RemObjects_Everwood_D11,
+ DataAbstract_Core_D11;
+
+contains
+ DataAbstract_IDE_Reg in 'DataAbstract_IDE_Reg.pas',
+ uDADataAbstractEditors in 'uDADataAbstractEditors.pas',
+ uDADBSessionManagerEditor in 'uDADBSessionManagerEditor.pas',
+ uDASchemaUnitsGenerator in 'uDASchemaUnitsGenerator.pas',
+ uDAIDEMenu in 'uDAIDEMenu.pas',
+ uDAIDEData in 'uDAIDEData.pas' {DAIdeData: TDataModule},
+ uDAIDERes in 'uDAIDERes.pas',
+ uDASelectDataTablesForm in 'uDASelectDataTablesForm.pas' {DASelectDataTablesForm},
+ uDADataTableMasterLinkWizardForm in 'uDADataTableMasterLinkWizardForm.pas' {DADataTableMasterLinkWizard},
+ uDAGuideWizardForm in 'uDAGuideWizardForm.pas' {DAGuideWizardForm},
+ uDADataTableWizards in 'uDADataTableWizards.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D11.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D11.dproj
new file mode 100644
index 0000000..b270446
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D11.dproj
@@ -0,0 +1,580 @@
+
+
+ {83d4313b-eff3-4ea0-9289-ba6e608e821e}
+ DataAbstract_IDE_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IDE_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Data Abstract - IDE Package False False False True False 6 0 43 801 False False False False False 1033 1252 RemObjects Software 6.0.43.801 RemObjects SDK 1.0.0.0 DataAbstract_IDE_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TDataModule
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D11.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D11.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D12.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D12.dpk
new file mode 100644
index 0000000..5ffd96f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D12.dpk
@@ -0,0 +1,51 @@
+package DataAbstract_IDE_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - IDE Package'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ DesignIDE,
+ vcldb,
+ dbrtl,
+ RemObjects_Core_D12,
+ RemObjects_IDE_D12,
+ RemObjects_Everwood_D12,
+ DataAbstract_Core_D12;
+
+contains
+ DataAbstract_IDE_Reg in 'DataAbstract_IDE_Reg.pas',
+ uDADataAbstractEditors in 'uDADataAbstractEditors.pas',
+ uDADBSessionManagerEditor in 'uDADBSessionManagerEditor.pas',
+ uDASchemaUnitsGenerator in 'uDASchemaUnitsGenerator.pas',
+ uDAIDEMenu in 'uDAIDEMenu.pas',
+ uDAIDEData in 'uDAIDEData.pas' {DAIdeData: TDataModule},
+ uDAIDERes in 'uDAIDERes.pas',
+ uDASelectDataTablesForm in 'uDASelectDataTablesForm.pas' {DASelectDataTablesForm},
+ uDADataTableMasterLinkWizardForm in 'uDADataTableMasterLinkWizardForm.pas' {DADataTableMasterLinkWizard},
+ uDAGuideWizardForm in 'uDAGuideWizardForm.pas' {DAGuideWizardForm},
+ uDADataTableWizards in 'uDADataTableWizards.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D12.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D12.dproj
new file mode 100644
index 0000000..5269ffc
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D12.dproj
@@ -0,0 +1,119 @@
+
+
+ {83d4313b-eff3-4ea0-9289-ba6e608e821e}
+ DataAbstract_IDE_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IDE_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ true
+ 1
+ error
+ error
+ error
+ ..;..\..\Dcu\D12;..\..\..\RemObjects SDK for Delphi\Dcu\D12;$(DCC_UnitSearchPath)
+ error
+ error
+ ..\..\Dcu\D12\
+ error
+ error
+ ..\..\Dcu\D12\
+ error
+ ..\..\Dcu\D12\
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D12\DataAbstract_IDE_D12.bpl
+ RemObjects Data Abstract - IDE Package
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TDataModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 6
+ 442
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.6.442
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_IDE_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D12.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D12.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D12.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D14.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D14.dpk
new file mode 100644
index 0000000..2cfbc2f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D14.dpk
@@ -0,0 +1,51 @@
+package DataAbstract_IDE_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - IDE Package'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ DesignIDE,
+ vcldb,
+ dbrtl,
+ RemObjects_Core_D14,
+ RemObjects_IDE_D14,
+ RemObjects_Everwood_D14,
+ DataAbstract_Core_D14;
+
+contains
+ DataAbstract_IDE_Reg in 'DataAbstract_IDE_Reg.pas',
+ uDADataAbstractEditors in 'uDADataAbstractEditors.pas',
+ uDADBSessionManagerEditor in 'uDADBSessionManagerEditor.pas',
+ uDASchemaUnitsGenerator in 'uDASchemaUnitsGenerator.pas',
+ uDAIDEMenu in 'uDAIDEMenu.pas',
+ uDAIDEData in 'uDAIDEData.pas' {DAIdeData: TDataModule},
+ uDAIDERes in 'uDAIDERes.pas',
+ uDASelectDataTablesForm in 'uDASelectDataTablesForm.pas' {DASelectDataTablesForm},
+ uDADataTableMasterLinkWizardForm in 'uDADataTableMasterLinkWizardForm.pas' {DADataTableMasterLinkWizard},
+ uDAGuideWizardForm in 'uDAGuideWizardForm.pas' {DAGuideWizardForm},
+ uDADataTableWizards in 'uDADataTableWizards.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D14.dproj b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D14.dproj
new file mode 100644
index 0000000..3880565
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D14.dproj
@@ -0,0 +1,121 @@
+
+
+ {83d4313b-eff3-4ea0-9289-ba6e608e821e}
+ DataAbstract_IDE_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\DataAbstract_IDE_D11.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ true
+ 1
+ error
+ error
+ error
+ ..;..\..\Dcu\D14;..\..\..\RemObjects SDK for Delphi\Dcu\D14;$(DCC_UnitSearchPath)
+ error
+ error
+ ..\..\Dcu\D14\
+ error
+ error
+ ..\..\Dcu\D14\
+ error
+ ..\..\Dcu\D14\
+ true
+ true
+ true
+ true
+ false
+ 00400000
+ ..\..\Dcu\D14\DataAbstract_IDE_D14.bpl
+ RemObjects Data Abstract - IDE Package
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TDataModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+ -pDelphi
+ C:\Program Files\CodeGear\RAD Studio\6.0\bin\bds.exe
+
+
+ True
+ False
+ 3
+ 0
+ 6
+ 442
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.6.442
+
+
+
+
+ RemObjects SDK
+ 1.0.0.0
+
+
+ DataAbstract_IDE_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D14.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D14.res
new file mode 100644
index 0000000..0593ed9
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D14.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.cfg
new file mode 100644
index 0000000..19431c3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.cfg
@@ -0,0 +1,41 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Dcu\D6"
+-LN"..\..\Dcu\D6"
+-U"..\..\Dcu\D6"
+-O"..\..\Dcu\D6"
+-I"..\..\Dcu\D6"
+-R"..\..\Dcu\D6"
+-Z
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.dof
new file mode 100644
index 0000000..552aad2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=Data Abstract - IDE Package
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Dcu\D6
+PackageDCPOutputDir=..\..\Dcu\D6
+SearchPath=..\..\Dcu\D6
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=2.0.0.138
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.dpk
new file mode 100644
index 0000000..c2b6298
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.dpk
@@ -0,0 +1,51 @@
+package DataAbstract_IDE_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - IDE Package'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ DesignIDE,
+ vcldb,
+ dbrtl,
+ RemObjects_Core_D6,
+ RemObjects_IDE_D6,
+ RemObjects_Everwood_D6,
+ DataAbstract_Core_D6;
+
+contains
+ DataAbstract_IDE_Reg in 'DataAbstract_IDE_Reg.pas',
+ uDADataAbstractEditors in 'uDADataAbstractEditors.pas',
+ uDADBSessionManagerEditor in 'uDADBSessionManagerEditor.pas',
+ uDASchemaUnitsGenerator in 'uDASchemaUnitsGenerator.pas',
+ uDAIDEMenu in 'uDAIDEMenu.pas',
+ uDAIDEData in 'uDAIDEData.pas' {DAIdeData: TDataModule},
+ uDAIDERes in 'uDAIDERes.pas',
+ uDASelectDataTablesForm in 'uDASelectDataTablesForm.pas' {DASelectDataTablesForm},
+ uDADataTableMasterLinkWizardForm in 'uDADataTableMasterLinkWizardForm.pas' {DADataTableMasterLinkWizard},
+ uDAGuideWizardForm in 'uDAGuideWizardForm.pas' {DAGuideWizardForm},
+ uDADataTableWizards in 'uDADataTableWizards.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.res
new file mode 100644
index 0000000..2d6c311
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D6.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.cfg b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.cfg
new file mode 100644
index 0000000..5645689
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.cfg
@@ -0,0 +1,50 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Dcu\D7"
+-LN"..\..\Dcu\D7"
+-U"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-O"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-I"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-R"..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7"
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.dof b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.dof
new file mode 100644
index 0000000..2b8a3a6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.dof
@@ -0,0 +1,116 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Data Abstract - IDE Package
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Dcu\D7
+PackageDCPOutputDir=..\..\Dcu\D7
+SearchPath=..\..\Dcu\D7;..\..\Dcu\DevEx;..\..\..\RemObjects SDK\Dcu\D7
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;RemObjects_DataSnap_D7;PurposesoftD7;addict3_d6;tb2kComplete_70;CDKDesignTimeSupport;CDKSmp;CDK;ES_CodeSite20;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;Rz252N70;SynEdit_D7;dxsbD7;dxComnD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxDBEdD7;dxInsD7;dxGrEdD7;ECQDBCD7;EQTLD7;EQDBTLD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;Rz252D70;cxPageControlVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxGridUtilsVCLD7;cxGridVCLD7;RemObjects_BPDX_D7
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+FileDescription=
+FileVersion=3.0.0.280
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=RemObjects SDK
+ProductVersion=1.0.0.0
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.dpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.dpk
new file mode 100644
index 0000000..377b366
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.dpk
@@ -0,0 +1,51 @@
+package DataAbstract_IDE_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Data Abstract - IDE Package'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ DesignIDE,
+ vcldb,
+ dbrtl,
+ RemObjects_Core_D7,
+ RemObjects_IDE_D7,
+ RemObjects_Everwood_D7,
+ DataAbstract_Core_D7;
+
+contains
+ DataAbstract_IDE_Reg in 'DataAbstract_IDE_Reg.pas',
+ uDADataAbstractEditors in 'uDADataAbstractEditors.pas',
+ uDADBSessionManagerEditor in 'uDADBSessionManagerEditor.pas',
+ uDASchemaUnitsGenerator in 'uDASchemaUnitsGenerator.pas',
+ uDAIDEMenu in 'uDAIDEMenu.pas',
+ uDAIDEData in 'uDAIDEData.pas' {DAIdeData: TDataModule},
+ uDAIDERes in 'uDAIDERes.pas',
+ uDASelectDataTablesForm in 'uDASelectDataTablesForm.pas' {DASelectDataTablesForm},
+ uDADataTableMasterLinkWizardForm in 'uDADataTableMasterLinkWizardForm.pas' {DADataTableMasterLinkWizard},
+ uDAGuideWizardForm in 'uDAGuideWizardForm.pas' {DAGuideWizardForm},
+ uDADataTableWizards in 'uDADataTableWizards.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.res
new file mode 100644
index 0000000..8acd804
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_D7.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Lazarus_Mac.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Lazarus_Mac.lpk
new file mode 100644
index 0000000..ed53532
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Lazarus_Mac.lpk
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Lazarus_Unix.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Lazarus_Unix.lpk
new file mode 100644
index 0000000..9ee52af
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Lazarus_Unix.lpk
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Lazarus_Windows.lpk b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Lazarus_Windows.lpk
new file mode 100644
index 0000000..7cfde89
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Lazarus_Windows.lpk
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Reg.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Reg.pas
new file mode 100644
index 0000000..b37c6ac
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/DataAbstract_IDE_Reg.pas
@@ -0,0 +1,190 @@
+unit DataAbstract_IDE_Reg;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - IDE Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+{$WARN SYMBOL_DEPRECATED OFF}
+{$WARN UNIT_DEPRECATED OFF}
+
+interface
+
+procedure Register;
+
+implementation
+
+uses
+ SysUtils, DB, Classes,
+ uRODLGenTools,
+ {$IFDEF FPC}
+ ComponentEditors,PropEdits,FormEditingIntf,
+ {$ELSE}
+ ColnEdit,uROProductVersionInfo,
+ {$IFDEF DELPHI5}
+ DsgnIntf, DMDesigner,
+ {$ELSE}
+ DesignIntf, DesignEditors,
+ {$ENDIF}
+ {$ENDIF}
+ uDAClasses, uDADataTable, uDARemoteDataAdapter, uDARemoteDataAdapterRequests,
+ uDADataAbstractEditors, uDADriverManager, uDAInterfaces, uDABusinessProcessor,
+ uDADBSessionManagerEditor, uDADBSessionManager,
+ DARemoteService_Impl, DALoginService_Impl,
+ DataAbstractService_Impl, BaseLoginService_Impl, MultiDbLoginService_Impl,MultiDbLoginServiceV5_Impl,
+ SimpleLoginService_Impl, uDAClientDataModule, uDADesigntimeCall, uDADataTableReferenceCollection,
+ fROAbout, uDADataAdapter, uDALocalDataAdapter, uDALocalCommand;
+
+
+procedure Register;
+begin
+ RegisterComponentEditor(TDADriverManager, TDADriverManagerEditor);
+ RegisterComponentEditor(TDASchema, TDASchemaEditor);
+ RegisterComponentEditor(TDAConnectionManager, TDAConnectionManagerEditor);
+ RegisterComponentEditor(TDADataDictionary, TDADataDictionaryEditor);
+ RegisterComponentEditor(TDADataTable, TDADataTableEditor);
+ RegisterComponentEditor(TDABaseDataAdapter, TDABaseDataAdapterEditor);
+ RegisterComponentEditor(TDARemoteDataAdapter, TDARemoteDataAdapterEditor);
+ RegisterComponentEditor(TDADesigntimeCall, TDADesigntimeCallEditor);
+
+ {$IFDEF MSWINDOWS}
+ //RegisterComponentEditor(TDAClientDataModule, TDAClientDataModuleEditor);
+ {$ENDIF MSWINDOWS}
+
+ RegisterPropertyEditor(TypeInfo(string), TDARemoteRequest, 'MethodName', TDADataRequestCallMethodNameEditor);
+
+ {$IFDEF MSWINDOWS}
+ RegisterPropertyEditor(TypeInfo(string), TDADataTable, 'MasterFields', TDADataTableMasterDetailProps);
+ RegisterPropertyEditor(TypeInfo(string), TDADataTable, 'DetailFields', TDADataTableMasterDetailProps);
+ RegisterPropertyEditor(TypeInfo(TStrings), TDADataTable, 'MasterRequestMappings', TDADataTableMasterDetailProps);
+ RegisterPropertyEditor(TypeInfo(TStrings), TDADataTable, 'MasterParamsMappings', TDADataTableMasterDetailProps);
+ {$ENDIF MSWINDOWS}
+
+ RegisterPropertyEditor(TypeInfo(string), TDADriverManager, 'DriverDirectory', TDADriverManagerDirectory);
+ RegisterPropertyEditor(TypeInfo(TComponent), TDADataTableReference, 'DataTable', TDADataTableReferenceDataTable);
+
+ RegisterPropertyEditor(TypeInfo(TDataset), TDADataSource, 'Dataset', NIL);
+
+ RegisterPropertyEditor(TypeInfo(string), TDADataTable, 'LogicalName', TDADataTableLogicalNameEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDADataTable, 'LocalConnection', TDADataTableLocalConnection);
+
+ RegisterPropertyEditor(TypeInfo(string), TDAUpdateRule, 'DatasetName', TDACollectionItemDatasetNameEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDADatasetRelationship, 'DetailDatasetName', TDACollectionItemDatasetNameEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDADatasetRelationship, 'MasterDatasetName', TDACollectionItemDatasetNameEditor);
+
+ RegisterPropertyEditor(TypeInfo(string), TDABusinessProcessor, 'InsertCommandName', TDABusinessProcessorCommandProperty);
+ RegisterPropertyEditor(TypeInfo(string), TDABusinessProcessor, 'DeleteCommandName', TDABusinessProcessorCommandProperty);
+ RegisterPropertyEditor(TypeInfo(string), TDABusinessProcessor, 'UpdateCommandName', TDABusinessProcessorCommandProperty);
+ RegisterPropertyEditor(TypeInfo(string), TDABusinessProcessor, 'ReferencedDataset', TDABusinessProcessorRefDatasetProperty);
+ RegisterPropertyEditor(TypeInfo(string), TDABusinessProcessor, 'RefreshDatasetName', TDABusinessProcessorRefDatasetProperty);
+
+ RegisterPropertyEditor(TypeInfo(string), TDADBSessionManager, 'InsertSessionCommand', TDASchemaCommandListEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDADBSessionManager, 'UpdateSessionCommand', TDASchemaCommandListEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDADBSessionManager, 'DeleteSessionCommand', TDASchemaCommandListEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDADBSessionManager, 'ClearSessionsCommand', TDASchemaCommandListEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDADBSessionManager, 'GetSessionCountDataSet', TDASchemaDataSetListEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDADBSessionManager, 'GetAllSessionIDsDataset', TDASchemaDataSetListEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDADBSessionManager, 'GetSessionDataSet', TDASchemaDataSetListEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDADBSessionManager, 'Connection', TDASchemaConnectionsListEditor);
+
+ RegisterPropertyEditor(TypeInfo(TCollection), TDADataset, 'Fields', TCollectionProperty);
+ RegisterPropertyEditor(TypeInfo(TCollection), TDADataset, 'Params', TCollectionProperty);
+ RegisterPropertyEditor(TypeInfo(TCollection), TDADataset, 'Statements', TCollectionProperty);
+
+ RegisterPropertyEditor(TypeInfo(string), TDALoginService, 'LoginDataset', TDARemoteServiceDataSetListEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDALoginService, 'LogoutCommand', TDARemoteServiceCommandListEditor);
+
+ RegisterPropertyEditor(TypeInfo(string), TDAField, 'KeyFields', TDALookupSourceProperty);
+ RegisterPropertyEditor(TypeInfo(string), TDAField, 'LookupKeyFields', TDALookupDestProperty);
+ RegisterPropertyEditor(TypeInfo(string), TDAField, 'LookupResultField', TDALookupResultFieldProperty);
+
+ RegisterPropertyEditor(TypeInfo(string), TDALocalDataAdapter, 'ServiceName', TDALocalDataAdapterServiceEditor);
+ RegisterPropertyEditor(TypeInfo(string), TDALocalCommand, 'ServiceName', TDALocalDataAdapterServiceEditor);
+
+ {$IFDEF FPC}
+ FormEditingHook.RegisterDesignerBaseClass(TDARemoteService);
+ FormEditingHook.RegisterDesignerBaseClass(TDALoginService);
+ FormEditingHook.RegisterDesignerBaseClass(TDataAbstractService);
+ FormEditingHook.RegisterDesignerBaseClass(TBaseLoginService);
+ FormEditingHook.RegisterDesignerBaseClass(TSimpleLoginService);
+ FormEditingHook.RegisterDesignerBaseClass(TMultiDbLoginService);
+ FormEditingHook.RegisterDesignerBaseClass(TMultiDbLoginServiceV5);
+ FormEditingHook.RegisterDesignerBaseClass(TDAClientDataModule);
+ {$ELSE}
+ {$IFDEF VER140UP}
+ RegisterCustomModule(TDARemoteService, TCustomModule);
+ RegisterCustomModule(TDALoginService, TCustomModule);
+ RegisterCustomModule(TDataAbstractService, TCustomModule);
+ RegisterCustomModule(TBaseLoginService, TCustomModule);
+ RegisterCustomModule(TSimpleLoginService, TCustomModule);
+ RegisterCustomModule(TMultiDbLoginService, TCustomModule);
+ RegisterCustomModule(TMultiDbLoginServiceV5, TCustomModule);
+ {$ELSE}
+ RegisterCustomModule(TDARemoteService, TDataModuleDesignerCustomModule);
+ RegisterCustomModule(TDALoginService, TDataModuleDesignerCustomModule);
+ RegisterCustomModule(TDataAbstractService, TDataModuleDesignerCustomModule);
+ RegisterCustomModule(TBaseLoginService, TDataModuleDesignerCustomModule);
+ RegisterCustomModule(TSimpleLoginService, TDataModuleDesignerCustomModule);
+ RegisterCustomModule(TMultiDbLoginService, TDataModuleDesignerCustomModule);
+ RegisterCustomModule(TMultiDbLoginServiceV5, TDataModuleDesignerCustomModule);
+ {$ENDIF}
+ RegisterCustomModule(TDAClientDataModule,TCustomModule);
+ { TDARemoteDataAdapter }
+ RegisterPropertiesInCategory('Dynamic Method Binding', TDARemoteDataAdapter, ['GetSchemaCall', 'GetDataCall', 'GetScriptsCall', 'UpdateDataCall']);
+
+ RegisterPropertiesInCategory('Legacy', TDAGetDataRequest, ['OutgoingParamsParameter', 'OutgoingIncludeSchemaParameter', 'OutgoingMaxRecordsParameter']);
+
+ { TDADataTable }
+ //RegisterPropertiesInCategory('Legacy v3.0', TDADataTable, ['DataRequestCall', 'DataUpdateCall', 'SchemaCall', 'ScriptCall', 'Adapter']);
+ RegisterPropertiesInCategory('Master/Detail', TDADataTable, ['MasterFields', 'MasterMappingMode', 'MasterOptions', 'MasterParamsMappings', 'MasterRequestMappings', 'MasterSource', 'DetailFields', 'DetailOptions']);
+ RegisterPropertiesInCategory('Database', TDADataTable, ['Fields', 'Params', 'LogicalName', 'IndexDefs', 'IndexName', 'Active', 'StoreActive', 'LogChanges', 'MaxRecords']);
+ RegisterPropertiesInCategory('Business Rules', TDADataTable, ['BusinessRulesID', 'ScriptCode']);
+ RegisterPropertiesInCategory('Local Data', TDADataTable, ['LocalConnection', 'LocalSchema', 'LocalDataStreamer']);
+
+ { DA Service }
+
+ { Login Services }
+ RegisterPropertiesInCategory('Login', TBaseLoginService, ['OnLogout']);
+ RegisterPropertiesInCategory('Login', TSimpleLoginService, ['OnLogin']);
+ RegisterPropertiesInCategory('Login', TMultiDbLoginService, ['OnLogin']);
+ {$ENDIF}
+
+ RegisterRODataModuleClass(TDataAbstractService,
+ '&Data Abstract 4.0 Service',
+ 'Data Abstract datamodule. '+
+ 'This is the preferred server type when creating a Data Abstract version 4.0 or above server.',
+ 'uRORemoteDataModule, uDAInterfaces, DataAbstractService_Impl, DataAbstract4_Intf'
+ );
+
+ RegisterRODataModuleClass(TDARemoteService,
+ 'Data Abstract &3.0 Remote Service',
+ 'Data Abstract datamodule. This is the preferred server type when creating backward-compatible version 3.0 Data Abstract server.',
+ 'uRORemoteDataModule, uDAInterfaces, DARemoteService_Impl, DataAbstract3_Intf'
+ );
+
+
+
+end;
+
+{$IFNDEF FPC}
+{$IFDEF MSWINDOWS}
+initialization
+ RegisterProduct('{261E7EA5-C380-42A4-90AC-1FA10ADB39D8}',VersionBuildNo(hInstance));
+finalization
+ UnregisterProduct('{261E7EA5-C380-42A4-90AC-1FA10ADB39D8}');
+{$ENDIF MSWINDOWS}
+{$ENDIF}
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/Resources.BDS.RES b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/Resources.BDS.RES
new file mode 100644
index 0000000..d8238b6
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/Resources.BDS.RES differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleDataTableWizardForm.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleDataTableWizardForm.dfm
new file mode 100644
index 0000000..1b2f269
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleDataTableWizardForm.dfm
@@ -0,0 +1,176 @@
+object DAClientDataModuleDataTableWizardForm: TDAClientDataModuleDataTableWizardForm
+ Left = 417
+ Top = 173
+ BorderStyle = bsDialog
+ BorderWidth = 5
+ Caption = '%s - DataTable Wizard'
+ ClientHeight = 412
+ ClientWidth = 339
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ DesignSize = (
+ 339
+ 412)
+ PixelsPerInch = 96
+ TextHeight = 13
+ object lbl_ServerUrl1: TLabel
+ Left = 0
+ Top = 0
+ Width = 90
+ Height = 13
+ Caption = 'Select DataSets'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object lbl_ServerUrl2: TLabel
+ Left = 16
+ Top = 16
+ Width = 248
+ Height = 26
+ Caption =
+ 'Select the Datasets for that you want to generate TDADataTable ' +
+ 'components.'
+ WordWrap = True
+ end
+ object BitBtn2: TBitBtn
+ Left = 264
+ Top = 387
+ Width = 75
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Cancel = True
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 0
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object BitBtn1: TBitBtn
+ Left = 184
+ Top = 387
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Caption = 'Finish'
+ Default = True
+ ModalResult = 1
+ TabOrder = 1
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000220B0000220B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00FF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00
+ 811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FF787878787878FF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 811E00811E00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF787878787878787878FF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF811E0095440F811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878898989787878FF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF811E00A7632F811E00811E00FF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF7878789F9F9F78787878
+ 7878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF811E00BF8B62CCA17E811E00811E00FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878B8B8B8C6
+ C6C6787878787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00D8B69CE6D1BFE7D3C4811E00FF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878D1
+ D1D1E0E0E0E2E2E2787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00F0E2D9FCF7F2FAF0E6811E00811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878EBEBEBF5F5F5F1F1F1787878787878FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00D8AF96F4E2CFF0D7BDD8A784811E
+ 00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878D0D0D0E9E9E9E3E3E3CACACA787878787878FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00F3DECAEFD4B8EBC9A7DAA67D811E00FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878E7
+ E7E7E1E1E1DBDBDBC9C9C9787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00E7BB92E3B081E0A672D5925A811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878D3D3D3CDCDCDC6C6C6BCBCBC787878FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00DA995ED78F50D38441CF7B
+ 35811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FF787878BFBFBFB8B8B8B2B2B2ACACAC787878FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00811E00811E00811E
+ 00811E00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF787878787878787878787878787878787878FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object lb_DataSets: TCheckListBox
+ Left = 16
+ Top = 48
+ Width = 323
+ Height = 329
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ ItemHeight = 13
+ TabOrder = 2
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleDataTableWizardForm.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleDataTableWizardForm.pas
new file mode 100644
index 0000000..e48152d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleDataTableWizardForm.pas
@@ -0,0 +1,114 @@
+unit uDAClientDataModuleDataTableWizardForm;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, CheckLst, Buttons, uDAClientDataModule, DesignIntf;
+
+type
+ TDAClientDataModuleDataTableWizardForm = class(TForm)
+ BitBtn2: TBitBtn;
+ BitBtn1: TBitBtn;
+ lbl_ServerUrl1: TLabel;
+ lbl_ServerUrl2: TLabel;
+ lb_DataSets: TCheckListBox;
+ private
+ fModule:TDAClientDataModule;
+ procedure FillDataSets;
+ public
+ class function Execute(aOwner: TComponent; aModule:TDAClientDataModule; aDesigner:IDesigner):boolean;
+ end;
+
+var
+ DAClientDataModuleDataTableWizardForm: TDAClientDataModuleDataTableWizardForm;
+
+implementation
+
+uses
+ uROClasses, uDAIDERes, uRODL, uRORemoteService,
+ uDADataAbstractEditors, uDAMemDataTable, uDAClasses, uDAPleaseWaitForm;
+
+{$R *.dfm}
+
+{ TDAClientDataModuleDataTableWizardForm }
+
+class function TDAClientDataModuleDataTableWizardForm.Execute(aOwner: TComponent; aModule: TDAClientDataModule; aDesigner:IDesigner): boolean;
+var
+ i:integer;
+begin
+ if not Assigned(aModule.RemoteService) then RaiseError(err_AssignRemoteService);
+ if not Assigned(aModule.RemoteService.Channel) then RaiseError(err_AssignRemoteServiceChannel);
+ if not Assigned(aModule.RemoteService.Message) then RaiseError(err_AssignRemoteServiceMessage);
+
+ with self.Create(aOwner) do try
+
+ fModule := aModule;
+ Caption := Format(Caption,[fModule.Name]);
+ FillDataSets();
+
+ result := ShowModal() = idOk;
+ if result then begin
+
+ for i := 0 to lb_DataSets.Items.Count-1 do begin
+ if lb_DataSets.Checked[i] then begin
+ CreateDataTable(aDesigner, aModule, TDAMemDataTable, lb_DataSets.Items[i], false);
+ end;
+ end;
+
+ end;
+
+ finally
+ Free();
+ end;
+end;
+
+procedure TDAClientDataModuleDataTableWizardForm.FillDataSets;
+var
+ i: integer;
+ lSchema: TDASchema;
+ lDataSets: TStringList;
+begin
+
+ lDataSets := TStringList.Create();
+ try
+ lDataSets.Duplicates := dupIgnore;
+ lDataSets.Sorted := true;
+
+
+ lSchema := nil;
+ with CreatePleaseWaitForm(self,'Retrieving Schema...') do begin
+ fModule.GetSchema(lSchema,true);
+ Hide;
+ end;
+ try
+ for i := 0 to lSchema.Datasets.Count-1 do begin
+ lDataSets.Add(lSchema.Datasets[i].Name);
+ end; { for }
+ finally
+ lSchema.Free();
+ end;
+
+ lb_DataSets.Items.Assign(lDataSets);
+ for i := 0 to lb_Datasets.Items.Count-1 do begin
+ lb_DataSets.Checked[i] := true;
+ end; { for }
+
+ finally
+ FreeAndNil(lDataSets);
+ end;
+ {lLibrary := fModule.RemoteService.GetRODLLibrary();
+ if not Assigned (lLibrary) then RaiseError('Library could not retrieved from server');
+ try
+ lDataSets := fModule.RemoteService.GetServiceMethods();
+ for i := 0 to lDataSets.Count-1 do begin
+ p := Pos('_',lDataSets[i]);
+ if p > 0 then
+ lb_DataSets.Checked[lb_DataSets.Items.Add(Copy(lDataSets[i],p+1,Length(lDataSets[i])-p))] := true;
+ end;
+ finally
+ lLibrary.Free();
+ end; }
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleEditorForm.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleEditorForm.dfm
new file mode 100644
index 0000000..3b17c9c
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleEditorForm.dfm
@@ -0,0 +1,280 @@
+object DAClientDataModuleEditorForm: TDAClientDataModuleEditorForm
+ Left = 381
+ Top = 253
+ BorderStyle = bsDialog
+ BorderWidth = 5
+ Caption = '%s - ClientDataModule Editor'
+ ClientHeight = 183
+ ClientWidth = 322
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ DesignSize = (
+ 322
+ 183)
+ PixelsPerInch = 96
+ TextHeight = 13
+ object lbl_ServerUrl1: TLabel
+ Left = 0
+ Top = 0
+ Width = 66
+ Height = 13
+ Caption = 'Server URL:'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object lbl_ServerUrl2: TLabel
+ Left = 16
+ Top = 16
+ Width = 211
+ Height = 13
+ Caption = 'Select the URL of yout development server.'
+ end
+ object lbl_ServerUrl3: TLabel
+ Left = 16
+ Top = 32
+ Width = 308
+ Height = 26
+ Caption =
+ 'If you have kept the defaults when writing the server and are ru' +
+ 'nning the server on this machine, the default value will be ok:'
+ WordWrap = True
+ end
+ object Label4: TLabel
+ Left = 0
+ Top = 96
+ Width = 77
+ Height = 13
+ Caption = 'Service Name'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label5: TLabel
+ Left = 16
+ Top = 112
+ Width = 228
+ Height = 13
+ Caption = 'Select the Service that you want to connect to:'
+ end
+ object btn_CreateTables: TBitBtn
+ Left = 62
+ Top = 158
+ Width = 126
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Caption = 'Create DataTables'
+ ModalResult = 1
+ TabOrder = 0
+ OnClick = btn_CreateTablesClick
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000130B0000130B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF08750D08750D08750D0875
+ 0DFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF8C8C8C8C8C8C8C8C8C8C8C8CFF00FFFF00FFFF00FFFF00FFFF00FF
+ 0E80AA0E80AA0E80AA0E80AA0E80AA0E80AAFF00FF08750D13AA2210A61D0875
+ 0DFF00FFFF00FFFF00FFFF00FFFF00FF83838383838383838383838383838383
+ 8383FF00FF8C8C8CA3A3A3A1A1A18C8C8CFF00FFFF00FFFF00FFFF00FF078DBB
+ 49D5EE23D7FE36D9FE6FE6FF8DE7FA44BADD0E80AA08750D1AB12D16AD260875
+ 0DFF00FFFF00FFFF00FFFF00FF878787AFAFAFA8A8A8AFAFAFC3C3C3CCCCCCA8
+ A8A88383838C8C8CA8A8A8A5A5A58C8C8CFF00FFFF00FFFF00FF078DBB8CFBFE
+ 59EAFE23D7FE36D8FD6CE0F808750D08750D08750D08750D22B93B1DB5320875
+ 0D08750D08750D08750D878787CDCDCDBBBBBBA8A8A8AEAEAEC0C0C08C8C8C8C
+ 8C8C8C8C8C8C8C8CADADADAAAAAA8C8C8C8C8C8C8C8C8C8C8C8C078DBB8CFBFE
+ 59EAFE23D7FE36D8FD6CE0F808750D3CD46236CF5A30C9522CC34926BE4121B8
+ 381CB43117AF2A08750D878787CDCDCDBBBBBBA8A8A8AEAEAEC0C0C08C8C8CC0
+ C0C0BCBCBCB8B8B8B4B4B4B1B1B1ACACACAAAAAAA6A6A68C8C8C078DBB8CFBFE
+ 59EAFE23D7FE36D9FE6CE1F908750D44DD703FD8683AD26035CD582FC74F2AC1
+ 4725BD3E20B83608750D878787CDCDCDBBBBBBA8A8A8AFAFAFC0C0C08C8C8CC6
+ C6C6C2C2C2BFBFBFBBBBBBB7B7B7B3B3B3B0B0B0ACACAC8C8C8C078DBBB3FCFE
+ B6F6FFC6F5FFE3FAFFE9F9FD08750D08750D08750D08750D3ED76638D15E0875
+ 0D08750D08750D08750D878787DADADADCDCDCE1E1E1ECECECEDEDED8C8C8C8C
+ 8C8C8C8C8C8C8C8CC2C2C2BDBDBD8C8C8C8C8C8C8C8C8C8C8C8C078DBBBAEEF6
+ 30BCDD11A7D2129FCB20A1CA35A7CD2692BF92CEE408750D46DE7341DA6D0875
+ 0DFF00FFFF00FFFF00FF878787DADADAA1A1A19292929090909595959D9D9D93
+ 9393C6C6C68C8C8CC7C7C7C4C4C48C8C8CFF00FFFF00FFFF00FF078DBB4AC5DD
+ 59EAFE23D7FE36D9FE6FE6FF8DE7FA49C1E30682B608750D4DE67F49E2790875
+ 0DFF00FFFF00FFFF00FF878787AAAAAABBBBBBA8A8A8AFAFAFC3C3C3CCCCCCAC
+ ACAC8585858C8C8CCCCCCCC9C9C98C8C8CFF00FFFF00FFFF00FF078DBB8CFBFE
+ 59EAFE23D7FE36D9FE6FE6FF8DE7FA49C1E3089DCF08750D08750D08750D0875
+ 0DFF00FFFF00FFFF00FF878787CDCDCDBBBBBBA8A8A8AFAFAFC3C3C3CCCCCCAC
+ ACAC8E8E8E8C8C8C8C8C8C8C8C8C8C8C8CFF00FFFF00FFFF00FF078DBB8CFBFE
+ 59EAFE23D7FE36D9FE6FE6FF8DE7FA49C1E3089CCE0E7FA9FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF878787CDCDCDBBBBBBA8A8A8AFAFAFC3C3C3CCCCCCAC
+ ACAC8E8E8E838383FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF078DBB8CFBFE
+ 59EAFE23D7FE36D9FE6FE6FF8DE7FA49C1E3089DCF0E80AAFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF878787CDCDCDBBBBBBA8A8A8AFAFAFC3C3C3CCCCCCAC
+ ACAC8E8E8E838383FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF078DBB91FCFE
+ 82F8FF6FF8FF7AFEFF97FEFFA0FCFE63DAF50DA2D40E80AAFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF878787CECECEC9C9C9C3C3C3C7C7C7D1D1D1D4D4D4BB
+ BBBB919191838383FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF078DBBFCFFFF
+ F4FFFFD3FFFFB4FFFFADFFFFADFFFFA9FFFF72F9FE0E80AAFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF878787F4F4F4F1F1F1E6E6E6DBDBDBD9D9D9D9D9D9D7
+ D7D7C4C4C4838383FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0C92C0
+ F1FBFDE4FFFFC7FFFFAEFFFFA8FFFF9BFBFC1385AFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FF8A8A8AF0F0F0ECECECE2E2E2D9D9D9D7D7D7D1
+ D1D1878787FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 078DBB078DBB078DBB078DBB078DBB078DBBFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF87878787878787878787878787878787
+ 8787FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object BitBtn2: TBitBtn
+ Left = 259
+ Top = 158
+ Width = 63
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Cancel = True
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 1
+ OnClick = BitBtn2Click
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object ed_ServerUrl: TEdit
+ Left = 16
+ Top = 64
+ Width = 306
+ Height = 21
+ Anchors = [akLeft, akTop, akRight]
+ TabOrder = 2
+ OnChange = ed_ServerUrlChange
+ end
+ object cb_Services: TComboBox
+ Left = 16
+ Top = 128
+ Width = 306
+ Height = 21
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 13
+ TabOrder = 3
+ OnChange = cb_ServicesChange
+ OnCloseUp = cb_ServicesChange
+ OnEnter = cb_ServicesEnter
+ OnExit = cb_ServicesChange
+ end
+ object BitBtn1: TBitBtn
+ Left = 193
+ Top = 158
+ Width = 61
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Caption = 'Finish'
+ Default = True
+ ModalResult = 1
+ TabOrder = 4
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000220B0000220B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00FF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00
+ 811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FF787878787878FF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 811E00811E00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF787878787878787878FF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF811E0095440F811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878898989787878FF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF811E00A7632F811E00811E00FF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF7878789F9F9F78787878
+ 7878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF811E00BF8B62CCA17E811E00811E00FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878B8B8B8C6
+ C6C6787878787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00D8B69CE6D1BFE7D3C4811E00FF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878D1
+ D1D1E0E0E0E2E2E2787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00F0E2D9FCF7F2FAF0E6811E00811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878EBEBEBF5F5F5F1F1F1787878787878FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00D8AF96F4E2CFF0D7BDD8A784811E
+ 00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878D0D0D0E9E9E9E3E3E3CACACA787878787878FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00F3DECAEFD4B8EBC9A7DAA67D811E00FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878E7
+ E7E7E1E1E1DBDBDBC9C9C9787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00E7BB92E3B081E0A672D5925A811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878D3D3D3CDCDCDC6C6C6BCBCBC787878FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00DA995ED78F50D38441CF7B
+ 35811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FF787878BFBFBFB8B8B8B2B2B2ACACAC787878FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00811E00811E00811E
+ 00811E00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF787878787878787878787878787878787878FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleEditorForm.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleEditorForm.pas
new file mode 100644
index 0000000..c5a26ff
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleEditorForm.pas
@@ -0,0 +1,148 @@
+unit uDAClientDataModuleEditorForm;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, uDAClientDataModule, StdCtrls, Buttons, DesignIntf;
+
+type
+ TDAClientDataModuleEditorForm = class(TForm)
+ btn_CreateTables: TBitBtn;
+ BitBtn2: TBitBtn;
+ lbl_ServerUrl1: TLabel;
+ ed_ServerUrl: TEdit;
+ lbl_ServerUrl2: TLabel;
+ lbl_ServerUrl3: TLabel;
+ Label4: TLabel;
+ Label5: TLabel;
+ cb_Services: TComboBox;
+ BitBtn1: TBitBtn;
+ procedure ed_ServerUrlChange(Sender: TObject);
+ procedure cb_ServicesEnter(Sender: TObject);
+ procedure BitBtn2Click(Sender: TObject);
+ procedure btn_CreateTablesClick(Sender: TObject);
+ procedure cb_ServicesChange(Sender: TObject);
+ private
+ fServerUrlChanged: boolean;
+ fRestoreServerUrl: string;
+ fModule:TDAClientDataModule;
+ fCreateDataTables: boolean;
+ procedure FillServiceCombo;
+
+ public
+ class function Execute(aOwner: TCOmponent; aModule:TDAClientDataModule; aDesigner:IDesigner):boolean;
+ end;
+
+var
+ DAClientDataModuleEditorForm: TDAClientDataModuleEditorForm;
+
+implementation
+
+uses
+ uROClasses, TypInfo, uDAIDERes, uDAPleaseWaitForm,
+ uDAClientDataModuleDataTableWizardForm;
+
+{$R *.dfm}
+
+{ TDAClientDataModuleEditorForm }
+
+class function TDAClientDataModuleEditorForm.Execute(aOwner: TCOmponent; aModule: TDAClientDataModule; aDesigner:IDesigner): boolean;
+begin
+ if not Assigned(aModule.RemoteService) then RaiseError(err_AssignRemoteService);
+ if not Assigned(aModule.RemoteService.Channel) then RaiseError(err_AssignRemoteServiceChannel);
+ if not Assigned(aModule.RemoteService.Message) then RaiseError(err_AssignRemoteServiceMessage);
+
+ with self.Create(aOwner) do try
+
+ fModule := aModule;
+ Caption := Format(Caption,[fModule.Name]);
+
+
+ try
+ fRestoreServerUrl := GetStrProp(fModule.RemoteService.Channel,'TargetURL');
+ ed_ServerUrl.Text := fRestoreServerUrl;
+ fServerUrlChanged := false;
+ except
+ ed_ServerUrl.Enabled := false;
+ lbl_ServerUrl1.Enabled := false;
+ lbl_ServerUrl2.Enabled := false;
+ lbl_ServerUrl3.Enabled := false;
+ end;
+
+ FillServiceCombo();
+ cb_Services.ItemIndex := cb_Services.Items.IndexOf(fModule.RemoteService.ServiceName);
+ cb_ServicesChange(nil);
+
+ result := ShowModal() = idOk;
+ if result then begin
+ if ed_ServerUrl.Enabled then SetStrProp(fModule.RemoteService.Channel,'TargetURL',ed_ServerUrl.Text);
+ fModule.RemoteService.ServiceName := cb_Services.Text;
+
+ if fCreateDataTables then begin
+ TDAClientDataModuleDataTableWizardForm.Execute(aOwner, fModule, aDesigner);
+ end;
+
+ end;
+
+ finally
+ Free();
+ end;
+end;
+
+procedure TDAClientDataModuleEditorForm.ed_ServerUrlChange(
+ Sender: TObject);
+begin
+ fServerUrlChanged := true;
+end;
+
+procedure TDAClientDataModuleEditorForm.FillServiceCombo;
+var
+ lServiceNames: IROStrings;
+ i:integer;
+begin
+ Screen.Cursor := crHourGlass;
+ try
+ cb_Services.Items.Clear();
+ lServiceNames := fModule.RemoteService.GetServiceNames();
+ if Assigned(lServiceNames) then begin
+ for i := 0 to (lServiceNames.Count-1) do
+ cb_Services.Items.Add(lServiceNames[i]);
+ end
+ else begin
+ cb_Services.Text := '';
+ end;
+ cb_ServicesChange(nil);
+ finally
+ Screen.Cursor := crDefault;
+ end;
+end;
+
+procedure TDAClientDataModuleEditorForm.cb_ServicesEnter(Sender: TObject);
+begin
+ if fServerUrlChanged then begin
+ if ed_ServerUrl.Enabled then begin
+ SetStrProp(fModule.RemoteService.Channel,'TargetURL',ed_ServerUrl.Text);
+ FillServiceCombo();
+ end;
+ fServerUrlChanged := true;
+ end
+end;
+
+procedure TDAClientDataModuleEditorForm.BitBtn2Click(Sender: TObject);
+begin
+ if ed_ServerUrl.Enabled then
+ SetStrProp(fModule.RemoteService.Channel,'TargetURL',fRestoreServerUrl);
+end;
+
+procedure TDAClientDataModuleEditorForm.btn_CreateTablesClick(Sender: TObject);
+begin
+ fCreateDataTables := true;
+end;
+
+procedure TDAClientDataModuleEditorForm.cb_ServicesChange(Sender: TObject);
+begin
+ btn_CreateTables.Enabled := cb_Services.Text <> '';
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleWizard.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleWizard.pas
new file mode 100644
index 0000000..8ced8e8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientDataModuleWizard.pas
@@ -0,0 +1,394 @@
+unit uDAClientDataModuleWizard;
+
+{$I DataAbstract.inc}
+
+interface
+
+uses DesignEditors, ToolsAPI, Windows, ActnList, Menus, Classes;
+
+const CRLF = #13#10; // Carriage-return line-feed.
+
+resourcestring
+ sBasicDfmSource =
+ 'object %0:s: T%0:s' + crlf +
+ ' Left = 200' + crlf +
+ ' Top = 200' + crlf +
+ ' Height = 300' + crlf +
+ ' Width = 300' + crlf +
+ ' RemoteService = RORemoteService' + crlf +
+ ' Adapter = DABinAdapter' + crlf +
+ ' SchemaCall.MethodName = ''GetSchemaAsXML''' + crlf +
+ ' SchemaCall.Params = <' + crlf +
+ ' item' + crlf +
+ ' Name = ''Result''' + crlf +
+ ' ParamType = fResult' + crlf +
+ ' DataType = rtString' + crlf +
+ ' end>' + crlf +
+ ' object ROChannel: TROWinInetHTTPChannel' + crlf +
+ ' UserAgent = ''RemObjects SDK''' + crlf +
+ ' TargetURL = ''http://localhost:8099/bin''' + crlf +
+ ' Left = 40' + crlf +
+ ' Top = 8' + crlf +
+ ' end' + crlf +
+ ' object ROMessage: TROBinMessage' + crlf +
+ ' Left = 40' + crlf +
+ ' Top = 52' + crlf +
+ ' end' + crlf +
+ ' object RORemoteService: TRORemoteService' + crlf +
+ ' Message = ROMessage' + crlf +
+ ' Channel = ROChannel' + crlf +
+ ' Left = 40' + crlf +
+ ' Top = 96' + crlf +
+ ' end' + crlf +
+ ' object DABinAdapter: TDABINAdapter' + crlf +
+ ' Left = 40' + crlf +
+ ' Top = 144' + crlf +
+ ' end' + crlf +
+ 'end';
+
+ sBasicFormSource =
+ 'unit %0:s;' + crlf +
+ crlf +
+ 'interface' + crlf +
+ crlf +
+ 'uses {vcl:} SysUtils, Classes, DB, DBClient, ' + crlf +
+ ' {RemObjects:} %3:s;' + crlf +
+ crlf +
+ 'type' + crlf +
+ ' T%1:s = class(%2:s)' + crlf +
+ ' ROChannel: TROWinInetHTTPChannel;' + crlf +
+ ' ROMessage: TROBinMessage;' + crlf +
+ ' RORemoteService: TRORemoteService;' + crlf +
+ ' DABinAdapter: TDABINAdapter;' + crlf +
+ ' private' + crlf +
+ ' { Private declarations }' + crlf +
+ ' public' + crlf +
+ ' { Public declarations }' + crlf +
+ ' end;' + crlf +
+ crlf +
+ 'var' + crlf +
+ ' %1:s: T%1:s;' + crlf +
+ crlf +
+ 'implementation' + crlf +
+ crlf +
+ '{$R *.DFM}' + crlf +
+ crlf +
+ 'initialization' + crlf +
+ 'end.' ;
+
+type TSourceFile = class(TInterfacedObject, IOTAFile)
+ private
+ fAge: TDateTime;
+ fSource:string;
+ public
+ function GetSource: string;
+ function GetAge: TDateTime;
+ constructor Create(const iSource:string);
+ end;
+
+ TBaseFormCreator = class(TInterfacedObject, IOTAModuleCreator)
+ public
+ function GetCreatorType: string;
+ function GetExisting: Boolean;
+ function GetFileSystem: string;
+ function GetOwner: IOTAModule;
+ function GetUnnamed: Boolean;
+
+ function GetAncestorName: string;
+ function GetImplFileName: string;
+ function GetIntfFileName: string;
+ function GetFormName: string;
+ function GetMainForm: Boolean;
+ function GetShowForm: Boolean;
+ function GetShowSource: Boolean;
+ function NewFormFile(const FormIdent, AncestorIdent: string): IOTAFile;
+ function NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;
+ function NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;
+
+ procedure FormCreated(const FormEditor: IOTAFormEditor);
+ end; { TBaseFormCreator }
+
+ TNewModuleExpert = class(TInterfacedObject,
+ IOTAWizard,
+ IOTARepositoryWizard,
+ IOTAFormWizard,
+ {$IFDEF BDS}
+ IOTARepositoryWizard80,
+ {$ENDIF}
+ IOTARepositoryWizard60)
+ public
+
+ constructor Create();
+ destructor Destroy(); override;
+
+ procedure AfterSave;
+ procedure BeforeSave;
+ procedure Destroyed;
+ procedure Modified;
+
+ procedure Execute;
+ function GetAuthor: String;
+ function GetComment: String;
+ function GetGlyph: Cardinal;
+ function GetIDString: String;
+ function GetName: String;
+ function GetPage: String;
+ function GetState: TWizardState;
+ function GetDesigner: String;
+
+ {$IFDEF BDS}
+ function GetGalleryCategory: IOTAGalleryCategory;
+ function GetPersonality: string;
+ {$ENDIF}
+
+ end;
+
+procedure Register;
+
+implementation
+
+uses SysUtils, Graphics,
+ uRORes, uDADataAbstractEditors, Dialogs, uDAClientDataModuleEditorForm, Forms,
+ uDAClientDataModule;
+
+{ TBaseFormCreator }
+
+procedure TBaseFormCreator.FormCreated(const FormEditor: IOTAFormEditor);
+begin
+
+end;
+
+function TBaseFormCreator.GetAncestorName: string;
+begin
+ result := 'TDAClientDataModule';
+end;
+
+function TBaseFormCreator.GetCreatorType: string;
+begin
+ result := sForm;
+end;
+
+function TBaseFormCreator.GetExisting: Boolean;
+begin
+ result := false;
+end;
+
+function TBaseFormCreator.GetFileSystem: string;
+begin
+ result := '';
+end;
+
+function TBaseFormCreator.GetFormName: string;
+begin
+ result := '';
+end;
+
+function TBaseFormCreator.GetImplFileName: string;
+begin
+ result := '';
+end;
+
+function TBaseFormCreator.GetIntfFileName: string;
+begin
+ result := '';
+end;
+
+function TBaseFormCreator.GetMainForm: Boolean;
+begin
+ result := false;
+end;
+
+function TBaseFormCreator.GetOwner: IOTAModule;
+var
+ ModuleServices: IOTAModuleServices;
+ Module: IOTAModule;
+ NewModule: IOTAModule;
+begin
+ Result := nil;
+ if BorlandIDEServices.QueryInterface(IOTAModuleServices, ModuleServices) =
+S_OK then
+ begin
+ Module := ModuleServices.CurrentModule;
+ if Module <> nil then
+ if Module.GetOwnerCount > 0 then
+ begin
+ NewModule := Module.GetOwner(0);
+ if NewModule <> nil then
+ if NewModule.QueryInterface(IOTAProject, Result) <> S_OK then
+ Result := nil;
+ end;
+ end;
+end;
+
+function TBaseFormCreator.GetShowForm: Boolean;
+begin
+ result := true;
+end;
+
+function TBaseFormCreator.GetShowSource: Boolean;
+begin
+ result := true;
+end;
+
+function TBaseFormCreator.GetUnnamed: Boolean;
+begin
+ result := true;
+end;
+
+function RemoveInitialT(const iString:string):string;
+begin
+ result := iString;
+ if (result <> '') and (result[1] = 'T') then Delete(result,1,1);
+ //ShowMessage(iString+' '+result);
+end;
+
+function TBaseFormCreator.NewFormFile(const FormIdent,
+ AncestorIdent: string): IOTAFile;
+begin
+ result := TSourceFile.Create(Format(sBasicDfmSource,[RemoveInitialT(FormIdent)]));
+end;
+
+function TBaseFormCreator.NewImplSource(const ModuleIdent, FormIdent,
+ AncestorIdent: string): IOTAFile;
+begin
+ result := TSourceFile.Create(Format(sBasicFormSource,[ModuleIdent,RemoveInitialT(FormIdent),AncestorIdent,'uDAClientDataModule']));
+end;
+
+function TBaseFormCreator.NewIntfSource(const ModuleIdent, FormIdent,
+ AncestorIdent: string): IOTAFile;
+begin
+
+end;
+
+{ TSourceFile }
+
+constructor TSourceFile.Create(const iSource: string);
+begin
+ inherited Create();
+ fSource := iSource;
+ fAge := Now;
+end;
+
+function TSourceFile.GetAge: TDateTime;
+begin
+ result := fAge;
+end;
+
+function TSourceFile.GetSource: string;
+begin
+ result := fSource;
+end;
+
+{ TNewModuleExpert }
+
+constructor TNewModuleExpert.Create;
+begin
+ inherited;
+end;
+
+destructor TNewModuleExpert.Destroy;
+begin
+ inherited;
+end;
+
+procedure TNewModuleExpert.Execute;
+var
+ lModuleServices: IOTAModuleServices;
+ lModuleCreator: IOTAModuleCreator;
+ lModule: IOTAModule;
+begin
+ if BorlandIDEServices.QueryInterface(IOTAModuleServices, lModuleServices) = S_OK then
+ begin
+ lModuleCreator := TBaseFormCreator.Create();
+ lModule := lModuleServices.CreateModule(lModuleCreator);
+ TDAClientDataModuleEditorForm.Execute(Application,
+ (lModule.GetCurrentEditor as INTAFormEditor).FormDesigner.Root as TDAClientDataModule,
+ (lModule.GetCurrentEditor as INTAFormEditor).FormDesigner);
+ end;
+end;
+
+function TNewModuleExpert.GetAuthor: String;
+begin
+ result := 'RemObjects Software';
+end;
+
+function TNewModuleExpert.GetComment: String;
+begin
+ result := 'Data Abstract ClientDataModule';
+end;
+
+function TNewModuleExpert.GetGlyph: Cardinal;
+begin
+ result := LoadIcon(hInstance,'DAClientDataModule');
+end;
+
+function TNewModuleExpert.GetIDString: String;
+begin
+ result := 'RemObjectsDAClientDataModule';
+end;
+
+function TNewModuleExpert.GetName: String;
+begin
+ result := 'Data Abstract ClientDataModule';
+end;
+
+function TNewModuleExpert.GetPage: String;
+begin
+ result := 'RemObjects Data Abstract';
+end;
+
+{$IFDEF BDS}
+function TNewModuleExpert.GetGalleryCategory: IOTAGalleryCategory;
+var
+ lGalleryManager: IOTAGalleryCategoryManager;
+begin
+ lGalleryManager := BorlandIDEServices as IOTAGalleryCategoryManager;
+ result := lGalleryManager.FindCategory('RemObjectsDataAbstractDelphi');
+end;
+
+function TNewModuleExpert.GetPersonality: string;
+begin
+ result := sDelphiPersonality;
+end;
+{$ENDIF}
+
+function TNewModuleExpert.GetState: TWizardState;
+begin
+ result := [wsEnabled];
+end;
+
+procedure TNewModuleExpert.AfterSave;
+begin
+
+end;
+
+procedure TNewModuleExpert.BeforeSave;
+begin
+
+end;
+
+procedure TNewModuleExpert.Destroyed;
+begin
+
+end;
+
+procedure TNewModuleExpert.Modified;
+begin
+
+end;
+
+procedure Register;
+begin
+ //RegisterPackageWizard(TNewModuleExpert.Create as IOTAFormWizard);
+end;
+
+{$R 'uDAClientModuleWizard.res' 'uDAClientModuleWizard.rc'}
+
+function TNewModuleExpert.GetDesigner: String;
+begin
+ Result := dAny;
+end;
+
+initialization
+finalization
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientModuleWizard.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientModuleWizard.res
new file mode 100644
index 0000000..dd81d99
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAClientModuleWizard.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADBSessionManagerEditor.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADBSessionManagerEditor.pas
new file mode 100644
index 0000000..9fce3f7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADBSessionManagerEditor.pas
@@ -0,0 +1,174 @@
+unit uDADBSessionManagerEditor;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - IDE Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+interface
+
+uses
+ Classes,
+ {$IFDEF FPC}
+ PropEdits,
+ {$ELSE}
+ DesignIntf, DesignEditors,
+ {$ENDIF}
+ uDAClasses;
+
+type
+ TDASchemaItemListEditor = class(TStringProperty)
+ protected
+ function GetSchema: TDASchema; virtual;
+
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure SetValue(const Value: string); override;
+ property Schema: TDASchema read GetSchema;
+ end;
+
+ TDASchemaCommandListEditor = class(TDASchemaItemListEditor)
+ public
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ TDASchemaDataSetListEditor = class(TDASchemaItemListEditor)
+ public
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ TDARemoteServiceDataSetListEditor = class(TDASchemaDataSetListEditor)
+ protected
+ function GetSchema: TDASchema; override;
+
+ end;
+
+ TDARemoteServiceCommandListEditor = class(TDASchemaCommandListEditor)
+ protected
+ function GetSchema: TDASchema; override;
+
+ end;
+
+ TDASchemaCommandAndDataSetListEditor = class(TDASchemaItemListEditor)
+ public
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ TDASchemaConnectionsListEditor = class(TDASchemaItemListEditor)
+ public
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+implementation
+
+uses
+ uDADBSessionManager, Dialogs,
+ {$WARN UNIT_DEPRECATED OFF}
+ DARemoteService_Impl
+ {$WARN UNIT_DEPRECATED ON}
+ ;
+
+{ TDASchemaItemListEditor }
+
+function TDASchemaItemListEditor.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList, paSortList]
+end;
+
+function TDASchemaItemListEditor.GetSchema: TDASchema;
+begin
+ result := (GetComponent(0) as TDADBSessionManager).Schema;
+end;
+
+procedure TDASchemaItemListEditor.SetValue(const Value: string);
+begin
+ inherited;
+
+end;
+
+{ TDASchemaCommandListEditor }
+
+procedure TDASchemaCommandListEditor.GetValues(Proc: TGetStrProc);
+var
+ i: integer;
+begin
+ if Assigned(Schema) then begin
+ for i := 0 to Schema.Commands.Count - 1 do begin
+ Proc(Schema.Commands[i].Name);
+ end;
+ end;
+end;
+
+{ TDASchemaDataSetListEditor }
+
+procedure TDASchemaDataSetListEditor.GetValues(Proc: TGetStrProc);
+var
+ i: integer;
+begin
+ if Assigned(Schema) then begin
+ for i := 0 to Schema.Datasets.Count - 1 do begin
+ Proc(Schema.Datasets[i].Name);
+ end;
+ end;
+end;
+
+{ TDASchemaCommandAndDataSetListEditor }
+
+procedure TDASchemaCommandAndDataSetListEditor.GetValues(Proc: TGetStrProc);
+var
+ i: integer;
+begin
+ if Assigned(Schema) then begin
+ for i := 0 to Schema.Datasets.Count - 1 do begin
+ Proc(Schema.Datasets[i].Name);
+ end;
+ if (Schema.Datasets.Count > 0) and (Schema.Commands.Count > 0) then
+ Proc('---');
+
+ for i := 0 to Schema.Commands.Count - 1 do begin
+ Proc(Schema.Commands[i].Name);
+ end;
+ end;
+end;
+
+{ TDASchemaConnectionsListEditor }
+
+procedure TDASchemaConnectionsListEditor.GetValues(Proc: TGetStrProc);
+var
+ i: integer;
+begin
+ if Assigned(Schema) and Assigned(Schema.ConnectionManager) then begin
+ for i := 0 to Schema.ConnectionManager.Connections.Count - 1 do begin
+ Proc(Schema.ConnectionManager.Connections[i].Name);
+ end;
+ end;
+end;
+
+{ TDARemoteServiceDataSetListEditor }
+{$WARN SYMBOL_DEPRECATED OFF}
+function TDARemoteServiceDataSetListEditor.GetSchema: TDASchema;
+begin
+ result := (GetComponent(0) as TDARemoteService).ServiceSchema;
+end;
+
+{ TDARemoteServiceCommandListEditor }
+
+function TDARemoteServiceCommandListEditor.GetSchema: TDASchema;
+begin
+ result := (GetComponent(0) as TDARemoteService).ServiceSchema;
+end;
+{$WARN SYMBOL_DEPRECATED ON}
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataAbstractEditors.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataAbstractEditors.pas
new file mode 100644
index 0000000..0c79fb0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataAbstractEditors.pas
@@ -0,0 +1,1638 @@
+unit uDADataAbstractEditors;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - IDE Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF}
+ {$IFDEF FPC}ComponentEditors, PropEdits, {$ELSE}DesignIntf, DesignEditors, ColnEdit,{$ENDIF}
+ SysUtils, Classes,
+ uROClient, uRODL,uRORemoteService,
+ uDAClasses, uDARes, uDADataTable, uDARemoteDataAdapter, uDADataAdapter, uDALocalHelpers;
+
+type { TDADriverManagerEditor }
+ TDADriverManagerEditor = class(TComponentEditor)
+ private
+ public
+ procedure ExecuteVerb(Index: Integer); override;
+ function GetVerb(Index: Integer): string; override;
+ function GetVerbCount: Integer; override;
+ end;
+
+ { TDAConnectionManagerEditor }
+ TDAConnectionManagerEditor = class(TComponentEditor)
+ private
+ public
+ procedure ExecuteVerb(Index: Integer); override;
+ function GetVerb(Index: Integer): string; override;
+ function GetVerbCount: Integer; override;
+ end;
+
+ { TDADataDictionaryEditor }
+ TDADataDictionaryEditor = class(TComponentEditor)
+ private
+ public
+ procedure ExecuteVerb(Index: Integer); override;
+ function GetVerb(Index: Integer): string; override;
+ function GetVerbCount: Integer; override;
+ end;
+
+ { TDASchemaEditor }
+ TDASchemaEditor = class(TComponentEditor)
+ protected
+ public
+ procedure ExecuteVerb(Index: Integer); override;
+ function GetVerb(Index: Integer): string; override;
+ function GetVerbCount: Integer; override;
+ end;
+
+ { TDADesigntimeCallEditor }
+ TDADesigntimeCallEditor = class(TComponentEditor)
+ protected
+ public
+ procedure ExecuteVerb(Index: Integer); override;
+ function GetVerb(Index: Integer): string; override;
+ function GetVerbCount: Integer; override;
+ end;
+
+ { TDADataRequestCallMethodNameEditor }
+ TDADataRequestCallMethodNameEditor = class(TStringProperty)
+ private
+ function RetrieveLibrary: TRODLLibrary;
+
+ protected
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ procedure SetValue(const Value: string); override;
+ end;
+
+ { TDALoginAwareComponentEditor }
+ TDALoginAwareComponentEditor = class(TComponentEditor)
+ protected
+ fRemoteService: TRORemoteService;
+ function GetAdapterSchema(aAdapter: TDABaseDataAdapter): TDASchema;
+ procedure OnLoginNeeded(Sender: TROTransportChannel; anException: Exception; var aRetry: Boolean);
+ end;
+
+ { TDADataTableEditor }
+ TDADataTableEditor = class(TDALoginAwareComponentEditor)
+ protected
+ public
+ procedure ExecuteVerb(Index: Integer); override;
+ function GetVerb(Index: Integer): string; override;
+ function GetVerbCount: Integer; override;
+ end;
+
+ { TDABaseDataAdapterEditor }
+ TDABaseDataAdapterEditor = class(TDALoginAwareComponentEditor)
+ protected
+ fDataTables: TStringList;
+ function HookUpDataTables: boolean;
+ procedure GetDataTables(const aName: string);
+ public
+ procedure ExecuteVerb(Index: Integer); override;
+ function GetVerb(Index: Integer): string; override;
+ function GetVerbCount: Integer; override;
+ end;
+
+ { TDARemoteDataAdapterEditor }
+ TDARemoteDataAdapterEditor = class(TDABaseDataAdapterEditor )
+ public
+ procedure ExecuteVerb(Index: Integer); override;
+ function GetVerb(Index: Integer): string; override;
+ function GetVerbCount: Integer; override;
+ end;
+
+ { TDADataTableMasterDetailProps }
+ TDADataTableMasterDetailProps = class(TStringProperty)
+ protected
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure Edit; override;
+ end;
+
+ { TDABusinessProcessorCommandProperty }
+ TDABusinessProcessorCommandProperty = class(TStringProperty)
+ protected
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ { TDABusinessProcessorRefDatasetProperty }
+ TDABusinessProcessorRefDatasetProperty = class(TStringProperty)
+ protected
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ {$IFDEF FPC}
+ TCollectionProperty = TCollectionPropertyEditor;
+ {$ENDIF FPC}
+ { TDACollectionProperty }
+ TDACollectionProperty = class(TCollectionProperty)
+ private
+ protected
+ public
+ procedure Edit; override;
+ function GetAttributes: TPropertyAttributes; override;
+ end;
+
+
+ { TDADataTableLogicalNameEditor }
+ TDADataTableLogicalNameEditor = class(TStringProperty)
+ private
+ function GetSchema: TDASchema;
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ { TDACollectionItemDatasetNameEditor }
+ TDACollectionItemDatasetNameEditor = class(TStringProperty)
+ private
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ { TDADataTableLocalConnection }
+ TDADataTableLocalConnection = class(TStringProperty)
+ private
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ { TDADriverManagerDirectory }
+ TDADriverManagerDirectory = class(TStringProperty)
+ private
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ procedure SetValue(const Value: string); override;
+ end;
+
+ { TDADataTableReferenceDataTable }
+ TDADataTableReferenceDataTable = class(TComponentProperty)
+ public
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ { TDALookupSourceProperty }
+ TDALookupSourceProperty = class(TStringProperty)
+ private
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ { TDALookupDestProperty }
+ TDALookupDestProperty = class(TStringProperty)
+ private
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ { TDALookupResultFieldProperty }
+ TDALookupResultFieldProperty = class(TDALookupDestProperty)
+ private
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure SetValue(const Value: string); override;
+ end;
+
+ { TDALocalDataAdapterServiceEditor }
+ TDALocalDataAdapterServiceEditor = class(TStringProperty)
+ private
+ function GetRODL: TRODLLibrary;
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+ function GetServiceInstance(aServiceName: string): IDataAbstractLocalServiceAccess;
+ procedure SetDefaultConnection(aServiceName: string);
+
+implementation
+
+uses
+
+ {$IFDEF FPC}
+ uDADataTableMasterLinkWizardForm_laz, uROIDETools_laz,uDAIDEMenu_laz,
+ uEWOTAHelpers_laz,ProjectIntf,LazIDEIntf,
+ {$ELSE}
+ uROIDETools, uROIDEMenu, uROPleaseWaitForm,
+ uDAIDEMenu, uDAPleaseWaitForm,
+ ToolsAPI,uEWOTAHelpers,
+ uDADataTableMasterLinkWizardForm,ShellAPI,
+ {$ENDIF}
+ uDAIDEData,uDASchemaUnitsGenerator,
+ uROLoginNeededForm,
+ Dialogs, Graphics, Controls,
+ {$WARN UNIT_PLATFORM OFF}
+ FileCtrl,
+ {$WARN UNIT_PLATFORM ON}
+ TypInfo, Forms, ClipBrd, DB,
+ uROTypes,
+ uDAUtils, uDADriverManager, uDADriverInfo, uDASupportClasses,
+ uROClasses,
+ uRODLToXML, uDAInterfaces, uDABusinessProcessor, uDAIDERes,
+ IniFiles, Registry, uDADesigntimeCall, uDASelectDataTablesForm,
+ uRODynamicRequest, {$IFDEF USE_LOCALDATAADAPTER}uDALocalDataAdapter,{$ENDIF} uDADataTableWizards,
+ DataAbstractService_Impl;
+
+{$IFNDEF FPC}
+function FindProjectByActiveModule: IOTAProject;
+var
+ services: IOTAModuleServices;
+ lProject: IOTAProject;
+ lcurModule: IOTAModule;
+ i,j: Integer;
+begin
+ Result:= CurrentProject;
+ services := ModuleServices;
+ if (services = nil) then Exit;
+ lcurModule := services.CurrentModule;
+ for I := 0 to (services.ModuleCount - 1) do begin
+ if Services.Modules[i].QueryInterface(IOTAProject, lProject) = S_OK then begin
+ for j := 0 to lProject.GetModuleCount-1 do begin
+ if SameText(lProject.GetModule(j).FileName,lcurModule.FileName) then begin
+ result := lProject;
+ exit;
+ end;
+ end;
+ end;
+ end;
+end;
+{$ENDIF}
+{ TDASchemaEditor }
+
+const
+ COMMAND_INDEX_EDIT = 0;
+ COMMAND_INDEX_PUBLISH = 1;
+ COMMAND_INDEX_SEPARATOR_1 = 2;
+ COMMAND_INDEX_SAVE = 3;
+ COMMAND_INDEX_LOAD = 4;
+ COMMAND_INDEX_SEPARATOR_2 = 5;
+ COMMAND_INDEX_GENCODE = 6;
+ COMMAND_INDEX_GENCONSTS = 7;
+
+procedure TDASchemaEditor.ExecuteVerb(Index: Integer);
+var
+ schema :TDASchema;
+ connmgr : TDAConnectionManager;
+ {$IFDEF DELPHI2009UP}
+ lSchemaAge, lAge: TDateTime;
+ {$ELSE}
+ lSchemaAge: integer;
+ {$ENDIF}
+ sfname,
+ cmfname, dadname,diagramname :string;
+ i, x : integer;
+ s : string;
+ lDesigner:IDesignerNotify;
+ params: TStringList;
+ {$IFNDEF FPC}
+ loldCurrentProject, lproject: IOTAProject;
+ {$ENDIF}
+begin
+ schema := GetComponent as TDASchema;
+ connmgr := schema.ConnectionManager;
+
+ if (Index=COMMAND_INDEX_GENCONSTS) then begin
+ params := TStringList.Create;
+ with schema do try
+ params.Sorted := TRUE;
+
+ s := '';
+ if Datasets.Count>0 then begin
+ s := Format(' { Dataset names contained in schema "%s" }',[schema.Name])+#13#10;
+ for i := 0 to (Datasets.Count-1) do begin
+ s := s+Format(' ds_%s = ''%s'';', [MakeValidIdentifier(Datasets[i].Name), Datasets[i].Name])+#13#10;
+ end;
+ end;
+
+ if Commands.Count>0 then begin
+ s := s+#13#10+Format(' { Command names contained in schema "%s"}',[schema.Name])+#13#10;
+ for i := 0 to (Commands.Count-1) do begin
+ s := s+Format(' cmd_%s = ''%s'';', [MakeValidIdentifier(Commands[i].Name), Commands[i].Name])+#13#10;
+ end;
+ end;
+
+ s := s+' { Dataset and command parameters }'+#13#10;
+ for i := 0 to (Datasets.Count-1) do begin
+ for x := 0 to (Datasets[i].Params.Count-1) do begin
+ // Checks for duplicates
+ if params.IndexOf(UpperCase(Datasets[i].Params[x].Name))<0
+ then params.Add(UpperCase(Datasets[i].Params[x].Name))
+ else Continue;
+
+ s := s+Format(' par_%s = ''%s'';', [Datasets[i].Params[x].Name, Datasets[i].Params[x].Name])+#13#10;
+ end;
+ end;
+
+ for i := 0 to (Commands.Count-1) do begin
+ for x := 0 to (Commands[i].Params.Count-1) do begin
+ // Checks for duplicates
+ if params.IndexOf(UpperCase(Commands[i].Params[x].Name))<0
+ then params.Add(UpperCase(Commands[i].Params[x].Name))
+ else Continue;
+
+ s := s+Format(' par_%s = ''%s'';', [Commands[i].Params[x].Name, Commands[i].Params[x].Name])+#13#10;
+ end;
+ end;
+ finally
+ params.Free;
+ end;
+
+ Clipboard.AsText := s;
+ Exit;
+ end
+ else if Index = COMMAND_INDEX_SAVE then begin
+ sfname := schema.Name;
+ if not PromptForFileName(sfname, 'Data Abstract Schema (*'+daFileExtSchemaFile+')|*'+daFileExtSchemaFile+'|All Files (*.*)|*.*', daFileExtSchemaFile, 'Save Schema '+schema.Name, '', TRUE) then Exit;
+
+ schema.SaveToFile(sfname, pfXML);
+ // in COMMAND_INDEX_LOAD we load only schema so we will save also schema only
+ {
+ if Assigned(schema.ConnectionManager) then
+ schema.ConnectionManager.SaveToFile(ChangeFileExt(sfname, daFileExtConnectionMgrFile), pfXML);
+
+ if Assigned(schema.DataDictionary) then
+ schema.DataDictionary.SaveToFile(ChangeFileExt(sfname, daFileExtDataDictionaryFile), pfXML);
+
+ if Assigned(schema.Diagrams) then
+ schema.Diagrams.SaveToFile(ChangeFileExt(sfname, DAFileExtDiagramsFile));
+ }
+ end
+ else if (Index<>COMMAND_INDEX_LOAD) and (Index<>COMMAND_INDEX_GENCODE) then begin
+ Check(connmgr=NIL, 'The schema doesn''t have a connection manager associated. Cannot launch Schema Modeler');
+
+ if (Index=COMMAND_INDEX_SAVE) then begin
+ sfname := schema.Name;
+ if not PromptForFileName(sfname, 'Data Abstract Schema (*'+daFileExtSchemaFile+')|*'+daFileExtSchemaFile+'|All Files (*.*)|*.*', daFileExtSchemaFile, 'Save Schema '+schema.Name, '', TRUE)
+ then Exit;
+ end
+ else begin
+ sfname := GetTempFileName(daFileExtSchemaFile);
+ end;
+
+ schema.SaveToFile(sfname, pfXML);
+ {$IFDEF DELPHI2009UP}
+ FileAge(sfname, lSchemaAge);
+ {$ELSE}
+ lSchemaAge := FileAge(sfname);
+ {$ENDIF}
+
+ cmfname := ChangeFileExt(sfname, daFileExtConnectionMgrFile);
+ connmgr.SaveToFile(cmfname, pfXML);
+
+ dadname := '';
+ if Assigned(schema.DataDictionary) then begin
+ dadname := ChangeFileExt(sfname, daFileExtDataDictionaryFile);
+ schema.DataDictionary.SaveToFile(dadname, pfXML);
+ end;
+
+ diagramname := '';
+ if Assigned(schema.Diagrams) then begin
+ diagramname := ChangeFileExt(sfname, DAFileExtDiagramsFile);
+ schema.Diagrams.SaveToFile(diagramname);
+ end;
+
+ if (Index=COMMAND_INDEX_LOAD) then Exit; // Only wants to save!
+
+ case Index of
+ COMMAND_INDEX_EDIT: begin
+ {$IFDEF FPC}
+ ShowMessage('Not implemented');
+ {$ELSE}
+ try
+ with CreatePleaseWaitForm('Running the Schema Modeler...') do try
+ Show();
+ ExecuteAndWait(GetSchemaModelerPath, '/ns /platform:Delphi /projectname:"'+GetComponent().Name+'" /autosave /schemafile:"'+sfname+'"');
+ Hide();
+ finally
+ Free();
+ end;
+
+ {$IFDEF DELPHI2009UP}
+ FileAge(sfname, lAge);
+ if lSchemaAge < lAge then begin
+ {$ELSE}
+ if lSchemaAge < FileAge(sfname) then begin
+ {$ENDIF}
+ schema.LoadFromFile(sfname, pfXML);
+ Designer.Modified();
+
+ connmgr.LoadFromFile(cmfname, pfXML);
+ lDesigner := FindRootDesigner(connmgr);
+ if Assigned(lDesigner) then lDesigner.Modified();
+
+ if dadname <> '' then begin
+ schema.DataDictionary.LoadFromFile(dadname, pfXML);
+ lDesigner := FindRootDesigner(schema.DataDictionary);
+ if Assigned(lDesigner) then lDesigner.Modified();
+ end;
+
+ if diagramname <> '' then begin
+ schema.Diagrams.LoadFromFile(diagramname);
+ lDesigner := FindRootDesigner(schema.DataDictionary);
+ if Assigned(lDesigner) then lDesigner.Modified();
+ end;
+
+ end;
+
+ finally
+ DeleteFile(sfname);
+ DeleteFile(cmfname);
+ if dadname <> '' then DeleteFile(dadname);
+ end;
+ {$ENDIF}
+ end;
+ COMMAND_INDEX_PUBLISH: begin
+ {$IFDEF FPC}
+ ShowMessage('Don''t implemented');
+ {$ELSE}
+ // search project for current unit
+ loldCurrentProject := CurrentProject;
+ // lproject
+ lproject := FindProjectByActiveModule;
+ SetActiveProject(lproject);
+ try
+ with CreatePleaseWaitForm('Running the Service Builder...') do try
+ Show();
+ {$IFDEF SB2}
+ LaunchServiceBuilderForCurrentProject('/dataabstract-import-schema /schemafile:"'+sfname+'" /schemacomponentname:"'+schema.Name+'" /ServiceName:"'+schema.Owner.Name+'"',true,true);
+ {$ELSE}
+ LaunchServiceBuilderForCurrentProject('/execute:"DataAbstract.PublishSchemaWizard" /execute-options:"Schema='+sfname+';ServiceName='+schema.Owner.Name+';SchemaComponentName='+schema.Name+'"',true,true);
+ {$ENDIF}
+ Hide();
+ finally
+ Free();
+ end;
+ finally
+ DeleteFile(sfname);
+ DeleteFile(cmfname);
+ if dadname <> '' then DeleteFile(dadname);
+ if diagramname <> '' then DeleteFile(diagramname);
+ if loldCurrentProject <> CurrentProject then SetActiveProject(loldCurrentProject);
+ end;
+ {$ENDIF}
+ end;
+ COMMAND_INDEX_SAVE: exit;
+ end;
+ end
+ else if (Index=COMMAND_INDEX_GENCODE) then begin
+ GenerateSchemaUnits(schema);
+ end
+ else begin
+ if PromptForFileName(sfname, 'Data Abstract Schema (*'+daFileExtSchemaFile+')|*'+daFileExtSchemaFile+'|All Files (*.*)|*.*', daFileExtSchemaFile, 'Load Schema') then begin
+ schema.LoadFromFile(sfname, pfXML);
+ Designer.Modified;
+ end;
+ end;
+end;
+
+function TDASchemaEditor.GetVerb(Index: Integer): string;
+begin
+ case Index of
+ COMMAND_INDEX_SEPARATOR_1,
+ COMMAND_INDEX_SEPARATOR_2 : result := '-';
+ COMMAND_INDEX_EDIT : result := 'Edit '+GetComponent.Name;
+ COMMAND_INDEX_PUBLISH : result := 'Publish '+GetComponent.Name+'...';
+ COMMAND_INDEX_SAVE : result := 'Save '+GetComponent.Name+' to Disk...';
+ COMMAND_INDEX_LOAD : result := 'Load '+GetComponent.Name+' from Disk...';
+ COMMAND_INDEX_GENCODE : result := 'Generate '+GetComponent.Name+' strongly-typed access units...';
+ COMMAND_INDEX_GENCONSTS : result := 'Copy Dataset and Command Names to Clipboard';
+ end;
+end;
+
+function TDASchemaEditor.GetVerbCount: Integer;
+begin
+ result := 8;
+end;
+
+{ TDADriverManagerEditor }
+
+procedure TDADriverManagerEditor.ExecuteVerb(Index: Integer);
+var
+ s : string;
+ i: Integer;
+ sl : IROStrings;
+ dm : TDADriverManager;
+begin
+ dm := TDADriverManager(GetComponent);
+ s := '';
+
+ case Index of
+ 0 : ShowDriverInfo(dm);
+
+ 1: begin
+ if (dm.DriverCount=0) then begin
+ MessageDlg('No drivers to unload.', mtWarning, [mbOK], 0);
+ end
+ else begin
+ dm.UnloadAllDrivers;
+ MessageDlg('Drivers unloaded.', mtInformation, [mbOK], 0);
+ end;
+ end;
+
+ 2 : begin
+ if (dm.DriverDirectory='') then begin
+ MessageDlg('DriverDirectory is empty. Cannot load drivers.', mtWarning, [mbOK], 0);
+ end
+ else begin
+ dm.ListDrivers(dm.DriverDirectory, sl);
+ if (sl.Count=0) then begin
+ MessageDlg('No drivers were found', mtInformation, [mbOK], 0);
+ end
+ else begin
+ {$IFNDEF FPC}
+ with CreatePleaseWaitForm('Loading Drivers...') do try
+ {$ENDIF}
+ for i := 0 to sl.Count-1 do try
+ {$IFNDEF FPC}
+ Show(Format('Loading %s...',[ExtractFileName(sl[i])]));
+ {$ENDIF}
+ dm.LoadDriver(sl[i]);
+ except
+ on E:EDADriverAlreadyLoaded do;
+ on E:EDASchemaModelerOnly do;
+ on E:Exception do begin
+ {$IFNDEF FPC}
+ Hide();
+ {$ENDIF}
+ ShowMessageFmt('There was an error loading the %s driver:'#13#13'%s: %s',[ExtractFileName(sl[i]),E.ClassName,E.Message]);
+ end;
+ end; { for }
+ {$IFNDEF FPC}
+ finally
+ free;
+ end;
+ {$ENDIF}
+ MessageDlg(IntToStr(dm.DriverCount)+' Drivers loaded.', mtInformation, [mbOK], 0);
+ end;
+ end;
+ end;
+ end;
+end;
+
+function TDADriverManagerEditor.GetVerb(Index: Integer): string;
+var dir : string;
+begin
+ case Index of
+ 0 : result := 'Display Driver Information...';
+ 1 : result := 'Unload All Drivers';
+ 2 : begin
+ dir := TranslateFileName(TDADriverManager(GetComponent).DriverDirectory);
+ if (dir='')
+ then dir := '';
+ result := 'Load Drivers in '+dir;
+ end;
+ end;
+end;
+
+function TDADriverManagerEditor.GetVerbCount: Integer;
+begin
+ result := 3;
+end;
+
+{ TDAConnectionManagerEditor }
+
+procedure TDAConnectionManagerEditor.ExecuteVerb(Index: Integer);
+var connmgr : TDAConnectionManager;
+ sfname : string;
+begin
+ connmgr := GetComponent as TDAConnectionManager;
+ sfname := connmgr.Name+daFileExtConnectionMgrFile;
+
+ case Index of
+ 0:begin
+ {$IFDEF FPC}
+ EditCollection(connmgr, connmgr.Connections, 'Connections');
+ {$ELSE}
+ ShowCollectionEditor(Designer, connmgr, connmgr.Connections, 'Connections');
+ {$ENDIF}
+ end;
+
+ 1 : {separator};
+
+ 2 : begin
+ if not PromptForFileName(sfname, 'Data Abstract Connections (*'+daFileExtConnectionMgrFile+')|*'+daFileExtConnectionMgrFile+'|All Files (*.*)|*.*', daFileExtConnectionMgrFile, 'Save Connections '+connmgr.Name, '', TRUE)
+ then Exit;
+
+ connmgr.SaveToFile(sfname, pfXML);
+ end;
+
+ 3: begin
+ if not PromptForFileName(sfname, 'Data Abstract Connections (*'+daFileExtConnectionMgrFile+')|*'+daFileExtConnectionMgrFile+'|All Files (*.*)|*.*', DAFileExtConnectionMgrFile, 'Load Connections '+connmgr.Name, '')
+ then Exit;
+
+ connmgr.LoadFromFile(sfname, pfXML);
+ Designer.Modified;
+ end;
+ end;
+end;
+
+function TDAConnectionManagerEditor.GetVerb(Index: Integer): string;
+begin
+ case Index of
+ 0 : result := 'Connection List Editor';
+ 1 : result := '-';
+ 2 : result := 'Save '+GetComponent.Name+' To Disk...';
+ 3 : result := 'Load '+GetComponent.Name+' From Disk...';
+ end;
+end;
+
+function TDAConnectionManagerEditor.GetVerbCount: Integer;
+begin
+ result := 4;
+end;
+
+{ TDADataRequestAccessParamEditor }
+
+procedure CheckCondition(InvalidSituation : boolean; const anErrorMessage : string);
+begin
+ if InvalidSituation then begin
+ MessageDlg(anErrorMessage, mtError, [mbOK], 0);
+ Abort;
+ end;
+end;
+
+
+{ TDADataRequestCallMethodNameEditor }
+
+function TDADataRequestCallMethodNameEditor.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList]
+end;
+
+function TDADataRequestCallMethodNameEditor.RetrieveLibrary : TRODLLibrary;
+var datamethod : TDARemoteRequest;
+ //datatable : TDADataTable;
+ //adapter : TDADataAdapter;
+ rs : TRORemoteService;
+ svcname : string;
+begin
+ //result := NIL;
+
+ // Sets the variable we need
+ datamethod := GetComponent(0) as TDARemoteRequest;
+ rs := datamethod.RemoteService;
+
+ CheckCondition(rs=NIL, 'RemoteService must be assigned.');
+
+ svcname := Trim(rs.ServiceName);
+ CheckCondition(svcname='', rs.Name+'.ServiceName must be assigned.');
+
+ {adapter := datamethod.Owner.Adapter;
+ CheckCondition(adapter=NIL, 'The Adpater property is not set');}
+
+ result := rs.GetRODLLibrary;
+end;
+
+procedure TDADataRequestCallMethodNameEditor.GetValues(Proc: TGetStrProc);
+var lib : TRODLLibrary;
+ i,j : integer;
+ svc : TRODLService;
+ svcintf : TRODLServiceInterface;
+ svcname : string;
+ sl : IROStrings;
+ anchestors : TList;
+ method: TDARemoteRequest;
+begin
+ lib := RetrieveLibrary;
+ if not assigned(lib) then
+ raise Exception.Create('RODL library could npt be retrieved from server.');
+
+ anchestors := TList.Create;
+ try
+
+ method := GetComponent(0) as TDARemoteRequest;
+ svcname := method.RemoteService.ServiceName;
+
+ svc := lib.FindService(svcname);
+ if not assigned(svc) then raise Exception.Create('Service "'+svcname+'" could not be found in RODL.');
+
+ repeat
+ anchestors.Add(svc.Default);
+ if (Trim(svc.Ancestor)<>'') then begin
+ svc := lib.FindService(svc.Ancestor);
+ if not assigned(svc) then break;
+ end
+ else break;
+ until false;
+
+ // Methods
+ sl := NewROStrings;
+ sl.Sorted := TRUE;
+
+ for i := 0 to anchestors.Count-1 do begin
+ svcintf := TRODLServiceInterface(anchestors[i]);
+
+ for j := 0 to (svcintf.Count-1) do begin
+ {if (svcintf.Items[i].Result=NIL) or
+ not (StrToDataType(svcintf.Items[i].Result.DataType)=method.Owner.Adapter.TargetDataType)
+ then Continue;}
+
+ sl.Add(svcintf.Items[j].Name);
+ end;
+ end;
+
+ for i := 0 to (sl.Count-1)
+ do Proc(sl[i]);
+
+ finally
+ anchestors.Free;
+ end;
+end;
+
+procedure TDADataRequestCallMethodNameEditor.SetValue(const Value: string);
+var
+ lRemoteRequest: TDARemoteRequest;
+ lOldMethodName: String;
+begin
+ lRemoteRequest := TDARemoteRequest(GetComponent(0));
+ lOldMethodName := lRemoteRequest.MethodName;
+ lRemoteRequest.MethodName := Value;
+ if (Trim(lOldMethodName) <> Trim(Value)) then begin
+ {$IFNDEF FPC}
+ Designer.Modified();
+ {$ELSE}
+ PropertyHook.Modified(lRemoteRequest);
+ {$ENDIF}
+ end;
+
+ if (Trim(Value)='') then Exit;
+
+ if MessageDlg('Do you want to retrieve the parameters of the method '+Value+'?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
+ {$IFNDEF FPC}
+ with CreatePleaseWaitForm('Retrieving Parameters...') do begin
+ {$ENDIF}
+ lRemoteRequest.RefreshParams(true);
+ {$IFNDEF FPC}
+ Hide();
+ {$ENDIF}
+ {$IFNDEF FPC}
+ Designer.Modified();
+ {$ELSE}
+ PropertyHook.Modified(lRemoteRequest);
+ {$ENDIF FPC}
+ {$IFNDEF FPC}
+ end;
+ {$ENDIF}
+ end;
+end;
+
+{ TDALoginAwareComponentEditor }
+
+procedure TDALoginAwareComponentEditor.OnLoginNeeded(Sender: TROTransportChannel; anException: Exception; var aRetry: Boolean);
+begin
+ aRetry := TROLoginNeededForm.Execute(fRemoteService);
+end;
+
+function TDALoginAwareComponentEditor.GetAdapterSchema(aAdapter: TDABaseDataAdapter): TDASchema;
+var
+ lSaved: TROExceptionEvent;
+begin
+ if (aAdapter is TDARemoteDataAdapter) then begin
+ if TDARemoteDataAdapter(aAdapter).RemoteService.Channel = nil then
+ raise EROException.Create('Channel not assigned');
+ lSaved := TDARemoteDataAdapter(aAdapter).RemoteService.Channel.OnLoginNeeded;
+ TDARemoteDataAdapter(aAdapter).RemoteService.Channel.OnLoginNeeded := OnLoginNeeded;
+ try
+ fRemoteService := TDARemoteDataAdapter(aAdapter).RemoteService;
+ result := aAdapter.ReadSchema(True);
+ finally
+ TDARemoteDataAdapter(aAdapter).RemoteService.Channel.OnLoginNeeded := lSaved;
+ end;
+ end
+ else begin
+ result := aAdapter.ReadSchema(True);
+ end;
+end;
+
+{ TDARemoteDataAdapterEditor }
+
+procedure TDARemoteDataAdapterEditor.ExecuteVerb(Index: Integer);
+var
+ lAdapter: TDARemoteDataAdapter;
+begin
+ lAdapter := TDARemoteDataAdapter(GetComponent);
+ case Index of
+ 0: lAdapter.SetupDefaultRequest();
+ 1: lAdapter.SetupDefaultRequestV3();
+ 2: exit{ Separator };
+ 3: if not HookUpDataTables() then exit;
+ 4: if not TDataTableWizards.CreateDataTables(Designer, lAdapter, GetAdapterSchema(lAdapter), Point(0,0)) then exit;
+ end;
+ Designer.Modified();
+end;
+
+function TDARemoteDataAdapterEditor.GetVerb(Index: Integer): string;
+begin
+ case Index of
+ 0 : result := '&Reset Calls to Default';
+ 1 : result := 'Reset Calls to Default (Legacy v&3.0)';
+ 2 : result := '-';
+ 3 : result := '&Hook up Data Tables...';
+ 4 : result := '&Create Data Tables...';
+ end;
+end;
+
+function TDARemoteDataAdapterEditor.GetVerbCount: Integer;
+begin
+ result := 5;
+end;
+
+{ TDADataTableEditor }
+
+procedure TDADataTableEditor.ExecuteVerb(Index: Integer);
+var
+ dt: TDADataTable;
+ lTempSchema: TDASchema;
+ lTempSchemaDataSet: TDADataset;
+ s: string;
+ lSaved: TROExceptionEvent;
+ lDA: TDALocalDataAdapter;
+begin
+ dt := TDADataTable(GetComponent);
+
+ case Index of
+ 0:begin
+ {$IFDEF FPC}
+ EditCollection(dt, dt.Fields, 'Fields');
+ {$ELSE}
+ ShowCollectionEditor(Designer, dt, dt.Fields, 'Fields');
+ {$ENDIF}
+ end;
+ 1:{ Seperator };
+ 2:begin
+ if not (MessageDlg('Do you want to retrieve the schema of '+dt.Name+'?'#13+
+ 'This will overwrite the current field and parameter settings.',
+ mtWarning, [mbYes, mbNo], 0)=mrYes) then Exit;
+
+ if dt.LogicalName = '' then
+ raise Exception.Create('LogicalName must be set.');
+
+ if dt.RemoteFetchEnabled then begin
+ if assigned(dt.RemoteDataAdapter) then begin
+ (dt.RemoteDataAdapter as TDABaseDataAdapter).CheckProperties();
+ if dt.RemoteDataAdapter is TDARemoteDataAdapter then begin
+ fRemoteService := (dt.RemoteDataAdapter as TDARemoteDataAdapter).RemoteService;
+ lSaved := fRemoteService.Channel.OnLoginNeeded;
+ fRemoteService.Channel.OnLoginNeeded := OnLoginNeeded;
+ (dt.RemoteDataAdapter as TDARemoteDataAdapter).FlushSchema;
+ try
+ dt.LoadSchema(true, true);
+ finally
+ fRemoteService.Channel.OnLoginNeeded := lSaved;
+ end;
+ end
+ else if dt.RemoteDataAdapter is TDALocalDataAdapter then begin
+ lDA := TDALocalDataAdapter(dt.RemoteDataAdapter);
+ lDA.ServiceInstance := GetServiceInstance(lDA.ServiceName);
+ try
+ dt.LoadSchema(true, true);
+ finally
+ lDA.ServiceInstance := nil;
+ end;
+ end;
+ end
+ else begin
+ MessageDlg('RemoteDataAdapter must be assigned.', mtError, [mbOK], 0);
+ Exit;
+ end;
+ end
+ else begin
+ if assigned(dt.LocalSchema) and assigned(dt.LocalDataStreamer) then begin
+ dt.loadschema(True, True);
+ //ds := dt.LocalSchema.Datasets.DatasetByName(dt.LogicalName);
+ //dt.Fields.AssignFieldCollection(ds.Fields);
+ //dt.Params.AssignParamCollection(ds.Params);
+ end
+ else begin
+ MessageDlg('LocalSchema/LocalDataStreamer must be assigned.', mtError, [mbOK], 0);
+ Exit;
+ end;
+ end;
+
+ s := 'Schema loaded successfully. '+IntToStr(dt.Fields.Count)+' fields';
+ if (dt.Params.Count>0) then s := s+' and '+IntToStr(dt.Params.Count)+' params';
+ s := s+' have been created. Original lookup- and client calculated fields have been preserved.';
+
+ MessageDlg(s, mtInformation, [mbOK], 0);
+
+ Designer.Modified;
+ end;
+
+ 3: if TDADataTableMasterLinkWizard.ExecuteWizard(dt,{$IFDEF FPC}Designer.PropertyEditorHook{$ELSE} Designer {$ENDIF}) then
+ Designer.Modified();
+ 4:{ Seperator };
+ 5:begin
+ lTempSchema := TDASchema.Create(NIL);
+ try
+ lTempSchema.Name := MakeValidIdentifier(dt.LogicalName);
+ if lTempSchema.Name = '' then lTempSchema.Name := dt.Name;
+
+ lTempSchemaDataSet := lTempSchema.Datasets.Add();
+ lTempSchemaDataSet.Name := lTempSchema.Name;
+ lTempSchemaDataSet.Fields.AssignFieldCollection(dt.Fields);
+ GenerateSchemaUnits(lTempSchema);
+ finally
+ lTempSchema.Free;
+ end;
+ end;
+ 6:{ Seperator };
+ 7:begin
+ with TDAIdeData.Create(nil) do try
+ if dlg_OpenBriefcase.Execute then begin
+ dt.LoadFromFile(dlg_OpenBriefcase.Filename);
+ Designer.Modified();
+ end;
+ finally
+ Free();
+ end;
+ end;
+ 8:begin
+ if not dt.Active then
+ raise Exception.Create('DataTable is not active.');
+
+ with TDAIdeData.Create(nil) do try
+ if dlg_SaveBriefcase.Execute then begin
+ dt.SaveToFile(dlg_SaveBriefcase.Filename);
+ end;
+ finally
+ Free();
+ end;
+ end;
+ 10:begin
+ if dt.LogicalName = '' then
+ raise Exception.Create('LogicalName must be set.');
+
+ if dt.RemoteFetchEnabled then
+ if assigned(dt.RemoteDataAdapter) then begin
+ (dt.RemoteDataAdapter as TDABaseDataAdapter).CheckProperties();
+ if dt.RemoteDataAdapter is TDARemoteDataAdapter then begin
+ fRemoteService := (dt.RemoteDataAdapter as TDARemoteDataAdapter).RemoteService;
+ lSaved := fRemoteService.Channel.OnLoginNeeded;
+ fRemoteService.Channel.OnLoginNeeded := OnLoginNeeded;
+ try
+ dt.Open();
+ finally
+ fRemoteService.Channel.OnLoginNeeded := lSaved;
+ end;
+ end
+ else if dt.RemoteDataAdapter is TDALocalDataAdapter then begin
+ lDA := TDALocalDataAdapter(dt.RemoteDataAdapter);
+ SetDefaultConnection(lDA.ServiceName);
+ lDA.ServiceInstance := GetServiceInstance(lDA.ServiceName);
+ try
+ dt.Open();
+ finally
+ lDA.ServiceInstance := nil;
+ end;
+ end;
+ end
+ else if assigned(dt.LocalSchema) and assigned(dt.LocalDataStreamer) then begin
+ dt.Open();
+ end;
+ Designer.Modified;
+ end;
+
+ end; { case }
+end;
+
+function TDADataTableEditor.GetVerb(Index: Integer): string;
+begin
+ case Index of
+ 0 : result := 'Field Collection Editor';
+ 1 : result := '-';
+ //2 : result := 'Dynamic Method Binding Setup Wizard (Legacy v3.0)';
+ //3 : result := '-';
+ 2 : result := 'Retrieve DataTable Schema';
+ 3 : result := 'Master/Detail Wizard';
+ 4 : result := '-';
+ 5 : result := 'Generate Business Class...';
+ 6 : result := '-';
+ 7 : result := 'Load Data from briefcase file...';
+ 8 : result := 'Save Data to briefcase file...';
+ 9 : result := '-';
+ 10 : result := 'Get Design-Time Data';
+ end;
+end;
+
+function TDADataTableEditor.GetVerbCount: Integer;
+begin
+ result := 9;
+ if not TDADataTable(GetComponent).Active and (assigned(TDADataTable(GetComponent).RemoteDataAdapter)) then inc(result,2);
+end;
+
+{ TDABusinessProcessorCommandProperty }
+
+function TDABusinessProcessorCommandProperty.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList, paSortList]
+end;
+
+procedure TDABusinessProcessorCommandProperty.GetValues(Proc: TGetStrProc);
+var biz : TDABusinessProcessor;
+ i : integer;
+ list : IROStrings;
+begin
+ biz := GetComponent(0) as TDABusinessProcessor;
+ if (biz.Schema=NIL) then Exit;
+
+ list := NewROStrings;
+ for i := 0 to (biz.Schema.Commands.Count-1) do
+ list.Add(biz.Schema.Commands[i].Name);
+
+ list.Sorted := TRUE;
+
+ for i := 0 to (list.Count-1) do
+ Proc(list[i]);
+end;
+
+type
+ TPersistentCracker = class(TPersistent);
+{ TDACollectionProperty }
+
+procedure TDACollectionProperty.Edit;
+var coll : TCollection;
+begin
+ coll := GetObjectProp(GetComponent(0), GetName) as TCollection;
+
+ if (coll=NIL) then ShowMessage('no way!')
+ else showmessage(GetName+' has #'+INtToSTr(coll.count)+' '+TComponent(integer(coll.Owner)).ClassName);
+ {$IFDEF FPC}
+ EditCollection(TComponent(GetComponent(0)),coll, GetName);
+ {$ELSE}
+ ShowCollectionEditor(Designer, TComponent(GetComponent(0)), coll, GetName);
+ {$ENDIF}
+end;
+
+function TDACollectionProperty.GetAttributes: TPropertyAttributes;
+begin
+ result := [paDialog, paReadOnly];
+end;
+{ TDABusinessProcessorRefDatasetProperty }
+
+function TDABusinessProcessorRefDatasetProperty.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList, paSortList]
+end;
+
+procedure TDABusinessProcessorRefDatasetProperty.GetValues( Proc: TGetStrProc);
+var biz : TDABusinessProcessor;
+ i : integer;
+ list : IROStrings;
+begin
+ biz := GetComponent(0) as TDABusinessProcessor;
+ if (biz.Schema=NIL) then Exit;
+
+ list := NewROStrings;
+ for i := 0 to (biz.Schema.Datasets.Count-1) do
+ list.Add(biz.Schema.Datasets[i].Name);
+
+ list.Sorted := TRUE;
+
+ for i := 0 to (list.Count-1) do
+ Proc(list[i]);
+end;
+
+{ TDADataTableLogicalNameEditor }
+
+function TDADataTableLogicalNameEditor.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList, paSortList]
+end;
+
+function TDADataTableLogicalNameEditor.GetSchema: TDASchema;
+var
+ lda: TDALocalDataAdapter;
+begin
+ Result:=nil;
+ try
+ with TDADataTable(GetComponent(0)) do
+ if not RemoteFetchEnabled then
+ Result := LocalSchema
+ else if (RemoteDataAdapter <> nil) then begin
+ if (RemoteDataAdapter is TDARemoteDataAdapter) then
+ Result:= (RemoteDataAdapter as TDARemoteDataAdapter).Schema
+ else if (RemoteDataAdapter is TDALocalDataAdapter) then begin
+ lda := (RemoteDataAdapter as TDALocalDataAdapter);
+ lda.ServiceInstance := GetServiceInstance(lda.ServiceName);
+ try
+ Result:= (RemoteDataAdapter as TDALocalDataAdapter).Schema;
+ finally
+ lda.ServiceInstance := nil;
+ end;
+ end;
+ end;
+ except
+ // hide exception, when RDA can't receive SCHEMA
+ end;
+end;
+
+procedure TDADataTableLogicalNameEditor.GetValues(Proc: TGetStrProc);
+var i : integer;
+ _Schema: TDASchema;
+begin
+ _Schema:= GetSchema;
+ if _Schema <> nil then begin
+ for i := 0 to (_Schema.Datasets.Count-1) do
+ if _Schema.Datasets[i].IsPublic then Proc(_Schema.Datasets[i].Name);
+ for i := 0 to (_Schema.UnionDataTables.Count-1) do
+ if _Schema.UnionDataTables[i].IsPublic then Proc(_Schema.UnionDataTables[i].Name);
+ for i := 0 to (_Schema.JoinDataTables.Count-1) do
+ if _Schema.JoinDataTables[i].IsPublic then Proc(_Schema.JoinDataTables[i].Name);
+ end;
+end;
+
+{ TDADataTableLocalConnection }
+
+function TDADataTableLocalConnection.GetAttributes: TPropertyAttributes;
+begin
+ if (TDADataTable(GetComponent(0)).LocalSchema<>NIL) and (TDADataTable(GetComponent(0)).LocalSchema.ConnectionManager<>NIL)
+ then result := [paValueList]
+ else result := []
+end;
+
+procedure TDADataTableLocalConnection.GetValues(Proc: TGetStrProc);
+var i : integer;
+begin
+ with TDADataTable(GetComponent(0)) do begin
+ if (LocalSchema=NIL) or (LocalSchema.ConnectionManager=NIL) then Exit;
+
+ for i := 0 to (LocalSchema.ConnectionManager.Connections.Count-1) do
+ Proc(LocalSchema.ConnectionManager.Connections[i].Name);
+ end;
+end;
+
+{ TDADriverManagerDirectory }
+
+function TDADriverManagerDirectory.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList]
+end;
+
+const SelectDirOption = '';
+
+procedure TDADriverManagerDirectory.GetValues(Proc: TGetStrProc);
+begin
+ inherited;
+
+ Proc(alias_ModuleDir);
+ Proc(alias_System);
+ Proc(SelectDirOption);
+end;
+
+procedure TDADriverManagerDirectory.SetValue(const Value: string);
+var dir : string;
+begin
+ if (Value=SelectDirOption) then begin
+ if SelectDirectory(dir, [sdPrompt, sdAllowCreate], 0)
+ then inherited SetValue(dir);
+ end
+
+ else if (Value=alias_DABinDir) then begin
+ dir := IncludeTrailingPathDelimiter(Copy(GetDllPath, 1, Length(GetDLLPath)-7))+'Bin';
+ inherited SetValue(dir);
+ end
+
+ else inherited;
+end;
+
+{ TDADataDictionaryEditor }
+
+procedure TDADataDictionaryEditor.ExecuteVerb(Index: Integer);
+var
+ dict: TDADataDictionary;
+ sfname: string;
+begin
+ inherited;
+
+ dict := GetComponent as TDADataDictionary;
+ sfname := dict.Name+DAFileExtDataDictionaryFile;
+
+ case Index of
+ 0: {$IFDEF FPC}
+ EditCollection(GetComponent(), dict.Fields, 'Fields');
+ {$ELSE}
+ ShowCollectionEditor(Designer, GetComponent(), dict.Fields, 'Fields');
+ {$ENDIF}
+ 1:{separater};
+ 2:if PromptForFileName(sfname, 'Data Abstract DataDictionaries (*'+DAFileExtDataDictionaryFile+')|*'+DAFileExtDataDictionaryFile+'|All Files (*.*)|*.*', DAFileExtDataDictionaryFile, 'Save DataDictionary '+dict.Name, '', TRUE) then
+ dict.SaveToFile(sfname, pfXML);
+ 3:if PromptForFileName(sfname, 'Data Abstract DataDictionaries (*'+DAFileExtDataDictionaryFile+')|*'+DAFileExtDataDictionaryFile+'|All Files (*.*)|*.*', DAFileExtDataDictionaryFile, 'Load DataDictionary '+dict.Name, '') then begin
+ dict.LoadFromFile(sfname, pfXML);
+ Designer.Modified;
+ end;
+ end;
+end;
+
+function TDADataDictionaryEditor.GetVerb(Index: Integer): string;
+begin
+ case Index of
+ 0:result := 'DataDictionary Editor';
+ 1:result := '-';
+ 2: result := 'Save '+GetComponent.Name+' to Disk...';
+ 3: result := 'Load '+GetComponent.Name+' from Disk...';
+ end;
+end;
+
+function TDADataDictionaryEditor.GetVerbCount: Integer;
+begin
+ result := 4;
+end;
+
+{ TDAClientDataModuleEditor }
+
+{ TDADataTableMasterDetailProps }
+
+procedure TDADataTableMasterDetailProps.Edit;
+begin
+ {$IFDEF FPC}
+ if TDADataTableMasterLinkWizard.ExecuteWizard(TDADataTable(GetComponent(0)), PropertyHook) then
+ Modified;
+ {$ELSE}
+ if TDADataTableMasterLinkWizard.ExecuteWizard(TDADataTable(GetComponent(0)), Designer) then
+ Designer.Modified();
+ {$ENDIF}
+end;
+
+function TDADataTableMasterDetailProps.GetAttributes: TPropertyAttributes;
+begin
+ result := [paDialog]
+end;
+
+
+{ TDACollectionItemDatasetNameEditor }
+
+function TDACollectionItemDatasetNameEditor.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList, paSortList]
+end;
+
+procedure TDACollectionItemDatasetNameEditor.GetValues(Proc: TGetStrProc);
+var schema : TDASchema;
+ i : integer;
+begin
+ schema := TSearcheableCollection(TCollectionItem(GetComponent(0)).Collection).Owner as TDASchema;
+ for i := 0 to schema.Datasets.Count-1 do begin
+ Proc(schema.Datasets[i].Name);
+ end;
+end;
+
+{ TDADesigntimeCallEditor }
+
+procedure TDADesigntimeCallEditor.ExecuteVerb(Index: Integer);
+begin
+ inherited;
+ (GetComponent as TDADesigntimeCall).MakeRequest;
+ ShowMessage('The call to the server was executed.');
+end;
+
+function TDADesigntimeCallEditor.GetVerb(Index: Integer): string;
+begin
+ result := 'Make Call';
+end;
+
+function TDADesigntimeCallEditor.GetVerbCount: Integer;
+begin
+ result := 1;
+end;
+
+{ TDADataTableReferenceDataTable }
+
+procedure TDADataTableReferenceDataTable.GetValues(Proc: TGetStrProc);
+begin
+ {$IFDEF FPC}
+ with PropertyHook do
+ {$ELSE}
+ With Designer do
+ {$ENDIF}
+ begin
+ GetComponentNames(GetTypeData(TypeInfo(TDADataTable)), Proc);
+ GetComponentNames(GetTypeData(TypeInfo(TDataset)), Proc);
+ end;
+end;
+
+{ TDALookupSourceProperty }
+
+function TDALookupSourceProperty.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList, paSortList, paMultiSelect];
+end;
+
+procedure TDALookupSourceProperty.GetValues(Proc: TGetStrProc);
+var
+ i: integer;
+begin
+ with GetComponent(0) as TDAField do
+ for i := 0 to (FieldCollection.Count - 1) do
+ Proc(FieldCollection[i].Name);
+end;
+
+{ TDALookupDestProperty }
+
+function TDALookupDestProperty.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList, paSortList, paMultiSelect];
+end;
+
+procedure TDALookupDestProperty.GetValues(Proc: TGetStrProc);
+var
+ lValues: TStringList;
+ i: Integer;
+begin
+ lValues := TStringList.Create;
+ with GetComponent(0) as TDAField do try
+ if Assigned(LookupSource) and Assigned(LookupSource.Dataset) then begin
+ LookupSource.DataSet.GetFieldNames(lValues);
+ for i := 0 to lValues.Count - 1 do
+ Proc(lValues[i]);
+ end;
+ finally
+ lValues.free;
+ end;
+end;
+
+{ TDALookupResultFieldProperty }
+
+function TDALookupResultFieldProperty.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList, paSortList];
+end;
+
+procedure TDALookupResultFieldProperty.SetValue(const Value: string);
+var
+ lResultField, lLookupField: TDAField;
+begin
+ lResultField := GetComponent(0) as TDAField;
+ if Assigned(lResultField.LookupSource) then begin
+ with TDADataSource(lResultField.LookupSource).DataTable do
+ lLookupField := FindField(Value);
+ if Assigned(lLookupField) then begin
+ lResultField.DataType := lLookupField.DataType;
+ lResultField.Size := lLookupField.Size;
+ end;
+ end;
+
+ inherited;
+end;
+
+{ TDABaseDataAdapterEditor }
+
+procedure TDABaseDataAdapterEditor.ExecuteVerb(Index: Integer);
+var
+ lAdapter: TDABaseDataAdapter;
+begin
+ lAdapter := TDABaseDataAdapter(GetComponent);
+ if lAdapter is TDALocalDataAdapter then TDALocalDataAdapter(lAdapter).ServiceInstance := GetServiceInstance(TDALocalDataAdapter(lAdapter).ServiceName);
+ try
+ case Index of
+ 0: if not HookUpDataTables() then exit;
+ 1: if not TDataTableWizards.CreateDataTables(Designer, lAdapter, GetAdapterSchema(lAdapter), Point(0,0)) then exit;
+ end;
+ finally
+ if lAdapter is TDALocalDataAdapter then TDALocalDataAdapter(lAdapter).ServiceInstance := nil;
+ end;
+ Designer.Modified();
+end;
+
+procedure TDABaseDataAdapterEditor.GetDataTables(
+ const aName: string);
+begin
+ fDataTables.Add(aName);
+end;
+
+function TDABaseDataAdapterEditor.GetVerb(Index: Integer): string;
+begin
+ case Index of
+ 0 : result := '&Hook up Data Tables...';
+ 1 : result := '&Create Data Tables...';
+ end;
+end;
+
+function TDABaseDataAdapterEditor.GetVerbCount: Integer;
+begin
+ result := 2;
+end;
+
+function TDABaseDataAdapterEditor.HookUpDataTables: boolean;
+var
+ lForm: TDASelectDataTablesForm;
+ i: integer;
+ {$IFDEF FPC}
+ ldesigner: TPropertyEditorHook;
+ {$ELSE}
+ ldesigner: IDesigner;
+ {$ENDIF}
+begin
+ {$IFDEF FPC}
+ ldesigner:= Designer.PropertyEditorHook;
+ {$ELSE}
+ ldesigner := Designer;
+ {$ENDIF}
+ fDataTables := TStringList.Create;
+ try
+ fDataTables.Sorted := true;
+ lDesigner.GetComponentNames(GetTypeData(TypeInfo(TDADataTable)), GetDataTables);
+ if fDataTables.Count > 0 then begin
+ lForm := TDASelectDataTablesForm.Create(nil);
+ try
+ for i := 0 to fDataTables.Count - 1 do begin
+ lForm.lb_DataTables.Items.AddObject(fDataTables[i], nil);
+ lForm.lb_DataTables.Checked[lForm.lb_DataTables.Items.Count-1] := not assigned((lDesigner.GetComponent(fDataTables[i]) as TDADataTable).RemoteDataAdapter);
+ end;
+ lForm.UpdateCheckBoxState();
+ lForm.OkButtonCaption := '&Hook Up';
+ result := (lForm.ShowModal() = mrOk);
+ if result then begin
+ for i := 0 to lForm.lb_DataTables.Items.Count - 1 do
+ if lForm.lb_DataTables.Checked[i] then
+ (lDesigner.GetComponent(lForm.lb_DataTables.Items[i]) as TDADataTable).RemoteDataAdapter := TDABaseDataAdapter(GetComponent);
+ end;
+ finally
+ FreeAndNil(lForm);
+ end;
+ end
+ else begin
+ result := false;
+ ShowMessage('No data tables were found on module.')
+ end;
+ finally
+ FreeAndNil(fDataTables);
+ end;
+end;
+
+{ TDALocalDataAdapterServiceEditor }
+
+function TDALocalDataAdapterServiceEditor.GetRODL: TRODLLibrary;
+var prj : {$IFDEF FPC}TLazProject{$ELSE}IOTAProject{$ENDIF};
+ fname,
+ src: string;
+ lReader: TXMLToRODL;
+begin
+ result := nil;
+ prj := CurrentProject;
+ if Assigned(prj) then begin
+ src := ReadModuleSource({$IFDEF FPC}prj.MainFile{$ELSE}prj{$ENDIF});
+ fname := ExtractRODLFileName(src);
+ if fname <> '' then
+ begin
+ fname := ModuleDir(prj)+fname;
+ lReader := TXMLToRODL.Create;
+ try
+ result := lReader.ReadFromFile(fname);
+ finally
+ lReader.Free;
+ end;
+ end;
+ end;
+end;
+
+function TDALocalDataAdapterServiceEditor.GetAttributes: TPropertyAttributes;
+begin
+ result := [paValueList, paSortList];
+end;
+
+procedure TDALocalDataAdapterServiceEditor.GetValues(Proc: TGetStrProc);
+var
+ lRODL: TRODLLibrary;
+ i: integer;
+begin
+ lRODL := GetRODL;
+ if lRODL <> nil then
+ for i := 0 to lRODL.ServiceCount - 1 do
+ Proc(lRODL.Services[i].Name);
+end;
+
+{$IFDEF FPC}
+function FindDataAbstractService(aServiceName: string): TDataAbstractService;
+{
+var
+ prj : TLazProject;
+ lModule: TLazProjectFile;
+ lDComp: TComponent;
+ i, j: integer;
+ lDAService: TDataAbstractService;
+ Des: TIDesigner;
+ ceDes: TComponentEditorDesigner;
+ peh: TPropertyEditorHook;
+ }
+begin
+ Result := nil;
+ {
+ prj := CurrentProject;
+ lModule := nil;
+ for i := 0 to prj.FileCount-1 do begin
+ if SameText(ExtractFileName(prj.Files[i].Filename), aServiceName+'_impl.pas') then begin
+ lModule := prj.Files[i];
+ break;
+ end;
+ end;
+
+ if lModule = nil then begin
+ Exit;
+ end;
+ Des := LazarusIDE.GetDesignerWithProjectFile(lModule,True);
+ if Des = nil then begin
+ showMessage('Des = nil');
+ Exit;
+ end;
+ }
+end;
+
+{$ELSE}
+function FindDataAbstractService(aServiceName: string): TDataAbstractService;
+var
+ prj : IOTAProject;
+ lModuleInf: IOTAModuleInfo;
+ lModule: IOTAModule;
+ lSrv: IOTAModuleServices;
+ lFormEditor: IOTAFormEditor;
+ lComp: IOTAComponent;
+ lNComp: INTAComponent;
+ lDComp: TComponent;
+ i, j: integer;
+ lDAService: TDataAbstractService;
+begin
+ Result := nil;
+ prj := CurrentProject;
+ if Supports(BorlandIDEServices, IOTAModuleServices, lSrv) then
+ for i := 0 to prj.GetModuleCount - 1 do begin
+ lModuleInf := prj.GetModule(i);
+ if lModuleInf.FileName <> '' then begin
+ try
+ lModule := FindModuleByUnitName(prj, lModuleInf.FileName);
+ except
+ Continue;
+ end;
+ for j := 0 to lModule.ModuleFileCount - 1 do
+ if Supports(lModule.ModuleFileEditors[j], IOTAFormEditor, lFormEditor) then begin
+ lComp := lFormEditor.GetRootComponent;
+ if Supports(lComp, INTAComponent, lNComp) then begin
+ lDComp := lNComp.GetComponent;
+ if lDComp.InheritsFrom(TDataAbstractService) then begin
+ lDAService := TDataAbstractService(lDComp);
+ if SameText(lDAService.Name, aServiceName) then begin
+ Result := lDAService;
+ Exit;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+end;
+{$ENDIF}
+
+function GetServiceInstance(aServiceName: string): IDataAbstractLocalServiceAccess;
+var
+ lDAService: TDataAbstractService;
+begin
+ Result := nil;
+ lDAService := FindDataAbstractService(aServiceName);
+ if (lDAService <> nil) then
+ if not Supports(lDAService, IDataAbstractLocalServiceAccess, Result) then Result := nil;
+end;
+
+procedure SetDefaultConnection(aServiceName: string);
+var
+ lDAService: TDataAbstractService;
+begin
+ lDAService := FindDataAbstractService(aServiceName);
+ if (lDAService <> nil) then begin
+ if not Assigned(lDAService.ServiceSchema) then
+ raise Exception.Create('For service "' + lDAService.Name + '" schema isn''t assigned');
+ if not Assigned(lDAService.ServiceSchema.ConnectionManager) then
+ raise Exception.Create('For service "' + lDAService.Name + '" schema doesn''t have connection manager');
+ lDAService.Connection :=
+ lDAService.ServiceSchema.ConnectionManager.NewConnection(lDAService.ServiceSchema.ConnectionManager.GetDefaultConnectionName);
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableEditorForm.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableEditorForm.dfm
new file mode 100644
index 0000000..1da0d2e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableEditorForm.dfm
@@ -0,0 +1,427 @@
+object DADataTableEditorForm: TDADataTableEditorForm
+ Left = 407
+ Top = 225
+ BorderStyle = bsDialog
+ BorderWidth = 5
+ Caption = '%s - DataTable Editor'
+ ClientHeight = 513
+ ClientWidth = 300
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnDestroy = FormDestroy
+ DesignSize = (
+ 300
+ 513)
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 0
+ Top = 0
+ Width = 49
+ Height = 13
+ Caption = 'DataSet:'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label2: TLabel
+ Left = 0
+ Top = 75
+ Width = 91
+ Height = 13
+ Caption = 'Get Schema Call'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label3: TLabel
+ Left = 16
+ Top = 13
+ Width = 239
+ Height = 26
+ Caption =
+ 'Select or enter the name of the dataset you want this DataTable ' +
+ 'to represent.'
+ WordWrap = True
+ end
+ object Label6: TLabel
+ Left = 0
+ Top = 179
+ Width = 73
+ Height = 13
+ Caption = 'Get Data Call'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label9: TLabel
+ Left = 8
+ Top = 283
+ Width = 98
+ Height = 13
+ Caption = 'Apply Upates Call'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label12: TLabel
+ Left = 8
+ Top = 387
+ Width = 85
+ Height = 13
+ Caption = 'Get Scripts Call'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object btn_Ok: TBitBtn
+ Left = 145
+ Top = 487
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Caption = 'Ok'
+ Default = True
+ ModalResult = 1
+ TabOrder = 0
+ OnClick = btn_OkClick
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF006600006600FF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF656565656565FF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF0066001EB2311FB133006600FF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6565659A9A9A9A9A9A65
+ 6565FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00660031C24F22B7381AB02D21B437006600FF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF656565ABABAB9E9E9E9797979C
+ 9C9C656565FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00660047D36D3BCB5E25A83B0066001BA92E1DB132006600FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF656565BFBFBFB5B5B598989865656594
+ 9494999999656565FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF006600
+ 4FD67953DE7F31B54D006600FF00FF006600179D271EAE31006600FF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FF656565C4C4C4CACACAA5A5A5656565FF00FF65
+ 65658C8C8C989898656565FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00660041C563006600FF00FFFF00FFFF00FFFF00FF00660019AA2B006600FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF656565B5B5B5656565FF00FFFF00FFFF
+ 00FFFF00FF656565939393656565FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF006600FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF006600149D210066
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF656565FF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FF6565658A8A8A656565FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF0066
+ 00006600FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FF656565656565FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FF006600006600FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FF656565656565FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object BitBtn2: TBitBtn
+ Left = 225
+ Top = 487
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Cancel = True
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 1
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object cb_DataSets: TComboBox
+ Left = 16
+ Top = 44
+ Width = 284
+ Height = 21
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 0
+ TabOrder = 2
+ OnChange = cb_DataSetsChange
+ end
+ object cb_GetSchemaMethods: TComboBox
+ Left = 16
+ Top = 91
+ Width = 284
+ Height = 21
+ Style = csDropDownList
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 0
+ TabOrder = 3
+ OnChange = cb_GetSchemaMethodsChange
+ end
+ object cb_GetDataMethods: TComboBox
+ Left = 16
+ Top = 195
+ Width = 284
+ Height = 21
+ Style = csDropDownList
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 0
+ TabOrder = 4
+ OnChange = cb_GetDataMethodsChange
+ end
+ object cb_ApplyUpdatesMethods: TComboBox
+ Left = 16
+ Top = 299
+ Width = 284
+ Height = 21
+ Style = csDropDownList
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 0
+ TabOrder = 5
+ OnChange = cb_ApplyUpdatesMethodsChange
+ end
+ object pnl_GetSchemaOptions: TPanel
+ Left = 16
+ Top = 112
+ Width = 284
+ Height = 52
+ BevelOuter = bvNone
+ TabOrder = 6
+ object Label4: TLabel
+ Left = 0
+ Top = 7
+ Width = 84
+ Height = 13
+ Caption = 'Parameter Name:'
+ end
+ object Label5: TLabel
+ Left = 0
+ Top = 31
+ Width = 83
+ Height = 13
+ Caption = 'Parameter Value:'
+ end
+ object ed_GetSchemaValue: TEdit
+ Left = 90
+ Top = 28
+ Width = 194
+ Height = 21
+ TabOrder = 0
+ end
+ object cb_GetSchemaParams: TComboBox
+ Left = 90
+ Top = 4
+ Width = 194
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 0
+ TabOrder = 1
+ end
+ end
+ object pnl_GetDataOptions: TPanel
+ Left = 16
+ Top = 216
+ Width = 284
+ Height = 52
+ BevelOuter = bvNone
+ TabOrder = 7
+ object Label7: TLabel
+ Left = 0
+ Top = 7
+ Width = 84
+ Height = 13
+ Caption = 'Parameter Name:'
+ end
+ object Label8: TLabel
+ Left = 0
+ Top = 31
+ Width = 83
+ Height = 13
+ Caption = 'Parameter Value:'
+ end
+ object ed_GetDataValue: TEdit
+ Left = 90
+ Top = 28
+ Width = 194
+ Height = 21
+ TabOrder = 0
+ end
+ object cb_GetDataParams: TComboBox
+ Left = 90
+ Top = 4
+ Width = 194
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 0
+ TabOrder = 1
+ end
+ end
+ object pnl_ApplyUpdatesOptions: TPanel
+ Left = 16
+ Top = 320
+ Width = 284
+ Height = 52
+ BevelOuter = bvNone
+ TabOrder = 8
+ object Label10: TLabel
+ Left = 0
+ Top = 7
+ Width = 84
+ Height = 13
+ Caption = 'Parameter Name:'
+ end
+ object Label11: TLabel
+ Left = 0
+ Top = 31
+ Width = 83
+ Height = 13
+ Caption = 'Parameter Value:'
+ end
+ object ed_ApplyUpdatesValue: TEdit
+ Left = 90
+ Top = 28
+ Width = 194
+ Height = 21
+ TabOrder = 0
+ end
+ object cb_ApplyUpdatesParams: TComboBox
+ Left = 90
+ Top = 4
+ Width = 194
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 0
+ TabOrder = 1
+ end
+ end
+ object cb_GetScriptsMethods: TComboBox
+ Left = 16
+ Top = 403
+ Width = 284
+ Height = 21
+ Style = csDropDownList
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 0
+ TabOrder = 9
+ OnChange = cb_GetScriptsMethodsChange
+ end
+ object pnl_GetScriptOptions: TPanel
+ Left = 16
+ Top = 424
+ Width = 284
+ Height = 52
+ BevelOuter = bvNone
+ TabOrder = 10
+ object Label13: TLabel
+ Left = 0
+ Top = 7
+ Width = 84
+ Height = 13
+ Caption = 'Parameter Name:'
+ end
+ object Label14: TLabel
+ Left = 0
+ Top = 31
+ Width = 83
+ Height = 13
+ Caption = 'Parameter Value:'
+ end
+ object ed_GetScriptsValue: TEdit
+ Left = 90
+ Top = 28
+ Width = 194
+ Height = 21
+ TabOrder = 0
+ end
+ object cb_GetScriptsParams: TComboBox
+ Left = 90
+ Top = 4
+ Width = 194
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 0
+ TabOrder = 1
+ end
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableEditorForm.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableEditorForm.pas
new file mode 100644
index 0000000..87324d1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableEditorForm.pas
@@ -0,0 +1,435 @@
+unit uDADataTableEditorForm;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, uDADataTable, StdCtrls, Buttons, ExtCtrls, uRODL, uROClasses,
+ uRORemoteService, uROClientIntf;
+
+type
+ TDADataTableEditorForm = class(TForm)
+ btn_Ok: TBitBtn;
+ BitBtn2: TBitBtn;
+ cb_DataSets: TComboBox;
+ Label1: TLabel;
+ Label2: TLabel;
+ cb_GetSchemaMethods: TComboBox;
+ Label3: TLabel;
+ cb_GetDataMethods: TComboBox;
+ cb_ApplyUpdatesMethods: TComboBox;
+ Label6: TLabel;
+ Label9: TLabel;
+ pnl_GetSchemaOptions: TPanel;
+ Label4: TLabel;
+ Label5: TLabel;
+ ed_GetSchemaValue: TEdit;
+ cb_GetSchemaParams: TComboBox;
+ pnl_GetDataOptions: TPanel;
+ Label7: TLabel;
+ Label8: TLabel;
+ ed_GetDataValue: TEdit;
+ cb_GetDataParams: TComboBox;
+ pnl_ApplyUpdatesOptions: TPanel;
+ Label10: TLabel;
+ Label11: TLabel;
+ ed_ApplyUpdatesValue: TEdit;
+ cb_ApplyUpdatesParams: TComboBox;
+ Label12: TLabel;
+ cb_GetScriptsMethods: TComboBox;
+ pnl_GetScriptOptions: TPanel;
+ Label13: TLabel;
+ Label14: TLabel;
+ ed_GetScriptsValue: TEdit;
+ cb_GetScriptsParams: TComboBox;
+ procedure OnMethodChanged(Sender: TObject);
+ procedure cb_DataSetsChange(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure cb_GetSchemaMethodsChange(Sender: TObject);
+ procedure cb_GetDataMethodsChange(Sender: TObject);
+ procedure cb_ApplyUpdatesMethodsChange(Sender: TObject);
+ procedure btn_OkClick(Sender: TObject);
+ procedure cb_GetScriptsMethodsChange(Sender: TObject);
+ private
+ fDataTable: TDADataTable;
+ fManuallySelectedMethods:boolean;
+ fMethods:TStringList;
+ fLibrary:TRODLLibrary;
+
+ fGetSchemaParams,fGetDataParams,fApplyUpdateParams,fGetScriptsParams:TDARemoteRequestParams;
+
+ procedure FillDataSetsCombo;
+ procedure EnablePanel(iPanel:TPanel; iEnable:boolean=true);
+ procedure FillParameters(iMethodCombo, iParamCombo: TComboBox; iParamEdit:TEdit);
+ procedure CreateParameters(iMethodCombo, iParamCombo: TComboBox; iParamEdit: TEdit; ioParams: TDARemoteRequestParams);
+ function GetSchemaAsXML(aRemoteService : TRORemoteService): String;
+ public
+ class function Execute(aOwner:TComponent; aDataTable:TDADataTable; var aDataSet:string):boolean;
+ end;
+
+implementation
+
+uses
+ uROTypes, uDAClientDataModule, uDAClasses, uDAIDERes, uDAPleaseWaitForm;
+
+{$R *.dfm}
+
+{ TForm1 }
+
+procedure TDADataTableEditorForm.FormDestroy(Sender: TObject);
+begin
+ FreeAndNil(fMethods);
+ FreeAndNil(fLibrary);
+ FreeAndNil(fGetSchemaParams);
+ FreeAndNil(fGetDataParams);
+ FreeAndNil(fApplyUpdateParams);
+ FreeAndNil(fGetScriptsParams);
+end;
+
+class function TDADataTableEditorForm.Execute(aOwner: TComponent; aDataTable: TDADataTable; var aDataSet:string): boolean;
+begin
+ with self.Create(aOwner) do try
+
+ Caption := Format(Caption,[aDataTable.Name]);
+ fDataTable := aDataTable;
+ FillDataSetsCombo();
+
+ cb_DataSets.ItemIndex := cb_DataSets.Items.IndexOf(aDataSet);
+ cb_DataSetsChange(nil);
+
+ result := ShowModal = idOk;
+ if result then begin
+
+ {aDataTable.SchemaCall.MethodName := cb_GetSchemaMethods.Text;
+ aDataTable.SchemaCall.Params.Assign(fGetSchemaParams);
+
+ aDataTable.DataRequestCall.MethodName := cb_GetDataMethods.Text;
+ aDataTable.DataRequestCall.Params.Assign(fGetDataParams);
+
+ aDataTable.DataUpdateCall.MethodName := cb_ApplyUpdatesMethods.Text;
+ aDataTable.DataUpdateCall.Params.Assign(fApplyUpdateParams);
+
+ aDataTable.ScriptCall.MethodName := cb_GetScriptsMethods.Text;
+ aDataTable.ScriptCall.Params.Assign(fGetScriptsParams);}
+
+ aDataSet := cb_DataSets.Text;
+
+ end;
+ finally
+ Free();
+ end;
+end;
+
+function TDADataTableEditorForm.GetSchemaAsXML(aRemoteService : TRORemoteService): String;
+var __request, __response : TMemoryStream;
+ __TransportChannel : IROTransportChannel;
+ __Message : IROMessage;
+begin
+ __TransportChannel := aRemoteService.Channel;
+ __Message := aRemoteService.Message;
+
+ __request := TMemoryStream.Create;
+ __response := TMemoryStream.Create;
+
+ try
+ __Message.Initialize(__TransportChannel, 'DataAbstract', aRemoteService.ServiceName, 'GetSchemaAsXML');
+ __Message.Finalize;
+
+ __Message.WriteToStream(__request);
+ __TransportChannel.Dispatch(__request, __response);
+ __Message.ReadFromStream(__response);
+
+ __Message.Read('Result', TypeInfo(String), result, []);
+ finally
+ __request.Free;
+ __response.Free;
+ end
+end;
+procedure TDADataTableEditorForm.FillDataSetsCombo;
+var
+ p: Integer;
+ lDataSets: TStringList;
+ i: Integer;
+ lService: TRODLService;
+ lSchema:TDASchema;
+begin
+ (*fMethods := TStringList.Create();
+ fLibrary := fDataTable.RemoteService.GetRODLLibrary();
+
+ fGetSchemaParams := TDARemoteRequestParams.Create(nil);
+ fGetDataParams := TDARemoteRequestParams.Create(nil);
+ fApplyUpdateParams := TDARemoteRequestParams.Create(nil);
+ fGetScriptsParams := TDARemoteRequestParams.Create(nil);
+
+ lDataSets := TStringList.Create();
+ try
+
+ lService := fLibrary.FindService(fDataTable.RemoteService.ServiceName);
+ while Assigned(lService) do begin
+ for i := 0 to lService.Default.Count-1 do begin
+ fMethods.AddObject(lService.Default.Items[i].Info.Name,lService.Default.Items[i]);
+ end;
+
+ if (lService.Ancestor <> '')
+ then lService := fLibrary.FindService(lService.Ancestor)
+ else lService := nil;
+ end;
+
+ fMethods.Sort();
+ cb_GetSchemaMethods.Items.Assign(fMethods);
+ cb_GetDataMethods.Items.Assign(fMethods);
+ cb_ApplyUpdatesMethods.Items.Assign(fMethods);
+ cb_GetScriptsMethods.Items.Assign(fMethods);
+
+ lDataSets.Duplicates := dupIgnore;
+ lDataSets.Sorted := true;
+
+ if Assigned(fDataTable.RemoteService) then begin
+ if not Assigned(fDataTable.RemoteService.Channel) then RaiseError(err_AssignRemoteServiceChannel);
+ if not Assigned(fDataTable.RemoteService.Message) then RaiseError(err_AssignRemoteServiceMessage);
+
+ lSchema := nil;
+ with CreatePleaseWaitForm(self,'Retrieving Schema...') do try
+ try
+ lSchema := TDASchema.Create(nil);
+ lSchema.LoadFromXml(GetSchemaAsXML(fDataTable.RemoteService));
+ except
+ lSchema.Free;
+ raise;
+ end;
+ finally
+ Hide;
+ end;
+
+ try
+ for i := 0 to lSchema.Datasets.Count-1 do begin
+ lDataSets.Add(lSchema.Datasets[i].Name);
+ end; { for }
+ finally
+ lSchema.Free();
+ end;
+
+ end
+ else begin
+
+ for i := 0 to fMethods.Count-1 do begin
+ p := Pos('_',fMethods[i]);
+ if p > 0 then lDataSets.Add(Copy(fMethods[i],p+1,Length(fMethods[i])-p));
+ end; { for }
+
+ end;
+ cb_DataSets.Items.Assign(lDataSets);
+
+ finally
+ FreeAndNil(lDataSets);
+ end;
+ *)
+end;
+
+procedure TDADataTableEditorForm.OnMethodChanged(Sender: TObject);
+begin
+ fManuallySelectedMethods := true;
+end;
+
+procedure TDADataTableEditorForm.EnablePanel(iPanel:TPanel; iEnable:boolean=true);
+var
+ i:integer;
+begin
+ for i := 0 to ComponentCount-1 do if (Components[i] as TControl).Parent = iPanel then begin
+ if Components[i] is TLabel then TLabel(Components[i]).Enabled := iEnable
+ else if Components[i] is TComboBox then TComboBox(Components[i]).Enabled := iEnable
+ else if Components[i] is TEdit then TEdit(Components[i]).Enabled := iEnable
+ end;
+end;
+
+procedure TDADataTableEditorForm.cb_DataSetsChange(Sender: TObject);
+var
+ lIndex:integer;
+ lDataSetName:string;
+begin
+ if not fManuallySelectedMethods then begin
+
+ lDataSetName := StringReplace(cb_DataSets.Text,' ','_',[rfReplaceAll]);
+
+ lIndex := cb_GetSchemaMethods.Items.IndexOf('GetDatasetSchema_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetSchemaMethods.Items.IndexOf('GetSchema_'+lDataSetName);
+ if lIndex > -1 then begin
+ cb_GetSchemaMethods.ItemIndex := lIndex;
+ cb_GetSchemaMethodsChange(nil);
+ EnablePanel(pnl_GetSchemaOptions,false);
+ end
+ else begin
+ lIndex := cb_GetSchemaMethods.Items.IndexOf('GetDatasetSchema');
+ if lIndex = -1 then cb_GetSchemaMethods.Text := '';
+ cb_GetSchemaMethods.ItemIndex := lIndex;
+ cb_GetSchemaMethodsChange(nil);
+ end;
+
+ lIndex := cb_GetScriptsMethods.Items.IndexOf('GetDatasetScript_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetScriptsMethods.Items.IndexOf('GetDatasetScripts_'+lDataSetName);
+ if lIndex > -1 then begin
+ cb_GetScriptsMethods.ItemIndex := lIndex;
+ cb_GetScriptsMethodsChange(nil);
+ EnablePanel(pnl_GetScriptOptions,false);
+ end
+ else begin
+ lIndex := cb_GetScriptsMethods.Items.IndexOf('GetDatasetScripts');
+ if lIndex = -1 then cb_GetScriptsMethods.Text := '';
+ cb_GetScriptsMethods.ItemIndex := lIndex;
+ cb_GetScriptsMethodsChange(nil);
+ end;
+
+ lIndex := cb_GetDataMethods.Items.IndexOf('GetDatasetData_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Get_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Get'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Load_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Load'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Read_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Read'+lDataSetName);
+ if lIndex > -1 then begin
+ cb_GetDataMethods.ItemIndex := lIndex;
+ cb_GetDataMethodsChange(nil);
+ EnablePanel(pnl_GetDataOptions,false);
+ end
+ else begin
+ EnablePanel(pnl_GetDataOptions);
+ lIndex := cb_GetDataMethods.Items.IndexOf('GetDatasetDataEx');
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('GetDatasetData');
+ if lIndex = -1 then cb_GetDataMethods.Text := '';
+ cb_GetDataMethods.ItemIndex := lIndex;
+ cb_GetDataMethodsChange(nil);
+ end;
+
+ lIndex := cb_ApplyUpdatesMethods.Items.IndexOf('UpdateData_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Update_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Update'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Set_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Set'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Save_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Save'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Write_'+lDataSetName);
+ if lIndex = -1 then lIndex := cb_GetDataMethods.Items.IndexOf('Write'+lDataSetName);
+ if lIndex > -1 then begin
+ cb_ApplyUpdatesMethods.ItemIndex := lIndex;
+ cb_ApplyUpdatesMethodsChange(nil);
+ EnablePanel(pnl_ApplyUpdatesOptions,false);
+ end
+ else begin
+ EnablePanel(pnl_ApplyUpdatesOptions);
+ lIndex := cb_ApplyUpdatesMethods.Items.IndexOf('UpdateData');
+ if lIndex = -1 then cb_ApplyUpdatesMethods.Text := '';
+ cb_ApplyUpdatesMethods.ItemIndex := lIndex;
+ cb_ApplyUpdatesMethodsChange(nil);
+ end;
+
+ fManuallySelectedMethods := false;
+ end;
+end;
+
+procedure TDADataTableEditorForm.FillParameters(iMethodCombo, iParamCombo:TComboBox; iParamEdit:TEdit);
+var
+ lIndex:integer;
+ lMethod:TRODLOperation;
+ i:integer;
+begin
+ iParamCombo.Items.Clear();
+
+ lIndex := iMethodCombo.ItemIndex;
+ if lIndex > -1 then begin
+ lMethod := (fMethods.Objects[lIndex] as TRODLOperation);
+
+ iParamCombo.ItemIndex := -1;
+ iParamCombo.Text := '';
+ iParamEdit.Text := '';
+ for i := 0 to lMethod.Count-1 do begin
+ if (lMethod.Items[i].Flag in [fIn, fInOut]) and (lMethod.Items[i].DataType = DataTypeNames[rtString]) then begin
+ iParamCombo.Items.Add(lMethod.Items[i].Name);
+ end;
+ end;
+ //if iParamCombo.Enabled then begin
+ if (iParamCombo.Items.Count > 0) then begin
+ iParamCombo.ItemIndex := 0;
+ iParamEdit.Text := cb_DataSets.Text;
+ EnablePanel(iParamEdit.Parent as TPanel);
+ end
+ else begin
+ iParamEdit.Text := '';
+ EnablePanel(iParamEdit.Parent as TPanel,false);
+ end;
+ //end
+ end;
+end;
+
+
+procedure TDADataTableEditorForm.cb_GetSchemaMethodsChange(Sender: TObject);
+begin
+ FillParameters(cb_GetSchemaMethods, cb_GetSchemaParams, ed_GetSchemaValue);
+end;
+
+procedure TDADataTableEditorForm.cb_GetDataMethodsChange(Sender: TObject);
+begin
+ FillParameters(cb_GetDataMethods, cb_GetDataParams, ed_GetDataValue);
+end;
+
+procedure TDADataTableEditorForm.cb_ApplyUpdatesMethodsChange(Sender: TObject);
+begin
+ FillParameters(cb_ApplyUpdatesMethods, cb_ApplyUpdatesParams, ed_ApplyUpdatesValue);
+end;
+
+procedure TDADataTableEditorForm.cb_GetScriptsMethodsChange(Sender: TObject);
+begin
+ FillParameters(cb_GetScriptsMethods, cb_GetScriptsParams, ed_GetScriptsValue);
+end;
+
+
+procedure TDADataTableEditorForm.CreateParameters(iMethodCombo, iParamCombo:TComboBox; iParamEdit:TEdit; ioParams:TDARemoteRequestParams);
+var
+ lIndex:integer;
+ lMethod:TRODLOperation;
+ i:integer;
+ newparam : TDARemoteRequestParam;
+begin
+ ioParams.Clear();
+
+ lIndex := iMethodCombo.ItemIndex;
+ if lIndex > -1 then begin
+ lMethod := (fMethods.Objects[lIndex] as TRODLOperation);
+
+ // AleF: fixed this one too and moved up to be consistent with the RODL changes of ages ago
+ if Assigned(lMethod.Result) then begin
+ ioParams.Add.CopyRODLParam(lMethod.Result);
+ end;
+
+ for i := 0 to lMethod.Count-1 do begin
+ // AleF: fixed this up so that it uses a common copy function instead of duplicating it like it was before
+ newparam := ioParams.Add;
+ newparam.CopyRODLParam(lMethod.Items[i]);
+
+ // Sets defaults
+ with newparam do begin
+ if (Flag in [fIn, fInOut]) and (Name = iParamCombo.Text) then begin
+ AsString := ed_GetSchemaValue.Text;
+ end
+ else if SameText(Name, 'MaxRecords') then begin
+ AsInteger := -1;
+ end
+ else if SameText(Name, 'IncludeSchema') then begin
+ AsBoolean := false;
+ end
+ else if (newparam.DataType=rtString) and VarIsEmpty(newparam.AsVariant) then begin
+ newparam.AsVariant := '';
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure TDADataTableEditorForm.btn_OkClick(Sender: TObject);
+begin
+ CreateParameters(cb_GetSchemaMethods, cb_GetSchemaParams, ed_GetSchemaValue, fGetSchemaParams);
+ CreateParameters(cb_GetDataMethods, cb_GetDataParams, ed_GetDataValue, fGetDataParams);
+ CreateParameters(cb_ApplyUpdatesMethods, cb_ApplyUpdatesParams, ed_ApplyUpdatesValue, fApplyUpdateParams);
+ CreateParameters(cb_GetScriptsMethods, cb_GetScriptsParams, ed_GetScriptsValue, fGetScriptsParams);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm.dfm
new file mode 100644
index 0000000..a233e81
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm.dfm
@@ -0,0 +1,1457 @@
+inherited DADataTableMasterLinkWizard: TDADataTableMasterLinkWizard
+ Left = 259
+ Top = 205
+ Caption = '%s Master/Detail Wizard'
+ ClientHeight = 480
+ ClientWidth = 459
+ PixelsPerInch = 96
+ TextHeight = 13
+ inherited Bevel1: TBevel
+ Width = 459
+ end
+ object Label16: TLabel [1]
+ Left = 8
+ Top = 366
+ Width = 73
+ Height = 13
+ Caption = 'Mapping Mode:'
+ end
+ inherited Panel1: TPanel
+ Width = 459
+ inherited Image1: TImage
+ Picture.Data = {
+ 055449636F6E0000010006003030000001000800A80E00006600000020200000
+ 01000800A80800000E0F0000101000000100080068050000B617000030300000
+ 01002000A82500001E1D00002020000001002000A8100000C642000010100000
+ 01002000680400006E5300002800000030000000600000000100080000000000
+ 0009000000000000000000000001000000010000000000000505050009090900
+ 0D0D0D000B120B000E150E000A1D0A000C190C00121212001515150011181100
+ 101D1000191919001D1D1D000A230A000F2A0F00053F0500093709000C3C0C00
+ 14391400163D1600193019001A391A0021212100252525002028200029292900
+ 2D2D2D0024342400293229003131310035353500333D3300393939003D3D3D00
+ 07420700044B04000B420B000C450C000E480E00025902000C590C0016461600
+ 104C10001353130014551400155815001D511D00185F180000660000006A0000
+ 006E0000076F07000B620B00096709000E600E000E6D0E000072000000750000
+ 00780000007D00000E7F0E00136C1300196119001B651B00204C20002C5C2E00
+ 3640360039563B002571270028742C002B7730002D7A3300307C3700327F3B00
+ 3C6240004040400045454500494949004D4D4D0049534A005151510056565600
+ 595959005D5D5D004167460047644C0043694800456B4B00417A4900447D4E00
+ 4F6252005D7965006161610065656500616B6400686868006E6E6E00637F6C00
+ 7171710074747400787878007D7D7D000081000000850000008A0000008D0000
+ 0A810A000A850A00009100000095000000990000049D05001284130007A00B00
+ 0BA411000FA8170013AC1C001F91260022942A002D83350035823E002D973A00
+ 16AF22001AB328001EB72E002FA13E0022BB340026BE39002AC23F0038844200
+ 3B8745003D8949003C9B4C003C9C4D0032A442003BAE50003AB650003EB95500
+ 408C4D00438F51004197510045925400479C580045A459005C826700629B7500
+ 58A46D005DA9740060AC78002DC6440031CA4A0035CD500039D156003DD55B00
+ 40D9610044DD670052C470004CDB710058DD7F0048E06D004CE4730050E87800
+ 53EC7E005FDA860057EF84005BEA87005FED8C005BF38A005FF78F0086868600
+ 959595009F9F9F00A2A2A200AAAAAA00ACACAC00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000066511F090909090D4E60000000000000000000000000000000
+ 00000000000000000000000000000000000000004E0D0D0D0D0D090909090309
+ 0303031864000000000000000000000000000000000000000000000000000000
+ 00001F1818180D0D0D090D09090909030303030303004E000000000000000000
+ 000000000000000000000000000000001F1A1818180D180D0D0D0D0909090909
+ 09030303030300035D000000000000000000000000000000000000000000641A
+ 1A1A1A181818180D151327272727110F05090303030303000309000000000000
+ 000000000000000000000000004E1F1A1F1A1A1A182A353B3B3B3A3A3A333333
+ 332811070303030300000064000000000000000000000000000000004E1A1F1F
+ 1A1F1A1A1C2D2D353B3B3B3A3A3A3A333333313124070303030300005D000000
+ 00000000000000000000004E1F1F1F1F1F1A1F1A1A1A181A182A3A3B3A3A3333
+ 333333313331100404000303005D0000000000000000000000004E1F1F211F1F
+ 1A1F1A1F1A1A1A1A1818163B3B3A3A3A33333333313131280703030003006400
+ 0000000000000000005D212121211F1F1F1F1A1F1A1A1A1A1A18183B3B3B3A3A
+ 3A3331120F0B080507030303000300000000000000000000AB4E214E2121211F
+ 1F1F1F1A1F1F1A1A1A181A673B3B3B3A3A270C09090909030303030303000309
+ 00000000000000004E214E21212121211F1F1F1F1A1F1A1E1A1A1867673B3B3B
+ 3A0D0D0C0C090909090303030303000051000000000000644E4E214E214E2121
+ 211F1F1F1F1A1F1A1A1A1A1A181A16132D0D0D0C0C0909090903030303030303
+ 000000000000004E4E4E4E44462121212121211F1F1F1F1E1F1A1A1A1A181818
+ 0D0D0D0D0D0C09090909090310030003034E00000000664E4E214E76474E214E
+ 2121211F1F1F1F1A1E1E1A1A1A1A181818170D0D0D0D090B0C080908310E0303
+ 0003000000004E4E4E4E4B7C474E21214E2121211F1F1F1F1A1F1A1E1A1A1A18
+ 1817180D0D0D0D0C09090908312403030303640000004E514E4E7A7D474E4E21
+ 21212121211F1F1F1F1E1E1A1A1A1A18181817180D0D0D0C0C09090933310703
+ 030309000066514E5150807F4A4E214E4E214E2121211F1F1F1E1E1F1E1A1A1A
+ 1A181817180D0D0D0D0C0909333123030303030000515151515981804A4E4E21
+ 4E21214E2121211F1F1F1E1A1E1E1A1A1A1A181817180D0D0D0D0C0C33332809
+ 030303000051515151859681824E4E4E4E4E2121212121211F1F1F1F1E1E1E1A
+ 1A1A1A181817180D0D0D0C0C33333109050303530053535151889796834E4E4E
+ 214E4E214E21212121211F1F1E1E1E1E1A1A1A1A181817180D0D0D0C3333330F
+ 0909034E00535351519A9797844E4E4E4E4E214E214E212121211F1F1F1E1E1E
+ 1E1A1A1A1A181817180D0D0D3A3A33120909030900535353519B99988B4E4E4E
+ 4E4E4E4E214E214E2121211F1F1F1E1E1E1E1A1A1A1A181817180D0D3A3A3327
+ 0909090300535353539B9A998C514E4E4E4E4E214E214E21212121211F1F1F1E
+ 1E1E1E1A1A1A1A181817180D3A3A3A270909090900535353539B9B9A8C51514E
+ 4E4E4E4E4E4E214E214E2121211F1F1F1E1E1E1E1A1A1A1A181817293B3A3A27
+ 09090909005D535353A19B9B905151514E4E4E4E4E4E4E214E21212121211F1F
+ 1F1E1E2D382E2E2D3533673B3B3B3A270C0D0909005D5D5D539EA19C9B8F5B51
+ 514E4E4E4E4E214E214E214E2121211F1F1F1E306A6A676A676767673B3B3B13
+ 0D0C0D1F005D5D535D9DA1A09B9B9A8A8D8C58574B4E4E4E4E214E2121212121
+ 1F1F1F306A6A6A6767676767673B3B150D0D0951005D5D5D5394A1A1A19B9B9A
+ 99989796964E4E4E4E4E214E214E2121211F1F306D6A6A6A6A67676767673B18
+ 0D0D0D6600665D5D5D5CA3A3A1A09C9B9A999897964E4E4E4E214E214E21214C
+ 21211F306D6A6A6A676A6A67676735180D180D0000AC5D5D5D5D9FA3A2A1A09B
+ 9B9A9998974E4E4E4E4E4E4E214E214C212121406D6D6A6A6A6A676A67672A18
+ 180D0D00000060605D5D94A5A3A3A1A09C9B9A99985A4E4E4E4E4E4E4E214E21
+ 4E2121716D6D6D6D6A6A676A67671A1818184E000000645D605D5FA6A5A3A2A1
+ A09B9B9A999886564E4E4E4E214E214E2142716F6F6F6D6D6A6A6A6A672E1A18
+ 18180000000000605D605D95A8A5A3A3A1A09C9B9A9A989796877A4A4A787776
+ 7474706F6F6F6D6D6D6D6A6A671E1A1A181F000000000064605D605DA4A8A5A3
+ A2A1A09B9B9A9998979681807F7D7D75757474726F6F6F6D6D6D6A6A411E1A1A
+ 1A0000000000000060605D6062A7A8A5A3A3A1A09C9B9A9998979681807F7D7D
+ 75757474726F6F6F6F6D6D381F1A1E1A21000000000000006660605D6092A8A8
+ A5A3A2A1A09B9B9A9998979681807F7D7D7575747472706F6F6D6C1F1F1E1E1A
+ 000000000000000000606060605D92A9A8A5A3A3A1A09C9B9A9998979681807F
+ 7D7D75757474726F6F6C1F1F1F1E1E5D000000000000000000AF606060606092
+ A8A8A5A3A2A1A09B9B9A9998979681807F7D7D757574747271431F1F1F1F2100
+ 00000000000000000000AE6060605D6062A4A8A5A3A3A1A09C9B9A9998979681
+ 807F7D7D757574454C214C1F1F4E00000000000000000000000000AA60606060
+ 5D5D95A7A5A3A1A1A09C9B9A9998979681807F7D7D77444C4C214C4C4E000000
+ 000000000000000000000000AE60606060605D5F949FA3A3A1A09B9B9A999897
+ 9681807A4B4E4C4E214E1F4D0000000000000000000000000000000000AF6060
+ 605D605D5D5D91939D9EA19B9B9A99898559504E4E4E4E4C4C4C5D0000000000
+ 000000000000000000000000000000666060605D5D5D5D535353535353515151
+ 514E514E4E4E4E4C4EAB00000000000000000000000000000000000000000000
+ 006060605D5D5D5D5D535353535351515151514E4E4E4E640000000000000000
+ 000000000000000000000000000000000000AF6460605D5D5D5D5D5353535353
+ 515151514E660000000000000000000000000000000000000000000000000000
+ 0000000000AE605D5D5D535D5353535353516600000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000FFFFE007FFFF0000FFFF0000
+ 7FFF0000FFFC00001FFF0000FFF0000007FF0000FFC0000003FF0000FF800000
+ 00FF0000FF000000007F0000FE000000003F0000FC000000001F0000F8000000
+ 001F0000F0000000000F0000F000000000070000E000000000070000E0000000
+ 00030000C000000000030000C000000000010000C00000000001000080000000
+ 0001000080000000000100008000000000000000800000000000000080000000
+ 0000000080000000000000008000000000000000800000000000000080000000
+ 0000000080000000000000008000000000000000800000000000000080000000
+ 000100008000000000010000C000000000010000C000000000030000E0000000
+ 00030000E000000000070000F000000000070000F0000000000F0000F8000000
+ 000F0000F8000000001F0000FC000000003F0000FE000000007F0000FF000000
+ 00FF0000FF80000001FF0000FFE0000003FF0000FFF800000FFF0000FFFC0000
+ 3FFF0000FFFF8001FFFF0000FFFFFFFFFFFF0000280000002000000040000000
+ 0100080000000000000400000000000000000000000100000001000000000000
+ 06060600090909000C0C0C000A170A000D130D000F160F000C190C0011111100
+ 1414140012181200181818001D1D1D000C260C000B2B0B000E280E0007340700
+ 0A310A00102B1000122D12001B2A1B0014311400153A1500173D17001D351D00
+ 1E3F1E002222220026262600292929002E2E2E003232320034343400353E3500
+ 3A3A3A003D3D3D00064906000A490A00025502000F560F001043100016451600
+ 13531300016101000067000000690000006D0000066A0600046F04000B610B00
+ 08650800096909000A6F0A00007200000075000000780000007D000015661500
+ 147D150021442100335034003653380026732A003F5240004141410045454500
+ 494949004E4E4E004558470049534B005151510056565600595959005D5D5D00
+ 4369490044744C00427C4B00437C4D006262620065656500636D660068686800
+ 6F6F6F0072727200777777007C7C7C000081000000860000008A0000008E0000
+ 0A820A000091000000950000029B03001083110008A10C000DA6140013AC1D00
+ 1F92270024972E002D8D3700299B350019B226001EB72E002EA03C0024BD3700
+ 2AC23F003B8746003D934C0033A5430037AA4A002EB441003CAF510041844C00
+ 4A835600428F50004197500041B3570041B4580046B85E005C83670063927200
+ 57A36B004ABC650050B96B005FAB760062AE7C0030C8480037C6510035CE5100
+ 3DCC59003BD3590042D1610041D9620046DF6B004CE4730052EA7C0058E68200
+ 5DEC8A0057F085005DF58D008282820085858500888888008D8D8D0090909000
+ 99999900A0A0A000ACACAC000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000052400B0909091C4100000000000000000000000000000000
+ 0000000000521B1B0B0B0B0B0909080808004100000000000000000000000000
+ 0000008E1C1C1B1B1B1B0B0B0B09090808080008400000000000000000000000
+ 0000471C1E1C1C1826313635352D2A230E080800000900000000000000000000
+ 00401E1E1E1C1C192930363635352D2D312A1008080000000000000000000000
+ 40211E1E1E1E1C1C1C1B18353535352D2D313125040800080000000000000051
+ 212121211E1E1E1C1C1C1B3236363535230E0604040800000900000000000040
+ 402121211E1E1E1E1C1C1C32363636270B0B0909080808080040000000004540
+ 403C212121211E1E1E1C1C1C1B1817140B0B0B09090808010800000000004140
+ 3E6140212121211E1E1E1C1C1C1B1B1B1A0B0B0B09040D1008004100004E4141
+ 636240402121211E1E1E1E1C1C1C1B1B0B1B0B0B0B0B0D310808000000454144
+ 6864404040212121211E1E1E1C1C1B1B1B1B1B0B0B0B0E31100808000045454A
+ 696740402140212121211E1E1E1C1C1C1B1B0B1B0B0B152D2308014192454572
+ 7E6C41404040402121211E1E1E1E1C1C1C1B1B1B1A0B152D2A09040B8C474775
+ 806D414141404040212121211E1E1E1C1C1C1B1B0B1B15352D0909098C474776
+ 826F41414140402140212121211E1E1E1C1C1C1B1B1A1735350B09098C47477A
+ 847545454141404040402121211E1E1E1E3A1C1C18272D35350B0B098E4E477B
+ 8583714541414141404040212121211E1E57575656365635360B0B0B004E4779
+ 8685848174736A43404040402121211E1E5A575756563656321B0B40004E4E77
+ 8786858482807E494140402140212121215A575757565636261B0B4E004E4E4E
+ 88878685848280704141404040402121205A5A5A57575656181B1B00008E4E4E
+ 7C8A87868584827F4C4441414040403B395C5A5A575757321B1B1B0000004E4E
+ 4F898A8786858482807E6E676462605F5E5C5C5A5A5A573A1C1B520000005451
+ 4E788B8A8786858482807E69686665605F5E5C5C5A5A381E1C1C000000000051
+ 4E4E7D8B8A8786858482807E69686665605F5E5C5C591E1E1E8E000000000093
+ 514E4E7D8B8A8786858482806969686665605F5E5D201E1E4700000000000000
+ 8E514E4E78898A8786858482807E69686665603D212121400000000000000000
+ 0091514E4E4F7C888786858482807E6968633E40402141000000000000000000
+ 000093514E4E4E4E77797B7A7675727044414040405100000000000000000000
+ 0000000054514E4E474E47474745454541414145000000000000000000000000
+ 0000000000008E4E4E4E474747474645454F0000000000000000000000000000
+ 000000000000000000008E8E8C8C9200000000000000000000000000FFF00FFF
+ FF8001FFFE00007FFC00003FF800001FF000000FE0000007E0000003C0000003
+ C000000180000001800000018000000000000000000000000000000000000000
+ 0000000080000000800000008000000180000001C0000001C0000003E0000003
+ E0000007F000000FF800001FFC00003FFF0000FFFFC003FFFFFC1FFF28000000
+ 1000000020000000010008000000000000010000000000000000000000010000
+ 00010000000000000A0A0A00090F09000F0F0F000E140E000C190C0013131300
+ 14141400111E1100181818001D1D1D00092F09000A390A00113311001B321B00
+ 22222200262626002B2B2B0021322100263626003030300034343400313A3100
+ 393939003E3E3E00044A04000B440B000E490E0005540500065A0600075F0700
+ 124912001848180014531400155915001E521E00006A0000066A0600096A0900
+ 0070000000750000007B0000146414001B631B00137B1300374A38002E713300
+ 2B78300043434300474747004C4C4C004A534B00575757005A5A5A005E5E5E00
+ 46634B004E6152004A7050004878510063636300656565006868680070707000
+ 757575007D7D7D000081000000860000008C00000B860C000092000001980100
+ 09A20E0014AD1F0022B1320020B830003A9048004B975B005D836800539F6600
+ 63A679002BC442003AC0540037CF530039C8530042DA64004DE6750063C28300
+ 59E8840059F187008A8A8A009191910098989800AAAAAA000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000003D110906033400000000000000003E11121F1B1A0C0503
+ 1500000000003615151220252828241902060000004018181514112129250D05
+ 0403150000312E1815151511120E0909060B03005A3349311818151111101009
+ 091C04343E3950313118151515111010091E0C03364C52323131181815111110
+ 101E1A06364E5438323131181515232226291B09594D5554534B311818182B43
+ 42421F095C3D575554513731312D2C454342123D003D4F58555452504A484745
+ 452A1100005C3D5658555452504A484744163D0000005B3D4F5755545250492F
+ 183600000000005C3D3D4D4E4C3A33314000000000000000005C5936363E5A00
+ 00000000F81F0000E0070000C003000080010000800100000000000000000000
+ 000000000000000000000000000000008001000080010000C0030000E0070000
+ F81F000028000000300000006000000001002000000000008025000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001E1E1E0F1C1C1C4F1B1B1B8F191919BF
+ 171717DF161616FF141414FF131313FF111111FF0F0F0FEF0E0E0EBF0D0D0D9F
+ 0B0B0B6F0A0A0A2F000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000002424240F2323235F212121CF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF
+ 191919FF171717FF161616FF141414FF131313FF111111FF0F0F0FFF0E0E0EFF
+ 0C0C0CFF0B0B0BFF090909DF0808088F0707071F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000002929290F
+ 2727277F262626EF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF
+ 1A1A1AFF191919FF171717FF161616FF141414FF131313FF111111FF0F0F0FFF
+ 0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606BF0505053F00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000002C2C2C5F2A2A2AEF
+ 292929FF272727FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF
+ 1C1C1CFF1A1A1AFF191919FF171717FF161616FF141414FF131313FF111111FF
+ 0F0F0FFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF0505059F
+ 0505050F00000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000003131310F2F2F2FAF2E2E2EFF2C2C2CFF
+ 2A2A2AFF292929FF272727FF262626FF242424FF222222FF212121FF193019FF
+ 143914FF0E480EFF0D460DFF0C450CFF0B430BFF0C3C0CFF0F2A0FFF111811FF
+ 111111FF0F0F0FFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF
+ 040404EF0404044F000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000003434342F323232DF303030FF2F2F2FFF2E2E2EFF
+ 2C2C2CFF2A2A2AFF292929FF272727FF174717FF0B620BFF027702FF007A00FF
+ 007800FF007600FF007400FF007300FF007100FF006F00FF006D00FF006B00FF
+ 035903FF093709FF0D1A0DFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF
+ 060606FF040404FF0303038F0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000003737372F353535EF343434FF323232FF303030FF2F2F2FFF
+ 2E2E2EFF2C2C2CFF2A2A2AFF243424FF145414FF135313FF096709FF007C00FF
+ 007A00FF007800FF007600FF007400FF007300FF007100FF006F00FF006D00FF
+ 006B00FF006900FF006700FF044B04FF0B1E0BFF0C0C0CFF0B0B0BFF090909FF
+ 080808FF060606FF040404FF0303039F00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000003A3A3A2F383838EF373737FF353535FF343434FF323232FF303030FF
+ 2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF
+ 164416FF027502FF007800FF007600FF007400FF007300FF007100FF006F00FF
+ 006D00FF006B00FF006900FF006700FF006600FF053F05FF0B120BFF0B0B0BFF
+ 090909FF080808FF060606FF040404FF0303039F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 3D3D3D2F3C3C3CEF3A3A3AFF383838FF373737FF353535FF343434FF323232FF
+ 303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF
+ 242424FF1A391AFF007A00FF007800FF007600FF007400FF007300FF007100FF
+ 006F00FF006D00FF006B00FF006900FF006700FF006600FF015A01FF0A1D0AFF
+ 0B0B0BFF090909FF080808FF060606FF040404FF0303038F0000000000000000
+ 000000000000000000000000000000000000000000000000000000004141410F
+ 3F3F3FCF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF
+ 323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF
+ 262626FF242424FF007C00FF007A00FF007800FF007600FF007400FF007300FF
+ 007100FF036403FF0B410BFF0F2A0FFF101D10FF111111FF0E150EFF0C190CFF
+ 0C0C0CFF0B0B0BFF090909FF080808FF060606FF040404FF0404044F00000000
+ 000000000000000000000000000000000000000000000000000000004242428F
+ 404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF
+ 343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF
+ 272727FF262626FF007E00FF007C00FF007A00FF007800FF007600FF007400FF
+ 0D460DFF191919FF171717FF161616FF141414FF131313FF111111FF0F0F0FFF
+ 0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF040404EF0505050F
+ 0000000000000000000000000000000000000000000000004545453F444444FF
+ 424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF
+ 353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF
+ 292929FF272727FF008000FF007E00FF007C00FF007A00FF007800FF007600FF
+ 1C1C1CFF1A1A1AFF191919FF171717FF161616FF141414FF131313FF111111FF
+ 0F0F0FFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF050505AF
+ 000000000000000000000000000000000000000000000000464646BF454545FF
+ 444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF
+ 373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF
+ 2A2A2AFF292929FF272727FF262626FF242424FF1A391AFF163D16FF104C10FF
+ 1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF161616FF141414FF131313FF
+ 111111FF0F0F0FFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF
+ 0505053F000000000000000000000000000000004A4A4A3F484848FF474747FF
+ 454545FF444444FF39563BFF28742CFF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF
+ 383838FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF
+ 2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF212121FF
+ 1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF161616FF141414FF
+ 131313FF111111FF0F0F0FFF053F05FF0C0C0CFF0B0B0BFF090909FF080808FF
+ 060606BF000000000000000000000000000000004B4B4BBF4A4A4AFF484848FF
+ 474747FF454545FF22942AFF2B7730FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF
+ 3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF
+ 2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF
+ 212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF161616FF
+ 141414FF131313FF111111FF006600FF0A230AFF0C0C0CFF0B0B0BFF090909FF
+ 080808FF0707072F00000000000000004F4F4F1F4D4D4DFF4B4B4BFF4A4A4AFF
+ 484848FF3C6240FF1AB328FF2D7A33FF424242FF404040FF3F3F3FFF3D3D3DFF
+ 3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF
+ 2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF
+ 222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF
+ 161616FF141414FF131313FF006700FF044B04FF0E0E0EFF0C0C0CFF0B0B0BFF
+ 090909FF0808088F00000000000000005050506F4F4F4FFF4D4D4DFF4B4B4BFF
+ 4A4A4AFF2D973AFF1EB72EFF307C37FF444444FF424242FF404040FF3F3F3FFF
+ 3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF
+ 303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF
+ 242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF
+ 171717FF161616FF141414FF006900FF006700FF0D1A0DFF0E0E0EFF0C0C0CFF
+ 0B0B0BFF090909EF0000000000000000525252BF505050FF4F4F4FFF4D4D4DFF
+ 49534AFF26BE39FF22BB34FF327F3BFF454545FF444444FF424242FF404040FF
+ 3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF
+ 323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF
+ 262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF
+ 191919FF171717FF161616FF006B00FF006900FF074207FF0F0F0FFF0E0E0EFF
+ 0C0C0CFF0B0B0BFF0A0A0A2F00000000535353FF525252FF505050FF4F4F4FFF
+ 417A49FF2AC23FFF26BE39FF35823EFF474747FF454545FF444444FF424242FF
+ 404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF
+ 343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF
+ 272727FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF
+ 1A1A1AFF191919FF171717FF006D00FF006B00FF035903FF111111FF0F0F0FFF
+ 0E0E0EFF0C0C0CFF0B0B0B6F5656563F555555FF535353FF525252FF505050FF
+ 3C9B4CFF2DC644FF2AC23FFF388442FF484848FF474747FF454545FF444444FF
+ 424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF
+ 353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF
+ 292929FF272727FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF
+ 1C1C1CFF1A1A1AFF191919FF006F00FF006D00FF006B00FF111811FF111111FF
+ 0F0F0FFF0E0E0EFF0C0C0CAF5858584F575757FF555555FF535353FF525252FF
+ 3BAE50FF31CA4AFF2DC644FF3B8745FF4A4A4AFF484848FF474747FF454545FF
+ 444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF
+ 373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF
+ 2A2A2AFF292929FF272727FF262626FF242424FF222222FF212121FF1F1F1FFF
+ 1E1E1EFF1C1C1CFF1A1A1AFF007100FF006F00FF006D00FF0F2A0FFF131313FF
+ 111111FF0F0F0FFF0E0E0EBF5959597F585858FF575757FF555555FF535353FF
+ 39D156FF35CD50FF31CA4AFF3D8949FF4B4B4BFF4A4A4AFF484848FF474747FF
+ 454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF
+ 383838FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF
+ 2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF212121FF
+ 1F1F1FFF1E1E1EFF1C1C1CFF007300FF007100FF006F00FF0C3C0CFF141414FF
+ 131313FF111111FF0F0F0FFF5B5B5B7F595959FF585858FF575757FF555555FF
+ 3DD55BFF39D156FF35CD50FF408C4DFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF
+ 474747FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF
+ 3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF
+ 2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF
+ 212121FF1F1F1FFF1E1E1EFF007400FF007300FF007100FF0B430BFF161616FF
+ 141414FF131313FF111111FF5C5C5C7F5B5B5BFF595959FF585858FF575757FF
+ 40D961FF3DD55BFF39D156FF438F51FF4F4F4FFF4D4D4DFF4B4B4BFF4A4A4AFF
+ 484848FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF
+ 3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF
+ 2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF
+ 222222FF212121FF1F1F1FFF007600FF007400FF007300FF0C450CFF171717FF
+ 161616FF141414FF131313FF5E5E5E7F5D5D5DFF5B5B5BFF595959FF585858FF
+ 44DD67FF40D961FF3DD55BFF459254FF505050FF4F4F4FFF4D4D4DFF4B4B4BFF
+ 4A4A4AFF484848FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF
+ 3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF
+ 303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF
+ 242424FF202820FF0C590CFF007800FF007600FF007400FF0D460DFF191919FF
+ 171717FF161616FF141414FF6060607F5E5E5EFF5D5D5DFF5B5B5BFF595959FF
+ 48E06DFF44DD67FF40D961FF45A459FF525252FF505050FF4F4F4FFF4D4D4DFF
+ 4B4B4BFF4A4A4AFF484848FF474747FF454545FF444444FF424242FF404040FF
+ 3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF
+ 323232FF303030FF1D511DFF0E6D0EFF155A15FF155815FF145614FF0E600EFF
+ 076F07FF007E00FF007C00FF007A00FF007800FF007600FF0E480EFF1A1A1AFF
+ 191919FF171717FF161616FF6161617F606060FF5E5E5EFF5D5D5DFF5B5B5BFF
+ 4CDB71FF48E06DFF44DD67FF40D961FF479C58FF4F6252FF505050FF4F4F4FFF
+ 4D4D4DFF4B4B4BFF4A4A4AFF484848FF474747FF454545FF444444FF424242FF
+ 404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF
+ 343434FF323232FF185F18FF008B00FF008900FF008700FF008500FF008400FF
+ 008200FF008000FF007E00FF007C00FF007A00FF007800FF143914FF1C1C1CFF
+ 1A1A1AFF191919FF171717DF6262623F616161FF606060FF5E5E5EFF5D5D5DFF
+ 52C470FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF3EB955FF419751FF
+ 408C4DFF456B4BFF436948FF416746FF484848FF474747FF454545FF444444FF
+ 424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF
+ 353535FF343434FF196019FF008D00FF008B00FF008900FF008700FF008500FF
+ 008400FF008200FF008000FF007E00FF007C00FF007A00FF193019FF1E1E1EFF
+ 1C1C1CFF1A1A1AFF191919BF6464641F636363FF616161FF606060FF5E5E5EFF
+ 58A46DFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF
+ 35CD50FF31CA4AFF2DC644FF2AC23FFF4A4A4AFF484848FF474747FF454545FF
+ 444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF
+ 373737FF353535FF1A621AFF008F00FF008D00FF008B00FF008900FF008700FF
+ 008500FF008400FF008200FF008000FF007E00FF027702FF212121FF1F1F1FFF
+ 1E1E1EFF1C1C1CFF1B1B1B8F00000000656565DF636363FF616161FF606060FF
+ 5D7965FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF
+ 39D156FF35CD50FF31CA4AFF2DC644FF4B4B4BFF4A4A4AFF484848FF474747FF
+ 454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF
+ 383838FF373737FF1B641BFF009100FF008F00FF008D00FF008B00FF008900FF
+ 008700FF008500FF008400FF008200FF008000FF0B620BFF222222FF212121FF
+ 1F1F1FFF1E1E1EFF1C1C1C5F000000006666669F656565FF636363FF616161FF
+ 606060FF58DD7FFF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF
+ 3DD55BFF39D156FF35CD50FF31CA4AFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF
+ 474747FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF
+ 3A3A3AFF383838FF1B661BFF009300FF009100FF008F00FF008D00FF008B00FF
+ 008900FF008700FF008500FF008400FF008200FF174717FF242424FF222222FF
+ 212121FF1F1F1FFF1E1E1E0F000000006767674F666666FF656565FF636363FF
+ 616161FF5DA974FF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF
+ 40D961FF3DD55BFF39D156FF35CD50FF447D4EFF4D4D4DFF4B4B4BFF4A4A4AFF
+ 484848FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF
+ 3C3C3CFF3A3A3AFF0E7F0EFF009500FF009300FF009100FF008F00FF008D00FF
+ 008B00FF008900FF008700FF008500FF027E02FF272727FF262626FF242424FF
+ 222222FF212121CF000000000000000000000000686868EF666666FF656565FF
+ 636363FF616B64FF5BEA87FF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF
+ 44DD67FF40D961FF3DD55BFF39D156FF35CD50FF3C9C4DFF47644CFF4B4B4BFF
+ 4A4A4AFF484848FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF
+ 2C5C2EFF128413FF009900FF009700FF009500FF009300FF009100FF008F00FF
+ 008D00FF008B00FF008900FF008700FF155815FF292929FF272727FF262626FF
+ 242424FF2323235F0000000000000000000000006969697F686868FF666666FF
+ 656565FF636363FF60AC78FF5BF38AFF57EF84FF53EC7EFF50E878FF4CE473FF
+ 48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF
+ 32A442FF2FA13EFF35823EFF327F3BFF2D8335FF22942BFF1F9126FF0FA817FF
+ 0BA411FF07A00BFF049D05FF009900FF009700FF009500FF009300FF009100FF
+ 008F00FF008D00FF008B00FF028402FF293229FF2A2A2AFF292929FF272727FF
+ 262626EF2424240F0000000000000000000000006A6A6A1F696969EF686868FF
+ 666666FF656565FF636363FF5FDA86FF5BF38AFF57EF84FF53EC7EFF50E878FF
+ 4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF
+ 2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF1AB328FF16AF22FF13AC1CFF
+ 0FA817FF0BA411FF07A00BFF049D05FF009900FF009700FF009500FF009300FF
+ 009100FF008F00FF008D00FF204C20FF2E2E2EFF2C2C2CFF2A2A2AFF292929FF
+ 2727277F00000000000000000000000000000000000000006A6A6A7F696969FF
+ 686868FF666666FF656565FF637F6CFF5FED8CFF5BF38AFF57EF84FF53EC7EFF
+ 50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF
+ 31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF1AB328FF16AF22FF
+ 13AC1CFF0FA817FF0BA411FF07A00BFF049D05FF009900FF009700FF009500FF
+ 009300FF009100FF136C13FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AEF
+ 2929290F00000000000000000000000000000000000000006B6B6B0F6A6A6ADF
+ 696969FF686868FF666666FF656565FF629B75FF5FF78FFF5BF38AFF57EF84FF
+ 53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF
+ 35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF1AB328FF
+ 16AF22FF13AC1CFF0FA817FF0BA411FF07A00BFF049D05FF009900FF009700FF
+ 009500FF0A810AFF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2C6F
+ 000000000000000000000000000000000000000000000000000000006B6B6B3F
+ 6A6A6AFF696969FF686868FF666666FF656565FF629B75FF5FF78FFF5BF38AFF
+ 57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF
+ 39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF
+ 1AB328FF16AF22FF13AC1CFF0FA817FF0BA411FF07A00BFF049D05FF009900FF
+ 0A850AFF333D33FF353535FF343434FF323232FF303030FF2F2F2FBF00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 6B6B6B8F6A6A6AFF696969FF686868FF666666FF656565FF629B75FF5FF78FFF
+ 5BF38AFF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF
+ 3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF
+ 1EB72EFF1AB328FF16AF22FF13AC1CFF0FA817FF0BA411FF07A00BFF128413FF
+ 364036FF383838FF373737FF353535FF343434FF323232EF3131310F00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000006B6B6B9F6A6A6AFF696969FF686868FF666666FF656565FF637F6CFF
+ 5FDA86FF5BF38AFF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF
+ 40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF
+ 22BB34FF1EB72EFF1AB328FF16AF22FF13AC1CFF0FA817FF257127FF3D3D3DFF
+ 3C3C3CFF3A3A3AFF383838FF373737FF353535EF3434342F0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000006B6B6B0F6B6B6BCF6A6A6AFF696969FF686868FF666666FF656565FF
+ 636363FF60AC78FF5BEA87FF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF
+ 44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF
+ 26BE39FF22BB34FF1EB72EFF1AB328FF22942AFF39563BFF404040FF3F3F3FFF
+ 3D3D3DFF3C3C3CFF3A3A3AFF383838EF3737372F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000006B6B6B0F6B6B6B9F6A6A6AFF696969FF686868FF666666FF
+ 656565FF636363FF616B64FF5DA974FF58DD7FFF53EC7EFF50E878FF4CE473FF
+ 48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF
+ 2AC23FFF26BE39FF2D973AFF3C6240FF454545FF444444FF424242FF404040FF
+ 3F3F3FFF3D3D3DFF3C3C3CEF3A3A3A2F00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000006B6B6B8F6A6A6AFF696969FF686868FF
+ 666666FF656565FF636363FF616161FF606060FF5C8267FF58A46DFF52C470FF
+ 4CDB71FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF3AB650FF3C9B4CFF
+ 417A49FF49534AFF4A4A4AFF484848FF474747FF454545FF444444FF424242FF
+ 404040FF3F3F3FCF3D3D3D2F0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000006B6B6B3F6A6A6ADF696969FF
+ 686868FF666666FF656565FF636363FF616161FF606060FF5E5E5EFF5D5D5DFF
+ 5B5B5BFF595959FF585858FF575757FF555555FF535353FF525252FF505050FF
+ 4F4F4FFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF474747FF454545FF444444FF
+ 4242428F4141410F000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000006B6B6B0F6A6A6A7F
+ 696969FF686868FF666666FF656565FF636363FF616161FF606060FF5E5E5EFF
+ 5D5D5DFF5B5B5BFF595959FF585858FF575757FF555555FF535353FF525252FF
+ 505050FF4F4F4FFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF464646BF4545453F
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 6A6A6A1F6969698F686868EF666666FF656565FF636363FF616161FF606060FF
+ 5E5E5EFF5D5D5DFF5B5B5BFF595959FF585858FF575757FF555555FF535353FF
+ 525252FF505050FF4F4F4FFF4D4D4DFF4B4B4BBF4A4A4A3F0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000006767674F6666669F656565EF636363FF616161FF
+ 606060FF5E5E5EFF5D5D5DFF5B5B5BFF595959FF585858FF575757FF555555FF
+ 535353FF525252BF5050506F4F4F4F1F00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000006464641F6262623F
+ 6161617F6060607F5E5E5E7F5C5C5C7F5B5B5B7F5959597F5858585F5656563F
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000FFFF8001FFFF0000FFFC00003FFF0000FFF00000
+ 0FFF0000FFE0000003FF0000FF80000001FF0000FF00000000FF0000FE000000
+ 007F0000FC000000003F0000F8000000001F0000F0000000000F0000F0000000
+ 00070000E000000000070000E000000000030000C000000000030000C0000000
+ 0001000080000000000100008000000000010000800000000000000080000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000800000000000000080000000
+ 000000008000000000010000C000000000010000C000000000010000C0000000
+ 00030000E000000000030000E000000000070000F0000000000F0000F8000000
+ 000F0000FC000000001F0000FC000000003F0000FE000000007F0000FF800000
+ 00FF0000FFC0000001FF0000FFE0000007FF0000FFF800001FFF0000FFFF0000
+ 7FFF0000FFFFE007FFFF00002800000020000000400000000100200000000000
+ 8010000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000002121210F
+ 1F1F1F5F1D1D1D9F1A1A1ACF181818FF151515FF131313FF101010FF0E0E0EDF
+ 0C0C0CBF0A0A0A6F0808081F0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000002929291F2626269F232323FF
+ 212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF101010FF
+ 0E0E0EFF0C0C0CFF090909FF070707BF0606063F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000002D2D2D8F2A2A2AFF282828FF262626FF
+ 232323FF212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF
+ 101010FF0E0E0EFF0C0C0CFF090909FF070707FF050505BF0404041F00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000003434341F323232CF2F2F2FFF2D2D2DFF2A2A2AFF282828FF
+ 1E371EFF0F560FFF086408FF007800FF007500FF007200FF006F00FF026102FF
+ 064906FF0B2B0BFF0E0E0EFF0C0C0CFF090909FF070707FF050505EF0303034F
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000003939392F363636EF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF
+ 1E3F1EFF135313FF0B610BFF007A00FF007800FF007500FF007200FF006F00FF
+ 006C00FF006900FF006100FF073407FF0C0C0CFF090909FF070707FF050505FF
+ 0303035F00000000000000000000000000000000000000000000000000000000
+ 3E3E3E0F3B3B3BEF393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF
+ 2A2A2AFF282828FF262626FF1D341DFF027502FF007800FF007500FF007200FF
+ 006F00FF006C00FF006900FF006700FF025502FF0A170AFF090909FF070707FF
+ 050505FF0303034F000000000000000000000000000000000000000000000000
+ 404040BF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF
+ 2D2D2DFF2A2A2AFF282828FF262626FF096709FF007A00FF007800FF007500FF
+ 007200FF0A490AFF102B10FF121812FF0F160FFF0C190CFF0C0C0CFF090909FF
+ 070707FF050505EF0404041F000000000000000000000000000000004444446F
+ 424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF
+ 2F2F2FFF2D2D2DFF2A2A2AFF282828FF096909FF007D00FF007A00FF007800FF
+ 104310FF1A1A1AFF181818FF151515FF131313FF101010FF0E0E0EFF0C0C0CFF
+ 090909FF070707FF050505BF0000000000000000000000004A4A4A0F474747EF
+ 444444FF424242FF365338FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF
+ 323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF1D341DFF173D17FF
+ 1B2A1BFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF101010FF0D130DFF
+ 0C0C0CFF090909FF070707FF0606063F00000000000000004B4B4B7F494949FF
+ 474747FF3F5240FF1F9227FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF
+ 343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF232323FF
+ 212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF0C260CFF
+ 073407FF0C0C0CFF090909FF070707BF00000000000000004E4E4EDF4B4B4BFF
+ 494949FF2D8D37FF24972EFF424242FF404040FF3D3D3DFF3B3B3BFF393939FF
+ 363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF
+ 232323FF212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF151515FF0E280EFF
+ 006100FF0E0E0EFF0C0C0CFF090909FF0808081F5252522F505050FF4E4E4EFF
+ 49534BFF24BD37FF299B35FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF
+ 393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF
+ 262626FF232323FF212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF102B10FF
+ 006900FF0A310AFF0E0E0EFF0C0C0CFF0A0A0A6F5555556F535353FF505050FF
+ 44744CFF2AC23FFF2EA03CFF474747FF444444FF424242FF404040FF3D3D3DFF
+ 3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF
+ 282828FF262626FF232323FF212121FF1F1F1FFF1C1C1CFF1A1A1AFF122D12FF
+ 006C00FF064906FF101010FF0E0E0EFF0C0C0CBF5757578F555555FF535353FF
+ 428F50FF30C848FF33A543FF494949FF474747FF444444FF424242FF404040FF
+ 3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF
+ 2A2A2AFF282828FF262626FF232323FF212121FF1F1F1FFF1C1C1CFF143014FF
+ 006F00FF026102FF131313FF101010FF0E0E0EEF595959BF575757FF555555FF
+ 41B357FF35CE51FF37AA4AFF4B4B4BFF494949FF474747FF444444FF424242FF
+ 404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF
+ 2D2D2DFF2A2A2AFF282828FF262626FF232323FF212121FF1F1F1FFF153215FF
+ 007200FF006F00FF151515FF131313FF101010FF5C5C5CBF5A5A5AFF575757FF
+ 46B85EFF3BD359FF3CAF51FF4E4E4EFF4B4B4BFF494949FF474747FF444444FF
+ 424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF
+ 2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF232323FF212121FF153A15FF
+ 007500FF007200FF181818FF151515FF131313FF5E5E5EBF5C5C5CFF5A5A5AFF
+ 4ABC65FF41D962FF41B458FF505050FF4E4E4EFF4B4B4BFF494949FF474747FF
+ 444444FF424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF
+ 323232FF2F2F2FFF214421FF2A2A2AFF282828FF1E371EFF164516FF046F04FF
+ 007800FF007500FF1A1A1AFF181818FF151515FF616161BF5F5F5FFF5C5C5CFF
+ 50B96BFF46DF6BFF42D161FF4A8356FF505050FF4E4E4EFF4B4B4BFF494949FF
+ 474747FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF
+ 343434FF323232FF008B00FF008900FF008600FF008300FF008000FF007D00FF
+ 007A00FF007800FF1C1C1CFF1A1A1AFF181818FF6363637F616161FF5F5F5FFF
+ 57A36BFF4CE473FF46DF6BFF41D962FF3DCC59FF3CAF51FF3D934CFF3B8746FF
+ 455847FF474747FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF393939FF
+ 363636FF343434FF008E00FF008B00FF008900FF008600FF008300FF008000FF
+ 007D00FF066A06FF1F1F1FFF1C1C1CFF1A1A1ACF6565655F636363FF616161FF
+ 5C8367FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF
+ 436949FF494949FF474747FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF
+ 393939FF363636FF009100FF008E00FF008B00FF008900FF008600FF008300FF
+ 008000FF0F560FFF212121FF1F1F1FFF1D1D1DAF6767671F666666FF636363FF
+ 616161FF58E682FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF
+ 41844CFF4B4B4BFF494949FF474747FF444444FF424242FF404040FF3D3D3DFF
+ 3B3B3BFF353E35FF009400FF009100FF008E00FF008B00FF008900FF008600FF
+ 008300FF1E371EFF232323FF212121FF1F1F1F5F00000000676767BF666666FF
+ 636363FF5FAB76FF57F085FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF
+ 37C651FF437C4DFF49534BFF494949FF474747FF444444FF424242FF404040FF
+ 335034FF147D15FF009700FF009400FF009100FF008E00FF008B00FF008900FF
+ 0A6F0AFF282828FF262626FF232323FF2121210F000000006A6A6A5F686868FF
+ 666666FF636D66FF5DEC8AFF57F085FF52EA7CFF4CE473FF46DF6BFF41D962FF
+ 3BD359FF35CE51FF30C848FF2EB441FF2EA03CFF299B35FF24972EFF13AC1DFF
+ 0DA614FF08A10CFF029B03FF009700FF009400FF009100FF008E00FF008B00FF
+ 214421FF2A2A2AFF282828FF2626269F0000000000000000000000006A6A6ADF
+ 686868FF666666FF639272FF5DF58DFF57F085FF52EA7CFF4CE473FF46DF6BFF
+ 41D962FF3BD359FF35CE51FF30C848FF2AC23FFF24BD37FF1EB72EFF19B226FF
+ 13AC1DFF0DA614FF08A10CFF029B03FF009700FF009400FF009100FF156615FF
+ 2F2F2FFF2D2D2DFF2A2A2AFF2929291F0000000000000000000000006B6B6B3F
+ 6A6A6AFF686868FF666666FF62AE7CFF5DF58DFF57F085FF52EA7CFF4CE473FF
+ 46DF6BFF41D962FF3BD359FF35CE51FF30C848FF2AC23FFF24BD37FF1EB72EFF
+ 19B226FF13AC1DFF0DA614FF08A10CFF029B03FF009700FF0A820AFF343434FF
+ 323232FF2F2F2FFF2D2D2D8F0000000000000000000000000000000000000000
+ 6B6B6B8F6A6A6AFF686868FF666666FF62AE7CFF5DF58DFF57F085FF52EA7CFF
+ 4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF2AC23FFF24BD37FF
+ 1EB72EFF19B226FF13AC1DFF0DA614FF08A10CFF108311FF353E35FF363636FF
+ 343434FF323232CF3030300F0000000000000000000000000000000000000000
+ 000000006B6B6BBF6A6A6AFF686868FF666666FF639272FF5DEC8AFF57F085FF
+ 52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF2AC23FFF
+ 24BD37FF1EB72EFF19B226FF13AC1DFF26732AFF3D3D3DFF3B3B3BFF393939FF
+ 363636EF3434341F000000000000000000000000000000000000000000000000
+ 000000006B6B6B0F6B6B6BAF6A6A6AFF686868FF666666FF636D66FF5FAB76FF
+ 58E682FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF
+ 2AC23FFF24BD37FF2D8D37FF3F5240FF424242FF404040FF3D3D3DFF3B3B3BEF
+ 3939392F00000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000006B6B6B8F6A6A6AFF686868FF666666FF636363FF
+ 616161FF5C8367FF57A36BFF50B96BFF4ABC65FF46B85EFF41B357FF419750FF
+ 427C4BFF49534BFF494949FF474747FF444444FF424242FF404040BF3E3E3E0F
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000006B6B6B3F6A6A6ADF686868FF666666FF
+ 636363FF616161FF5F5F5FFF5C5C5CFF5A5A5AFF575757FF555555FF535353FF
+ 505050FF4E4E4EFF4B4B4BFF494949FF474747EF4444446F0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000006A6A6A5F676767BF
+ 666666FF636363FF616161FF5F5F5FFF5C5C5CFF5A5A5AFF575757FF555555FF
+ 535353FF505050FF4E4E4EDF4B4B4B7F4A4A4A0F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 6767671F6565655F6363637F616161BF5E5E5EBF5C5C5CBF595959BF5757578F
+ 5555556F5252522F000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000FFC003FFFF0000FFFE00003F
+ F800001FF000000FE0000007E0000003C0000003800000018000000180000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000008000000080000001C0000001C0000003E0000003F0000007
+ F000000FFC00001FFE00007FFF8000FFFFE007FF280000001000000020000000
+ 0100200000000000400400000000000000000000000000000000000000000000
+ 0000000000000000000000002727273F222222AF1D1D1DEF181818FF131313FF
+ 0F0F0FFF0B0B0BAF0707075F0000000000000000000000000000000000000000
+ 000000003535350F303030AF2B2B2BFF213221FF124912FF0E490EFF0B440BFF
+ 0A390AFF0C190CFF0A0A0AFF060606CF0404041F000000000000000000000000
+ 3E3E3E0F393939CF343434FF303030FF263626FF184818FF066A06FF007500FF
+ 007000FF006A00FF044A04FF090F09FF050505EF0404041F0000000000000000
+ 424242AF3E3E3EFF393939FF343434FF303030FF2B2B2BFF145314FF007B00FF
+ 017001FF113311FF111E11FF0E140EFF0A0A0AFF060606CF000000004B4B4B3F
+ 474747FF2E7133FF3E3E3EFF393939FF343434FF303030FF2B2B2BFF223222FF
+ 1B321BFF1D1D1DFF181818FF131313FF092F09FF0A0A0AFF0707075F5050509F
+ 4A534BFF22B132FF434343FF3E3E3EFF393939FF343434FF303030FF2B2B2BFF
+ 262626FF222222FF1D1D1DFF181818FF055405FF0C190CFF0B0B0BAF555555CF
+ 4A7050FF2BC442FF474747FF434343FF3E3E3EFF393939FF343434FF303030FF
+ 2B2B2BFF262626FF222222FF1D1D1DFF065A06FF0A390AFF0F0F0FFF5A5A5AFF
+ 4B975BFF37CF53FF4C4C4CFF474747FF434343FF3E3E3EFF393939FF343434FF
+ 303030FF2B2B2BFF262626FF222222FF075F07FF0B440BFF131313FF5F5F5FFF
+ 539F66FF42DA64FF4E6152FF4C4C4CFF474747FF434343FF3E3E3EFF393939FF
+ 343434FF1E521EFF155915FF096A09FF007B00FF0E490EFF181818FF636363BF
+ 5D8368FF4DE675FF42DA64FF39C853FF3A9048FF474747FF434343FF3E3E3EFF
+ 393939FF1B631BFF008C00FF008600FF008100FF124912FF1D1D1DFF6868688F
+ 646464FF59E884FF4DE675FF42DA64FF3AC054FF46634BFF474747FF434343FF
+ 374A38FF137B13FF009200FF008C00FF008600FF213221FF222222AF6A6A6A1F
+ 686868FF63A679FF59F187FF4DE675FF42DA64FF37CF53FF2BC442FF20B830FF
+ 14AD1FFF09A20EFF019801FF009200FF146414FF2B2B2BFF2727273F00000000
+ 6A6A6A8F686868FF63C283FF59F187FF4DE675FF42DA64FF37CF53FF2BC442FF
+ 20B830FF14AD1FFF09A20EFF0B860CFF313A31FF303030BF0000000000000000
+ 000000006A6A6AAF686868FF63A679FF59E884FF4DE675FF42DA64FF37CF53FF
+ 2BC442FF22B132FF2B7830FF3E3E3EFF393939CF3535350F0000000000000000
+ 00000000000000006A6A6A8F686868FF646464FF5D8368FF539F66FF4B975BFF
+ 487851FF4A534BFF474747FF424242AF3E3E3E0F000000000000000000000000
+ 0000000000000000000000006A6A6A1F6868688F636363BF5F5F5FFF5A5A5AFF
+ 555555CF5050509F4B4B4B3F00000000000000000000000000000000F00F0000
+ C003000080010000800100000000000000000000000000000000000000000000
+ 00000000000000000000000080010000C0010000E0030000F00F0000}
+ end
+ inherited Label1: TLabel
+ Width = 221
+ Caption = 'Data Table Master/Detail Setup Wizard'
+ end
+ inherited Label2: TLabel
+ Width = 295
+ Caption = 'This wizard will help you configure a master/detail relationship'
+ end
+ end
+ inherited pc_Pages: TPageControl
+ Width = 459
+ Height = 401
+ ActivePage = ts_MasterSource
+ inherited ts_Welcome: TTabSheet
+ inherited Label3: TLabel
+ Width = 313
+ Caption = 'Welcome to the Data Table Master/Detail Setup Wizard'
+ end
+ inherited Label4: TLabel
+ Width = 350
+ Height = 39
+ Caption =
+ 'This wizard will help you set up a Master/Detail relationship by' +
+ ' choosing a Master Source for the selected data table and defini' +
+ 'ng how the relationshop between master and detail tables is mapp' +
+ 'ed.'
+ WordWrap = True
+ end
+ object Label24: TLabel
+ Left = 24
+ Top = 72
+ Width = 218
+ Height = 13
+ Caption = 'This wizard will affect the following properties'
+ end
+ object Label25: TLabel
+ Left = 32
+ Top = 88
+ Width = 73
+ Height = 13
+ Caption = '- MasterSource'
+ end
+ object Label26: TLabel
+ Left = 32
+ Top = 104
+ Width = 145
+ Height = 13
+ Caption = '- MasterFields and DetailFields'
+ end
+ object Label27: TLabel
+ Left = 32
+ Top = 136
+ Width = 120
+ Height = 13
+ Caption = '- MasterParamsMappings'
+ end
+ object Label28: TLabel
+ Left = 32
+ Top = 152
+ Width = 120
+ Height = 13
+ Caption = '- MasterRequestMapping'
+ end
+ object Label29: TLabel
+ Left = 32
+ Top = 120
+ Width = 106
+ Height = 13
+ Caption = '- MasterMappingMode'
+ end
+ end
+ object ts_MasterSource: TTabSheet [1]
+ Caption = 'ts_MasterSource'
+ ImageIndex = 6
+ object Label8: TLabel
+ Left = 8
+ Top = 8
+ Width = 105
+ Height = 13
+ Caption = 'Pick MasterSource'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label9: TLabel
+ Left = 24
+ Top = 24
+ Width = 286
+ Height = 13
+ Caption = 'Select the data table to use as master source for this table:'
+ end
+ object Label10: TLabel
+ Left = 8
+ Top = 80
+ Width = 126
+ Height = 13
+ Caption = 'Choose Mapping Mode'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label17: TLabel
+ Left = 24
+ Top = 96
+ Width = 371
+ Height = 13
+ Caption =
+ 'Select what method you want to use fetch detail data for your ma' +
+ 'ster source'
+ end
+ object lbl_Params1: TLabel
+ Left = 42
+ Top = 204
+ Width = 354
+ Height = 39
+ Caption =
+ 'Master key fields will be passed as parameters when fetching det' +
+ 'ail data. Use this if you'#39're talking to a standard DA server, an' +
+ 'd have defined Parameters in data table inside your schema.'
+ WordWrap = True
+ end
+ object lbl_Params2: TLabel
+ Left = 42
+ Top = 248
+ Width = 320
+ Height = 26
+ Caption =
+ 'Your detail data will be fetched via the standard DataRequestCal' +
+ 'l, just like any data table.'
+ WordWrap = True
+ end
+ object lbl_Method1: TLabel
+ Left = 42
+ Top = 324
+ Width = 358
+ Height = 13
+ Caption =
+ 'Data will be retrieved using a custom method you provided in you' +
+ 'r service.'
+ end
+ object lbl_Method2: TLabel
+ Left = 42
+ Top = 344
+ Width = 345
+ Height = 22
+ Caption =
+ 'This option is only available if the detail table uses a separat' +
+ 'e RemoteDataAdapter component with a custom DataRequestCall.'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clGrayText
+ Font.Height = -9
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ ParentFont = False
+ WordWrap = True
+ end
+ object lbl_Params3: TLabel
+ Left = 42
+ Top = 282
+ Width = 298
+ Height = 11
+ Caption =
+ 'This option is only available if your detail data table defines ' +
+ 'parameters.'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clGrayText
+ Font.Height = -9
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ ParentFont = False
+ WordWrap = True
+ end
+ object lbl_Where1: TLabel
+ Left = 42
+ Top = 140
+ Width = 291
+ Height = 13
+ Caption = 'A where clause will be passed to retrieve filtered detail data.'
+ end
+ object lbl_Where2: TLabel
+ Left = 42
+ Top = 160
+ Width = 175
+ Height = 11
+ Caption = 'Recommended for Version 5.0 and above.'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clGrayText
+ Font.Height = -9
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ ParentFont = False
+ end
+ object cb_DataSources: TComboBox
+ Left = 24
+ Top = 40
+ Width = 289
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ TabOrder = 0
+ OnChange = cb_DataSourcesChange
+ end
+ object rb_Where: TRadioButton
+ Left = 24
+ Top = 120
+ Width = 177
+ Height = 13
+ Caption = 'Using automatic WHERE clauses'
+ TabOrder = 1
+ OnClick = cb_DataSourcesChange
+ end
+ object rb_Params: TRadioButton
+ Left = 24
+ Top = 184
+ Width = 129
+ Height = 13
+ Caption = 'Using data parameters'
+ TabOrder = 2
+ OnClick = cb_DataSourcesChange
+ end
+ object rb_Method: TRadioButton
+ Left = 24
+ Top = 304
+ Width = 153
+ Height = 13
+ Caption = 'Using a custom method call'
+ TabOrder = 3
+ OnClick = cb_DataSourcesChange
+ end
+ end
+ object ts_Fields: TTabSheet [2]
+ Caption = 'ts_Fields'
+ ImageIndex = 3
+ object labMasterFields: TLabel
+ Left = 24
+ Top = 80
+ Width = 67
+ Height = 13
+ Caption = '&Master Fields:'
+ FocusControl = lbMaster
+ end
+ object labDetailFields: TLabel
+ Left = 256
+ Top = 80
+ Width = 61
+ Height = 13
+ Caption = '&Detail Fields:'
+ FocusControl = lbDetail
+ end
+ object Label13: TLabel
+ Left = 24
+ Top = 311
+ Width = 64
+ Height = 13
+ Caption = 'MasterFields:'
+ FocusControl = eMasterFields
+ end
+ object Label14: TLabel
+ Left = 24
+ Top = 335
+ Width = 58
+ Height = 13
+ Caption = 'DetailFields:'
+ FocusControl = eDetailFields
+ end
+ object Label18: TLabel
+ Left = 8
+ Top = 8
+ Width = 114
+ Height = 13
+ Caption = 'Master/Detail Fields'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label19: TLabel
+ Left = 24
+ Top = 24
+ Width = 323
+ Height = 13
+ Caption =
+ 'Please select the fields that describe the Master/Detail relatio' +
+ 'nship.'
+ end
+ object lbMaster: TListBox
+ Left = 22
+ Top = 96
+ Width = 164
+ Height = 209
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 0
+ end
+ object lbDetail: TListBox
+ Left = 254
+ Top = 96
+ Width = 164
+ Height = 209
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 1
+ end
+ object eMasterFields: TEdit
+ Left = 97
+ Top = 308
+ Width = 321
+ Height = 21
+ TabOrder = 2
+ Text = 'fdsfdsdsf'
+ OnChange = OnFieldMappingChange
+ end
+ object eDetailFields: TEdit
+ Left = 97
+ Top = 332
+ Width = 321
+ Height = 21
+ TabOrder = 3
+ Text = 'fdsfdsdsf'
+ OnChange = OnFieldMappingChange
+ end
+ object bbAddFieldMapping: TBitBtn
+ Left = 190
+ Top = 96
+ Width = 60
+ Height = 25
+ Caption = '&Add'
+ TabOrder = 4
+ OnClick = bbAddFieldMappingClick
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF03
+ 5D05035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF791058C0D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79105950E035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79105920D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79106950F035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 035D05035D05035D05035D05035D055BF7910C9C18035D05035D05035D05035D
+ 05035D05FF00FFFF00FFFF00FF035D055BF7913BDA6930CF572AC64D21B83C17
+ A62B119F210D9E1C0A9A1506920E05930D058B0D035D05FF00FFFF00FF035D05
+ 5BF7915BF7915BF7915BF7915BF7915BF79118A92F5BF7915BF7915BF7915BF7
+ 915BF791035D05FF00FFFF00FFFF00FF035D05035D05035D05035D05035D055B
+ F79125BC42035D05035D05035D05035D05035D05FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79130CE57035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7913BD968035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79148EB7F035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7915BF791035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF035D05035D05FF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ end
+ object BitBtn4: TBitBtn
+ Left = 190
+ Top = 280
+ Width = 59
+ Height = 25
+ Caption = '&Clear'
+ TabOrder = 5
+ OnClick = BitBtn4Click
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFF2BB81F3C48AF2BC81EF
+ B072EEAF6EEFB275FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFBEBBDFEF3C9FBDEACF3C990FBB67EFFB47DFCCA99FFD9ADFED9A7F0B5
+ 77FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFEFAD3FEF7CCFBDCA9EBCA91A9
+ B86E84AB542B912057A743EAF3C7FCE9BDEEAD6FFF00FFFF00FFFF00FFFF00FF
+ EDA565F3C28AFCF0C4FCE5B5FBD09F2C9622007B00058206067F043DA335FEF2
+ D0F0B173FF00FFFF00FFFF00FFFF00FFEEAB6DEDA767EFB070F6C990FFD8AC2E
+ 9823006E006ABF6BFFF0EA48A138A3AF5EFCAF74FF00FFFF00FFFF00FFFF00FF
+ F2B479F2B77EF0B277F0AC6FFBB57E7AB46041A6416FBC69FFFFFFF4FEFBBCBB
+ 79F3AA6BFF00FFFF00FFFF00FFFF00FFF7C292FAC598F8C293F8C090F3BF8AC2
+ D5A5FFFFFFD9EED556B1534BAF4BB8BC79F8B075FF00FFFF00FFFF00FFF6C792
+ FCD4ADFCD4ACFCD0A9FCD0A9FFD4B55DA94680C780E0F2DE27982400700082B0
+ 5BFFBD90EEAC6DFF00FFFF00FFF6C792FFEAC4FEE3BCFEE2BAFEE0B8FFE0BAD9
+ D9AC0A8209188A16037F0300790077B45DFFCEAAEEAC6DFF00FFFF00FFFADDAB
+ FFFBD5FFF4CCFFF3CAFFF0C9FFEFC5FFF2D1B5D5982A96242B99249ACB87B5D1
+ 95FFE0BAF2B77AFF00FFFF00FFFCEFC4FFFFD8FFFBD3FFFCD4FFFBD3FFFBD4FF
+ FCD4FFFFE1FFFFEBFFFFE7FFFFE0FFF8D7FFF4CBF3C086FF00FFFF00FFFEF4CB
+ FFFFDDFFFFD9FFFFD9FFFFDAFFFED7FEF6CCF8DAA3F4C07DF4C17FF7D8A3FEF2
+ C5FFFFDDF3C991FF00FFFF00FFF4CC96F8DEAFF8DDACF7D8A6F6CF99F3BF80EF
+ AC66EB9D4FEB9C4CEB9F55F0AC6EFAC087FCD3A0FAC089FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFEDA354EFAB68F7BC83FABF
+ 88FABC83FABC83FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFAC088FAC088FAC088FF00FFFF00FF}
+ end
+ end
+ object ts_MethodCall: TTabSheet [3]
+ Caption = 'ts_MethodCall'
+ ImageIndex = 4
+ object labMasterFields2: TLabel
+ Left = 24
+ Top = 80
+ Width = 67
+ Height = 13
+ Caption = '&Master Fields:'
+ end
+ object labDataReqParams: TLabel
+ Left = 256
+ Top = 80
+ Width = 122
+ Height = 13
+ Caption = 'DataRequestCall &Params:'
+ FocusControl = lbDataReqParams
+ end
+ object Label7: TLabel
+ Left = 24
+ Top = 286
+ Width = 273
+ Height = 13
+ Caption = 'Mapp&ings (Detail'#39's DataRequestCall Param=MasterField):'
+ FocusControl = mMappings
+ end
+ object Label20: TLabel
+ Left = 8
+ Top = 8
+ Width = 190
+ Height = 13
+ Caption = 'Map Fields to Method Parameters'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label21: TLabel
+ Left = 24
+ Top = 24
+ Width = 396
+ Height = 39
+ Caption =
+ 'Select how the master fields map to the parameters passed to the' +
+ ' customs GetDataCall you are using to fetch Detail data. Ideally' +
+ ', all fields from the previous page (i.e. all fields involved in' +
+ ' the M/D relationship) should be mapped here.'
+ WordWrap = True
+ end
+ object lbMaster2: TListBox
+ Left = 22
+ Top = 96
+ Width = 164
+ Height = 185
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 0
+ end
+ object lbDataReqParams: TListBox
+ Left = 254
+ Top = 96
+ Width = 164
+ Height = 185
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 1
+ end
+ object mMappings: TMemo
+ Left = 22
+ Top = 302
+ Width = 395
+ Height = 60
+ ScrollBars = ssVertical
+ TabOrder = 2
+ end
+ object bbAddDataReqMapping: TBitBtn
+ Left = 190
+ Top = 96
+ Width = 60
+ Height = 25
+ Caption = '&Add'
+ TabOrder = 3
+ OnClick = bbAddDataReqMappingClick
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF03
+ 5D05035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF791058C0D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79105950E035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79105920D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79106950F035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 035D05035D05035D05035D05035D055BF7910C9C18035D05035D05035D05035D
+ 05035D05FF00FFFF00FFFF00FF035D055BF7913BDA6930CF572AC64D21B83C17
+ A62B119F210D9E1C0A9A1506920E05930D058B0D035D05FF00FFFF00FF035D05
+ 5BF7915BF7915BF7915BF7915BF7915BF79118A92F5BF7915BF7915BF7915BF7
+ 915BF791035D05FF00FFFF00FFFF00FF035D05035D05035D05035D05035D055B
+ F79125BC42035D05035D05035D05035D05035D05FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79130CE57035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7913BD968035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79148EB7F035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7915BF791035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF035D05035D05FF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ end
+ object bbClearDataReqMapping: TBitBtn
+ Left = 190
+ Top = 256
+ Width = 59
+ Height = 25
+ Caption = '&Clear'
+ TabOrder = 4
+ OnClick = bbClearDataReqMappingClick
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFF2BB81F3C48AF2BC81EF
+ B072EEAF6EEFB275FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFBEBBDFEF3C9FBDEACF3C990FBB67EFFB47DFCCA99FFD9ADFED9A7F0B5
+ 77FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFEFAD3FEF7CCFBDCA9EBCA91A9
+ B86E84AB542B912057A743EAF3C7FCE9BDEEAD6FFF00FFFF00FFFF00FFFF00FF
+ EDA565F3C28AFCF0C4FCE5B5FBD09F2C9622007B00058206067F043DA335FEF2
+ D0F0B173FF00FFFF00FFFF00FFFF00FFEEAB6DEDA767EFB070F6C990FFD8AC2E
+ 9823006E006ABF6BFFF0EA48A138A3AF5EFCAF74FF00FFFF00FFFF00FFFF00FF
+ F2B479F2B77EF0B277F0AC6FFBB57E7AB46041A6416FBC69FFFFFFF4FEFBBCBB
+ 79F3AA6BFF00FFFF00FFFF00FFFF00FFF7C292FAC598F8C293F8C090F3BF8AC2
+ D5A5FFFFFFD9EED556B1534BAF4BB8BC79F8B075FF00FFFF00FFFF00FFF6C792
+ FCD4ADFCD4ACFCD0A9FCD0A9FFD4B55DA94680C780E0F2DE27982400700082B0
+ 5BFFBD90EEAC6DFF00FFFF00FFF6C792FFEAC4FEE3BCFEE2BAFEE0B8FFE0BAD9
+ D9AC0A8209188A16037F0300790077B45DFFCEAAEEAC6DFF00FFFF00FFFADDAB
+ FFFBD5FFF4CCFFF3CAFFF0C9FFEFC5FFF2D1B5D5982A96242B99249ACB87B5D1
+ 95FFE0BAF2B77AFF00FFFF00FFFCEFC4FFFFD8FFFBD3FFFCD4FFFBD3FFFBD4FF
+ FCD4FFFFE1FFFFEBFFFFE7FFFFE0FFF8D7FFF4CBF3C086FF00FFFF00FFFEF4CB
+ FFFFDDFFFFD9FFFFD9FFFFDAFFFED7FEF6CCF8DAA3F4C07DF4C17FF7D8A3FEF2
+ C5FFFFDDF3C991FF00FFFF00FFF4CC96F8DEAFF8DDACF7D8A6F6CF99F3BF80EF
+ AC66EB9D4FEB9C4CEB9F55F0AC6EFAC087FCD3A0FAC089FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFEDA354EFAB68F7BC83FABF
+ 88FABC83FABC83FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFAC088FAC088FAC088FF00FFFF00FF}
+ end
+ end
+ object ts_Params: TTabSheet [4]
+ Caption = 'ts_Params'
+ ImageIndex = 5
+ object Label11: TLabel
+ Left = 24
+ Top = 80
+ Width = 74
+ Height = 13
+ Caption = 'Master'#39's Fields:'
+ end
+ object Label12: TLabel
+ Left = 256
+ Top = 80
+ Width = 39
+ Height = 13
+ Caption = 'Params:'
+ FocusControl = lbParams
+ end
+ object Label15: TLabel
+ Left = 24
+ Top = 286
+ Width = 190
+ Height = 13
+ Caption = 'Mappings (Detail'#39's Param=MasterField):'
+ FocusControl = mParamsMappings
+ end
+ object Label22: TLabel
+ Left = 8
+ Top = 8
+ Width = 208
+ Height = 13
+ Caption = 'Map Fields to Data Table Parameters'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label23: TLabel
+ Left = 24
+ Top = 24
+ Width = 399
+ Height = 39
+ Caption =
+ 'Select how the master fields map to the parameters of your detai' +
+ 'l data. Ideally, all fields from the previous page (i.e. all fie' +
+ 'lds involved in the M/D relationship) should be mapped here.'
+ WordWrap = True
+ end
+ object lbMaster3: TListBox
+ Left = 22
+ Top = 96
+ Width = 164
+ Height = 185
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 0
+ end
+ object lbParams: TListBox
+ Left = 254
+ Top = 96
+ Width = 164
+ Height = 185
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 1
+ end
+ object mParamsMappings: TMemo
+ Left = 22
+ Top = 302
+ Width = 395
+ Height = 60
+ ScrollBars = ssVertical
+ TabOrder = 2
+ end
+ object bbAddParamMappingXXX: TBitBtn
+ Left = 190
+ Top = 96
+ Width = 60
+ Height = 25
+ Caption = '&Add'
+ TabOrder = 3
+ OnClick = bbAddParamMappingXXXClick
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF03
+ 5D05035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF791058C0D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79105950E035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79105920D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79106950F035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 035D05035D05035D05035D05035D055BF7910C9C18035D05035D05035D05035D
+ 05035D05FF00FFFF00FFFF00FF035D055BF7913BDA6930CF572AC64D21B83C17
+ A62B119F210D9E1C0A9A1506920E05930D058B0D035D05FF00FFFF00FF035D05
+ 5BF7915BF7915BF7915BF7915BF7915BF79118A92F5BF7915BF7915BF7915BF7
+ 915BF791035D05FF00FFFF00FFFF00FF035D05035D05035D05035D05035D055B
+ F79125BC42035D05035D05035D05035D05035D05FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79130CE57035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7913BD968035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79148EB7F035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7915BF791035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF035D05035D05FF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ end
+ object bbClearParamMappingsXXX: TBitBtn
+ Left = 190
+ Top = 256
+ Width = 59
+ Height = 25
+ Caption = '&Clear'
+ TabOrder = 4
+ OnClick = bbClearParamMappingsXXXClick
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFF2BB81F3C48AF2BC81EF
+ B072EEAF6EEFB275FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFBEBBDFEF3C9FBDEACF3C990FBB67EFFB47DFCCA99FFD9ADFED9A7F0B5
+ 77FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFEFAD3FEF7CCFBDCA9EBCA91A9
+ B86E84AB542B912057A743EAF3C7FCE9BDEEAD6FFF00FFFF00FFFF00FFFF00FF
+ EDA565F3C28AFCF0C4FCE5B5FBD09F2C9622007B00058206067F043DA335FEF2
+ D0F0B173FF00FFFF00FFFF00FFFF00FFEEAB6DEDA767EFB070F6C990FFD8AC2E
+ 9823006E006ABF6BFFF0EA48A138A3AF5EFCAF74FF00FFFF00FFFF00FFFF00FF
+ F2B479F2B77EF0B277F0AC6FFBB57E7AB46041A6416FBC69FFFFFFF4FEFBBCBB
+ 79F3AA6BFF00FFFF00FFFF00FFFF00FFF7C292FAC598F8C293F8C090F3BF8AC2
+ D5A5FFFFFFD9EED556B1534BAF4BB8BC79F8B075FF00FFFF00FFFF00FFF6C792
+ FCD4ADFCD4ACFCD0A9FCD0A9FFD4B55DA94680C780E0F2DE27982400700082B0
+ 5BFFBD90EEAC6DFF00FFFF00FFF6C792FFEAC4FEE3BCFEE2BAFEE0B8FFE0BAD9
+ D9AC0A8209188A16037F0300790077B45DFFCEAAEEAC6DFF00FFFF00FFFADDAB
+ FFFBD5FFF4CCFFF3CAFFF0C9FFEFC5FFF2D1B5D5982A96242B99249ACB87B5D1
+ 95FFE0BAF2B77AFF00FFFF00FFFCEFC4FFFFD8FFFBD3FFFCD4FFFBD3FFFBD4FF
+ FCD4FFFFE1FFFFEBFFFFE7FFFFE0FFF8D7FFF4CBF3C086FF00FFFF00FFFEF4CB
+ FFFFDDFFFFD9FFFFD9FFFFDAFFFED7FEF6CCF8DAA3F4C07DF4C17FF7D8A3FEF2
+ C5FFFFDDF3C991FF00FFFF00FFF4CC96F8DEAFF8DDACF7D8A6F6CF99F3BF80EF
+ AC66EB9D4FEB9C4CEB9F55F0AC6EFAC087FCD3A0FAC089FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFEDA354EFAB68F7BC83FABF
+ 88FABC83FABC83FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFAC088FAC088FAC088FF00FFFF00FF}
+ end
+ end
+ inherited ts_Finish: TTabSheet
+ inherited Label5: TLabel
+ Width = 51
+ Caption = 'That'#39's It!'
+ end
+ inherited Label6: TLabel
+ Width = 217
+ Caption = 'Your Master/Detail relationship is now set up.'
+ end
+ inherited lv_Options: TListView
+ Top = 184
+ Visible = False
+ end
+ end
+ end
+ inherited Panel2: TPanel
+ Top = 445
+ Width = 459
+ inherited btn_Finish: TBitBtn
+ Left = 379
+ OnClick = btn_FinishClick
+ end
+ inherited btn_Next: TBitBtn
+ Left = 379
+ end
+ inherited btn_Back: TBitBtn
+ Left = 299
+ end
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm.pas
new file mode 100644
index 0000000..0c0d22f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm.pas
@@ -0,0 +1,393 @@
+unit uDADataTableMasterLinkWizardForm;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, ComCtrls, Buttons, uDADataTable, uEWWizard, ExtCtrls,
+ DesignIntf;
+
+type
+ TDADataTableMasterLinkWizard = class(TEWWizardForm)
+ ts_Fields: TTabSheet;
+ ts_MethodCall: TTabSheet;
+ ts_Params: TTabSheet;
+ labMasterFields: TLabel;
+ labDetailFields: TLabel;
+ Label13: TLabel;
+ Label14: TLabel;
+ lbMaster: TListBox;
+ lbDetail: TListBox;
+ eMasterFields: TEdit;
+ eDetailFields: TEdit;
+ bbAddFieldMapping: TBitBtn;
+ BitBtn4: TBitBtn;
+ labMasterFields2: TLabel;
+ labDataReqParams: TLabel;
+ Label7: TLabel;
+ lbMaster2: TListBox;
+ lbDataReqParams: TListBox;
+ mMappings: TMemo;
+ bbAddDataReqMapping: TBitBtn;
+ bbClearDataReqMapping: TBitBtn;
+ Label11: TLabel;
+ Label12: TLabel;
+ Label15: TLabel;
+ lbMaster3: TListBox;
+ lbParams: TListBox;
+ mParamsMappings: TMemo;
+ bbAddParamMappingXXX: TBitBtn;
+ bbClearParamMappingsXXX: TBitBtn;
+ ts_MasterSource: TTabSheet;
+ Label8: TLabel;
+ Label9: TLabel;
+ Label18: TLabel;
+ Label19: TLabel;
+ Label20: TLabel;
+ Label21: TLabel;
+ cb_DataSources: TComboBox;
+ Label10: TLabel;
+ Label17: TLabel;
+ rb_Params: TRadioButton;
+ rb_Method: TRadioButton;
+ lbl_Params1: TLabel;
+ lbl_Params2: TLabel;
+ lbl_Method1: TLabel;
+ lbl_Method2: TLabel;
+ Label22: TLabel;
+ Label23: TLabel;
+ lbl_Params3: TLabel;
+ Label24: TLabel;
+ Label25: TLabel;
+ Label26: TLabel;
+ Label27: TLabel;
+ Label28: TLabel;
+ Label29: TLabel;
+ rb_Where: TRadioButton;
+ lbl_Where1: TLabel;
+ lbl_Where2: TLabel;
+ procedure bbAddFieldMappingClick(Sender: TObject);
+ procedure bbAddDataReqMappingClick(Sender: TObject);
+ procedure bbClearDataReqMappingClick(Sender: TObject);
+ procedure BitBtn4Click(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure bbAddParamMappingXXXClick(Sender: TObject);
+ procedure bbClearParamMappingsXXXClick(Sender: TObject);
+ procedure cb_DataSourcesChange(Sender: TObject);
+ procedure btn_FinishClick(Sender: TObject);
+ procedure OnFieldMappingChange(Sender: TObject);
+ private
+ fDataTable: TDADataTable;
+ fMasterSource: TDADataSource;
+ fDesigner: IDesigner;
+ procedure GetDataTables(const aName: string);
+ procedure Initialize;
+
+ protected
+ constructor Create(aOwner : TComponent); reintroduce;
+ procedure AfterEnterPage(aPage:TTabSheet; aMovingForward:boolean); override;
+ procedure OnLeavePage(aPage:TTabSheet; aMovingForward:boolean); override;
+ public
+ class function ExecuteWizard(aDataTable: TDADataTable; aDesigner: IDesigner): boolean;
+ end;
+
+var
+ DADataTableMasterLinkWizard: TDADataTableMasterLinkWizard;
+
+
+implementation
+
+uses uROClasses, TypInfo, uDARemoteDataAdapter, uRODynamicRequest, uRODL;
+
+{$R *.dfm}
+
+procedure TrimNamesAndValues(aSL: TStrings);
+var
+ i: Integer;
+begin
+ for i := 0 to aSL.Count - 1 do begin
+ aSL[i] := Trim(aSL.Names[i]) + {$IFDEF DELPHI7UP}aSL.NameValueSeparator{$ELSE}'='{$ENDIF} + Trim(aSL.Values[aSL.Names[i]]);
+
+ end;
+end;
+
+{ TDataTableMasterLink }
+
+class function TDADataTableMasterLinkWizard.ExecuteWizard(aDataTable: TDADataTable; aDesigner: IDesigner): boolean;
+begin
+ with TDADataTableMasterLinkWizard.Create(NIL) do try
+ fDataTable := aDataTable;
+ fDesigner := aDesigner;
+ Initialize();
+ result := Execute();
+ finally
+ Free;
+ end;
+end;
+
+constructor TDADataTableMasterLinkWizard.Create(aOwner: TComponent);
+begin
+ inherited;
+
+end;
+
+procedure TDADataTableMasterLinkWizard.Initialize;
+var
+ i : integer;
+begin
+ cb_DataSources.Items.Clear();
+ fDesigner.GetComponentNames(GetTypeData(TypeInfo(TDADataSource)), GetDataTables);
+
+ if assigned(fDataTable.MasterSource) then begin
+ cb_DataSources.ItemIndex := cb_DataSources.Items.IndexOf(fDataTable.MasterSource.Name);
+ //lMasterTable := fDataTable.MasterSource.DataTable;
+ //Check(mast=NIL, 'MasterSource doesn''t point to a datatable');
+ end;
+ cb_DataSourcesChange(nil);
+
+ Caption := Format(Caption, [fDataTable.Name]);
+
+ eMasterFields.Text := fDataTable.MasterFields;
+ eDetailFields.Text := fDataTable.DetailFields;
+ mMappings.Lines.Text := fDataTable.MasterRequestMappings.Text;
+ mParamsMappings.Lines.Text := fDataTable.MasterParamsMappings.Text;
+
+ for i := 0 to (fDataTable.FieldCount-1) do
+ lbDetail.Items.Add(fDataTable.Fields[i].Name);
+
+ for i := 0 to (fDataTable.Params.Count-1) do
+ lbParams.Items.Add(fDataTable.Params[i].Name);
+
+ case fDataTable.MasterMappingMode of
+ mmParams: rb_Params.Checked := true;
+ mmDataRequest: rb_Method.Checked := true;
+ mmWhere: rb_Where.Checked := true;
+ end;
+end;
+
+procedure TDADataTableMasterLinkWizard.cb_DataSourcesChange(Sender: TObject);
+var
+ lMasterTable: TDADataTable;
+ lCall: TRODynamicRequest;
+ i: integer;
+begin
+ inherited;
+ fMasterSource := fDesigner.GetComponent(cb_DataSources.Text) as TDADataSource;
+
+ if assigned(fMasterSource) and assigned(fMasterSource.DataTable) then begin
+ lMasterTable := fMasterSource.DataTable;
+
+ rb_Params.Enabled := fDataTable.Params.Count > 0;
+ lbl_Params1.Enabled := rb_Params.Enabled;
+ lbl_Params2.Enabled := rb_Params.Enabled;
+
+ rb_Method.Enabled := assigned(lMasterTable.RemoteDataAdapter) and
+ assigned(fDataTable.RemoteDataAdapter) and
+ (lMasterTable.RemoteDataAdapter <> fDataTable.RemoteDataAdapter) and
+ lMasterTable.RemoteFetchEnabled and fDataTable.RemoteFetchEnabled;
+ lbl_Method1.Enabled := rb_Method.Enabled;
+
+ if (not rb_Params.Enabled and rb_Params.Checked) or (not rb_Method.Enabled and rb_Method.Checked) then
+ rb_Where.Checked := true;
+
+ lbMaster.Items.Clear();
+ lbMaster2.Items.Clear();
+ lbMaster3.Items.Clear();
+ for i := 0 to (lMasterTable.FieldCount-1) do begin
+ lbMaster.Items.Add(lMasterTable.Fields[i].Name);
+ lbMaster2.Items.Add(lMasterTable.Fields[i].Name);
+ lbMaster3.Items.Add(lMasterTable.Fields[i].Name);
+ end;
+
+ if fDataTable.RemoteFetchEnabled and
+ assigned(fDataTable.RemoteDataAdapter) and (fDataTable.RemoteDataAdapter is TDARemoteDataAdapter) then begin
+ lCall := (fDataTable.RemoteDataAdapter as TDARemoteDataAdapter).GetDataCall;
+ lbDataReqParams.Items.Clear();
+ for i := 0 to lCall.Params.Count-1 do
+ if lCall.Params[i].Flag in [fIn, fInOut] then
+ lbDataReqParams.Items.Add(lCall.Params[i].Name);
+ end
+ else begin
+ lbDataReqParams.Enabled := false;
+ end;
+
+ if pc_Pages.ActivePage = ts_MasterSource then
+ btn_Next.Enabled := (rb_Where.Enabled and rb_Where.Checked) or (rb_Params.Enabled and rb_Params.Checked) or (rb_Method.Enabled and rb_Method.Checked);
+ end
+ else begin
+ if pc_Pages.ActivePage = ts_MasterSource then
+ btn_Next.Enabled := false;
+ end;
+end;
+
+
+procedure TDADataTableMasterLinkWizard.GetDataTables(const aName: string);
+var
+ lDataSource: TDADataSource;
+begin
+ lDataSource := fDesigner.GetComponent(aName) as TDADataSource;
+ if assigned(lDataSource.DataTable) and assigned(lDataSource.DataTable) and (lDataSource.DataTable <> fDataTable) then
+ cb_DataSources.Items.Add(aName);
+end;
+
+procedure TDADataTableMasterLinkWizard.bbAddFieldMappingClick(Sender: TObject);
+var x : integer;
+begin
+ if (lbMaster.SelCount=0) or (lbMaster.SelCount<>lbDetail.SelCount) then begin
+ Beep;
+ Exit;
+ end;
+
+ for x := 0 to (lbMaster.Items.Count-1) do
+ if lbMaster.Selected[x] then begin
+ if (eMasterFields.Text<>'')
+ then eMasterFields.Text := eMasterFields.Text+';';
+ eMasterFields.Text := eMasterFields.Text+lbMaster.Items[x];
+ end;
+
+ for x := 0 to (lbDetail.Items.Count-1) do
+ if lbDetail.Selected[x] then begin
+ if (eDetailFields.Text<>'')
+ then eDetailFields.Text := eDetailFields.Text+';';
+ eDetailFields.Text := eDetailFields.Text+lbDetail.Items[x];
+ end;
+ OnFieldMappingChange(nil);
+end;
+
+procedure TDADataTableMasterLinkWizard.bbAddDataReqMappingClick(Sender: TObject);
+var x, i : integer;
+ s : TStringList;
+begin
+ if (lbMaster2.SelCount=0) or (lbDataReqParams.SelCount<>lbMaster2.SelCount) then begin
+ Beep;
+ Exit;
+ end;
+
+ s := TStringList.Create;
+ try
+ for x := 0 to (lbDataReqParams.Items.Count-1) do
+ if lbDataReqParams.Selected[x] then s.Add(lbDataReqParams.Items[x]+'=');
+
+ i := 0;
+ for x := 0 to (lbMaster2.Items.Count-1) do
+ if lbMaster2.Selected[x] then begin
+ s[i] := s[i]+lbMaster2.Items[x];
+ Inc(i);
+ end;
+
+ mMappings.Lines.AddStrings(s);
+ finally
+ s.Free;
+ end;
+end;
+
+procedure TDADataTableMasterLinkWizard.bbClearDataReqMappingClick(Sender: TObject);
+begin
+ mMappings.Lines.Clear
+end;
+
+procedure TDADataTableMasterLinkWizard.BitBtn4Click(Sender: TObject);
+begin
+ eMasterFields.Text := '';
+ eDetailFields.Text := '';
+ OnFieldMappingChange(nil);
+end;
+
+procedure TDADataTableMasterLinkWizard.OnFieldMappingChange(
+ Sender: TObject);
+begin
+ inherited;
+ if pc_Pages.ActivePage = ts_Fields then
+ btn_Next.Enabled := (eMasterFields.Text <> '') and (eDetailFields.Text <> '');
+end;
+
+procedure TDADataTableMasterLinkWizard.FormCreate(Sender: TObject);
+begin
+ inherited;
+ //PageControl1.ActivePageIndex := 0
+
+end;
+
+procedure TDADataTableMasterLinkWizard.bbAddParamMappingXXXClick(Sender: TObject);
+var x, i : integer;
+ s : TStringList;
+begin
+ if (lbMaster3.SelCount=0) or (lbParams.SelCount<>lbMaster3.SelCount) then begin
+ Beep;
+ Exit;
+ end;
+
+ s := TStringList.Create;
+ try
+ for x := 0 to (lbParams.Items.Count-1) do
+ if lbParams.Selected[x] then s.Add(lbParams.Items[x]+'=');
+
+ i := 0;
+ for x := 0 to (lbMaster3.Items.Count-1) do
+ if lbMaster3.Selected[x] then begin
+ s[i] := s[i]+lbMaster3.Items[x];
+ Inc(i);
+ end;
+
+ mParamsMappings.Lines.AddStrings(s);
+ finally
+ s.Free;
+ end;
+end;
+
+procedure TDADataTableMasterLinkWizard.bbClearParamMappingsXXXClick(Sender: TObject);
+begin
+ mParamsMappings.Lines.Clear
+end;
+
+procedure TDADataTableMasterLinkWizard.btn_FinishClick(Sender: TObject);
+begin
+ inherited;
+
+ fDataTable.MasterSource := fMasterSource;
+ fDataTable.MasterFields := eMasterFields.Text;
+ fDataTable.DetailFields := eDetailFields.Text;
+
+ TrimNamesAndValues(mMappings.Lines);
+ TrimNamesAndValues(mParamsMappings.Lines);
+
+ fDataTable.MasterRequestMappings.Text := mMappings.Lines.Text;
+ fDataTable.MasterParamsMappings.Text := mParamsMappings.Lines.Text;
+
+ if rb_Where.Checked then
+ fDataTable.MasterMappingMode := mmWhere
+ else if rb_Params.Checked then
+ fDataTable.MasterMappingMode := mmParams
+ else if rb_Method.Checked then
+ fDataTable.MasterMappingMode := mmDataRequest;
+
+end;
+
+procedure TDADataTableMasterLinkWizard.AfterEnterPage(aPage: TTabSheet;
+ aMovingForward: boolean);
+begin
+ inherited;
+ if (aPage = ts_MasterSource) and aMovingForward then begin
+ cb_DataSourcesChange(nil);
+ end
+ else if (aPage = ts_Fields) and aMovingForward then begin
+ OnFieldMappingChange(nil);
+ end;
+end;
+
+procedure TDADataTableMasterLinkWizard.OnLeavePage(aPage: TTabSheet;
+ aMovingForward: boolean);
+begin
+ inherited;
+ if (aPage = ts_Fields) and aMovingForward then begin
+ if rb_Where.Checked then NextPage := ts_Finish.PageIndex
+ else if rb_Params.Checked then NextPage := ts_Params.PageIndex
+ else if rb_Method.Checked then NextPage := ts_MethodCall.PageIndex;
+ end
+ else if (aPage = ts_Params) or (aPage = ts_MethodCall) then begin
+ NextPage := ts_Finish.PageIndex;
+ PreviousPage := ts_Fields.PageIndex;
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm_laz.lfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm_laz.lfm
new file mode 100644
index 0000000..0219847
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm_laz.lfm
@@ -0,0 +1,1354 @@
+object DADataTableMasterLinkWizard: TDADataTableMasterLinkWizard
+ Left = 488
+ Height = 515
+ Top = 173
+ Width = 448
+ HorzScrollBar.Page = 447
+ VertScrollBar.Page = 514
+ ActiveControl = pc_Pages
+ Caption = 'Form1'
+ ClientHeight = 515
+ ClientWidth = 448
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ LCLVersion = '0.9.25'
+ object Bevel1: TBevel
+ Height = 2
+ Top = 42
+ Width = 448
+ Align = alTop
+ Shape = bsBottomLine
+ end
+ object Label16: TLabel
+ Left = 8
+ Height = 16
+ Top = 366
+ Width = 86
+ Caption = 'Mapping Mode:'
+ ParentColor = False
+ end
+ object Panel1: TPanel
+ Height = 42
+ Width = 448
+ Align = alTop
+ BevelOuter = bvNone
+ ClientHeight = 42
+ ClientWidth = 448
+ Color = clWhite
+ ParentColor = False
+ TabOrder = 0
+ object Image1: TImage
+ Left = 5
+ Height = 32
+ Top = 5
+ Width = 32
+ Picture.Data = {
+ 055449636F6E012200002F2A2058504D202A2F0A737461746963206368617220
+ 2A677261706869635B5D203D207B0A223438203438203234312032222C0A222E
+ 2E2063204E6F6E65222C0A222E2C20632023363636363636222C0A222E2D2063
+ 2023363536353635222C0A222E2A20632023363336333633222C0A222E612063
+ 2023363136313631222C0A222E6220632023363036303630222C0A222E632063
+ 2023354535453545222C0A222E6420632023354435443544222C0A222E652063
+ 2023354235423542222C0A222E6620632023353935393539222C0A222E672063
+ 2023353835383538222C0A222E6820632023353735373537222C0A222E692063
+ 2023353535353535222C0A222E6A20632023353335333533222C0A222E6B2063
+ 2023353235323532222C0A222E6C20632023363936393639222C0A222E6D2063
+ 2023363836383638222C0A222E6E20632023353035303530222C0A222E6F2063
+ 2023344634463446222C0A222E7020632023344434443444222C0A222E712063
+ 2023344234423442222C0A222E7220632023344134413441222C0A222E732063
+ 2023343834383438222C0A222E7420632023343634363436222C0A222E752063
+ 2023364136413641222C0A222E7620632023343734373437222C0A222E772063
+ 2023343534353435222C0A222E7820632023343434343434222C0A222E792063
+ 2023343234323432222C0A222E7A20632023364236423642222C0A222E412063
+ 2023363738323543222C0A222E4220632023364441343538222C0A222E432063
+ 2023373043343532222C0A222E4420632023373144423443222C0A222E452063
+ 2023364445303438222C0A222E4620632023363744443434222C0A222E472063
+ 2023363144393430222C0A222E4820632023354244353344222C0A222E492063
+ 2023353644313339222C0A222E4A20632023353042363341222C0A222E4B2063
+ 2023344339423343222C0A222E4C20632023343937413431222C0A222E4D2063
+ 2023344135333439222C0A222E4E20632023343034303430222C0A222E4F2063
+ 2023334633463346222C0A222E5020632023363436423631222C0A222E512063
+ 2023373441393544222C0A222E5220632023374644443538222C0A222E532063
+ 2023374545433533222C0A222E5420632023373845383530222C0A222E552063
+ 2023373345343443222C0A222E5620632023353043443335222C0A222E572063
+ 2023344143413331222C0A222E5820632023343443363244222C0A222E592063
+ 2023334643323241222C0A222E5A20632023333942453236222C0A222E302063
+ 2023334139373244222C0A222E3120632023343036323343222C0A222E322063
+ 2023334433443344222C0A222E3320632023334333433343222C0A222E342063
+ 2023373841433630222C0A222E3520632023383745413542222C0A222E362063
+ 2023383445463537222C0A222E3720632023333442423232222C0A222E382063
+ 2023324542373145222C0A222E3920632023323842333141222C0A222E402063
+ 2023324139343232222C0A222E2320632023334235363339222C0A222E3B2063
+ 2023334133413341222C0A222E3A20632023333833383338222C0A222E3D2063
+ 2023364337463633222C0A222E2B20632023383644413546222C0A222E252063
+ 2023384146333542222C0A222E2420632023323241463136222C0A222E282063
+ 2023314341433133222C0A222E2920632023313741383046222C0A222E5B2063
+ 2023323737313235222C0A222E5D20632023333733373337222C0A222C2E2063
+ 2023333533353335222C0A222C2C20632023373539423632222C0A222C2D2063
+ 2023384646373546222C0A222C2A20632023313141343042222C0A222C612063
+ 2023304241303037222C0A222C6220632023313338343132222C0A222C632063
+ 2023333634303336222C0A222C6420632023333433343334222C0A222C652063
+ 2023333233323332222C0A222C6620632023303539443034222C0A222C672063
+ 2023303039393030222C0A222C6820632023304138353041222C0A222C692063
+ 2023333333443333222C0A222C6A20632023333033303330222C0A222C6B2063
+ 2023324632463246222C0A222C6C20632023303039373030222C0A222C6D2063
+ 2023303039353030222C0A222C6E20632023304138313041222C0A222C6F2063
+ 2023324532453245222C0A222C7020632023384345443546222C0A222C712063
+ 2023303039333030222C0A222C7220632023303039313030222C0A222C732063
+ 2023313336433133222C0A222C7420632023324332433243222C0A222C752063
+ 2023324132413241222C0A222C7620632023303038463030222C0A222C772063
+ 2023303038443030222C0A222C7820632023323034433230222C0A222C792063
+ 2023323932393239222C0A222C7A20632023343241343332222C0A222C412063
+ 2023334541313246222C0A222C4220632023334538323335222C0A222C432063
+ 2023334237463332222C0A222C4420632023333538333244222C0A222C452063
+ 2023324239343232222C0A222C4620632023323639313146222C0A222C472063
+ 2023303038423030222C0A222C4820632023303238343032222C0A222C492063
+ 2023323933323239222C0A222C4A20632023323732373237222C0A222C4B2063
+ 2023323632363236222C0A222C4C20632023344439433343222C0A222C4D2063
+ 2023344336343437222C0A222C4E20632023324535433243222C0A222C4F2063
+ 2023303038393030222C0A222C5020632023303038373030222C0A222C512063
+ 2023313535383135222C0A222C5220632023323432343234222C0A222C532063
+ 2023344537443434222C0A222C5420632023304537463045222C0A222C552063
+ 2023303038353030222C0A222C5620632023303237453032222C0A222C572063
+ 2023323232323232222C0A222C5820632023323132313231222C0A222C592063
+ 2023314236363142222C0A222C5A20632023303038343030222C0A222C302063
+ 2023303038323030222C0A222C3120632023313734373137222C0A222C322063
+ 2023314631463146222C0A222C3320632023363537393544222C0A222C342063
+ 2023314236343142222C0A222C3520632023303038303030222C0A222C362063
+ 2023304236323042222C0A222C3720632023314531453145222C0A222C382063
+ 2023314136323141222C0A222C3920632023303037453030222C0A222C402063
+ 2023303237373032222C0A222C2320632023314331433143222C0A222C3B2063
+ 2023314231423142222C0A222C3A20632023353542393345222C0A222C3D2063
+ 2023353139373431222C0A222C2B20632023344438433430222C0A222C252063
+ 2023344236423435222C0A222C2420632023343836393433222C0A222C282063
+ 2023343636373431222C0A222C2920632023313936303139222C0A222C5B2063
+ 2023303037433030222C0A222C5D20632023303037413030222C0A222D2E2063
+ 2023313933303139222C0A222D2C20632023314131413141222C0A222D2D2063
+ 2023313931393139222C0A222D2A20632023353839433437222C0A222D612063
+ 2023353236323446222C0A222D6220632023313835463138222C0A222D632063
+ 2023303037383030222C0A222D6420632023313433393134222C0A222D652063
+ 2023313731373137222C0A222D6620632023353941343435222C0A222D672063
+ 2023314435313144222C0A222D6820632023304536443045222C0A222D692063
+ 2023313535413135222C0A222D6A20632023313435363134222C0A222D6B2063
+ 2023304536303045222C0A222D6C20632023303736463037222C0A222D6D2063
+ 2023303037363030222C0A222D6E20632023304534383045222C0A222D6F2063
+ 2023313631363136222C0A222D7020632023353439323435222C0A222D712063
+ 2023323032383230222C0A222D7220632023304335393043222C0A222D732063
+ 2023303037343030222C0A222D7420632023304434363044222C0A222D752063
+ 2023313431343134222C0A222D7620632023353138463433222C0A222D772063
+ 2023303037333030222C0A222D7820632023304334353043222C0A222D792063
+ 2023313331333133222C0A222D7A20632023303037313030222C0A222D412063
+ 2023304234333042222C0A222D4220632023313131313131222C0A222D432063
+ 2023343938393344222C0A222D4420632023303036463030222C0A222D452063
+ 2023304333433043222C0A222D4620632023304630463046222C0A222D472063
+ 2023353041453342222C0A222D4820632023343538373342222C0A222D492063
+ 2023303036443030222C0A222D4A20632023304632413046222C0A222D4B2063
+ 2023304530453045222C0A222D4C20632023343238343338222C0A222D4D2063
+ 2023303036423030222C0A222D4E20632023313131383131222C0A222D4F2063
+ 2023304330433043222C0A222D5020632023303335393033222C0A222D512063
+ 2023303036393030222C0A222D5220632023303734323037222C0A222D532063
+ 2023304230423042222C0A222D5420632023333737433330222C0A222D552063
+ 2023303036373030222C0A222D5620632023304431413044222C0A222D572063
+ 2023303930393039222C0A222D5820632023333337413244222C0A222D592063
+ 2023303434423034222C0A222D5A20632023303830383038222C0A222D302063
+ 2023333037373242222C0A222D3120632023303036363030222C0A222D322063
+ 2023304132333041222C0A222D3320632023324337343238222C0A222D342063
+ 2023303533463035222C0A222D3520632023303630363036222C0A222D362063
+ 2023314133393141222C0A222D3720632023313633443136222C0A222D382063
+ 2023313034433130222C0A222D3920632023303530353035222C0A222D402063
+ 2023303430343034222C0A222D2320632023303336343033222C0A222D3B2063
+ 2023304234313042222C0A222D3A20632023313031443130222C0A222D3D2063
+ 2023304531353045222C0A222D2B20632023304331393043222C0A222D252063
+ 2023303135413031222C0A222D2420632023304131443041222C0A222D282063
+ 2023303330333033222C0A222D2920632023313634343136222C0A222D5B2063
+ 2023303237353032222C0A222D5D20632023304231323042222C0A222A2E2063
+ 2023323433343234222C0A222A2C20632023313435343134222C0A222A2D2063
+ 2023313335333133222C0A222A2A20632023303936373039222C0A222A612063
+ 2023304231453042222C0A222A6220632023303933373039222C0A222A632063
+ 2023304430443044222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2C2E2D2E2A2E612E622E632E64
+ 2E652E662E672E682E692E6A2E6B2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E6C2E6D2E2C2E2D2E2A2E612E622E63
+ 2E642E652E662E672E682E692E6A2E6B2E6E2E6F2E702E712E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E6C2E6D2E2C2E2D2E2A2E612E62
+ 2E632E642E652E662E672E682E692E6A2E6B2E6E2E6F2E702E712E722E732E74
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E752E6C2E6D2E2C2E2D2E2A2E61
+ 2E622E632E642E652E662E672E682E692E6A2E6B2E6E2E6F2E702E712E722E73
+ 2E762E772E782E792E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A22
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E7A2E752E6C2E6D2E2C2E2D2E2A
+ 2E612E622E412E422E432E442E452E462E472E482E492E4A2E4B2E4C2E4D2E72
+ 2E732E762E772E782E792E4E2E4F2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E7A2E752E6C2E6D2E2C2E2D
+ 2E2A2E502E512E522E532E542E552E452E462E472E482E492E562E572E582E59
+ 2E5A2E302E312E772E782E792E4E2E4F2E322E332E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E7A2E752E6C2E6D2E2C
+ 2E2D2E2A2E342E352E362E532E542E552E452E462E472E482E492E562E572E58
+ 2E592E5A2E372E382E392E402E232E4E2E4F2E322E332E3B2E3A2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E7A2E752E6C2E6D
+ 2E2C2E2D2E3D2E2B2E252E362E532E542E552E452E462E472E482E492E562E57
+ 2E582E592E5A2E372E382E392E242E282E292E5B2E322E332E3B2E3A2E5D2C2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E7A2E752E6C
+ 2E6D2E2C2E2D2C2C2C2D2E252E362E532E542E552E452E462E472E482E492E56
+ 2E572E582E592E5A2E372E382E392E242E282E292C2A2C612C622C632E3A2E5D
+ 2C2E2C642C652E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E75
+ 2E6C2E6D2E2C2E2D2C2C2C2D2E252E362E532E542E552E452E462E472E482E49
+ 2E562E572E582E592E5A2E372E382E392E242E282E292C2A2C612C662C672C68
+ 2C692C2E2C642C652C6A2C6B2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E
+ 2E752E6C2E6D2E2C2E2D2C2C2C2D2E252E362E532E542E552E452E462E472E48
+ 2E492E562E572E582E592E5A2E372E382E392E242E282E292C2A2C612C662C67
+ 2C6C2C6D2C6E2C642C652C6A2C6B2C6F2E2E2E2E2E2E2E2E222C0A222E2E2E2E
+ 2E2E2E2E2E6C2E6D2E2C2E2D2E3D2C702E252E362E532E542E552E452E462E47
+ 2E482E492E562E572E582E592E5A2E372E382E392E242E282E292C2A2C612C66
+ 2C672C6C2C6D2C712C722C732C6A2C6B2C6F2C742C752E2E2E2E2E2E222C0A22
+ 2E2E2E2E2E2E2E6C2E6D2E2C2E2D2E2A2E2B2E252E362E532E542E552E452E46
+ 2E472E482E492E562E572E582E592E5A2E372E382E392E242E282E292C2A2C61
+ 2C662C672C6C2C6D2C712C722C762C772C782C6F2C742C752C792E2E2E2E2E2E
+ 222C0A222E2E2E2E2E2E2E6D2E2C2E2D2E2A2E342E252E362E532E542E552E45
+ 2E462E472E482E492E562E572E582C7A2C412C422C432C442C452C462E292C2A
+ 2C612C662C672C6C2C6D2C712C722C762C772C472C482C492C752C792C4A2C4B
+ 2E2E2E2E222C0A222E2E2E2E2E6D2E2C2E2D2E2A2E502E352E362E532E542E55
+ 2E452E462E472E482E492E562C4C2C4D2E712E722E732E762E772E782E792E4E
+ 2E4F2C4E2C622C672C6C2C6D2C712C722C762C772C472C4F2C502C512C792C4A
+ 2C4B2C522E2E2E2E222C0A222E2E2E2E2E2C2E2D2E2A2E612E512E362E532E54
+ 2E552E452E462E472E482E492E562C532E702E712E722E732E762E772E782E79
+ 2E4E2E4F2E322E332E3B2C542C6D2C712C722C762C772C472C4F2C502C552C56
+ 2C4A2C4B2C522C572C582E2E222C0A222E2E2E2C2E2D2E2A2E612E622E522E53
+ 2E542E552E452E462E472E482E492E562E572E702E712E722E732E762E772E78
+ 2E792E4E2E4F2E322E332E3B2E3A2C592C712C722C762C772C472C4F2C502C55
+ 2C5A2C302C312C522C572C582C322E2E222C0A222E2E2E2D2E2A2E612E622C33
+ 2E532E542E552E452E462E472E482E492E562E572E582E712E722E732E762E77
+ 2E782E792E4E2E4F2E322E332E3B2E3A2E5D2C342C722C762C772C472C4F2C50
+ 2C552C5A2C302C352C362C572C582C322C372E2E222C0A222E2E2E2A2E612E62
+ 2E632E422E542E552E452E462E472E482E492E562E572E582E592E722E732E76
+ 2E772E782E792E4E2E4F2E322E332E3B2E3A2E5D2C2E2C382C762C772C472C4F
+ 2C502C552C5A2C302C352C392C402C582C322C372C232C3B222C0A222E2E2E61
+ 2E622E632E642E432E552E452E462E472E482C3A2C3D2C2B2C252C242C282E73
+ 2E762E772E782E792E4E2E4F2E322E332E3B2E3A2E5D2C2E2C642C292C772C47
+ 2C4F2C502C552C5A2C302C352C392C5B2C5D2D2E2C372C232D2C2D2D222C0A22
+ 2E2E2E622E632E642E652E442E452E462E472D2A2D612E6E2E6F2E702E712E72
+ 2E732E762E772E782E792E4E2E4F2E322E332E3B2E3A2E5D2C2E2C642C652D62
+ 2C472C4F2C502C552C5A2C302C352C392C5B2C5D2D632D642C232D2C2D2D2D65
+ 222C0A222E2E2E632E642E652E662E452E462E472D662E6B2E6E2E6F2E702E71
+ 2E722E732E762E772E782E792E4E2E4F2E322E332E3B2E3A2E5D2C2E2C642C65
+ 2C6A2D672D682D692C512D6A2D6B2D6C2C392C5B2C5D2D632D6D2D6E2D2C2D2D
+ 2D652D6F222C0A222E2E2E642E652E662E672E462E472E482D702E6E2E6F2E70
+ 2E712E722E732E762E772E782E792E4E2E4F2E322E332E3B2E3A2E5D2C2E2C64
+ 2C652C6A2C6B2C6F2C742C752C792C4A2C4B2C522D712D722D632D6D2D732D74
+ 2D2D2D652D6F2D75222C0A222E2E2E652E662E672E682E472E482E492D762E6F
+ 2E702E712E722E732E762E772E782E792E4E2E4F2E322E332E3B2E3A2E5D2C2E
+ 2C642C652C6A2C6B2C6F2C742C752C792C4A2C4B2C522C572C582C322D6D2D73
+ 2D772D782D652D6F2D752D79222C0A222E2E2E662E672E682E692E482E492E56
+ 2C2B2E702E712E722E732E762E772E782E792E4E2E4F2E322E332E3B2E3A2E5D
+ 2C2E2C642C652C6A2C6B2C6F2C742C752C792C4A2C4B2C522C572C582C322C37
+ 2D732D772D7A2D412D6F2D752D792D42222C0A222E2E2E672E682E692E6A2E49
+ 2E562E572D432E712E722E732E762E772E782E792E4E2E4F2E322E332E3B2E3A
+ 2E5D2C2E2C642C652C6A2C6B2C6F2C742C752C792C4A2C4B2C522C572C582C32
+ 2C372C232D772D7A2D442D452D752D792D422D46222C0A222E2E2E682E692E6A
+ 2E6B2D472E572E582D482E722E732E762E772E782E792E4E2E4F2E322E332E3B
+ 2E3A2E5D2C2E2C642C652C6A2C6B2C6F2C742C752C792C4A2C4B2C522C572C58
+ 2C322C372C232D2C2D7A2D442D492D4A2D792D422D462D4B222C0A222E2E2E69
+ 2E6A2E6B2E6E2E4B2E582E592D4C2E732E762E772E782E792E4E2E4F2E322E33
+ 2E3B2E3A2E5D2C2E2C642C652C6A2C6B2C6F2C742C752C792C4A2C4B2C522C57
+ 2C582C322C372C232D2C2D2D2D442D492D4D2D4E2D422D462D4B2D4F222C0A22
+ 2E2E2E6A2E6B2E6E2E6F2E4C2E592E5A2C422E762E772E782E792E4E2E4F2E32
+ 2E332E3B2E3A2E5D2C2E2C642C652C6A2C6B2C6F2C742C752C792C4A2C4B2C52
+ 2C572C582C322C372C232D2C2D2D2D652D492D4D2D502D422D462D4B2D4F2E2E
+ 222C0A222E2E2E6B2E6E2E6F2E702E4D2E5A2E372C432E772E782E792E4E2E4F
+ 2E322E332E3B2E3A2E5D2C2E2C642C652C6A2C6B2C6F2C742C752C792C4A2C4B
+ 2C522C572C582C322C372C232D2C2D2D2D652D6F2D4D2D512D522D462D4B2D4F
+ 2D532E2E222C0A222E2E2E2E2E6F2E702E712E722E302E382D542E782E792E4E
+ 2E4F2E322E332E3B2E3A2E5D2C2E2C642C652C6A2C6B2C6F2C742C752C792C4A
+ 2C4B2C522C572C582C322C372C232D2C2D2D2D652D6F2D752D512D552D562D4B
+ 2D4F2D532D572E2E222C0A222E2E2E2E2E702E712E722E732E312E392D582E79
+ 2E4E2E4F2E322E332E3B2E3A2E5D2C2E2C642C652C6A2C6B2C6F2C742C752C79
+ 2C4A2C4B2C522C572C582C322C372C232D2C2D2D2D652D6F2D752D792D552D59
+ 2D4B2D4F2D532D572D5A2E2E222C0A222E2E2E2E2E712E722E732E762E772E40
+ 2D302E4E2E4F2E322E332E3B2E3A2E5D2C2E2C642C652C6A2C6B2C6F2C742C75
+ 2C792C4A2C4B2C522C572C582C322C372C232D2C2D2D2D652D6F2D752D792D42
+ 2D312D322D4F2D532D572D5A2E2E2E2E222C0A222E2E2E2E2E2E2E732E762E77
+ 2E782E232D332E4F2E322E332E3B2E3A2E5D2C2E2C642C652C6A2C6B2C6F2C74
+ 2C752C792C4A2C4B2C522C572C582C322C372C232D2C2D2D2D652D6F2D752D79
+ 2D422D462D342D4F2D532D572D5A2D352E2E2E2E222C0A222E2E2E2E2E2E2E74
+ 2E772E782E792E4E2E4F2E322E332E3B2E3A2E5D2C2E2C642C652C6A2C6B2C6F
+ 2C742C752C792C4A2C4B2C522D362D372D382C372C232D2C2D2D2D652D6F2D75
+ 2D792D422D462D4B2D4F2D532D572D5A2D352E2E2E2E2E2E222C0A222E2E2E2E
+ 2E2E2E2E2E782E792E4E2E4F2E322E332E3B2E3A2E5D2C2E2C642C652C6A2C6B
+ 2C6F2C742C752C792C4A2C352C392C5B2C5D2D632D6D2C232D2C2D2D2D652D6F
+ 2D752D792D422D462D4B2D4F2D532D572D5A2D352D392E2E2E2E2E2E222C0A22
+ 2E2E2E2E2E2E2E2E2E792E4E2E4F2E322E332E3B2E3A2E5D2C2E2C642C652C6A
+ 2C6B2C6F2C742C752C792C4A2C4B2C392C5B2C5D2D632D6D2D732D742D2D2D65
+ 2D6F2D752D792D422D462D4B2D4F2D532D572D5A2D352D402E2E2E2E2E2E2E2E
+ 222C0A222E2E2E2E2E2E2E2E2E2E2E4F2E322E332E3B2E3A2E5D2C2E2C642C65
+ 2C6A2C6B2C6F2C742C752C792C4A2C4B2C522C5B2C5D2D632D6D2D732D772D7A
+ 2D232D3B2D4A2D3A2D422D3D2D2B2D4F2D532D572D5A2D352D402E2E2E2E2E2E
+ 2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E332E3B2E3A2E5D2C2E2C64
+ 2C652C6A2C6B2C6F2C742C752C792C4A2C4B2C522D362C5D2D632D6D2D732D77
+ 2D7A2D442D492D4D2D512D552D312D252D242D532D572D5A2D352D402D282E2E
+ 2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E3A2E5D2C2E
+ 2C642C652C6A2C6B2C6F2C742C752C792C4A2C4B2C522D292D5B2D632D6D2D73
+ 2D772D7A2D442D492D4D2D512D552D312D342D5D2D532D572D5A2D352D402D28
+ 2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 2C2E2C642C652C6A2C6B2C6F2C742C752A2E2A2C2A2D2A2A2C5B2C5D2D632D6D
+ 2D732D772D7A2D442D492D4D2D512D552D592A612D4F2D532D572D5A2D352D40
+ 2D282E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2C652C6A2C6B2C6F2C742C752C792C4A2C312C362C402C5D2D63
+ 2D6D2D732D772D7A2D442D492D4D2D502A622D562D4B2D4F2D532D572D5A2D35
+ 2D402D282E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2C6B2C6F2C742C752C792C4A2C4B2C522C572C58
+ 2D2E2D642D6E2D742D782D412D452D4A2D4E2D422D462D4B2D4F2D532D572D5A
+ 2D352D402E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A222E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2C752C792C4A2C4B2C522C57
+ 2C582C322C372C232D2C2D2D2D652D6F2D752D792D422D462D4B2D4F2D532D57
+ 2D5A2D352D392E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E222C0A22
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2C4B2C52
+ 2C572C582C322C372C232D2C2D2D2D652D6F2D752D792D422D462D4B2D4F2D53
+ 2D572D5A2D352E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E2C582C322C372C232D2C2D2D2D652D6F2D752D792D422D462D4B2D4F
+ 2D532D572D5A2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E222C0A222E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2C3B2D2D2D652D6F2D752D792D422D462D4B
+ 2A632E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E
+ 2E2E2E2E2E2E2E2E227D0A
+ }
+ Proportional = True
+ Stretch = True
+ Transparent = False
+ end
+ object Label1: TLabel
+ Left = 43
+ Height = 14
+ Top = 5
+ Width = 222
+ Caption = 'Data Table Master/Detail Setup Wizard'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label2: TLabel
+ Left = 45
+ Height = 16
+ Top = 21
+ Width = 331
+ Caption = 'This wizard will help you configure a master/detail relationship'
+ ParentColor = False
+ end
+ end
+ object pc_Pages: TPageControl
+ Height = 436
+ Top = 44
+ Width = 448
+ ActivePage = ts_Params
+ Align = alClient
+ TabIndex = 4
+ TabOrder = 1
+ object ts_Welcome: TTabSheet
+ Caption = 'Welcome'
+ ClientHeight = 410
+ ClientWidth = 440
+ object Label3: TLabel
+ Left = 8
+ Height = 14
+ Top = 8
+ Width = 314
+ Caption = 'Welcome to the Data Table Master/Detail Setup Wizard'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label4: TLabel
+ Left = 24
+ Height = 46
+ Top = 24
+ Width = 350
+ Caption = 'This wizard will help you set up a Master/Detail relationship by choosing a Master Source for the selected data table and defining how the relationshop between master and detail tables is mapped.'
+ ParentColor = False
+ WordWrap = True
+ end
+ object Label24: TLabel
+ Left = 24
+ Height = 16
+ Top = 72
+ Width = 243
+ Caption = 'This wizard will affect the following properties'
+ ParentColor = False
+ end
+ object Label25: TLabel
+ Left = 32
+ Height = 16
+ Top = 88
+ Width = 81
+ Caption = '- MasterSource'
+ ParentColor = False
+ end
+ object Label26: TLabel
+ Left = 32
+ Height = 16
+ Top = 104
+ Width = 161
+ Caption = '- MasterFields and DetailFields'
+ ParentColor = False
+ end
+ object Label27: TLabel
+ Left = 32
+ Height = 16
+ Top = 136
+ Width = 137
+ Caption = '- MasterParamsMappings'
+ ParentColor = False
+ end
+ object Label28: TLabel
+ Left = 32
+ Height = 16
+ Top = 152
+ Width = 135
+ Caption = '- MasterRequestMapping'
+ ParentColor = False
+ end
+ object Label29: TLabel
+ Left = 32
+ Height = 16
+ Top = 120
+ Width = 124
+ Caption = '- MasterMappingMode'
+ ParentColor = False
+ end
+ end
+ object ts_MasterSource: TTabSheet
+ Caption = 'ts_MasterSource'
+ ClientHeight = 410
+ ClientWidth = 440
+ ImageIndex = 6
+ object Label8: TLabel
+ Left = 8
+ Height = 14
+ Top = 8
+ Width = 106
+ Caption = 'Pick MasterSource'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label9: TLabel
+ Left = 24
+ Height = 16
+ Top = 24
+ Width = 305
+ Caption = 'Select the data table to use as master source for this table:'
+ ParentColor = False
+ end
+ object Label10: TLabel
+ Left = 8
+ Height = 14
+ Top = 80
+ Width = 127
+ Caption = 'Choose Mapping Mode'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label17: TLabel
+ Left = 24
+ Height = 16
+ Top = 96
+ Width = 403
+ Caption = 'Select what method you want to use fetch detail data for your master source'
+ ParentColor = False
+ end
+ object lbl_Params1: TLabel
+ Left = 42
+ Height = 46
+ Top = 204
+ Width = 342
+ Caption = 'Master key fields will be passed as parameters when fetching detail data. Use this if you''re talking to a standard DA server, and have defined Parameters in data table inside your schema.'
+ ParentColor = False
+ WordWrap = True
+ end
+ object lbl_Params2: TLabel
+ Left = 42
+ Height = 31
+ Top = 248
+ Width = 254
+ Caption = 'Your detail data will be fetched via the standard DataRequestCall, just like any data table.'
+ ParentColor = False
+ WordWrap = True
+ end
+ object lbl_Method1: TLabel
+ Left = 42
+ Height = 16
+ Top = 324
+ Width = 395
+ Caption = 'Data will be retrieved using a custom method you provided in your service.'
+ ParentColor = False
+ end
+ object lbl_Method2: TLabel
+ Left = 42
+ Height = 23
+ Top = 344
+ Width = 346
+ Caption = 'This option is only available if the detail table uses a separate RemoteDataAdapter component with a custom DataRequestCall.'
+ Font.Color = clGrayText
+ Font.Height = -9
+ Font.Name = 'Tahoma'
+ ParentColor = False
+ WordWrap = True
+ end
+ object lbl_Params3: TLabel
+ Left = 42
+ Height = 12
+ Top = 282
+ Width = 299
+ Caption = 'This option is only available if your detail data table defines parameters.'
+ Font.Color = clGrayText
+ Font.Height = -9
+ Font.Name = 'Tahoma'
+ ParentColor = False
+ WordWrap = True
+ end
+ object lbl_Where1: TLabel
+ Left = 42
+ Height = 16
+ Top = 140
+ Width = 313
+ Caption = 'A where clause will be passed to retrieve filtered detail data.'
+ ParentColor = False
+ end
+ object lbl_Where2: TLabel
+ Left = 42
+ Height = 12
+ Top = 160
+ Width = 176
+ Caption = 'Recommended for Version 5.0 and above.'
+ Font.Color = clGrayText
+ Font.Height = -9
+ Font.Name = 'Tahoma'
+ ParentColor = False
+ end
+ object cb_DataSources: TComboBox
+ Left = 24
+ Height = 21
+ Top = 40
+ Width = 289
+ AutoCompleteText = [cbactEndOfLineComplete, cbactSearchAscending]
+ ItemHeight = 13
+ OnChange = cb_DataSourcesChange
+ Style = csDropDownList
+ TabOrder = 0
+ end
+ object rb_Where: TRadioButton
+ Left = 24
+ Height = 21
+ Top = 120
+ Width = 187
+ Caption = 'Using automatic WHERE clauses'
+ OnChange = cb_DataSourcesChange
+ TabOrder = 1
+ end
+ object rb_Params: TRadioButton
+ Left = 24
+ Height = 21
+ Top = 184
+ Width = 134
+ Caption = 'Using data parameters'
+ OnChange = cb_DataSourcesChange
+ TabOrder = 2
+ end
+ object rb_Method: TRadioButton
+ Left = 24
+ Height = 21
+ Top = 304
+ Width = 158
+ Caption = 'Using a custom method call'
+ OnChange = cb_DataSourcesChange
+ TabOrder = 3
+ end
+ end
+ object ts_Fields: TTabSheet
+ Caption = 'ts_Fields'
+ ClientHeight = 410
+ ClientWidth = 440
+ ImageIndex = 3
+ object labMasterFields: TLabel
+ Left = 24
+ Height = 16
+ Top = 92
+ Width = 73
+ Caption = '&Master Fields:'
+ FocusControl = lbMaster
+ ParentColor = False
+ end
+ object labDetailFields: TLabel
+ Left = 256
+ Height = 16
+ Top = 92
+ Width = 67
+ Caption = '&Detail Fields:'
+ FocusControl = lbDetail
+ ParentColor = False
+ end
+ object Label13: TLabel
+ Left = 24
+ Height = 16
+ Top = 323
+ Width = 70
+ Caption = 'MasterFields:'
+ FocusControl = eMasterFields
+ ParentColor = False
+ end
+ object Label14: TLabel
+ Left = 24
+ Height = 16
+ Top = 347
+ Width = 64
+ Caption = 'DetailFields:'
+ FocusControl = eDetailFields
+ ParentColor = False
+ end
+ object Label18: TLabel
+ Left = 8
+ Height = 14
+ Top = 8
+ Width = 115
+ Caption = 'Master/Detail Fields'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label19: TLabel
+ Left = 24
+ Height = 16
+ Top = 24
+ Width = 351
+ Caption = 'Please select the fields that describe the Master/Detail relationship.'
+ ParentColor = False
+ end
+ object lbMaster: TListBox
+ Left = 22
+ Height = 209
+ Top = 108
+ Width = 164
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 0
+ end
+ object lbDetail: TListBox
+ Left = 254
+ Height = 209
+ Top = 108
+ Width = 164
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 1
+ end
+ object eMasterFields: TEdit
+ Left = 97
+ Height = 21
+ Top = 320
+ Width = 321
+ OnChange = OnFieldMappingChange
+ TabOrder = 2
+ Text = 'fdsfdsdsf'
+ end
+ object eDetailFields: TEdit
+ Left = 97
+ Height = 21
+ Top = 344
+ Width = 321
+ OnChange = OnFieldMappingChange
+ TabOrder = 3
+ Text = 'fdsfdsdsf'
+ end
+ object bbAddFieldMapping: TBitBtn
+ Left = 190
+ Height = 25
+ Top = 108
+ Width = 60
+ Caption = '&Add'
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF03
+ 5D05035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF791058C0D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79105950E035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79105920D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79106950F035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 035D05035D05035D05035D05035D055BF7910C9C18035D05035D05035D05035D
+ 05035D05FF00FFFF00FFFF00FF035D055BF7913BDA6930CF572AC64D21B83C17
+ A62B119F210D9E1C0A9A1506920E05930D058B0D035D05FF00FFFF00FF035D05
+ 5BF7915BF7915BF7915BF7915BF7915BF79118A92F5BF7915BF7915BF7915BF7
+ 915BF791035D05FF00FFFF00FFFF00FF035D05035D05035D05035D05035D055B
+ F79125BC42035D05035D05035D05035D05035D05FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79130CE57035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7913BD968035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79148EB7F035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7915BF791035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF035D05035D05FF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ NumGlyphs = 0
+ OnClick = bbAddFieldMappingClick
+ TabOrder = 4
+ end
+ object BitBtn4: TBitBtn
+ Left = 190
+ Height = 25
+ Top = 292
+ Width = 60
+ Caption = '&Clear'
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFF2BB81F3C48AF2BC81EF
+ B072EEAF6EEFB275FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFBEBBDFEF3C9FBDEACF3C990FBB67EFFB47DFCCA99FFD9ADFED9A7F0B5
+ 77FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFEFAD3FEF7CCFBDCA9EBCA91A9
+ B86E84AB542B912057A743EAF3C7FCE9BDEEAD6FFF00FFFF00FFFF00FFFF00FF
+ EDA565F3C28AFCF0C4FCE5B5FBD09F2C9622007B00058206067F043DA335FEF2
+ D0F0B173FF00FFFF00FFFF00FFFF00FFEEAB6DEDA767EFB070F6C990FFD8AC2E
+ 9823006E006ABF6BFFF0EA48A138A3AF5EFCAF74FF00FFFF00FFFF00FFFF00FF
+ F2B479F2B77EF0B277F0AC6FFBB57E7AB46041A6416FBC69FFFFFFF4FEFBBCBB
+ 79F3AA6BFF00FFFF00FFFF00FFFF00FFF7C292FAC598F8C293F8C090F3BF8AC2
+ D5A5FFFFFFD9EED556B1534BAF4BB8BC79F8B075FF00FFFF00FFFF00FFF6C792
+ FCD4ADFCD4ACFCD0A9FCD0A9FFD4B55DA94680C780E0F2DE27982400700082B0
+ 5BFFBD90EEAC6DFF00FFFF00FFF6C792FFEAC4FEE3BCFEE2BAFEE0B8FFE0BAD9
+ D9AC0A8209188A16037F0300790077B45DFFCEAAEEAC6DFF00FFFF00FFFADDAB
+ FFFBD5FFF4CCFFF3CAFFF0C9FFEFC5FFF2D1B5D5982A96242B99249ACB87B5D1
+ 95FFE0BAF2B77AFF00FFFF00FFFCEFC4FFFFD8FFFBD3FFFCD4FFFBD3FFFBD4FF
+ FCD4FFFFE1FFFFEBFFFFE7FFFFE0FFF8D7FFF4CBF3C086FF00FFFF00FFFEF4CB
+ FFFFDDFFFFD9FFFFD9FFFFDAFFFED7FEF6CCF8DAA3F4C07DF4C17FF7D8A3FEF2
+ C5FFFFDDF3C991FF00FFFF00FFF4CC96F8DEAFF8DDACF7D8A6F6CF99F3BF80EF
+ AC66EB9D4FEB9C4CEB9F55F0AC6EFAC087FCD3A0FAC089FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFEDA354EFAB68F7BC83FABF
+ 88FABC83FABC83FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFAC088FAC088FAC088FF00FFFF00FF
+ }
+ NumGlyphs = 0
+ OnClick = BitBtn4Click
+ TabOrder = 5
+ end
+ end
+ object ts_MethodCall: TTabSheet
+ Caption = 'ts_MethodCall'
+ ClientHeight = 410
+ ClientWidth = 440
+ ImageIndex = 4
+ object labMasterFields2: TLabel
+ Left = 24
+ Height = 16
+ Top = 92
+ Width = 73
+ Caption = '&Master Fields:'
+ ParentColor = False
+ end
+ object labDataReqParams: TLabel
+ Left = 256
+ Height = 16
+ Top = 92
+ Width = 132
+ Caption = 'DataRequestCall &Params:'
+ FocusControl = lbDataReqParams
+ ParentColor = False
+ end
+ object Label7: TLabel
+ Left = 24
+ Height = 16
+ Top = 298
+ Width = 301
+ Caption = 'Mapp&ings (Detail''s DataRequestCall Param=MasterField):'
+ FocusControl = mMappings
+ ParentColor = False
+ end
+ object Label20: TLabel
+ Left = 8
+ Height = 14
+ Top = 8
+ Width = 191
+ Caption = 'Map Fields to Method Parameters'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label21: TLabel
+ Left = 24
+ Height = 61
+ Top = 24
+ Width = 390
+ AutoSize = False
+ Caption = 'Select how the master fields map to the parameters passed to the customs GetDataCall you are using to fetch Detail data. Ideally, all fields from the previous page (i.e. all fields involved in the M/D relationship) should be mapped here.'
+ ParentColor = False
+ WordWrap = True
+ end
+ object lbMaster2: TListBox
+ Left = 22
+ Height = 185
+ Top = 108
+ Width = 164
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 0
+ end
+ object lbDataReqParams: TListBox
+ Left = 254
+ Height = 185
+ Top = 106
+ Width = 164
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 1
+ end
+ object mMappings: TMemo
+ Left = 22
+ Height = 60
+ Top = 314
+ Width = 395
+ ScrollBars = ssVertical
+ TabOrder = 2
+ end
+ object bbAddDataReqMapping: TBitBtn
+ Left = 190
+ Height = 25
+ Top = 108
+ Width = 60
+ Caption = '&Add'
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF03
+ 5D05035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF791058C0D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79105950E035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79105920D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79106950F035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 035D05035D05035D05035D05035D055BF7910C9C18035D05035D05035D05035D
+ 05035D05FF00FFFF00FFFF00FF035D055BF7913BDA6930CF572AC64D21B83C17
+ A62B119F210D9E1C0A9A1506920E05930D058B0D035D05FF00FFFF00FF035D05
+ 5BF7915BF7915BF7915BF7915BF7915BF79118A92F5BF7915BF7915BF7915BF7
+ 915BF791035D05FF00FFFF00FFFF00FF035D05035D05035D05035D05035D055B
+ F79125BC42035D05035D05035D05035D05035D05FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79130CE57035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7913BD968035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79148EB7F035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7915BF791035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF035D05035D05FF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ NumGlyphs = 0
+ OnClick = bbAddDataReqMappingClick
+ TabOrder = 3
+ end
+ object bbClearDataReqMapping: TBitBtn
+ Left = 190
+ Height = 25
+ Top = 266
+ Width = 60
+ Caption = '&Clear'
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFF2BB81F3C48AF2BC81EF
+ B072EEAF6EEFB275FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFBEBBDFEF3C9FBDEACF3C990FBB67EFFB47DFCCA99FFD9ADFED9A7F0B5
+ 77FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFEFAD3FEF7CCFBDCA9EBCA91A9
+ B86E84AB542B912057A743EAF3C7FCE9BDEEAD6FFF00FFFF00FFFF00FFFF00FF
+ EDA565F3C28AFCF0C4FCE5B5FBD09F2C9622007B00058206067F043DA335FEF2
+ D0F0B173FF00FFFF00FFFF00FFFF00FFEEAB6DEDA767EFB070F6C990FFD8AC2E
+ 9823006E006ABF6BFFF0EA48A138A3AF5EFCAF74FF00FFFF00FFFF00FFFF00FF
+ F2B479F2B77EF0B277F0AC6FFBB57E7AB46041A6416FBC69FFFFFFF4FEFBBCBB
+ 79F3AA6BFF00FFFF00FFFF00FFFF00FFF7C292FAC598F8C293F8C090F3BF8AC2
+ D5A5FFFFFFD9EED556B1534BAF4BB8BC79F8B075FF00FFFF00FFFF00FFF6C792
+ FCD4ADFCD4ACFCD0A9FCD0A9FFD4B55DA94680C780E0F2DE27982400700082B0
+ 5BFFBD90EEAC6DFF00FFFF00FFF6C792FFEAC4FEE3BCFEE2BAFEE0B8FFE0BAD9
+ D9AC0A8209188A16037F0300790077B45DFFCEAAEEAC6DFF00FFFF00FFFADDAB
+ FFFBD5FFF4CCFFF3CAFFF0C9FFEFC5FFF2D1B5D5982A96242B99249ACB87B5D1
+ 95FFE0BAF2B77AFF00FFFF00FFFCEFC4FFFFD8FFFBD3FFFCD4FFFBD3FFFBD4FF
+ FCD4FFFFE1FFFFEBFFFFE7FFFFE0FFF8D7FFF4CBF3C086FF00FFFF00FFFEF4CB
+ FFFFDDFFFFD9FFFFD9FFFFDAFFFED7FEF6CCF8DAA3F4C07DF4C17FF7D8A3FEF2
+ C5FFFFDDF3C991FF00FFFF00FFF4CC96F8DEAFF8DDACF7D8A6F6CF99F3BF80EF
+ AC66EB9D4FEB9C4CEB9F55F0AC6EFAC087FCD3A0FAC089FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFEDA354EFAB68F7BC83FABF
+ 88FABC83FABC83FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFAC088FAC088FAC088FF00FFFF00FF
+ }
+ NumGlyphs = 0
+ OnClick = bbClearDataReqMappingClick
+ TabOrder = 4
+ end
+ end
+ object ts_Params: TTabSheet
+ Caption = 'ts_Params'
+ ClientHeight = 410
+ ClientWidth = 440
+ ImageIndex = 5
+ object Label11: TLabel
+ Left = 24
+ Height = 16
+ Top = 92
+ Width = 81
+ Caption = 'Master''s Fields:'
+ ParentColor = False
+ end
+ object Label12: TLabel
+ Left = 256
+ Height = 16
+ Top = 92
+ Width = 43
+ Caption = 'Params:'
+ FocusControl = lbParams
+ ParentColor = False
+ end
+ object Label15: TLabel
+ Left = 24
+ Height = 16
+ Top = 298
+ Width = 212
+ Caption = 'Mappings (Detail''s Param=MasterField):'
+ FocusControl = mParamsMappings
+ ParentColor = False
+ end
+ object Label22: TLabel
+ Left = 8
+ Height = 14
+ Top = 8
+ Width = 209
+ Caption = 'Map Fields to Data Table Parameters'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label23: TLabel
+ Left = 24
+ Height = 46
+ Top = 24
+ Width = 389
+ Caption = 'Select how the master fields map to the parameters of your detail data. Ideally, all fields from the previous page (i.e. all fields involved in the M/D relationship) should be mapped here.'
+ ParentColor = False
+ WordWrap = True
+ end
+ object lbMaster3: TListBox
+ Left = 22
+ Height = 185
+ Top = 108
+ Width = 164
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 0
+ end
+ object lbParams: TListBox
+ Left = 254
+ Height = 185
+ Top = 108
+ Width = 164
+ ItemHeight = 13
+ MultiSelect = True
+ TabOrder = 1
+ end
+ object mParamsMappings: TMemo
+ Left = 22
+ Height = 60
+ Top = 314
+ Width = 395
+ ScrollBars = ssVertical
+ TabOrder = 2
+ end
+ object bbAddParamMappingXXX: TBitBtn
+ Left = 190
+ Height = 25
+ Top = 108
+ Width = 60
+ Caption = '&Add'
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF03
+ 5D05035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF791058C0D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79105950E035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79105920D035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F79106950F035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 035D05035D05035D05035D05035D055BF7910C9C18035D05035D05035D05035D
+ 05035D05FF00FFFF00FFFF00FF035D055BF7913BDA6930CF572AC64D21B83C17
+ A62B119F210D9E1C0A9A1506920E05930D058B0D035D05FF00FFFF00FF035D05
+ 5BF7915BF7915BF7915BF7915BF7915BF79118A92F5BF7915BF7915BF7915BF7
+ 915BF791035D05FF00FFFF00FFFF00FF035D05035D05035D05035D05035D055B
+ F79125BC42035D05035D05035D05035D05035D05FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79130CE57035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7913BD968035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF035D055BF79148EB7F035D05FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF035D055B
+ F7915BF791035D05FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF035D05035D05FF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ NumGlyphs = 0
+ OnClick = bbAddParamMappingXXXClick
+ TabOrder = 3
+ end
+ object bbClearParamMappingsXXX: TBitBtn
+ Left = 190
+ Height = 25
+ Top = 268
+ Width = 60
+ Caption = '&Clear'
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFF2BB81F3C48AF2BC81EF
+ B072EEAF6EEFB275FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFBEBBDFEF3C9FBDEACF3C990FBB67EFFB47DFCCA99FFD9ADFED9A7F0B5
+ 77FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFEFAD3FEF7CCFBDCA9EBCA91A9
+ B86E84AB542B912057A743EAF3C7FCE9BDEEAD6FFF00FFFF00FFFF00FFFF00FF
+ EDA565F3C28AFCF0C4FCE5B5FBD09F2C9622007B00058206067F043DA335FEF2
+ D0F0B173FF00FFFF00FFFF00FFFF00FFEEAB6DEDA767EFB070F6C990FFD8AC2E
+ 9823006E006ABF6BFFF0EA48A138A3AF5EFCAF74FF00FFFF00FFFF00FFFF00FF
+ F2B479F2B77EF0B277F0AC6FFBB57E7AB46041A6416FBC69FFFFFFF4FEFBBCBB
+ 79F3AA6BFF00FFFF00FFFF00FFFF00FFF7C292FAC598F8C293F8C090F3BF8AC2
+ D5A5FFFFFFD9EED556B1534BAF4BB8BC79F8B075FF00FFFF00FFFF00FFF6C792
+ FCD4ADFCD4ACFCD0A9FCD0A9FFD4B55DA94680C780E0F2DE27982400700082B0
+ 5BFFBD90EEAC6DFF00FFFF00FFF6C792FFEAC4FEE3BCFEE2BAFEE0B8FFE0BAD9
+ D9AC0A8209188A16037F0300790077B45DFFCEAAEEAC6DFF00FFFF00FFFADDAB
+ FFFBD5FFF4CCFFF3CAFFF0C9FFEFC5FFF2D1B5D5982A96242B99249ACB87B5D1
+ 95FFE0BAF2B77AFF00FFFF00FFFCEFC4FFFFD8FFFBD3FFFCD4FFFBD3FFFBD4FF
+ FCD4FFFFE1FFFFEBFFFFE7FFFFE0FFF8D7FFF4CBF3C086FF00FFFF00FFFEF4CB
+ FFFFDDFFFFD9FFFFD9FFFFDAFFFED7FEF6CCF8DAA3F4C07DF4C17FF7D8A3FEF2
+ C5FFFFDDF3C991FF00FFFF00FFF4CC96F8DEAFF8DDACF7D8A6F6CF99F3BF80EF
+ AC66EB9D4FEB9C4CEB9F55F0AC6EFAC087FCD3A0FAC089FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFEDA354EFAB68F7BC83FABF
+ 88FABC83FABC83FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFAC088FAC088FAC088FF00FFFF00FF
+ }
+ NumGlyphs = 0
+ OnClick = bbClearParamMappingsXXXClick
+ TabOrder = 4
+ end
+ end
+ object ts_Finish: TTabSheet
+ Caption = 'Finish'
+ ClientHeight = 410
+ ClientWidth = 440
+ ImageIndex = 2
+ object Label5: TLabel
+ Left = 8
+ Height = 14
+ Top = 8
+ Width = 52
+ Caption = 'That''s It!'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label6: TLabel
+ Left = 24
+ Height = 16
+ Top = 24
+ Width = 240
+ Caption = 'Your Master/Detail relationship is now set up.'
+ ParentColor = False
+ end
+ end
+ end
+ object Panel2: TPanel
+ Height = 35
+ Top = 480
+ Width = 448
+ Align = alBottom
+ BevelOuter = bvNone
+ ClientHeight = 35
+ ClientWidth = 448
+ TabOrder = 2
+ object btn_Finish: TBitBtn
+ Left = 368
+ Height = 25
+ Hint = 'This is Finish, but not the End'
+ Top = 5
+ Width = 75
+ Anchors = [akTop, akRight]
+ Caption = 'Finish'
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000220B0000220B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00FF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00
+ 811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FF787878787878FF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 811E00811E00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF787878787878787878FF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF811E0095440F811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878898989787878FF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF811E00A7632F811E00811E00FF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF7878789F9F9F78787878
+ 7878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF811E00BF8B62CCA17E811E00811E00FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878B8B8B8C6
+ C6C6787878787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00D8B69CE6D1BFE7D3C4811E00FF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878D1
+ D1D1E0E0E0E2E2E2787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00F0E2D9FCF7F2FAF0E6811E00811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878EBEBEBF5F5F5F1F1F1787878787878FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00D8AF96F4E2CFF0D7BDD8A784811E
+ 00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878D0D0D0E9E9E9E3E3E3CACACA787878787878FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00F3DECAEFD4B8EBC9A7DAA67D811E00FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878E7
+ E7E7E1E1E1DBDBDBC9C9C9787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00E7BB92E3B081E0A672D5925A811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878D3D3D3CDCDCDC6C6C6BCBCBC787878FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00DA995ED78F50D38441CF7B
+ 35811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FF787878BFBFBFB8B8B8B2B2B2ACACAC787878FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00811E00811E00811E
+ 00811E00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF787878787878787878787878787878787878FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ ModalResult = 1
+ NumGlyphs = 2
+ OnClick = btn_FinishClick
+ TabOrder = 0
+ Visible = False
+ end
+ object btn_Cancel: TBitBtn
+ Left = 5
+ Height = 25
+ Top = 5
+ Width = 75
+ Cancel = True
+ Caption = 'Cancel'
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ ModalResult = 2
+ NumGlyphs = 2
+ TabOrder = 1
+ end
+ object btn_Next: TBitBtn
+ Left = 368
+ Height = 25
+ Top = 5
+ Width = 75
+ Anchors = [akTop, akRight]
+ Caption = '&Next'
+ Default = True
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000130B0000130B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 0B7C15097A14087110056A0C04670B04670C04670C04670C04670C04670C0467
+ 0C045709FF00FFFF00FFFF00FFFF00FF9C9C9C9C9C9C98989896969695959595
+ 9595959595959595959595959595959595909090FF00FFFF00FFFF00FF129A28
+ 1AB03A15AF3211AB270DA81F08A61808A51608A51608A61708A61708A51708AB
+ 18078D12045708FF00FFFF00FFA8A8A8B0B0B0AEAEAEACACACAAAAAAA8A8A8A8
+ A8A8A8A8A8A8A8A8A8A8A8A8A8A8A9A9A9A0A0A0909090FF00FFFF00FF1BAD3C
+ 25C5541EC0451ABE3A15BD3110BA270BB81D09B81909B81A09B81A09B71A09BE
+ 1C08AB1704670CFF00FFFF00FFB0B0B0B9B9B9B5B5B5B4B4B4B2B2B2B0B0B0AD
+ ADADADADADADADADADADADADADADAFAFAFA9A9A9959595FF00FFFF00FF20B445
+ 31C46429BF5322BB481BBA3D17B73312B4290DB3200AB21909B11809B01809B7
+ 1A08A61704680CFF00FFFF00FFB3B3B3BCBCBCB8B8B8B5B5B5B3B3B3B1B1B1AF
+ AFAFADADADACACACACACACABABABADADADA8A8A8959595FF00FFFF00FF22B548
+ 3FC87635C367FEFEFE23BC4E1DBA4218B838FEFEFE0EB4240AB31C09B11809B8
+ 1A08A61704670CFF00FFFF00FFB3B3B3C0C0C0BCBCBCFEFEFEB5B5B5B3B3B3B1
+ B1B1FEFEFEADADADACACACACACACADADADA8A8A8959595FF00FFFF00FF21B548
+ 58D08A46C97AFEFEFEFEFEFE24BD501FBB46FEFEFEFEFEFE10B4290CB21F09B7
+ 1A08A61604670CFF00FFFF00FFB3B3B3CACACAC3C3C3FEFEFEFEFEFEB6B6B6B4
+ B4B4FEFEFEFEFEFEAEAEAEACACACADADADA8A8A8959595FF00FFFF00FF21B548
+ 77D89F52CC813BC772FEFEFEFEFEFE26BE5421BD4AFEFEFEFEFEFE13B52D0DBA
+ 230AA71804680BFF00FFFF00FFB3B3B3D5D5D5C8C8C8C0C0C0FEFEFEFEFEFEB7
+ B7B7B5B5B5FEFEFEFEFEFEB0B0B0AFAFAFA8A8A8959595FF00FFFF00FF21B548
+ 8ADEAC5DD08A42C87637C56EFEFEFEFEFEFE27BF5822BD4FFEFEFEFEFEFE14BB
+ 310EA922066F0EFF00FFFF00FFB3B3B3DCDCDCCCCCCCC2C2C2BEBEBEFEFEFEFE
+ FEFEB8B8B8B5B5B5FEFEFEFEFEFEB1B1B1AAAAAA989898FF00FFFF00FF21B548
+ 95E0B365D28F48CA7AFEFEFEFEFEFE30C3692EC265FEFEFEFEFEFE1FBB461BBE
+ 3E14AE2F0A7A14FF00FFFF00FFB3B3B3E0E0E0CECECEC4C4C4FEFEFEFEFEFEBB
+ BBBBBBBBBBFEFEFEFEFEFEB4B4B4B4B4B4ADADAD9C9C9CFF00FFFF00FF21B548
+ 9DE3B96FD597FEFEFEFEFEFE40C87439C570FEFEFEFEFEFE2BC16027BF5523C0
+ 4E1BB23C0D851AFF00FFFF00FFB3B3B3E3E3E3D2D2D2FEFEFEFEFEFEC1C1C1BF
+ BFBFFEFEFEFEFEFEB9B9B9B8B8B8B7B7B7B0B0B0A0A0A0FF00FFFF00FF21B548
+ A9E6C280DAA3FEFEFE59CF874DCC7E44C978FEFEFE39C57032C36B2DC1632AC2
+ 5D20B548108F1FFF00FFFF00FFB3B3B3E7E7E7D8D8D8FEFEFECACACAC6C6C6C2
+ C2C2FEFEFEBFBFBFBCBCBCBABABAB9B9B9B3B3B3A4A4A4FF00FFFF00FF21B549
+ AEE8C5A6E5BF91DFAF86DBA778D79D67D39159CF8744C97836C56E32C36C30C5
+ 6A27BB57139C26FF00FFFF00FFB3B3B3E9E9E9E6E6E6DFDFDFDADADAD5D5D5D0
+ D0D0CACACAC2C2C2BDBDBDBCBCBCBCBCBCB7B7B7A8A8A8FF00FFFF00FF22B548
+ 92E0B3AEE8C6B1E9C8A9E6C29BE3B887DDAA6AD5964FCD823BC77436C57034C8
+ 732BBF5E14A428FF00FFFF00FFB3B3B3DFDFDFE9E9E9EAEAEAE7E7E7E2E2E2DB
+ DBDBD0D0D0C7C7C7C0C0C0BDBDBDBEBEBEB9B9B9ABABABFF00FFFF00FFFF00FF
+ 38BB5A51C57053C57151C56F4CC36B42C06437BC5A2EB95325B74A23B54B23B7
+ 4A1AAF39FF00FFFF00FFFF00FFFF00FFBBBBBBC5C5C5C6C6C6C5C5C5C3C3C3C0
+ C0C0BBBBBBB8B8B8B5B5B5B4B4B4B4B4B4B0B0B0FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ Layout = blGlyphRight
+ NumGlyphs = 2
+ OnClick = btn_NextClick
+ TabOrder = 2
+ end
+ object btn_Back: TBitBtn
+ Left = 288
+ Height = 25
+ Top = 5
+ Width = 75
+ Anchors = [akTop, akRight]
+ Caption = 'Back'
+ Enabled = False
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000130B0000130B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 0B7C15097A14087110056A0C04670B04670C04670C04670C04670C04670C0467
+ 0C045709FF00FFFF00FFFF00FFFF00FF9D9D9D9C9C9C99999996969695959595
+ 9595959595959595959595959595959595919191FF00FFFF00FFFF00FF129A28
+ 1AB03A15AF3211AB270DA81F08A61808A51608A51608A61708A61708A51708AB
+ 18078D12045708FF00FFFF00FFA8A8A8B1B1B1AEAEAEADADADAAAAAAA9A9A9A8
+ A8A8A8A8A8A9A9A9A9A9A9A8A8A8A9A9A9A1A1A1919191FF00FFFF00FF1BAD3C
+ 25C5541EC0451ABE3A15BD3110BA270BB81D09B81909B81A09B81A09B71A09BE
+ 1C08AB1704670CFF00FFFF00FFB0B0B0B9B9B9B6B6B6B4B4B4B2B2B2B1B1B1AE
+ AEAEADADADADADADADADADADADADAFAFAFA9A9A9959595FF00FFFF00FF20B445
+ 31C46429BF5322BB481BBA3D17B73312B4290DB3200AB21909B11809B01809B7
+ 1A08A61704680CFF00FFFF00FFB3B3B3BCBCBCB9B9B9B5B5B5B3B3B3B1B1B1AF
+ AFAFADADADADADADACACACABABABADADADA9A9A9969696FF00FFFF00FF22B548
+ 3FC87635C3672BBF5723BC4E1DBA42FEFEFE13B72E0EB4240AB31CFEFEFE09B8
+ 1A08A61704670CFF00FFFF00FFB4B4B4C1C1C1BDBDBDB9B9B9B6B6B6B4B4B4FE
+ FEFEB1B1B1AEAEAEADADADFEFEFEADADADA9A9A9959595FF00FFFF00FF21B548
+ 58D08A46C97A34C5692CBF5DFEFEFEFEFEFE1ABA3D16B733FEFEFEFEFEFE09B7
+ 1A08A61604670CFF00FFFF00FFB4B4B4CBCBCBC3C3C3BDBDBDB9B9B9FEFEFEFE
+ FEFEB3B3B3B1B1B1FEFEFEFEFEFEADADADA9A9A9959595FF00FFFF00FF21B548
+ 77D89F52CC813BC772FEFEFEFEFEFE26BE5421BD4AFEFEFEFEFEFE13B52D0DBA
+ 230AA71804680BFF00FFFF00FFB4B4B4D5D5D5C8C8C8C0C0C0FEFEFEFEFEFEB8
+ B8B8B6B6B6FEFEFEFEFEFEB0B0B0AFAFAFA9A9A9969696FF00FFFF00FF21B548
+ 8ADEAC5DD08AFEFEFEFEFEFE2FC3682CC162FEFEFEFEFEFE1EBB4418B93A14BB
+ 310EA922066F0EFF00FFFF00FFB4B4B4DDDDDDCCCCCCFEFEFEFEFEFEBCBCBCBA
+ BABAFEFEFEFEFEFEB4B4B4B2B2B2B1B1B1ABABAB989898FF00FFFF00FF21B548
+ 95E0B365D28F48CA7AFEFEFEFEFEFE30C3692EC265FEFEFEFEFEFE1FBB461BBE
+ 3E14AE2F0A7A14FF00FFFF00FFB4B4B4E0E0E0CECECEC5C5C5FEFEFEFEFEFEBC
+ BCBCBBBBBBFEFEFEFEFEFEB5B5B5B4B4B4AEAEAE9D9D9DFF00FFFF00FF21B548
+ 9DE3B96FD59757CE854ECC7FFEFEFEFEFEFE35C56D30C368FEFEFEFEFEFE23C0
+ 4E1BB23C0D851AFF00FFFF00FFB4B4B4E3E3E3D2D2D2C9C9C9C7C7C7FEFEFEFE
+ FEFEBDBDBDBCBCBCFEFEFEFEFEFEB7B7B7B1B1B1A1A1A1FF00FFFF00FF21B548
+ A9E6C280DAA35ED08A59CF874DCC7EFEFEFE43C87739C57032C36BFEFEFE2AC2
+ 5D20B548108F1FFF00FFFF00FFB4B4B4E7E7E7D9D9D9CDCDCDCBCBCBC6C6C6FE
+ FEFEC2C2C2BFBFBFBCBCBCFEFEFEBABABAB3B3B3A4A4A4FF00FFFF00FF21B549
+ AEE8C5A6E5BF91DFAF86DBA778D79D67D39159CF8744C97836C56E32C36C30C5
+ 6A27BB57139C26FF00FFFF00FFB4B4B4E9E9E9E6E6E6DFDFDFDADADAD5D5D5D0
+ D0D0CBCBCBC3C3C3BDBDBDBCBCBCBCBCBCB7B7B7A9A9A9FF00FFFF00FF22B548
+ 92E0B3AEE8C6B1E9C8A9E6C29BE3B887DDAA6AD5964FCD823BC77436C57034C8
+ 732BBF5E14A428FF00FFFF00FFB4B4B4E0E0E0E9E9E9EBEBEBE7E7E7E3E3E3DC
+ DCDCD1D1D1C7C7C7C0C0C0BDBDBDBEBEBEB9B9B9ABABABFF00FFFF00FFFF00FF
+ 38BB5A51C57053C57151C56F4CC36B42C06437BC5A2EB95325B74A23B54B23B7
+ 4A1AAF39FF00FFFF00FFFF00FFFF00FFBCBCBCC5C5C5C6C6C6C5C5C5C3C3C3C0
+ C0C0BCBCBCB8B8B8B5B5B5B4B4B4B5B5B5B0B0B0FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ NumGlyphs = 2
+ OnClick = btn_BackClick
+ TabOrder = 3
+ end
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm_laz.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm_laz.lrs
new file mode 100644
index 0000000..7f2e250
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm_laz.lrs
@@ -0,0 +1,831 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TDADataTableMasterLinkWizard','FORMDATA',[
+ 'TPF0'#28'TDADataTableMasterLinkWizard'#27'DADataTableMasterLinkWizard'#4'Lef'
+ +'t'#3#232#1#6'Height'#3#3#2#3'Top'#3#173#0#5'Width'#3#192#1#18'HorzScrollBar'
+ +'.Page'#3#191#1#18'VertScrollBar.Page'#3#2#2#13'ActiveControl'#7#8'pc_Pages'
+ +#7'Caption'#6#5'Form1'#12'ClientHeight'#3#3#2#11'ClientWidth'#3#192#1#11'Fon'
+ +'t.Height'#2#245#9'Font.Name'#6#13'MS Sans Serif'#8'OnCreate'#7#10'FormCreat'
+ +'e'#9'OnDestroy'#7#11'FormDestroy'#10'LCLVersion'#6#6'0.9.25'#0#6'TBevel'#6
+ +'Bevel1'#6'Height'#2#2#3'Top'#2'*'#5'Width'#3#192#1#5'Align'#7#5'alTop'#5'Sh'
+ +'ape'#7#12'bsBottomLine'#0#0#6'TLabel'#7'Label16'#4'Left'#2#8#6'Height'#2#16
+ +#3'Top'#3'n'#1#5'Width'#2'V'#7'Caption'#6#13'Mapping Mode:'#11'ParentColor'#8
+ +#0#0#6'TPanel'#6'Panel1'#6'Height'#2'*'#5'Width'#3#192#1#5'Align'#7#5'alTop'
+ +#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'*'#11'ClientWidth'#3#192#1#5
+ +'Color'#7#7'clWhite'#11'ParentColor'#8#8'TabOrder'#2#0#0#6'TImage'#6'Image1'
+ +#4'Left'#2#5#6'Height'#2' '#3'Top'#2#5#5'Width'#2' '#12'Picture.Data'#10#11
+ +'"'#0#0#5'TIcon'#1'"'#0#0'/* XPM */'#10'static char *graphic[] = {'#10'"48 4'
+ +'8 241 2",'#10'".. c None",'#10'"., c #666666",'#10'".- c #656565",'#10'".* '
+ +'c #636363",'#10'".a c #616161",'#10'".b c #606060",'#10'".c c #5E5E5E",'#10
+ +'".d c #5D5D5D",'#10'".e c #5B5B5B",'#10'".f c #595959",'#10'".g c #585858",'
+ +#10'".h c #575757",'#10'".i c #555555",'#10'".j c #535353",'#10'".k c #52525'
+ +'2",'#10'".l c #696969",'#10'".m c #686868",'#10'".n c #505050",'#10'".o c #'
+ +'4F4F4F",'#10'".p c #4D4D4D",'#10'".q c #4B4B4B",'#10'".r c #4A4A4A",'#10'".'
+ +'s c #484848",'#10'".t c #464646",'#10'".u c #6A6A6A",'#10'".v c #474747",'
+ +#10'".w c #454545",'#10'".x c #444444",'#10'".y c #424242",'#10'".z c #6B6B6'
+ +'B",'#10'".A c #67825C",'#10'".B c #6DA458",'#10'".C c #70C452",'#10'".D c #'
+ +'71DB4C",'#10'".E c #6DE048",'#10'".F c #67DD44",'#10'".G c #61D940",'#10'".'
+ +'H c #5BD53D",'#10'".I c #56D139",'#10'".J c #50B63A",'#10'".K c #4C9B3C",'
+ +#10'".L c #497A41",'#10'".M c #4A5349",'#10'".N c #404040",'#10'".O c #3F3F3'
+ +'F",'#10'".P c #646B61",'#10'".Q c #74A95D",'#10'".R c #7FDD58",'#10'".S c #'
+ +'7EEC53",'#10'".T c #78E850",'#10'".U c #73E44C",'#10'".V c #50CD35",'#10'".'
+ +'W c #4ACA31",'#10'".X c #44C62D",'#10'".Y c #3FC22A",'#10'".Z c #39BE26",'
+ +#10'".0 c #3A972D",'#10'".1 c #40623C",'#10'".2 c #3D3D3D",'#10'".3 c #3C3C3'
+ +'C",'#10'".4 c #78AC60",'#10'".5 c #87EA5B",'#10'".6 c #84EF57",'#10'".7 c #'
+ +'34BB22",'#10'".8 c #2EB71E",'#10'".9 c #28B31A",'#10'".@ c #2A9422",'#10'".'
+ +'# c #3B5639",'#10'".; c #3A3A3A",'#10'".: c #383838",'#10'".= c #6C7F63",'
+ +#10'".+ c #86DA5F",'#10'".% c #8AF35B",'#10'".$ c #22AF16",'#10'".( c #1CAC1'
+ +'3",'#10'".) c #17A80F",'#10'".[ c #277125",'#10'".] c #373737",'#10'",. c #'
+ +'353535",'#10'",, c #759B62",'#10'",- c #8FF75F",'#10'",* c #11A40B",'#10'",'
+ +'a c #0BA007",'#10'",b c #138412",'#10'",c c #364036",'#10'",d c #343434",'
+ +#10'",e c #323232",'#10'",f c #059D04",'#10'",g c #009900",'#10'",h c #0A850'
+ +'A",'#10'",i c #333D33",'#10'",j c #303030",'#10'",k c #2F2F2F",'#10'",l c #'
+ +'009700",'#10'",m c #009500",'#10'",n c #0A810A",'#10'",o c #2E2E2E",'#10'",'
+ +'p c #8CED5F",'#10'",q c #009300",'#10'",r c #009100",'#10'",s c #136C13",'
+ +#10'",t c #2C2C2C",'#10'",u c #2A2A2A",'#10'",v c #008F00",'#10'",w c #008D0'
+ +'0",'#10'",x c #204C20",'#10'",y c #292929",'#10'",z c #42A432",'#10'",A c #'
+ +'3EA12F",'#10'",B c #3E8235",'#10'",C c #3B7F32",'#10'",D c #35832D",'#10'",'
+ +'E c #2B9422",'#10'",F c #26911F",'#10'",G c #008B00",'#10'",H c #028402",'
+ +#10'",I c #293229",'#10'",J c #272727",'#10'",K c #262626",'#10'",L c #4D9C3'
+ +'C",'#10'",M c #4C6447",'#10'",N c #2E5C2C",'#10'",O c #008900",'#10'",P c #'
+ +'008700",'#10'",Q c #155815",'#10'",R c #242424",'#10'",S c #4E7D44",'#10'",'
+ +'T c #0E7F0E",'#10'",U c #008500",'#10'",V c #027E02",'#10'",W c #222222",'
+ +#10'",X c #212121",'#10'",Y c #1B661B",'#10'",Z c #008400",'#10'",0 c #00820'
+ +'0",'#10'",1 c #174717",'#10'",2 c #1F1F1F",'#10'",3 c #65795D",'#10'",4 c #'
+ +'1B641B",'#10'",5 c #008000",'#10'",6 c #0B620B",'#10'",7 c #1E1E1E",'#10'",'
+ +'8 c #1A621A",'#10'",9 c #007E00",'#10'",@ c #027702",'#10'",# c #1C1C1C",'
+ +#10'",; c #1B1B1B",'#10'",: c #55B93E",'#10'",= c #519741",'#10'",+ c #4D8C4'
+ +'0",'#10'",% c #4B6B45",'#10'",$ c #486943",'#10'",( c #466741",'#10'",) c #'
+ +'196019",'#10'",[ c #007C00",'#10'",] c #007A00",'#10'"-. c #193019",'#10'"-'
+ +', c #1A1A1A",'#10'"-- c #191919",'#10'"-* c #589C47",'#10'"-a c #52624F",'
+ +#10'"-b c #185F18",'#10'"-c c #007800",'#10'"-d c #143914",'#10'"-e c #17171'
+ +'7",'#10'"-f c #59A445",'#10'"-g c #1D511D",'#10'"-h c #0E6D0E",'#10'"-i c #'
+ +'155A15",'#10'"-j c #145614",'#10'"-k c #0E600E",'#10'"-l c #076F07",'#10'"-'
+ +'m c #007600",'#10'"-n c #0E480E",'#10'"-o c #161616",'#10'"-p c #549245",'
+ +#10'"-q c #202820",'#10'"-r c #0C590C",'#10'"-s c #007400",'#10'"-t c #0D460'
+ +'D",'#10'"-u c #141414",'#10'"-v c #518F43",'#10'"-w c #007300",'#10'"-x c #'
+ +'0C450C",'#10'"-y c #131313",'#10'"-z c #007100",'#10'"-A c #0B430B",'#10'"-'
+ ,'B c #111111",'#10'"-C c #49893D",'#10'"-D c #006F00",'#10'"-E c #0C3C0C",'
+ +#10'"-F c #0F0F0F",'#10'"-G c #50AE3B",'#10'"-H c #45873B",'#10'"-I c #006D0'
+ +'0",'#10'"-J c #0F2A0F",'#10'"-K c #0E0E0E",'#10'"-L c #428438",'#10'"-M c #'
+ +'006B00",'#10'"-N c #111811",'#10'"-O c #0C0C0C",'#10'"-P c #035903",'#10'"-'
+ +'Q c #006900",'#10'"-R c #074207",'#10'"-S c #0B0B0B",'#10'"-T c #377C30",'
+ +#10'"-U c #006700",'#10'"-V c #0D1A0D",'#10'"-W c #090909",'#10'"-X c #337A2'
+ +'D",'#10'"-Y c #044B04",'#10'"-Z c #080808",'#10'"-0 c #30772B",'#10'"-1 c #'
+ +'006600",'#10'"-2 c #0A230A",'#10'"-3 c #2C7428",'#10'"-4 c #053F05",'#10'"-'
+ +'5 c #060606",'#10'"-6 c #1A391A",'#10'"-7 c #163D16",'#10'"-8 c #104C10",'
+ +#10'"-9 c #050505",'#10'"-@ c #040404",'#10'"-# c #036403",'#10'"-; c #0B410'
+ +'B",'#10'"-: c #101D10",'#10'"-= c #0E150E",'#10'"-+ c #0C190C",'#10'"-% c #'
+ +'015A01",'#10'"-$ c #0A1D0A",'#10'"-( c #030303",'#10'"-) c #164416",'#10'"-'
+ +'[ c #027502",'#10'"-] c #0B120B",'#10'"*. c #243424",'#10'"*, c #145414",'
+ +#10'"*- c #135313",'#10'"** c #096709",'#10'"*a c #0B1E0B",'#10'"*b c #09370'
+ +'9",'#10'"*c c #0D0D0D",'#10'"..............................................'
+ +'..................................................",'#10'".................'
+ +'..................,.-.*.a.b.c.d.e.f.g.h.i.j.k..............................'
+ +'....",'#10'".............................l.m.,.-.*.a.b.c.d.e.f.g.h.i.j.k.n.'
+ +'o.p.q............................",'#10'"...........................l.m.,.-'
+ +'.*.a.b.c.d.e.f.g.h.i.j.k.n.o.p.q.r.s.t........................",'#10'".....'
+ +'..................u.l.m.,.-.*.a.b.c.d.e.f.g.h.i.j.k.n.o.p.q.r.s.v.w.x.y....'
+ +'................",'#10'"...................z.u.l.m.,.-.*.a.b.A.B.C.D.E.F.G.'
+ +'H.I.J.K.L.M.r.s.v.w.x.y.N.O..................",'#10'".................z.u.l'
+ +'.m.,.-.*.P.Q.R.S.T.U.E.F.G.H.I.V.W.X.Y.Z.0.1.w.x.y.N.O.2.3................"'
+ +','#10'"...............z.u.l.m.,.-.*.4.5.6.S.T.U.E.F.G.H.I.V.W.X.Y.Z.7.8.9.@'
+ +'.#.N.O.2.3.;.:..............",'#10'".............z.u.l.m.,.-.=.+.%.6.S.T.U.'
+ +'E.F.G.H.I.V.W.X.Y.Z.7.8.9.$.(.).[.2.3.;.:.],.............",'#10'"..........'
+ +'.z.u.l.m.,.-,,,-.%.6.S.T.U.E.F.G.H.I.V.W.X.Y.Z.7.8.9.$.(.),*,a,b,c.:.],.,d,'
+ +'e..........",'#10'"...........u.l.m.,.-,,,-.%.6.S.T.U.E.F.G.H.I.V.W.X.Y.Z.7'
+ +'.8.9.$.(.),*,a,f,g,h,i,.,d,e,j,k........",'#10'".........u.l.m.,.-,,,-.%.6.'
+ +'S.T.U.E.F.G.H.I.V.W.X.Y.Z.7.8.9.$.(.),*,a,f,g,l,m,n,d,e,j,k,o........",'#10
+ +'".........l.m.,.-.=,p.%.6.S.T.U.E.F.G.H.I.V.W.X.Y.Z.7.8.9.$.(.),*,a,f,g,l,m'
+ +',q,r,s,j,k,o,t,u......",'#10'".......l.m.,.-.*.+.%.6.S.T.U.E.F.G.H.I.V.W.X.'
+ +'Y.Z.7.8.9.$.(.),*,a,f,g,l,m,q,r,v,w,x,o,t,u,y......",'#10'".......m.,.-.*.4'
+ +'.%.6.S.T.U.E.F.G.H.I.V.W.X,z,A,B,C,D,E,F.),*,a,f,g,l,m,q,r,v,w,G,H,I,u,y,J,'
+ +'K....",'#10'".....m.,.-.*.P.5.6.S.T.U.E.F.G.H.I.V,L,M.q.r.s.v.w.x.y.N.O,N,b'
+ +',g,l,m,q,r,v,w,G,O,P,Q,y,J,K,R....",'#10'".....,.-.*.a.Q.6.S.T.U.E.F.G.H.I.'
+ +'V,S.p.q.r.s.v.w.x.y.N.O.2.3.;,T,m,q,r,v,w,G,O,P,U,V,J,K,R,W,X..",'#10'"...,'
+ +'.-.*.a.b.R.S.T.U.E.F.G.H.I.V.W.p.q.r.s.v.w.x.y.N.O.2.3.;.:,Y,q,r,v,w,G,O,P,'
+ +'U,Z,0,1,R,W,X,2..",'#10'"...-.*.a.b,3.S.T.U.E.F.G.H.I.V.W.X.q.r.s.v.w.x.y.N'
+ +'.O.2.3.;.:.],4,r,v,w,G,O,P,U,Z,0,5,6,W,X,2,7..",'#10'"...*.a.b.c.B.T.U.E.F.'
+ +'G.H.I.V.W.X.Y.r.s.v.w.x.y.N.O.2.3.;.:.],.,8,v,w,G,O,P,U,Z,0,5,9,@,X,2,7,#,;'
+ +'",'#10'"...a.b.c.d.C.U.E.F.G.H,:,=,+,%,$,(.s.v.w.x.y.N.O.2.3.;.:.],.,d,),w,'
+ +'G,O,P,U,Z,0,5,9,[,]-.,7,#-,--",'#10'"...b.c.d.e.D.E.F.G-*-a.n.o.p.q.r.s.v.w'
+ +'.x.y.N.O.2.3.;.:.],.,d,e-b,G,O,P,U,Z,0,5,9,[,]-c-d,#-,---e",'#10'"...c.d.e.'
+ +'f.E.F.G-f.k.n.o.p.q.r.s.v.w.x.y.N.O.2.3.;.:.],.,d,e,j-g-h-i,Q-j-k-l,9,[,]-c'
+ +'-m-n-,---e-o",'#10'"...d.e.f.g.F.G.H-p.n.o.p.q.r.s.v.w.x.y.N.O.2.3.;.:.],.,'
+ +'d,e,j,k,o,t,u,y,J,K,R-q-r-c-m-s-t---e-o-u",'#10'"...e.f.g.h.G.H.I-v.o.p.q.r'
+ +'.s.v.w.x.y.N.O.2.3.;.:.],.,d,e,j,k,o,t,u,y,J,K,R,W,X,2-m-s-w-x-e-o-u-y",'#10
+ +'"...f.g.h.i.H.I.V,+.p.q.r.s.v.w.x.y.N.O.2.3.;.:.],.,d,e,j,k,o,t,u,y,J,K,R,W'
+ +',X,2,7-s-w-z-A-o-u-y-B",'#10'"...g.h.i.j.I.V.W-C.q.r.s.v.w.x.y.N.O.2.3.;.:.'
+ +'],.,d,e,j,k,o,t,u,y,J,K,R,W,X,2,7,#-w-z-D-E-u-y-B-F",'#10'"...h.i.j.k-G.W.X'
+ +'-H.r.s.v.w.x.y.N.O.2.3.;.:.],.,d,e,j,k,o,t,u,y,J,K,R,W,X,2,7,#-,-z-D-I-J-y-'
+ +'B-F-K",'#10'"...i.j.k.n.K.X.Y-L.s.v.w.x.y.N.O.2.3.;.:.],.,d,e,j,k,o,t,u,y,J'
+ +',K,R,W,X,2,7,#-,---D-I-M-N-B-F-K-O",'#10'"...j.k.n.o.L.Y.Z,B.v.w.x.y.N.O.2.'
+ +'3.;.:.],.,d,e,j,k,o,t,u,y,J,K,R,W,X,2,7,#-,---e-I-M-P-B-F-K-O..",'#10'"...k'
+ +'.n.o.p.M.Z.7,C.w.x.y.N.O.2.3.;.:.],.,d,e,j,k,o,t,u,y,J,K,R,W,X,2,7,#-,---e-'
+ +'o-M-Q-R-F-K-O-S..",'#10'".....o.p.q.r.0.8-T.x.y.N.O.2.3.;.:.],.,d,e,j,k,o,t'
+ +',u,y,J,K,R,W,X,2,7,#-,---e-o-u-Q-U-V-K-O-S-W..",'#10'".....p.q.r.s.1.9-X.y.'
+ +'N.O.2.3.;.:.],.,d,e,j,k,o,t,u,y,J,K,R,W,X,2,7,#-,---e-o-u-y-U-Y-K-O-S-W-Z..'
+ +'",'#10'".....q.r.s.v.w.@-0.N.O.2.3.;.:.],.,d,e,j,k,o,t,u,y,J,K,R,W,X,2,7,#-'
+ +',---e-o-u-y-B-1-2-O-S-W-Z....",'#10'".......s.v.w.x.#-3.O.2.3.;.:.],.,d,e,j'
+ +',k,o,t,u,y,J,K,R,W,X,2,7,#-,---e-o-u-y-B-F-4-O-S-W-Z-5....",'#10'".......t.'
+ +'w.x.y.N.O.2.3.;.:.],.,d,e,j,k,o,t,u,y,J,K,R-6-7-8,7,#-,---e-o-u-y-B-F-K-O-S'
+ ,'-W-Z-5......",'#10'".........x.y.N.O.2.3.;.:.],.,d,e,j,k,o,t,u,y,J,5,9,[,]-'
+ +'c-m,#-,---e-o-u-y-B-F-K-O-S-W-Z-5-9......",'#10'".........y.N.O.2.3.;.:.],.'
+ +',d,e,j,k,o,t,u,y,J,K,9,[,]-c-m-s-t---e-o-u-y-B-F-K-O-S-W-Z-5-@........",'#10
+ +'"...........O.2.3.;.:.],.,d,e,j,k,o,t,u,y,J,K,R,[,]-c-m-s-w-z-#-;-J-:-B-=-+'
+ +'-O-S-W-Z-5-@..........",'#10'".............3.;.:.],.,d,e,j,k,o,t,u,y,J,K,R-'
+ +'6,]-c-m-s-w-z-D-I-M-Q-U-1-%-$-S-W-Z-5-@-(..........",'#10'"...............:'
+ +'.],.,d,e,j,k,o,t,u,y,J,K,R-)-[-c-m-s-w-z-D-I-M-Q-U-1-4-]-S-W-Z-5-@-(.......'
+ +'.....",'#10'"................,.,d,e,j,k,o,t,u*.*,*-**,[,]-c-m-s-w-z-D-I-M-Q'
+ +'-U-Y*a-O-S-W-Z-5-@-(..............",'#10'"..................,e,j,k,o,t,u,y,'
+ +'J,1,6,@,]-c-m-s-w-z-D-I-M-P*b-V-K-O-S-W-Z-5-@-(................",'#10'"....'
+ +'................,k,o,t,u,y,J,K,R,W,X-.-d-n-t-x-A-E-J-N-B-F-K-O-S-W-Z-5-@...'
+ +'.................",'#10'"........................,u,y,J,K,R,W,X,2,7,#-,---e'
+ +'-o-u-y-B-F-K-O-S-W-Z-5-9......................",'#10'".....................'
+ +'.......,K,R,W,X,2,7,#-,---e-o-u-y-B-F-K-O-S-W-Z-5..........................'
+ +'",'#10'"................................,X,2,7,#-,---e-o-u-y-B-F-K-O-S-W-Z.'
+ +'.............................",'#10'"......................................'
+ +',;---e-o-u-y-B-F-K*c......................................"}'#10#12'Proport'
+ +'ional'#9#7'Stretch'#9#11'Transparent'#8#0#0#6'TLabel'#6'Label1'#4'Left'#2'+'
+ +#6'Height'#2#14#3'Top'#2#5#5'Width'#3#222#0#7'Caption'#6'%Data Table Master/'
+ +'Detail Setup Wizard'#11'Font.Height'#2#245#9'Font.Name'#6#6'Tahoma'#10'Font'
+ +'.Style'#11#6'fsBold'#0#11'ParentColor'#8#0#0#6'TLabel'#6'Label2'#4'Left'#2
+ +'-'#6'Height'#2#16#3'Top'#2#21#5'Width'#3'K'#1#7'Caption'#6'@This wizard wil'
+ +'l help you configure a master/detail relationship'#11'ParentColor'#8#0#0#0
+ +#12'TPageControl'#8'pc_Pages'#6'Height'#3#180#1#3'Top'#2','#5'Width'#3#192#1
+ +#10'ActivePage'#7#9'ts_Params'#5'Align'#7#8'alClient'#8'TabIndex'#2#4#8'TabO'
+ +'rder'#2#1#0#9'TTabSheet'#10'ts_Welcome'#7'Caption'#6#7'Welcome'#12'ClientHe'
+ +'ight'#3#154#1#11'ClientWidth'#3#184#1#0#6'TLabel'#6'Label3'#4'Left'#2#8#6'H'
+ +'eight'#2#14#3'Top'#2#8#5'Width'#3':'#1#7'Caption'#6'4Welcome to the Data Ta'
+ +'ble Master/Detail Setup Wizard'#11'Font.Height'#2#245#9'Font.Name'#6#6'Taho'
+ +'ma'#10'Font.Style'#11#6'fsBold'#0#11'ParentColor'#8#0#0#6'TLabel'#6'Label4'
+ +#4'Left'#2#24#6'Height'#2'.'#3'Top'#2#24#5'Width'#3'^'#1#7'Caption'#6#195'Th'
+ +'is wizard will help you set up a Master/Detail relationship by choosing a M'
+ +'aster Source for the selected data table and defining how the relationshop '
+ +'between master and detail tables is mapped.'#11'ParentColor'#8#8'WordWrap'#9
+ +#0#0#6'TLabel'#7'Label24'#4'Left'#2#24#6'Height'#2#16#3'Top'#2'H'#5'Width'#3
+ +#243#0#7'Caption'#6'0This wizard will affect the following properties'#11'Pa'
+ +'rentColor'#8#0#0#6'TLabel'#7'Label25'#4'Left'#2' '#6'Height'#2#16#3'Top'#2
+ +'X'#5'Width'#2'Q'#7'Caption'#6#14'- MasterSource'#11'ParentColor'#8#0#0#6'TL'
+ +'abel'#7'Label26'#4'Left'#2' '#6'Height'#2#16#3'Top'#2'h'#5'Width'#3#161#0#7
+ +'Caption'#6#31'- MasterFields and DetailFields'#11'ParentColor'#8#0#0#6'TLab'
+ +'el'#7'Label27'#4'Left'#2' '#6'Height'#2#16#3'Top'#3#136#0#5'Width'#3#137#0#7
+ +'Caption'#6#22'- MasterParamsMappings'#11'ParentColor'#8#0#0#6'TLabel'#7'Lab'
+ +'el28'#4'Left'#2' '#6'Height'#2#16#3'Top'#3#152#0#5'Width'#3#135#0#7'Caption'
+ +#6#22'- MasterRequestMapping'#11'ParentColor'#8#0#0#6'TLabel'#7'Label29'#4'L'
+ +'eft'#2' '#6'Height'#2#16#3'Top'#2'x'#5'Width'#2'|'#7'Caption'#6#19'- Master'
+ +'MappingMode'#11'ParentColor'#8#0#0#0#9'TTabSheet'#15'ts_MasterSource'#7'Cap'
+ +'tion'#6#15'ts_MasterSource'#12'ClientHeight'#3#154#1#11'ClientWidth'#3#184#1
+ +#10'ImageIndex'#2#6#0#6'TLabel'#6'Label8'#4'Left'#2#8#6'Height'#2#14#3'Top'#2
+ +#8#5'Width'#2'j'#7'Caption'#6#17'Pick MasterSource'#11'Font.Height'#2#245#9
+ +'Font.Name'#6#6'Tahoma'#10'Font.Style'#11#6'fsBold'#0#11'ParentColor'#8#0#0#6
+ +'TLabel'#6'Label9'#4'Left'#2#24#6'Height'#2#16#3'Top'#2#24#5'Width'#3'1'#1#7
+ +'Caption'#6'=Select the data table to use as master source for this table:'
+ +#11'ParentColor'#8#0#0#6'TLabel'#7'Label10'#4'Left'#2#8#6'Height'#2#14#3'Top'
+ +#2'P'#5'Width'#2''#7'Caption'#6#19'Choose Mapping Mode'#11'Font.Height'#2
+ +#245#9'Font.Name'#6#6'Tahoma'#10'Font.Style'#11#6'fsBold'#0#11'ParentColor'#8
+ +#0#0#6'TLabel'#7'Label17'#4'Left'#2#24#6'Height'#2#16#3'Top'#2'`'#5'Width'#3
+ +#147#1#7'Caption'#6'KSelect what method you want to use fetch detail data fo'
+ +'r your master source'#11'ParentColor'#8#0#0#6'TLabel'#11'lbl_Params1'#4'Lef'
+ +'t'#2'*'#6'Height'#2'.'#3'Top'#3#204#0#5'Width'#3'V'#1#7'Caption'#6#187'Mast'
+ +'er key fields will be passed as parameters when fetching detail data. Use t'
+ +'his if you''re talking to a standard DA server, and have defined Parameters'
+ +' in data table inside your schema.'#11'ParentColor'#8#8'WordWrap'#9#0#0#6'T'
+ +'Label'#11'lbl_Params2'#4'Left'#2'*'#6'Height'#2#31#3'Top'#3#248#0#5'Width'#3
+ +#254#0#7'Caption'#6'\Your detail data will be fetched via the standard DataR'
+ ,'equestCall, just like any data table.'#11'ParentColor'#8#8'WordWrap'#9#0#0#6
+ +'TLabel'#11'lbl_Method1'#4'Left'#2'*'#6'Height'#2#16#3'Top'#3'D'#1#5'Width'#3
+ +#139#1#7'Caption'#6'JData will be retrieved using a custom method you provid'
+ +'ed in your service.'#11'ParentColor'#8#0#0#6'TLabel'#11'lbl_Method2'#4'Left'
+ +#2'*'#6'Height'#2#23#3'Top'#3'X'#1#5'Width'#3'Z'#1#7'Caption'#6'|This option'
+ +' is only available if the detail table uses a separate RemoteDataAdapter co'
+ +'mponent with a custom DataRequestCall.'#10'Font.Color'#7#10'clGrayText'#11
+ +'Font.Height'#2#247#9'Font.Name'#6#6'Tahoma'#11'ParentColor'#8#8'WordWrap'#9
+ +#0#0#6'TLabel'#11'lbl_Params3'#4'Left'#2'*'#6'Height'#2#12#3'Top'#3#26#1#5'W'
+ +'idth'#3'+'#1#7'Caption'#6'KThis option is only available if your detail dat'
+ +'a table defines parameters.'#10'Font.Color'#7#10'clGrayText'#11'Font.Height'
+ +#2#247#9'Font.Name'#6#6'Tahoma'#11'ParentColor'#8#8'WordWrap'#9#0#0#6'TLabel'
+ +#10'lbl_Where1'#4'Left'#2'*'#6'Height'#2#16#3'Top'#3#140#0#5'Width'#3'9'#1#7
+ +'Caption'#6'?A where clause will be passed to retrieve filtered detail data.'
+ +#11'ParentColor'#8#0#0#6'TLabel'#10'lbl_Where2'#4'Left'#2'*'#6'Height'#2#12#3
+ +'Top'#3#160#0#5'Width'#3#176#0#7'Caption'#6'&Recommended for Version 5.0 and'
+ +' above.'#10'Font.Color'#7#10'clGrayText'#11'Font.Height'#2#247#9'Font.Name'
+ +#6#6'Tahoma'#11'ParentColor'#8#0#0#9'TComboBox'#14'cb_DataSources'#4'Left'#2
+ +#24#6'Height'#2#21#3'Top'#2'('#5'Width'#3'!'#1#16'AutoCompleteText'#11#22'cb'
+ +'actEndOfLineComplete'#20'cbactSearchAscending'#0#10'ItemHeight'#2#13#8'OnCh'
+ +'ange'#7#20'cb_DataSourcesChange'#5'Style'#7#14'csDropDownList'#8'TabOrder'#2
+ +#0#0#0#12'TRadioButton'#8'rb_Where'#4'Left'#2#24#6'Height'#2#21#3'Top'#2'x'#5
+ +'Width'#3#187#0#7'Caption'#6#29'Using automatic WHERE clauses'#8'OnChange'#7
+ +#20'cb_DataSourcesChange'#8'TabOrder'#2#1#0#0#12'TRadioButton'#9'rb_Params'#4
+ +'Left'#2#24#6'Height'#2#21#3'Top'#3#184#0#5'Width'#3#134#0#7'Caption'#6#21'U'
+ +'sing data parameters'#8'OnChange'#7#20'cb_DataSourcesChange'#8'TabOrder'#2#2
+ +#0#0#12'TRadioButton'#9'rb_Method'#4'Left'#2#24#6'Height'#2#21#3'Top'#3'0'#1
+ +#5'Width'#3#158#0#7'Caption'#6#26'Using a custom method call'#8'OnChange'#7
+ +#20'cb_DataSourcesChange'#8'TabOrder'#2#3#0#0#0#9'TTabSheet'#9'ts_Fields'#7
+ +'Caption'#6#9'ts_Fields'#12'ClientHeight'#3#154#1#11'ClientWidth'#3#184#1#10
+ +'ImageIndex'#2#3#0#6'TLabel'#15'labMasterFields'#4'Left'#2#24#6'Height'#2#16
+ +#3'Top'#2'\'#5'Width'#2'I'#7'Caption'#6#15'&Master Fields:'#12'FocusControl'
+ +#7#8'lbMaster'#11'ParentColor'#8#0#0#6'TLabel'#15'labDetailFields'#4'Left'#3
+ +#0#1#6'Height'#2#16#3'Top'#2'\'#5'Width'#2'C'#7'Caption'#6#15'&Detail Fields'
+ +':'#12'FocusControl'#7#8'lbDetail'#11'ParentColor'#8#0#0#6'TLabel'#7'Label13'
+ +#4'Left'#2#24#6'Height'#2#16#3'Top'#3'C'#1#5'Width'#2'F'#7'Caption'#6#13'Mas'
+ +'terFields:'#12'FocusControl'#7#13'eMasterFields'#11'ParentColor'#8#0#0#6'TL'
+ +'abel'#7'Label14'#4'Left'#2#24#6'Height'#2#16#3'Top'#3'['#1#5'Width'#2'@'#7
+ +'Caption'#6#13'DetailFields:'#12'FocusControl'#7#13'eDetailFields'#11'Parent'
+ +'Color'#8#0#0#6'TLabel'#7'Label18'#4'Left'#2#8#6'Height'#2#14#3'Top'#2#8#5'W'
+ +'idth'#2's'#7'Caption'#6#20'Master/Detail Fields'#11'Font.Height'#2#245#9'Fo'
+ +'nt.Name'#6#6'Tahoma'#10'Font.Style'#11#6'fsBold'#0#11'ParentColor'#8#0#0#6
+ +'TLabel'#7'Label19'#4'Left'#2#24#6'Height'#2#16#3'Top'#2#24#5'Width'#3'_'#1#7
+ +'Caption'#6'FPlease select the fields that describe the Master/Detail relati'
+ +'onship.'#11'ParentColor'#8#0#0#8'TListBox'#8'lbMaster'#4'Left'#2#22#6'Heigh'
+ +'t'#3#209#0#3'Top'#2'l'#5'Width'#3#164#0#10'ItemHeight'#2#13#11'MultiSelect'
+ +#9#8'TabOrder'#2#0#0#0#8'TListBox'#8'lbDetail'#4'Left'#3#254#0#6'Height'#3
+ +#209#0#3'Top'#2'l'#5'Width'#3#164#0#10'ItemHeight'#2#13#11'MultiSelect'#9#8
+ +'TabOrder'#2#1#0#0#5'TEdit'#13'eMasterFields'#4'Left'#2'a'#6'Height'#2#21#3
+ +'Top'#3'@'#1#5'Width'#3'A'#1#8'OnChange'#7#20'OnFieldMappingChange'#8'TabOrd'
+ +'er'#2#2#4'Text'#6#9'fdsfdsdsf'#0#0#5'TEdit'#13'eDetailFields'#4'Left'#2'a'#6
+ +'Height'#2#21#3'Top'#3'X'#1#5'Width'#3'A'#1#8'OnChange'#7#20'OnFieldMappingC'
+ +'hange'#8'TabOrder'#2#3#4'Text'#6#9'fdsfdsdsf'#0#0#7'TBitBtn'#17'bbAddFieldM'
+ +'apping'#4'Left'#3#190#0#6'Height'#2#25#3'Top'#2'l'#5'Width'#2'<'#7'Caption'
+ +#6#4'&Add'#10'Glyph.Data'#10':'#3#0#0'6'#3#0#0'BM6'#3#0#0#0#0#0#0'6'#0#0#0'('
+ +#0#0#0#16#0#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0#3#0#0#18#11#0#0#18#11#0#0#0#0#0#0
+ +#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#3']'#5#3']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#3']'#5'['#247#145#5#140#13#3']'#5#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#3']'#5'['#247#145#5#149#14#3']'#5#255#0#255#255#0#255#255#0
+ ,#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#3']'#5'['#247#145#5#146#13#3']'#5#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#3']'#5'['#247#145#6#149#15#3']'#5#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5#3']'
+ +#5#3']'#5#3']'#5#3']'#5'['#247#145#12#156#24#3']'#5#3']'#5#3']'#5#3']'#5#3']'
+ +#5#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145';'#218'i0'#207'W*'#198'M!'
+ +#184'<'#23#166'+'#17#159'!'#13#158#28#10#154#21#6#146#14#5#147#13#5#139#13#3
+ +']'#5#255#0#255#255#0#255#3']'#5'['#247#145'['#247#145'['#247#145'['#247#145
+ +'['#247#145'['#247#145#24#169'/['#247#145'['#247#145'['#247#145'['#247#145'['
+ +#247#145#3']'#5#255#0#255#255#0#255#255#0#255#3']'#5#3']'#5#3']'#5#3']'#5#3
+ +']'#5'['#247#145'%'#188'B'#3']'#5#3']'#5#3']'#5#3']'#5#3']'#5#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5'['
+ +#247#145'0'#206'W'#3']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5
+ +'['#247#145';'#217'h'#3']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3
+ +']'#5'['#247#145'H'#235''#3']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#3']'#5'['#247#145'['#247#145#3']'#5#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#3']'#5#3']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#9'NumGlyphs'#2#0#7'OnClick'#7#22'bbAddFie'
+ +'ldMappingClick'#8'TabOrder'#2#4#0#0#7'TBitBtn'#7'BitBtn4'#4'Left'#3#190#0#6
+ +'Height'#2#25#3'Top'#3'$'#1#5'Width'#2'<'#7'Caption'#6#6'&Clear'#10'Glyph.Da'
+ +'ta'#10':'#3#0#0'6'#3#0#0'BM6'#3#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0
+ +#0#0#1#0#24#0#0#0#0#0#0#3#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#242#187#129#243#196#138#242#188#129
+ +#239#176'r'#238#175'n'#239#178'u'#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#251#235#189#254#243#201#251
+ +#222#172#243#201#144#251#182'~'#255#180'}'#252#202#153#255#217#173#254#217
+ +#167#240#181'w'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#254#250#211#254#247#204#251#220#169#235#202#145#169#184'n'#132#171'T+'#145
+ +' W'#167'C'#234#243#199#252#233#189#238#173'o'#255#0#255#255#0#255#255#0#255
+ +#255#0#255#237#165'e'#243#194#138#252#240#196#252#229#181#251#208#159','#150
+ +'"'#0'{'#0#5#130#6#6''#4'='#163'5'#254#242#208#240#177's'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#238#171'm'#237#167'g'#239#176'p'#246#201#144#255#216
+ +#172'.'#152'#'#0'n'#0'j'#191'k'#255#240#234'H'#161'8'#163#175'^'#252#175't'
+ +#255#0#255#255#0#255#255#0#255#255#0#255#242#180'y'#242#183'~'#240#178'w'#240
+ +#172'o'#251#181'~z'#180'`A'#166'Ao'#188'i'#255#255#255#244#254#251#188#187'y'
+ +#243#170'k'#255#0#255#255#0#255#255#0#255#255#0#255#247#194#146#250#197#152
+ +#248#194#147#248#192#144#243#191#138#194#213#165#255#255#255#217#238#213'V'
+ +#177'SK'#175'K'#184#188'y'#248#176'u'#255#0#255#255#0#255#255#0#255#246#199
+ +#146#252#212#173#252#212#172#252#208#169#252#208#169#255#212#181']'#169'F'
+ +#128#199#128#224#242#222''''#152'$'#0'p'#0#130#176'['#255#189#144#238#172'm'
+ +#255#0#255#255#0#255#246#199#146#255#234#196#254#227#188#254#226#186#254#224
+ +#184#255#224#186#217#217#172#10#130#9#24#138#22#3''#3#0'y'#0'w'#180']'#255
+ +#206#170#238#172'm'#255#0#255#255#0#255#250#221#171#255#251#213#255#244#204
+ +#255#243#202#255#240#201#255#239#197#255#242#209#181#213#152'*'#150'$+'#153
+ +'$'#154#203#135#181#209#149#255#224#186#242#183'z'#255#0#255#255#0#255#252
+ +#239#196#255#255#216#255#251#211#255#252#212#255#251#211#255#251#212#255#252
+ +#212#255#255#225#255#255#235#255#255#231#255#255#224#255#248#215#255#244#203
+ +#243#192#134#255#0#255#255#0#255#254#244#203#255#255#221#255#255#217#255#255
+ +#217#255#255#218#255#254#215#254#246#204#248#218#163#244#192'}'#244#193''
+ +#247#216#163#254#242#197#255#255#221#243#201#145#255#0#255#255#0#255#244#204
+ +#150#248#222#175#248#221#172#247#216#166#246#207#153#243#191#128#239#172'f'
+ +#235#157'O'#235#156'L'#235#159'U'#240#172'n'#250#192#135#252#211#160#250#192
+ +#137#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#237#163'T'#239#171'h'#247#188#131#250#191#136
+ +#250#188#131#250#188#131#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ ,#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#250
+ +#192#136#250#192#136#250#192#136#255#0#255#255#0#255#9'NumGlyphs'#2#0#7'OnCl'
+ +'ick'#7#12'BitBtn4Click'#8'TabOrder'#2#5#0#0#0#9'TTabSheet'#13'ts_MethodCall'
+ +#7'Caption'#6#13'ts_MethodCall'#12'ClientHeight'#3#154#1#11'ClientWidth'#3
+ +#184#1#10'ImageIndex'#2#4#0#6'TLabel'#16'labMasterFields2'#4'Left'#2#24#6'He'
+ +'ight'#2#16#3'Top'#2'\'#5'Width'#2'I'#7'Caption'#6#15'&Master Fields:'#11'Pa'
+ +'rentColor'#8#0#0#6'TLabel'#16'labDataReqParams'#4'Left'#3#0#1#6'Height'#2#16
+ +#3'Top'#2'\'#5'Width'#3#132#0#7'Caption'#6#24'DataRequestCall &Params:'#12'F'
+ +'ocusControl'#7#15'lbDataReqParams'#11'ParentColor'#8#0#0#6'TLabel'#6'Label7'
+ +#4'Left'#2#24#6'Height'#2#16#3'Top'#3'*'#1#5'Width'#3'-'#1#7'Caption'#6'7Map'
+ +'p&ings (Detail''s DataRequestCall Param=MasterField):'#12'FocusControl'#7#9
+ +'mMappings'#11'ParentColor'#8#0#0#6'TLabel'#7'Label20'#4'Left'#2#8#6'Height'
+ +#2#14#3'Top'#2#8#5'Width'#3#191#0#7'Caption'#6#31'Map Fields to Method Param'
+ +'eters'#11'Font.Height'#2#245#9'Font.Name'#6#6'Tahoma'#10'Font.Style'#11#6'f'
+ +'sBold'#0#11'ParentColor'#8#0#0#6'TLabel'#7'Label21'#4'Left'#2#24#6'Height'#2
+ +'='#3'Top'#2#24#5'Width'#3#134#1#8'AutoSize'#8#7'Caption'#6#237'Select how t'
+ +'he master fields map to the parameters passed to the customs GetDataCall yo'
+ +'u are using to fetch Detail data. Ideally, all fields from the previous pag'
+ +'e (i.e. all fields involved in the M/D relationship) should be mapped here.'
+ +#11'ParentColor'#8#8'WordWrap'#9#0#0#8'TListBox'#9'lbMaster2'#4'Left'#2#22#6
+ +'Height'#3#185#0#3'Top'#2'l'#5'Width'#3#164#0#10'ItemHeight'#2#13#11'MultiSe'
+ +'lect'#9#8'TabOrder'#2#0#0#0#8'TListBox'#15'lbDataReqParams'#4'Left'#3#254#0
+ +#6'Height'#3#185#0#3'Top'#2'j'#5'Width'#3#164#0#10'ItemHeight'#2#13#11'Multi'
+ +'Select'#9#8'TabOrder'#2#1#0#0#5'TMemo'#9'mMappings'#4'Left'#2#22#6'Height'#2
+ +'<'#3'Top'#3':'#1#5'Width'#3#139#1#10'ScrollBars'#7#10'ssVertical'#8'TabOrde'
+ +'r'#2#2#0#0#7'TBitBtn'#19'bbAddDataReqMapping'#4'Left'#3#190#0#6'Height'#2#25
+ +#3'Top'#2'l'#5'Width'#2'<'#7'Caption'#6#4'&Add'#10'Glyph.Data'#10':'#3#0#0'6'
+ +#3#0#0'BM6'#3#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0#24#0#0#0#0
+ +#0#0#3#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5#3']'#5#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145#5#140#13#3']'
+ +#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145#5#149#14#3
+ +']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145#5#146#13
+ +#3']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145#6#149#15
+ +#3']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#3']'#5#3']'#5#3']'#5#3']'#5#3']'#5'['#247#145#12#156#24#3']'#5#3
+ +']'#5#3']'#5#3']'#5#3']'#5#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145';'
+ +#218'i0'#207'W*'#198'M!'#184'<'#23#166'+'#17#159'!'#13#158#28#10#154#21#6#146
+ +#14#5#147#13#5#139#13#3']'#5#255#0#255#255#0#255#3']'#5'['#247#145'['#247#145
+ +'['#247#145'['#247#145'['#247#145'['#247#145#24#169'/['#247#145'['#247#145'['
+ +#247#145'['#247#145'['#247#145#3']'#5#255#0#255#255#0#255#255#0#255#3']'#5#3
+ +']'#5#3']'#5#3']'#5#3']'#5'['#247#145'%'#188'B'#3']'#5#3']'#5#3']'#5#3']'#5#3
+ +']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#3']'#5'['#247#145'0'#206'W'#3']'#5#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#3']'#5'['#247#145';'#217'h'#3']'#5#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#3']'#5'['#247#145'H'#235''#3']'#5#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#3']'#5'['#247#145'['#247#145#3']'#5#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5#3']'#5#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#9'NumGlyphs'#2#0
+ +#7'OnClick'#7#24'bbAddDataReqMappingClick'#8'TabOrder'#2#3#0#0#7'TBitBtn'#21
+ +'bbClearDataReqMapping'#4'Left'#3#190#0#6'Height'#2#25#3'Top'#3#10#1#5'Width'
+ +#2'<'#7'Caption'#6#6'&Clear'#10'Glyph.Data'#10':'#3#0#0'6'#3#0#0'BM6'#3#0#0#0
+ ,#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0#3#0#0#18#11#0#0
+ +#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#242#187#129#243#196#138#242#188#129#239#176'r'#238#175'n'#239#178'u'#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#251#235#189#254#243#201#251#222#172#243#201#144#251#182'~'#255#180
+ +'}'#252#202#153#255#217#173#254#217#167#240#181'w'#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#254#250#211#254#247#204#251#220#169#235
+ +#202#145#169#184'n'#132#171'T+'#145' W'#167'C'#234#243#199#252#233#189#238
+ +#173'o'#255#0#255#255#0#255#255#0#255#255#0#255#237#165'e'#243#194#138#252
+ +#240#196#252#229#181#251#208#159','#150'"'#0'{'#0#5#130#6#6''#4'='#163'5'
+ +#254#242#208#240#177's'#255#0#255#255#0#255#255#0#255#255#0#255#238#171'm'
+ +#237#167'g'#239#176'p'#246#201#144#255#216#172'.'#152'#'#0'n'#0'j'#191'k'#255
+ +#240#234'H'#161'8'#163#175'^'#252#175't'#255#0#255#255#0#255#255#0#255#255#0
+ +#255#242#180'y'#242#183'~'#240#178'w'#240#172'o'#251#181'~z'#180'`A'#166'Ao'
+ +#188'i'#255#255#255#244#254#251#188#187'y'#243#170'k'#255#0#255#255#0#255#255
+ +#0#255#255#0#255#247#194#146#250#197#152#248#194#147#248#192#144#243#191#138
+ +#194#213#165#255#255#255#217#238#213'V'#177'SK'#175'K'#184#188'y'#248#176'u'
+ +#255#0#255#255#0#255#255#0#255#246#199#146#252#212#173#252#212#172#252#208
+ +#169#252#208#169#255#212#181']'#169'F'#128#199#128#224#242#222''''#152'$'#0
+ +'p'#0#130#176'['#255#189#144#238#172'm'#255#0#255#255#0#255#246#199#146#255
+ +#234#196#254#227#188#254#226#186#254#224#184#255#224#186#217#217#172#10#130#9
+ +#24#138#22#3''#3#0'y'#0'w'#180']'#255#206#170#238#172'm'#255#0#255#255#0#255
+ +#250#221#171#255#251#213#255#244#204#255#243#202#255#240#201#255#239#197#255
+ +#242#209#181#213#152'*'#150'$+'#153'$'#154#203#135#181#209#149#255#224#186
+ +#242#183'z'#255#0#255#255#0#255#252#239#196#255#255#216#255#251#211#255#252
+ +#212#255#251#211#255#251#212#255#252#212#255#255#225#255#255#235#255#255#231
+ +#255#255#224#255#248#215#255#244#203#243#192#134#255#0#255#255#0#255#254#244
+ +#203#255#255#221#255#255#217#255#255#217#255#255#218#255#254#215#254#246#204
+ +#248#218#163#244#192'}'#244#193''#247#216#163#254#242#197#255#255#221#243
+ +#201#145#255#0#255#255#0#255#244#204#150#248#222#175#248#221#172#247#216#166
+ +#246#207#153#243#191#128#239#172'f'#235#157'O'#235#156'L'#235#159'U'#240#172
+ +'n'#250#192#135#252#211#160#250#192#137#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#237#163'T'
+ +#239#171'h'#247#188#131#250#191#136#250#188#131#250#188#131#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#250#192#136#250#192#136#250#192#136#255#0#255
+ +#255#0#255#9'NumGlyphs'#2#0#7'OnClick'#7#26'bbClearDataReqMappingClick'#8'Ta'
+ +'bOrder'#2#4#0#0#0#9'TTabSheet'#9'ts_Params'#7'Caption'#6#9'ts_Params'#12'Cl'
+ +'ientHeight'#3#154#1#11'ClientWidth'#3#184#1#10'ImageIndex'#2#5#0#6'TLabel'#7
+ +'Label11'#4'Left'#2#24#6'Height'#2#16#3'Top'#2'\'#5'Width'#2'Q'#7'Caption'#6
+ +#16'Master''s Fields:'#11'ParentColor'#8#0#0#6'TLabel'#7'Label12'#4'Left'#3#0
+ +#1#6'Height'#2#16#3'Top'#2'\'#5'Width'#2'+'#7'Caption'#6#7'Params:'#12'Focus'
+ +'Control'#7#8'lbParams'#11'ParentColor'#8#0#0#6'TLabel'#7'Label15'#4'Left'#2
+ +#24#6'Height'#2#16#3'Top'#3'*'#1#5'Width'#3#212#0#7'Caption'#6'&Mappings (De'
+ +'tail''s Param=MasterField):'#12'FocusControl'#7#15'mParamsMappings'#11'Pare'
+ +'ntColor'#8#0#0#6'TLabel'#7'Label22'#4'Left'#2#8#6'Height'#2#14#3'Top'#2#8#5
+ +'Width'#3#209#0#7'Caption'#6'#Map Fields to Data Table Parameters'#11'Font.H'
+ +'eight'#2#245#9'Font.Name'#6#6'Tahoma'#10'Font.Style'#11#6'fsBold'#0#11'Pare'
+ +'ntColor'#8#0#0#6'TLabel'#7'Label23'#4'Left'#2#24#6'Height'#2'.'#3'Top'#2#24
+ +#5'Width'#3#133#1#7'Caption'#6#188'Select how the master fields map to the p'
+ +'arameters of your detail data. Ideally, all fields from the previous page ('
+ +'i.e. all fields involved in the M/D relationship) should be mapped here.'#11
+ +'ParentColor'#8#8'WordWrap'#9#0#0#8'TListBox'#9'lbMaster3'#4'Left'#2#22#6'He'
+ +'ight'#3#185#0#3'Top'#2'l'#5'Width'#3#164#0#10'ItemHeight'#2#13#11'MultiSele'
+ +'ct'#9#8'TabOrder'#2#0#0#0#8'TListBox'#8'lbParams'#4'Left'#3#254#0#6'Height'
+ +#3#185#0#3'Top'#2'l'#5'Width'#3#164#0#10'ItemHeight'#2#13#11'MultiSelect'#9#8
+ +'TabOrder'#2#1#0#0#5'TMemo'#15'mParamsMappings'#4'Left'#2#22#6'Height'#2'<'#3
+ +'Top'#3':'#1#5'Width'#3#139#1#10'ScrollBars'#7#10'ssVertical'#8'TabOrder'#2#2
+ +#0#0#7'TBitBtn'#20'bbAddParamMappingXXX'#4'Left'#3#190#0#6'Height'#2#25#3'To'
+ +'p'#2'l'#5'Width'#2'<'#7'Caption'#6#4'&Add'#10'Glyph.Data'#10':'#3#0#0'6'#3#0
+ +#0'BM6'#3#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0
+ +#3#0#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255
+ ,#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5#3']'#5#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145#5#140#13#3']'#5
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145#5#149#14#3']'
+ +#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145#5#146#13#3
+ +']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145#6#149#15
+ +#3']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#3']'#5#3']'#5#3']'#5#3']'#5#3']'#5'['#247#145#12#156#24#3']'#5#3
+ +']'#5#3']'#5#3']'#5#3']'#5#255#0#255#255#0#255#255#0#255#3']'#5'['#247#145';'
+ +#218'i0'#207'W*'#198'M!'#184'<'#23#166'+'#17#159'!'#13#158#28#10#154#21#6#146
+ +#14#5#147#13#5#139#13#3']'#5#255#0#255#255#0#255#3']'#5'['#247#145'['#247#145
+ +'['#247#145'['#247#145'['#247#145'['#247#145#24#169'/['#247#145'['#247#145'['
+ +#247#145'['#247#145'['#247#145#3']'#5#255#0#255#255#0#255#255#0#255#3']'#5#3
+ +']'#5#3']'#5#3']'#5#3']'#5'['#247#145'%'#188'B'#3']'#5#3']'#5#3']'#5#3']'#5#3
+ +']'#5#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#3']'#5'['#247#145'0'#206'W'#3']'#5#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#3']'#5'['#247#145';'#217'h'#3']'#5#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#3']'#5'['#247#145'H'#235''#3']'#5#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#3']'#5'['#247#145'['#247#145#3']'#5#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#3']'#5#3']'#5#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#9'NumGlyphs'#2#0
+ +#7'OnClick'#7#25'bbAddParamMappingXXXClick'#8'TabOrder'#2#3#0#0#7'TBitBtn'#23
+ +'bbClearParamMappingsXXX'#4'Left'#3#190#0#6'Height'#2#25#3'Top'#3#12#1#5'Wid'
+ +'th'#2'<'#7'Caption'#6#6'&Clear'#10'Glyph.Data'#10':'#3#0#0'6'#3#0#0'BM6'#3#0
+ +#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0#3#0#0#18#11
+ +#0#0#18#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#242#187#129#243#196#138#242#188#129#239#176'r'#238#175'n'#239#178'u'#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#251#235#189#254#243#201#251#222#172#243#201#144#251#182'~'#255#180
+ +'}'#252#202#153#255#217#173#254#217#167#240#181'w'#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#254#250#211#254#247#204#251#220#169#235
+ +#202#145#169#184'n'#132#171'T+'#145' W'#167'C'#234#243#199#252#233#189#238
+ +#173'o'#255#0#255#255#0#255#255#0#255#255#0#255#237#165'e'#243#194#138#252
+ +#240#196#252#229#181#251#208#159','#150'"'#0'{'#0#5#130#6#6''#4'='#163'5'
+ +#254#242#208#240#177's'#255#0#255#255#0#255#255#0#255#255#0#255#238#171'm'
+ +#237#167'g'#239#176'p'#246#201#144#255#216#172'.'#152'#'#0'n'#0'j'#191'k'#255
+ +#240#234'H'#161'8'#163#175'^'#252#175't'#255#0#255#255#0#255#255#0#255#255#0
+ +#255#242#180'y'#242#183'~'#240#178'w'#240#172'o'#251#181'~z'#180'`A'#166'Ao'
+ +#188'i'#255#255#255#244#254#251#188#187'y'#243#170'k'#255#0#255#255#0#255#255
+ +#0#255#255#0#255#247#194#146#250#197#152#248#194#147#248#192#144#243#191#138
+ +#194#213#165#255#255#255#217#238#213'V'#177'SK'#175'K'#184#188'y'#248#176'u'
+ +#255#0#255#255#0#255#255#0#255#246#199#146#252#212#173#252#212#172#252#208
+ +#169#252#208#169#255#212#181']'#169'F'#128#199#128#224#242#222''''#152'$'#0
+ +'p'#0#130#176'['#255#189#144#238#172'm'#255#0#255#255#0#255#246#199#146#255
+ +#234#196#254#227#188#254#226#186#254#224#184#255#224#186#217#217#172#10#130#9
+ +#24#138#22#3''#3#0'y'#0'w'#180']'#255#206#170#238#172'm'#255#0#255#255#0#255
+ +#250#221#171#255#251#213#255#244#204#255#243#202#255#240#201#255#239#197#255
+ +#242#209#181#213#152'*'#150'$+'#153'$'#154#203#135#181#209#149#255#224#186
+ +#242#183'z'#255#0#255#255#0#255#252#239#196#255#255#216#255#251#211#255#252
+ +#212#255#251#211#255#251#212#255#252#212#255#255#225#255#255#235#255#255#231
+ +#255#255#224#255#248#215#255#244#203#243#192#134#255#0#255#255#0#255#254#244
+ ,#203#255#255#221#255#255#217#255#255#217#255#255#218#255#254#215#254#246#204
+ +#248#218#163#244#192'}'#244#193''#247#216#163#254#242#197#255#255#221#243
+ +#201#145#255#0#255#255#0#255#244#204#150#248#222#175#248#221#172#247#216#166
+ +#246#207#153#243#191#128#239#172'f'#235#157'O'#235#156'L'#235#159'U'#240#172
+ +'n'#250#192#135#252#211#160#250#192#137#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#237#163'T'
+ +#239#171'h'#247#188#131#250#191#136#250#188#131#250#188#131#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#250#192#136#250#192#136#250#192#136#255#0#255
+ +#255#0#255#9'NumGlyphs'#2#0#7'OnClick'#7#28'bbClearParamMappingsXXXClick'#8
+ +'TabOrder'#2#4#0#0#0#9'TTabSheet'#9'ts_Finish'#7'Caption'#6#6'Finish'#12'Cli'
+ +'entHeight'#3#154#1#11'ClientWidth'#3#184#1#10'ImageIndex'#2#2#0#6'TLabel'#6
+ +'Label5'#4'Left'#2#8#6'Height'#2#14#3'Top'#2#8#5'Width'#2'4'#7'Caption'#6#10
+ +'That''s It!'#11'Font.Height'#2#245#9'Font.Name'#6#6'Tahoma'#10'Font.Style'
+ +#11#6'fsBold'#0#11'ParentColor'#8#0#0#6'TLabel'#6'Label6'#4'Left'#2#24#6'Hei'
+ +'ght'#2#16#3'Top'#2#24#5'Width'#3#240#0#7'Caption'#6'.Your Master/Detail rel'
+ +'ationship is now set up.'#11'ParentColor'#8#0#0#0#0#6'TPanel'#6'Panel2'#6'H'
+ +'eight'#2'#'#3'Top'#3#224#1#5'Width'#3#192#1#5'Align'#7#8'alBottom'#10'Bevel'
+ +'Outer'#7#6'bvNone'#12'ClientHeight'#2'#'#11'ClientWidth'#3#192#1#8'TabOrder'
+ +#2#2#0#7'TBitBtn'#10'btn_Finish'#4'Left'#3'p'#1#6'Height'#2#25#4'Hint'#6#31
+ +'This is Finish, but not the End'#3'Top'#2#5#5'Width'#2'K'#7'Anchors'#11#5'a'
+ +'kTop'#7'akRight'#0#7'Caption'#6#6'Finish'#10'Glyph.Data'#10':'#6#0#0'6'#6#0
+ +#0'BM6'#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0' '#0#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0
+ +#6#0#0'"'#11#0#0'"'#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxx'
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#129#30#0#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255'xxxxxx'#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#129#30#0#129#30#0#129#30#0#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255'xxxxxxxxx'#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#129#30#0#149'D'#15#129#30#0#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255'xxx'#137#137#137'xxx'#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#167'c/'#129#30#0
+ +#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxx'#159#159#159'xxxx'
+ +'xx'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#191#139
+ +'b'#204#161'~'#129#30#0#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxx'#184
+ +#184#184#198#198#198'xxxxxx'#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#129#30#0#216#182#156#230#209#191#231#211#196#129#30#0#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255'xxx'#209#209#209#224#224#224#226#226#226'xxx'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#129#30#0#240#226#217#252#247#242#250#240#230
+ +#129#30#0#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255'xxx'#235#235#235#245#245#245#241
+ +#241#241'xxxxxx'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#216#175#150#244#226#207#240
+ +#215#189#216#167#132#129#30#0#129#30#0#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxx'#208#208#208#233
+ ,#233#233#227#227#227#202#202#202'xxxxxx'#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#243#222#202#239#212#184
+ +#235#201#167#218#166'}'#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxx'#231#231#231#225
+ +#225#225#219#219#219#201#201#201'xxx'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30
+ +#0#231#187#146#227#176#129#224#166'r'#213#146'Z'#129#30#0#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255'xxx'#211#211#211#205#205#205#198#198#198#188#188#188'xxx'#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#129#30#0#218#153'^'#215#143'P'#211#132'A'#207'{5'#129#30
+ +#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255'xxx'#191#191#191#184#184#184#178#178#178#172#172
+ +#172'xxx'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#129#30#0#129#30#0#129
+ +#30#0#129#30#0#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxxxxxxxxxxxxxxxxx'#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#11'ModalResult'#2#1#9'NumGlyphs'#2#2
+ +#7'OnClick'#7#15'btn_FinishClick'#8'TabOrder'#2#0#7'Visible'#8#0#0#7'TBitBtn'
+ +#10'btn_Cancel'#4'Left'#2#5#6'Height'#2#25#3'Top'#2#5#5'Width'#2'K'#6'Cancel'
+ +#9#7'Caption'#6#6'Cancel'#10'Glyph.Data'#10':'#6#0#0'6'#6#0#0'BM6'#6#0#0#0#0
+ +#0#0'6'#0#0#0'('#0#0#0' '#0#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0#6#0#0#196#14#0#0
+ +#196#14#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#0#0#154#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#0#0#154#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255'kkkkkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255'kkkkkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0#0
+ +#154#23'J'#253#16';'#244#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#0#0
+ +#154#0','#248#0'0'#252#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255'kkk'
+ +#168#168#168#160#160#160'kkk'#255#0#255#255#0#255#255#0#255#255#0#255'kkk'
+ +#154#154#154#156#156#156'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#0#0#154
+ +#26'G'#248#26'L'#255#18';'#241#0#0#154#255#0#255#255#0#255#0#0#154#1'-'#246#1
+ +'2'#255#0'*'#243#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255'kkk'#167#167
+ +#167#170#170#170#159#159#159'kkk'#255#0#255#255#0#255'kkk'#153#153#153#158
+ +#158#158#151#151#151'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0
+ +#0#154#28'G'#246#27'M'#255#20'>'#244#0#0#154#0#0#154#0'-'#248#1'4'#255#3'+'
+ +#242#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'kkk'
+ +#167#167#167#171#171#171#162#162#162'kkkkkk'#154#154#154#158#158#158#152#152
+ +#152'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#0#0#154#29'H'#246#29'P'#255#16'='#251#4'1'#254#1'2'#255#0','#246#0#0#154
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255'kkk'#167#167#167#172#172#172#163#163#163#159#159#159#158#158#158#153#153
+ +#153'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#0#0#154#26'H'#249#19'B'#255#12'<'#255#7'3'#246#0#0
+ +#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255'kkk'#167#167#167#167#167#167#163#163#163#156
+ +#156#156'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#0#0#154'!N'#252#29'K'#255#24'G'#255#23
+ ,'C'#246#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255'kkk'#172#172#172#172#172#172#169#169
+ +#169#164#164#164'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#0#0#154'.['#249',_'#255'"M'#248' K'#248'#'
+ +'U'#255#27'F'#246#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255'kkk'#177#177#177#179#179#179#171#171#171#170
+ +#170#170#175#175#175#166#166#166'kkk'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#0#0#154'6d'#250'8k'#255'-Y'#244#0#0#154#0#0
+ +#154'"L'#244'%X'#255#29'I'#246#0#0#154#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255'kkk'#182#182#182#185#185#185#174#174#174'kkkkkk'#169
+ +#169#169#176#176#176#167#167#167'kkk'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#0#0#154'@q'#250'Bt'#255'2]'#241#0#0#154#255#0#255#255#0#255#0#0
+ +#154'"M'#241'''Z'#255' L'#248#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255
+ +'kkk'#187#187#187#190#190#190#175#175#175'kkk'#255#0#255#255#0#255'kkk'#167
+ +#167#167#177#177#177#170#170#170'kkk'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#0#0#154'Iz'#252';f'#243#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#0#0
+ +#154'%P'#244'&U'#250#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255'kkk'#192
+ +#192#192#181#181#181'kkk'#255#0#255#255#0#255#255#0#255#255#0#255'kkk'#170
+ +#170#170#174#174#174'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0
+ +#0#154#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0
+ +#0#154#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'k'
+ +'kkkkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'kkkkkk'
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#11'Mo'
+ +'dalResult'#2#2#9'NumGlyphs'#2#2#8'TabOrder'#2#1#0#0#7'TBitBtn'#8'btn_Next'#4
+ +'Left'#3'p'#1#6'Height'#2#25#3'Top'#2#5#5'Width'#2'K'#7'Anchors'#11#5'akTop'
+ +#7'akRight'#0#7'Caption'#6#5'&Next'#7'Default'#9#10'Glyph.Data'#10':'#6#0#0
+ +'6'#6#0#0'BM6'#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0' '#0#0#0#16#0#0#0#1#0#24#0#0#0
+ +#0#0#0#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#11'|'#21#9'z'#20#8'q'#16#5'j'#12#4'g'#11#4'g'#12#4'g'#12#4'g'
+ +#12#4'g'#12#4'g'#12#4'g'#12#4'W'#9#255#0#255#255#0#255#255#0#255#255#0#255
+ +#156#156#156#156#156#156#152#152#152#150#150#150#149#149#149#149#149#149#149
+ +#149#149#149#149#149#149#149#149#149#149#149#149#149#149#144#144#144#255#0
+ +#255#255#0#255#255#0#255#18#154'('#26#176':'#21#175'2'#17#171''''#13#168#31#8
+ +#166#24#8#165#22#8#165#22#8#166#23#8#166#23#8#165#23#8#171#24#7#141#18#4'W'#8
+ +#255#0#255#255#0#255#168#168#168#176#176#176#174#174#174#172#172#172#170#170
+ +#170#168#168#168#168#168#168#168#168#168#168#168#168#168#168#168#168#168#168
+ +#169#169#169#160#160#160#144#144#144#255#0#255#255#0#255#27#173'<%'#197'T'#30
+ +#192'E'#26#190':'#21#189'1'#16#186''''#11#184#29#9#184#25#9#184#26#9#184#26#9
+ +#183#26#9#190#28#8#171#23#4'g'#12#255#0#255#255#0#255#176#176#176#185#185#185
+ +#181#181#181#180#180#180#178#178#178#176#176#176#173#173#173#173#173#173#173
+ +#173#173#173#173#173#173#173#173#175#175#175#169#169#169#149#149#149#255#0
+ +#255#255#0#255' '#180'E1'#196'd)'#191'S"'#187'H'#27#186'='#23#183'3'#18#180
+ +')'#13#179' '#10#178#25#9#177#24#9#176#24#9#183#26#8#166#23#4'h'#12#255#0#255
+ +#255#0#255#179#179#179#188#188#188#184#184#184#181#181#181#179#179#179#177
+ +#177#177#175#175#175#173#173#173#172#172#172#172#172#172#171#171#171#173#173
+ +#173#168#168#168#149#149#149#255#0#255#255#0#255'"'#181'H?'#200'v5'#195'g'
+ +#254#254#254'#'#188'N'#29#186'B'#24#184'8'#254#254#254#14#180'$'#10#179#28#9
+ +#177#24#9#184#26#8#166#23#4'g'#12#255#0#255#255#0#255#179#179#179#192#192#192
+ +#188#188#188#254#254#254#181#181#181#179#179#179#177#177#177#254#254#254#173
+ +#173#173#172#172#172#172#172#172#173#173#173#168#168#168#149#149#149#255#0
+ +#255#255#0#255'!'#181'HX'#208#138'F'#201'z'#254#254#254#254#254#254'$'#189'P'
+ +#31#187'F'#254#254#254#254#254#254#16#180')'#12#178#31#9#183#26#8#166#22#4'g'
+ ,#12#255#0#255#255#0#255#179#179#179#202#202#202#195#195#195#254#254#254#254
+ +#254#254#182#182#182#180#180#180#254#254#254#254#254#254#174#174#174#172#172
+ +#172#173#173#173#168#168#168#149#149#149#255#0#255#255#0#255'!'#181'Hw'#216
+ +#159'R'#204#129';'#199'r'#254#254#254#254#254#254'&'#190'T!'#189'J'#254#254
+ +#254#254#254#254#19#181'-'#13#186'#'#10#167#24#4'h'#11#255#0#255#255#0#255
+ +#179#179#179#213#213#213#200#200#200#192#192#192#254#254#254#254#254#254#183
+ +#183#183#181#181#181#254#254#254#254#254#254#176#176#176#175#175#175#168#168
+ +#168#149#149#149#255#0#255#255#0#255'!'#181'H'#138#222#172']'#208#138'B'#200
+ +'v7'#197'n'#254#254#254#254#254#254''''#191'X"'#189'O'#254#254#254#254#254
+ +#254#20#187'1'#14#169'"'#6'o'#14#255#0#255#255#0#255#179#179#179#220#220#220
+ +#204#204#204#194#194#194#190#190#190#254#254#254#254#254#254#184#184#184#181
+ +#181#181#254#254#254#254#254#254#177#177#177#170#170#170#152#152#152#255#0
+ +#255#255#0#255'!'#181'H'#149#224#179'e'#210#143'H'#202'z'#254#254#254#254#254
+ +#254'0'#195'i.'#194'e'#254#254#254#254#254#254#31#187'F'#27#190'>'#20#174'/'
+ +#10'z'#20#255#0#255#255#0#255#179#179#179#224#224#224#206#206#206#196#196#196
+ +#254#254#254#254#254#254#187#187#187#187#187#187#254#254#254#254#254#254#180
+ +#180#180#180#180#180#173#173#173#156#156#156#255#0#255#255#0#255'!'#181'H'
+ +#157#227#185'o'#213#151#254#254#254#254#254#254'@'#200't9'#197'p'#254#254#254
+ +#254#254#254'+'#193'`'''#191'U#'#192'N'#27#178'<'#13#133#26#255#0#255#255#0
+ +#255#179#179#179#227#227#227#210#210#210#254#254#254#254#254#254#193#193#193
+ +#191#191#191#254#254#254#254#254#254#185#185#185#184#184#184#183#183#183#176
+ +#176#176#160#160#160#255#0#255#255#0#255'!'#181'H'#169#230#194#128#218#163
+ +#254#254#254'Y'#207#135'M'#204'~D'#201'x'#254#254#254'9'#197'p2'#195'k-'#193
+ +'c*'#194'] '#181'H'#16#143#31#255#0#255#255#0#255#179#179#179#231#231#231#216
+ +#216#216#254#254#254#202#202#202#198#198#198#194#194#194#254#254#254#191#191
+ +#191#188#188#188#186#186#186#185#185#185#179#179#179#164#164#164#255#0#255
+ +#255#0#255'!'#181'I'#174#232#197#166#229#191#145#223#175#134#219#167'x'#215
+ +#157'g'#211#145'Y'#207#135'D'#201'x6'#197'n2'#195'l0'#197'j'''#187'W'#19#156
+ +'&'#255#0#255#255#0#255#179#179#179#233#233#233#230#230#230#223#223#223#218
+ +#218#218#213#213#213#208#208#208#202#202#202#194#194#194#189#189#189#188#188
+ +#188#188#188#188#183#183#183#168#168#168#255#0#255#255#0#255'"'#181'H'#146
+ +#224#179#174#232#198#177#233#200#169#230#194#155#227#184#135#221#170'j'#213
+ +#150'O'#205#130';'#199't6'#197'p4'#200's+'#191'^'#20#164'('#255#0#255#255#0
+ +#255#179#179#179#223#223#223#233#233#233#234#234#234#231#231#231#226#226#226
+ +#219#219#219#208#208#208#199#199#199#192#192#192#189#189#189#190#190#190#185
+ +#185#185#171#171#171#255#0#255#255#0#255#255#0#255'8'#187'ZQ'#197'pS'#197'qQ'
+ +#197'oL'#195'kB'#192'd7'#188'Z.'#185'S%'#183'J#'#181'K#'#183'J'#26#175'9'#255
+ +#0#255#255#0#255#255#0#255#255#0#255#187#187#187#197#197#197#198#198#198#197
+ +#197#197#195#195#195#192#192#192#187#187#187#184#184#184#181#181#181#180#180
+ +#180#180#180#180#176#176#176#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#6'Lay'
+ +'out'#7#12'blGlyphRight'#9'NumGlyphs'#2#2#7'OnClick'#7#13'btn_NextClick'#8'T'
+ +'abOrder'#2#2#0#0#7'TBitBtn'#8'btn_Back'#4'Left'#3' '#1#6'Height'#2#25#3'Top'
+ +#2#5#5'Width'#2'K'#7'Anchors'#11#5'akTop'#7'akRight'#0#7'Caption'#6#4'Back'#7
+ +'Enabled'#8#10'Glyph.Data'#10':'#6#0#0'6'#6#0#0'BM6'#6#0#0#0#0#0#0'6'#0#0#0
+ +'('#0#0#0' '#0#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0#6#0#0#19#11#0#0#19#11#0#0#0#0
+ +#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#11'|'#21#9'z'#20#8'q'#16#5
+ +'j'#12#4'g'#11#4'g'#12#4'g'#12#4'g'#12#4'g'#12#4'g'#12#4'g'#12#4'W'#9#255#0
+ +#255#255#0#255#255#0#255#255#0#255#157#157#157#156#156#156#153#153#153#150
+ +#150#150#149#149#149#149#149#149#149#149#149#149#149#149#149#149#149#149#149
+ +#149#149#149#149#145#145#145#255#0#255#255#0#255#255#0#255#18#154'('#26#176
+ +':'#21#175'2'#17#171''''#13#168#31#8#166#24#8#165#22#8#165#22#8#166#23#8#166
+ +#23#8#165#23#8#171#24#7#141#18#4'W'#8#255#0#255#255#0#255#168#168#168#177#177
+ +#177#174#174#174#173#173#173#170#170#170#169#169#169#168#168#168#168#168#168
+ +#169#169#169#169#169#169#168#168#168#169#169#169#161#161#161#145#145#145#255
+ +#0#255#255#0#255#27#173'<%'#197'T'#30#192'E'#26#190':'#21#189'1'#16#186''''
+ +#11#184#29#9#184#25#9#184#26#9#184#26#9#183#26#9#190#28#8#171#23#4'g'#12#255
+ ,#0#255#255#0#255#176#176#176#185#185#185#182#182#182#180#180#180#178#178#178
+ +#177#177#177#174#174#174#173#173#173#173#173#173#173#173#173#173#173#173#175
+ +#175#175#169#169#169#149#149#149#255#0#255#255#0#255' '#180'E1'#196'd)'#191
+ +'S"'#187'H'#27#186'='#23#183'3'#18#180')'#13#179' '#10#178#25#9#177#24#9#176
+ +#24#9#183#26#8#166#23#4'h'#12#255#0#255#255#0#255#179#179#179#188#188#188#185
+ +#185#185#181#181#181#179#179#179#177#177#177#175#175#175#173#173#173#173#173
+ +#173#172#172#172#171#171#171#173#173#173#169#169#169#150#150#150#255#0#255
+ +#255#0#255'"'#181'H?'#200'v5'#195'g+'#191'W#'#188'N'#29#186'B'#254#254#254#19
+ +#183'.'#14#180'$'#10#179#28#254#254#254#9#184#26#8#166#23#4'g'#12#255#0#255
+ +#255#0#255#180#180#180#193#193#193#189#189#189#185#185#185#182#182#182#180
+ +#180#180#254#254#254#177#177#177#174#174#174#173#173#173#254#254#254#173#173
+ +#173#169#169#169#149#149#149#255#0#255#255#0#255'!'#181'HX'#208#138'F'#201'z'
+ +'4'#197'i,'#191']'#254#254#254#254#254#254#26#186'='#22#183'3'#254#254#254
+ +#254#254#254#9#183#26#8#166#22#4'g'#12#255#0#255#255#0#255#180#180#180#203
+ +#203#203#195#195#195#189#189#189#185#185#185#254#254#254#254#254#254#179#179
+ +#179#177#177#177#254#254#254#254#254#254#173#173#173#169#169#169#149#149#149
+ +#255#0#255#255#0#255'!'#181'Hw'#216#159'R'#204#129';'#199'r'#254#254#254#254
+ +#254#254'&'#190'T!'#189'J'#254#254#254#254#254#254#19#181'-'#13#186'#'#10#167
+ +#24#4'h'#11#255#0#255#255#0#255#180#180#180#213#213#213#200#200#200#192#192
+ +#192#254#254#254#254#254#254#184#184#184#182#182#182#254#254#254#254#254#254
+ +#176#176#176#175#175#175#169#169#169#150#150#150#255#0#255#255#0#255'!'#181
+ +'H'#138#222#172']'#208#138#254#254#254#254#254#254'/'#195'h,'#193'b'#254#254
+ +#254#254#254#254#30#187'D'#24#185':'#20#187'1'#14#169'"'#6'o'#14#255#0#255
+ +#255#0#255#180#180#180#221#221#221#204#204#204#254#254#254#254#254#254#188
+ +#188#188#186#186#186#254#254#254#254#254#254#180#180#180#178#178#178#177#177
+ +#177#171#171#171#152#152#152#255#0#255#255#0#255'!'#181'H'#149#224#179'e'#210
+ +#143'H'#202'z'#254#254#254#254#254#254'0'#195'i.'#194'e'#254#254#254#254#254
+ +#254#31#187'F'#27#190'>'#20#174'/'#10'z'#20#255#0#255#255#0#255#180#180#180
+ +#224#224#224#206#206#206#197#197#197#254#254#254#254#254#254#188#188#188#187
+ +#187#187#254#254#254#254#254#254#181#181#181#180#180#180#174#174#174#157#157
+ +#157#255#0#255#255#0#255'!'#181'H'#157#227#185'o'#213#151'W'#206#133'N'#204
+ +''#254#254#254#254#254#254'5'#197'm0'#195'h'#254#254#254#254#254#254'#'#192
+ +'N'#27#178'<'#13#133#26#255#0#255#255#0#255#180#180#180#227#227#227#210#210
+ +#210#201#201#201#199#199#199#254#254#254#254#254#254#189#189#189#188#188#188
+ +#254#254#254#254#254#254#183#183#183#177#177#177#161#161#161#255#0#255#255#0
+ +#255'!'#181'H'#169#230#194#128#218#163'^'#208#138'Y'#207#135'M'#204'~'#254
+ +#254#254'C'#200'w9'#197'p2'#195'k'#254#254#254'*'#194'] '#181'H'#16#143#31
+ +#255#0#255#255#0#255#180#180#180#231#231#231#217#217#217#205#205#205#203#203
+ +#203#198#198#198#254#254#254#194#194#194#191#191#191#188#188#188#254#254#254
+ +#186#186#186#179#179#179#164#164#164#255#0#255#255#0#255'!'#181'I'#174#232
+ +#197#166#229#191#145#223#175#134#219#167'x'#215#157'g'#211#145'Y'#207#135'D'
+ +#201'x6'#197'n2'#195'l0'#197'j'''#187'W'#19#156'&'#255#0#255#255#0#255#180
+ +#180#180#233#233#233#230#230#230#223#223#223#218#218#218#213#213#213#208#208
+ +#208#203#203#203#195#195#195#189#189#189#188#188#188#188#188#188#183#183#183
+ +#169#169#169#255#0#255#255#0#255'"'#181'H'#146#224#179#174#232#198#177#233
+ +#200#169#230#194#155#227#184#135#221#170'j'#213#150'O'#205#130';'#199't6'#197
+ +'p4'#200's+'#191'^'#20#164'('#255#0#255#255#0#255#180#180#180#224#224#224#233
+ +#233#233#235#235#235#231#231#231#227#227#227#220#220#220#209#209#209#199#199
+ +#199#192#192#192#189#189#189#190#190#190#185#185#185#171#171#171#255#0#255
+ +#255#0#255#255#0#255'8'#187'ZQ'#197'pS'#197'qQ'#197'oL'#195'kB'#192'd7'#188
+ +'Z.'#185'S%'#183'J#'#181'K#'#183'J'#26#175'9'#255#0#255#255#0#255#255#0#255
+ +#255#0#255#188#188#188#197#197#197#198#198#198#197#197#197#195#195#195#192
+ +#192#192#188#188#188#184#184#184#181#181#181#180#180#180#181#181#181#176#176
+ +#176#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#9'NumGlyphs'#2#2#7'OnClick'#7#13
+ +'btn_BackClick'#8'TabOrder'#2#3#0#0#0#0
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm_laz.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm_laz.pas
new file mode 100644
index 0000000..6b792f1
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableMasterLinkWizardForm_laz.pas
@@ -0,0 +1,572 @@
+unit uDADataTableMasterLinkWizardForm_laz;
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+interface
+
+uses
+ LCLIntf,LResources,PropEdits,
+ SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, ComCtrls, Buttons, uDADataTable, ExtCtrls;
+
+type
+
+ { TDADataTableMasterLinkWizard }
+
+ TDADataTableMasterLinkWizard = class(TForm)
+ Bevel1: TBevel;
+ Panel1: TPanel;
+ Image1: TImage;
+ Label1: TLabel;
+ Label2: TLabel;
+ pc_Pages: TPageControl;
+ ts_Welcome: TTabSheet;
+ Label3: TLabel;
+ Label4: TLabel;
+ Label24: TLabel;
+ Label25: TLabel;
+ Label26: TLabel;
+ Label27: TLabel;
+ Label28: TLabel;
+ Label29: TLabel;
+ ts_MasterSource: TTabSheet;
+ Label8: TLabel;
+ Label9: TLabel;
+ Label10: TLabel;
+ Label17: TLabel;
+ lbl_Params1: TLabel;
+ lbl_Params2: TLabel;
+ lbl_Method1: TLabel;
+ lbl_Method2: TLabel;
+ lbl_Params3: TLabel;
+ lbl_Where1: TLabel;
+ lbl_Where2: TLabel;
+ cb_DataSources: TComboBox;
+ rb_Where: TRadioButton;
+ rb_Params: TRadioButton;
+ rb_Method: TRadioButton;
+ ts_Fields: TTabSheet;
+ labMasterFields: TLabel;
+ labDetailFields: TLabel;
+ Label13: TLabel;
+ Label14: TLabel;
+ Label18: TLabel;
+ Label19: TLabel;
+ lbMaster: TListBox;
+ lbDetail: TListBox;
+ eMasterFields: TEdit;
+ eDetailFields: TEdit;
+ bbAddFieldMapping: TBitBtn;
+ BitBtn4: TBitBtn;
+ ts_MethodCall: TTabSheet;
+ labMasterFields2: TLabel;
+ labDataReqParams: TLabel;
+ Label7: TLabel;
+ Label20: TLabel;
+ Label21: TLabel;
+ lbMaster2: TListBox;
+ lbDataReqParams: TListBox;
+ mMappings: TMemo;
+ bbAddDataReqMapping: TBitBtn;
+ bbClearDataReqMapping: TBitBtn;
+ ts_Params: TTabSheet;
+ Label11: TLabel;
+ Label12: TLabel;
+ Label15: TLabel;
+ Label22: TLabel;
+ Label23: TLabel;
+ lbMaster3: TListBox;
+ lbParams: TListBox;
+ mParamsMappings: TMemo;
+ bbAddParamMappingXXX: TBitBtn;
+ bbClearParamMappingsXXX: TBitBtn;
+ ts_Finish: TTabSheet;
+ Label5: TLabel;
+ Label6: TLabel;
+ Panel2: TPanel;
+ btn_Finish: TBitBtn;
+ btn_Cancel: TBitBtn;
+ btn_Next: TBitBtn;
+ btn_Back: TBitBtn;
+ Label16: TLabel;
+ procedure bbAddFieldMappingClick(Sender: TObject);
+ procedure bbAddDataReqMappingClick(Sender: TObject);
+ procedure bbClearDataReqMappingClick(Sender: TObject);
+ procedure BitBtn4Click(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure bbAddParamMappingXXXClick(Sender: TObject);
+ procedure bbClearParamMappingsXXXClick(Sender: TObject);
+ procedure cb_DataSourcesChange(Sender: TObject);
+ procedure btn_FinishClick(Sender: TObject);
+ procedure OnFieldMappingChange(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure btn_BackClick(Sender: TObject);
+ procedure btn_NextClick(Sender: TObject);
+ private
+ fDataTable: TDADataTable;
+ fMasterSource: TDADataSource;
+ fDesigner: TPropertyEditorHook;
+ fInEnterPage: boolean;
+ fActiveControl: TWinControl;
+ fValues: TStrings;
+ fNextPage: integer;
+ fPreviousPage: integer;
+ procedure GetDataTables(const aName: ansistring);
+ function GetActiveControl: TWinControl;
+ procedure SetActiveControl(const Value: TWinControl);
+ function GetNextPage: integer;
+ function GetPreviousPage: integer;
+ procedure Initialize;
+ protected
+ function CleanPascalString(const aString: string): string;
+ procedure AfterEnterPage(aPage:TTabSheet; aMovingForward:boolean);
+ procedure OnLeavePage(aPage:TTabSheet; aMovingForward:boolean);
+ procedure OnEnterPage(aPage:TTabSheet; aMovingForward:boolean);
+ public
+ constructor Create(aOwner : TComponent); reintroduce;
+ property Values:TStrings read fValues;
+ function Execute:boolean; overload;
+ class function Execute(aOwner: TComponent): boolean; overload;
+ property ActiveControl: TWinControl read GetActiveControl write SetActiveControl;
+ property NextPage: integer read GetNextPage write fNextPage;
+ property PreviousPage: integer read GetPreviousPage write fPreviousPage;
+ class function ExecuteWizard(aDataTable: TDADataTable; aDesigner: TPropertyEditorHook): boolean;
+ end;
+
+var
+ DADataTableMasterLinkWizard: TDADataTableMasterLinkWizard;
+
+
+implementation
+
+uses uROClasses, TypInfo, uDARemoteDataAdapter, uRODynamicRequest, uRODL;
+
+procedure TrimNamesAndValues(aSL: TStrings);
+var
+ i: Integer;
+begin
+ for i := 0 to aSL.Count - 1 do begin
+ aSL[i] := Trim(aSL.Names[i]) + aSL.NameValueSeparator + Trim(aSL.Values[aSL.Names[i]]);
+
+ end;
+end;
+
+{ TDataTableMasterLink }
+
+class function TDADataTableMasterLinkWizard.ExecuteWizard(aDataTable: TDADataTable; aDesigner: TPropertyEditorHook): boolean;
+begin
+ with TDADataTableMasterLinkWizard.Create(NIL) do try
+ fDataTable := aDataTable;
+ fDesigner := aDesigner;
+ Initialize();
+ result := Execute();
+ finally
+ Free;
+ end;
+end;
+
+constructor TDADataTableMasterLinkWizard.Create(aOwner: TComponent);
+begin
+ inherited;
+
+end;
+
+procedure TDADataTableMasterLinkWizard.Initialize;
+var
+ i : integer;
+begin
+ cb_DataSources.Items.Clear();
+ fDesigner.GetComponentNames(GetTypeData(TypeInfo(TDADataSource)), Self.GetDataTables);
+ if assigned(fDataTable.MasterSource) then begin
+ cb_DataSources.ItemIndex := cb_DataSources.Items.IndexOf(fDataTable.MasterSource.Name);
+ //lMasterTable := fDataTable.MasterSource.DataTable;
+ //Check(mast=NIL, 'MasterSource doesn''t point to a datatable');
+ end;
+ cb_DataSourcesChange(nil);
+
+ Caption := Format(Caption, [fDataTable.Name]);
+
+ eMasterFields.Text := fDataTable.MasterFields;
+ eDetailFields.Text := fDataTable.DetailFields;
+ mMappings.Lines.Text := fDataTable.MasterRequestMappings.Text;
+ mParamsMappings.Lines.Text := fDataTable.MasterParamsMappings.Text;
+
+ for i := 0 to (fDataTable.FieldCount-1) do
+ lbDetail.Items.Add(fDataTable.Fields[i].Name);
+
+ for i := 0 to (fDataTable.Params.Count-1) do
+ lbParams.Items.Add(fDataTable.Params[i].Name);
+
+ case fDataTable.MasterMappingMode of
+ mmParams: rb_Params.Checked := true;
+ mmDataRequest: rb_Method.Checked := true;
+ mmWhere: rb_Where.Checked := true;
+ end;
+end;
+
+procedure TDADataTableMasterLinkWizard.GetDataTables(const aName: ansistring);
+var
+ lDataSource: TDADataSource;
+begin
+ lDataSource := fDesigner.GetComponent(aName) as TDADataSource;
+ if assigned(lDataSource.DataTable) and (lDataSource.DataTable <> fDataTable) then
+ cb_DataSources.Items.Add(aName);
+end;
+
+function TDADataTableMasterLinkWizard.CleanPascalString(const aString: string
+ ): string;
+begin
+ result := aString;
+ result := StringReplace(result,'''','''''',[rfReplaceAll]); { replace quotes with double quotes }
+ result := StringReplace(result,#13#10,'''#13#10''',[rfReplaceAll]);
+ result := ''''+result+'''';
+end;
+
+procedure TDADataTableMasterLinkWizard.cb_DataSourcesChange(Sender: TObject);
+var
+ lMasterTable: TDADataTable;
+ lCall: TRODynamicRequest;
+ i: integer;
+begin
+ fMasterSource := fDesigner.GetComponent(cb_DataSources.Text) as TDADataSource;
+ if assigned(fMasterSource) and assigned(fMasterSource.DataTable) then begin
+ lMasterTable := fMasterSource.DataTable;
+
+ rb_Params.Enabled := fDataTable.Params.Count > 0;
+ lbl_Params1.Enabled := rb_Params.Enabled;
+ lbl_Params2.Enabled := rb_Params.Enabled;
+
+ rb_Method.Enabled := assigned(lMasterTable.RemoteDataAdapter) and
+ assigned(fDataTable.RemoteDataAdapter) and
+ (lMasterTable.RemoteDataAdapter <> fDataTable.RemoteDataAdapter);
+ lbl_Method1.Enabled := rb_Method.Enabled;
+
+ if (not rb_Params.Enabled and rb_Params.Checked) or (not rb_Method.Enabled and rb_Method.Checked) then
+ rb_Where.Checked := true;
+
+ lbMaster.Items.Clear();
+ lbMaster2.Items.Clear();
+ lbMaster3.Items.Clear();
+ for i := 0 to (lMasterTable.FieldCount-1) do begin
+ lbMaster.Items.Add(lMasterTable.Fields[i].Name);
+ lbMaster2.Items.Add(lMasterTable.Fields[i].Name);
+ lbMaster3.Items.Add(lMasterTable.Fields[i].Name);
+ end;
+
+ if assigned(fDataTable.RemoteDataAdapter) then begin
+ lCall := (fDataTable.RemoteDataAdapter as TDARemoteDataAdapter).GetDataCall;
+ lbDataReqParams.Items.Clear();
+ for i := 0 to lCall.Params.Count-1 do
+ if lCall.Params[i].Flag in [fIn, fInOut] then
+ lbDataReqParams.Items.Add(lCall.Params[i].Name);
+ end
+ else begin
+ lbDataReqParams.Enabled := false;
+ end;
+
+ if pc_Pages.ActivePage = ts_MasterSource then
+ btn_Next.Enabled := (rb_Where.Enabled and rb_Where.Checked) or (rb_Params.Enabled and rb_Params.Checked) or (rb_Method.Enabled and rb_Method.Checked);
+ end
+ else begin
+ if pc_Pages.ActivePage = ts_MasterSource then
+ btn_Next.Enabled := false;
+ end;
+end;
+
+
+procedure TDADataTableMasterLinkWizard.bbAddFieldMappingClick(Sender: TObject);
+var x : integer;
+begin
+ if (lbMaster.SelCount=0) or (lbMaster.SelCount<>lbDetail.SelCount) then begin
+ Beep;
+ Exit;
+ end;
+
+ for x := 0 to (lbMaster.Items.Count-1) do
+ if lbMaster.Selected[x] then begin
+ if (eMasterFields.Text<>'')
+ then eMasterFields.Text := eMasterFields.Text+';';
+ eMasterFields.Text := eMasterFields.Text+lbMaster.Items[x];
+ end;
+
+ for x := 0 to (lbDetail.Items.Count-1) do
+ if lbDetail.Selected[x] then begin
+ if (eDetailFields.Text<>'')
+ then eDetailFields.Text := eDetailFields.Text+';';
+ eDetailFields.Text := eDetailFields.Text+lbDetail.Items[x];
+ end;
+ OnFieldMappingChange(nil);
+end;
+
+procedure TDADataTableMasterLinkWizard.bbAddDataReqMappingClick(Sender: TObject);
+var x, i : integer;
+ s : TStringList;
+begin
+ if (lbMaster2.SelCount=0) or (lbDataReqParams.SelCount<>lbMaster2.SelCount) then begin
+ Beep;
+ Exit;
+ end;
+
+ s := TStringList.Create;
+ try
+ for x := 0 to (lbDataReqParams.Items.Count-1) do
+ if lbDataReqParams.Selected[x] then s.Add(lbDataReqParams.Items[x]+'=');
+
+ i := 0;
+ for x := 0 to (lbMaster2.Items.Count-1) do
+ if lbMaster2.Selected[x] then begin
+ s[i] := s[i]+lbMaster2.Items[x];
+ Inc(i);
+ end;
+
+ mMappings.Lines.AddStrings(s);
+ finally
+ s.Free;
+ end;
+end;
+
+procedure TDADataTableMasterLinkWizard.bbClearDataReqMappingClick(Sender: TObject);
+begin
+ mMappings.Lines.Clear
+end;
+
+procedure TDADataTableMasterLinkWizard.BitBtn4Click(Sender: TObject);
+begin
+ eMasterFields.Text := '';
+ eDetailFields.Text := '';
+ OnFieldMappingChange(nil);
+end;
+
+
+procedure TDADataTableMasterLinkWizard.OnFieldMappingChange(
+ Sender: TObject);
+begin
+ if pc_Pages.ActivePage = ts_Fields then
+ btn_Next.Enabled := (eMasterFields.Text <> '') and (eDetailFields.Text <> '');
+end;
+
+procedure TDADataTableMasterLinkWizard.FormDestroy(Sender: TObject);
+begin
+ FreeAndNil(fValues);
+end;
+
+procedure TDADataTableMasterLinkWizard.btn_BackClick(Sender: TObject);
+begin
+ if pc_Pages.ActivePageIndex > 0 then begin
+ fInEnterPage := true;
+ try
+ OnLeavePage(pc_Pages.Pages[pc_Pages.ActivePageIndex],false);
+ OnEnterPage(pc_Pages.Pages[PreviousPage],false);
+ finally
+ fInEnterPage := false;
+ end;
+ pc_Pages.ActivePageIndex := PreviousPage;
+ if Assigned(fActiveControl) then begin
+ inherited ActiveControl := fActiveControl;
+ fActiveControl := nil;
+ end;
+ end;
+ fNextPage := -1;
+ fPreviousPage := -1;
+ AfterEnterPage(pc_Pages.ActivePage, false);
+end;
+
+procedure TDADataTableMasterLinkWizard.btn_NextClick(Sender: TObject);
+begin
+ if pc_Pages.ActivePageIndex+1 < pc_Pages.PageCount then begin
+ fInEnterPage := true;
+ try
+ OnLeavePage(pc_Pages.Pages[pc_Pages.ActivePageIndex],true);
+ OnEnterPage(pc_Pages.Pages[NextPage],true);
+ finally
+ fInEnterPage := false;
+ end;
+ fPreviousPage := pc_Pages.ActivePageIndex;
+ pc_Pages.ActivePageIndex := NextPage;
+ if Assigned(fActiveControl) then begin
+ inherited ActiveControl := fActiveControl;
+ fActiveControl := nil;
+ end;
+ end;
+ fNextPage := -1;
+ AfterEnterPage(pc_Pages.ActivePage, true);
+end;
+
+function TDADataTableMasterLinkWizard.GetActiveControl: TWinControl;
+begin
+ if Assigned(fActiveControl) then
+ result := fActiveControl
+ else
+ result := inherited ActiveControl;
+end;
+
+procedure TDADataTableMasterLinkWizard.SetActiveControl(const Value: TWinControl
+ );
+begin
+ if fInEnterPage then begin
+ fActiveControl := Value;
+ end
+ else begin
+ inherited ActiveControl := Value;
+ fActiveControl := nil;
+ end;
+end;
+
+function TDADataTableMasterLinkWizard.GetNextPage: integer;
+begin
+ Result := fNextPage;
+ if result = -1 then result := pc_Pages.ActivePageIndex+1;
+end;
+
+function TDADataTableMasterLinkWizard.GetPreviousPage: integer;
+begin
+ Result := fPreviousPage;
+ if result = -1 then result := pc_Pages.ActivePageIndex-1;
+end;
+
+procedure TDADataTableMasterLinkWizard.FormCreate(Sender: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to ComponentCount-1 do begin
+ if Components[i] is TTabSheet then TTabSheet(Components[i]).TabVisible := false;
+ end;
+
+ fValues := TStringList.Create();
+
+ Height := Height-16;
+ pc_Pages.ActivePageIndex := 0;
+ OnEnterPage(pc_Pages.Pages[0],true);
+
+ fNextPage := -1;
+ fPreviousPage := -1;
+end;
+
+procedure TDADataTableMasterLinkWizard.bbAddParamMappingXXXClick(Sender: TObject);
+var x, i : integer;
+ s : TStringList;
+begin
+ if (lbMaster3.SelCount=0) or (lbParams.SelCount<>lbMaster3.SelCount) then begin
+ Beep;
+ Exit;
+ end;
+
+ s := TStringList.Create;
+ try
+ for x := 0 to (lbParams.Items.Count-1) do
+ if lbParams.Selected[x] then s.Add(lbParams.Items[x]+'=');
+
+ i := 0;
+ for x := 0 to (lbMaster3.Items.Count-1) do
+ if lbMaster3.Selected[x] then begin
+ s[i] := s[i]+lbMaster3.Items[x];
+ Inc(i);
+ end;
+
+ mParamsMappings.Lines.AddStrings(s);
+ finally
+ s.Free;
+ end;
+end;
+
+procedure TDADataTableMasterLinkWizard.bbClearParamMappingsXXXClick(Sender: TObject);
+begin
+ mParamsMappings.Lines.Clear
+end;
+
+procedure TDADataTableMasterLinkWizard.btn_FinishClick(Sender: TObject);
+begin
+ fDataTable.MasterSource := fMasterSource;
+ fDataTable.MasterFields := eMasterFields.Text;
+ fDataTable.DetailFields := eDetailFields.Text;
+
+ TrimNamesAndValues(mMappings.Lines);
+ TrimNamesAndValues(mParamsMappings.Lines);
+
+ fDataTable.MasterRequestMappings.Text := mMappings.Lines.Text;
+ fDataTable.MasterParamsMappings.Text := mParamsMappings.Lines.Text;
+
+ if rb_Where.Checked then
+ fDataTable.MasterMappingMode := mmWhere
+ else if rb_Params.Checked then
+ fDataTable.MasterMappingMode := mmParams
+ else if rb_Method.Checked then
+ fDataTable.MasterMappingMode := mmDataRequest;
+
+end;
+
+procedure TDADataTableMasterLinkWizard.AfterEnterPage(aPage: TTabSheet;
+ aMovingForward: boolean);
+begin
+ if (aPage = ts_MasterSource) and aMovingForward then begin
+ cb_DataSourcesChange(nil);
+ end
+ else if (aPage = ts_Fields) and aMovingForward then begin
+ OnFieldMappingChange(nil);
+ end;
+end;
+
+procedure TDADataTableMasterLinkWizard.OnLeavePage(aPage: TTabSheet;
+ aMovingForward: boolean);
+begin
+ if (aPage = ts_Fields) and aMovingForward then begin
+ if rb_Where.Checked then NextPage := ts_Finish.PageIndex
+ else if rb_Params.Checked then NextPage := ts_Params.PageIndex
+ else if rb_Method.Checked then NextPage := ts_MethodCall.PageIndex;
+ end
+ else if (aPage = ts_Params) or (aPage = ts_MethodCall) then begin
+ NextPage := ts_Finish.PageIndex;
+ PreviousPage := ts_Fields.PageIndex;
+ end;
+end;
+
+procedure TDADataTableMasterLinkWizard.OnEnterPage(aPage: TTabSheet;
+ aMovingForward: boolean);
+begin
+ {$IFDEF FPC}
+ if aMovingForward then btn_Finish.Visible := false else // for prevent warnings
+ {$ENDIF}
+ btn_Finish.Visible := false;
+ btn_Next.Visible := true;
+ if aPage = ts_Welcome then begin
+ btn_Back.Enabled := false;
+ btn_Next.Enabled := true;
+ ActiveControl := btn_Next;
+ end
+ else if aPage = ts_Finish then begin
+ try
+ btn_Finish.Visible := true;
+ btn_Finish.Enabled := true;
+ btn_Next.Visible := false;
+ ActiveControl := btn_Finish;
+ finally
+ end;
+ end
+ else { default for custom added pages } begin
+ btn_Back.Enabled := true;
+ btn_Next.Enabled := true;
+ end;
+end;
+
+function TDADataTableMasterLinkWizard.Execute: boolean;
+begin
+ result := (ShowModal() = 1); // idOk=1
+end;
+
+class function TDADataTableMasterLinkWizard.Execute(aOwner: TComponent
+ ): boolean;
+begin
+ with self.Create(aOwner) do try
+ result := Execute();
+ finally
+ Free();
+ end;
+end;
+
+initialization
+ {$I uDADataTableMasterLinkWizardForm_laz.lrs}
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableWizards.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableWizards.pas
new file mode 100644
index 0000000..a8b9b43
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDADataTableWizards.pas
@@ -0,0 +1,239 @@
+unit uDADataTableWizards;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - IDE Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS}Windows, {$ENDIF}
+ Classes, Types, Controls,{$IFDEF FPC}ComponentEditors,PropEdits,{$ELSE}ToolsAPI, DesignIntf,{$ENDIF}
+ uDAClasses, uDADataTable;
+
+type
+ {$IFDEF FPC}
+ IDesigner = TComponentEditorDesigner;
+ {$ENDIF}
+
+ TDataTableWizards = class
+ private
+ class procedure GetDataTables(const aName: string);
+ public
+ class function CreateDataTables(aDesigner: IDesigner; aAdapter: TDACustomDataAdapter; aSchema: TDASchema; aCoordinates: TPoint): boolean; overload;
+ {$IFNDEF FPC}
+ class function CreateDataTables(aForm: IOTAFormEditor; aAdapter: TDACustomDataAdapter; aSchema: TDASchema; aCoordinates: TPoint): boolean; overload;
+ {$ENDIF}
+ end;
+
+implementation
+
+uses
+ Forms, SysUtils, Dialogs, Registry, TypInfo,
+ uROClasses,
+ uDAInterfaces, uDAPleaseWaitForm, uDASelectDataTablesForm, uDAMemDataTable {, uDARemoteDataAdapter};
+
+
+function ComponentExists(aDesigner: IDesigner; aName: string): boolean;
+var
+ i: integer;
+begin
+ for i := 0 to aDesigner.{$IFDEF FPC}Form{$ELSE}Root{$ENDIF}.ComponentCount-1 do
+ if aDesigner.{$IFDEF FPC}Form{$ELSE}Root{$ENDIF}.Components[i].Name = aName then begin
+ result := true;
+ exit;
+ end;
+ result := false;
+end;
+
+procedure CreateDataTable(aDesigner: IDesigner; aClass:TDADataTableClass; aAdapter: TDACustomDataAdapter; aSchema: TDASchema;
+ const aDataTableName: String; X,Y: integer; aCreateDataSource: boolean=true); overload;
+var
+ lDataTable:TDADataTable;
+ lDataSource:TDADataSource;
+ lBaseName:string;
+ lDataTablePrefix,lDataSourcePrefix:string;
+ lDataset: TDADataSet;
+ lField: TDAField;
+ {$IFDEF FPC}
+ lRec: LongRec;
+ {$ENDIF}
+begin
+ with TRegistry.Create do try
+ RootKey := HKEY_CURRENT_USER;
+ OpenKey('Software\RemObjects\Data Abstract\IDE\ComponentPrefixes',false);
+ lDataTablePrefix := ReadString('TDADataTable');
+ lDataSourcePrefix := ReadString('TDADataSource');
+ finally
+ Free();
+ end;
+ if lDataTablePrefix = '' then lDataTablePrefix := 'tbl_';
+ if lDataSourcePrefix = '' then lDataSourcePrefix := 'ds_';
+
+ {$IFDEF FPC}
+ lDataTable := aClass.Create(aDesigner.Form);
+ lRec := LongRec(lDataTable.DesignInfo);
+ lRec.Lo := X;
+ lRec.Hi := Y;
+ {$ELSE}
+ lDataTable := aDesigner.CreateComponent(aClass, nil, X, Y, 24, 24) as TDADataTable;
+ {$ENDIF}
+ lDataset := aSchema.FindDataset(aDataTableName);
+ if Assigned(lDataset) then begin
+ lDataTable.LogicalName := lDataset.Name;
+ lDataTable.CustomAttributes.Assign(lDataset.CustomAttributes);
+ lDataTable.Fields.AssignFieldCollection(lDataset.Fields);
+ lDataTable.Params.AssignParamCollection(lDataset.Params);
+ lBaseName := lDataset.Name;
+ // ToDo: the code below is shared with RDA.FillSchema. Refactor.
+ if lDataset is TDAUnionDataTable then begin
+ if not Assigned(lDataset.Fields.FindField(def_SourceTableFieldName) as TDAField) then begin
+ lField := lDataTable.Fields.Add();
+ lField.Name := def_SourceTableFieldName;
+ lField.DataType := datInteger;
+ lField.InPrimaryKey := True;
+ lField.ServerAutoRefresh := True;
+ end;
+ end;
+ end;
+
+ lDataTable.RemoteDataAdapter := aAdapter;
+
+ RemoveExcept(lBaseName,['a'..'z','A'..'Z','0'..'9','_']);
+ if ComponentExists(aDesigner, lDataTablePrefix+lBaseName) then
+ lDataTable.Name := aDesigner.UniqueName(lDataTablePrefix+lBaseName)
+ else
+ lDataTable.Name := lDataTablePrefix+lBaseName;
+
+
+ if aCreateDataSource then begin
+ {$IFDEF FPC}
+ lDataSource := TDADataSource.Create(aDesigner.Form);
+ lRec := LongRec(lDataSource.DesignInfo);
+ lRec.Lo := X;
+ lRec.Hi := Y + 44;
+ {$ELSE}
+ lDataSource := aDesigner.CreateComponent(TDADataSource, nil , X, Y+44, 24, 24) as TDADataSource;
+ {$ENDIF}
+ lDataSource.DataTable := lDataTable;
+ if ComponentExists(aDesigner, lDataSourcePrefix+lBaseName) then
+ lDataSource.Name := aDesigner.UniqueName(lDataSourcePrefix+lBaseName)
+ else
+ lDataSource.Name := lDataSourcePrefix+lBaseName;
+ end;
+
+end;
+
+{$IFNDEF FPC}
+class function TDataTableWizards.CreateDataTables(aForm: IOTAFormEditor; aAdapter: TDACustomDataAdapter; aSchema: TDASchema; aCoordinates: TPoint): boolean;
+begin
+ result := CreateDataTables((aForm as INTAFormEditor).FormDesigner, aAdapter, aSchema, aCoordinates);
+end;
+{$ENDIF}
+
+var
+ gDataTables: TStringList;
+ gDesigner: IDesigner;
+
+class procedure TDataTableWizards.GetDataTables(const aName: string);
+var
+ lComponent: TComponent;
+begin
+ {$IFDEF FPC}
+ lComponent := gDesigner.PropertyEditorHook.GetComponent(aName);
+ {$ELSE}
+ lComponent := gDesigner.GetComponent(aName);
+ {$ENDIF}
+ if assigned(lComponent) then
+ gDataTables.Add((lComponent as TDADataTable).LogicalName);
+end;
+
+class function TDataTableWizards.CreateDataTables(aDesigner: IDesigner; aAdapter: TDACustomDataAdapter; aSchema: TDASchema; aCoordinates: TPoint): boolean;
+var
+ lForm: TDASelectDataTablesForm;
+ lDataTables: TStringList;
+ i: integer;
+ Y: integer;
+ {$IFDEF FPC}
+ ldesigner: TPropertyEditorHook;
+ {$ELSE}
+ ldesigner: IDesigner;
+ {$ENDIF}
+begin
+ {$IFDEF FPC}
+ ldesigner:= aDesigner.PropertyEditorHook;
+ {$ELSE}
+ ldesigner := aDesigner;
+ {$ENDIF}
+ lDataTables := TStringList.Create;
+ try
+ lDataTables.Sorted := true;
+ for i := 0 to aSchema.Datasets.Count-1 do
+ if aSchema.Datasets[i].IsPublic then
+ lDataTables.AddObject(aSchema.Datasets[i].Name, aSchema.Datasets[i]);
+
+ for i := 0 to aSchema.UnionDataTables.Count-1 do
+ if aSchema.UnionDataTables[i].IsPublic then
+ lDataTables.AddObject(aSchema.UnionDataTables[i].Name, aSchema.UnionDataTables[i]);
+
+ for i := 0 to aSchema.JoinDataTables.Count-1 do
+ if aSchema.JoinDataTables[i].IsPublic then
+ lDataTables.AddObject(aSchema.JoinDataTables[i].Name, aSchema.JoinDataTables[i]);
+
+ if lDataTables.Count > 0 then begin
+
+ gDesigner := aDesigner;
+ gDataTables := TStringList.Create();
+ try
+ lDesigner.GetComponentNames(GetTypeData(TypeInfo(TDADataTable)), GetDataTables);
+ lForm := TDASelectDataTablesForm.Create(nil);
+ try
+ for i := 0 to lDataTables.Count-1 do begin
+ lForm.lb_DataTables.Items.AddObject(lDataTables[i], lDataTables.Objects[i]);
+ lForm.lb_DataTables.Checked[lForm.lb_DataTables.Items.Count-1] := gDataTables.IndexOf(lDataTables[i]) = -1;
+ end;
+ lForm.UpdateCheckBoxState();
+ lForm.OkButtonCaption := '&Create';
+ result := (lForm.ShowModal() = mrOk);
+ if result then begin
+ Y := aCoordinates.Y;
+ for i := 0 to lForm.lb_DataTables.Items.Count - 1 do
+ if lForm.lb_DataTables.Checked[i] then begin
+ CreateDataTable(aDesigner, TDAMemDataTable, aAdapter, aSchema, lForm.lb_DataTables.Items[i], aCoordinates.X, Y, true);
+ inc(y, 88); // doesn't seem to work :(
+ end;
+ end;
+ finally
+ FreeAndNil(lForm);
+ end;
+
+ finally
+ FreeAndNil(gDataTables);
+ gDesigner := nil;
+ end;
+
+ end
+ else begin
+ ShowMessage('No data tables were found in schema.');
+ result := false;
+ end;
+ finally
+ FreeAndNil(lDataTables);
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAGuideWizardForm.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAGuideWizardForm.dfm
new file mode 100644
index 0000000..e50c37a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAGuideWizardForm.dfm
@@ -0,0 +1,1799 @@
+inherited DAGuideWizardForm: TDAGuideWizardForm
+ Left = 309
+ Top = 307
+ Caption = 'New Data Abstract Server Project Wizard'
+ ClientHeight = 293
+ ClientWidth = 569
+ Icon.Data = {
+ 0000010006003030000001000800A80E0000660000002020000001000800A808
+ 00000E0F0000101000000100080068050000B61700003030000001002000A825
+ 00001E1D00002020000001002000A8100000C642000010100000010020006804
+ 00006E5300002800000030000000600000000100080000000000000900000000
+ 00000000000000010000000100000000000005050500090909000D0D0D000B12
+ 0B000E150E000A1D0A000C190C00121212001515150011181100101D10001919
+ 19001D1D1D000A230A000F2A0F00053F0500093709000C3C0C0014391400163D
+ 1600193019001A391A00212121002525250020282000292929002D2D2D002434
+ 2400293229003131310035353500333D3300393939003D3D3D0007420700044B
+ 04000B420B000C450C000E480E00025902000C590C0016461600104C10001353
+ 130014551400155815001D511D00185F180000660000006A0000006E0000076F
+ 07000B620B00096709000E600E000E6D0E00007200000075000000780000007D
+ 00000E7F0E00136C1300196119001B651B00204C20002C5C2E00364036003956
+ 3B002571270028742C002B7730002D7A3300307C3700327F3B003C6240004040
+ 400045454500494949004D4D4D0049534A005151510056565600595959005D5D
+ 5D004167460047644C0043694800456B4B00417A4900447D4E004F6252005D79
+ 65006161610065656500616B6400686868006E6E6E00637F6C00717171007474
+ 7400787878007D7D7D000081000000850000008A0000008D00000A810A000A85
+ 0A00009100000095000000990000049D05001284130007A00B000BA411000FA8
+ 170013AC1C001F91260022942A002D83350035823E002D973A0016AF22001AB3
+ 28001EB72E002FA13E0022BB340026BE39002AC23F00388442003B8745003D89
+ 49003C9B4C003C9C4D0032A442003BAE50003AB650003EB95500408C4D00438F
+ 51004197510045925400479C580045A459005C826700629B750058A46D005DA9
+ 740060AC78002DC6440031CA4A0035CD500039D156003DD55B0040D9610044DD
+ 670052C470004CDB710058DD7F0048E06D004CE4730050E8780053EC7E005FDA
+ 860057EF84005BEA87005FED8C005BF38A005FF78F0086868600959595009F9F
+ 9F00A2A2A200AAAAAA00ACACAC00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0066511F090909090D4E60000000000000000000000000000000000000000000
+ 00000000000000000000000000004E0D0D0D0D0D090909090309030303186400
+ 000000000000000000000000000000000000000000000000000000001F181818
+ 0D0D0D090D09090909030303030303004E000000000000000000000000000000
+ 000000000000000000001F1A1818180D180D0D0D0D0909090909090303030303
+ 00035D000000000000000000000000000000000000000000641A1A1A1A181818
+ 180D151327272727110F05090303030303000309000000000000000000000000
+ 000000000000004E1F1A1F1A1A1A182A353B3B3B3A3A3A333333332811070303
+ 030300000064000000000000000000000000000000004E1A1F1F1A1F1A1A1C2D
+ 2D353B3B3B3A3A3A3A333333313124070303030300005D000000000000000000
+ 00000000004E1F1F1F1F1F1A1F1A1A1A181A182A3A3B3A3A3333333333313331
+ 100404000303005D0000000000000000000000004E1F1F211F1F1A1F1A1F1A1A
+ 1A1A1818163B3B3A3A3A33333333313131280703030003006400000000000000
+ 0000005D212121211F1F1F1F1A1F1A1A1A1A1A18183B3B3B3A3A3A3331120F0B
+ 080507030303000300000000000000000000AB4E214E2121211F1F1F1F1A1F1F
+ 1A1A1A181A673B3B3B3A3A270C09090909030303030303000309000000000000
+ 00004E214E21212121211F1F1F1F1A1F1A1E1A1A1867673B3B3B3A0D0D0C0C09
+ 0909090303030303000051000000000000644E4E214E214E2121211F1F1F1F1A
+ 1F1A1A1A1A1A181A16132D0D0D0C0C0909090903030303030303000000000000
+ 004E4E4E4E44462121212121211F1F1F1F1E1F1A1A1A1A1818180D0D0D0D0D0C
+ 09090909090310030003034E00000000664E4E214E76474E214E2121211F1F1F
+ 1F1A1E1E1A1A1A1A181818170D0D0D0D090B0C080908310E0303000300000000
+ 4E4E4E4E4B7C474E21214E2121211F1F1F1F1A1F1A1E1A1A1A181817180D0D0D
+ 0D0C09090908312403030303640000004E514E4E7A7D474E4E2121212121211F
+ 1F1F1F1E1E1A1A1A1A18181817180D0D0D0C0C09090933310703030309000066
+ 514E5150807F4A4E214E4E214E2121211F1F1F1E1E1F1E1A1A1A1A181817180D
+ 0D0D0D0C0909333123030303030000515151515981804A4E4E214E21214E2121
+ 211F1F1F1E1A1E1E1A1A1A1A181817180D0D0D0D0C0C33332809030303000051
+ 515151859681824E4E4E4E4E2121212121211F1F1F1F1E1E1E1A1A1A1A181817
+ 180D0D0D0C0C33333109050303530053535151889796834E4E4E214E4E214E21
+ 212121211F1F1E1E1E1E1A1A1A1A181817180D0D0D0C3333330F0909034E0053
+ 5351519A9797844E4E4E4E4E214E214E212121211F1F1F1E1E1E1E1A1A1A1A18
+ 1817180D0D0D3A3A33120909030900535353519B99988B4E4E4E4E4E4E4E214E
+ 214E2121211F1F1F1E1E1E1E1A1A1A1A181817180D0D3A3A3327090909030053
+ 5353539B9A998C514E4E4E4E4E214E214E21212121211F1F1F1E1E1E1E1A1A1A
+ 1A181817180D3A3A3A270909090900535353539B9B9A8C51514E4E4E4E4E4E4E
+ 214E214E2121211F1F1F1E1E1E1E1A1A1A1A181817293B3A3A2709090909005D
+ 535353A19B9B905151514E4E4E4E4E4E4E214E21212121211F1F1F1E1E2D382E
+ 2E2D3533673B3B3B3A270C0D0909005D5D5D539EA19C9B8F5B51514E4E4E4E4E
+ 214E214E214E2121211F1F1F1E306A6A676A676767673B3B3B130D0C0D1F005D
+ 5D535D9DA1A09B9B9A8A8D8C58574B4E4E4E4E214E21212121211F1F1F306A6A
+ 6A6767676767673B3B150D0D0951005D5D5D5394A1A1A19B9B9A99989796964E
+ 4E4E4E4E214E214E2121211F1F306D6A6A6A6A67676767673B180D0D0D660066
+ 5D5D5D5CA3A3A1A09C9B9A999897964E4E4E4E214E214E21214C21211F306D6A
+ 6A6A676A6A67676735180D180D0000AC5D5D5D5D9FA3A2A1A09B9B9A9998974E
+ 4E4E4E4E4E4E214E214C212121406D6D6A6A6A6A676A67672A18180D0D000000
+ 60605D5D94A5A3A3A1A09C9B9A99985A4E4E4E4E4E4E4E214E214E2121716D6D
+ 6D6D6A6A676A67671A1818184E000000645D605D5FA6A5A3A2A1A09B9B9A9998
+ 86564E4E4E4E214E214E2142716F6F6F6D6D6A6A6A6A672E1A18181800000000
+ 00605D605D95A8A5A3A3A1A09C9B9A9A989796877A4A4A7877767474706F6F6F
+ 6D6D6D6D6A6A671E1A1A181F000000000064605D605DA4A8A5A3A2A1A09B9B9A
+ 9998979681807F7D7D75757474726F6F6F6D6D6D6A6A411E1A1A1A0000000000
+ 000060605D6062A7A8A5A3A3A1A09C9B9A9998979681807F7D7D75757474726F
+ 6F6F6F6D6D381F1A1E1A21000000000000006660605D6092A8A8A5A3A2A1A09B
+ 9B9A9998979681807F7D7D7575747472706F6F6D6C1F1F1E1E1A000000000000
+ 000000606060605D92A9A8A5A3A3A1A09C9B9A9998979681807F7D7D75757474
+ 726F6F6C1F1F1F1E1E5D000000000000000000AF606060606092A8A8A5A3A2A1
+ A09B9B9A9998979681807F7D7D757574747271431F1F1F1F2100000000000000
+ 00000000AE6060605D6062A4A8A5A3A3A1A09C9B9A9998979681807F7D7D7575
+ 74454C214C1F1F4E00000000000000000000000000AA606060605D5D95A7A5A3
+ A1A1A09C9B9A9998979681807F7D7D77444C4C214C4C4E000000000000000000
+ 000000000000AE60606060605D5F949FA3A3A1A09B9B9A9998979681807A4B4E
+ 4C4E214E1F4D0000000000000000000000000000000000AF6060605D605D5D5D
+ 91939D9EA19B9B9A99898559504E4E4E4E4C4C4C5D0000000000000000000000
+ 000000000000000000666060605D5D5D5D535353535353515151514E514E4E4E
+ 4E4C4EAB00000000000000000000000000000000000000000000006060605D5D
+ 5D5D5D535353535351515151514E4E4E4E640000000000000000000000000000
+ 000000000000000000000000AF6460605D5D5D5D5D5353535353515151514E66
+ 00000000000000000000000000000000000000000000000000000000000000AE
+ 605D5D5D535D5353535353516600000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000FFFFE007FFFF0000FFFF00007FFF0000FFFC
+ 00001FFF0000FFF0000007FF0000FFC0000003FF0000FF80000000FF0000FF00
+ 0000007F0000FE000000003F0000FC000000001F0000F8000000001F0000F000
+ 0000000F0000F000000000070000E000000000070000E000000000030000C000
+ 000000030000C000000000010000C00000000001000080000000000100008000
+ 0000000100008000000000000000800000000000000080000000000000008000
+ 0000000000008000000000000000800000000000000080000000000000008000
+ 0000000000008000000000000000800000000000000080000000000100008000
+ 000000010000C000000000010000C000000000030000E000000000030000E000
+ 000000070000F000000000070000F0000000000F0000F8000000000F0000F800
+ 0000001F0000FC000000003F0000FE000000007F0000FF00000000FF0000FF80
+ 000001FF0000FFE0000003FF0000FFF800000FFF0000FFFC00003FFF0000FFFF
+ 8001FFFF0000FFFFFFFFFFFF0000280000002000000040000000010008000000
+ 0000000400000000000000000000000100000001000000000000060606000909
+ 09000C0C0C000A170A000D130D000F160F000C190C0011111100141414001218
+ 1200181818001D1D1D000C260C000B2B0B000E280E00073407000A310A00102B
+ 1000122D12001B2A1B0014311400153A1500173D17001D351D001E3F1E002222
+ 220026262600292929002E2E2E003232320034343400353E35003A3A3A003D3D
+ 3D00064906000A490A00025502000F560F001043100016451600135313000161
+ 01000067000000690000006D0000066A0600046F04000B610B00086508000969
+ 09000A6F0A00007200000075000000780000007D000015661500147D15002144
+ 2100335034003653380026732A003F5240004141410045454500494949004E4E
+ 4E004558470049534B005151510056565600595959005D5D5D00436949004474
+ 4C00427C4B00437C4D006262620065656500636D6600686868006F6F6F007272
+ 7200777777007C7C7C000081000000860000008A0000008E00000A820A000091
+ 000000950000029B03001083110008A10C000DA6140013AC1D001F9227002497
+ 2E002D8D3700299B350019B226001EB72E002EA03C0024BD37002AC23F003B87
+ 46003D934C0033A5430037AA4A002EB441003CAF510041844C004A835600428F
+ 50004197500041B3570041B4580046B85E005C8367006392720057A36B004ABC
+ 650050B96B005FAB760062AE7C0030C8480037C6510035CE51003DCC59003BD3
+ 590042D1610041D9620046DF6B004CE4730052EA7C0058E682005DEC8A0057F0
+ 85005DF58D008282820085858500888888008D8D8D009090900099999900A0A0
+ A000ACACAC000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000052400B0909091C4100000000000000000000000000000000000000000052
+ 1B1B0B0B0B0B09090808080041000000000000000000000000000000008E1C1C
+ 1B1B1B1B0B0B0B090908080800084000000000000000000000000000471C1E1C
+ 1C1826313635352D2A230E08080000090000000000000000000000401E1E1E1C
+ 1C192930363635352D2D312A100808000000000000000000000040211E1E1E1E
+ 1C1C1C1B18353535352D2D313125040800080000000000000051212121211E1E
+ 1E1C1C1C1B3236363535230E0604040800000900000000000040402121211E1E
+ 1E1E1C1C1C32363636270B0B0909080808080040000000004540403C21212121
+ 1E1E1E1C1C1C1B1817140B0B0B090908080108000000000041403E6140212121
+ 211E1E1E1C1C1C1B1B1B1A0B0B0B09040D1008004100004E4141636240402121
+ 211E1E1E1E1C1C1C1B1B0B1B0B0B0B0B0D310808000000454144686440404021
+ 2121211E1E1E1C1C1B1B1B1B1B0B0B0B0E31100808000045454A696740402140
+ 212121211E1E1E1C1C1C1B1B0B1B0B0B152D23080141924545727E6C41404040
+ 402121211E1E1E1E1C1C1C1B1B1B1A0B152D2A09040B8C474775806D41414140
+ 4040212121211E1E1E1C1C1C1B1B0B1B15352D0909098C474776826F41414140
+ 402140212121211E1E1E1C1C1C1B1B1A1735350B09098C47477A847545454141
+ 404040402121211E1E1E1E3A1C1C18272D35350B0B098E4E477B858371454141
+ 4141404040212121211E1E57575656365635360B0B0B004E4779868584817473
+ 6A43404040402121211E1E5A575756563656321B0B40004E4E77878685848280
+ 7E494140402140212121215A575757565636261B0B4E004E4E4E888786858482
+ 80704141404040402121205A5A5A57575656181B1B00008E4E4E7C8A87868584
+ 827F4C4441414040403B395C5A5A575757321B1B1B0000004E4E4F898A878685
+ 8482807E6E676462605F5E5C5C5A5A5A573A1C1B5200000054514E788B8A8786
+ 858482807E69686665605F5E5C5C5A5A381E1C1C0000000000514E4E7D8B8A87
+ 86858482807E69686665605F5E5C5C591E1E1E8E000000000093514E4E7D8B8A
+ 8786858482806969686665605F5E5D201E1E47000000000000008E514E4E7889
+ 8A8786858482807E69686665603D2121214000000000000000000091514E4E4F
+ 7C888786858482807E6968633E40402141000000000000000000000093514E4E
+ 4E4E77797B7A7675727044414040405100000000000000000000000000005451
+ 4E4E474E47474745454541414145000000000000000000000000000000000000
+ 8E4E4E4E474747474645454F0000000000000000000000000000000000000000
+ 000000008E8E8C8C9200000000000000000000000000FFF00FFFFF8001FFFE00
+ 007FFC00003FF800001FF000000FE0000007E0000003C0000003C00000018000
+ 0001800000018000000000000000000000000000000000000000000000008000
+ 0000800000008000000180000001C0000001C0000003E0000003E0000007F000
+ 000FF800001FFC00003FFF0000FFFFC003FFFFFC1FFF28000000100000002000
+ 0000010008000000000000010000000000000000000000010000000100000000
+ 00000A0A0A00090F09000F0F0F000E140E000C190C001313130014141400111E
+ 1100181818001D1D1D00092F09000A390A00113311001B321B00222222002626
+ 26002B2B2B0021322100263626003030300034343400313A3100393939003E3E
+ 3E00044A04000B440B000E490E0005540500065A0600075F0700124912001848
+ 180014531400155915001E521E00006A0000066A0600096A0900007000000075
+ 0000007B0000146414001B631B00137B1300374A38002E7133002B7830004343
+ 4300474747004C4C4C004A534B00575757005A5A5A005E5E5E0046634B004E61
+ 52004A7050004878510063636300656565006868680070707000757575007D7D
+ 7D000081000000860000008C00000B860C00009200000198010009A20E0014AD
+ 1F0022B1320020B830003A9048004B975B005D836800539F660063A679002BC4
+ 42003AC0540037CF530039C8530042DA64004DE6750063C2830059E8840059F1
+ 87008A8A8A009191910098989800AAAAAA000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000003D110906033400000000000000003E11121F1B1A0C0503150000000000
+ 3615151220252828241902060000004018181514112129250D05040315000031
+ 2E1815151511120E0909060B03005A3349311818151111101009091C04343E39
+ 50313118151515111010091E0C03364C52323131181815111110101E1A06364E
+ 5438323131181515232226291B09594D5554534B311818182B4342421F095C3D
+ 575554513731312D2C454342123D003D4F58555452504A484745452A1100005C
+ 3D5658555452504A484744163D0000005B3D4F5755545250492F183600000000
+ 005C3D3D4D4E4C3A33314000000000000000005C5936363E5A0000000000F81F
+ 0000E0070000C003000080010000800100000000000000000000000000000000
+ 000000000000000000008001000080010000C0030000E0070000F81F00002800
+ 0000300000006000000001002000000000008025000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000001E1E1E0F1C1C1C4F1B1B1B8F191919BF171717DF1616
+ 16FF141414FF131313FF111111FF0F0F0FEF0E0E0EBF0D0D0D9F0B0B0B6F0A0A
+ 0A2F000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000002424
+ 240F2323235F212121CF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF1717
+ 17FF161616FF141414FF131313FF111111FF0F0F0FFF0E0E0EFF0C0C0CFF0B0B
+ 0BFF090909DF0808088F0707071F000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000002929290F2727277F2626
+ 26EF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF1919
+ 19FF171717FF161616FF141414FF131313FF111111FF0F0F0FFF0E0E0EFF0C0C
+ 0CFF0B0B0BFF090909FF080808FF060606BF0505053F00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000002C2C2C5F2A2A2AEF292929FF2727
+ 27FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A
+ 1AFF191919FF171717FF161616FF141414FF131313FF111111FF0F0F0FFF0E0E
+ 0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF0505059F0505050F0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000003131310F2F2F2FAF2E2E2EFF2C2C2CFF2A2A2AFF2929
+ 29FF272727FF262626FF242424FF222222FF212121FF193019FF143914FF0E48
+ 0EFF0D460DFF0C450CFF0B430BFF0C3C0CFF0F2A0FFF111811FF111111FF0F0F
+ 0FFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF040404EF0404
+ 044F000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000003434342F323232DF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A
+ 2AFF292929FF272727FF174717FF0B620BFF027702FF007A00FF007800FF0076
+ 00FF007400FF007300FF007100FF006F00FF006D00FF006B00FF035903FF0937
+ 09FF0D1A0DFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF0404
+ 04FF0303038F0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00003737372F353535EF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C
+ 2CFF2A2A2AFF243424FF145414FF135313FF096709FF007C00FF007A00FF0078
+ 00FF007600FF007400FF007300FF007100FF006F00FF006D00FF006B00FF0069
+ 00FF006700FF044B04FF0B1E0BFF0C0C0CFF0B0B0BFF090909FF080808FF0606
+ 06FF040404FF0303039F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000003A3A
+ 3A2F383838EF373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E
+ 2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF164416FF0275
+ 02FF007800FF007600FF007400FF007300FF007100FF006F00FF006D00FF006B
+ 00FF006900FF006700FF006600FF053F05FF0B120BFF0B0B0BFF090909FF0808
+ 08FF060606FF040404FF0303039F000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000003D3D3D2F3C3C
+ 3CEF3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF2F2F
+ 2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF1A39
+ 1AFF007A00FF007800FF007600FF007400FF007300FF007100FF006F00FF006D
+ 00FF006B00FF006900FF006700FF006600FF015A01FF0A1D0AFF0B0B0BFF0909
+ 09FF080808FF060606FF040404FF0303038F0000000000000000000000000000
+ 000000000000000000000000000000000000000000004141410F3F3F3FCF3D3D
+ 3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF3030
+ 30FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF2424
+ 24FF007C00FF007A00FF007800FF007600FF007400FF007300FF007100FF0364
+ 03FF0B410BFF0F2A0FFF101D10FF111111FF0E150EFF0C190CFF0C0C0CFF0B0B
+ 0BFF090909FF080808FF060606FF040404FF0404044F00000000000000000000
+ 000000000000000000000000000000000000000000004242428F404040FF3F3F
+ 3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF3232
+ 32FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF2626
+ 26FF007E00FF007C00FF007A00FF007800FF007600FF007400FF0D460DFF1919
+ 19FF171717FF161616FF141414FF131313FF111111FF0F0F0FFF0E0E0EFF0C0C
+ 0CFF0B0B0BFF090909FF080808FF060606FF040404EF0505050F000000000000
+ 0000000000000000000000000000000000004545453F444444FF424242FF4040
+ 40FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF3434
+ 34FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF2727
+ 27FF008000FF007E00FF007C00FF007A00FF007800FF007600FF1C1C1CFF1A1A
+ 1AFF191919FF171717FF161616FF141414FF131313FF111111FF0F0F0FFF0E0E
+ 0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF050505AF000000000000
+ 000000000000000000000000000000000000464646BF454545FF444444FF4242
+ 42FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF3535
+ 35FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF2929
+ 29FF272727FF262626FF242424FF1A391AFF163D16FF104C10FF1E1E1EFF1C1C
+ 1CFF1A1A1AFF191919FF171717FF161616FF141414FF131313FF111111FF0F0F
+ 0FFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF0505053F0000
+ 00000000000000000000000000004A4A4A3F484848FF474747FF454545FF4444
+ 44FF39563BFF28742CFF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF3737
+ 37FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A
+ 2AFF292929FF272727FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E
+ 1EFF1C1C1CFF1A1A1AFF191919FF171717FF161616FF141414FF131313FF1111
+ 11FF0F0F0FFF053F05FF0C0C0CFF0B0B0BFF090909FF080808FF060606BF0000
+ 00000000000000000000000000004B4B4BBF4A4A4AFF484848FF474747FF4545
+ 45FF22942AFF2B7730FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF3838
+ 38FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C
+ 2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF212121FF1F1F
+ 1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF161616FF141414FF1313
+ 13FF111111FF006600FF0A230AFF0C0C0CFF0B0B0BFF090909FF080808FF0707
+ 072F00000000000000004F4F4F1F4D4D4DFF4B4B4BFF4A4A4AFF484848FF3C62
+ 40FF1AB328FF2D7A33FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A
+ 3AFF383838FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E
+ 2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF2121
+ 21FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF161616FF1414
+ 14FF131313FF006700FF044B04FF0E0E0EFF0C0C0CFF0B0B0BFF090909FF0808
+ 088F00000000000000005050506F4F4F4FFF4D4D4DFF4B4B4BFF4A4A4AFF2D97
+ 3AFF1EB72EFF307C37FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C
+ 3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF2F2F
+ 2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF2222
+ 22FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF1616
+ 16FF141414FF006900FF006700FF0D1A0DFF0E0E0EFF0C0C0CFF0B0B0BFF0909
+ 09EF0000000000000000525252BF505050FF4F4F4FFF4D4D4DFF49534AFF26BE
+ 39FF22BB34FF327F3BFF454545FF444444FF424242FF404040FF3F3F3FFF3D3D
+ 3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF3030
+ 30FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF2424
+ 24FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF1717
+ 17FF161616FF006B00FF006900FF074207FF0F0F0FFF0E0E0EFF0C0C0CFF0B0B
+ 0BFF0A0A0A2F00000000535353FF525252FF505050FF4F4F4FFF417A49FF2AC2
+ 3FFF26BE39FF35823EFF474747FF454545FF444444FF424242FF404040FF3F3F
+ 3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF3232
+ 32FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF2626
+ 26FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF1919
+ 19FF171717FF006D00FF006B00FF035903FF111111FF0F0F0FFF0E0E0EFF0C0C
+ 0CFF0B0B0B6F5656563F555555FF535353FF525252FF505050FF3C9B4CFF2DC6
+ 44FF2AC23FFF388442FF484848FF474747FF454545FF444444FF424242FF4040
+ 40FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF3434
+ 34FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF2727
+ 27FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A
+ 1AFF191919FF006F00FF006D00FF006B00FF111811FF111111FF0F0F0FFF0E0E
+ 0EFF0C0C0CAF5858584F575757FF555555FF535353FF525252FF3BAE50FF31CA
+ 4AFF2DC644FF3B8745FF4A4A4AFF484848FF474747FF454545FF444444FF4242
+ 42FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF3535
+ 35FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF2929
+ 29FF272727FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C
+ 1CFF1A1A1AFF007100FF006F00FF006D00FF0F2A0FFF131313FF111111FF0F0F
+ 0FFF0E0E0EBF5959597F585858FF575757FF555555FF535353FF39D156FF35CD
+ 50FF31CA4AFF3D8949FF4B4B4BFF4A4A4AFF484848FF474747FF454545FF4444
+ 44FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF3737
+ 37FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A
+ 2AFF292929FF272727FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E
+ 1EFF1C1C1CFF007300FF007100FF006F00FF0C3C0CFF141414FF131313FF1111
+ 11FF0F0F0FFF5B5B5B7F595959FF585858FF575757FF555555FF3DD55BFF39D1
+ 56FF35CD50FF408C4DFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF474747FF4545
+ 45FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF3838
+ 38FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C
+ 2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF212121FF1F1F
+ 1FFF1E1E1EFF007400FF007300FF007100FF0B430BFF161616FF141414FF1313
+ 13FF111111FF5C5C5C7F5B5B5BFF595959FF585858FF575757FF40D961FF3DD5
+ 5BFF39D156FF438F51FF4F4F4FFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF4747
+ 47FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A
+ 3AFF383838FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E
+ 2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF2121
+ 21FF1F1F1FFF007600FF007400FF007300FF0C450CFF171717FF161616FF1414
+ 14FF131313FF5E5E5E7F5D5D5DFF5B5B5BFF595959FF585858FF44DD67FF40D9
+ 61FF3DD55BFF459254FF505050FF4F4F4FFF4D4D4DFF4B4B4BFF4A4A4AFF4848
+ 48FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C
+ 3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF2F2F
+ 2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF2028
+ 20FF0C590CFF007800FF007600FF007400FF0D460DFF191919FF171717FF1616
+ 16FF141414FF6060607F5E5E5EFF5D5D5DFF5B5B5BFF595959FF48E06DFF44DD
+ 67FF40D961FF45A459FF525252FF505050FF4F4F4FFF4D4D4DFF4B4B4BFF4A4A
+ 4AFF484848FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D
+ 3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF3030
+ 30FF1D511DFF0E6D0EFF155A15FF155815FF145614FF0E600EFF076F07FF007E
+ 00FF007C00FF007A00FF007800FF007600FF0E480EFF1A1A1AFF191919FF1717
+ 17FF161616FF6161617F606060FF5E5E5EFF5D5D5DFF5B5B5BFF4CDB71FF48E0
+ 6DFF44DD67FF40D961FF479C58FF4F6252FF505050FF4F4F4FFF4D4D4DFF4B4B
+ 4BFF4A4A4AFF484848FF474747FF454545FF444444FF424242FF404040FF3F3F
+ 3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF3232
+ 32FF185F18FF008B00FF008900FF008700FF008500FF008400FF008200FF0080
+ 00FF007E00FF007C00FF007A00FF007800FF143914FF1C1C1CFF1A1A1AFF1919
+ 19FF171717DF6262623F616161FF606060FF5E5E5EFF5D5D5DFF52C470FF4CE4
+ 73FF48E06DFF44DD67FF40D961FF3DD55BFF3EB955FF419751FF408C4DFF456B
+ 4BFF436948FF416746FF484848FF474747FF454545FF444444FF424242FF4040
+ 40FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF3434
+ 34FF196019FF008D00FF008B00FF008900FF008700FF008500FF008400FF0082
+ 00FF008000FF007E00FF007C00FF007A00FF193019FF1E1E1EFF1C1C1CFF1A1A
+ 1AFF191919BF6464641F636363FF616161FF606060FF5E5E5EFF58A46DFF50E8
+ 78FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA
+ 4AFF2DC644FF2AC23FFF4A4A4AFF484848FF474747FF454545FF444444FF4242
+ 42FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF3535
+ 35FF1A621AFF008F00FF008D00FF008B00FF008900FF008700FF008500FF0084
+ 00FF008200FF008000FF007E00FF027702FF212121FF1F1F1FFF1E1E1EFF1C1C
+ 1CFF1B1B1B8F00000000656565DF636363FF616161FF606060FF5D7965FF53EC
+ 7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD
+ 50FF31CA4AFF2DC644FF4B4B4BFF4A4A4AFF484848FF474747FF454545FF4444
+ 44FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF3737
+ 37FF1B641BFF009100FF008F00FF008D00FF008B00FF008900FF008700FF0085
+ 00FF008400FF008200FF008000FF0B620BFF222222FF212121FF1F1F1FFF1E1E
+ 1EFF1C1C1C5F000000006666669F656565FF636363FF616161FF606060FF58DD
+ 7FFF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D1
+ 56FF35CD50FF31CA4AFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF474747FF4545
+ 45FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF3838
+ 38FF1B661BFF009300FF009100FF008F00FF008D00FF008B00FF008900FF0087
+ 00FF008500FF008400FF008200FF174717FF242424FF222222FF212121FF1F1F
+ 1FFF1E1E1E0F000000006767674F666666FF656565FF636363FF616161FF5DA9
+ 74FF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD5
+ 5BFF39D156FF35CD50FF447D4EFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF4747
+ 47FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A
+ 3AFF0E7F0EFF009500FF009300FF009100FF008F00FF008D00FF008B00FF0089
+ 00FF008700FF008500FF027E02FF272727FF262626FF242424FF222222FF2121
+ 21CF000000000000000000000000686868EF666666FF656565FF636363FF616B
+ 64FF5BEA87FF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D9
+ 61FF3DD55BFF39D156FF35CD50FF3C9C4DFF47644CFF4B4B4BFF4A4A4AFF4848
+ 48FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF2C5C2EFF1284
+ 13FF009900FF009700FF009500FF009300FF009100FF008F00FF008D00FF008B
+ 00FF008900FF008700FF155815FF292929FF272727FF262626FF242424FF2323
+ 235F0000000000000000000000006969697F686868FF666666FF656565FF6363
+ 63FF60AC78FF5BF38AFF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD
+ 67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF32A442FF2FA1
+ 3EFF35823EFF327F3BFF2D8335FF22942BFF1F9126FF0FA817FF0BA411FF07A0
+ 0BFF049D05FF009900FF009700FF009500FF009300FF009100FF008F00FF008D
+ 00FF008B00FF028402FF293229FF2A2A2AFF292929FF272727FF262626EF2424
+ 240F0000000000000000000000006A6A6A1F696969EF686868FF666666FF6565
+ 65FF636363FF5FDA86FF5BF38AFF57EF84FF53EC7EFF50E878FF4CE473FF48E0
+ 6DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF2AC2
+ 3FFF26BE39FF22BB34FF1EB72EFF1AB328FF16AF22FF13AC1CFF0FA817FF0BA4
+ 11FF07A00BFF049D05FF009900FF009700FF009500FF009300FF009100FF008F
+ 00FF008D00FF204C20FF2E2E2EFF2C2C2CFF2A2A2AFF292929FF2727277F0000
+ 0000000000000000000000000000000000006A6A6A7F696969FF686868FF6666
+ 66FF656565FF637F6CFF5FED8CFF5BF38AFF57EF84FF53EC7EFF50E878FF4CE4
+ 73FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC6
+ 44FF2AC23FFF26BE39FF22BB34FF1EB72EFF1AB328FF16AF22FF13AC1CFF0FA8
+ 17FF0BA411FF07A00BFF049D05FF009900FF009700FF009500FF009300FF0091
+ 00FF136C13FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AEF2929290F0000
+ 0000000000000000000000000000000000006B6B6B0F6A6A6ADF696969FF6868
+ 68FF666666FF656565FF629B75FF5FF78FFF5BF38AFF57EF84FF53EC7EFF50E8
+ 78FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA
+ 4AFF2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF1AB328FF16AF22FF13AC
+ 1CFF0FA817FF0BA411FF07A00BFF049D05FF009900FF009700FF009500FF0A81
+ 0AFF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2C6F000000000000
+ 000000000000000000000000000000000000000000006B6B6B3F6A6A6AFF6969
+ 69FF686868FF666666FF656565FF629B75FF5FF78FFF5BF38AFF57EF84FF53EC
+ 7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD
+ 50FF31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF1AB328FF16AF
+ 22FF13AC1CFF0FA817FF0BA411FF07A00BFF049D05FF009900FF0A850AFF333D
+ 33FF353535FF343434FF323232FF303030FF2F2F2FBF00000000000000000000
+ 00000000000000000000000000000000000000000000000000006B6B6B8F6A6A
+ 6AFF696969FF686868FF666666FF656565FF629B75FF5FF78FFF5BF38AFF57EF
+ 84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D1
+ 56FF35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF1AB3
+ 28FF16AF22FF13AC1CFF0FA817FF0BA411FF07A00BFF128413FF364036FF3838
+ 38FF373737FF353535FF343434FF323232EF3131310F00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000006B6B
+ 6B9F6A6A6AFF696969FF686868FF666666FF656565FF637F6CFF5FDA86FF5BF3
+ 8AFF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD5
+ 5BFF39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF1EB7
+ 2EFF1AB328FF16AF22FF13AC1CFF0FA817FF257127FF3D3D3DFF3C3C3CFF3A3A
+ 3AFF383838FF373737FF353535EF3434342F0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000006B6B
+ 6B0F6B6B6BCF6A6A6AFF696969FF686868FF666666FF656565FF636363FF60AC
+ 78FF5BEA87FF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D9
+ 61FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF22BB
+ 34FF1EB72EFF1AB328FF22942AFF39563BFF404040FF3F3F3FFF3D3D3DFF3C3C
+ 3CFF3A3A3AFF383838EF3737372F000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00006B6B6B0F6B6B6B9F6A6A6AFF696969FF686868FF666666FF656565FF6363
+ 63FF616B64FF5DA974FF58DD7FFF53EC7EFF50E878FF4CE473FF48E06DFF44DD
+ 67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF26BE
+ 39FF2D973AFF3C6240FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D
+ 3DFF3C3C3CEF3A3A3A2F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000006B6B6B8F6A6A6AFF696969FF686868FF666666FF6565
+ 65FF636363FF616161FF606060FF5C8267FF58A46DFF52C470FF4CDB71FF48E0
+ 6DFF44DD67FF40D961FF3DD55BFF39D156FF3AB650FF3C9B4CFF417A49FF4953
+ 4AFF4A4A4AFF484848FF474747FF454545FF444444FF424242FF404040FF3F3F
+ 3FCF3D3D3D2F0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000006B6B6B3F6A6A6ADF696969FF686868FF6666
+ 66FF656565FF636363FF616161FF606060FF5E5E5EFF5D5D5DFF5B5B5BFF5959
+ 59FF585858FF575757FF555555FF535353FF525252FF505050FF4F4F4FFF4D4D
+ 4DFF4B4B4BFF4A4A4AFF484848FF474747FF454545FF444444FF4242428F4141
+ 410F000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000006B6B6B0F6A6A6A7F696969FF6868
+ 68FF666666FF656565FF636363FF616161FF606060FF5E5E5EFF5D5D5DFF5B5B
+ 5BFF595959FF585858FF575757FF555555FF535353FF525252FF505050FF4F4F
+ 4FFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF464646BF4545453F000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000006A6A6A1F6969
+ 698F686868EF666666FF656565FF636363FF616161FF606060FF5E5E5EFF5D5D
+ 5DFF5B5B5BFF595959FF585858FF575757FF555555FF535353FF525252FF5050
+ 50FF4F4F4FFF4D4D4DFF4B4B4BBF4A4A4A3F0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000006767674F6666669F656565EF636363FF616161FF606060FF5E5E
+ 5EFF5D5D5DFF5B5B5BFF595959FF585858FF575757FF555555FF535353FF5252
+ 52BF5050506F4F4F4F1F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000006464641F6262623F6161617F6060
+ 607F5E5E5E7F5C5C5C7F5B5B5B7F5959597F5858585F5656563F000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000FFFF8001FFFF0000FFFC00003FFF0000FFF000000FFF0000FFE0
+ 000003FF0000FF80000001FF0000FF00000000FF0000FE000000007F0000FC00
+ 0000003F0000F8000000001F0000F0000000000F0000F000000000070000E000
+ 000000070000E000000000030000C000000000030000C0000000000100008000
+ 0000000100008000000000010000800000000000000080000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000800000000000000080000000000000008000
+ 000000010000C000000000010000C000000000010000C000000000030000E000
+ 000000030000E000000000070000F0000000000F0000F8000000000F0000FC00
+ 0000001F0000FC000000003F0000FE000000007F0000FF80000000FF0000FFC0
+ 000001FF0000FFE0000007FF0000FFF800001FFF0000FFFF00007FFF0000FFFF
+ E007FFFF00002800000020000000400000000100200000000000801000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000002121210F1F1F1F5F1D1D
+ 1D9F1A1A1ACF181818FF151515FF131313FF101010FF0E0E0EDF0C0C0CBF0A0A
+ 0A6F0808081F0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000002929291F2626269F232323FF212121FF1F1F
+ 1FFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF101010FF0E0E0EFF0C0C
+ 0CFF090909FF070707BF0606063F000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000002D2D2D8F2A2A2AFF282828FF262626FF232323FF2121
+ 21FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF101010FF0E0E
+ 0EFF0C0C0CFF090909FF070707FF050505BF0404041F00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00003434341F323232CF2F2F2FFF2D2D2DFF2A2A2AFF282828FF1E371EFF0F56
+ 0FFF086408FF007800FF007500FF007200FF006F00FF026102FF064906FF0B2B
+ 0BFF0E0E0EFF0C0C0CFF090909FF070707FF050505EF0303034F000000000000
+ 0000000000000000000000000000000000000000000000000000000000003939
+ 392F363636EF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF1E3F1EFF1353
+ 13FF0B610BFF007A00FF007800FF007500FF007200FF006F00FF006C00FF0069
+ 00FF006100FF073407FF0C0C0CFF090909FF070707FF050505FF0303035F0000
+ 00000000000000000000000000000000000000000000000000003E3E3E0F3B3B
+ 3BEF393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF2828
+ 28FF262626FF1D341DFF027502FF007800FF007500FF007200FF006F00FF006C
+ 00FF006900FF006700FF025502FF0A170AFF090909FF070707FF050505FF0303
+ 034F000000000000000000000000000000000000000000000000404040BF3D3D
+ 3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A
+ 2AFF282828FF262626FF096709FF007A00FF007800FF007500FF007200FF0A49
+ 0AFF102B10FF121812FF0F160FFF0C190CFF0C0C0CFF090909FF070707FF0505
+ 05EF0404041F000000000000000000000000000000004444446F424242FF4040
+ 40FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF2D2D
+ 2DFF2A2A2AFF282828FF096909FF007D00FF007A00FF007800FF104310FF1A1A
+ 1AFF181818FF151515FF131313FF101010FF0E0E0EFF0C0C0CFF090909FF0707
+ 07FF050505BF0000000000000000000000004A4A4A0F474747EF444444FF4242
+ 42FF365338FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F
+ 2FFF2D2D2DFF2A2A2AFF282828FF262626FF1D341DFF173D17FF1B2A1BFF1C1C
+ 1CFF1A1A1AFF181818FF151515FF131313FF101010FF0D130DFF0C0C0CFF0909
+ 09FF070707FF0606063F00000000000000004B4B4B7F494949FF474747FF3F52
+ 40FF1F9227FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF3232
+ 32FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF232323FF212121FF1F1F
+ 1FFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF0C260CFF073407FF0C0C
+ 0CFF090909FF070707BF00000000000000004E4E4EDF4B4B4BFF494949FF2D8D
+ 37FF24972EFF424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF3434
+ 34FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF232323FF2121
+ 21FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF151515FF0E280EFF006100FF0E0E
+ 0EFF0C0C0CFF090909FF0808081F5252522F505050FF4E4E4EFF49534BFF24BD
+ 37FF299B35FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF393939FF3636
+ 36FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF2323
+ 23FF212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF102B10FF006900FF0A31
+ 0AFF0E0E0EFF0C0C0CFF0A0A0A6F5555556F535353FF505050FF44744CFF2AC2
+ 3FFF2EA03CFF474747FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF3939
+ 39FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF2626
+ 26FF232323FF212121FF1F1F1FFF1C1C1CFF1A1A1AFF122D12FF006C00FF0649
+ 06FF101010FF0E0E0EFF0C0C0CBF5757578F555555FF535353FF428F50FF30C8
+ 48FF33A543FF494949FF474747FF444444FF424242FF404040FF3D3D3DFF3B3B
+ 3BFF393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF2828
+ 28FF262626FF232323FF212121FF1F1F1FFF1C1C1CFF143014FF006F00FF0261
+ 02FF131313FF101010FF0E0E0EEF595959BF575757FF555555FF41B357FF35CE
+ 51FF37AA4AFF4B4B4BFF494949FF474747FF444444FF424242FF404040FF3D3D
+ 3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A
+ 2AFF282828FF262626FF232323FF212121FF1F1F1FFF153215FF007200FF006F
+ 00FF151515FF131313FF101010FF5C5C5CBF5A5A5AFF575757FF46B85EFF3BD3
+ 59FF3CAF51FF4E4E4EFF4B4B4BFF494949FF474747FF444444FF424242FF4040
+ 40FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF2D2D
+ 2DFF2A2A2AFF282828FF262626FF232323FF212121FF153A15FF007500FF0072
+ 00FF181818FF151515FF131313FF5E5E5EBF5C5C5CFF5A5A5AFF4ABC65FF41D9
+ 62FF41B458FF505050FF4E4E4EFF4B4B4BFF494949FF474747FF444444FF4242
+ 42FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F
+ 2FFF214421FF2A2A2AFF282828FF1E371EFF164516FF046F04FF007800FF0075
+ 00FF1A1A1AFF181818FF151515FF616161BF5F5F5FFF5C5C5CFF50B96BFF46DF
+ 6BFF42D161FF4A8356FF505050FF4E4E4EFF4B4B4BFF494949FF474747FF4444
+ 44FF424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF3232
+ 32FF008B00FF008900FF008600FF008300FF008000FF007D00FF007A00FF0078
+ 00FF1C1C1CFF1A1A1AFF181818FF6363637F616161FF5F5F5FFF57A36BFF4CE4
+ 73FF46DF6BFF41D962FF3DCC59FF3CAF51FF3D934CFF3B8746FF455847FF4747
+ 47FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF3434
+ 34FF008E00FF008B00FF008900FF008600FF008300FF008000FF007D00FF066A
+ 06FF1F1F1FFF1C1C1CFF1A1A1ACF6565655F636363FF616161FF5C8367FF52EA
+ 7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF436949FF4949
+ 49FF474747FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF393939FF3636
+ 36FF009100FF008E00FF008B00FF008900FF008600FF008300FF008000FF0F56
+ 0FFF212121FF1F1F1FFF1D1D1DAF6767671F666666FF636363FF616161FF58E6
+ 82FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF41844CFF4B4B
+ 4BFF494949FF474747FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF353E
+ 35FF009400FF009100FF008E00FF008B00FF008900FF008600FF008300FF1E37
+ 1EFF232323FF212121FF1F1F1F5F00000000676767BF666666FF636363FF5FAB
+ 76FF57F085FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF37C651FF437C
+ 4DFF49534BFF494949FF474747FF444444FF424242FF404040FF335034FF147D
+ 15FF009700FF009400FF009100FF008E00FF008B00FF008900FF0A6F0AFF2828
+ 28FF262626FF232323FF2121210F000000006A6A6A5F686868FF666666FF636D
+ 66FF5DEC8AFF57F085FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE
+ 51FF30C848FF2EB441FF2EA03CFF299B35FF24972EFF13AC1DFF0DA614FF08A1
+ 0CFF029B03FF009700FF009400FF009100FF008E00FF008B00FF214421FF2A2A
+ 2AFF282828FF2626269F0000000000000000000000006A6A6ADF686868FF6666
+ 66FF639272FF5DF58DFF57F085FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD3
+ 59FF35CE51FF30C848FF2AC23FFF24BD37FF1EB72EFF19B226FF13AC1DFF0DA6
+ 14FF08A10CFF029B03FF009700FF009400FF009100FF156615FF2F2F2FFF2D2D
+ 2DFF2A2A2AFF2929291F0000000000000000000000006B6B6B3F6A6A6AFF6868
+ 68FF666666FF62AE7CFF5DF58DFF57F085FF52EA7CFF4CE473FF46DF6BFF41D9
+ 62FF3BD359FF35CE51FF30C848FF2AC23FFF24BD37FF1EB72EFF19B226FF13AC
+ 1DFF0DA614FF08A10CFF029B03FF009700FF0A820AFF343434FF323232FF2F2F
+ 2FFF2D2D2D8F00000000000000000000000000000000000000006B6B6B8F6A6A
+ 6AFF686868FF666666FF62AE7CFF5DF58DFF57F085FF52EA7CFF4CE473FF46DF
+ 6BFF41D962FF3BD359FF35CE51FF30C848FF2AC23FFF24BD37FF1EB72EFF19B2
+ 26FF13AC1DFF0DA614FF08A10CFF108311FF353E35FF363636FF343434FF3232
+ 32CF3030300F0000000000000000000000000000000000000000000000006B6B
+ 6BBF6A6A6AFF686868FF666666FF639272FF5DEC8AFF57F085FF52EA7CFF4CE4
+ 73FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF2AC23FFF24BD37FF1EB7
+ 2EFF19B226FF13AC1DFF26732AFF3D3D3DFF3B3B3BFF393939FF363636EF3434
+ 341F000000000000000000000000000000000000000000000000000000006B6B
+ 6B0F6B6B6BAF6A6A6AFF686868FF666666FF636D66FF5FAB76FF58E682FF52EA
+ 7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF2AC23FFF24BD
+ 37FF2D8D37FF3F5240FF424242FF404040FF3D3D3DFF3B3B3BEF3939392F0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000006B6B6B8F6A6A6AFF686868FF666666FF636363FF616161FF5C83
+ 67FF57A36BFF50B96BFF4ABC65FF46B85EFF41B357FF419750FF427C4BFF4953
+ 4BFF494949FF474747FF444444FF424242FF404040BF3E3E3E0F000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000006B6B6B3F6A6A6ADF686868FF666666FF636363FF6161
+ 61FF5F5F5FFF5C5C5CFF5A5A5AFF575757FF555555FF535353FF505050FF4E4E
+ 4EFF4B4B4BFF494949FF474747EF4444446F0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000006A6A6A5F676767BF666666FF6363
+ 63FF616161FF5F5F5FFF5C5C5CFF5A5A5AFF575757FF555555FF535353FF5050
+ 50FF4E4E4EDF4B4B4B7F4A4A4A0F000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000006767671F6565
+ 655F6363637F616161BF5E5E5EBF5C5C5CBF595959BF5757578F5555556F5252
+ 522F000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000FFC003FFFF0000FFFE00003FF800001FF000
+ 000FE0000007E0000003C0000003800000018000000180000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00008000000080000001C0000001C0000003E0000003F0000007F000000FFC00
+ 001FFE00007FFF8000FFFFE007FF280000001000000020000000010020000000
+ 0000400400000000000000000000000000000000000000000000000000000000
+ 0000000000002727273F222222AF1D1D1DEF181818FF131313FF0F0F0FFF0B0B
+ 0BAF0707075F0000000000000000000000000000000000000000000000003535
+ 350F303030AF2B2B2BFF213221FF124912FF0E490EFF0B440BFF0A390AFF0C19
+ 0CFF0A0A0AFF060606CF0404041F0000000000000000000000003E3E3E0F3939
+ 39CF343434FF303030FF263626FF184818FF066A06FF007500FF007000FF006A
+ 00FF044A04FF090F09FF050505EF0404041F0000000000000000424242AF3E3E
+ 3EFF393939FF343434FF303030FF2B2B2BFF145314FF007B00FF017001FF1133
+ 11FF111E11FF0E140EFF0A0A0AFF060606CF000000004B4B4B3F474747FF2E71
+ 33FF3E3E3EFF393939FF343434FF303030FF2B2B2BFF223222FF1B321BFF1D1D
+ 1DFF181818FF131313FF092F09FF0A0A0AFF0707075F5050509F4A534BFF22B1
+ 32FF434343FF3E3E3EFF393939FF343434FF303030FF2B2B2BFF262626FF2222
+ 22FF1D1D1DFF181818FF055405FF0C190CFF0B0B0BAF555555CF4A7050FF2BC4
+ 42FF474747FF434343FF3E3E3EFF393939FF343434FF303030FF2B2B2BFF2626
+ 26FF222222FF1D1D1DFF065A06FF0A390AFF0F0F0FFF5A5A5AFF4B975BFF37CF
+ 53FF4C4C4CFF474747FF434343FF3E3E3EFF393939FF343434FF303030FF2B2B
+ 2BFF262626FF222222FF075F07FF0B440BFF131313FF5F5F5FFF539F66FF42DA
+ 64FF4E6152FF4C4C4CFF474747FF434343FF3E3E3EFF393939FF343434FF1E52
+ 1EFF155915FF096A09FF007B00FF0E490EFF181818FF636363BF5D8368FF4DE6
+ 75FF42DA64FF39C853FF3A9048FF474747FF434343FF3E3E3EFF393939FF1B63
+ 1BFF008C00FF008600FF008100FF124912FF1D1D1DFF6868688F646464FF59E8
+ 84FF4DE675FF42DA64FF3AC054FF46634BFF474747FF434343FF374A38FF137B
+ 13FF009200FF008C00FF008600FF213221FF222222AF6A6A6A1F686868FF63A6
+ 79FF59F187FF4DE675FF42DA64FF37CF53FF2BC442FF20B830FF14AD1FFF09A2
+ 0EFF019801FF009200FF146414FF2B2B2BFF2727273F000000006A6A6A8F6868
+ 68FF63C283FF59F187FF4DE675FF42DA64FF37CF53FF2BC442FF20B830FF14AD
+ 1FFF09A20EFF0B860CFF313A31FF303030BF0000000000000000000000006A6A
+ 6AAF686868FF63A679FF59E884FF4DE675FF42DA64FF37CF53FF2BC442FF22B1
+ 32FF2B7830FF3E3E3EFF393939CF3535350F0000000000000000000000000000
+ 00006A6A6A8F686868FF646464FF5D8368FF539F66FF4B975BFF487851FF4A53
+ 4BFF474747FF424242AF3E3E3E0F000000000000000000000000000000000000
+ 0000000000006A6A6A1F6868688F636363BF5F5F5FFF5A5A5AFF555555CF5050
+ 509F4B4B4B3F00000000000000000000000000000000F00F0000C00300008001
+ 0000800100000000000000000000000000000000000000000000000000000000
+ 00000000000080010000C0010000E0030000F00F0000}
+ PixelsPerInch = 96
+ TextHeight = 13
+ inherited Bevel1: TBevel
+ Width = 569
+ end
+ inherited Panel1: TPanel
+ Width = 569
+ inherited Image1: TImage
+ Picture.Data = {
+ 055449636F6E0000010006003030000001000800A80E00006600000020200000
+ 01000800A80800000E0F0000101000000100080068050000B617000030300000
+ 01002000A82500001E1D00002020000001002000A8100000C642000010100000
+ 01002000680400006E5300002800000030000000600000000100080000000000
+ 0009000000000000000000000001000000010000000000000505050009090900
+ 0D0D0D000B120B000E150E000A1D0A000C190C00121212001515150011181100
+ 101D1000191919001D1D1D000A230A000F2A0F00053F0500093709000C3C0C00
+ 14391400163D1600193019001A391A0021212100252525002028200029292900
+ 2D2D2D0024342400293229003131310035353500333D3300393939003D3D3D00
+ 07420700044B04000B420B000C450C000E480E00025902000C590C0016461600
+ 104C10001353130014551400155815001D511D00185F180000660000006A0000
+ 006E0000076F07000B620B00096709000E600E000E6D0E000072000000750000
+ 00780000007D00000E7F0E00136C1300196119001B651B00204C20002C5C2E00
+ 3640360039563B002571270028742C002B7730002D7A3300307C3700327F3B00
+ 3C6240004040400045454500494949004D4D4D0049534A005151510056565600
+ 595959005D5D5D004167460047644C0043694800456B4B00417A4900447D4E00
+ 4F6252005D7965006161610065656500616B6400686868006E6E6E00637F6C00
+ 7171710074747400787878007D7D7D000081000000850000008A0000008D0000
+ 0A810A000A850A00009100000095000000990000049D05001284130007A00B00
+ 0BA411000FA8170013AC1C001F91260022942A002D83350035823E002D973A00
+ 16AF22001AB328001EB72E002FA13E0022BB340026BE39002AC23F0038844200
+ 3B8745003D8949003C9B4C003C9C4D0032A442003BAE50003AB650003EB95500
+ 408C4D00438F51004197510045925400479C580045A459005C826700629B7500
+ 58A46D005DA9740060AC78002DC6440031CA4A0035CD500039D156003DD55B00
+ 40D9610044DD670052C470004CDB710058DD7F0048E06D004CE4730050E87800
+ 53EC7E005FDA860057EF84005BEA87005FED8C005BF38A005FF78F0086868600
+ 959595009F9F9F00A2A2A200AAAAAA00ACACAC00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000066511F090909090D4E60000000000000000000000000000000
+ 00000000000000000000000000000000000000004E0D0D0D0D0D090909090309
+ 0303031864000000000000000000000000000000000000000000000000000000
+ 00001F1818180D0D0D090D09090909030303030303004E000000000000000000
+ 000000000000000000000000000000001F1A1818180D180D0D0D0D0909090909
+ 09030303030300035D000000000000000000000000000000000000000000641A
+ 1A1A1A181818180D151327272727110F05090303030303000309000000000000
+ 000000000000000000000000004E1F1A1F1A1A1A182A353B3B3B3A3A3A333333
+ 332811070303030300000064000000000000000000000000000000004E1A1F1F
+ 1A1F1A1A1C2D2D353B3B3B3A3A3A3A333333313124070303030300005D000000
+ 00000000000000000000004E1F1F1F1F1F1A1F1A1A1A181A182A3A3B3A3A3333
+ 333333313331100404000303005D0000000000000000000000004E1F1F211F1F
+ 1A1F1A1F1A1A1A1A1818163B3B3A3A3A33333333313131280703030003006400
+ 0000000000000000005D212121211F1F1F1F1A1F1A1A1A1A1A18183B3B3B3A3A
+ 3A3331120F0B080507030303000300000000000000000000AB4E214E2121211F
+ 1F1F1F1A1F1F1A1A1A181A673B3B3B3A3A270C09090909030303030303000309
+ 00000000000000004E214E21212121211F1F1F1F1A1F1A1E1A1A1867673B3B3B
+ 3A0D0D0C0C090909090303030303000051000000000000644E4E214E214E2121
+ 211F1F1F1F1A1F1A1A1A1A1A181A16132D0D0D0C0C0909090903030303030303
+ 000000000000004E4E4E4E44462121212121211F1F1F1F1E1F1A1A1A1A181818
+ 0D0D0D0D0D0C09090909090310030003034E00000000664E4E214E76474E214E
+ 2121211F1F1F1F1A1E1E1A1A1A1A181818170D0D0D0D090B0C080908310E0303
+ 0003000000004E4E4E4E4B7C474E21214E2121211F1F1F1F1A1F1A1E1A1A1A18
+ 1817180D0D0D0D0C09090908312403030303640000004E514E4E7A7D474E4E21
+ 21212121211F1F1F1F1E1E1A1A1A1A18181817180D0D0D0C0C09090933310703
+ 030309000066514E5150807F4A4E214E4E214E2121211F1F1F1E1E1F1E1A1A1A
+ 1A181817180D0D0D0D0C0909333123030303030000515151515981804A4E4E21
+ 4E21214E2121211F1F1F1E1A1E1E1A1A1A1A181817180D0D0D0D0C0C33332809
+ 030303000051515151859681824E4E4E4E4E2121212121211F1F1F1F1E1E1E1A
+ 1A1A1A181817180D0D0D0C0C33333109050303530053535151889796834E4E4E
+ 214E4E214E21212121211F1F1E1E1E1E1A1A1A1A181817180D0D0D0C3333330F
+ 0909034E00535351519A9797844E4E4E4E4E214E214E212121211F1F1F1E1E1E
+ 1E1A1A1A1A181817180D0D0D3A3A33120909030900535353519B99988B4E4E4E
+ 4E4E4E4E214E214E2121211F1F1F1E1E1E1E1A1A1A1A181817180D0D3A3A3327
+ 0909090300535353539B9A998C514E4E4E4E4E214E214E21212121211F1F1F1E
+ 1E1E1E1A1A1A1A181817180D3A3A3A270909090900535353539B9B9A8C51514E
+ 4E4E4E4E4E4E214E214E2121211F1F1F1E1E1E1E1A1A1A1A181817293B3A3A27
+ 09090909005D535353A19B9B905151514E4E4E4E4E4E4E214E21212121211F1F
+ 1F1E1E2D382E2E2D3533673B3B3B3A270C0D0909005D5D5D539EA19C9B8F5B51
+ 514E4E4E4E4E214E214E214E2121211F1F1F1E306A6A676A676767673B3B3B13
+ 0D0C0D1F005D5D535D9DA1A09B9B9A8A8D8C58574B4E4E4E4E214E2121212121
+ 1F1F1F306A6A6A6767676767673B3B150D0D0951005D5D5D5394A1A1A19B9B9A
+ 99989796964E4E4E4E4E214E214E2121211F1F306D6A6A6A6A67676767673B18
+ 0D0D0D6600665D5D5D5CA3A3A1A09C9B9A999897964E4E4E4E214E214E21214C
+ 21211F306D6A6A6A676A6A67676735180D180D0000AC5D5D5D5D9FA3A2A1A09B
+ 9B9A9998974E4E4E4E4E4E4E214E214C212121406D6D6A6A6A6A676A67672A18
+ 180D0D00000060605D5D94A5A3A3A1A09C9B9A99985A4E4E4E4E4E4E4E214E21
+ 4E2121716D6D6D6D6A6A676A67671A1818184E000000645D605D5FA6A5A3A2A1
+ A09B9B9A999886564E4E4E4E214E214E2142716F6F6F6D6D6A6A6A6A672E1A18
+ 18180000000000605D605D95A8A5A3A3A1A09C9B9A9A989796877A4A4A787776
+ 7474706F6F6F6D6D6D6D6A6A671E1A1A181F000000000064605D605DA4A8A5A3
+ A2A1A09B9B9A9998979681807F7D7D75757474726F6F6F6D6D6D6A6A411E1A1A
+ 1A0000000000000060605D6062A7A8A5A3A3A1A09C9B9A9998979681807F7D7D
+ 75757474726F6F6F6F6D6D381F1A1E1A21000000000000006660605D6092A8A8
+ A5A3A2A1A09B9B9A9998979681807F7D7D7575747472706F6F6D6C1F1F1E1E1A
+ 000000000000000000606060605D92A9A8A5A3A3A1A09C9B9A9998979681807F
+ 7D7D75757474726F6F6C1F1F1F1E1E5D000000000000000000AF606060606092
+ A8A8A5A3A2A1A09B9B9A9998979681807F7D7D757574747271431F1F1F1F2100
+ 00000000000000000000AE6060605D6062A4A8A5A3A3A1A09C9B9A9998979681
+ 807F7D7D757574454C214C1F1F4E00000000000000000000000000AA60606060
+ 5D5D95A7A5A3A1A1A09C9B9A9998979681807F7D7D77444C4C214C4C4E000000
+ 000000000000000000000000AE60606060605D5F949FA3A3A1A09B9B9A999897
+ 9681807A4B4E4C4E214E1F4D0000000000000000000000000000000000AF6060
+ 605D605D5D5D91939D9EA19B9B9A99898559504E4E4E4E4C4C4C5D0000000000
+ 000000000000000000000000000000666060605D5D5D5D535353535353515151
+ 514E514E4E4E4E4C4EAB00000000000000000000000000000000000000000000
+ 006060605D5D5D5D5D535353535351515151514E4E4E4E640000000000000000
+ 000000000000000000000000000000000000AF6460605D5D5D5D5D5353535353
+ 515151514E660000000000000000000000000000000000000000000000000000
+ 0000000000AE605D5D5D535D5353535353516600000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000FFFFE007FFFF0000FFFF0000
+ 7FFF0000FFFC00001FFF0000FFF0000007FF0000FFC0000003FF0000FF800000
+ 00FF0000FF000000007F0000FE000000003F0000FC000000001F0000F8000000
+ 001F0000F0000000000F0000F000000000070000E000000000070000E0000000
+ 00030000C000000000030000C000000000010000C00000000001000080000000
+ 0001000080000000000100008000000000000000800000000000000080000000
+ 0000000080000000000000008000000000000000800000000000000080000000
+ 0000000080000000000000008000000000000000800000000000000080000000
+ 000100008000000000010000C000000000010000C000000000030000E0000000
+ 00030000E000000000070000F000000000070000F0000000000F0000F8000000
+ 000F0000F8000000001F0000FC000000003F0000FE000000007F0000FF000000
+ 00FF0000FF80000001FF0000FFE0000003FF0000FFF800000FFF0000FFFC0000
+ 3FFF0000FFFF8001FFFF0000FFFFFFFFFFFF0000280000002000000040000000
+ 0100080000000000000400000000000000000000000100000001000000000000
+ 06060600090909000C0C0C000A170A000D130D000F160F000C190C0011111100
+ 1414140012181200181818001D1D1D000C260C000B2B0B000E280E0007340700
+ 0A310A00102B1000122D12001B2A1B0014311400153A1500173D17001D351D00
+ 1E3F1E002222220026262600292929002E2E2E003232320034343400353E3500
+ 3A3A3A003D3D3D00064906000A490A00025502000F560F001043100016451600
+ 13531300016101000067000000690000006D0000066A0600046F04000B610B00
+ 08650800096909000A6F0A00007200000075000000780000007D000015661500
+ 147D150021442100335034003653380026732A003F5240004141410045454500
+ 494949004E4E4E004558470049534B005151510056565600595959005D5D5D00
+ 4369490044744C00427C4B00437C4D006262620065656500636D660068686800
+ 6F6F6F0072727200777777007C7C7C000081000000860000008A0000008E0000
+ 0A820A000091000000950000029B03001083110008A10C000DA6140013AC1D00
+ 1F92270024972E002D8D3700299B350019B226001EB72E002EA03C0024BD3700
+ 2AC23F003B8746003D934C0033A5430037AA4A002EB441003CAF510041844C00
+ 4A835600428F50004197500041B3570041B4580046B85E005C83670063927200
+ 57A36B004ABC650050B96B005FAB760062AE7C0030C8480037C6510035CE5100
+ 3DCC59003BD3590042D1610041D9620046DF6B004CE4730052EA7C0058E68200
+ 5DEC8A0057F085005DF58D008282820085858500888888008D8D8D0090909000
+ 99999900A0A0A000ACACAC000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000052400B0909091C4100000000000000000000000000000000
+ 0000000000521B1B0B0B0B0B0909080808004100000000000000000000000000
+ 0000008E1C1C1B1B1B1B0B0B0B09090808080008400000000000000000000000
+ 0000471C1E1C1C1826313635352D2A230E080800000900000000000000000000
+ 00401E1E1E1C1C192930363635352D2D312A1008080000000000000000000000
+ 40211E1E1E1E1C1C1C1B18353535352D2D313125040800080000000000000051
+ 212121211E1E1E1C1C1C1B3236363535230E0604040800000900000000000040
+ 402121211E1E1E1E1C1C1C32363636270B0B0909080808080040000000004540
+ 403C212121211E1E1E1C1C1C1B1817140B0B0B09090808010800000000004140
+ 3E6140212121211E1E1E1C1C1C1B1B1B1A0B0B0B09040D1008004100004E4141
+ 636240402121211E1E1E1E1C1C1C1B1B0B1B0B0B0B0B0D310808000000454144
+ 6864404040212121211E1E1E1C1C1B1B1B1B1B0B0B0B0E31100808000045454A
+ 696740402140212121211E1E1E1C1C1C1B1B0B1B0B0B152D2308014192454572
+ 7E6C41404040402121211E1E1E1E1C1C1C1B1B1B1A0B152D2A09040B8C474775
+ 806D414141404040212121211E1E1E1C1C1C1B1B0B1B15352D0909098C474776
+ 826F41414140402140212121211E1E1E1C1C1C1B1B1A1735350B09098C47477A
+ 847545454141404040402121211E1E1E1E3A1C1C18272D35350B0B098E4E477B
+ 8583714541414141404040212121211E1E57575656365635360B0B0B004E4779
+ 8685848174736A43404040402121211E1E5A575756563656321B0B40004E4E77
+ 8786858482807E494140402140212121215A575757565636261B0B4E004E4E4E
+ 88878685848280704141404040402121205A5A5A57575656181B1B00008E4E4E
+ 7C8A87868584827F4C4441414040403B395C5A5A575757321B1B1B0000004E4E
+ 4F898A8786858482807E6E676462605F5E5C5C5A5A5A573A1C1B520000005451
+ 4E788B8A8786858482807E69686665605F5E5C5C5A5A381E1C1C000000000051
+ 4E4E7D8B8A8786858482807E69686665605F5E5C5C591E1E1E8E000000000093
+ 514E4E7D8B8A8786858482806969686665605F5E5D201E1E4700000000000000
+ 8E514E4E78898A8786858482807E69686665603D212121400000000000000000
+ 0091514E4E4F7C888786858482807E6968633E40402141000000000000000000
+ 000093514E4E4E4E77797B7A7675727044414040405100000000000000000000
+ 0000000054514E4E474E47474745454541414145000000000000000000000000
+ 0000000000008E4E4E4E474747474645454F0000000000000000000000000000
+ 000000000000000000008E8E8C8C9200000000000000000000000000FFF00FFF
+ FF8001FFFE00007FFC00003FF800001FF000000FE0000007E0000003C0000003
+ C000000180000001800000018000000000000000000000000000000000000000
+ 0000000080000000800000008000000180000001C0000001C0000003E0000003
+ E0000007F000000FF800001FFC00003FFF0000FFFFC003FFFFFC1FFF28000000
+ 1000000020000000010008000000000000010000000000000000000000010000
+ 00010000000000000A0A0A00090F09000F0F0F000E140E000C190C0013131300
+ 14141400111E1100181818001D1D1D00092F09000A390A00113311001B321B00
+ 22222200262626002B2B2B0021322100263626003030300034343400313A3100
+ 393939003E3E3E00044A04000B440B000E490E0005540500065A0600075F0700
+ 124912001848180014531400155915001E521E00006A0000066A0600096A0900
+ 0070000000750000007B0000146414001B631B00137B1300374A38002E713300
+ 2B78300043434300474747004C4C4C004A534B00575757005A5A5A005E5E5E00
+ 46634B004E6152004A7050004878510063636300656565006868680070707000
+ 757575007D7D7D000081000000860000008C00000B860C000092000001980100
+ 09A20E0014AD1F0022B1320020B830003A9048004B975B005D836800539F6600
+ 63A679002BC442003AC0540037CF530039C8530042DA64004DE6750063C28300
+ 59E8840059F187008A8A8A009191910098989800AAAAAA000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000003D110906033400000000000000003E11121F1B1A0C0503
+ 1500000000003615151220252828241902060000004018181514112129250D05
+ 0403150000312E1815151511120E0909060B03005A3349311818151111101009
+ 091C04343E3950313118151515111010091E0C03364C52323131181815111110
+ 101E1A06364E5438323131181515232226291B09594D5554534B311818182B43
+ 42421F095C3D575554513731312D2C454342123D003D4F58555452504A484745
+ 452A1100005C3D5658555452504A484744163D0000005B3D4F5755545250492F
+ 183600000000005C3D3D4D4E4C3A33314000000000000000005C5936363E5A00
+ 00000000F81F0000E0070000C003000080010000800100000000000000000000
+ 000000000000000000000000000000008001000080010000C0030000E0070000
+ F81F000028000000300000006000000001002000000000008025000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001E1E1E0F1C1C1C4F1B1B1B8F191919BF
+ 171717DF161616FF141414FF131313FF111111FF0F0F0FEF0E0E0EBF0D0D0D9F
+ 0B0B0B6F0A0A0A2F000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000002424240F2323235F212121CF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF
+ 191919FF171717FF161616FF141414FF131313FF111111FF0F0F0FFF0E0E0EFF
+ 0C0C0CFF0B0B0BFF090909DF0808088F0707071F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000002929290F
+ 2727277F262626EF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF
+ 1A1A1AFF191919FF171717FF161616FF141414FF131313FF111111FF0F0F0FFF
+ 0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606BF0505053F00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000002C2C2C5F2A2A2AEF
+ 292929FF272727FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF
+ 1C1C1CFF1A1A1AFF191919FF171717FF161616FF141414FF131313FF111111FF
+ 0F0F0FFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF0505059F
+ 0505050F00000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000003131310F2F2F2FAF2E2E2EFF2C2C2CFF
+ 2A2A2AFF292929FF272727FF262626FF242424FF222222FF212121FF193019FF
+ 143914FF0E480EFF0D460DFF0C450CFF0B430BFF0C3C0CFF0F2A0FFF111811FF
+ 111111FF0F0F0FFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF
+ 040404EF0404044F000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000003434342F323232DF303030FF2F2F2FFF2E2E2EFF
+ 2C2C2CFF2A2A2AFF292929FF272727FF174717FF0B620BFF027702FF007A00FF
+ 007800FF007600FF007400FF007300FF007100FF006F00FF006D00FF006B00FF
+ 035903FF093709FF0D1A0DFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF
+ 060606FF040404FF0303038F0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000003737372F353535EF343434FF323232FF303030FF2F2F2FFF
+ 2E2E2EFF2C2C2CFF2A2A2AFF243424FF145414FF135313FF096709FF007C00FF
+ 007A00FF007800FF007600FF007400FF007300FF007100FF006F00FF006D00FF
+ 006B00FF006900FF006700FF044B04FF0B1E0BFF0C0C0CFF0B0B0BFF090909FF
+ 080808FF060606FF040404FF0303039F00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000003A3A3A2F383838EF373737FF353535FF343434FF323232FF303030FF
+ 2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF
+ 164416FF027502FF007800FF007600FF007400FF007300FF007100FF006F00FF
+ 006D00FF006B00FF006900FF006700FF006600FF053F05FF0B120BFF0B0B0BFF
+ 090909FF080808FF060606FF040404FF0303039F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 3D3D3D2F3C3C3CEF3A3A3AFF383838FF373737FF353535FF343434FF323232FF
+ 303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF
+ 242424FF1A391AFF007A00FF007800FF007600FF007400FF007300FF007100FF
+ 006F00FF006D00FF006B00FF006900FF006700FF006600FF015A01FF0A1D0AFF
+ 0B0B0BFF090909FF080808FF060606FF040404FF0303038F0000000000000000
+ 000000000000000000000000000000000000000000000000000000004141410F
+ 3F3F3FCF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF
+ 323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF
+ 262626FF242424FF007C00FF007A00FF007800FF007600FF007400FF007300FF
+ 007100FF036403FF0B410BFF0F2A0FFF101D10FF111111FF0E150EFF0C190CFF
+ 0C0C0CFF0B0B0BFF090909FF080808FF060606FF040404FF0404044F00000000
+ 000000000000000000000000000000000000000000000000000000004242428F
+ 404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF
+ 343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF
+ 272727FF262626FF007E00FF007C00FF007A00FF007800FF007600FF007400FF
+ 0D460DFF191919FF171717FF161616FF141414FF131313FF111111FF0F0F0FFF
+ 0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF040404EF0505050F
+ 0000000000000000000000000000000000000000000000004545453F444444FF
+ 424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF
+ 353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF
+ 292929FF272727FF008000FF007E00FF007C00FF007A00FF007800FF007600FF
+ 1C1C1CFF1A1A1AFF191919FF171717FF161616FF141414FF131313FF111111FF
+ 0F0F0FFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF050505AF
+ 000000000000000000000000000000000000000000000000464646BF454545FF
+ 444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF
+ 373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF
+ 2A2A2AFF292929FF272727FF262626FF242424FF1A391AFF163D16FF104C10FF
+ 1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF161616FF141414FF131313FF
+ 111111FF0F0F0FFF0E0E0EFF0C0C0CFF0B0B0BFF090909FF080808FF060606FF
+ 0505053F000000000000000000000000000000004A4A4A3F484848FF474747FF
+ 454545FF444444FF39563BFF28742CFF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF
+ 383838FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF
+ 2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF212121FF
+ 1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF161616FF141414FF
+ 131313FF111111FF0F0F0FFF053F05FF0C0C0CFF0B0B0BFF090909FF080808FF
+ 060606BF000000000000000000000000000000004B4B4BBF4A4A4AFF484848FF
+ 474747FF454545FF22942AFF2B7730FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF
+ 3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF
+ 2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF
+ 212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF161616FF
+ 141414FF131313FF111111FF006600FF0A230AFF0C0C0CFF0B0B0BFF090909FF
+ 080808FF0707072F00000000000000004F4F4F1F4D4D4DFF4B4B4BFF4A4A4AFF
+ 484848FF3C6240FF1AB328FF2D7A33FF424242FF404040FF3F3F3FFF3D3D3DFF
+ 3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF
+ 2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF
+ 222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF171717FF
+ 161616FF141414FF131313FF006700FF044B04FF0E0E0EFF0C0C0CFF0B0B0BFF
+ 090909FF0808088F00000000000000005050506F4F4F4FFF4D4D4DFF4B4B4BFF
+ 4A4A4AFF2D973AFF1EB72EFF307C37FF444444FF424242FF404040FF3F3F3FFF
+ 3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF
+ 303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF
+ 242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF191919FF
+ 171717FF161616FF141414FF006900FF006700FF0D1A0DFF0E0E0EFF0C0C0CFF
+ 0B0B0BFF090909EF0000000000000000525252BF505050FF4F4F4FFF4D4D4DFF
+ 49534AFF26BE39FF22BB34FF327F3BFF454545FF444444FF424242FF404040FF
+ 3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF
+ 323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF
+ 262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF1A1A1AFF
+ 191919FF171717FF161616FF006B00FF006900FF074207FF0F0F0FFF0E0E0EFF
+ 0C0C0CFF0B0B0BFF0A0A0A2F00000000535353FF525252FF505050FF4F4F4FFF
+ 417A49FF2AC23FFF26BE39FF35823EFF474747FF454545FF444444FF424242FF
+ 404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF
+ 343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF
+ 272727FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF1C1C1CFF
+ 1A1A1AFF191919FF171717FF006D00FF006B00FF035903FF111111FF0F0F0FFF
+ 0E0E0EFF0C0C0CFF0B0B0B6F5656563F555555FF535353FF525252FF505050FF
+ 3C9B4CFF2DC644FF2AC23FFF388442FF484848FF474747FF454545FF444444FF
+ 424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF
+ 353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF
+ 292929FF272727FF262626FF242424FF222222FF212121FF1F1F1FFF1E1E1EFF
+ 1C1C1CFF1A1A1AFF191919FF006F00FF006D00FF006B00FF111811FF111111FF
+ 0F0F0FFF0E0E0EFF0C0C0CAF5858584F575757FF555555FF535353FF525252FF
+ 3BAE50FF31CA4AFF2DC644FF3B8745FF4A4A4AFF484848FF474747FF454545FF
+ 444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF
+ 373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF
+ 2A2A2AFF292929FF272727FF262626FF242424FF222222FF212121FF1F1F1FFF
+ 1E1E1EFF1C1C1CFF1A1A1AFF007100FF006F00FF006D00FF0F2A0FFF131313FF
+ 111111FF0F0F0FFF0E0E0EBF5959597F585858FF575757FF555555FF535353FF
+ 39D156FF35CD50FF31CA4AFF3D8949FF4B4B4BFF4A4A4AFF484848FF474747FF
+ 454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF
+ 383838FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF2E2E2EFF
+ 2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF212121FF
+ 1F1F1FFF1E1E1EFF1C1C1CFF007300FF007100FF006F00FF0C3C0CFF141414FF
+ 131313FF111111FF0F0F0FFF5B5B5B7F595959FF585858FF575757FF555555FF
+ 3DD55BFF39D156FF35CD50FF408C4DFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF
+ 474747FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF
+ 3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF2F2F2FFF
+ 2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF222222FF
+ 212121FF1F1F1FFF1E1E1EFF007400FF007300FF007100FF0B430BFF161616FF
+ 141414FF131313FF111111FF5C5C5C7F5B5B5BFF595959FF585858FF575757FF
+ 40D961FF3DD55BFF39D156FF438F51FF4F4F4FFF4D4D4DFF4B4B4BFF4A4A4AFF
+ 484848FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF
+ 3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF303030FF
+ 2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF242424FF
+ 222222FF212121FF1F1F1FFF007600FF007400FF007300FF0C450CFF171717FF
+ 161616FF141414FF131313FF5E5E5E7F5D5D5DFF5B5B5BFF595959FF585858FF
+ 44DD67FF40D961FF3DD55BFF459254FF505050FF4F4F4FFF4D4D4DFF4B4B4BFF
+ 4A4A4AFF484848FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF
+ 3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF323232FF
+ 303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF262626FF
+ 242424FF202820FF0C590CFF007800FF007600FF007400FF0D460DFF191919FF
+ 171717FF161616FF141414FF6060607F5E5E5EFF5D5D5DFF5B5B5BFF595959FF
+ 48E06DFF44DD67FF40D961FF45A459FF525252FF505050FF4F4F4FFF4D4D4DFF
+ 4B4B4BFF4A4A4AFF484848FF474747FF454545FF444444FF424242FF404040FF
+ 3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF343434FF
+ 323232FF303030FF1D511DFF0E6D0EFF155A15FF155815FF145614FF0E600EFF
+ 076F07FF007E00FF007C00FF007A00FF007800FF007600FF0E480EFF1A1A1AFF
+ 191919FF171717FF161616FF6161617F606060FF5E5E5EFF5D5D5DFF5B5B5BFF
+ 4CDB71FF48E06DFF44DD67FF40D961FF479C58FF4F6252FF505050FF4F4F4FFF
+ 4D4D4DFF4B4B4BFF4A4A4AFF484848FF474747FF454545FF444444FF424242FF
+ 404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF353535FF
+ 343434FF323232FF185F18FF008B00FF008900FF008700FF008500FF008400FF
+ 008200FF008000FF007E00FF007C00FF007A00FF007800FF143914FF1C1C1CFF
+ 1A1A1AFF191919FF171717DF6262623F616161FF606060FF5E5E5EFF5D5D5DFF
+ 52C470FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF3EB955FF419751FF
+ 408C4DFF456B4BFF436948FF416746FF484848FF474747FF454545FF444444FF
+ 424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF373737FF
+ 353535FF343434FF196019FF008D00FF008B00FF008900FF008700FF008500FF
+ 008400FF008200FF008000FF007E00FF007C00FF007A00FF193019FF1E1E1EFF
+ 1C1C1CFF1A1A1AFF191919BF6464641F636363FF616161FF606060FF5E5E5EFF
+ 58A46DFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF
+ 35CD50FF31CA4AFF2DC644FF2AC23FFF4A4A4AFF484848FF474747FF454545FF
+ 444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF383838FF
+ 373737FF353535FF1A621AFF008F00FF008D00FF008B00FF008900FF008700FF
+ 008500FF008400FF008200FF008000FF007E00FF027702FF212121FF1F1F1FFF
+ 1E1E1EFF1C1C1CFF1B1B1B8F00000000656565DF636363FF616161FF606060FF
+ 5D7965FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF
+ 39D156FF35CD50FF31CA4AFF2DC644FF4B4B4BFF4A4A4AFF484848FF474747FF
+ 454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF3A3A3AFF
+ 383838FF373737FF1B641BFF009100FF008F00FF008D00FF008B00FF008900FF
+ 008700FF008500FF008400FF008200FF008000FF0B620BFF222222FF212121FF
+ 1F1F1FFF1E1E1EFF1C1C1C5F000000006666669F656565FF636363FF616161FF
+ 606060FF58DD7FFF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF
+ 3DD55BFF39D156FF35CD50FF31CA4AFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF
+ 474747FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF3C3C3CFF
+ 3A3A3AFF383838FF1B661BFF009300FF009100FF008F00FF008D00FF008B00FF
+ 008900FF008700FF008500FF008400FF008200FF174717FF242424FF222222FF
+ 212121FF1F1F1FFF1E1E1E0F000000006767674F666666FF656565FF636363FF
+ 616161FF5DA974FF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF
+ 40D961FF3DD55BFF39D156FF35CD50FF447D4EFF4D4D4DFF4B4B4BFF4A4A4AFF
+ 484848FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF3D3D3DFF
+ 3C3C3CFF3A3A3AFF0E7F0EFF009500FF009300FF009100FF008F00FF008D00FF
+ 008B00FF008900FF008700FF008500FF027E02FF272727FF262626FF242424FF
+ 222222FF212121CF000000000000000000000000686868EF666666FF656565FF
+ 636363FF616B64FF5BEA87FF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF
+ 44DD67FF40D961FF3DD55BFF39D156FF35CD50FF3C9C4DFF47644CFF4B4B4BFF
+ 4A4A4AFF484848FF474747FF454545FF444444FF424242FF404040FF3F3F3FFF
+ 2C5C2EFF128413FF009900FF009700FF009500FF009300FF009100FF008F00FF
+ 008D00FF008B00FF008900FF008700FF155815FF292929FF272727FF262626FF
+ 242424FF2323235F0000000000000000000000006969697F686868FF666666FF
+ 656565FF636363FF60AC78FF5BF38AFF57EF84FF53EC7EFF50E878FF4CE473FF
+ 48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF
+ 32A442FF2FA13EFF35823EFF327F3BFF2D8335FF22942BFF1F9126FF0FA817FF
+ 0BA411FF07A00BFF049D05FF009900FF009700FF009500FF009300FF009100FF
+ 008F00FF008D00FF008B00FF028402FF293229FF2A2A2AFF292929FF272727FF
+ 262626EF2424240F0000000000000000000000006A6A6A1F696969EF686868FF
+ 666666FF656565FF636363FF5FDA86FF5BF38AFF57EF84FF53EC7EFF50E878FF
+ 4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF
+ 2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF1AB328FF16AF22FF13AC1CFF
+ 0FA817FF0BA411FF07A00BFF049D05FF009900FF009700FF009500FF009300FF
+ 009100FF008F00FF008D00FF204C20FF2E2E2EFF2C2C2CFF2A2A2AFF292929FF
+ 2727277F00000000000000000000000000000000000000006A6A6A7F696969FF
+ 686868FF666666FF656565FF637F6CFF5FED8CFF5BF38AFF57EF84FF53EC7EFF
+ 50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF
+ 31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF1AB328FF16AF22FF
+ 13AC1CFF0FA817FF0BA411FF07A00BFF049D05FF009900FF009700FF009500FF
+ 009300FF009100FF136C13FF303030FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AEF
+ 2929290F00000000000000000000000000000000000000006B6B6B0F6A6A6ADF
+ 696969FF686868FF666666FF656565FF629B75FF5FF78FFF5BF38AFF57EF84FF
+ 53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF
+ 35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF1AB328FF
+ 16AF22FF13AC1CFF0FA817FF0BA411FF07A00BFF049D05FF009900FF009700FF
+ 009500FF0A810AFF343434FF323232FF303030FF2F2F2FFF2E2E2EFF2C2C2C6F
+ 000000000000000000000000000000000000000000000000000000006B6B6B3F
+ 6A6A6AFF696969FF686868FF666666FF656565FF629B75FF5FF78FFF5BF38AFF
+ 57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF3DD55BFF
+ 39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF1EB72EFF
+ 1AB328FF16AF22FF13AC1CFF0FA817FF0BA411FF07A00BFF049D05FF009900FF
+ 0A850AFF333D33FF353535FF343434FF323232FF303030FF2F2F2FBF00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 6B6B6B8F6A6A6AFF696969FF686868FF666666FF656565FF629B75FF5FF78FFF
+ 5BF38AFF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF40D961FF
+ 3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF22BB34FF
+ 1EB72EFF1AB328FF16AF22FF13AC1CFF0FA817FF0BA411FF07A00BFF128413FF
+ 364036FF383838FF373737FF353535FF343434FF323232EF3131310F00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000006B6B6B9F6A6A6AFF696969FF686868FF666666FF656565FF637F6CFF
+ 5FDA86FF5BF38AFF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF44DD67FF
+ 40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF26BE39FF
+ 22BB34FF1EB72EFF1AB328FF16AF22FF13AC1CFF0FA817FF257127FF3D3D3DFF
+ 3C3C3CFF3A3A3AFF383838FF373737FF353535EF3434342F0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000006B6B6B0F6B6B6BCF6A6A6AFF696969FF686868FF666666FF656565FF
+ 636363FF60AC78FF5BEA87FF57EF84FF53EC7EFF50E878FF4CE473FF48E06DFF
+ 44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF2AC23FFF
+ 26BE39FF22BB34FF1EB72EFF1AB328FF22942AFF39563BFF404040FF3F3F3FFF
+ 3D3D3DFF3C3C3CFF3A3A3AFF383838EF3737372F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000006B6B6B0F6B6B6B9F6A6A6AFF696969FF686868FF666666FF
+ 656565FF636363FF616B64FF5DA974FF58DD7FFF53EC7EFF50E878FF4CE473FF
+ 48E06DFF44DD67FF40D961FF3DD55BFF39D156FF35CD50FF31CA4AFF2DC644FF
+ 2AC23FFF26BE39FF2D973AFF3C6240FF454545FF444444FF424242FF404040FF
+ 3F3F3FFF3D3D3DFF3C3C3CEF3A3A3A2F00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000006B6B6B8F6A6A6AFF696969FF686868FF
+ 666666FF656565FF636363FF616161FF606060FF5C8267FF58A46DFF52C470FF
+ 4CDB71FF48E06DFF44DD67FF40D961FF3DD55BFF39D156FF3AB650FF3C9B4CFF
+ 417A49FF49534AFF4A4A4AFF484848FF474747FF454545FF444444FF424242FF
+ 404040FF3F3F3FCF3D3D3D2F0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000006B6B6B3F6A6A6ADF696969FF
+ 686868FF666666FF656565FF636363FF616161FF606060FF5E5E5EFF5D5D5DFF
+ 5B5B5BFF595959FF585858FF575757FF555555FF535353FF525252FF505050FF
+ 4F4F4FFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF474747FF454545FF444444FF
+ 4242428F4141410F000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000006B6B6B0F6A6A6A7F
+ 696969FF686868FF666666FF656565FF636363FF616161FF606060FF5E5E5EFF
+ 5D5D5DFF5B5B5BFF595959FF585858FF575757FF555555FF535353FF525252FF
+ 505050FF4F4F4FFF4D4D4DFF4B4B4BFF4A4A4AFF484848FF464646BF4545453F
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 6A6A6A1F6969698F686868EF666666FF656565FF636363FF616161FF606060FF
+ 5E5E5EFF5D5D5DFF5B5B5BFF595959FF585858FF575757FF555555FF535353FF
+ 525252FF505050FF4F4F4FFF4D4D4DFF4B4B4BBF4A4A4A3F0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000006767674F6666669F656565EF636363FF616161FF
+ 606060FF5E5E5EFF5D5D5DFF5B5B5BFF595959FF585858FF575757FF555555FF
+ 535353FF525252BF5050506F4F4F4F1F00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000006464641F6262623F
+ 6161617F6060607F5E5E5E7F5C5C5C7F5B5B5B7F5959597F5858585F5656563F
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000FFFF8001FFFF0000FFFC00003FFF0000FFF00000
+ 0FFF0000FFE0000003FF0000FF80000001FF0000FF00000000FF0000FE000000
+ 007F0000FC000000003F0000F8000000001F0000F0000000000F0000F0000000
+ 00070000E000000000070000E000000000030000C000000000030000C0000000
+ 0001000080000000000100008000000000010000800000000000000080000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000800000000000000080000000
+ 000000008000000000010000C000000000010000C000000000010000C0000000
+ 00030000E000000000030000E000000000070000F0000000000F0000F8000000
+ 000F0000FC000000001F0000FC000000003F0000FE000000007F0000FF800000
+ 00FF0000FFC0000001FF0000FFE0000007FF0000FFF800001FFF0000FFFF0000
+ 7FFF0000FFFFE007FFFF00002800000020000000400000000100200000000000
+ 8010000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000002121210F
+ 1F1F1F5F1D1D1D9F1A1A1ACF181818FF151515FF131313FF101010FF0E0E0EDF
+ 0C0C0CBF0A0A0A6F0808081F0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000002929291F2626269F232323FF
+ 212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF101010FF
+ 0E0E0EFF0C0C0CFF090909FF070707BF0606063F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000002D2D2D8F2A2A2AFF282828FF262626FF
+ 232323FF212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF
+ 101010FF0E0E0EFF0C0C0CFF090909FF070707FF050505BF0404041F00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000003434341F323232CF2F2F2FFF2D2D2DFF2A2A2AFF282828FF
+ 1E371EFF0F560FFF086408FF007800FF007500FF007200FF006F00FF026102FF
+ 064906FF0B2B0BFF0E0E0EFF0C0C0CFF090909FF070707FF050505EF0303034F
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000003939392F363636EF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF
+ 1E3F1EFF135313FF0B610BFF007A00FF007800FF007500FF007200FF006F00FF
+ 006C00FF006900FF006100FF073407FF0C0C0CFF090909FF070707FF050505FF
+ 0303035F00000000000000000000000000000000000000000000000000000000
+ 3E3E3E0F3B3B3BEF393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF
+ 2A2A2AFF282828FF262626FF1D341DFF027502FF007800FF007500FF007200FF
+ 006F00FF006C00FF006900FF006700FF025502FF0A170AFF090909FF070707FF
+ 050505FF0303034F000000000000000000000000000000000000000000000000
+ 404040BF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF
+ 2D2D2DFF2A2A2AFF282828FF262626FF096709FF007A00FF007800FF007500FF
+ 007200FF0A490AFF102B10FF121812FF0F160FFF0C190CFF0C0C0CFF090909FF
+ 070707FF050505EF0404041F000000000000000000000000000000004444446F
+ 424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF
+ 2F2F2FFF2D2D2DFF2A2A2AFF282828FF096909FF007D00FF007A00FF007800FF
+ 104310FF1A1A1AFF181818FF151515FF131313FF101010FF0E0E0EFF0C0C0CFF
+ 090909FF070707FF050505BF0000000000000000000000004A4A4A0F474747EF
+ 444444FF424242FF365338FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF
+ 323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF1D341DFF173D17FF
+ 1B2A1BFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF101010FF0D130DFF
+ 0C0C0CFF090909FF070707FF0606063F00000000000000004B4B4B7F494949FF
+ 474747FF3F5240FF1F9227FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF
+ 343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF232323FF
+ 212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF151515FF131313FF0C260CFF
+ 073407FF0C0C0CFF090909FF070707BF00000000000000004E4E4EDF4B4B4BFF
+ 494949FF2D8D37FF24972EFF424242FF404040FF3D3D3DFF3B3B3BFF393939FF
+ 363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF
+ 232323FF212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF151515FF0E280EFF
+ 006100FF0E0E0EFF0C0C0CFF090909FF0808081F5252522F505050FF4E4E4EFF
+ 49534BFF24BD37FF299B35FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF
+ 393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF
+ 262626FF232323FF212121FF1F1F1FFF1C1C1CFF1A1A1AFF181818FF102B10FF
+ 006900FF0A310AFF0E0E0EFF0C0C0CFF0A0A0A6F5555556F535353FF505050FF
+ 44744CFF2AC23FFF2EA03CFF474747FF444444FF424242FF404040FF3D3D3DFF
+ 3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF
+ 282828FF262626FF232323FF212121FF1F1F1FFF1C1C1CFF1A1A1AFF122D12FF
+ 006C00FF064906FF101010FF0E0E0EFF0C0C0CBF5757578F555555FF535353FF
+ 428F50FF30C848FF33A543FF494949FF474747FF444444FF424242FF404040FF
+ 3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF2D2D2DFF
+ 2A2A2AFF282828FF262626FF232323FF212121FF1F1F1FFF1C1C1CFF143014FF
+ 006F00FF026102FF131313FF101010FF0E0E0EEF595959BF575757FF555555FF
+ 41B357FF35CE51FF37AA4AFF4B4B4BFF494949FF474747FF444444FF424242FF
+ 404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF2F2F2FFF
+ 2D2D2DFF2A2A2AFF282828FF262626FF232323FF212121FF1F1F1FFF153215FF
+ 007200FF006F00FF151515FF131313FF101010FF5C5C5CBF5A5A5AFF575757FF
+ 46B85EFF3BD359FF3CAF51FF4E4E4EFF4B4B4BFF494949FF474747FF444444FF
+ 424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF323232FF
+ 2F2F2FFF2D2D2DFF2A2A2AFF282828FF262626FF232323FF212121FF153A15FF
+ 007500FF007200FF181818FF151515FF131313FF5E5E5EBF5C5C5CFF5A5A5AFF
+ 4ABC65FF41D962FF41B458FF505050FF4E4E4EFF4B4B4BFF494949FF474747FF
+ 444444FF424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF343434FF
+ 323232FF2F2F2FFF214421FF2A2A2AFF282828FF1E371EFF164516FF046F04FF
+ 007800FF007500FF1A1A1AFF181818FF151515FF616161BF5F5F5FFF5C5C5CFF
+ 50B96BFF46DF6BFF42D161FF4A8356FF505050FF4E4E4EFF4B4B4BFF494949FF
+ 474747FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF393939FF363636FF
+ 343434FF323232FF008B00FF008900FF008600FF008300FF008000FF007D00FF
+ 007A00FF007800FF1C1C1CFF1A1A1AFF181818FF6363637F616161FF5F5F5FFF
+ 57A36BFF4CE473FF46DF6BFF41D962FF3DCC59FF3CAF51FF3D934CFF3B8746FF
+ 455847FF474747FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF393939FF
+ 363636FF343434FF008E00FF008B00FF008900FF008600FF008300FF008000FF
+ 007D00FF066A06FF1F1F1FFF1C1C1CFF1A1A1ACF6565655F636363FF616161FF
+ 5C8367FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF
+ 436949FF494949FF474747FF444444FF424242FF404040FF3D3D3DFF3B3B3BFF
+ 393939FF363636FF009100FF008E00FF008B00FF008900FF008600FF008300FF
+ 008000FF0F560FFF212121FF1F1F1FFF1D1D1DAF6767671F666666FF636363FF
+ 616161FF58E682FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF
+ 41844CFF4B4B4BFF494949FF474747FF444444FF424242FF404040FF3D3D3DFF
+ 3B3B3BFF353E35FF009400FF009100FF008E00FF008B00FF008900FF008600FF
+ 008300FF1E371EFF232323FF212121FF1F1F1F5F00000000676767BF666666FF
+ 636363FF5FAB76FF57F085FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF
+ 37C651FF437C4DFF49534BFF494949FF474747FF444444FF424242FF404040FF
+ 335034FF147D15FF009700FF009400FF009100FF008E00FF008B00FF008900FF
+ 0A6F0AFF282828FF262626FF232323FF2121210F000000006A6A6A5F686868FF
+ 666666FF636D66FF5DEC8AFF57F085FF52EA7CFF4CE473FF46DF6BFF41D962FF
+ 3BD359FF35CE51FF30C848FF2EB441FF2EA03CFF299B35FF24972EFF13AC1DFF
+ 0DA614FF08A10CFF029B03FF009700FF009400FF009100FF008E00FF008B00FF
+ 214421FF2A2A2AFF282828FF2626269F0000000000000000000000006A6A6ADF
+ 686868FF666666FF639272FF5DF58DFF57F085FF52EA7CFF4CE473FF46DF6BFF
+ 41D962FF3BD359FF35CE51FF30C848FF2AC23FFF24BD37FF1EB72EFF19B226FF
+ 13AC1DFF0DA614FF08A10CFF029B03FF009700FF009400FF009100FF156615FF
+ 2F2F2FFF2D2D2DFF2A2A2AFF2929291F0000000000000000000000006B6B6B3F
+ 6A6A6AFF686868FF666666FF62AE7CFF5DF58DFF57F085FF52EA7CFF4CE473FF
+ 46DF6BFF41D962FF3BD359FF35CE51FF30C848FF2AC23FFF24BD37FF1EB72EFF
+ 19B226FF13AC1DFF0DA614FF08A10CFF029B03FF009700FF0A820AFF343434FF
+ 323232FF2F2F2FFF2D2D2D8F0000000000000000000000000000000000000000
+ 6B6B6B8F6A6A6AFF686868FF666666FF62AE7CFF5DF58DFF57F085FF52EA7CFF
+ 4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF2AC23FFF24BD37FF
+ 1EB72EFF19B226FF13AC1DFF0DA614FF08A10CFF108311FF353E35FF363636FF
+ 343434FF323232CF3030300F0000000000000000000000000000000000000000
+ 000000006B6B6BBF6A6A6AFF686868FF666666FF639272FF5DEC8AFF57F085FF
+ 52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF2AC23FFF
+ 24BD37FF1EB72EFF19B226FF13AC1DFF26732AFF3D3D3DFF3B3B3BFF393939FF
+ 363636EF3434341F000000000000000000000000000000000000000000000000
+ 000000006B6B6B0F6B6B6BAF6A6A6AFF686868FF666666FF636D66FF5FAB76FF
+ 58E682FF52EA7CFF4CE473FF46DF6BFF41D962FF3BD359FF35CE51FF30C848FF
+ 2AC23FFF24BD37FF2D8D37FF3F5240FF424242FF404040FF3D3D3DFF3B3B3BEF
+ 3939392F00000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000006B6B6B8F6A6A6AFF686868FF666666FF636363FF
+ 616161FF5C8367FF57A36BFF50B96BFF4ABC65FF46B85EFF41B357FF419750FF
+ 427C4BFF49534BFF494949FF474747FF444444FF424242FF404040BF3E3E3E0F
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000006B6B6B3F6A6A6ADF686868FF666666FF
+ 636363FF616161FF5F5F5FFF5C5C5CFF5A5A5AFF575757FF555555FF535353FF
+ 505050FF4E4E4EFF4B4B4BFF494949FF474747EF4444446F0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000006A6A6A5F676767BF
+ 666666FF636363FF616161FF5F5F5FFF5C5C5CFF5A5A5AFF575757FF555555FF
+ 535353FF505050FF4E4E4EDF4B4B4B7F4A4A4A0F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 6767671F6565655F6363637F616161BF5E5E5EBF5C5C5CBF595959BF5757578F
+ 5555556F5252522F000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000FFC003FFFF0000FFFE00003F
+ F800001FF000000FE0000007E0000003C0000003800000018000000180000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000008000000080000001C0000001C0000003E0000003F0000007
+ F000000FFC00001FFE00007FFF8000FFFFE007FF280000001000000020000000
+ 0100200000000000400400000000000000000000000000000000000000000000
+ 0000000000000000000000002727273F222222AF1D1D1DEF181818FF131313FF
+ 0F0F0FFF0B0B0BAF0707075F0000000000000000000000000000000000000000
+ 000000003535350F303030AF2B2B2BFF213221FF124912FF0E490EFF0B440BFF
+ 0A390AFF0C190CFF0A0A0AFF060606CF0404041F000000000000000000000000
+ 3E3E3E0F393939CF343434FF303030FF263626FF184818FF066A06FF007500FF
+ 007000FF006A00FF044A04FF090F09FF050505EF0404041F0000000000000000
+ 424242AF3E3E3EFF393939FF343434FF303030FF2B2B2BFF145314FF007B00FF
+ 017001FF113311FF111E11FF0E140EFF0A0A0AFF060606CF000000004B4B4B3F
+ 474747FF2E7133FF3E3E3EFF393939FF343434FF303030FF2B2B2BFF223222FF
+ 1B321BFF1D1D1DFF181818FF131313FF092F09FF0A0A0AFF0707075F5050509F
+ 4A534BFF22B132FF434343FF3E3E3EFF393939FF343434FF303030FF2B2B2BFF
+ 262626FF222222FF1D1D1DFF181818FF055405FF0C190CFF0B0B0BAF555555CF
+ 4A7050FF2BC442FF474747FF434343FF3E3E3EFF393939FF343434FF303030FF
+ 2B2B2BFF262626FF222222FF1D1D1DFF065A06FF0A390AFF0F0F0FFF5A5A5AFF
+ 4B975BFF37CF53FF4C4C4CFF474747FF434343FF3E3E3EFF393939FF343434FF
+ 303030FF2B2B2BFF262626FF222222FF075F07FF0B440BFF131313FF5F5F5FFF
+ 539F66FF42DA64FF4E6152FF4C4C4CFF474747FF434343FF3E3E3EFF393939FF
+ 343434FF1E521EFF155915FF096A09FF007B00FF0E490EFF181818FF636363BF
+ 5D8368FF4DE675FF42DA64FF39C853FF3A9048FF474747FF434343FF3E3E3EFF
+ 393939FF1B631BFF008C00FF008600FF008100FF124912FF1D1D1DFF6868688F
+ 646464FF59E884FF4DE675FF42DA64FF3AC054FF46634BFF474747FF434343FF
+ 374A38FF137B13FF009200FF008C00FF008600FF213221FF222222AF6A6A6A1F
+ 686868FF63A679FF59F187FF4DE675FF42DA64FF37CF53FF2BC442FF20B830FF
+ 14AD1FFF09A20EFF019801FF009200FF146414FF2B2B2BFF2727273F00000000
+ 6A6A6A8F686868FF63C283FF59F187FF4DE675FF42DA64FF37CF53FF2BC442FF
+ 20B830FF14AD1FFF09A20EFF0B860CFF313A31FF303030BF0000000000000000
+ 000000006A6A6AAF686868FF63A679FF59E884FF4DE675FF42DA64FF37CF53FF
+ 2BC442FF22B132FF2B7830FF3E3E3EFF393939CF3535350F0000000000000000
+ 00000000000000006A6A6A8F686868FF646464FF5D8368FF539F66FF4B975BFF
+ 487851FF4A534BFF474747FF424242AF3E3E3E0F000000000000000000000000
+ 0000000000000000000000006A6A6A1F6868688F636363BF5F5F5FFF5A5A5AFF
+ 555555CF5050509F4B4B4B3F00000000000000000000000000000000F00F0000
+ C003000080010000800100000000000000000000000000000000000000000000
+ 00000000000000000000000080010000C0010000E0030000F00F0000}
+ end
+ inherited Label1: TLabel
+ Width = 232
+ Caption = 'New Data Abstract Server Project Wizard'
+ end
+ inherited Label2: TLabel
+ Width = 483
+ Caption =
+ 'This wizard will guide you through the configuration of your Dat' +
+ 'a Abstract client and server projects.'
+ end
+ end
+ inherited pc_Pages: TPageControl
+ Width = 569
+ Height = 214
+ ActivePage = ts_SM
+ inherited ts_Welcome: TTabSheet
+ inherited Label3: TLabel
+ Width = 324
+ Caption = 'Welcome to the New Data Abstract Server Project Wizard'
+ end
+ inherited Label4: TLabel
+ Width = 483
+ Caption =
+ 'This wizard will guide you through the configuration of your Dat' +
+ 'a Abstract client and server projects.'
+ end
+ object Label7: TLabel
+ Left = 24
+ Top = 56
+ Width = 332
+ Height = 13
+ Caption =
+ 'To complete this task, the wizard will run through the following' +
+ ' steps:'
+ end
+ object Label8: TLabel
+ Left = 32
+ Top = 72
+ Width = 256
+ Height = 13
+ Caption = '- Launch Schema Modeler and configure your Schema'
+ end
+ object Label9: TLabel
+ Left = 32
+ Top = 88
+ Width = 198
+ Height = 13
+ Caption = '- Build and launch your Server application'
+ end
+ object Label10: TLabel
+ Left = 32
+ Top = 104
+ Width = 161
+ Height = 13
+ Caption = '- Add Data Tables to your project'
+ end
+ end
+ object ts_SM: TTabSheet [1]
+ Caption = 'ts_SM'
+ ImageIndex = 2
+ object Label11: TLabel
+ Left = 8
+ Top = 8
+ Width = 371
+ Height = 13
+ Caption = 'Step 1: Run Schema Modeler to define and configure your Schema'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label12: TLabel
+ Left = 24
+ Top = 24
+ Width = 381
+ Height = 13
+ Caption =
+ 'As the first step, the wizard will launch Schema Modeler to defi' +
+ 'ne your Schema.'
+ end
+ object Label13: TLabel
+ Left = 24
+ Top = 56
+ Width = 448
+ Height = 26
+ Caption =
+ 'The Schema Modeler provides a very easy visual interface for man' +
+ 'aging the connections and datasets available on the server and w' +
+ 'hich of those are accessible by clients.'
+ WordWrap = True
+ end
+ object lbl_SMLaunching: TLabel
+ Left = 24
+ Top = 104
+ Width = 506
+ Height = 13
+ Caption =
+ 'Please follow steps in Schema Modeler and close the modeler to c' +
+ 'ontinue with this wizard.'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ Transparent = True
+ Visible = False
+ end
+ object Label15: TLabel
+ Left = 8
+ Top = 175
+ Width = 497
+ Height = 13
+ Caption =
+ 'Tip: You can always launch Schema Modeler again by simply double' +
+ '-clicking the TDASchema component.'
+ end
+ object lbl_SMClickNext: TLabel
+ Left = 24
+ Top = 104
+ Width = 229
+ Height = 13
+ Caption = 'Click "Next >>" now to launch Schema Modeler.'
+ Transparent = True
+ end
+ end
+ object ts_Compile: TTabSheet [2]
+ Caption = 'ts_Compile'
+ ImageIndex = 3
+ object Label16: TLabel
+ Left = 8
+ Top = 8
+ Width = 290
+ Height = 13
+ Caption = 'Step 2: Compile and Launch Your Server Application'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label17: TLabel
+ Left = 24
+ Top = 24
+ Width = 408
+ Height = 13
+ Caption =
+ 'As the second step, the wizard will now compile your server appl' +
+ 'ication and launch it.'
+ end
+ object lbl_CompileBuilding: TLabel
+ Left = 24
+ Top = 104
+ Width = 124
+ Height = 13
+ Caption = 'Compiling Project(s)...'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ Transparent = True
+ Visible = False
+ end
+ object Label19: TLabel
+ Left = 24
+ Top = 56
+ Width = 441
+ Height = 26
+ Caption =
+ 'This will allow your client code to connect to the live server a' +
+ 's you proceed to configure the client application.'
+ WordWrap = True
+ end
+ object lbl_CompileClickNext: TLabel
+ Left = 24
+ Top = 104
+ Width = 253
+ Height = 13
+ Caption = 'Click "Next >>" now to build and launch your server.'
+ Transparent = True
+ end
+ object lbl_CompileLaunching: TLabel
+ Left = 24
+ Top = 104
+ Width = 173
+ Height = 13
+ Caption = 'Launching Server Application...'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ Transparent = True
+ Visible = False
+ end
+ end
+ object ts_DataTables: TTabSheet [3]
+ Caption = 'ts_DataTables'
+ ImageIndex = 4
+ object Label18: TLabel
+ Left = 8
+ Top = 8
+ Width = 300
+ Height = 13
+ Caption = 'Step 3: Create Data Tables components for your data'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label20: TLabel
+ Left = 24
+ Top = 24
+ Width = 485
+ Height = 26
+ Caption =
+ 'Finally, the wizard will launch the Create Data Tables dialog, w' +
+ 'hich wll allow you to add one ore more TDADataTable components t' +
+ 'o your client project to access your data.'
+ WordWrap = True
+ end
+ object Label21: TLabel
+ Left = 8
+ Top = 175
+ Width = 533
+ Height = 13
+ Caption =
+ 'Tip: You can invoke this dialog again by right-clicking the Remo' +
+ 'teDataAdapter component on your data module.'
+ end
+ object lbl_DataTableClickNext: TLabel
+ Left = 24
+ Top = 104
+ Width = 171
+ Height = 13
+ Caption = 'Click "Next >>" to launch the dialog'
+ end
+ end
+ object ts_FinishMulti: TTabSheet [4]
+ Caption = 'ts_FinishMulti'
+ ImageIndex = 5
+ object Label30: TLabel
+ Left = 24
+ Top = 175
+ Width = 342
+ Height = 13
+ Caption =
+ 'Also make sure to check our articles and FAQ on the web for more' +
+ ' info:'
+ end
+ object Label31: TLabel
+ Left = 370
+ Top = 175
+ Width = 153
+ Height = 13
+ Cursor = crHandPoint
+ Caption = 'http://www.remobjects.com?da'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clBlue
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsUnderline]
+ ParentFont = False
+ OnClick = lb_LinkClick
+ end
+ object Label22: TLabel
+ Left = 8
+ Top = 8
+ Width = 49
+ Height = 13
+ Caption = 'That'#39's it!'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label23: TLabel
+ Left = 24
+ Top = 24
+ Width = 503
+ Height = 26
+ Caption =
+ 'You'#39're now ready to build your client application according to t' +
+ 'he standard Delphi TDataSet practices you are used to.'
+ WordWrap = True
+ end
+ object Label24: TLabel
+ Left = 24
+ Top = 56
+ Width = 490
+ Height = 26
+ Caption =
+ 'For example, you could drop a DataGrid or other data-aware compon' +
+ 'ents on your Main form and hook them up to the Data Tables that ' +
+ 'you created in the previous step.'
+ WordWrap = True
+ end
+ end
+ object ts_FinishServer: TTabSheet [5]
+ Caption = 'ts_FinishServer'
+ ImageIndex = 6
+ object Label25: TLabel
+ Left = 8
+ Top = 8
+ Width = 49
+ Height = 13
+ Caption = 'That'#39's it!'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label26: TLabel
+ Left = 24
+ Top = 24
+ Width = 248
+ Height = 13
+ Caption = 'Your Data Abstract server application is now ready.'
+ WordWrap = True
+ end
+ object Label28: TLabel
+ Left = 24
+ Top = 175
+ Width = 342
+ Height = 13
+ Caption =
+ 'Also make sure to check our articles and FAQ on the web for more' +
+ ' info:'
+ end
+ object lb_Link: TLabel
+ Left = 370
+ Top = 175
+ Width = 153
+ Height = 13
+ Cursor = crHandPoint
+ Caption = 'http://www.remobjects.com?da'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clBlue
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsUnderline]
+ ParentFont = False
+ OnClick = lb_LinkClick
+ end
+ end
+ end
+ inherited Panel2: TPanel
+ Top = 258
+ Width = 569
+ inherited btn_Finish: TBitBtn
+ Left = 489
+ end
+ inherited btn_Cancel: TBitBtn
+ Caption = 'Close'
+ end
+ inherited btn_Next: TBitBtn
+ Left = 489
+ end
+ inherited btn_Back: TBitBtn
+ Left = 409
+ Visible = False
+ end
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAGuideWizardForm.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAGuideWizardForm.pas
new file mode 100644
index 0000000..812138a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAGuideWizardForm.pas
@@ -0,0 +1,257 @@
+unit uDAGuideWizardForm;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - IDE Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, uROIDEPrjWizard, uEWWizard, StdCtrls, Buttons, ComCtrls,
+ ExtCtrls;
+
+type
+ TDAGuideWizardForm = class(TEWWizardForm)
+ Label7: TLabel;
+ Label8: TLabel;
+ Label9: TLabel;
+ Label10: TLabel;
+ ts_SM: TTabSheet;
+ ts_Compile: TTabSheet;
+ ts_DataTables: TTabSheet;
+ Label11: TLabel;
+ Label12: TLabel;
+ Label13: TLabel;
+ lbl_SMLaunching: TLabel;
+ Label15: TLabel;
+ Label16: TLabel;
+ Label17: TLabel;
+ lbl_CompileBuilding: TLabel;
+ Label19: TLabel;
+ lbl_CompileClickNext: TLabel;
+ lbl_CompileLaunching: TLabel;
+ Label18: TLabel;
+ Label20: TLabel;
+ Label21: TLabel;
+ lbl_DataTableClickNext: TLabel;
+ ts_FinishMulti: TTabSheet;
+ ts_FinishServer: TTabSheet;
+ Label25: TLabel;
+ Label26: TLabel;
+ Label28: TLabel;
+ lb_Link: TLabel;
+ Label30: TLabel;
+ Label31: TLabel;
+ Label22: TLabel;
+ Label23: TLabel;
+ Label24: TLabel;
+ lbl_SMClickNext: TLabel;
+ procedure lb_LinkClick(Sender: TObject);
+ private
+ fNewProjectInfo: TROIDENewProjectInfo;
+ fTempSchema, fTempConnections: string;
+ protected
+ procedure OnEnterPage(aPage:TTabSheet; aMovingForward:boolean); override;
+ procedure OnLeavePage(aPage:TTabSheet; aMovingForward:boolean); override;
+ public
+ constructor Create(aNewProjectInfo: TROIDENewProjectInfo); reintroduce;
+ destructor Destroy; override;
+ end;
+
+var
+ DAGuideWizardForm: TDAGuideWizardForm;
+
+implementation
+
+uses
+ ShellAPI,
+ uROIDETools, ToolsAPI, uROClasses, uDAIDEMenu, uDAClasses, uDAInterfaces,
+ uDAEngine, uDADataTableWizards, uDADataTable, uDADataAdapter;
+
+procedure OnNewProject(aNewProjectInfo: TROIDENewProjectInfo);
+begin
+ if Pos('DAGuideWizard', aNewProjectInfo.Wizard) <> 1 then exit;
+
+ //ShowMessage(Uppercase(aNewProjectInfo.TemplateName));
+ if not assigned(aNewProjectInfo.ClientProject) and (Uppercase(aNewProjectInfo.TemplateName) = 'LOCAL') then
+ aNewProjectInfo.ClientProject := aNewProjectInfo.ServerProject;
+
+ with TDAGuideWizardForm.Create(aNewProjectInfo) do try
+ ShowModal();
+ finally
+ Free;
+ end;
+end;
+
+{$R *.dfm}
+
+{ TTDAGuideWizardForm }
+
+constructor TDAGuideWizardForm.Create(aNewProjectInfo: TROIDENewProjectInfo);
+begin
+ inherited Create(Application);
+ fNewProjectInfo := aNewProjectInfo;
+ fTempSchema := IncludeTrailingPathDelimiter(fNewProjectInfo.ProjectOptions.ProjectDir)+NewGuidAsString()+'.daSchema';
+ fTempConnections := ChangeFileExt(fTempSchema, '.daConnections');
+end;
+
+destructor TDAGuideWizardForm.Destroy;
+begin
+ if FileExists(fTempSchema) then DeleteFile(fTempSchema);
+ if FileExists(fTempConnections) then DeleteFile(fTempConnections);
+ inherited;
+end;
+
+procedure TDAGuideWizardForm.lb_LinkClick(Sender: TObject);
+begin
+ inherited;
+ ShellExecute(0, 'open', 'http://www.remobjects.com?da',nil, nil,SW_SHOWNORMAL);
+end;
+
+procedure TDAGuideWizardForm.OnEnterPage(aPage: TTabSheet; aMovingForward: boolean);
+begin
+ inherited;
+ btn_Back.Enabled := false;
+ btn_Cancel.Visible := (aPage <> ts_FinishMulti) and (aPage <> ts_FinishServer);
+ btn_Next.Visible := btn_Cancel.Visible;
+ btn_Finish.Visible := not btn_Next.Visible;
+ SetForegroundWindow(Self.Handle);
+end;
+
+function FindFormEditor(aModule: IOTAModule): IOTAFormEditor;
+var
+ i: integer;
+ lEditor: IOTAEditor;
+begin
+ for i := 0 to aModule.ModuleFileCount-1 do begin
+ lEditor := aModule.ModuleFileEditors[i];
+ if Supports(lEditor, IOTAFormEditor, result) then exit;
+ end;
+end;
+
+function FindFormInProject(aProject: IOTAProject; aName: string): IOTAFormEditor;
+var
+ i: integer;
+ lModule: IOTAModule;
+begin
+ for i := 0 to aProject.GetModuleCount-1 do begin
+ if aProject.GetModule(i).Name = aName then begin
+ lModule := aProject.GetModule(i).OpenModule();
+ result := FindFormEditor(lModule);
+ exit;
+ end
+ end;
+ raise Exception.Create('Could not locate '+aName+' module in project.');
+end;
+
+function FindComponentOnForm(aForm: IOTAFormEditor; aName: string): TComponent;
+var
+ lOTAComponent: IOTAComponent;
+begin
+ lOTAComponent := aForm.FindComponent(aName);
+ if not assigned(lOTAComponent) then
+ raise Exception.Create('Could not locate '+aName+' component.');
+
+ result := (lOTAComponent as INTAComponent).GetComponent();
+end;
+
+
+procedure TDAGuideWizardForm.OnLeavePage(aPage: TTabSheet; aMovingForward: boolean);
+var
+ lSMParams: string;
+ lServerDM, lService, lClientDM: IOTAFormEditor;
+
+ lConnectionManager: TDAConnectionManager;
+ lSchema: TDASchema;
+ lRemoteDataAdapter: TDABaseDataAdapter;
+begin
+ inherited;
+ try
+
+ if (aPage = ts_SM) and aMovingForward then begin
+
+ lbl_SMClickNext.Visible := false;
+ lbl_SMLaunching.Visible := true;
+ btn_Next.Enabled := false;
+ Application.ProcessMessages();
+
+ // locate forms & components
+ lServerDM := FindFormInProject(fNewProjectInfo.ServerProject, 'fServerDataModule');
+ lService := FindFormInProject(fNewProjectInfo.ServerProject, fNewProjectInfo.ProjectOptions.ServiceName+'_Impl');
+ lConnectionManager := FindComponentOnForm(lServerDM, 'ConnectionManager') as TDAConnectionManager;
+ lSchema := FindComponentOnForm(lService, 'Schema') as TDASchema;
+
+ // edit in SM
+ lConnectionManager.SaveToFile(fTempConnections);
+ lSchema.SaveToFile(fTempSchema);
+ lSMParams := Format('/ns /autosave /projectname:"%s" /schemafile:"%s" /connectionsfile:"%s" /platform:Delphi /schemawizard', [fNewProjectInfo.ProjectOptions.ProjectName, fTempSchema, fTempConnections]);
+
+ LaunchSchemaModeler(fNewProjectInfo.ProjectOptions.ProjectName, lSMParams, true);
+ lConnectionManager.LoadFromFile(fTempConnections);
+ lSchema.LoadFromFile(fTempSchema);
+ lServerDM.MarkModified();
+ lService.MarkModified();
+
+ if not assigned(fNewProjectInfo.ClientProject) then
+ NextPage := ts_FinishServer.PageIndex;
+ //else if DAPackage.Package.DTE.Solution.Projects.Count > 2 then
+ //fNextPage := pc_Pages.Pages.IndexOf(ts_FinishMultiProject);
+
+ btn_Next.Enabled := true;
+ end
+ else if (aPage = ts_Compile) and aMovingForward then begin
+
+ lbl_CompileClickNext.Visible := false;
+ lbl_CompileBuilding.Visible := true;
+ btn_Next.Enabled := false;
+ Application.ProcessMessages();
+
+ if not fNewProjectInfo.ServerProject.ProjectBuilder.BuildProject(cmOTAMake, true, true) then
+ raise Exception.Create('Failed to compile server project; please check error messages.');
+
+ lbl_CompileLaunching.Visible := true;
+ Application.ProcessMessages();
+ ShellExecute(0, 'open', pchar(GetProjectExe(fNewProjectInfo.ServerProject)), nil, nil, SW_SHOWNORMAL);
+
+ btn_Next.Enabled := false;
+ end
+ else if (aPage = ts_DataTables) and aMovingForward then begin
+
+ lbl_DataTableClickNext.Visible := false;
+ Application.ProcessMessages();
+
+ // locate forms & components
+ lClientDM := FindFormInProject(fNewProjectInfo.ClientProject, 'fClientDataModule');
+ lRemoteDataAdapter := FindComponentOnForm(lClientDM, 'RemoteDataAdapter') as TDABaseDataAdapter;
+ lService := FindFormInProject(fNewProjectInfo.ServerProject, fNewProjectInfo.ProjectOptions.ServiceName+'_Impl');
+ lSchema := FindComponentOnForm(lService, 'Schema') as TDASchema;
+
+ // create DTs
+ lClientDM.Show();
+ TDataTableWizards.CreateDataTables(lClientDM, lRemoteDataAdapter, lSchema, Point(80,8));
+ lClientDM.MarkModified();
+
+ end;
+
+ except
+ Visible := false;
+ ModalResult := mrCancel;
+ raise;
+ end;
+
+end;
+
+initialization
+ RegisterGuideWizard(@OnNewProject);
+finalization
+ UnregisterGuideWizard(@OnNewProject);
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.dfm
new file mode 100644
index 0000000..ad06737
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.dfm
@@ -0,0 +1,170 @@
+object DAIdeData: TDAIdeData
+ OldCreateOrder = False
+ Left = 586
+ Top = 308
+ Height = 150
+ Width = 215
+ object iml_Actions: TImageList
+ Left = 32
+ Top = 8
+ Bitmap = {
+ 494C010101000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 0000000000003600000028000000400000001000000001002000000000000010
+ 000000000000000000000000000000000000FF00FF00FF00FF00FF00FF00FF00
+ FF00FF00FF00686868002B2B2B0018181800131313000F0F0F0057575700FF00
+ FF00FF00FF00FF00FF00FF00FF00FF00FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF00FF00FF00FF00FF00FF007070
+ 70002B2B2B0021322100124912000E490E000B440B000A390A000C190C000F0F
+ 0F0034343400FF00FF00FF00FF00FF00FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF00FF00FF00FF005E5E5E003434
+ 3400343434002132210018481800066A06000075000000750000066A0600044A
+ 04000F0F0F0013131300FF00FF00FF00FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF00FF007D7D7D003E3E3E003E3E
+ 3E0034343400303030002B2B2B0014531400007B0000066A0600113311000C19
+ 0C000E140E000F0F0F0034343400FF00FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF00FF00474747002E7133003E3E
+ 3E003434340034343400343434002B2B2B00213221001B321B00181818001818
+ 180013131300092F09000F0F0F00FF00FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000919191004A534B0022B132004747
+ 47003E3E3E003E3E3E00343434002B2B2B002B2B2B0026262600262626001818
+ 180018181800055405000E140E00575757000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000707070004A7050002BC442004747
+ 4700474747003E3E3E003434340034343400343434002B2B2B00262626002626
+ 260018181800075F07000A390A000F0F0F000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000005E5E5E004B975B0037CF53004C4C
+ 4C0047474700474747003E3E3E003E3E3E00343434002B2B2B002B2B2B002626
+ 260026262600075F07000B440B00131313000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000005E5E5E00539F660042DA64004E61
+ 52004C4C4C0047474700474747003E3E3E0034343400343434001E521E001559
+ 1500096A0900007B00000E490E00181818000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000008A8A8A005D8368004DE6750042DA
+ 640039C853003A904800474747003E3E3E003E3E3E003E3E3E001B631B00008C
+ 0000008600000086000012491200181818000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF00FF006868680059E884004DE6
+ 750042DA64003AC0540046634B004747470047474700374A3800137B13000092
+ 0000008C00000086000021322100686868000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF00FF006868680063A6790059F1
+ 87004DE6750042DA640037CF53002BC4420020B8300014AD1F0009A20E000092
+ 000000920000146414002B2B2B00FF00FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF00FF00FF00FF006868680063C2
+ 830059F187004DE6750042DA640037CF53002BC4420020B8300014AD1F0009A2
+ 0E000B860C00313A310068686800FF00FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF00FF00FF00FF00989898006868
+ 680063A6790059E884004DE6750042DA640037CF53002BC4420022B132002B78
+ 30003E3E3E005E5E5E00FF00FF00FF00FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF00FF00FF00FF00FF00FF00FF00
+ FF0068686800686868005D836800539F66004B975B00487851004A534B004747
+ 47007D7D7D00FF00FF00FF00FF00FF00FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000FF00FF00FF00FF00FF00FF00FF00
+ FF00FF00FF008A8A8A00636363005A5A5A005A5A5A00575757008A8A8A00FF00
+ FF00FF00FF00FF00FF00FF00FF00FF00FF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000424D3E000000000000003E000000
+ 2800000040000000100000000100010000000000800000000000000000000000
+ 000000000000000000000000FFFFFF0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000}
+ end
+ object dlg_OpenBriefcase: TOpenDialog
+ DefaultExt = '.daBriefcase'
+ Filter =
+ 'Briefcase files (*.daBriefcase)|*.daBriefcase|All files (*.*)|*.' +
+ '*'
+ FilterIndex = 0
+ Title = 'Load Data from Briefcase File'
+ Left = 112
+ Top = 8
+ end
+ object dlg_SaveBriefcase: TSaveDialog
+ DefaultExt = '.daBriefcase'
+ Filter =
+ 'Briefcase files (*.daBriefcase)|*.daBriefcase|All files (*.*)|*.' +
+ '*'
+ FilterIndex = 0
+ Title = 'Save Data as Briefcase File'
+ Left = 112
+ Top = 56
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.lfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.lfm
new file mode 100644
index 0000000..7c1bd08
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.lfm
@@ -0,0 +1,64 @@
+object DAIdeData: TDAIdeData
+ left = 586
+ top = 308
+ Height = 150
+ HorizontalOffset = 218
+ VerticalOffset = 192
+ Width = 215
+ object iml_Actions: TImageList
+ BkColor = clForeground
+ left = 32
+ top = 8
+ Bitmap = {
+ 4C69010000001000000010000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ FFFF8A8A8AFF636363FF5A5A5AFF5A5A5AFF575757FF8A8A8AFFFF00FFFFFF00
+ FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF6868
+ 68FF686868FF5D8368FF539F66FF4B975BFF487851FF4A534BFF474747FF7D7D
+ 7DFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF989898FF686868FF63A6
+ 79FF59E884FF4DE675FF42DA64FF37CF53FF2BC442FF22B132FF2B7830FF3E3E
+ 3EFF5E5E5EFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF686868FF63C283FF59F1
+ 87FF4DE675FF42DA64FF37CF53FF2BC442FF20B830FF14AD1FFF09A20EFF0B86
+ 0CFF313A31FF686868FFFF00FFFFFF00FFFF686868FF63A679FF59F187FF4DE6
+ 75FF42DA64FF37CF53FF2BC442FF20B830FF14AD1FFF09A20EFF009200FF0092
+ 00FF146414FF2B2B2BFFFF00FFFFFF00FFFF686868FF59E884FF4DE675FF42DA
+ 64FF3AC054FF46634BFF474747FF474747FF374A38FF137B13FF009200FF008C
+ 00FF008600FF213221FF686868FF8A8A8AFF5D8368FF4DE675FF42DA64FF39C8
+ 53FF3A9048FF474747FF3E3E3EFF3E3E3EFF3E3E3EFF1B631BFF008C00FF0086
+ 00FF008600FF124912FF181818FF5E5E5EFF539F66FF42DA64FF4E6152FF4C4C
+ 4CFF474747FF474747FF3E3E3EFF343434FF343434FF1E521EFF155915FF096A
+ 09FF007B00FF0E490EFF181818FF5E5E5EFF4B975BFF37CF53FF4C4C4CFF4747
+ 47FF474747FF3E3E3EFF3E3E3EFF343434FF2B2B2BFF2B2B2BFF262626FF2626
+ 26FF075F07FF0B440BFF131313FF707070FF4A7050FF2BC442FF474747FF4747
+ 47FF3E3E3EFF343434FF343434FF343434FF2B2B2BFF262626FF262626FF1818
+ 18FF075F07FF0A390AFF0F0F0FFF919191FF4A534BFF22B132FF474747FF3E3E
+ 3EFF3E3E3EFF343434FF2B2B2BFF2B2B2BFF262626FF262626FF181818FF1818
+ 18FF055405FF0E140EFF575757FFFF00FFFF474747FF2E7133FF3E3E3EFF3434
+ 34FF343434FF343434FF2B2B2BFF213221FF1B321BFF181818FF181818FF1313
+ 13FF092F09FF0F0F0FFFFF00FFFFFF00FFFF7D7D7DFF3E3E3EFF3E3E3EFF3434
+ 34FF303030FF2B2B2BFF145314FF007B00FF066A06FF113311FF0C190CFF0E14
+ 0EFF0F0F0FFF343434FFFF00FFFFFF00FFFFFF00FFFF5E5E5EFF343434FF3434
+ 34FF213221FF184818FF066A06FF007500FF007500FF066A06FF044A04FF0F0F
+ 0FFF131313FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF707070FF2B2B
+ 2BFF213221FF124912FF0E490EFF0B440BFF0A390AFF0C190CFF0F0F0FFF3434
+ 34FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+ FFFF686868FF2B2B2BFF181818FF131313FF0F0F0FFF575757FFFF00FFFFFF00
+ FFFFFF00FFFFFF00FFFFFF00FFFF
+ }
+ end
+ object dlg_OpenBriefcase: TOpenDialog
+ Title = 'Load Data from Briefcase File'
+ DefaultExt = '.daBriefcase'
+ Filter = 'Briefcase files (*.daBriefcase)|*.daBriefcase|All files (*.*)|*.*'
+ FilterIndex = 0
+ left = 112
+ top = 8
+ end
+ object dlg_SaveBriefcase: TSaveDialog
+ Title = 'Save Data as Briefcase File'
+ DefaultExt = '.daBriefcase'
+ Filter = 'Briefcase files (*.daBriefcase)|*.daBriefcase|All files (*.*)|*.*'
+ FilterIndex = 0
+ left = 112
+ top = 56
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.lrs
new file mode 100644
index 0000000..0791927
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.lrs
@@ -0,0 +1,55 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TDAIdeData','FORMDATA',[
+ 'TPF0'#10'TDAIdeData'#9'DAIdeData'#4'left'#3'J'#2#3'top'#3'4'#1#6'Height'#3
+ +#150#0#16'HorizontalOffset'#3#218#0#14'VerticalOffset'#3#192#0#5'Width'#3#215
+ +#0#0#10'TImageList'#11'iml_Actions'#7'BkColor'#7#12'clForeground'#4'left'#2
+ +' '#3'top'#2#8#6'Bitmap'#10#14#4#0#0'Li'#1#0#0#0#16#0#0#0#16#0#0#0#255#0#255
+ +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#138#138#138#255
+ +'ccc'#255'ZZZ'#255'ZZZ'#255'WWW'#255#138#138#138#255#255#0#255#255#255#0#255
+ +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255
+ +#255#0#255#255#255#0#255#255'hhh'#255'hhh'#255']'#131'h'#255'S'#159'f'#255'K'
+ +#151'['#255'HxQ'#255'JSK'#255'GGG'#255'}}}'#255#255#0#255#255#255#0#255#255
+ +#255#0#255#255#255#0#255#255#255#0#255#255#152#152#152#255'hhh'#255'c'#166'y'
+ +#255'Y'#232#132#255'M'#230'u'#255'B'#218'd'#255'7'#207'S'#255'+'#196'B'#255
+ +'"'#177'2'#255'+x0'#255'>>>'#255'^^^'#255#255#0#255#255#255#0#255#255#255#0
+ +#255#255#255#0#255#255'hhh'#255'c'#194#131#255'Y'#241#135#255'M'#230'u'#255
+ +'B'#218'd'#255'7'#207'S'#255'+'#196'B'#255' '#184'0'#255#20#173#31#255#9#162
+ +#14#255#11#134#12#255'1:1'#255'hhh'#255#255#0#255#255#255#0#255#255'hhh'#255
+ +'c'#166'y'#255'Y'#241#135#255'M'#230'u'#255'B'#218'd'#255'7'#207'S'#255'+'
+ +#196'B'#255' '#184'0'#255#20#173#31#255#9#162#14#255#0#146#0#255#0#146#0#255
+ +#20'd'#20#255'+++'#255#255#0#255#255#255#0#255#255'hhh'#255'Y'#232#132#255'M'
+ +#230'u'#255'B'#218'd'#255':'#192'T'#255'FcK'#255'GGG'#255'GGG'#255'7J8'#255
+ +#19'{'#19#255#0#146#0#255#0#140#0#255#0#134#0#255'!2!'#255'hhh'#255#138#138
+ +#138#255']'#131'h'#255'M'#230'u'#255'B'#218'd'#255'9'#200'S'#255':'#144'H'
+ +#255'GGG'#255'>>>'#255'>>>'#255'>>>'#255#27'c'#27#255#0#140#0#255#0#134#0#255
+ +#0#134#0#255#18'I'#18#255#24#24#24#255'^^^'#255'S'#159'f'#255'B'#218'd'#255
+ +'NaR'#255'LLL'#255'GGG'#255'GGG'#255'>>>'#255'444'#255'444'#255#30'R'#30#255
+ +#21'Y'#21#255#9'j'#9#255#0'{'#0#255#14'I'#14#255#24#24#24#255'^^^'#255'K'#151
+ +'['#255'7'#207'S'#255'LLL'#255'GGG'#255'GGG'#255'>>>'#255'>>>'#255'444'#255
+ +'+++'#255'+++'#255'&&&'#255'&&&'#255#7'_'#7#255#11'D'#11#255#19#19#19#255'pp'
+ +'p'#255'JpP'#255'+'#196'B'#255'GGG'#255'GGG'#255'>>>'#255'444'#255'444'#255
+ +'444'#255'+++'#255'&&&'#255'&&&'#255#24#24#24#255#7'_'#7#255#10'9'#10#255#15
+ +#15#15#255#145#145#145#255'JSK'#255'"'#177'2'#255'GGG'#255'>>>'#255'>>>'#255
+ +'444'#255'+++'#255'+++'#255'&&&'#255'&&&'#255#24#24#24#255#24#24#24#255#5'T'
+ +#5#255#14#20#14#255'WWW'#255#255#0#255#255'GGG'#255'.q3'#255'>>>'#255'444'
+ +#255'444'#255'444'#255'+++'#255'!2!'#255#27'2'#27#255#24#24#24#255#24#24#24
+ +#255#19#19#19#255#9'/'#9#255#15#15#15#255#255#0#255#255#255#0#255#255'}}}'
+ +#255'>>>'#255'>>>'#255'444'#255'000'#255'+++'#255#20'S'#20#255#0'{'#0#255#6
+ +'j'#6#255#17'3'#17#255#12#25#12#255#14#20#14#255#15#15#15#255'444'#255#255#0
+ +#255#255#255#0#255#255#255#0#255#255'^^^'#255'444'#255'444'#255'!2!'#255#24
+ +'H'#24#255#6'j'#6#255#0'u'#0#255#0'u'#0#255#6'j'#6#255#4'J'#4#255#15#15#15
+ +#255#19#19#19#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255
+ +#0#255#255'ppp'#255'+++'#255'!2!'#255#18'I'#18#255#14'I'#14#255#11'D'#11#255
+ +#10'9'#10#255#12#25#12#255#15#15#15#255'444'#255#255#0#255#255#255#0#255#255
+ +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0
+ +#255#255'hhh'#255'+++'#255#24#24#24#255#19#19#19#255#15#15#15#255'WWW'#255
+ +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#0#0#11
+ +'TOpenDialog'#17'dlg_OpenBriefcase'#5'Title'#6#29'Load Data from Briefcase F'
+ +'ile'#10'DefaultExt'#6#12'.daBriefcase'#6'Filter'#6'ABriefcase files (*.daBr'
+ +'iefcase)|*.daBriefcase|All files (*.*)|*.*'#11'FilterIndex'#2#0#4'left'#2'p'
+ +#3'top'#2#8#0#0#11'TSaveDialog'#17'dlg_SaveBriefcase'#5'Title'#6#27'Save Dat'
+ +'a as Briefcase File'#10'DefaultExt'#6#12'.daBriefcase'#6'Filter'#6'ABriefca'
+ +'se files (*.daBriefcase)|*.daBriefcase|All files (*.*)|*.*'#11'FilterIndex'
+ +#2#0#4'left'#2'p'#3'top'#2'8'#0#0#0
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.pas
new file mode 100644
index 0000000..e0e5d05
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEData.pas
@@ -0,0 +1,54 @@
+unit uDAIDEData;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - IDE Library }
+{ }
+{ compiler: Delphi 6 and up, }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+interface
+
+uses
+ {$IFDEF DELPHI5}Forms,{$ENDIF}
+ {$IFDEF FPC}LResources,{$ENDIF}
+ SysUtils, Classes, ImgList, Controls, Dialogs;
+
+
+type
+ TDAIdeData = class(TDataModule)
+ iml_Actions: TImageList;
+ dlg_OpenBriefcase: TOpenDialog;
+ dlg_SaveBriefcase: TSaveDialog;
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+const
+ ICON_REGENERATE = 1;
+ ICON_IMPORT = 2;
+ ICON_MAKESERVER = 3;
+
+implementation
+{$IFNDEF FPC}
+{$R *.dfm}
+{$ENDIF FPC}
+
+{$IFDEF FPC}
+initialization
+ {$I uDAIDEData.lrs}
+{$ENDIF}
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEMenu.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEMenu.pas
new file mode 100644
index 0000000..6b5e669
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEMenu.pas
@@ -0,0 +1,292 @@
+unit uDAIDEMenu;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - IDE Library
+{
+{ compiler: Delphi 6 and up, Kylix 3 and up
+{ platform: Win32, Linux
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+interface
+
+uses Forms,
+ Classes, Windows, SysUtils,{$IFDEF DELPHI6UP}DesignEditors, DesignIntf, {$ELSE}
+ {$IFDEF LINUX}
+ DesignEditors, DesignIntf,
+ {$ELSE}
+ DsgnIntf,{$ENDIF}{$ENDIF}
+ ToolsApi, Menus, Contnrs, ComObj, Graphics;
+
+type
+ { TMenuItemInfo }
+ TMenuItemInfo = record
+ Caption,
+ ShortCut : string;
+ Menu:TMenuItem;
+ ImageIndex:integer;
+ end;
+
+const MAX_MENU_ITEM = 0;
+
+var
+ MenuItems : array[0..MAX_MENU_ITEM] of TMenuItemInfo = (
+ //(Caption: '-'; ShortCut: ''; Menu:nil; ImageIndex: -1),
+ (Caption: 'Schema &Modeler'; ShortCut: ''; Menu:nil; ImageIndex: 0)
+ );
+
+const
+ mi_SchemaModeler = 0;
+
+type
+ { TDAMenuWizard }
+ TDAMenuWizard = class(TInterfacedObject, IOTAWizard, IOTANotifier)
+ private
+ fDAMenuItems : TList;
+
+ protected
+ { Misc }
+ procedure CreateMenuItems;
+ procedure LaunchSchemaModeler(Sender : TObject);
+ function FindROMenu : TMenuItem;
+
+ { IOTANotifier}
+ procedure AfterSave;
+ procedure BeforeSave;
+ procedure Destroyed;
+ procedure Execute;
+ procedure Modified;
+
+ { IOTAWizard }
+ function GetState: TWizardState;
+ function GetIDString: string;
+ function GetName: string;
+
+ public
+
+ constructor Create;
+ destructor Destroy; override;
+ end;
+
+function GetSchemaModelerPath: string;
+function GetDllPath: String;
+function GetBinDir: string;
+procedure LaunchSchemaModeler(const aProjectName, someParams : string; aWait: boolean=false);
+
+procedure Register;
+
+implementation
+
+uses ShellAPI, Controls, Registry, Dialogs,
+ uRODL, uROIDETools, uRODLToXML, uRODLToPascalIntf, uRODLGenTools,
+ uRORODLNotifier, uROPleaseWaitForm, uDAIDEData, fROAbout,
+ fCustomIDEMessagesForm, uROProductVersionInfo, uROClasses, uROIDEMenu;
+
+{$R Resources.BDS.res}
+
+procedure RegisterAboutInfo;
+const
+ lProductName = 'RemObjects Data Abstract for Delphi';
+begin
+ {$IFDEF BDS}
+ {$IFDEF BDS7UP}
+ SplashScreenServices.AddPluginBitmap(lProductName, LoadBitmap(HInstance, 'SPLASH2006')); // the old on-black 2006 image also works for 2010
+ {$ELSE}
+ SplashScreenServices.AddPluginBitmap(lProductName, LoadBitmap(HInstance, 'SPLASH2007'));
+ {$ENDIF}
+ (BorlandIDEServices as IOTAAboutBoxServices).AddPluginInfo(lProductName, lProductName+#13#10'Copyright RemObjects Software 2002-2009.'#13#10'All rights reserved.'#13#10'http://www.remobjects.com/da.', LoadBitmap(HInstance, 'ABOUT'));
+ {$ENDIF BDS}
+end;
+
+procedure Register;
+begin
+ RegisterAboutInfo();
+ RegisterPackageWizard(TDAMenuWizard.Create);
+end;
+
+{ TDAMenuWizard }
+
+constructor TDAMenuWizard.Create;
+begin
+ inherited Create;
+
+ fDAMenuItems := TList.Create;
+ CreateMenuItems;
+end;
+
+destructor TDAMenuWizard.Destroy;
+var romenu : TMenuItem;
+ i, x : integer;
+begin
+ romenu := FindROMenu;
+ if (romenu<>NIL) then begin
+ for i := (romenu.Count-1) downto 0 do begin
+ for x := (fDAMenuItems.Count-1) downto 0 do
+ if (romenu.Items[i]=fDAMenuItems[x]) then begin
+ TObject(fDAMenuItems[x]).Free;
+ Break;
+ end;
+ end;
+ end;
+
+ fDAMenuItems.Free;
+end;
+
+function TDAMenuWizard.GetIDString: string;
+begin
+ Result := '{FE46996E-0AFA-4C8D-AF59-192F1D581FD1}'
+end;
+
+function TDAMenuWizard.GetName: string;
+begin
+ Result := 'DAMenuWizard';
+end;
+
+// The following are stubs that Delphi never calls.
+procedure TDAMenuWizard.AfterSave;
+begin
+end;
+
+procedure TDAMenuWizard.BeforeSave;
+begin
+end;
+
+procedure TDAMenuWizard.Destroyed;
+begin
+end;
+
+procedure TDAMenuWizard.Execute;
+begin
+end;
+
+function TDAMenuWizard.GetState: TWizardState;
+begin
+ Result := [];
+end;
+
+procedure TDAMenuWizard.Modified;
+begin
+end;
+
+function TDAMenuWizard.FindROMenu: TMenuItem;
+{var mainmenu : TMainMenu;
+ i : integer;}
+begin
+ result := gRemObjectsMenu;
+ {result := NIL;
+ mainmenu := (BorlandIDEServices as INTAServices).MainMenu;
+ for i := 0 to (mainmenu.Items.Count-1) do
+ if SameText('Rem&Objects', mainmenu.Items[i].Caption) then begin
+ result := mainmenu.Items[i];
+ Break;
+ end;}
+end;
+
+procedure TDAMenuWizard.CreateMenuItems;
+var romenu,
+ item : TMenuItem;
+ i : Integer;
+ lBitmap : TBitmap;
+begin
+ romenu := FindROMenu;
+
+ if (romenu=NIL) then Exit;
+
+ with TDAIdeData.Create(nil) do try
+
+ lBitmap := TBitmap.Create();
+ try
+ for i := 0 to High(MenuItems) do begin
+ item := TMenuItem.Create(romenu);
+ item.Caption := MenuItems[i].Caption;
+ item.ShortCut := TextToShortCut(MenuItems[i].ShortCut);
+ item.Tag := i;
+
+ fDAMenuItems.Add(item);
+
+ if MenuItems[i].ImageIndex > -1 then begin
+ iml_Actions.GetBitmap(MenuItems[i].ImageIndex,lBitmap);
+ item.ImageIndex := (BorlandIDEServices as INTAServices).AddMasked(lBitmap, clFuchsia);
+ end;
+
+ MenuItems[i].Menu := item;
+
+ case i of
+ mi_SchemaModeler : item.OnClick := LaunchSchemaModeler;
+ else item.OnClick := NIL;
+ end;
+
+ romenu.Insert(6+i, item);// Add(item);
+ end;
+ finally
+ lBitmap.Free();
+ end;
+
+ finally
+ Free();
+ end;
+end;
+
+function GetDllPath: String;
+var TheFileName : array[0..MAX_PATH] of char;
+begin
+ FillChar(TheFileName, SizeOf(TheFileName), #0);
+ {$IFDEF KYLIX}System.{$ENDIF}GetModuleFileName(hInstance, TheFileName, sizeof(TheFileName));
+ Result := ExtractFilePath(TheFileName);
+end;
+
+function GetBinDir: string;
+begin
+ // This function strips the "DCU\Dx" part of the path where the BPL is
+ result := ExtractFilePath(GetDllPath);
+{$IFDEF DELPHI10UP}
+ result := IncludeTrailingPathDelimiter(Copy(result,1,Length(result)-8))+'Bin\';
+{$ELSE}
+ result := IncludeTrailingBackslash(Copy(result,1,Length(result)-7))+'Bin\';
+{$ENDIF}
+end;
+
+function GetSchemaModelerPath: string;
+var reg: TRegIniFile;
+begin
+ reg := TRegIniFile.Create('Software\RemObjects\Data Abstract');
+ try
+ result := reg.ReadString('Schema Modeler', 'FullPath', GetBinDir+'DASchemaModeler.exe');
+ finally
+ reg.Free;
+ end;
+end;
+
+procedure LaunchSchemaModeler(const aProjectName, someParams : string; aWait: boolean=false);
+var exename : string;
+begin
+ exename := GetSchemaModelerPath;
+
+ if not FileExists(exename) then
+ MessageDlg(Format('Cannot find "%s"', [exename]), mtError, [mbOK], 0)
+ else begin
+ if aWait then begin
+ ExecuteAndWait(exename, someParams);
+ end
+ else begin
+ ShellExecute(0, 'open', PChar(exename), PChar(someParams), PChar(ExtractFilePath(aProjectName)), SW_NORMAL);
+ end;
+ end;
+end;
+
+procedure TDAMenuWizard.LaunchSchemaModeler(Sender: TObject);
+begin
+ uDAIDEMenu.LaunchSchemaModeler('', '/ns /platform:Delphi');
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEMenu_laz.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEMenu_laz.pas
new file mode 100644
index 0000000..780c606
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDEMenu_laz.pas
@@ -0,0 +1,209 @@
+unit uDAIDEMenu_laz;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - IDE Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+interface
+
+uses {$IFDEF MSWINDOWS}Windows,ComObj,{$ENDIF}
+ SysUtils,Classes,Forms,uEWMenuManager_laz,
+ Menus, Graphics;
+
+type
+ { TMenuItemInfo }
+ TMenuItemInfo = record
+ Caption,
+ ShortCut : string;
+ ImageIndex:integer;
+ end;
+
+const MAX_MENU_ITEM = 0;
+
+var
+ MenuItems : array[0..MAX_MENU_ITEM] of TMenuItemInfo = (
+ //(Caption: '-'; ShortCut: ''; Menu:nil; ImageIndex: -1),
+ (Caption: 'Schema &Modeler'; ShortCut: ''; ImageIndex: 0)
+ );
+
+const
+ mi_SchemaModeler = 0;
+
+type
+ { TDAMenuWizard }
+ TDAMenuWizard = class
+ private
+ protected
+ { Misc }
+ procedure CreateMenuItems;
+ procedure LaunchSchemaModeler(Sender : TObject);
+ function FindROMenu : TEWMenu;
+ { IOTAWizard }
+ function GetIDString: string;
+ function GetName: string;
+ public
+ constructor Create;
+ end;
+
+function GetSchemaModelerPath: string;
+function GetDllPath: String;
+function GetBinDir: string;
+procedure LaunchSchemaModeler(const aProjectName, someParams : string; aWait: boolean=false);
+
+procedure Register;
+
+implementation
+
+uses Controls, Registry, Dialogs,uEWTools, IDECommands,
+ uRODL, uROIDETools_laz, uRODLGenTools,
+ uROPleaseWaitForm, uDAIDEData, fROAbout,
+ fCustomIDEMessagesForm, uROClasses, uROIDEMenu_laz;
+
+var
+ wiz: TDAMenuWizard = nil;
+
+procedure Register;
+begin
+{$IFDEF MSWINDOWS}
+ // DASM exists only for Windows
+ wiz:= TDAMenuWizard.Create;
+{$ENDIF}
+{$IFNDEF FPC}
+ RegisterPackageWizard(TDAMenuWizard.Create);
+{$ENDIF FPC}
+end;
+
+{ TDAMenuWizard }
+
+constructor TDAMenuWizard.Create;
+begin
+ inherited Create;
+ CreateMenuItems;
+end;
+
+
+function TDAMenuWizard.GetIDString: string;
+begin
+ Result := '{FE46996E-0AFA-4C8D-AF59-192F1D581FD1}'
+end;
+
+function TDAMenuWizard.GetName: string;
+begin
+ Result := 'DAMenuWizard';
+end;
+
+function TDAMenuWizard.FindROMenu: TEWMenu;
+begin
+ result := gRemObjectsMenu;
+end;
+
+procedure TDAMenuWizard.CreateMenuItems;
+var
+ romenu : TEWMenu;
+ item : TEWMenuItem;
+ i : Integer;
+ lBitmap : TBitmap;
+begin
+ romenu := FindROMenu;
+
+ if (romenu=NIL) then Exit;
+ with TDAIdeData.Create(nil) do try
+
+ lBitmap := TBitmap.Create();
+ try
+ for i := 0 to High(MenuItems) do begin
+ item := romenu.CreateMenuItem(MenuItems[i].Caption,-1,[pAny],False);
+ if MenuItems[i].ShortCut <> '' then
+ Item.Command := RegisterIDECommand(RoMenu.CommandCategory, Item.Caption,Item.Caption,TextToIDEShortCut(MenuItems[i].ShortCut));
+ item.Tag := i;
+ if MenuItems[i].ImageIndex > -1 then begin
+ iml_Actions.GetBitmap(MenuItems[i].ImageIndex,lBitmap);
+ if romenu.SubMenuImages <> nil then
+ item.ImageIndex := romenu.SubMenuImages.AddMasked(lBitmap, clFuchsia);
+ end;
+ case i of
+ mi_SchemaModeler : item.OnClick := LaunchSchemaModeler;
+ else item.OnClick := NIL;
+ end;
+ romenu.Insert(6+i, item);
+ end;
+ finally
+ lBitmap.Free();
+ end;
+
+ finally
+ Free();
+ end;
+end;
+
+function GetDllPath: String;
+{$IFDEF MSWINDOWS}
+var TheFileName : array[0..MAX_PATH] of char;
+{$ENDIF}
+begin
+{$IFDEF MSWINDOWS}
+ TheFileName[0]:=#0;
+ FillChar(TheFileName, SizeOf(TheFileName), #0);
+ GetModuleFileName(hInstance, TheFileName, sizeof(TheFileName));
+ Result := ExtractFilePath(TheFileName);
+{$ELSE}
+ Result := '';
+{$ENDIF}
+end;
+
+function GetBinDir: string;
+begin
+ // This function strips the "DCU\Dx" part of the path where the BPL is
+ result := ExtractFilePath(GetDllPath);
+ result := IncludeTrailingBackslash(Copy(result,1,Length(result)-7))+'Bin\';
+end;
+
+function GetSchemaModelerPath: string;
+var reg: TRegIniFile;
+begin
+ reg := TRegIniFile.Create('Software\RemObjects\Data Abstract');
+ try
+ result := reg.ReadString('Schema Modeler', 'FullPath', GetBinDir+'DASchemaModeler.exe');
+ finally
+ reg.Free;
+ end;
+end;
+
+procedure LaunchSchemaModeler(const aProjectName, someParams : string; aWait: boolean=false);
+var exename : string;
+begin
+ exename := GetSchemaModelerPath;
+ if not FileExists(exename) then
+ MessageDlg(Format('Cannot find "%s"', [exename]), mtError, [mbOK], 0)
+ else begin
+ if aWait then begin
+ ExecuteAndWait(exename, someParams);
+ end
+ else begin
+ RO_ShellExecute(0, 'open', PChar(exename), PChar(someParams), PChar(ExtractFilePath(aProjectName)), SW_NORMAL);
+ end;
+ end;
+end;
+
+procedure TDAMenuWizard.LaunchSchemaModeler(Sender: TObject);
+begin
+ uDAIDEMenu_laz.LaunchSchemaModeler('', '/ns /platform:Delphi');
+end;
+
+finalization
+ if wiz <> nil then wiz.free;
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDERes.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDERes.pas
new file mode 100644
index 0000000..850aee9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDAIDERes.pas
@@ -0,0 +1,12 @@
+unit uDAIDERes;
+
+interface
+
+resourcestring
+ err_AssignRemoteService = 'Please assign a RemoteService, first.';
+ err_AssignRemoteServiceChannel = 'Please assign a Channel to the RemoteService, first.';
+ err_AssignRemoteServiceMessage = 'Please assign a Message to the RemoteService, first.';
+
+implementation
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASchemaUnitsGenerator.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASchemaUnitsGenerator.pas
new file mode 100644
index 0000000..8b75ae5
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASchemaUnitsGenerator.pas
@@ -0,0 +1,938 @@
+unit uDASchemaUnitsGenerator;
+
+{$IFDEF MSWINDOWS}
+{$I ..\DataAbstract.inc}
+{$ELSE}
+{$I ../DataAbstract.inc}
+{$ENDIF}
+
+interface
+
+// usage TBCD instead of Double for datDecimal
+{.$DEFINE TREAT_DECIMAL_AS_TBCD}
+uses
+ Classes, uDAInterfaces, uDAClasses;
+
+
+
+type
+ { TDASchemaCodeGenerator }
+ TDASchemaCodeGenerator = class(TStringList)
+ private
+ fSchema : TDASchema;
+ fFileName : string;
+
+ protected
+ procedure DoWriteCode; virtual; abstract;
+
+ property FileName : string read fFileName;
+ property Schema : TDASchema read fSchema;
+
+ public
+ constructor Create(aSchema : TDASchema);
+
+ procedure Write(const someText: string; Indentation: integer = 0); overload;
+ procedure WriteLines(const someText: string);
+ procedure WriteEmptyLine;
+
+ procedure WriteCode(const aFileName : string);
+ end;
+
+ { TClientUnitSchemaGenerator }
+ TClientUnitSchemaGenerator = class(TDASchemaCodeGenerator)
+ protected
+ procedure DoWriteCode; override;
+ end;
+
+ { TServerUnitSchemaGenerator }
+ TServerUnitSchemaGenerator = class(TDASchemaCodeGenerator)
+ private
+ fClientUnitName: string;
+
+ protected
+ procedure DoWriteCode; override;
+
+ public
+ property ClientUnitName : string read fClientUnitName write fClientUnitName;
+ end;
+
+procedure GenerateSchemaUnits(aSchema : TDASchema);
+function GetDAType(ad: TDADataType): string;
+{$IFDEF FPC}
+function PromptForFileName(var AFileName: string; const AFilter: string = '';
+ const ADefaultExt: string = ''; const ATitle: string = '';
+ const AInitialDir: string = ''; SaveDialog: Boolean = False): Boolean;
+{$ENDIF}
+implementation
+
+{$IFDEF FPC}
+ {$UNDEF TREAT_DECIMAL_AS_TBCD}
+{$ENDIF}
+
+uses
+ {$IFDEF FPC}ProjectIntf, uROIDETools_laz,uEWOTAHelpers_laz,{$ELSE}uROIDETools,{$ENDIF}
+ uRODLToPascal, SysUtils, Dialogs, uROTypes, uROClasses;
+
+{$IFDEF FPC}
+function PromptForFileName(var AFileName: string; const AFilter: string = '';
+ const ADefaultExt: string = ''; const ATitle: string = '';
+ const AInitialDir: string = ''; SaveDialog: Boolean = False): Boolean;
+var
+ Dialog: TOpenDialog;
+begin
+ if SaveDialog then
+ begin
+ Dialog := TSaveDialog.Create(nil);
+ Dialog.Options := Dialog.Options + [ofOverwritePrompt];
+ end
+ else
+ Dialog := TOpenDialog.Create(nil);
+ with Dialog do
+ try
+ Title := ATitle;
+ DefaultExt := ADefaultExt;
+ if AFilter = '' then
+ Filter := 'All files (*.*)|*.*' else
+ Filter := AFilter;
+ InitialDir := AInitialDir;
+ FileName := AFileName;
+ Result := Execute;
+ if Result then
+ AFileName := FileName;
+ finally
+ Free;
+ end;
+end;
+{$ENDIF}
+
+
+function GetDATypeMethod(ad: TDADataType): string;
+begin
+ case ad of
+ datAutoInc: Result := 'Integer';
+ datLargeAutoInc: Result := 'LargeInt';
+ datWideMemo: Result := 'WideString';
+ datSingleFloat: Result := 'Single';
+ {$IFNDEF TREAT_DECIMAL_AS_TBCD}
+ datDecimal: Result := 'Float';
+ {$ENDIF}
+ else
+ Result := DADataTypeNames[ad];
+ end;
+end;
+
+{ TDASchemaCodeGenerator }
+
+procedure TDASchemaCodeGenerator.Write(const someText: string; Indentation: integer = 0);
+var
+ i: integer;
+ s: string;
+begin
+ s := '';
+ for i := 1 to Indentation do s := s + ' ';
+ s := s + someText;
+ Add(s)
+end;
+
+procedure TDASchemaCodeGenerator.WriteLines(const someText: string);
+begin
+ Text := Text+someText;
+end;
+
+procedure TDASchemaCodeGenerator.WriteEmptyLine;
+begin
+ Add('');
+end;
+
+constructor TDASchemaCodeGenerator.Create(aSchema: TDASchema);
+begin
+ inherited Create;
+ fSchema := aSchema;
+end;
+
+procedure TDASchemaCodeGenerator.WriteCode(const aFileName: string);
+begin
+ fFileName := aFileName;
+
+ Clear;
+ DoWriteCode;
+ SaveToFile(aFileName);
+end;
+
+{ Misc }
+procedure GenerateSchemaUnits(aSchema : TDASchema);
+var clienttargetfilename,
+ servertargetfilename : string;
+{$IFDEF FPC}
+ lfile: TLazProjectFile;
+{$ENDIF}
+begin
+ clienttargetfilename := IncludeTrailingPathDelimiter(ModuleDir(CurrentProject))+aSchema.Name+'Client_Intf.pas';
+ if PromptForFileName(clienttargetfilename, 'Delphi unit (*.pas)|*.pas', '*.pas', 'Save '+aSchema.Name+' client access unit', '', TRUE) then begin
+
+ with TClientUnitSchemaGenerator.Create(aSchema) do try
+ WriteCode(clienttargetfilename);
+ {$IFDEF FPC}
+ lFile := CurrentProject.CreateProjectFile(clienttargetfilename);
+ CurrentProject.AddFile(lFile, False);
+ lFile.IsPartOfProject := True;
+ {$ELSE}
+ CurrentProject.AddFile(clienttargetfilename, TRUE);
+ {$ENDIF}
+ finally
+ Free;
+ end;
+
+ end;
+
+ servertargetfilename := IncludeTrailingPathDelimiter(ModuleDir(CurrentProject))+aSchema.Name+'Server_Intf.pas';
+ if PromptForFileName(servertargetfilename, 'Delphi unit (*.pas)|*.pas', '*.pas', 'Save '+aSchema.Name+' server access unit', '', TRUE) then begin
+ with TServerUnitSchemaGenerator.Create(aSchema) do try
+ ClientUnitName := ChangeFileExt(ExtractFileName(clienttargetfilename), '');
+
+ WriteCode(servertargetfilename);
+ {$IFDEF FPC}
+ lFile :=CurrentProject.CreateProjectFile(servertargetfilename);
+ CurrentProject.AddFile(lFile, False);
+ lFile.IsPartOfProject := True;
+ {$ELSE}
+ CurrentProject.AddFile(servertargetfilename, TRUE);
+ {$ENDIF}
+ finally
+ Free;
+ end;
+ end;
+end;
+
+function GenFindParams(aDataset : TDADataset; AddType, UsePrefix, UseComma : boolean) : string;
+var x : integer;
+begin
+ result := '';
+ with aDataset do begin
+ for x := 0 to (Fields.Count-1) do
+ if Fields[x].InPrimaryKey then begin
+ if UsePrefix then result := result+'a'+Fields[x].Name
+ else result := result+Fields[x].Name;
+
+ if AddType
+ then result := result+': '+GetDAType(Fields[x].DataType);
+
+ if UseComma
+ then result := result+','
+ else result := result+'; ';
+ end;
+
+ if UseComma
+ then result := Copy(result, 1, Length(result)-1)
+ else result := Copy(result, 1, Length(result)-2);
+ end;
+end;
+
+function GetDAType(ad: TDADataType): string;
+begin
+ case ad of
+ datMemo: Result := 'IROStrings';
+ datBlob: Result := 'IROStream';
+ datAutoInc: Result := 'Integer';
+ datWideMemo: Result := 'WideString';
+ datLargeAutoInc: Result := 'Int64';
+ datGuid: result := 'TGuid';
+ datXml: result := 'IXmlNode';
+ datLargeUint: Result := 'UInt64';
+ datLargeInt: Result := 'Int64';
+ {$IFDEF TREAT_DECIMAL_AS_TBCD}
+ datDecimal: Result := 'TBcd';
+ {$ELSE}
+ datDecimal: Result := 'Double';
+ {$ENDIF}
+ datSingleFloat: Result := 'Single';
+ else
+ Result := DADataTypeNames[ad];
+ end;
+end;
+
+{ TClientUnitSchemaGenerator }
+
+procedure TClientUnitSchemaGenerator.DoWriteCode;
+var i, x : integer;
+ guid : TGUID;
+ guids : TStringList;
+ //s, s2 : string;
+ bVar: boolean;
+begin
+ guids := TStringList.Create;
+
+ with Schema do try
+ for i := 0 to (Datasets.Count-1) do begin
+ CreateGUID(guid);
+ guids.Add(GUIDToString(guid));
+ end;
+
+ Write(Format('unit %s;', [ChangeFileExt(ExtractFileName(FileName), '')]));
+ WriteEmptyLine;
+ write('{$D-}');
+ Write('interface');
+ WriteEmptyLine;
+ Write('uses');
+ Write(' Classes, DB, SysUtils, uROClasses, uDAInterfaces, uDADataTable, FmtBCD, uROXMLIntf;');
+
+ // Data table GUIDs
+ WriteEmptyLine;
+ Write('const');
+ Write('{ Data table rules ids', PASCAL_INDENTATION_LEVEL_1);
+ Write(' Feel free to change them to something more human readable', PASCAL_INDENTATION_LEVEL_1);
+ Write(' but make sure they are unique in the context of your application }', PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to (Datasets.Count-1) do begin
+ Write(Format('RID_%s = ''%s'';', [MakeValidIdentifier(Datasets[i].Name), guids[i]]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ // Data table names
+ WriteEmptyLine;
+ Write('{ Data table names }', PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to (Datasets.Count-1) do begin
+ Write(Format('nme_%s = ''%s'';', [MakeValidIdentifier(Datasets[i].Name), Datasets[i].Name]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+ WriteEmptyLine;
+
+ // Data table fields
+ for i := 0 to (Datasets.Count-1) do begin
+ Write(Format('{ %s fields }', [Datasets[i].Name]), PASCAL_INDENTATION_LEVEL_1);
+ for x := 0 to (Datasets[i].Fields.Count-1) do
+ Write(Format('fld_%s%s = ''%s'';', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), Datasets[i].Fields[x].Name]), PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ Write(Format('{ %s field indexes }', [Datasets[i].Name]), PASCAL_INDENTATION_LEVEL_1);
+ for x := 0 to (Datasets[i].Fields.Count-1) do
+ Write(Format('idx_%s%s = %d;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), x]), PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ end;
+
+ Write('type');
+ for i := 0 to (Datasets.Count-1) do begin
+ if (Trim(Datasets[i].Description)<>'') then begin
+ Write('{', PASCAL_INDENTATION_LEVEL_1);
+ Write(Datasets[i].Description, PASCAL_INDENTATION_LEVEL_1);
+ Write('}', PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ // Base interface
+ CreateGUID(guid); // This interface is just for reference. People will use the others
+ Write(Format('{ I%s }', [MakeValidIdentifier(Datasets[i].Name)]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('I%s = interface(IDAStronglyTypedDataTable)', [MakeValidIdentifier(Datasets[i].Name)]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('[''%s'']', [GuidToString(guid)]), PASCAL_INDENTATION_LEVEL_1);
+
+ with Datasets[i] do begin
+ Write('{ Property getters and setters }', PASCAL_INDENTATION_LEVEL_2);
+ for x := 0 to (Fields.Count-1) do begin
+ Write(Format('function Get%sValue: %s;', [MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ if not (Fields[x].DataType in [datMemo, datblob]) then
+ Write(Format('procedure Set%sValue(const aValue: %s);', [MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('function Get%sIsNull: Boolean;', [MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('procedure Set%sIsNull(const aValue: Boolean);', [MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ WriteEmptyLine;
+ {Write('// Methods', PASCAL_INDENTATION_LEVEL_2);
+
+ // Generates the Find method
+ s := GenFindParams(Datasets[i], TRUE, TRUE, FALSE);
+ if (s<>'') then Write(Format('function Find(%s; LocateOptions : TLocateOptions) : boolean;', [s]), PASCAL_INDENTATION_LEVEL_2);}
+
+ // Properties
+ WriteEmptyLine;
+ Write('{ Properties }', PASCAL_INDENTATION_LEVEL_2);
+ for x := 0 to (Fields.Count-1) do
+ begin
+ if Fields[x].DataType in [datMemo, datBlob] then
+ Write(Format('property %s: %s read Get%sValue;',
+ [MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2)
+ else
+ Write(Format('property %s: %s read Get%sValue write Set%sValue;',
+ [MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType),
+ MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('property %sIsNull: Boolean read Get%sIsNull write Set%sIsNull;',
+ [MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+ end;
+ Write(Format('end;', []), PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ // Implementor class
+ Write(Format('{ T%sDataTableRules }', [MakeValidIdentifier(Datasets[i].Name)]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('T%sDataTableRules = class(TDADataTableRules, I%s)', [MakeValidIdentifier(Datasets[i].Name),
+ MakeValidIdentifier(Datasets[i].Name)]), PASCAL_INDENTATION_LEVEL_1);
+
+ with Datasets[i] do begin
+ Write('private', PASCAL_INDENTATION_LEVEL_1);
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType in [datMemo, datBlob] then
+ Write(Format('f_%s: %s;',[MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]),PASCAL_INDENTATION_LEVEL_2);
+ end;
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType = datMemo then
+ Write(Format('procedure %s_OnChange(Sender: TObject);',[MakeValidIdentifier(Fields[x].Name)]),PASCAL_INDENTATION_LEVEL_2)
+ else
+ if Fields[x].DataType = datBlob then
+ Write(Format('procedure %s_OnChange(Sender: TObject);',[MakeValidIdentifier(Fields[x].Name)]),PASCAL_INDENTATION_LEVEL_2);
+ end;
+ Write('protected', PASCAL_INDENTATION_LEVEL_1);
+ Write('{ Property getters and setters }', PASCAL_INDENTATION_LEVEL_2);
+ for x := 0 to (Fields.Count-1) do begin
+ Write(Format('function Get%sValue: %s; virtual;', [MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ if not (Fields[x].DataType in [datMemo, datBlob]) then
+ Write(Format('procedure Set%sValue(const aValue: %s); virtual;', [MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('function Get%sIsNull: Boolean; virtual;', [MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('procedure Set%sIsNull(const aValue: Boolean); virtual;', [MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ WriteEmptyLine;
+ Write('{ Properties }', PASCAL_INDENTATION_LEVEL_2);
+ for x := 0 to (Fields.Count-1) do
+ begin
+ if Fields[x].DataType in [datMemo, datBlob] then
+ Write(Format('property %s: %s read Get%sValue;',
+ [MakeValidIdentifier(Fields[x].Name),
+ GetDAType(Fields[x].DataType),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2)
+ else
+ Write(Format('property %s: %s read Get%sValue write Set%sValue;',
+ [MakeValidIdentifier(Fields[x].Name),
+ GetDAType(Fields[x].DataType),
+ MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('property %sIsNull: Boolean read Get%sIsNull write Set%sIsNull;',
+ [MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ WriteEmptyLine;
+ {Write('procedure Validate; override;', PASCAL_INDENTATION_LEVEL_3);
+ WriteEmptyLine;}
+
+ Write('public', PASCAL_INDENTATION_LEVEL_1);
+ Write('constructor Create(aDataTable: TDADataTable); override;', PASCAL_INDENTATION_LEVEL_2);
+ Write('destructor Destroy; override;', PASCAL_INDENTATION_LEVEL_2);
+ WriteEmptyLine;
+
+ // Generates the Find method
+ {s := GenFindParams(Datasets[i], TRUE, TRUE, FALSE);
+ if (s<>'') then Write(Format('function Find(%s; LocateOptions : TLocateOptions) : boolean;', [s]), PASCAL_INDENTATION_LEVEL_2);}
+ end;
+
+ Write(Format('end;', []), PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ end;
+
+ Write('implementation');
+ WriteEmptyLine;
+ Write('uses Variants, uROBinaryHelpers;');
+ WriteEmptyLine;
+
+ for i := 0 to (Datasets.Count-1) do begin
+ // Implementor class
+ Write(Format('{ T%sDataTableRules }', [MakeValidIdentifier(Datasets[i].Name)]));
+
+ with Datasets[i] do begin
+ Write(Format('constructor T%sDataTableRules.Create(aDataTable: TDADataTable);', [MakeValidIdentifier(Name)]));
+ bVar:=False;
+
+ // create StrList
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType = datMemo then begin
+ if not bVar then begin
+ Write('var');
+ bVar:=True;
+ end;
+ Write(' StrList: TStringList;');
+ Break;
+ end;
+ end;
+
+ // create ROStream
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType = datBlob then begin
+ if not bVar then begin
+ Write('var');
+ end;
+ Write(' ROStream: TROStream;');
+ Break;
+ end;
+ end;
+
+ Write('begin');
+ Write(' inherited;');
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType = datMemo then begin
+ WriteEmptyLine;
+ Write(' StrList := TStringList.Create;');
+ Write(Format(' StrList.OnChange := %s_OnChange;', [MakeValidIdentifier(Fields[x].Name)]));
+ Write(Format(' f_%s := NewROStrings(StrList,True);', [MakeValidIdentifier(Fields[x].Name)]));
+ end else
+ if Fields[x].DataType = datBlob then begin
+ WriteEmptyLine;
+ Write(' ROStream := TROStream.Create;');
+ Write(Format(' ROStream.OnChange := %s_OnChange;', [MakeValidIdentifier(Fields[x].Name)]));
+ Write(Format(' f_%s := ROStream;', [MakeValidIdentifier(Fields[x].Name)]));
+ end;
+ end;
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('destructor T%sDataTableRules.Destroy;', [MakeValidIdentifier(Name)]));
+ Write('begin');
+ Write(' inherited;');
+ Write('end;');
+ WriteEmptyLine;
+
+ // Generates the Find method body
+ {s := GenFindParams(Datasets[i], TRUE, TRUE, FALSE);
+ if (s<>'') then begin
+ Write(Format('function T%s.Find(%s; LocateOptions : TLocateOptions) : boolean;', [Name, s]));
+ Write('begin');
+ s := GenFindParams(Datasets[i], FALSE, FALSE, TRUE);
+ s2 := GenFindParams(Datasets[i], FALSE, TRUE, TRUE);
+ if (Pos(',', s2)=0)
+ then Write(Format('result := DataTable.Locate(''%s'', %s, LocateOptions);', [s, s2]), PASCAL_INDENTATION_LEVEL_1)
+ else Write(Format('result := DataTable.Locate(''%s'', VarArrayOf([%s]), LocateOptions);', [s, s2]), PASCAL_INDENTATION_LEVEL_1);
+
+ Write('end;');
+ WriteEmptyLine;
+ end;}
+
+ {Write(Format('procedure T%s.Validate;', [Name]));
+ Write('begin');
+ Write('end;');
+ WriteEmptyLine;}
+
+
+ {ToDo: -cDA3 improve handling of Memos (and possibly Blobs, too), so that assignments to the returned
+ IROStream (ie MyField.Text := 'Hello') get carried back to the field data properly.
+ currently, the onmly way to chage the field is to actually assign a new IROStream to
+ the property via "MyField := ...", which is NOT GOOD.}
+
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType = datMemo then begin
+ Write(Format('procedure T%sDataTableRules.%s_OnChange(Sender: TObject);', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name)]));
+ Write('begin');
+ Write(Format(' if DataTable.Editing then DataTable.Fields[idx_%s%s].AsVariant := TStringList(Sender).Text;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ Write('end;');
+ WriteEmptyLine;
+ end else
+ if Fields[x].DataType = datBlob then begin
+ Write(Format('procedure T%sDataTableRules.%s_OnChange(Sender: TObject);', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name)]));
+ Write('begin');
+ Write(Format(' if DataTable.Editing then DataTable.Fields[idx_%s%s].LoadFromStream(TROStream(Sender));', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ Write('end;');
+ WriteEmptyLine;
+ end;
+ end;
+
+ for x := 0 to (Fields.Count-1) do begin
+ Write(Format('function T%sDataTableRules.Get%sValue: %s;', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ Write('begin');
+ case Fields[x].DataType of { }
+ datMemo:begin
+ Write(Format(' result := f_%s;',[MakeValidIdentifier(Fields[x].Name)]));
+ Write(Format(' result.Text := DataTable.Fields[idx_%s%s].AsString;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ end;
+ datBlob:begin
+ Write(Format(' result := f_%s;',[MakeValidIdentifier(Fields[x].Name)]));
+ Write(' result.Position := 0;');
+ Write(' if not Result.InUpdateMode then begin');
+ Write(Format(' DataTable.Fields[idx_%s%s].SaveToStream(result);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ Write(' result.Position := 0;');
+ Write(' end;');
+ end;
+ else
+ Write(Format(' result := DataTable.Fields[idx_%s%s].As%s;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDATypeMethod(Fields[x].DataType)]));
+ end; { case }
+ Write('end;');
+ WriteEmptyLine;
+
+ if not (Fields[x].DataType in [datMemo, datBlob]) then begin
+ Write(Format('procedure T%sDataTableRules.Set%sValue(const aValue: %s);', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ Write('begin');
+ Write(Format(' DataTable.Fields[idx_%s%s].As%s := aValue;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDATypeMethod(Fields[x].DataType)]));
+ Write('end;');
+ WriteEmptyLine;
+ end;
+
+ Write(Format('function T%sDataTableRules.Get%sIsNull: boolean;', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name)]));
+ Write('begin');
+ Write(Format(' result := DataTable.Fields[idx_%s%s].IsNull;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ Write('end;');
+ WriteEmptyLine;
+
+
+ Write(Format('procedure T%sDataTableRules.Set%sIsNull(const aValue: Boolean);', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name)]));
+ Write('begin');
+ Write(' if aValue then');
+ Write(Format(' DataTable.Fields[idx_%s%s].AsVariant := Null;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ Write('end;');
+ WriteEmptyLine;
+ end;
+ end;
+
+ WriteEmptyLine;
+ end;
+
+ Write('initialization');
+ for i := 0 to (Datasets.Count-1) do
+ Write(Format('RegisterDataTableRules(RID_%s, T%sDataTableRules);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Name)]), PASCAL_INDENTATION_LEVEL_1);
+
+ WriteEmptyLine;
+ Write('end.');
+ finally
+ guids.Free;
+ end;
+end;
+
+{ TServerUnitSchemaGenerator }
+
+procedure TServerUnitSchemaGenerator.DoWriteCode;
+var i, x : integer;
+ guid : TGUID;
+ guids : TStringList;
+ //s, s2 : string;
+ bVar: Boolean;
+begin
+ guids := TStringList.Create;
+
+ with Schema do try
+ for i := 0 to (Datasets.Count-1) do begin
+ CreateGUID(guid);
+ guids.Add(GUIDToString(guid));
+ end;
+
+ Write(Format('unit %s;', [ChangeFileExt(ExtractFileName(FileName), '')]));
+ WriteEmptyLine;
+ write('{$D-}');
+ Write('interface');
+ WriteEmptyLine;
+ Write('uses');
+ Write(Format(' Classes, DB, SysUtils, uROClasses, uDADataTable, uDABusinessProcessor, FmtBCD, uROXMLIntf, %s;', [ClientUnitName]));
+
+ // Data table GUIDs
+ WriteEmptyLine;
+ Write('const');
+ Write('{ Delta rules ids ', PASCAL_INDENTATION_LEVEL_1);
+ Write(' Feel free to change them to something more human readable', PASCAL_INDENTATION_LEVEL_1);
+ Write(' but make sure they are unique in the context of your application }', PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to (Datasets.Count-1) do begin
+ Write(Format('RID_%sDelta = ''%s'';', [MakeValidIdentifier(Datasets[i].Name), guids[i]]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+ WriteEmptyLine;
+
+ Write('type');
+ for i := 0 to (Datasets.Count-1) do begin
+ // Business delta change
+ Write(Format('{ I%sDelta }', [MakeValidIdentifier(Datasets[i].Name)]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('I%sDelta = interface(I%s)', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Name)]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('[''%s'']', [guids[i]]), PASCAL_INDENTATION_LEVEL_1);
+
+ with Datasets[i] do begin
+ Write('{ Property getters and setters }', PASCAL_INDENTATION_LEVEL_2);
+ for x := 0 to (Fields.Count-1) do begin
+ Write(Format('function GetOld%sValue : %s;', [MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+ WriteEmptyLine;
+
+ // Properties
+ Write('{ Properties }', PASCAL_INDENTATION_LEVEL_2);
+ for x := 0 to (Fields.Count-1) do
+ Write(Format('property Old%s : %s read GetOld%sValue;',
+ [MakeValidIdentifier(Fields[x].Name),
+ GetDAType(Fields[x].DataType),
+ MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+
+ Write(Format('end;', []), PASCAL_INDENTATION_LEVEL_1);
+ end;
+ WriteEmptyLine;
+
+ // Implementor class
+ Write(Format('{ T%sBusinessProcessorRules }', [MakeValidIdentifier(Datasets[i].Name)]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('T%sBusinessProcessorRules = class(TDABusinessProcessorRules, I%s, I%sDelta)', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Name)]), PASCAL_INDENTATION_LEVEL_1);
+
+ with Datasets[i] do begin
+ Write('private', PASCAL_INDENTATION_LEVEL_1);
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType in [datMemo, datBlob] then
+ Write(Format('f_%s: %s;',[MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]),PASCAL_INDENTATION_LEVEL_2);
+ end;
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType = datMemo then
+ Write(Format('procedure %s_OnChange(Sender: TObject);',[MakeValidIdentifier(Fields[x].Name)]),PASCAL_INDENTATION_LEVEL_2)
+ else
+ if Fields[x].DataType = datBlob then
+ Write(Format('procedure %s_OnChange(Sender: Tobject);',[MakeValidIdentifier(Fields[x].Name)]),PASCAL_INDENTATION_LEVEL_2);
+ end;
+ Write('protected', PASCAL_INDENTATION_LEVEL_1);
+ Write('{ Property getters and setters }', PASCAL_INDENTATION_LEVEL_2);
+ for x := 0 to (Fields.Count-1) do begin
+ Write(Format('function Get%sValue: %s; virtual;', [MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('function Get%sIsNull: Boolean; virtual;', [MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('function GetOld%sValue: %s; virtual;', [MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('function GetOld%sIsNull: Boolean; virtual;', [MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ if not(Fields[x].DataType in [datMemo, datBlob]) then
+ Write(Format('procedure Set%sValue(const aValue: %s); virtual;', [MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('procedure Set%sIsNull(const aValue: Boolean); virtual;', [MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ WriteEmptyLine;
+ Write('{ Properties }', PASCAL_INDENTATION_LEVEL_2);
+ for x := 0 to (Fields.Count-1) do begin
+ if (Fields[x].DataType in [datMemo, datBlob]) then
+ Write(Format('property %s : %s read Get%sValue;',
+ [MakeValidIdentifier(Fields[x].Name),
+ GetDAType(Fields[x].DataType),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2)
+ else
+ Write(Format('property %s : %s read Get%sValue write Set%sValue;',
+ [MakeValidIdentifier(Fields[x].Name),
+ GetDAType(Fields[x].DataType),
+ MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('property %sIsNull : Boolean read Get%sIsNull write Set%sIsNull;',
+ [MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('property Old%s : %s read GetOld%sValue;',
+ [MakeValidIdentifier(Fields[x].Name),
+ GetDAType(Fields[x].DataType),
+ MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('property Old%sIsNull : Boolean read GetOld%sIsNull;',
+ [MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name),
+ MakeValidIdentifier(Fields[x].Name)]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ WriteEmptyLine;
+
+ Write('public', PASCAL_INDENTATION_LEVEL_1);
+ Write('constructor Create(aBusinessProcessor: TDABusinessProcessor); override;', PASCAL_INDENTATION_LEVEL_2);
+ Write('destructor Destroy; override;', PASCAL_INDENTATION_LEVEL_2);
+ WriteEmptyLine;
+
+ // Generates the Find method
+ {s := GenFindParams(Datasets[i], TRUE, TRUE, FALSE);
+ if (s<>'') then Write(Format('function Find(%s; LocateOptions : TLocateOptions) : boolean;', [s]), PASCAL_INDENTATION_LEVEL_2);}
+ end;
+
+ Write(Format('end;', []), PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ end;
+
+ Write('implementation');
+ WriteEmptyLine;
+ Write('uses');
+ Write(' Variants, uROBinaryHelpers, uDAInterfaces;');
+ WriteEmptyLine;
+
+ for i := 0 to (Datasets.Count-1) do begin
+ // Implementor class
+ Write(Format('{ T%sBusinessProcessorRules }', [MakeValidIdentifier(Datasets[i].Name)]));
+
+ with Datasets[i] do begin
+ Write(Format('constructor T%sBusinessProcessorRules.Create(aBusinessProcessor: TDABusinessProcessor);', [MakeValidIdentifier(Name)]));
+ bVar:=False;
+
+ // create StrList
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType = datMemo then begin
+ if not bVar then begin
+ Write('var');
+ bVar:=True;
+ end;
+ Write(' StrList: TStringList;');
+ Break;
+ end;
+ end;
+
+ // create ROStream
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType = datBlob then begin
+ if not bVar then begin
+ Write('var');
+ end;
+ Write(' ROStream: TROStream;');
+ Break;
+ end;
+ end;
+
+ Write('begin');
+ Write(' inherited;');
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType = datMemo then begin
+ WriteEmptyLine;
+ Write(' StrList := TStringList.Create;');
+ Write(Format(' StrList.OnChange := %s_OnChange;', [MakeValidIdentifier(Fields[x].Name)]));
+ Write(Format(' f_%s := NewROStrings(StrList,True);', [MakeValidIdentifier(Fields[x].Name)]));
+ end else
+ if Fields[x].DataType = datBlob then begin
+ WriteEmptyLine;
+ Write(' ROStream := TROStream.Create;');
+ Write(Format(' ROStream.OnChange := %s_OnChange;', [MakeValidIdentifier(Fields[x].Name)]));
+ Write(Format(' f_%s := ROStream;', [MakeValidIdentifier(Fields[x].Name)]));
+ end;
+ end;
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('destructor T%sBusinessProcessorRules.Destroy;', [MakeValidIdentifier(Name)]));
+ Write('begin');
+ Write(' inherited;');
+ Write('end;');
+ WriteEmptyLine;
+
+ for x := 0 to (Fields.Count-1) do begin
+ if Fields[x].DataType = datMemo then begin
+ Write(Format('procedure T%sBusinessProcessorRules.%s_OnChange(Sender: TObject);', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name)]));
+ Write('begin');
+ Write(Format(' BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s] := TStringList(Sender).Text;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ Write('end;');
+ WriteEmptyLine;
+ end else
+ if Fields[x].DataType = datBlob then begin
+ Write(Format('procedure T%sBusinessProcessorRules.%s_OnChange(Sender: TObject);', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name)]));
+ Write('begin');
+ Write(Format(' BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s] := BinaryToBlobVariant((TROStream(Sender) as IROStream).Stream);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ Write('end;');
+ WriteEmptyLine;
+ end;
+ end;
+
+ for x := 0 to (Fields.Count-1) do begin
+ Write(Format('function T%sBusinessProcessorRules.Get%sValue: %s;', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ Write('begin');
+ case Fields[x].DataType of
+ datMemo:begin
+ Write(Format(' result := f_%s;',[MakeValidIdentifier(Fields[x].Name)]));
+ Write(Format(' result.Text := BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s];', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ end;
+ datBlob:begin
+ Write(Format(' result := f_%s;',[MakeValidIdentifier(Fields[x].Name)]));
+ Write(' result.Position := 0;');
+ Write(' if not Result.InUpdateMode then begin');
+ Write(Format(' BlobVariantToBinary(BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s], result.Stream);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ Write(' result.Position := 0;');
+ Write(' end;');
+ end;
+ {$IFDEF TREAT_DECIMAL_AS_TBCD}
+ datDecimal: begin
+ Write(Format(' result := GetVarDecimal(BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s]);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ {$ENDIF}
+ datXml: begin
+ Write(Format(' result := GetVarXml(BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s]);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ datGuid: begin
+ Write(Format(' result := GetVarGuid(BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s]);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ else begin
+ Write(Format(' result := BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s];', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ end;
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('function T%sBusinessProcessorRules.Get%sIsNull: Boolean;', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name)]));
+ Write('var v: variant;');
+ Write('begin');
+ Write(Format(' v := BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s];', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ Write(' result := VarIsNull(v) or VarIsClear(v);');
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('function T%sBusinessProcessorRules.GetOld%sValue: %s;', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ Write('begin');
+ case Fields[x].DataType of
+ datMemo:begin
+ Write(' result := NewROStrings();');
+ Write(Format(' result.Text := BusinessProcessor.CurrentChange.OldValueByName[fld_%s%s];', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ end;
+ datBlob:begin
+ Write(' result := NewROStream();');
+ Write(Format(' BlobVariantToBinary(BusinessProcessor.CurrentChange.OldValueByName[fld_%s%s], result.Stream);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ end;
+ {$IFDEF TREAT_DECIMAL_AS_TBCD}
+ datDecimal: begin
+ Write(Format(' result := GetVarDecimal(BusinessProcessor.CurrentChange.OldValueByName[fld_%s%s]);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ {$ENDIF}
+ datXml: begin
+ Write(Format(' result := GetVarXml(BusinessProcessor.CurrentChange.OldValueByName[fld_%s%s]);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ datGuid: begin
+ Write(Format(' result := GetVarGuid(BusinessProcessor.CurrentChange.OldValueByName[fld_%s%s]);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ else begin
+ Write(Format(' result := BusinessProcessor.CurrentChange.OldValueByName[fld_%s%s];', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ end;
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('function T%sBusinessProcessorRules.GetOld%sIsNull: Boolean;', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name)]));
+ Write('var v: variant;');
+ Write('begin');
+ Write(Format(' v := BusinessProcessor.CurrentChange.OldValueByName[fld_%s%s];', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ Write(' result := VarIsNull(v) or VarIsClear(v);');
+ Write('end;');
+ WriteEmptyLine;
+
+ if not(Fields[x].DataType in [datMemo, datBlob]) then begin
+ Write(Format('procedure T%sBusinessProcessorRules.Set%sValue(const aValue: %s);', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ Write('begin');
+ case Fields[x].DataType of
+ {$IFDEF TREAT_DECIMAL_AS_TBCD}
+ datDecimal: begin
+ Write(Format(' BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s] := BCDToVariant(aValue);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ {$ENDIF}
+ datXml: begin
+ Write( ' if aValue = nil then');
+ Write(Format(' BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s] := ''''', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ Write( ' else');
+ Write(Format(' BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s] := aValue.XML;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ datGuid: begin
+ Write(Format(' BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s] := GUIDToString(aValue);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ else
+ Write(Format(' BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s] := aValue;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name), GetDAType(Fields[x].DataType)]));
+ end;
+ Write('end;');
+ WriteEmptyLine;
+ end;
+
+ Write(Format('procedure T%sBusinessProcessorRules.Set%sIsNull(const aValue: Boolean);', [MakeValidIdentifier(Name), MakeValidIdentifier(Fields[x].Name)]));
+ Write('begin');
+ write(' if aValue then');
+ Write(Format(' BusinessProcessor.CurrentChange.NewValueByName[fld_%s%s] := Null;', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Fields[x].Name)]));
+ Write('end;');
+ WriteEmptyLine;
+ end;
+ end;
+
+ WriteEmptyLine;
+ end;
+
+ Write('initialization');
+ for i := 0 to (Datasets.Count-1) do
+ Write(Format('RegisterBusinessProcessorRules(RID_%sDelta, T%sBusinessProcessorRules);', [MakeValidIdentifier(Datasets[i].Name), MakeValidIdentifier(Datasets[i].Name)]), PASCAL_INDENTATION_LEVEL_1);
+
+ WriteEmptyLine;
+ Write('end.');
+ finally
+ guids.Free;
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASelectDataTablesForm.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASelectDataTablesForm.dfm
new file mode 100644
index 0000000..cbe8103
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASelectDataTablesForm.dfm
@@ -0,0 +1,204 @@
+object DASelectDataTablesForm: TDASelectDataTablesForm
+ Left = 312
+ Top = 219
+ Width = 275
+ Height = 426
+ HorzScrollBar.Range = 59
+ ActiveControl = btn_Ok
+ AutoScroll = False
+ BorderWidth = 5
+ Caption = 'Select Data Tables...'
+ Color = clBtnFace
+ Constraints.MinHeight = 300
+ Constraints.MinWidth = 275
+ ParentFont = True
+ Icon.Data = {
+ 0000010002001010000001000800680500002600000010100000010020006804
+ 00008E0500002800000010000000200000000100080000000000000100000000
+ 000000000000000100000001000000000000A84A0300AE500600D2761800C777
+ 2900CA792C0089815D00B28B5D00CC895100DEA25A00D59E6F00DEAA6A002778
+ 9100FF00FF001182AB001E93BE003F9EBC00609592006D9B9A0044B3BE0063BB
+ BC0067B9BD0026A3D10056ADC60043B2CC0048BCCF005BB7D20055BBD70066BB
+ CF006DBCCF003ECAE60023D5FC005ACADD007BD1DE0055D0E90055D8F00050DC
+ F20054DAF40052DDF9006BCEE7004DE2FA009EBBA10093C1BA009AD5CA008ED8
+ DE0099F1ED008CEAF70086F3F80090F2F40099F9F700A2F3EE00A2FAF800AAFA
+ F800B8F8FB00C3FBFA00CCFBFC00E8FEFD000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000FFFFFF000000000000000000000E0E0E0E0E00000000
+ 0000000000000E241F262E270E00000000000000010101011F262E27160E0000
+ 0E0E0E0E010A0B011F262E27160E000E281F0601050908011F262E27160E0E2F
+ 281F0103040101011710171D1A0E0E2F281F0102010C11191F262E1B0F0E0E2F
+ 281F152A270E2F281F262E27160E0E211C1710171D0E2F1513262E27160E0E18
+ 1E1F262C120C010201242E27160E0E2F281F26010101040301293130220E0E2F
+ 281F240108090501073231310E000E2F281F20010B0A010E0E0E0E0E00000E37
+ 35342B0101010100000000000000000E3836332D2D0E00000000000000000000
+ 0E0E0E0E0E000000000000000000FF830000FF010000FC000000C00000008000
+ 0000000000000000000000000000000000000000000000000000000100000003
+ 0000007F000080FF0000C1FF0000280000001000000020000000010020000000
+ 0000400400000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000001182AB401182ABFF1182
+ ABFF1182ABFF1182ABFF1182ABFF1182AB400000000000000000000000000000
+ 00000000000000000000000000009932003D1182AB401182ABFF50DCF2FF23D5
+ FCFF52DEFAFF8CEAF7FF6BCEE7FF1182ABFF1182AB4000000000000000000000
+ 0000000000000000000000000000A84A03FFA84A03FFA84A03FFA84A03FF23D5
+ FCFF52DEFAFF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF000000001182AB401182
+ ABFF1182ABFF1182ABFF498A96FFA84A03FFD59E6FFFDEAA6AFFA84A03FF23D5
+ FCFF52DEFAFF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF1182AB401182ABFF4DE2
+ FAFF23D5FCFF89815DFFA84A03FFCA792CFFDEA25AFFCC8951FFA84A03FF23D5
+ FCFF52DEFAFF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF1182ABFF86F3F8FF4DE2
+ FAFF23D5FCFFA84A03FFD27618FFC77729FFA84A03FFA84A03FFA84A03FF56AD
+ C6FF3F9EBCFF56ADC6FF6DBCCFFF5BB7D2FF1182ABFF1182ABFF86F3F8FF4DE2
+ FAFF23D5FCFFA84A03FFAE5006FFA84A03FF277890FF609592FF48BCCFFF23D5
+ FCFF52DEFAFF8CEAF7FF55BBD7FF1E93BEFF1182ABFF1182ABFF86F3F8FF4DE2
+ FAFF23D5FCFF67B9BDFF93C1BAFF6BCEE7FF1182ABFF86F3F8FF4DE2FAFF23D5
+ FCFF52DEFAFF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF1182ABFF7BD1DEFF66BB
+ CFFF56ADC6FF3F9EBCFF56ADC6FF6DBCCFFF1182ABFF86F3F8FF63BBBCFF44B3
+ BEFF52DEFAFF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF1182ABFF43B2CCFF3ECA
+ E6FF23D5FCFF52DEFAFF8ED8DEFF6D9B9AFF277992FFA84A03FFAE5006FFA84A
+ 03FF55D8F0FF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF1182ABFF86F3F8FF4DE2
+ FAFF23D5FCFF52DDF9FFA84A03FFA84A03FFA84A03FFC77729FFD27618FFA84A
+ 03FF9EBBA1FF99F9F7FF90F2F4FF55D0E9FF1182ABFF1182ABFF86F3F8FF4DE2
+ FAFF23D5FCFF54DAF4FFA84A03FFCC8951FFDEA25AFFCA792CFFA84A03FFB28B
+ 5DFFA2F3EEFF99F9F7FF99F9F7FF1182ABFF1182AB401182ABFF86F3F8FF4DE2
+ FAFF23D5FCFF5ACADDFFA84A03FFDEAA6AFFD59E6FFFA84A03FF47818FFF1182
+ ABFF1182ABFF1182ABFF1182ABFF1182AB40000000001182ABFFCCFBFCFFB8F8
+ FBFFAAFAF8FF9AD5CAFFA84A03FFA84A03FFA84A03FFA84A03FF000000000000
+ 000000000000000000000000000000000000000000001182AB401182ABFFE8FE
+ FDFFC3FBFAFFA2FAF8FF99F3EFFF9AF0ECFF1182ABFF1182AB40000000000000
+ 00000000000000000000000000000000000000000000000000001182AB401182
+ ABFF1182ABFF1182ABFF1182ABFF1182ABFF1182AB4000000000000000000000
+ 00000000000000000000000000000000000000000000FF010000FC000000FC00
+ 0000800000000000000000000000000000000000000000000000000000000000
+ 00000000000000010000007F0000007F000080FF0000}
+ OldCreateOrder = True
+ Position = poScreenCenter
+ DesignSize = (
+ 249
+ 380)
+ PixelsPerInch = 96
+ TextHeight = 13
+ object btn_Ok: TBitBtn
+ Left = 94
+ Top = 354
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Caption = 'OK'
+ Default = True
+ ModalResult = 1
+ TabOrder = 0
+ Glyph.Data = {
+ D6020000424DD602000000000000D60000002800000020000000100000000100
+ 08000000000000020000C30E0000C30E0000280000002800000000000000FFFF
+ FF00FF00FF0000660000149D210019AA2B00179D27001AB02D001BA92E001DB1
+ 32001EB231001FB133001EAE310022B7380021B4370025A83B0031C24F0031B5
+ 4D003BCB5E0041C5630047D36D004FD6790053DE7F00CACACA00C4C4C400BFBF
+ BF00B5B5B500ABABAB00A5A5A5009E9E9E009C9C9C009A9A9A00999999009898
+ 98009797970094949400939393008C8C8C008A8A8A0065656500020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020203
+ 030202020202020202020202020202272702020202020202020202020202030A
+ 0B03020202020202020202020202271F1F27020202020202020202020203100D
+ 070E0302020202020202020202271B1D221E270202020202020202020314120F
+ 03080903020202020202020227191A2127232027020202020202020315161103
+ 0203060C030202020202022718171C2702272521270202020202020203130302
+ 020202030503020202020202271A270202020227242702020202020202030202
+ 0202020203040302020202020227020202020202272627020202020202020202
+ 0202020202020303020202020202020202020202020227270202020202020202
+ 0202020202020203030202020202020202020202020202272702020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202}
+ NumGlyphs = 2
+ end
+ object btn_Cancel: TBitBtn
+ Left = 174
+ Top = 354
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Cancel = True
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 1
+ Glyph.Data = {
+ 8A030000424D8A030000000000008A0100002800000020000000100000000100
+ 08000000000000020000C30E0000C30E0000550000005500000000000000FFFF
+ FF00FF00FF004071FA004274FF00497AFC00275AFF002C5FFF003664FA00386B
+ FF00174AFD001A4CFF001B4DFF001D50FF002355FF002558FF002655FA002E5B
+ F9002D59F400325DF1003B66F3000030FC000132FF000134FF000C3CFF00103D
+ FB00103BF4001342FF001743F6001847FF001A48F9001A47F8001B46F6001D4B
+ FF001C47F6001D48F6001D49F600214EFC00204BF800204CF800224DF800224C
+ F400224DF1002550F400002CF800002DF800002CF600002AF300012DF600032B
+ F2000431FE000733F600123BF100143EF40000009A00C0C0C000BEBEBE00BBBB
+ BB00B9B9B900B6B6B600B5B5B500B3B3B300B1B1B100B0B0B000AFAFAF00AEAE
+ AE00ACACAC00ABABAB00AAAAAA00A9A9A900A8A8A800A7A7A700A6A6A600A4A4
+ A400A3A3A300A2A2A200A0A0A0009F9F9F009E9E9E009C9C9C009A9A9A009999
+ 990098989800979797006B6B6B00020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202363602020202020236360202020202
+ 02545402020202020254540202020202360A1A3602020202362C153602020202
+ 54464C540202020254504F5402020202361F0B343602023630162F3602020202
+ 5447444D54020254514E5354020202020236220C3536362D1731360202020202
+ 025447434B5454504E52540202020202020236230D1932162E36020202020202
+ 02025447424A4D4E5154020202020202020202361E1B18333602020202020202
+ 0202025447474A4F54020202020202020202023625211D1C3602020202020202
+ 02020254424245495402020202020202020236110728260E2036020202020202
+ 0202543E3D434440485402020202020202360809123636290F24360202020202
+ 02543B3A415454453F4754020202020236030413360202362A06273602020202
+ 5439384054020254473E4454020202023605143602020202362B103602020202
+ 54373C5402020202544441540202020202363602020202020236360202020202
+ 0254540202020202025454020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202}
+ NumGlyphs = 2
+ end
+ object lb_DataTables: TCheckListBox
+ Left = 0
+ Top = 0
+ Width = 249
+ Height = 349
+ OnClickCheck = lb_DataTablesClick
+ Align = alTop
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ ItemHeight = 13
+ TabOrder = 2
+ OnClick = lb_DataTablesClick
+ OnDblClick = lb_DataTablesClick
+ end
+ object cb_SelectAll: TCheckBox
+ Left = 0
+ Top = 355
+ Width = 65
+ Height = 12
+ Anchors = [akLeft, akBottom]
+ Caption = 'Select &All'
+ TabOrder = 3
+ OnClick = cb_SelectAllClick
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASelectDataTablesForm.lfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASelectDataTablesForm.lfm
new file mode 100644
index 0000000..f4f2117
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASelectDataTablesForm.lfm
@@ -0,0 +1,206 @@
+object DASelectDataTablesForm: TDASelectDataTablesForm
+ Left = 348
+ Height = 300
+ Top = 169
+ Width = 275
+ HorzScrollBar.Page = 274
+ HorzScrollBar.Range = 59
+ VertScrollBar.Page = 299
+ ActiveControl = btn_Ok
+ Caption = 'Select Data Tables...'
+ ClientHeight = 300
+ ClientWidth = 275
+ Constraints.MinHeight = 300
+ Constraints.MinWidth = 275
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Pitch = fpVariable
+ Icon.Data = {
+ B609000000000100020010100000010008006805000026000000101000000100
+ 2000680400008E05000028000000100000002000000001000800000000000001
+ 00000000000000000000000100000001000000000000A84A0300AE500600D276
+ 1800C7772900CA792C0089815D00B28B5D00CC895100DEA25A00D59E6F00DEAA
+ 6A0027789100FF00FF001182AB001E93BE003F9EBC00609592006D9B9A0044B3
+ BE0063BBBC0067B9BD0026A3D10056ADC60043B2CC0048BCCF005BB7D20055BB
+ D70066BBCF006DBCCF003ECAE60023D5FC005ACADD007BD1DE0055D0E90055D8
+ F00050DCF20054DAF40052DDF9006BCEE7004DE2FA009EBBA10093C1BA009AD5
+ CA008ED8DE0099F1ED008CEAF70086F3F80090F2F40099F9F700A2F3EE00A2FA
+ F800AAFAF800B8F8FB00C3FBFA00CCFBFC00E8FEFD0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000FFFFFF000000000000000000000E0E0E0E0E
+ 000000000000000000000E241F262E270E00000000000000010101011F262E27
+ 160E00000E0E0E0E010A0B011F262E27160E000E281F0601050908011F262E27
+ 160E0E2F281F0103040101011710171D1A0E0E2F281F0102010C11191F262E1B
+ 0F0E0E2F281F152A270E2F281F262E27160E0E211C1710171D0E2F1513262E27
+ 160E0E181E1F262C120C010201242E27160E0E2F281F26010101040301293130
+ 220E0E2F281F240108090501073231310E000E2F281F20010B0A010E0E0E0E0E
+ 00000E3735342B0101010100000000000000000E3836332D2D0E000000000000
+ 000000000E0E0E0E0E000000000000000000FF830000FF010000FC000000C000
+ 0000800000000000000000000000000000000000000000000000000000000001
+ 000000030000007F000080FF0000C1FF00002800000010000000200000000100
+ 2000000000004004000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000001182AB401182
+ ABFF1182ABFF1182ABFF1182ABFF1182ABFF1182AB4000000000000000000000
+ 0000000000000000000000000000000000009932003D1182AB401182ABFF50DC
+ F2FF23D5FCFF52DEFAFF8CEAF7FF6BCEE7FF1182ABFF1182AB40000000000000
+ 000000000000000000000000000000000000A84A03FFA84A03FFA84A03FFA84A
+ 03FF23D5FCFF52DEFAFF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF000000001182
+ AB401182ABFF1182ABFF1182ABFF498A96FFA84A03FFD59E6FFFDEAA6AFFA84A
+ 03FF23D5FCFF52DEFAFF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF1182AB401182
+ ABFF4DE2FAFF23D5FCFF89815DFFA84A03FFCA792CFFDEA25AFFCC8951FFA84A
+ 03FF23D5FCFF52DEFAFF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF1182ABFF86F3
+ F8FF4DE2FAFF23D5FCFFA84A03FFD27618FFC77729FFA84A03FFA84A03FFA84A
+ 03FF56ADC6FF3F9EBCFF56ADC6FF6DBCCFFF5BB7D2FF1182ABFF1182ABFF86F3
+ F8FF4DE2FAFF23D5FCFFA84A03FFAE5006FFA84A03FF277890FF609592FF48BC
+ CFFF23D5FCFF52DEFAFF8CEAF7FF55BBD7FF1E93BEFF1182ABFF1182ABFF86F3
+ F8FF4DE2FAFF23D5FCFF67B9BDFF93C1BAFF6BCEE7FF1182ABFF86F3F8FF4DE2
+ FAFF23D5FCFF52DEFAFF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF1182ABFF7BD1
+ DEFF66BBCFFF56ADC6FF3F9EBCFF56ADC6FF6DBCCFFF1182ABFF86F3F8FF63BB
+ BCFF44B3BEFF52DEFAFF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF1182ABFF43B2
+ CCFF3ECAE6FF23D5FCFF52DEFAFF8ED8DEFF6D9B9AFF277992FFA84A03FFAE50
+ 06FFA84A03FF55D8F0FF8CEAF7FF6BCEE7FF26A3D1FF1182ABFF1182ABFF86F3
+ F8FF4DE2FAFF23D5FCFF52DDF9FFA84A03FFA84A03FFA84A03FFC77729FFD276
+ 18FFA84A03FF9EBBA1FF99F9F7FF90F2F4FF55D0E9FF1182ABFF1182ABFF86F3
+ F8FF4DE2FAFF23D5FCFF54DAF4FFA84A03FFCC8951FFDEA25AFFCA792CFFA84A
+ 03FFB28B5DFFA2F3EEFF99F9F7FF99F9F7FF1182ABFF1182AB401182ABFF86F3
+ F8FF4DE2FAFF23D5FCFF5ACADDFFA84A03FFDEAA6AFFD59E6FFFA84A03FF4781
+ 8FFF1182ABFF1182ABFF1182ABFF1182ABFF1182AB40000000001182ABFFCCFB
+ FCFFB8F8FBFFAAFAF8FF9AD5CAFFA84A03FFA84A03FFA84A03FFA84A03FF0000
+ 00000000000000000000000000000000000000000000000000001182AB401182
+ ABFFE8FEFDFFC3FBFAFFA2FAF8FF99F3EFFF9AF0ECFF1182ABFF1182AB400000
+ 0000000000000000000000000000000000000000000000000000000000001182
+ AB401182ABFF1182ABFF1182ABFF1182ABFF1182ABFF1182AB40000000000000
+ 0000000000000000000000000000000000000000000000000000
+ }
+ Position = poScreenCenter
+ object btn_Ok: TBitBtn
+ AnchorSideTop.Side = asrBottom
+ Left = 89
+ Height = 25
+ Top = 271
+ Width = 90
+ Align = alCustom
+ Anchors = [akRight, akBottom]
+ Caption = 'OK'
+ Default = True
+ Glyph.Data = {
+ D6020000424DD602000000000000D60000002800000020000000100000000100
+ 08000000000000020000C30E0000C30E0000280000002800000000000000FFFF
+ FF00FF00FF0000660000149D210019AA2B00179D27001AB02D001BA92E001DB1
+ 32001EB231001FB133001EAE310022B7380021B4370025A83B0031C24F0031B5
+ 4D003BCB5E0041C5630047D36D004FD6790053DE7F00CACACA00C4C4C400BFBF
+ BF00B5B5B500ABABAB00A5A5A5009E9E9E009C9C9C009A9A9A00999999009898
+ 98009797970094949400939393008C8C8C008A8A8A0065656500020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020203
+ 030202020202020202020202020202272702020202020202020202020202030A
+ 0B03020202020202020202020202271F1F27020202020202020202020203100D
+ 070E0302020202020202020202271B1D221E270202020202020202020314120F
+ 03080903020202020202020227191A2127232027020202020202020315161103
+ 0203060C030202020202022718171C2702272521270202020202020203130302
+ 020202030503020202020202271A270202020227242702020202020202030202
+ 0202020203040302020202020227020202020202272627020202020202020202
+ 0202020202020303020202020202020202020202020227270202020202020202
+ 0202020202020203030202020202020202020202020202272702020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202
+ }
+ ModalResult = 1
+ NumGlyphs = 2
+ TabOrder = 2
+ end
+ object btn_Cancel: TBitBtn
+ AnchorSideTop.Side = asrBottom
+ Left = 180
+ Height = 25
+ Top = 271
+ Width = 90
+ Align = alCustom
+ Anchors = [akRight, akBottom]
+ Cancel = True
+ Caption = 'Cancel'
+ Glyph.Data = {
+ 8A030000424D8A030000000000008A0100002800000020000000100000000100
+ 08000000000000020000C30E0000C30E0000550000005500000000000000FFFF
+ FF00FF00FF004071FA004274FF00497AFC00275AFF002C5FFF003664FA00386B
+ FF00174AFD001A4CFF001B4DFF001D50FF002355FF002558FF002655FA002E5B
+ F9002D59F400325DF1003B66F3000030FC000132FF000134FF000C3CFF00103D
+ FB00103BF4001342FF001743F6001847FF001A48F9001A47F8001B46F6001D4B
+ FF001C47F6001D48F6001D49F600214EFC00204BF800204CF800224DF800224C
+ F400224DF1002550F400002CF800002DF800002CF600002AF300012DF600032B
+ F2000431FE000733F600123BF100143EF40000009A00C0C0C000BEBEBE00BBBB
+ BB00B9B9B900B6B6B600B5B5B500B3B3B300B1B1B100B0B0B000AFAFAF00AEAE
+ AE00ACACAC00ABABAB00AAAAAA00A9A9A900A8A8A800A7A7A700A6A6A600A4A4
+ A400A3A3A300A2A2A200A0A0A0009F9F9F009E9E9E009C9C9C009A9A9A009999
+ 990098989800979797006B6B6B00020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202363602020202020236360202020202
+ 02545402020202020254540202020202360A1A3602020202362C153602020202
+ 54464C540202020254504F5402020202361F0B343602023630162F3602020202
+ 5447444D54020254514E5354020202020236220C3536362D1731360202020202
+ 025447434B5454504E52540202020202020236230D1932162E36020202020202
+ 02025447424A4D4E5154020202020202020202361E1B18333602020202020202
+ 0202025447474A4F54020202020202020202023625211D1C3602020202020202
+ 02020254424245495402020202020202020236110728260E2036020202020202
+ 0202543E3D434440485402020202020202360809123636290F24360202020202
+ 02543B3A415454453F4754020202020236030413360202362A06273602020202
+ 5439384054020254473E4454020202023605143602020202362B103602020202
+ 54373C5402020202544441540202020202363602020202020236360202020202
+ 0254540202020202025454020202020202020202020202020202020202020202
+ 0202020202020202020202020202020202020202020202020202020202020202
+ 0202020202020202020202020202
+ }
+ ModalResult = 2
+ NumGlyphs = 2
+ TabOrder = 3
+ end
+ object lb_DataTables: TCheckListBox
+ Height = 266
+ Width = 275
+ Align = alTop
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ ItemHeight = 13
+ OnClick = lb_DataTablesClick
+ OnClickCheck = lb_DataTablesClick
+ OnDblClick = lb_DataTablesClick
+ TabOrder = 0
+ end
+ object cb_SelectAll: TCheckBox
+ AnchorSideTop.Side = asrBottom
+ Left = 8
+ Height = 21
+ Top = 273
+ Width = 72
+ Align = alCustom
+ Anchors = [akLeft, akBottom]
+ Caption = 'Select &All'
+ OnClick = cb_SelectAllClick
+ TabOrder = 1
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASelectDataTablesForm.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASelectDataTablesForm.lrs
new file mode 100644
index 0000000..88a24b6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/IDE/uDASelectDataTablesForm.lrs
@@ -0,0 +1,168 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TDASelectDataTablesForm','FORMDATA',[
+ 'TPF0'#23'TDASelectDataTablesForm'#22'DASelectDataTablesForm'#4'Left'#3'\'#1#6
+ +'Height'#3','#1#3'Top'#3#169#0#5'Width'#3#19#1#18'HorzScrollBar.Page'#3#18#1
+ +#19'HorzScrollBar.Range'#2';'#18'VertScrollBar.Page'#3'+'#1#13'ActiveControl'
+ +#7#6'btn_Ok'#7'Caption'#6#21'Select Data Tables...'#12'ClientHeight'#3','#1
+ +#11'ClientWidth'#3#19#1#21'Constraints.MinHeight'#3','#1#20'Constraints.MinW'
+ +'idth'#3#19#1#11'Font.Height'#2#245#9'Font.Name'#6#6'Tahoma'#10'Font.Pitch'#7
+ +#10'fpVariable'#9'Icon.Data'#10#186#9#0#0#182#9#0#0#0#0#1#0#2#0#16#16#0#0#1#0
+ +#8#0'h'#5#0#0'&'#0#0#0#16#16#0#0#1#0' '#0'h'#4#0#0#142#5#0#0'('#0#0#0#16#0#0
+ +#0' '#0#0#0#1#0#8#0#0#0#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#1#0#0#0#1#0#0#0#0#0#0
+ +#168'J'#3#0#174'P'#6#0#210'v'#24#0#199'w)'#0#202'y,'#0#137#129']'#0#178#139
+ +']'#0#204#137'Q'#0#222#162'Z'#0#213#158'o'#0#222#170'j'#0'''x'#145#0#255#0
+ +#255#0#17#130#171#0#30#147#190#0'?'#158#188#0'`'#149#146#0'm'#155#154#0'D'
+ +#179#190#0'c'#187#188#0'g'#185#189#0'&'#163#209#0'V'#173#198#0'C'#178#204#0
+ +'H'#188#207#0'['#183#210#0'U'#187#215#0'f'#187#207#0'm'#188#207#0'>'#202#230
+ +#0'#'#213#252#0'Z'#202#221#0'{'#209#222#0'U'#208#233#0'U'#216#240#0'P'#220
+ +#242#0'T'#218#244#0'R'#221#249#0'k'#206#231#0'M'#226#250#0#158#187#161#0#147
+ +#193#186#0#154#213#202#0#142#216#222#0#153#241#237#0#140#234#247#0#134#243
+ +#248#0#144#242#244#0#153#249#247#0#162#243#238#0#162#250#248#0#170#250#248#0
+ +#184#248#251#0#195#251#250#0#204#251#252#0#232#254#253#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#0#0#0#0#0#0
+ +#14#14#14#14#14#0#0#0#0#0#0#0#0#0#0#14'$'#31'&.'''#14#0#0#0#0#0#0#0#1#1#1#1
+ +#31'&.'''#22#14#0#0#14#14#14#14#1#10#11#1#31'&.'''#22#14#0#14'('#31#6#1#5#9#8
+ +#1#31'&.'''#22#14#14'/('#31#1#3#4#1#1#1#23#16#23#29#26#14#14'/('#31#1#2#1#12
+ +#17#25#31'&.'#27#15#14#14'/('#31#21'*'''#14'/('#31'&.'''#22#14#14'!'#28#23#16
+ +#23#29#14'/'#21#19'&.'''#22#14#14#24#30#31'&,'#18#12#1#2#1'$.'''#22#14#14'/('
+ +#31'&'#1#1#1#4#3#1')10"'#14#14'/('#31'$'#1#8#9#5#1#7'211'#14#0#14'/('#31' '#1
+ +#11#10#1#14#14#14#14#14#0#0#14'754+'#1#1#1#1#0#0#0#0#0#0#0#0#14'863--'#14#0#0
+ +#0#0#0#0#0#0#0#0#14#14#14#14#14#0#0#0#0#0#0#0#0#0#255#131#0#0#255#1#0#0#252#0
+ +#0#0#192#0#0#0#128#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1
+ +#0#0#0#3#0#0#0''#0#0#128#255#0#0#193#255#0#0'('#0#0#0#16#0#0#0' '#0#0#0#1#0
+ +' '#0#0#0#0#0'@'#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#130#171'@'#17#130#171#255#17
+ +#130#171#255#17#130#171#255#17#130#171#255#17#130#171#255#17#130#171'@'#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#153'2'#0'='#17#130#171'@'
+ +#17#130#171#255'P'#220#242#255'#'#213#252#255'R'#222#250#255#140#234#247#255
+ +'k'#206#231#255#17#130#171#255#17#130#171'@'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#168'J'#3#255#168'J'#3#255#168'J'#3#255#168'J'#3#255'#'#213
+ +#252#255'R'#222#250#255#140#234#247#255'k'#206#231#255'&'#163#209#255#17#130
+ +#171#255#0#0#0#0#17#130#171'@'#17#130#171#255#17#130#171#255#17#130#171#255
+ +'I'#138#150#255#168'J'#3#255#213#158'o'#255#222#170'j'#255#168'J'#3#255'#'
+ +#213#252#255'R'#222#250#255#140#234#247#255'k'#206#231#255'&'#163#209#255#17
+ +#130#171#255#17#130#171'@'#17#130#171#255'M'#226#250#255'#'#213#252#255#137
+ +#129']'#255#168'J'#3#255#202'y,'#255#222#162'Z'#255#204#137'Q'#255#168'J'#3
+ +#255'#'#213#252#255'R'#222#250#255#140#234#247#255'k'#206#231#255'&'#163#209
+ ,#255#17#130#171#255#17#130#171#255#134#243#248#255'M'#226#250#255'#'#213#252
+ +#255#168'J'#3#255#210'v'#24#255#199'w)'#255#168'J'#3#255#168'J'#3#255#168'J'
+ +#3#255'V'#173#198#255'?'#158#188#255'V'#173#198#255'm'#188#207#255'['#183#210
+ +#255#17#130#171#255#17#130#171#255#134#243#248#255'M'#226#250#255'#'#213#252
+ +#255#168'J'#3#255#174'P'#6#255#168'J'#3#255'''x'#144#255'`'#149#146#255'H'
+ +#188#207#255'#'#213#252#255'R'#222#250#255#140#234#247#255'U'#187#215#255#30
+ +#147#190#255#17#130#171#255#17#130#171#255#134#243#248#255'M'#226#250#255'#'
+ +#213#252#255'g'#185#189#255#147#193#186#255'k'#206#231#255#17#130#171#255#134
+ +#243#248#255'M'#226#250#255'#'#213#252#255'R'#222#250#255#140#234#247#255'k'
+ +#206#231#255'&'#163#209#255#17#130#171#255#17#130#171#255'{'#209#222#255'f'
+ +#187#207#255'V'#173#198#255'?'#158#188#255'V'#173#198#255'm'#188#207#255#17
+ +#130#171#255#134#243#248#255'c'#187#188#255'D'#179#190#255'R'#222#250#255#140
+ +#234#247#255'k'#206#231#255'&'#163#209#255#17#130#171#255#17#130#171#255'C'
+ +#178#204#255'>'#202#230#255'#'#213#252#255'R'#222#250#255#142#216#222#255'm'
+ +#155#154#255'''y'#146#255#168'J'#3#255#174'P'#6#255#168'J'#3#255'U'#216#240
+ +#255#140#234#247#255'k'#206#231#255'&'#163#209#255#17#130#171#255#17#130#171
+ +#255#134#243#248#255'M'#226#250#255'#'#213#252#255'R'#221#249#255#168'J'#3
+ +#255#168'J'#3#255#168'J'#3#255#199'w)'#255#210'v'#24#255#168'J'#3#255#158#187
+ +#161#255#153#249#247#255#144#242#244#255'U'#208#233#255#17#130#171#255#17#130
+ +#171#255#134#243#248#255'M'#226#250#255'#'#213#252#255'T'#218#244#255#168'J'
+ +#3#255#204#137'Q'#255#222#162'Z'#255#202'y,'#255#168'J'#3#255#178#139']'#255
+ +#162#243#238#255#153#249#247#255#153#249#247#255#17#130#171#255#17#130#171'@'
+ +#17#130#171#255#134#243#248#255'M'#226#250#255'#'#213#252#255'Z'#202#221#255
+ +#168'J'#3#255#222#170'j'#255#213#158'o'#255#168'J'#3#255'G'#129#143#255#17
+ +#130#171#255#17#130#171#255#17#130#171#255#17#130#171#255#17#130#171'@'#0#0#0
+ +#0#17#130#171#255#204#251#252#255#184#248#251#255#170#250#248#255#154#213#202
+ +#255#168'J'#3#255#168'J'#3#255#168'J'#3#255#168'J'#3#255#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#130#171'@'#17#130#171#255#232#254#253
+ +#255#195#251#250#255#162#250#248#255#153#243#239#255#154#240#236#255#17#130
+ +#171#255#17#130#171'@'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#17#130#171'@'#17#130#171#255#17#130#171#255#17#130#171#255#17#130
+ +#171#255#17#130#171#255#17#130#171'@'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#8'Position'#7#14'poScreenCenter'#0#7'TBitBtn'#6'btn'
+ +'_Ok'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2'Y'#6'Height'#2#25#3'To'
+ +'p'#3#15#1#5'Width'#2'Z'#5'Align'#7#8'alCustom'#7'Anchors'#11#7'akRight'#8'a'
+ +'kBottom'#0#7'Caption'#6#2'OK'#7'Default'#9#10'Glyph.Data'#10#218#2#0#0#214#2
+ +#0#0'BM'#214#2#0#0#0#0#0#0#214#0#0#0'('#0#0#0' '#0#0#0#16#0#0#0#1#0#8#0#0#0#0
+ +#0#0#2#0#0#195#14#0#0#195#14#0#0'('#0#0#0'('#0#0#0#0#0#0#0#255#255#255#0#255
+ +#0#255#0#0'f'#0#0#20#157'!'#0#25#170'+'#0#23#157''''#0#26#176'-'#0#27#169'.'
+ +#0#29#177'2'#0#30#178'1'#0#31#177'3'#0#30#174'1'#0'"'#183'8'#0'!'#180'7'#0'%'
+ +#168';'#0'1'#194'O'#0'1'#181'M'#0';'#203'^'#0'A'#197'c'#0'G'#211'm'#0'O'#214
+ +'y'#0'S'#222''#0#202#202#202#0#196#196#196#0#191#191#191#0#181#181#181#0#171
+ +#171#171#0#165#165#165#0#158#158#158#0#156#156#156#0#154#154#154#0#153#153
+ +#153#0#152#152#152#0#151#151#151#0#148#148#148#0#147#147#147#0#140#140#140#0
+ +#138#138#138#0'eee'#0#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2
+ +#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2
+ +#2#2#2#3#3#2#2#2#2#2#2#2#2#2#2#2#2#2#2''''''#2#2#2#2#2#2#2#2#2#2#2#2#2#3#10
+ +#11#3#2#2#2#2#2#2#2#2#2#2#2#2''''#31#31''''#2#2#2#2#2#2#2#2#2#2#2#3#16#13#7
+ +#14#3#2#2#2#2#2#2#2#2#2#2''''#27#29'"'#30''''#2#2#2#2#2#2#2#2#2#3#20#18#15#3
+ +#8#9#3#2#2#2#2#2#2#2#2''''#25#26'!''# '''#2#2#2#2#2#2#2#3#21#22#17#3#2#3#6#12
+ +#3#2#2#2#2#2#2''''#24#23#28''''#2'''%!'''#2#2#2#2#2#2#2#3#19#3#2#2#2#2#3#5#3
+ +#2#2#2#2#2#2''''#26''''#2#2#2#2'''$'''#2#2#2#2#2#2#2#3#2#2#2#2#2#2#3#4#3#2#2
+ +#2#2#2#2''''#2#2#2#2#2#2'''&'''#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#3#3#2#2#2#2#2#2
+ +#2#2#2#2#2#2#2#2''''''#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#3#3#2#2#2#2#2#2#2#2#2#2
+ +#2#2#2#2''''''#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2
+ +#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2
+ +#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2
+ +#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2
+ +#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#11'ModalResult'#2#1#9'NumGlyphs'#2#2#8'TabO'
+ +'rder'#2#2#0#0#7'TBitBtn'#10'btn_Cancel'#18'AnchorSideTop.Side'#7#9'asrBotto'
+ +'m'#4'Left'#3#180#0#6'Height'#2#25#3'Top'#3#15#1#5'Width'#2'Z'#5'Align'#7#8
+ +'alCustom'#7'Anchors'#11#7'akRight'#8'akBottom'#0#6'Cancel'#9#7'Caption'#6#6
+ +'Cancel'#10'Glyph.Data'#10#142#3#0#0#138#3#0#0'BM'#138#3#0#0#0#0#0#0#138#1#0
+ +#0'('#0#0#0' '#0#0#0#16#0#0#0#1#0#8#0#0#0#0#0#0#2#0#0#195#14#0#0#195#14#0#0
+ ,'U'#0#0#0'U'#0#0#0#0#0#0#0#255#255#255#0#255#0#255#0'@q'#250#0'Bt'#255#0'Iz'
+ +#252#0'''Z'#255#0',_'#255#0'6d'#250#0'8k'#255#0#23'J'#253#0#26'L'#255#0#27'M'
+ +#255#0#29'P'#255#0'#U'#255#0'%X'#255#0'&U'#250#0'.['#249#0'-Y'#244#0'2]'#241
+ +#0';f'#243#0#0'0'#252#0#1'2'#255#0#1'4'#255#0#12'<'#255#0#16'='#251#0#16';'
+ +#244#0#19'B'#255#0#23'C'#246#0#24'G'#255#0#26'H'#249#0#26'G'#248#0#27'F'#246
+ +#0#29'K'#255#0#28'G'#246#0#29'H'#246#0#29'I'#246#0'!N'#252#0' K'#248#0' L'
+ +#248#0'"M'#248#0'"L'#244#0'"M'#241#0'%P'#244#0#0','#248#0#0'-'#248#0#0','#246
+ +#0#0'*'#243#0#1'-'#246#0#3'+'#242#0#4'1'#254#0#7'3'#246#0#18';'#241#0#20'>'
+ +#244#0#0#0#154#0#192#192#192#0#190#190#190#0#187#187#187#0#185#185#185#0#182
+ +#182#182#0#181#181#181#0#179#179#179#0#177#177#177#0#176#176#176#0#175#175
+ +#175#0#174#174#174#0#172#172#172#0#171#171#171#0#170#170#170#0#169#169#169#0
+ +#168#168#168#0#167#167#167#0#166#166#166#0#164#164#164#0#163#163#163#0#162
+ +#162#162#0#160#160#160#0#159#159#159#0#158#158#158#0#156#156#156#0#154#154
+ +#154#0#153#153#153#0#152#152#152#0#151#151#151#0'kkk'#0#2#2#2#2#2#2#2#2#2#2#2
+ +#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2
+ +#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2#2'66'#2#2#2#2#2#2'66'#2#2#2#2#2#2'TT'#2#2
+ +#2#2#2#2'TT'#2#2#2#2#2'6'#10#26'6'#2#2#2#2'6,'#21'6'#2#2#2#2'TFLT'#2#2#2#2'T'
+ +'POT'#2#2#2#2'6'#31#11'46'#2#2'60'#22'/6'#2#2#2#2'TGDMT'#2#2'TQNST'#2#2#2#2#2
+ +'6"'#12'566-'#23'16'#2#2#2#2#2#2'TGCKTTPNRT'#2#2#2#2#2#2#2'6#'#13#25'2'#22'.'
+ +'6'#2#2#2#2#2#2#2#2'TGBJMNQT'#2#2#2#2#2#2#2#2#2'6'#30#27#24'36'#2#2#2#2#2#2#2
+ +#2#2#2'TGGJOT'#2#2#2#2#2#2#2#2#2#2'6%!'#29#28'6'#2#2#2#2#2#2#2#2#2#2'TBBEIT'
+ +#2#2#2#2#2#2#2#2#2'6'#17#7'(&'#14' 6'#2#2#2#2#2#2#2#2'T>=CD@HT'#2#2#2#2#2#2#2
+ +'6'#8#9#18'66)'#15'$6'#2#2#2#2#2#2'T;:ATTE?GT'#2#2#2#2#2'6'#3#4#19'6'#2#2'6*'
+ +#6'''6'#2#2#2#2'T98@T'#2#2'TG>DT'#2#2#2#2'6'#5#20'6'#2#2#2#2'6+'#16'6'#2#2#2
+ +#2'T7 Value then begin
+ if assigned(FConnectionManager) then FConnectionManager.RORemoveFreeNotification(self);
+ FConnectionManager := Value;
+ if assigned(FConnectionManager) then FConnectionManager.ROFreeNotification(self);
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/SimpleLoginService_Impl.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/SimpleLoginService_Impl.dfm
new file mode 100644
index 0000000..775b9ce
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/SimpleLoginService_Impl.dfm
@@ -0,0 +1,2 @@
+inherited SimpleLoginService: TSimpleLoginService
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/SimpleLoginService_Impl.lfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/SimpleLoginService_Impl.lfm
new file mode 100644
index 0000000..775b9ce
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/SimpleLoginService_Impl.lfm
@@ -0,0 +1,2 @@
+inherited SimpleLoginService: TSimpleLoginService
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/SimpleLoginService_Impl.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/SimpleLoginService_Impl.pas
new file mode 100644
index 0000000..e13ce16
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/SimpleLoginService_Impl.pas
@@ -0,0 +1,81 @@
+unit SimpleLoginService_Impl;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROClientIntf, uROTypes, uROServer, uROSessions,
+ {Ancestor Implementation:} BaseLoginService_Impl,
+ {Generated:} DataAbstract4_Intf;
+
+type
+ TSimpleLoginEvent = procedure(Sender: TObject; aUserID, aPassword: Utf8String; out aUserInfo: UserInfo; var aLoginSuccessful: boolean) of object;
+
+ { TSimpleLoginService }
+ TSimpleLoginService = class(TBaseLoginService, ISimpleLoginService)
+ private
+ fOnLogin: TSimpleLoginEvent;
+ protected
+ { ISimpleLoginService methods }
+ function Login(const aUserID: Utf8String; const aPassword: Utf8String; out aUserInfo: UserInfo): Boolean;
+ function LoginEx(const aLoginString: Utf8String): Boolean; override;
+ public
+ procedure Assign(Source: TPersistent); override;
+ published
+ property OnLogin: TSimpleLoginEvent read fOnLogin write fOnLogin;
+ end;
+
+implementation
+
+{ SimpleLoginService }
+
+procedure TSimpleLoginService.Assign(Source: TPersistent);
+var
+ lSource: TSimpleLoginService;
+begin
+ inherited;
+ if Source is TSimpleLoginService then begin
+ lSource := TSimpleLoginService(Source);
+ OnLogin := lSource.OnLogin;
+ end;
+end;
+
+function TSimpleLoginService.Login(const aUserID: Utf8String; const aPassword: Utf8String; out aUserInfo: UserInfo): Boolean;
+var
+ lLoginSuccessful: boolean;
+begin
+ lLoginSuccessful := false;
+ if assigned(OnLogin) then
+ OnLogin(self, aUserID, aPassword, aUserInfo, lLoginSuccessful);
+ result := lLoginSuccessful;
+end;
+
+function TSimpleLoginService.LoginEx(
+ const aLoginString: Utf8String): Boolean;
+var
+ lIgnore: UserInfo;
+ lLoginString: TLoginString;
+begin
+ lLoginString := TLoginString.Create(aLoginString);
+ try
+ result := self.Login(lLoginString.UserName, lLoginString.Password, lIgnore);
+ finally
+ lLoginString.Free;
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Unsupported/uDAJvMTable.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Unsupported/uDAJvMTable.pas
new file mode 100644
index 0000000..a7cffe6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Unsupported/uDAJvMTable.pas
@@ -0,0 +1,189 @@
+unit uDAJvMTable;
+
+interface
+
+uses Classes, DB, uDAInterfaces, uDADataTable, JvMemDS;
+
+type
+
+ TDAJvMDataset = class(TJvMemoryData, IDADataTableDataset)
+ private
+ function GetActive: boolean;
+
+ protected
+ function GetDataTable: TDADataTable; safecall;
+ procedure InternalRefresh; override;
+
+ published
+ property Active: boolean read GetActive;
+ end;
+
+ TDAJvMemDataTable = class(TDADataTable)
+ private
+
+ fClientDataset: TDAJvMDataset;
+
+ protected
+ function GetDatasetClass: TDatasetClass; override;
+ procedure CreateInternalFields(aDataset: TDataset; someFieldDefinitions: TDAFieldCollection); override;
+ procedure DoSort(const FieldNames: array of string; const Directions: array of TDASortDirection); override;
+
+ procedure DoBeforeOpenDataset; override;
+ procedure DoAfterCloseDataset; override;
+
+ procedure SetMasterSource(const Value: TDADataSource); override;
+ function GetMasterSource: TDADataSource; override;
+ procedure SetDetailsFields(const Value: string); override;
+ procedure SetMasterFields(const Value: string); override;
+ function GetDetailFields: string; override;
+ function GetMasterFields: string; override;
+
+ function GetIndexDefs: TIndexDefs;
+ procedure SetIndexDefs(const Value: TIndexDefs);
+ function GetIndexName: string;
+ procedure SetIndexName(const Value: string);
+
+ function GetFilter: string; override;
+ function GetFiltered: boolean; override;
+ procedure SetFilter(const Value: string); override;
+ procedure SetFiltered(const Value: boolean); override;
+
+ public
+ constructor Create(aOwner: TComponent); override;
+
+ published
+ property IndexDefs: TIndexDefs read GetIndexDefs write SetIndexDefs;
+ property IndexName: string read GetIndexName write SetIndexName;
+
+ end;
+
+implementation
+
+uses Variants;
+
+constructor TDAJvMemDataTable.Create(aOwner: TComponent);
+begin
+ inherited;
+
+ fClientDataset := TDAJvMDataset(Dataset);
+ fClientDataset.FilterOptions := [foCaseInsensitive];
+end;
+
+procedure TDAJvMemDataTable.CreateInternalFields(aDataset: TDataset; someFieldDefinitions: TDAFieldCollection);
+begin
+ inherited;
+
+ fClientDataset.FieldDefs.Clear;
+ fClientDataset.CreateFields;
+
+end;
+
+procedure TDAJvMemDataTable.DoSort(const FieldNames: array of string; const Directions: array of TDASortDirection);
+begin
+ with fclientDataset do begin
+ Sort(Fieldnames,Directions);
+ end;
+end;
+
+function TDAJvMemDataTable.GetDatasetClass: TDatasetClass;
+begin
+ result := TDAJvMDataset;
+end;
+
+function TDAJvMemDataTable.GetMasterSource: TDADataSource;
+begin
+ result := nil;
+end;
+
+procedure TDAJvMemDataTable.DoAfterCloseDataset;
+begin
+ inherited;
+end;
+
+function TDAJvMemDataTable.GetFilter: string;
+begin
+ result := fClientDataset.Filter
+end;
+
+
+procedure TDAJvMemDataTable.DoBeforeOpenDataset;
+begin
+ inherited;
+end;
+
+procedure TDAJvMemDataTable.SetMasterSource(const Value: TDADataSource);
+begin
+ inherited SetMasterSource(Value);
+end;
+
+procedure TDAJvMemDataTable.SetMasterFields(const Value: string);
+begin
+ inherited;
+end;
+
+procedure TDAJvMemDataTable.SetDetailsFields(const Value: string);
+begin
+end;
+
+function TDAJvMemDataTable.GetDetailFields: string;
+begin
+end;
+
+function TDAJvMemDataTable.GetMasterFields: string;
+begin
+
+end;
+
+
+function TDAJvMemDataTable.GetFiltered: boolean;
+begin
+ result := fClientDataset.Filtered
+end;
+
+procedure TDAJvMemDataTable.SetFilter(const Value: string);
+begin
+ fClientDataset.Filter := Value
+end;
+
+procedure TDAJvMemDataTable.SetFiltered(const Value: boolean);
+begin
+ fClientDataset.Filtered := Value
+end;
+
+function TDAJvMemDataTable.GetIndexDefs: TIndexDefs;
+begin
+ result := nil;
+end;
+
+procedure TDAJvMemDataTable.SetIndexDefs(const Value: TIndexDefs);
+begin
+
+end;
+
+function TDAJvMemDataTable.GetIndexName: string;
+begin
+ result := '';
+end;
+
+procedure TDAJvMemDataTable.SetIndexName(const Value: string);
+begin
+
+end;
+
+function TDAJvMDataset.GetActive: boolean;
+begin
+ result := inherited Active;
+end;
+
+function TDAJvMDataset.GetDataTable: TDADataTable;
+begin
+ result := TDADataTable(Owner);
+end;
+
+procedure TDAJvMDataset.InternalRefresh;
+begin
+
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Unsupported/uDAMemTablesReg.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Unsupported/uDAMemTablesReg.pas
new file mode 100644
index 0000000..15e7226
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Unsupported/uDAMemTablesReg.pas
@@ -0,0 +1,17 @@
+unit uDAMemTablesReg;
+
+interface
+
+uses uDAJvMTable, uDASQLMemoryTable, Classes;
+
+procedure Register;
+
+implementation
+
+procedure Register;
+begin
+ RegisterComponents('Data Abstract', [TDAJvMemDataTable]);
+ RegisterComponents('Data Abstract',[TDASQLMemTable]);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Unsupported/uDASQLMemoryTable.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Unsupported/uDASQLMemoryTable.pas
new file mode 100644
index 0000000..1d6b365
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/Unsupported/uDASQLMemoryTable.pas
@@ -0,0 +1,233 @@
+unit uDASQLMemoryTable;
+
+interface
+
+uses SysUtils,Classes, DB, uDAInterfaces, uDADataTable, SQLMemMain;
+
+type
+ TDASQLMemDataset = class(TSQLMemTable, IDADataTableDataset)
+ private
+ function GetActive: boolean;
+
+ protected
+ function GetDataTable: TDADataTable; safecall;
+ procedure InternalRefresh; override;
+
+ published
+ property Active: boolean read GetActive;
+ end;
+
+ TDASQLMemTable = class(TDADataTable)
+ private
+ fMasterSource : TDADataSource;
+ fSQLMemDataset: TDASQLMemdataset;
+
+ protected
+ function GetDatasetClass: TDatasetClass; override;
+ procedure CreateInternalFields(aDataset: TDataset; someFieldDefinitions: TDAFieldCollection); override;
+ procedure DoSort(const FieldNames: array of string; const Directions: array of TDASortDirection); override;
+
+ procedure DoBeforeOpenDataset; override;
+ procedure DoAfterCloseDataset; override;
+
+ procedure SetMasterSource(const Value: TDADataSource); override;
+ function GetMasterSource: TDADataSource; override;
+ procedure SetDetailsFields(const Value: string); override;
+ procedure SetMasterFields(const Value: string); override;
+ function GetDetailFields: string; override;
+ function GetMasterFields: string; override;
+
+ function GetIndexDefs: TIndexDefs;
+ procedure SetIndexDefs(const Value: TIndexDefs);
+ function GetIndexName: string;
+ procedure SetIndexName(const Value: string);
+
+ function GetFilter: string; override;
+ function GetFiltered: boolean; override;
+ procedure SetFilter(const Value: string); override;
+ procedure SetFiltered(const Value: boolean); override;
+
+ public
+ constructor Create(aOwner: TComponent); override;
+
+ published
+ property IndexDefs: TIndexDefs read GetIndexDefs write SetIndexDefs;
+ property IndexName: string read GetIndexName write SetIndexName;
+ end;
+
+implementation
+
+uses Variants;
+
+constructor TDASQLMemTable.Create(aOwner: TComponent);
+begin
+ inherited;
+ fSQLMemDataset := TDASqlMemDataset(Dataset);
+ fSQLMemDataset.FilterOptions := [foCaseInsensitive];
+end;
+
+procedure TDASQLMemTable.CreateInternalFields(aDataset: TDataset; someFieldDefinitions: TDAFieldCollection);
+ var tblName : String;
+begin
+ inherited;
+ if fSQLMemDataset.TableName = '' then begin
+ tblname := formatdatetime('ddddmmmmdyyyyhhmmsz',now);
+ fSQLMemDataset.TableName := 'tbl'+tblname;
+ fSQLMemDataset.CreateTable;
+ end else begin
+ fSQLMemDataset.close;
+ fSQLMemDataset.EmptyTable;
+ fSQLMemDataset.FieldDefs.clear;
+ fSQLMemDataset.IndexDefs.Clear;
+ fSQLMemDataset.RestructureFieldDefs.Clear;
+ fSQLMemDataset.RestructureIndexDefs.Clear;
+ fSQLMemDataset.ImportTable(dataset);
+ end;
+end;
+
+procedure TDASQLMemTable.DoSort(const FieldNames: array of string; const Directions: array of TDASortDirection);
+const
+ DirectionStr: array[TDASortDirection] of string = ('ASC', 'DESC');
+var
+ ascfields, descfields,
+ idxname: string;
+ i: integer;
+ idx: TIndexDef;
+begin
+ with fSQLMemDataset do begin
+ if (Length(FieldNames) = 0) then begin
+ IndexName := '';
+ Exit;
+ end;
+
+ idxname := '';
+ for i := 0 to Length(FieldNames) - 1 do
+ idxname := idxname + FieldNames[i] + '_' + DirectionStr[Directions[i]];
+
+ idx := TDefCollection(IndexDefs).Find(idxname) as TIndexDef;
+ if (idx = nil) then begin
+ ascfields := '';
+ descfields := '';
+
+ for i := 0 to Length(Directions) - 1 do
+ case Directions[i] of
+ sdAscending: ascfields := ascfields + FieldNames[i] + ';';
+ sdDescending: descfields := descfields + FieldNames[i] + ';';
+ end;
+
+ if (descfields='')
+ then fSQLMemDataset.AddIndex(idxname, ascfields, [])
+ else fSQLMemDataset.AddIndex(idxname, descfields, [ixDescending]);
+ end;
+
+ IndexName := idxname;
+ end;
+end;
+
+function TDASQLMemTable.GetDatasetClass: TDatasetClass;
+begin
+ result := TDASQLMemDataset;
+end;
+
+function TDASQLMemTable.GetMasterSource: TDADataSource;
+begin
+ result := fMasterSource;
+end;
+
+procedure TDASQLMemTable.DoAfterCloseDataset;
+begin
+ inherited;
+ fSQLMemDataset.close;
+end;
+
+function TDASQLMemTable.GetFilter: string;
+begin
+ result := fSQLMemDataset.Filter
+end;
+
+procedure TDASQLMemTable.DoBeforeOpenDataset;
+begin
+ inherited;
+end;
+
+procedure TDASQLMemTable.SetMasterSource(const Value: TDADataSource);
+begin
+ fSQLMemDataset.MasterSource := Value;
+ fMasterSource := Value;
+
+ inherited SetMasterSource(Value);
+end;
+
+procedure TDASQLMemTable.SetMasterFields(const Value: string);
+begin
+ fSQLMemDataset.MasterFields := Value;
+ inherited;
+end;
+
+procedure TDASQLMemTable.SetDetailsFields(const Value: string);
+begin
+ fSQLMemDataset.IndexFieldNames := Value
+end;
+
+function TDASQLMemTable.GetDetailFields: string;
+begin
+ result := fSQLMemDataset.IndexFieldNames
+end;
+
+function TDASQLMemTable.GetMasterFields: string;
+begin
+ result := fSQLMemDataset.MasterFields
+end;
+
+function TDASQLMemTable.GetFiltered: boolean;
+begin
+ result := fSQLMemDataset.Filtered
+end;
+
+procedure TDASQLMemTable.SetFilter(const Value: string);
+begin
+ fSQLMemDataset.Filter := Value
+end;
+
+procedure TDASQLMemTable.SetFiltered(const Value: boolean);
+begin
+ fSQLMemDataset.Filtered := Value
+end;
+
+function TDASQLMemTable.GetIndexDefs: TIndexDefs;
+begin
+ result := fSQLMemDataset.IndexDefs
+end;
+
+procedure TDASQLMemTable.SetIndexDefs(const Value: TIndexDefs);
+begin
+ fSQLMemDataset.IndexDefs.Assign(Value);
+end;
+
+function TDASQLMemTable.GetIndexName: string;
+begin
+ result := fSQLMemDataset.IndexName
+end;
+
+procedure TDASQLMemTable.SetIndexName(const Value: string);
+begin
+ fSQLMemDataset.IndexName := Value
+end;
+
+function TDASQLMemdataset.GetActive: boolean;
+begin
+ result := inherited Active;
+end;
+
+function TDASQLMemdataset.GetDataTable: TDADataTable;
+begin
+ result := TDADataTable(Owner);
+end;
+
+procedure TDASQLMemdataset.InternalRefresh;
+begin
+
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/eDefines.inc b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/eDefines.inc
new file mode 100644
index 0000000..ef01d58
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/eDefines.inc
@@ -0,0 +1,495 @@
+{----------------------------------------------------------------------------}
+{file: eDefines.inc }
+{type: Delphi include file }
+{ }
+{compiler: Borland Pascal 7, }
+{ Delphi 1-7, 2005-2007 for Win32 }
+{ Kylix 1-3, }
+{ C++Builder 1-6, 2006-2007 }
+{ Free Pascal Compiler 2.x }
+{ }
+{platforms: DOS, DPMI, Win16, Win32, Win64, Linux, Mac OS X }
+{ }
+{author: mh@elitedev.com }
+{ }
+{contents: Defines that can be flexibily used to determine the exact }
+{ compiler version used. }
+{ }
+{(c)opyright elitedevelopments software. all rights reserved. }
+{ http://www.elitedev.com }
+{ }
+{ Third Party component developers are encouraged to use the set of defines }
+{ established in this file, rather then their own system, for checking their }
+{ component libraries agains different versions of Delphi and C++Builder. }
+{ }
+{ This file may be distributed freely with both free and commercial source }
+{ libraries, but you are asked to please leave this comment in place, and }
+{ to return any improvements you make to this file to the maintainer that }
+{ is noted above. }
+{----------------------------------------------------------------------------}
+
+{----------------------------------------------------------------------------}
+{ Compiler and OS version defines: }
+{ }
+{ exact compiler versions: }
+{ }
+{ BP7 Borland Pascal 7.0 }
+{ DELPHI1 Delphi 1.0 (any Delphi) }
+{ DELPHI2 Delphi 2.0 }
+{ DELPHI3 Delphi 3.0 }
+{ DELPHI4 Delphi 4.0 }
+{ DELPHI5 Delphi 5.0 }
+{ DELPHI6 Delphi 6.0 }
+{ DELPHI7 Delphi 7.0 }
+{ DELPHI9 Delphi 2005 }
+{ DELPHI2005 Delphi 2005 }
+{ DELPHI2006 Delphi 2006 }
+{ DELPHI2007 Delphi 2007 }
+{ KYLIX1 Kylix 1.0 }
+{ KYLIX2 Kylix 2.0 }
+{ KYLIX3 Kylix 3.0 }
+{ CBUILDER1 C++Builder 1.0 }
+{ CBUILDER3 C++Builder 3.0 }
+{ CBUILDER4 C++Builder 4.0 }
+{ CBUILDER5 C++Builder 5.0 }
+{ }
+{ }
+{ minimum compiler versions: }
+{ }
+{ DELPHI1UP Delphi 1.0 and above (any Delphi) }
+{ DELPHI2UP Delphi 2.0 and above }
+{ DELPHI3UP Delphi 3.0 and above }
+{ DELPHI4UP Delphi 4.0 and above }
+{ DELPHI5UP Delphi 5.0 and above }
+{ DELPHI6UP Delphi 6.0 and above }
+{ DELPHI7UP Delphi 7.0 and above }
+{ DELPHI9UP Delphi 9.0 (2005) and above }
+{ DELPHI10UP Delphi 10.0 (2006) and above }
+{ DELPHI11UP Delphi 11.0 (2007) and above }
+{ DELPHI2005UP Delphi 2005 and above }
+{ DELPHI2006UP Delphi 2006 and above }
+{ DELPHI2007UP Delphi 2007 and above }
+{ KYLIX1UP Kylix 1.0 and above (any Kylix) }
+{ KYLIX2UP Kylix 2.0 and above (any Kylix) }
+{ KYLIX3UP Kylix 3.0 and above (any Kylix) }
+{ CBUILDER1UP C++Builder 1.0 and above or Delphi 2 and above }
+{ CBUILDER3UP C++Builder 3.0 and above or Delphi 3.0 and above }
+{ CBUILDER4UP C++Builder 4.0 and above or Delphi 4.0 and above }
+{ CBUILDER5UP C++Builder 5.0 and above or Delphi 5.0 and above }
+{ CBUILDER6UP C++Builder 5.0 and above or Delphi 5.0 and above }
+{ }
+{ }
+{ compiler types: }
+{ }
+{ BP Borland Pascal (not Delphi or C++Builder) }
+{ DELPHI any Delphi version (but not C++Builder or Kylix) }
+{ KYLIX any Kylix version (not Delphi or C++Builder for Windows) }
+{ CBUILDER any C++Builder for Windows (Pascal) }
+{ }
+{ }
+{ target platforms compiler types: }
+{ }
+{ DELPHI_16BIT 16bit Delphi (but not C++Builder!) }
+{ DELPHI_32BIT 32bit Delphi (but not C++Builder) }
+{ KYLIX_32BIT 32bit Kylix (but not C++Builder) }
+{ CBUILDER_32BIT 32bit C++Builer's Pascal (but not Delphi) }
+{ }
+{ }
+{ target cpu types }
+{ }
+{ CPU16 16bit Delphi or Borland Pascal }
+{ CPU32 32bit Delphi or Free Pascal }
+{ CPU64 64bit Free Pascal }
+{ }
+{ target platforms }
+{ }
+{ DOS any DOS (plain and DPMI) }
+{ REALMODE 16bit realmode DOS }
+{ PROTECTEDMODE 16bit DPMI DOS }
+{ }
+{ MSWINDOWS any Windows platform }
+{ WIN16 16bit Windows }
+{ WIN32 32bit Windows }
+{ WIN64 64bit Windows }
+{ DOTNET .NET }
+{ }
+{ LINUX any Linux platform }
+{ LINUX32 32bit Linux }
+{ LINUX64 64bit Linux }
+{ }
+{ DARWIN Any Mac OS X }
+{ DARWIN32 32bit Mac OS X }
+{ DARWIN64 64bit Mac OS X }
+{----------------------------------------------------------------------------}
+
+{ defines for Borland Pascal 7.0 }
+{$IFDEF VER70}
+ {$DEFINE BP}
+ {$DEFINE BP7}
+ {$DEFINE 16BIT}
+ {$DEFINE CPU16}
+
+ { defines for BP7 DOS real mode }
+ {$IFDEF MSDOS}
+ {$DEFINE DOS}
+ {$DEFINE REALMODE}
+ {$ENDIF}
+
+ { defines for BP7 DOS protected mode }
+ {$IFDEF DPMI}
+ {$DEFINE DOS}
+ {$DEFINE PROTECTEDMODE}
+ {$ENDIF}
+
+ { defines for BP7 Windows }
+ {$IFDEF WINDOWS}
+ {$DEFINE MSWINDOWS}
+ {$DEFINE WIN16}
+ {$ENDIF}
+{$ENDIF}
+
+{ defines for Delphi 1.0 thru 7.0 }
+{$IFDEF MSWINDOWS}
+
+ { defines for Delphi 1.0 }
+ {$IFDEF VER80}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI1}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI_16BIT}
+ {$DEFINE WIN16}
+ {$DEFINE 16BIT}
+ {$DEFINE CPU16}
+ {$ENDIF}
+
+ { defines for Delphi 2.0 }
+ {$IFDEF VER90}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI2}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$ENDIF}
+
+ { defines for C++Builder 1.0 }
+ {$IFDEF VER93}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER1}
+ {$DEFINE CBUILDER1UP}
+ {$ENDIF}
+
+ { defines for Delphi 3.0 }
+ {$IFDEF VER100}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI3}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$ENDIF}
+
+ { defines for C++Builder 3.0 }
+ {$IFDEF VER110}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER3}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$ENDIF}
+
+ { defines for Delphi 4.0 }
+ {$IFDEF VER120}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI4}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$ENDIF}
+
+ { defines for C++Builder 4.0 }
+ {$IFDEF VER125}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER4}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$DEFINE CBUILDER4UP}
+ {$ENDIF}
+ { defines for Delphi 5.0 }
+ {$IFDEF VER130}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI5}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$ENDIF}
+
+ { defines for C++Builder 5.0 }
+ {$IFDEF VER135}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER5}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$DEFINE CBUILDER4UP}
+ {$DEFINE CBUILDER5UP}
+ {$ENDIF}
+
+ { defines for Delphi 6.0 }
+ {$IFDEF VER140}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI6}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$ENDIF}
+
+ { defines for Delphi 7.0 }
+ {$IFDEF VER150}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI7}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$ENDIF}
+
+ { defines for Delphi 2005 }
+ {$IFDEF VER170}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI9}
+ {$DEFINE DELPHI2005}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE BDS}
+ {$DEFINE BDS3}
+ {$DEFINE BDS3UP}
+ {$ENDIF}
+
+ { defines for Delphi 2006 }
+ {$IFDEF VER180}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI10}
+ {$DEFINE DELPHI10A}
+ {$DEFINE DELPHI2006}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE BDS}
+ {$DEFINE BDS4}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$ENDIF}
+
+ { defines for Delphi 2007 }
+ {$IFDEF VER185}
+ {$UNDEF DELPHI10A} // declared in VER180
+ {$UNDEF DELPHI2006} // declared in VER180
+ {$UNDEF BDS4} // declared in VER180
+
+ {$DEFINE DELPHI10B}
+ {$DEFINE DELPHI10BUP}
+ {$DEFINE DELPHI11}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI2007}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE BDS5}
+ {$DEFINE BDS5UP}
+ {$ENDIF}
+
+ { defines for Delphi 2009 }
+ {$IFDEF VER200}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+
+ {$DEFINE DELPHI12}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI12UP}
+
+ {$DEFINE DELPHI2009}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE DELPHI2009UP}
+
+ {$DEFINE BDS}
+ {$DEFINE BDS6}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$DEFINE BDS5UP}
+ {$DEFINE BDS6UP}
+ {$ENDIF}
+
+ { defines for Delphi 2010 }
+ {$IFDEF VER210}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+
+ {$DEFINE DELPHI14}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI12UP}
+ {$DEFINE DELPHI14UP}
+
+ {$DEFINE DELPHI2010}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE DELPHI2009UP}
+ {$DEFINE DELPHI2010UP}
+
+ {$DEFINE BDS}
+ {$DEFINE BDS7}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$DEFINE BDS5UP}
+ {$DEFINE BDS6UP}
+ {$DEFINE BDS7UP}
+ {$ENDIF}
+
+
+ {$IFDEF WIN32}
+ {$DEFINE MSWINDOWS} //not automatically defined for Delphi 2 thru 5
+ {$DEFINE 32BIT}
+ {$DEFINE CPU32}
+ {$ENDIF}
+
+{$ENDIF MSWINDOWS}
+
+{ defines for "Delphi for .NET" }
+{$IFDEF CLR}
+ {$DEFINE DOTNET}
+{$ENDIF}
+
+{$IFDEF DELPHI}
+ {$IFDEF DELPHI2UP}
+ {$DEFINE DELPHI_32BIT}
+ {$ENDIF}
+{$ENDIF}
+
+{$IFDEF CBUILDER}
+ {$DEFINE CBUILDER_32BIT}
+{$ENDIF}
+
+{$IFNDEF FPC}
+
+ { Kylix 1.0 thru 3.0 }
+ {$IFDEF LINUX}
+
+ {$DEFINE VER140UP}
+
+ { Any Kylix }
+ {$DEFINE 32BIT}
+ {$DEFINE LINUX32}
+ {$DEFINE KYLIX_32BIT}
+ {$DEFINE KYLIX}
+ {$DEFINE KYLIX1UP}
+
+ {$IFDEF CONDITIONALEXPRESSIONS}
+ {$IF Declared(CompilerVersion)}
+
+ { Kylix 2.0 }
+ {$IF Declared(RTLVersion) and (RTLVersion = 14.1)}
+ {$DEFINE KYLIX2}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$IFEND}
+
+ { Kylix 3.0 - Delphi portion }
+ {$IF Declared(RTLVersion) and (RTLVersion = 14.5)}
+ {$DEFINE KYLIX3}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$DEFINE KYLIX3UP}
+ {$IFEND}
+
+ { Kylix 1.0 }
+ {$ELSE}
+ {$DEFINE KYLIX1}
+ {$IFEND}
+ {$ENDIF CONDITIONALEXPRESSIONS}
+
+ {$ENDIF LINUX}
+{$ENDIF}
+
+{ CPU }
+
+{$IFDEF FPC}
+ {$IFDEF MSWINDOWS}
+ {$IFDEF CPU64}
+ {$DEFINE WIN64}
+ {$ENDIF}
+ {$ENDIF}
+ {$IFDEF LINUX}
+ {$IFDEF CPU32}
+ {$DEFINE LINUX32}
+ {$ENDIF}
+ {$IFDEF CPU64}
+ {$DEFINE LINUX64}
+ {$ENDIF}
+ {$ENDIF}
+ {$IFDEF DARWIN}
+ {$IFDEF CPU32}
+ {$DEFINE DARWIN32}
+ {$ENDIF}
+ {$IFDEF CPU64}
+ {$DEFINE DARWIN64}
+ {$ENDIF}
+ {$ENDIF}
+{$ELSE}
+ {$DEFINE ENDIAN_LITTLE} // To have endianness symbol defined in Delphi too
+{$ENDIF}
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAADODataTable.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAADODataTable.pas
new file mode 100644
index 0000000..d5a4c51
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAADODataTable.pas
@@ -0,0 +1,317 @@
+unit uDAADODataTable;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up }
+{ platform: Win32 }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses Classes, DB, uDAInterfaces, uDADataTable, ADODB;
+
+type
+ { TDAADODataset }
+ TDAADODataset = class(TADODataset, IDADataTableDataset)
+ private
+ FLocateRecordMode: Boolean;
+ protected
+ function GetDataTable: TDADataTable; safecall;
+ procedure InternalRefresh; override;
+ procedure InternalInitFieldDefs; override;
+ procedure DataEvent(Event: TDataEvent; Info: Longint); override;
+ public
+ function Locate(const KeyFields: string; const KeyValues: Variant;
+ Options: TLocateOptions): Boolean; override;
+ function Lookup(const KeyFields: string; const KeyValues: Variant;
+ const ResultFields: string): Variant; override;
+ end;
+
+ { TDAADODataTable }
+ TDAADODataTable = class(TDADataTable)
+ private
+ fADODataset: TDAADODataset;
+ protected
+ function QueryInterface(const IID: TGUID; out Obj): HResult; override;
+ function GetDatasetClass: TDatasetClass; override;
+ procedure CreateInternalFields(aDataset: TDataset; someFieldDefinitions: TDAFieldCollection); override;
+ procedure DoAfterCloseDataset; override;
+ procedure DoSort(const FieldNames: array of string; const Directions: array of TDASortDirection); override;
+
+ procedure SetMasterSource(const Value: TDADataSource); override;
+ function GetMasterSource: TDADataSource; override;
+ procedure SetDetailsFields(const Value: string); override;
+ procedure SetMasterFields(const Value: string); override;
+ function GetDetailFields: string; override;
+ function GetMasterFields: string; override;
+
+ function GetFilter: string; override;
+ function GetFiltered: boolean; override;
+ procedure SetFilter(const Value: string); override;
+ procedure SetFiltered(const Value: boolean); override;
+ function intDATypeToVCLType(aDAType: TDADataType): TFieldType;override;
+ function GetMasterDataLink: TMasterDataLink; override;
+ public
+ constructor Create(aOwner: TComponent); override;
+ procedure EnableConstraints; override; safecall;
+ procedure DisableConstraints; override; safecall;
+ end;
+
+implementation
+
+uses
+ ADOInt, Variants, SysUtils;
+
+{ TDAADODataTable }
+
+constructor TDAADODataTable.Create(aOwner: TComponent);
+begin
+ inherited;
+
+ fADODataset := TDAADODataset(Dataset);
+end;
+
+procedure TDAADODataTable.CreateInternalFields(aDataset: TDataset;
+ someFieldDefinitions: TDAFieldCollection);
+var
+ i, n: Integer;
+ lDataType: DataTypeEnum;
+ TmpRecordset: _Recordset;
+
+begin
+ inherited;
+
+ { this loop should be obsolete now with fix to #1674. Keeping for backward compatibilty. mh. }
+ with fADODataset do begin
+ for i := 0 to Fields.Count - 1 do begin
+ if (Fields[i].FieldKind = fkInternalCalc) then begin
+ Fields[i].FieldKind := fkCalculated;
+ with Fields[i] do begin
+ FieldDefs.Add(FieldName, DataType, Size, Required);
+ end;
+ end;
+ end;
+ end;
+
+ fADODataset.CursorLocation := clUseClient;
+ fADODataset.CursorType := ctDynamic;
+ fADODataset.CreateDataSet;
+
+ if (fADODataset.FieldCount > 0) then begin
+ TmpRecordset := CoRecordset.Create;
+ for n := 0 to fADODataset.RecordSet.Fields.Count - 1 do begin
+ with fADODataset.RecordSet.Fields.Item[n] do begin
+ lDataType := Type_;
+ if (lDataType = adVarChar)
+ then lDataType := adVarWChar;
+ {$IFDEF DELPHI2010UP}
+ TmpRecordSet.Fields._Append(Name, lDataType, DefinedSize, Attributes);
+ {$ELSE}
+ TmpRecordSet.Fields.Append(Name, lDataType, DefinedSize, Attributes);
+ {$ENDIF}
+ end;
+ end;
+ TmpRecordset.Open(EmptyParam, EmptyParam, adOpenUnspecified, adLockUnspecified, 0);
+ fADODataset.Recordset := TmpRecordset;
+ fADODataset.Open;
+ end;
+end;
+
+function TDAADODataTable.GetDatasetClass: TDatasetClass;
+begin
+ result := TDAADODataset;
+end;
+
+procedure TDAADODataTable.DoSort(const FieldNames: array of string; const Directions: array of TDASortDirection);
+const
+ DirectionStr: array[TDASortDirection] of string = ('ASC', 'DESC');
+var
+ i: integer;
+ sortexp: string;
+begin
+ with fADODataSet do begin
+
+ if (Length(FieldNames) = 0) then
+ Sort := ''
+
+ else begin
+ sortexp := '';
+ for i := 0 to Length(FieldNames) - 1 do
+ sortexp := sortexp + FieldNames[i] + ' ' + DirectionStr[Directions[i]] + ', ';
+
+ Sort := Copy(sortexp, 1, Length(sortexp) - 2);
+ end;
+ end;
+end;
+
+function TDAADODataTable.GetDetailFields: string;
+begin
+ result := fADODataset.IndexFieldNames
+end;
+
+function TDAADODataTable.GetMasterDataLink: TMasterDataLink;
+begin
+ Result := fADODataset.MasterDataLink;
+end;
+
+function TDAADODataTable.GetMasterFields: string;
+begin
+ result := fADODataset.MasterFields
+end;
+
+function TDAADODataTable.GetMasterSource: TDADataSource;
+begin
+ result := TDADataSource(fADODataset.DataSource)
+end;
+
+procedure TDAADODataTable.SetDetailsFields(const Value: string);
+begin
+ fADODataset.IndexFieldNames := Value
+end;
+
+procedure TDAADODataTable.SetMasterFields(const Value: string);
+begin
+ inherited;
+ fADODataset.MasterFields := Value
+end;
+
+procedure TDAADODataTable.SetMasterSource(const Value: TDADataSource);
+begin
+ inherited;
+ fADODataset.DataSource := Value
+end;
+
+function TDAADODataTable.GetFilter: string;
+begin
+ result := fADODataset.Filter
+end;
+
+function TDAADODataTable.GetFiltered: boolean;
+begin
+ result := fADODataset.Filtered
+end;
+
+procedure TDAADODataTable.SetFilter(const Value: string);
+begin
+ fADODataset.Filter := Value
+end;
+
+procedure TDAADODataTable.SetFiltered(const Value: boolean);
+begin
+ fADODataset.Filtered := Value
+end;
+
+procedure TDAADODataTable.DoAfterCloseDataset;
+begin
+ inherited;
+
+ // These checks prevent the error "the provider does not support the necessary interface for index functionality"
+ // that occourrs when the data table is being closed
+
+ with fADODataset do begin
+ if (IndexName<>'')
+ then fADODataset.IndexName := '';
+
+ if (IndexDefs.Count>0)
+ then IndexDefs.Clear;
+ end;
+end;
+
+procedure TDAADODataTable.DisableConstraints;
+var
+ i: Integer;
+begin
+ for i := fADODataset.Fields.Count -1 downto 0 do
+ begin
+ fADODataset.Fields[i].Required := False;
+ end;
+end;
+
+procedure TDAADODataTable.EnableConstraints;
+var
+ i: Integer;
+begin
+ for i := fADODataset.Fields.Count -1 downto 0 do
+ begin
+ if i <> 0 then
+ fADODataset.Fields[i].Required := Fields[i -1].Required;
+ end;
+end;
+
+function TDAADODataTable.QueryInterface(const IID: TGUID;
+ out Obj): HResult;
+begin
+ // IDAClonedCursorsSupport isn't supported!
+ if IsEqualGUID(IID, IDAClonedCursorsSupport) then
+ Result := E_NOINTERFACE
+ else
+ Result := inherited QueryInterface(IID, Obj);
+end;
+
+function TDAADODataTable.intDATypeToVCLType(
+ aDAType: TDADataType): TFieldType;
+begin
+ Result := inherited intDATypeToVCLType(aDAType);
+ {$IFNDEF DELPHI2009UP}
+ // ADODB.pas doesn't support ftFMTBCD up to D2009
+ if Result = ftFMTBcd then Result := ftBCD;
+ {$ENDIF}
+end;
+
+{ TDAADODataset }
+
+procedure TDAADODataset.DataEvent(Event: TDataEvent; Info: Integer);
+begin
+ if FLocateRecordMode and (Event = deCheckBrowseMode) and (Info = 0) and (Self.State = dsBrowse) then
+ // nothing
+ else
+ inherited;
+end;
+
+function TDAADODataset.GetDataTable: TDADataTable;
+begin
+ result := TDADataTable(Owner);
+end;
+
+procedure TDAADODataset.InternalInitFieldDefs;
+begin
+ inherited;
+end;
+
+procedure TDAADODataset.InternalRefresh;
+begin
+ // Does nothing
+end;
+
+function TDAADODataset.Locate(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+begin
+ FLocateRecordMode:=True;
+ try
+ Result := inherited Locate(KeyFields,KeyValues,Options);
+ finally
+ FLocateRecordMode:= False;
+ end;
+end;
+
+function TDAADODataset.Lookup(const KeyFields: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ FLocateRecordMode:=True;
+ try
+ Result := inherited Lookup(KeyFields, KeyValues, ResultFields);
+ finally
+ FLocateRecordMode:= False;
+ end;
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAADOInterfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAADOInterfaces.pas
new file mode 100644
index 0000000..d0a32e0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAADOInterfaces.pas
@@ -0,0 +1,1289 @@
+unit uDAADOInterfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up }
+{ platform: Win32 }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ uDAInterfaces, uDAEngine, uROClasses;
+
+const
+ stdMSSQL_ConnectionString = 'User ID=%s;Password=%s;Initial Catalog=%s;Data Source=%s';
+
+ // OLE DB Services = -2 means we don't want ADO Connection pooling done for us!
+ stdADO_ConnectionString = 'Provider=%s;' + stdMSSQL_ConnectionString + ';OLE DB SERVICES=-2';
+
+ MSSQL_DriverType = 'MSSQL';
+ Access_DriverType = 'Access';
+ FoxPro_DriverType ='FoxPro';
+ ODBC_DriverType = '';//'ODBC';
+ ASA_DriverType = 'ASA';
+ Sybase_DriverType = 'Sybase';
+ Informix_DriverType = 'Informix';
+ DB2_DriverType = 'DB2';
+ Paradox_DriverType = 'Paradox';
+
+const
+ // Standard OLEDB providers identifiers
+ oledb_UnknownId = '???';
+ oledb_MSSQLId = 'SQLOLEDB.1';
+ oledb_JetId = 'Microsoft.Jet.OLEDB.4.0';
+ oledb_OracleId = 'MSDAORA.1';
+ oledb_ODBCId = 'MSDASQL.1';
+ oledb_MSSQL2005Id ='SQLNCLI.1';
+ oledb_PostgresqlId = 'PostgreSQL.1';
+ oleDb_VisualFoxProId = 'VFPOLEDB.1';
+ oledb_MSSQL2008Id = 'SQLNCLI10.1';
+
+type
+ // Standard OLEDB providers enumerated
+ TDAOleDBProviderType = (oledb_Unknown,
+ oledb_MSSQL,
+ oledb_Jet,
+ oledb_Oracle,
+ oledb_ODBC,
+ oledb_MSSQL2005,
+ oledb_Postgresql,
+ oleDb_VisualFoxPro,
+ oledb_MSSQL2008
+ );
+
+const
+ // Standard OLEDB providers identifier array (useful for lookups)
+ OleDBProviders: array[TDAOleDBProviderType] of string = (
+ oledb_UnknownId,
+ oledb_MSSQLId,
+ oledb_JetId,
+ oledb_OracleId,
+ oledb_ODBCId,
+ oledb_MSSQL2005Id,
+ oledb_PostgresqlId,
+ oleDb_VisualFoxProId,
+ oledb_MSSQL2008Id
+ );
+
+type
+ { IADOConnection
+ For identification purposes. Implemented by all ADO connections and also those that target MSSQL-only such as SDAC }
+ IDAADOConnection = interface(IDAConnection)
+ ['{979D10CF-FD56-4C16-8074-338CADA9F1CD}']
+ function GetProviderName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetProviderType: TDAOleDBProviderType; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ property ProviderName: string read GetProviderName;
+ property ProviderType: TDAOleDBProviderType read GetProviderType;
+
+ function GetCommandTimeout: Integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetCommandTimeout(const Value: Integer); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ property CommandTimeout: Integer read GetCommandTimeout write SetCommandTimeout;
+ end;
+
+ TDAMSConnection = class(TDAEConnection,IDACanQueryDatabaseNames)
+ protected
+ fMSSQLSchemaEnabled: Boolean;
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ function DoGetLastAutoInc(const GeneratorName: string): integer; override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+ function GetSPSelectSyntax(HasArguments: Boolean): String; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDACanQueryDatabaseNames
+ function GetDatabaseNames: IROStrings;
+ public
+ property MSSQLSchemaEnabled: Boolean read fMSSQLSchemaEnabled write fMSSQLSchemaEnabled;
+ end;
+
+ TDAMSSQLDriver = class(TDAEDriver)
+ protected
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+function OleDBDriverIdToOleDBProviderType(const anID: string): TDAOleDBProviderType;
+procedure MSSQL_GetAuxParams(const List: IROStrings);
+procedure MSSQL_DoGetNames(Query: IDADataset; AList: IROStrings; AObjectType: TDAObjecttype; SchemaEnabled: Boolean);
+function MSSQL_DoGetLastAutoInc(const GeneratorName: string;Query: IDADataset): variant;
+function MSSQL_CreateMacroProcessor: TDASQLMacroProcessor;
+procedure MSSQL_DoGetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection);
+procedure MSSQL_DoGetForeignKeys(Query: IDADataset; ForeignKeys: TDADriverForeignKeyCollection; SchemaEnabled: Boolean);
+function MSSQL_GetSPSelectSyntax(HasArguments: Boolean): String;
+function MSSQL_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+function MSSQL_GetQuoteChars: TDAQuoteCharArray;
+function MSSQL_GetDatabaseNames(aConnection:TDAEConnection): IROStrings;
+function MSACCESS_GetFileExtensions: IROStrings;
+procedure MSSQL_DoGetStoredProcedureParams(const aStoredProcedureName: string; Query: IDADataset; out Params: TDAParamCollection);
+
+implementation
+
+uses
+ SysUtils, {$IFDEF MSWINDOWS} Windows,{$ENDIF}
+ uDAMacroProcessors;
+
+const
+ MSSQL_MasterDatabase = 'master';
+ MSSQL_GetDatabaseNames_SQL = 'select Name from sysdatabases order by Name';
+
+var
+ ado_reservedwords: array of string;
+
+function OleDBDriverIdToOleDBProviderType(const anID: string): TDAOleDBProviderType;
+var
+ x: TDAOleDBProviderType;
+begin
+ result := oledb_Unknown;
+
+ for x := Low(TDAOleDBProviderType) to High(TDAOleDBProviderType) do
+ if SameText(OleDBProviders[x], anID) then begin
+ result := x;
+ Exit;
+ end;
+end;
+
+procedure MSSQL_GetAuxParams(const List: IROStrings);
+begin
+ List.Add('Integrated Security=SSPI');
+ List.Add('Schemas=0,1');
+end;
+
+procedure MSSQL_DoGetNames(Query: IDADataset; AList: IROStrings; AObjectType: TDAObjecttype; SchemaEnabled: Boolean);
+var
+ fWhere: string;
+begin
+ try
+ case AObjectType of
+ dotTable: begin
+ if not SchemaEnabled then fWhere:='AND (TABLE_SCHEMA = ''dbo'') ';
+ Query.SQL := 'SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES ' +
+ 'WHERE (OBJECTPROPERTY(OBJECT_ID(TABLE_SCHEMA + ''.'' + TABLE_NAME), ''IsMsShipped'') = 0) ' +
+ 'AND (TABLE_TYPE = ''BASE TABLE'') ' +fWhere+
+ 'ORDER BY 1, 2';
+ end;
+ dotProcedure: begin
+ if not SchemaEnabled then fWhere:='AND (ROUTINE_SCHEMA = ''dbo'') ';
+ Query.SQL := 'SELECT ROUTINE_SCHEMA, ROUTINE_NAME ' +
+ 'FROM INFORMATION_SCHEMA.ROUTINES ' +
+ 'WHERE (OBJECTPROPERTY(OBJECT_ID(ROUTINE_SCHEMA + ''.'' + ROUTINE_NAME), ''IsMsShipped'') = 0) AND (ROUTINE_TYPE = ''PROCEDURE'') ' +fWhere+
+ 'ORDER BY 1, 2';
+ end;
+ dotView: begin
+ if not SchemaEnabled then fWhere:='AND (TABLE_SCHEMA = ''dbo'') ';
+ Query.SQL := 'SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES ' +
+ 'WHERE (OBJECTPROPERTY(OBJECT_ID(TABLE_SCHEMA + ''.'' + TABLE_NAME), ''IsMsShipped'') = 0) ' +
+ 'AND (TABLE_TYPE = ''VIEW'') ' +
+ 'ORDER BY 1, 2';
+ end;
+ else
+ end;
+ Query.Open;
+ while not Query.EOF do begin
+ if SchemaEnabled then
+ AList.Add(Format('%s.%s', [Trim(Query.Fields[0].AsString), Trim(Query.Fields[1].AsString)]))
+ else
+ AList.Add(Trim(Query.Fields[1].AsString));
+ Query.Next;
+ end;
+ Query.Close;
+ finally
+ Query := nil;
+ end;
+end;
+
+function MSSQL_DoGetLastAutoInc(const GeneratorName: string;Query: IDADataset): variant;
+begin
+ try
+ // Using Ident_Current is not fully safe
+ //if Trim(GeneratorName) <> '' then
+ // Query.SQL := 'SELECT IsNull(Ident_Current(' + QuotedStr(GeneratorName) + '), 0) as LastInc'
+ //else
+ Query.SQL := 'SELECT IsNull(@@Identity, 0) as LastInc';
+ Query.Open;
+ result := Query.Fields[0].Value;
+ finally
+ Query := nil;
+ end;
+end;
+
+function MSSQL_CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ Result := TDAMSSQLMacroProcessor.Create;
+end;
+
+procedure MSSQL_DoGetStoredProcedureParams(const aStoredProcedureName: string; Query: IDADataset; out Params: TDAParamCollection);
+var
+ lProcName, lSchema: string;
+ lparam: TDAParam;
+begin
+ Params := TDAParamCollection.Create(nil);
+ try
+ lProcName := aStoredProcedureName;
+ if pos('.', lProcName) = 0 then begin
+ lSchema := ''
+ end else begin
+ lSchema := copy(lProcName, 1, pos('.', lProcName) - 1);
+ Delete(lProcName, 1, pos('.', lProcName));
+ end;
+ Query.SQL := 'exec sp_sproc_columns '+QuotedStr(lProcName);
+ if lSchema <> '' then Query.SQL := Query.SQL+', '+QuotedStr(lSchema);
+ Query.Open;
+ while not Query.EOF do begin
+ lparam := Params.Add;
+ lParam.Name:= Trim(Copy(Query.FieldByName('COLUMN_NAME').AsString,2,MaxInt));
+ case Query.FieldByName('COLUMN_TYPE').AsSmallInt of
+ 1: lparam.ParamType := daptInput;
+ 2: lparam.ParamType := daptInputOutput;
+ 5: lparam.ParamType := daptResult;
+ else
+ lparam.ParamType := daptUnknown;
+ end;
+ lParam.Size := Query.FieldByName('Length').AsInteger;
+ case Query.FieldByName('DATA_TYPE').AsInteger of
+ -150 {sql_variant } : lparam.DataType := datUnknown; // unsupported now!
+ -11 {uniqueidentifier}: lparam.DataType := datGuid;
+ -10 {ntext} : lparam.DataType := datWideMemo;
+ -9 {nvarchar} : lparam.DataType := datWideString;
+ -8 {nchar} : lparam.DataType := datWideString;
+ -7 {bit} : lparam.DataType := datBoolean;
+ -6 {tinyint} : lparam.DataType := datByte;
+ -5 {bigint} : lparam.DataType := datLargeInt;
+ -4 {image} : lparam.DataType := datBlob;
+ -3 {varbinary} : lparam.DataType := datBlob;
+ -2 {binary} : lparam.DataType := datBlob;
+ -1 {text} : lparam.DataType := datMemo;
+ 1 {char} : lparam.DataType := datString;
+ 2 {numeric} : begin
+ lparam.DecimalPrecision:= Query.FieldByName('PRECISION').AsInteger;
+ lparam.DecimalScale:= Query.FieldByName('SCALE').AsInteger;
+ if (lparam.DecimalPrecision <= 19) and (lparam.DecimalScale <= 4) then
+ lparam.DataType := datCurrency
+ else
+ lparam.DataType := datDecimal
+ end;
+ 3 {money} : begin
+ lparam.DataType := datCurrency;
+ lparam.DecimalPrecision:= Query.FieldByName('PRECISION').AsInteger;
+ lparam.DecimalScale:= Query.FieldByName('SCALE').AsInteger;
+ end;
+ 4 {int} : lparam.DataType := datInteger;
+ 5 {smallint} : lparam.DataType := datSmallInt;
+ 6 {float} : lparam.DataType := datFloat;
+ 7 {real} : lparam.DataType := datSingleFloat;
+ 11 {datetime} : lparam.DataType := datDateTime;
+ 12 {varchar} : lparam.DataType := datString;
+ else
+ lparam.DataType := datUnknown;
+ end;
+ if lparam.DataType in [datWideString, datWideMemo] then
+ lparam.Size := lparam.Size div SizeOf(WideChar);
+ Query.Next;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+procedure MSSQL_DoGetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection);
+var
+ dra: TDAField;
+begin
+ Fields := TDAFieldCollection.Create(nil);
+ try
+ Query.SQL := 'SELECT * FROM ' + aTableName + ' WHERE 1=0';
+ Query.Open;
+ Fields.Assign(Query.Fields);
+ Query.Close;
+
+ Query.SQL := 'exec sp_MShelpcolumns '+QuotedStr(aTableName)+', null, ''id'', 1;';
+ Query.Open;
+ try
+ while not Query.Eof do begin
+ dra := Fields.FindField(Trim(Query.FieldByName('COL_NAME').AsString));
+ if Assigned(dra) then
+ begin
+ dra.InPrimaryKey := (Query.FieldByName('COL_FLAGS').AsInteger and $04) = $04;
+ dra.Required := not Query.FieldByName('COL_NULL').AsBoolean;
+ if Query.FieldByName('COL_IDENTITY').AsBoolean then begin
+ if (dra.DataType = datLargeInt) or (dra.DataType = datLargeUInt) then
+ dra.DataType := datLargeAutoInc
+ else
+ dra.DataType := datAutoInc;
+ dra.GeneratorName := aTableName;
+ end;
+ if (AnsiCompareText(Query.FieldByName('COL_BASETYPENAME').asString,'decimal') =0) or
+ (AnsiCompareText(Query.FieldByName('COL_BASETYPENAME').asString,'numeric') =0) then begin
+ dra.DataType := datDecimal;
+ Dra.DecimalScale := Query.FieldByName('COL_SCALE').AsInteger;
+ Dra.DecimalPrecision := Query.FieldByName('COL_PREC').AsInteger;
+ end
+ else
+ if (AnsiCompareText(Query.FieldByName('COL_BASETYPENAME').asString,'uniqueidentifier') =0) then
+ dra.DataType := datGuid
+ else
+ if (AnsiCompareText(Query.FieldByName('COL_BASETYPENAME').asString,'money') =0) or
+ (AnsiCompareText(Query.FieldByName('COL_BASETYPENAME').asString,'smallmoney') =0) then
+ dra.DataType := datCurrency
+ else
+ if (AnsiCompareText(Query.FieldByName('COL_BASETYPENAME').asString,'timestamp') =0) then begin
+ dra.DataType := datBlob;
+ dra.BlobType := dabtTimestamp;
+ dra.LogChanges := false;
+ end;
+ if (AnsiCompareText(Query.FieldByName('COL_BASETYPENAME').asString,'ntext') =0) then begin
+ dra.DataType := datWideMemo;
+ end;
+ if (AnsiCompareText(Query.FieldByName('COL_BASETYPENAME').asString,'text') =0) then begin
+ dra.DataType := datMemo;
+ end;
+ end;
+ Query.Next;
+ end;
+ finally
+ Query.Close;
+ end;
+ finally
+ Query:=nil;
+ end;
+end;
+
+procedure MSSQL_DoGetForeignKeys(Query: IDADataset; ForeignKeys: TDADriverForeignKeyCollection; SchemaEnabled: Boolean);
+const
+ s_fk = 'SELECT o3.name AS CONSTRAINT_NAME, ' +
+ 's1.name as FK_SCHEMA_NAME,o1.name as FK_TABLE_NAME,c1.name as FK_COLUMN_NAME, '+
+ 's2.name as PK_SCHEMA_NAME,o2.name as PK_TABLE_NAME,c2.name as PK_COLUMN_NAME '+
+ 'FROM '+
+ 'sys.foreign_key_columns fkc '+
+ 'join sys.all_objects o3 on (o3.object_id = fkc.constraint_object_id) '+
+ 'join sys.all_objects o1 on (o1.object_id = fkc.parent_object_id) '+
+ 'join sys.schemas s1 on (o1.schema_id = s1.schema_id) '+
+ 'join sys.all_objects o2 on (o2.object_id = fkc.referenced_object_id) '+
+ 'join sys.schemas s2 on (o2.schema_id = s2.schema_id) '+
+ 'join sys.columns c1 on (c1.object_id = fkc.parent_object_id and c1.column_ID = fkc.parent_column_id) '+
+ 'join sys.columns c2 on (c2.object_id = fkc.referenced_object_id and c2.column_ID = fkc.referenced_column_id) ';
+ s_fk_where = ' AND (s1.name = ''dbo'') AND (s2.name = ''dbo'') ';
+ s_fk_Order = 'ORDER BY s1.name, o1.name, o3.name, fkc.constraint_column_id';
+var
+ fWhere: String;
+ lCurrConstraint: string;
+ lCurrFK: TDADriverForeignKey;
+ l_name: string;
+begin
+ lCurrConstraint := '';
+ lCurrFK := nil;
+ try
+ if not SchemaEnabled then fWhere:= s_fk_where;
+ Query.SQL := s_fk + fWhere + s_fk_Order;
+ Query.Open;
+ while not Query.Eof do begin
+ l_Name := Trim(Query.Fields[0].AsString);
+ if lCurrConstraint <> l_name then begin
+ lCurrConstraint := l_name;
+ lCurrFK := ForeignKeys.Add();
+ with lCurrFK do begin
+ Name := l_name;
+ FKField := Trim(Query.Fields[3].AsString);
+ PKField := Trim(Query.Fields[6].AsString);
+ if SchemaEnabled then begin
+ FKTable := Format('%s.%s', [Trim(Query.Fields[1].AsString), Trim(Query.Fields[2].AsString)]);
+ PKTable := Format('%s.%s', [Trim(Query.Fields[4].AsString), Trim(Query.Fields[5].AsString)]);
+ end else
+ begin
+ FKTable := Trim(Query.Fields[2].AsString);
+ PKTable := Trim(Query.Fields[5].AsString);
+ end;
+ end;
+ end else begin
+ with lCurrFK do begin
+ FKField := FKField + ';' + Trim(Query.Fields[3].AsString);
+ PKField := PKField + ';' + Trim(Query.Fields[6].AsString);
+ end;
+ end;
+ Query.Next;
+ end;
+ Query.Close;
+ finally
+ Query := nil;
+ end;
+end;
+
+function MSSQL_GetSPSelectSyntax(HasArguments: Boolean): String;
+begin
+ Result := 'EXEC {0} {1}';
+end;
+
+function MSSQL_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+begin
+ result := TestIdentifier(iIdentifier,ado_reservedwords);
+end;
+
+function MSSQL_GetQuoteChars: TDAQuoteCharArray;
+begin
+ result[0] := '[';
+ result[1] := ']';
+end;
+
+function MSSQL_GetDatabaseNames(aConnection:TDAEConnection): IROStrings;
+begin
+ Result := Engine_GetDatabaseNames(aConnection, MSSQL_MasterDatabase, MSSQL_GetDatabaseNames_SQL);
+end;
+
+{ TDAMSConnection }
+
+function TDAMSConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ Result := MSSQL_CreateMacroProcessor;
+end;
+
+procedure TDAMSConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ inherited;
+ MSSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, MSSQLSchemaEnabled);
+end;
+
+function TDAMSConnection.DoGetLastAutoInc(const GeneratorName: string): integer;
+begin
+ Result := DoGetLastAutoIncValue(GeneratorName);
+end;
+
+function TDAMSConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+begin
+ Result := MSSQL_DoGetLastAutoInc(GeneratorName,GetDatasetClass.Create(Self));
+end;
+
+procedure TDAMSConnection.DoGetStoredProcedureNames(out List: IROStrings);
+begin
+ inherited DoGetStoredProcedureNames(List);
+ MSSQL_DoGetNames(GetDatasetClass.Create(Self),List,dotProcedure,MSSQLSchemaEnabled);
+end;
+
+procedure TDAMSConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ MSSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName),GetDatasetClass.Create(Self),Fields);
+end;
+
+procedure TDAMSConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited DoGetTableNames(List);
+ MSSQL_DoGetNames(GetDatasetClass.Create(Self),List,dotTable,MSSQLSchemaEnabled);
+end;
+
+procedure TDAMSConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited DoGetViewNames(List);
+ MSSQL_DoGetNames(GetDatasetClass.Create(Self),List,dotView,MSSQLSchemaEnabled);
+end;
+
+function TDAMSConnection.GetDatabaseNames: IROStrings;
+begin
+ Result := MSSQL_GetDatabaseNames(Self);
+end;
+
+function TDAMSConnection.GetSPSelectSyntax(HasArguments: Boolean): String;
+begin
+ Result := MSSQL_GetSPSelectSyntax(HasArguments);
+end;
+
+procedure ADO_InitializeReservedWords;
+begin
+ // http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.etools.ejbbatchdeploy.doc/topics/rsqlMSSQLSERVER_2005.html
+ SetLength(ado_reservedwords, 747);
+ // sorted with TStringList.Sort (bds2007)
+ ado_reservedwords[0] := 'A';
+ ado_reservedwords[1] := 'ABORT';
+ ado_reservedwords[2] := 'ABS';
+ ado_reservedwords[3] := 'ABSOLUTE';
+ ado_reservedwords[4] := 'ACCESS';
+ ado_reservedwords[5] := 'ACOS';
+ ado_reservedwords[6] := 'ACQUIRE';
+ ado_reservedwords[7] := 'ACTION';
+ ado_reservedwords[8] := 'ACTIVATE';
+ ado_reservedwords[9] := 'ADA';
+ ado_reservedwords[10] := 'ADD';
+ ado_reservedwords[11] := 'ADDFORM';
+ ado_reservedwords[12] := 'ADMIN';
+ ado_reservedwords[13] := 'AFTER';
+ ado_reservedwords[14] := 'AGGREGATE';
+ ado_reservedwords[15] := 'ALIAS';
+ ado_reservedwords[16] := 'ALL';
+ ado_reservedwords[17] := 'ALLOCATE';
+ ado_reservedwords[18] := 'ALTER';
+ ado_reservedwords[19] := 'AN';
+ ado_reservedwords[20] := 'ANALYZE';
+ ado_reservedwords[21] := 'AND';
+ ado_reservedwords[22] := 'ANY';
+ ado_reservedwords[23] := 'APPEND';
+ ado_reservedwords[24] := 'ARCHIVE';
+ ado_reservedwords[25] := 'ARCHIVELOG';
+ ado_reservedwords[26] := 'ARE';
+ ado_reservedwords[27] := 'ARRAY';
+ ado_reservedwords[28] := 'ARRAYLEN';
+ ado_reservedwords[29] := 'AS';
+ ado_reservedwords[30] := 'ASC';
+ ado_reservedwords[31] := 'ASCII';
+ ado_reservedwords[32] := 'ASIN';
+ ado_reservedwords[33] := 'ASSERTION';
+ ado_reservedwords[34] := 'AT';
+ ado_reservedwords[35] := 'ATAN';
+ ado_reservedwords[36] := 'AUDIT';
+ ado_reservedwords[37] := 'AUTHORIZATION';
+ ado_reservedwords[38] := 'AVG';
+ ado_reservedwords[39] := 'AVGU';
+ ado_reservedwords[40] := 'BACKUP';
+ ado_reservedwords[41] := 'BECOME';
+ ado_reservedwords[42] := 'BEFORE';
+ ado_reservedwords[43] := 'BEGIN';
+ ado_reservedwords[44] := 'BETWEEN';
+ ado_reservedwords[45] := 'BIGINT';
+ ado_reservedwords[46] := 'BINARY';
+ ado_reservedwords[47] := 'BIND';
+ ado_reservedwords[48] := 'BINDING';
+ ado_reservedwords[49] := 'BIT';
+ ado_reservedwords[50] := 'BLOB';
+ ado_reservedwords[51] := 'BLOCK';
+ ado_reservedwords[52] := 'BODY';
+ ado_reservedwords[53] := 'BOOLEAN';
+ ado_reservedwords[54] := 'BOTH';
+ ado_reservedwords[55] := 'BREADTH';
+ ado_reservedwords[56] := 'BREAK';
+ ado_reservedwords[57] := 'BREAKDISPLAY';
+ ado_reservedwords[58] := 'BROWSE';
+ ado_reservedwords[59] := 'BUFFERPOOL';
+ ado_reservedwords[60] := 'BULK';
+ ado_reservedwords[61] := 'BY';
+ ado_reservedwords[62] := 'BYREF';
+ ado_reservedwords[63] := 'CACHE';
+ ado_reservedwords[64] := 'CALL';
+ ado_reservedwords[65] := 'CALLPROC';
+ ado_reservedwords[66] := 'CANCEL';
+ ado_reservedwords[67] := 'CAPTURE';
+ ado_reservedwords[68] := 'CASCADE';
+ ado_reservedwords[69] := 'CASCADED';
+ ado_reservedwords[70] := 'CASE';
+ ado_reservedwords[71] := 'CAST';
+ ado_reservedwords[72] := 'CATALOG';
+ ado_reservedwords[73] := 'CCSID';
+ ado_reservedwords[74] := 'CEILING';
+ ado_reservedwords[75] := 'CHANGE';
+ ado_reservedwords[76] := 'CHAR';
+ ado_reservedwords[77] := 'CHARACTER';
+ ado_reservedwords[78] := 'CHARTOROWID';
+ ado_reservedwords[79] := 'CHECK';
+ ado_reservedwords[80] := 'CHECKPOINT';
+ ado_reservedwords[81] := 'CHR';
+ ado_reservedwords[82] := 'CLASS';
+ ado_reservedwords[83] := 'CLEANUP';
+ ado_reservedwords[84] := 'CLEAR';
+ ado_reservedwords[85] := 'CLEARROW';
+ ado_reservedwords[86] := 'CLOB';
+ ado_reservedwords[87] := 'CLOSE';
+ ado_reservedwords[88] := 'CLUSTER';
+ ado_reservedwords[89] := 'CLUSTERED';
+ ado_reservedwords[90] := 'COALESCE';
+ ado_reservedwords[91] := 'COBOL';
+ ado_reservedwords[92] := 'COLGROUP';
+ ado_reservedwords[93] := 'COLLATE';
+ ado_reservedwords[94] := 'COLLATION';
+ ado_reservedwords[95] := 'COLLECTION';
+ ado_reservedwords[96] := 'COLUMN';
+ ado_reservedwords[97] := 'COMMAND';
+ ado_reservedwords[98] := 'COMMENT';
+ ado_reservedwords[99] := 'COMMIT';
+ ado_reservedwords[100] := 'COMMITTED';
+ ado_reservedwords[101] := 'COMPILE';
+ ado_reservedwords[102] := 'COMPLETION';
+ ado_reservedwords[103] := 'COMPLEX';
+ ado_reservedwords[104] := 'COMPRESS';
+ ado_reservedwords[105] := 'COMPUTE';
+ ado_reservedwords[106] := 'CONCAT';
+ ado_reservedwords[107] := 'CONFIRM';
+ ado_reservedwords[108] := 'CONNECT';
+ ado_reservedwords[109] := 'CONNECTION';
+ ado_reservedwords[110] := 'CONSTRAINT';
+ ado_reservedwords[111] := 'CONSTRAINTS';
+ ado_reservedwords[112] := 'CONSTRUCTOR';
+ ado_reservedwords[113] := 'CONTAINS';
+ ado_reservedwords[114] := 'CONTAINSTABLE';
+ ado_reservedwords[115] := 'CONTENTS';
+ ado_reservedwords[116] := 'CONTINUE';
+ ado_reservedwords[117] := 'CONTROLFILE';
+ ado_reservedwords[118] := 'CONTROLROW';
+ ado_reservedwords[119] := 'CONVERT';
+ ado_reservedwords[120] := 'COPY';
+ ado_reservedwords[121] := 'CORRESPONDING';
+ ado_reservedwords[122] := 'COS';
+ ado_reservedwords[123] := 'COUNT';
+ ado_reservedwords[124] := 'COUNTU';
+ ado_reservedwords[125] := 'CREATE';
+ ado_reservedwords[126] := 'CROSS';
+ ado_reservedwords[127] := 'CUBE';
+ ado_reservedwords[128] := 'CURRENT';
+ ado_reservedwords[129] := 'CURRENT_DATE';
+ ado_reservedwords[130] := 'CURRENT_PATH';
+ ado_reservedwords[131] := 'CURRENT_ROLE';
+ ado_reservedwords[132] := 'CURRENT_TIME';
+ ado_reservedwords[133] := 'CURRENT_TIMESTAMP';
+ ado_reservedwords[134] := 'CURRENT_USER';
+ ado_reservedwords[135] := 'CURSOR';
+ ado_reservedwords[136] := 'CVAR';
+ ado_reservedwords[137] := 'CYCLE';
+ ado_reservedwords[138] := 'DATA';
+ ado_reservedwords[139] := 'DATABASE';
+ ado_reservedwords[140] := 'DATAFILE';
+ ado_reservedwords[141] := 'DATAHANDLER';
+ ado_reservedwords[142] := 'DATAPAGES';
+ ado_reservedwords[143] := 'DATE';
+ ado_reservedwords[144] := 'DAY';
+ ado_reservedwords[145] := 'DAYOFMONTH';
+ ado_reservedwords[146] := 'DAYOFWEEK';
+ ado_reservedwords[147] := 'DAYOFYEAR';
+ ado_reservedwords[148] := 'DAYS';
+ ado_reservedwords[149] := 'DBA';
+ ado_reservedwords[150] := 'DBCC';
+ ado_reservedwords[151] := 'DBSPACE';
+ ado_reservedwords[152] := 'DEALLOCATE';
+ ado_reservedwords[153] := 'DEC';
+ ado_reservedwords[154] := 'DECIMAL';
+ ado_reservedwords[155] := 'DECLARATION';
+ ado_reservedwords[156] := 'DECLARE';
+ ado_reservedwords[157] := 'DECODE';
+ ado_reservedwords[158] := 'DEFAULT';
+ ado_reservedwords[159] := 'DEFERRABLE';
+ ado_reservedwords[160] := 'DEFERRED';
+ ado_reservedwords[161] := 'DEFINE';
+ ado_reservedwords[162] := 'DEFINITION';
+ ado_reservedwords[163] := 'DEGREES';
+ ado_reservedwords[164] := 'DELETE';
+ ado_reservedwords[165] := 'DELETEROW';
+ ado_reservedwords[166] := 'DENY';
+ ado_reservedwords[167] := 'DEPTH';
+ ado_reservedwords[168] := 'DEREF';
+ ado_reservedwords[169] := 'DESC';
+ ado_reservedwords[170] := 'DESCRIBE';
+ ado_reservedwords[171] := 'DESCRIPTOR';
+ ado_reservedwords[172] := 'DESTROY';
+ ado_reservedwords[173] := 'DESTRUCTOR';
+ ado_reservedwords[174] := 'DETERMINISTIC';
+ ado_reservedwords[175] := 'DHTYPE';
+ ado_reservedwords[176] := 'DIAGNOSTICS';
+ ado_reservedwords[177] := 'DICTIONARY';
+ ado_reservedwords[178] := 'DIRECT';
+ ado_reservedwords[179] := 'DISABLE';
+ ado_reservedwords[180] := 'DISCONNECT';
+ ado_reservedwords[181] := 'DISK';
+ ado_reservedwords[182] := 'DISMOUNT';
+ ado_reservedwords[183] := 'DISPLAY';
+ ado_reservedwords[184] := 'DISTINCT';
+ ado_reservedwords[185] := 'DISTRIBUTE';
+ ado_reservedwords[186] := 'DISTRIBUTED';
+ ado_reservedwords[187] := 'DO';
+ ado_reservedwords[188] := 'DOMAIN';
+ ado_reservedwords[189] := 'DOUBLE';
+ ado_reservedwords[190] := 'DOWN';
+ ado_reservedwords[191] := 'DROP';
+ ado_reservedwords[192] := 'DUMMY';
+ ado_reservedwords[193] := 'DUMP';
+ ado_reservedwords[194] := 'DYNAMIC';
+ ado_reservedwords[195] := 'EACH';
+ ado_reservedwords[196] := 'EDITPROC';
+ ado_reservedwords[197] := 'ELSE';
+ ado_reservedwords[198] := 'ELSEIF';
+ ado_reservedwords[199] := 'ENABLE';
+ ado_reservedwords[200] := 'END';
+ ado_reservedwords[201] := 'ENDDATA';
+ ado_reservedwords[202] := 'ENDDISPLAY';
+ ado_reservedwords[203] := 'ENDEXEC';
+ ado_reservedwords[204] := 'END-EXEC';
+ ado_reservedwords[205] := 'ENDFORMS';
+ ado_reservedwords[206] := 'ENDIF';
+ ado_reservedwords[207] := 'ENDLOOP';
+ ado_reservedwords[208] := 'ENDSELECT';
+ ado_reservedwords[209] := 'ENDWHILE';
+ ado_reservedwords[210] := 'EQUALS';
+ ado_reservedwords[211] := 'ERASE';
+ ado_reservedwords[212] := 'ERRLVL';
+ ado_reservedwords[213] := 'ERROREXIT';
+ ado_reservedwords[214] := 'ESCAPE';
+ ado_reservedwords[215] := 'EVENTS';
+ ado_reservedwords[216] := 'EVERY';
+ ado_reservedwords[217] := 'EXCEPT';
+ ado_reservedwords[218] := 'EXCEPTION';
+ ado_reservedwords[219] := 'EXCEPTIONS';
+ ado_reservedwords[220] := 'EXCLUDE';
+ ado_reservedwords[221] := 'EXCLUDING';
+ ado_reservedwords[222] := 'EXCLUSIVE';
+ ado_reservedwords[223] := 'EXEC';
+ ado_reservedwords[224] := 'EXECUTE';
+ ado_reservedwords[225] := 'EXISTS';
+ ado_reservedwords[226] := 'EXIT';
+ ado_reservedwords[227] := 'EXP';
+ ado_reservedwords[228] := 'EXPLAIN';
+ ado_reservedwords[229] := 'EXPLICIT';
+ ado_reservedwords[230] := 'EXTENT';
+ ado_reservedwords[231] := 'EXTERNAL';
+ ado_reservedwords[232] := 'EXTERNALLY';
+ ado_reservedwords[233] := 'EXTRACT';
+ ado_reservedwords[234] := 'FALSE';
+ ado_reservedwords[235] := 'FETCH';
+ ado_reservedwords[236] := 'FIELD';
+ ado_reservedwords[237] := 'FIELDPROC';
+ ado_reservedwords[238] := 'FILE';
+ ado_reservedwords[239] := 'FILLFACTOR';
+ ado_reservedwords[240] := 'FINALIZE';
+ ado_reservedwords[241] := 'FINALIZE';
+ ado_reservedwords[242] := 'FIRST';
+ ado_reservedwords[243] := 'FLOAT';
+ ado_reservedwords[244] := 'FLOOR';
+ ado_reservedwords[245] := 'FLOPPY';
+ ado_reservedwords[246] := 'FLUSH';
+ ado_reservedwords[247] := 'FOR';
+ ado_reservedwords[248] := 'FORCE';
+ ado_reservedwords[249] := 'FOREIGN';
+ ado_reservedwords[250] := 'FORMDATA';
+ ado_reservedwords[251] := 'FORMINIT';
+ ado_reservedwords[252] := 'FORMS';
+ ado_reservedwords[253] := 'FORTRAN';
+ ado_reservedwords[254] := 'FOUND';
+ ado_reservedwords[255] := 'FREE';
+ ado_reservedwords[256] := 'FREELIST';
+ ado_reservedwords[257] := 'FREELISTS';
+ ado_reservedwords[258] := 'FREETEXT';
+ ado_reservedwords[259] := 'FREETEXTTABLE';
+ ado_reservedwords[260] := 'FROM';
+ ado_reservedwords[261] := 'FULL';
+ ado_reservedwords[262] := 'FUNCTION';
+ ado_reservedwords[263] := 'GENERAL';
+ ado_reservedwords[264] := 'GET';
+ ado_reservedwords[265] := 'GETCURRENTCONNECTION';
+ ado_reservedwords[266] := 'GETFORM';
+ ado_reservedwords[267] := 'GETOPER';
+ ado_reservedwords[268] := 'GETROW';
+ ado_reservedwords[269] := 'GLOBAL';
+ ado_reservedwords[270] := 'GO';
+ ado_reservedwords[271] := 'GOTO';
+ ado_reservedwords[272] := 'GRANT';
+ ado_reservedwords[273] := 'GRANTED';
+ ado_reservedwords[274] := 'GRAPHIC';
+ ado_reservedwords[275] := 'GREATEST';
+ ado_reservedwords[276] := 'GROUP';
+ ado_reservedwords[277] := 'GROUPING';
+ ado_reservedwords[278] := 'GROUPS';
+ ado_reservedwords[279] := 'HASH';
+ ado_reservedwords[280] := 'HAVING';
+ ado_reservedwords[281] := 'HELP';
+ ado_reservedwords[282] := 'HELPFILE';
+ ado_reservedwords[283] := 'HOLDLOCK';
+ ado_reservedwords[284] := 'HOST';
+ ado_reservedwords[285] := 'HOUR';
+ ado_reservedwords[286] := 'HOURS';
+ ado_reservedwords[287] := 'IDENTIFIED';
+ ado_reservedwords[288] := 'IDENTITY';
+ ado_reservedwords[289] := 'IDENTITYCOL';
+ ado_reservedwords[290] := 'IF';
+ ado_reservedwords[291] := 'IFNULL';
+ ado_reservedwords[292] := 'IGNORE';
+ ado_reservedwords[293] := 'IIMESSAGE';
+ ado_reservedwords[294] := 'IIPRINTF';
+ ado_reservedwords[295] := 'IMMEDIATE';
+ ado_reservedwords[296] := 'IMPORT';
+ ado_reservedwords[297] := 'IN';
+ ado_reservedwords[298] := 'INCLUDE';
+ ado_reservedwords[299] := 'INCLUDING';
+ ado_reservedwords[300] := 'INCREMENT';
+ ado_reservedwords[301] := 'INDEX';
+ ado_reservedwords[302] := 'INDEXPAGES';
+ ado_reservedwords[303] := 'INDICATOR';
+ ado_reservedwords[304] := 'INITCAP';
+ ado_reservedwords[305] := 'INITIAL';
+ ado_reservedwords[306] := 'INITIALIZE';
+ ado_reservedwords[307] := 'INITIALLY';
+ ado_reservedwords[308] := 'INITRANS';
+ ado_reservedwords[309] := 'INITTABLE';
+ ado_reservedwords[310] := 'INNER';
+ ado_reservedwords[311] := 'INOUT';
+ ado_reservedwords[312] := 'INPUT';
+ ado_reservedwords[313] := 'INSENSITIVE';
+ ado_reservedwords[314] := 'INSERT';
+ ado_reservedwords[315] := 'INSERTROW';
+ ado_reservedwords[316] := 'INSTANCE';
+ ado_reservedwords[317] := 'INSTR';
+ ado_reservedwords[318] := 'INT';
+ ado_reservedwords[319] := 'INTEGER';
+ ado_reservedwords[320] := 'INTEGRITY';
+ ado_reservedwords[321] := 'INTERFACE';
+ ado_reservedwords[322] := 'INTERSECT';
+ ado_reservedwords[323] := 'INTERVAL';
+ ado_reservedwords[324] := 'INTO';
+ ado_reservedwords[325] := 'IS';
+ ado_reservedwords[326] := 'ISOLATION';
+ ado_reservedwords[327] := 'ITERATE';
+ ado_reservedwords[328] := 'JOIN';
+ ado_reservedwords[329] := 'KEY';
+ ado_reservedwords[330] := 'KILL';
+ ado_reservedwords[331] := 'LABEL';
+ ado_reservedwords[332] := 'LANGUAGE';
+ ado_reservedwords[333] := 'LARGE';
+ ado_reservedwords[334] := 'LAST';
+ ado_reservedwords[335] := 'LATERAL';
+ ado_reservedwords[336] := 'LAYER';
+ ado_reservedwords[337] := 'LEADING';
+ ado_reservedwords[338] := 'LEAST';
+ ado_reservedwords[339] := 'LEFT';
+ ado_reservedwords[340] := 'LENGTH';
+ ado_reservedwords[341] := 'LESS';
+ ado_reservedwords[342] := 'LEVEL';
+ ado_reservedwords[343] := 'LIKE';
+ ado_reservedwords[344] := 'LIMIT';
+ ado_reservedwords[345] := 'LINENO';
+ ado_reservedwords[346] := 'LINK';
+ ado_reservedwords[347] := 'LIST';
+ ado_reservedwords[348] := 'LISTS';
+ ado_reservedwords[349] := 'LOAD';
+ ado_reservedwords[350] := 'LOADTABLE';
+ ado_reservedwords[351] := 'LOCAL';
+ ado_reservedwords[352] := 'LOCALTIME';
+ ado_reservedwords[353] := 'LOCALTIMESTAMP';
+ ado_reservedwords[354] := 'LOCATE';
+ ado_reservedwords[355] := 'LOCATOR';
+ ado_reservedwords[356] := 'LOCK';
+ ado_reservedwords[357] := 'LOCKSIZE';
+ ado_reservedwords[358] := 'LOG';
+ ado_reservedwords[359] := 'LOGFILE';
+ ado_reservedwords[360] := 'LONG';
+ ado_reservedwords[361] := 'LONGINT';
+ ado_reservedwords[362] := 'LOWER';
+ ado_reservedwords[363] := 'LPAD';
+ ado_reservedwords[364] := 'LTRIM';
+ ado_reservedwords[365] := 'LVARBINARY';
+ ado_reservedwords[366] := 'LVARCHAR';
+ ado_reservedwords[367] := 'MAIN';
+ ado_reservedwords[368] := 'MANAGE';
+ ado_reservedwords[369] := 'MANUAL';
+ ado_reservedwords[370] := 'MAP';
+ ado_reservedwords[371] := 'MATCH';
+ ado_reservedwords[372] := 'MAX';
+ ado_reservedwords[373] := 'MAXDATAFILES';
+ ado_reservedwords[374] := 'MAXEXTENTS';
+ ado_reservedwords[375] := 'MAXINSTANCES';
+ ado_reservedwords[376] := 'MAXLOGFILES';
+ ado_reservedwords[377] := 'MAXLOGHISTORY';
+ ado_reservedwords[378] := 'MAXLOGMEMBERS';
+ ado_reservedwords[379] := 'MAXTRANS';
+ ado_reservedwords[380] := 'MAXVALUE';
+ ado_reservedwords[381] := 'MENUITEM';
+ ado_reservedwords[382] := 'MESSAGE';
+ ado_reservedwords[383] := 'MICROSECOND';
+ ado_reservedwords[384] := 'MICROSECONDS';
+ ado_reservedwords[385] := 'MIN';
+ ado_reservedwords[386] := 'MINEXTENTS';
+ ado_reservedwords[387] := 'MINUS';
+ ado_reservedwords[388] := 'MINUTE';
+ ado_reservedwords[389] := 'MINUTES';
+ ado_reservedwords[390] := 'MINVALUE';
+ ado_reservedwords[391] := 'MIRROREXIT';
+ ado_reservedwords[392] := 'MOD';
+ ado_reservedwords[393] := 'MODE';
+ ado_reservedwords[394] := 'MODIFIES';
+ ado_reservedwords[395] := 'MODIFY';
+ ado_reservedwords[396] := 'MODULE';
+ ado_reservedwords[397] := 'MONEY';
+ ado_reservedwords[398] := 'MONTH';
+ ado_reservedwords[399] := 'MONTHS';
+ ado_reservedwords[400] := 'MOUNT';
+ ado_reservedwords[401] := 'MOVE';
+ ado_reservedwords[402] := 'NAMED';
+ ado_reservedwords[403] := 'NAMES';
+ ado_reservedwords[404] := 'NATIONAL';
+ ado_reservedwords[405] := 'NATURAL';
+ ado_reservedwords[406] := 'NCHAR';
+ ado_reservedwords[407] := 'NCLOB';
+ ado_reservedwords[408] := 'NEW';
+ ado_reservedwords[409] := 'NEXT';
+ ado_reservedwords[410] := 'NHEADER';
+ ado_reservedwords[411] := 'NO';
+ ado_reservedwords[412] := 'NOARCHIVELOG';
+ ado_reservedwords[413] := 'NOAUDIT';
+ ado_reservedwords[414] := 'NOCACHE';
+ ado_reservedwords[415] := 'NOCHECK';
+ ado_reservedwords[416] := 'NOCOMPRESS';
+ ado_reservedwords[417] := 'NOCYCLE';
+ ado_reservedwords[418] := 'NOECHO';
+ ado_reservedwords[419] := 'NOMAXVALUE';
+ ado_reservedwords[420] := 'NOMINVALUE';
+ ado_reservedwords[421] := 'NONCLUSTERED';
+ ado_reservedwords[422] := 'NONE';
+ ado_reservedwords[423] := 'NOORDER';
+ ado_reservedwords[424] := 'NORESETLOGS';
+ ado_reservedwords[425] := 'NORMAL';
+ ado_reservedwords[426] := 'NOSORT';
+ ado_reservedwords[427] := 'NOT';
+ ado_reservedwords[428] := 'NOTFOUND';
+ ado_reservedwords[429] := 'NOTRIM';
+ ado_reservedwords[430] := 'NOWAIT';
+ ado_reservedwords[431] := 'NULL';
+ ado_reservedwords[432] := 'NULLIF';
+ ado_reservedwords[433] := 'NULLVALUE';
+ ado_reservedwords[434] := 'NUMBER';
+ ado_reservedwords[435] := 'NUMERIC';
+ ado_reservedwords[436] := 'NUMPARTS';
+ ado_reservedwords[437] := 'NVL';
+ ado_reservedwords[438] := 'OBID';
+ ado_reservedwords[439] := 'OBJECT';
+ ado_reservedwords[440] := 'ODBCINFO';
+ ado_reservedwords[441] := 'OF';
+ ado_reservedwords[442] := 'OFF';
+ ado_reservedwords[443] := 'OFFLINE';
+ ado_reservedwords[444] := 'OFFSETS';
+ ado_reservedwords[445] := 'OLD';
+ ado_reservedwords[446] := 'ON';
+ ado_reservedwords[447] := 'ONCE';
+ ado_reservedwords[448] := 'ONLINE';
+ ado_reservedwords[449] := 'ONLY';
+ ado_reservedwords[450] := 'OPEN';
+ ado_reservedwords[451] := 'OPENDATASOURCE';
+ ado_reservedwords[452] := 'OPENQUERY';
+ ado_reservedwords[453] := 'OPENROWSET';
+ ado_reservedwords[454] := 'OPERATION';
+ ado_reservedwords[455] := 'OPTIMAL';
+ ado_reservedwords[456] := 'OPTIMIZE';
+ ado_reservedwords[457] := 'OPTION';
+ ado_reservedwords[458] := 'OR';
+ ado_reservedwords[459] := 'ORDER';
+ ado_reservedwords[460] := 'ORDINALITY';
+ ado_reservedwords[461] := 'OUT';
+ ado_reservedwords[462] := 'OUTER';
+ ado_reservedwords[463] := 'OUTPUT';
+ ado_reservedwords[464] := 'OVER';
+ ado_reservedwords[465] := 'OVERLAPS';
+ ado_reservedwords[466] := 'OWN';
+ ado_reservedwords[467] := 'PACKAGE';
+ ado_reservedwords[468] := 'PAD';
+ ado_reservedwords[469] := 'PAGE';
+ ado_reservedwords[470] := 'PAGES';
+ ado_reservedwords[471] := 'PARALLEL';
+ ado_reservedwords[472] := 'PARAMETER';
+ ado_reservedwords[473] := 'PARAMETERS';
+ ado_reservedwords[474] := 'PART';
+ ado_reservedwords[475] := 'PARTIAL';
+ ado_reservedwords[476] := 'PASCAL';
+ ado_reservedwords[477] := 'PATH';
+ ado_reservedwords[478] := 'PCTFREE';
+ ado_reservedwords[479] := 'PCTINCREASE';
+ ado_reservedwords[480] := 'PCTINDEX';
+ ado_reservedwords[481] := 'PCTUSED';
+ ado_reservedwords[482] := 'PERCENT';
+ ado_reservedwords[483] := 'PERM';
+ ado_reservedwords[484] := 'PERMANENT';
+ ado_reservedwords[485] := 'PERMIT';
+ ado_reservedwords[486] := 'PI';
+ ado_reservedwords[487] := 'PIPE';
+ ado_reservedwords[488] := 'PLAN';
+ ado_reservedwords[489] := 'PLI';
+ ado_reservedwords[490] := 'POSITION';
+ ado_reservedwords[491] := 'POSTFIX';
+ ado_reservedwords[492] := 'POWER';
+ ado_reservedwords[493] := 'PRECISION';
+ ado_reservedwords[494] := 'PREFIX';
+ ado_reservedwords[495] := 'PREORDER';
+ ado_reservedwords[496] := 'PREPARE';
+ ado_reservedwords[497] := 'PRESERVE';
+ ado_reservedwords[498] := 'PRIMARY';
+ ado_reservedwords[499] := 'PRINT';
+ ado_reservedwords[500] := 'PRINTSCREEN';
+ ado_reservedwords[501] := 'PRIOR';
+ ado_reservedwords[502] := 'PRIQTY';
+ ado_reservedwords[503] := 'PRIVATE';
+ ado_reservedwords[504] := 'PRIVILEGES';
+ ado_reservedwords[505] := 'PROC';
+ ado_reservedwords[506] := 'PROCEDURE';
+ ado_reservedwords[507] := 'PROCESSEXIT';
+ ado_reservedwords[508] := 'PROFILE';
+ ado_reservedwords[509] := 'PROGRAM';
+ ado_reservedwords[510] := 'PROMPT';
+ ado_reservedwords[511] := 'PUBLIC';
+ ado_reservedwords[512] := 'PUTFORM';
+ ado_reservedwords[513] := 'PUTOPER';
+ ado_reservedwords[514] := 'PUTROW';
+ ado_reservedwords[515] := 'QUALIFICATION';
+ ado_reservedwords[516] := 'QUARTER';
+ ado_reservedwords[517] := 'QUOTA';
+ ado_reservedwords[518] := 'RADIANS';
+ ado_reservedwords[519] := 'RAISE';
+ ado_reservedwords[520] := 'RAISERROR';
+ ado_reservedwords[521] := 'RAND';
+ ado_reservedwords[522] := 'RANGE';
+ ado_reservedwords[523] := 'RAW';
+ ado_reservedwords[524] := 'READ';
+ ado_reservedwords[525] := 'READS';
+ ado_reservedwords[526] := 'READTEXT';
+ ado_reservedwords[527] := 'REAL';
+ ado_reservedwords[528] := 'RECONFIGURE';
+ ado_reservedwords[529] := 'RECORD';
+ ado_reservedwords[530] := 'RECOVER';
+ ado_reservedwords[531] := 'RECURSIVE';
+ ado_reservedwords[532] := 'REDISPLAY';
+ ado_reservedwords[533] := 'REF';
+ ado_reservedwords[534] := 'REFERENCES';
+ ado_reservedwords[535] := 'REFERENCING';
+ ado_reservedwords[536] := 'REGISTER';
+ ado_reservedwords[537] := 'RELATIVE';
+ ado_reservedwords[538] := 'RELEASE';
+ ado_reservedwords[539] := 'RELOCATE';
+ ado_reservedwords[540] := 'REMOVE';
+ ado_reservedwords[541] := 'RENAME';
+ ado_reservedwords[542] := 'REPEAT';
+ ado_reservedwords[543] := 'REPEATABLE';
+ ado_reservedwords[544] := 'REPEATED';
+ ado_reservedwords[545] := 'REPLACE';
+ ado_reservedwords[546] := 'REPLICATE';
+ ado_reservedwords[547] := 'REPLICATION';
+ ado_reservedwords[548] := 'RESET';
+ ado_reservedwords[549] := 'RESETLOGS';
+ ado_reservedwords[550] := 'RESOURCE';
+ ado_reservedwords[551] := 'RESTORE';
+ ado_reservedwords[552] := 'RESTRICT';
+ ado_reservedwords[553] := 'RESTRICTED';
+ ado_reservedwords[554] := 'RESULT';
+ ado_reservedwords[555] := 'RESUME';
+ ado_reservedwords[556] := 'RETRIEVE';
+ ado_reservedwords[557] := 'RETURN';
+ ado_reservedwords[558] := 'RETURNS';
+ ado_reservedwords[559] := 'REUSE';
+ ado_reservedwords[560] := 'REVOKE';
+ ado_reservedwords[561] := 'RIGHT';
+ ado_reservedwords[562] := 'ROLE';
+ ado_reservedwords[563] := 'ROLES';
+ ado_reservedwords[564] := 'ROLLBACK';
+ ado_reservedwords[565] := 'ROLLUP';
+ ado_reservedwords[566] := 'ROUTINE';
+ ado_reservedwords[567] := 'ROW';
+ ado_reservedwords[568] := 'ROWCOUNT';
+ ado_reservedwords[569] := 'ROWGUIDCOL';
+ ado_reservedwords[570] := 'ROWID';
+ ado_reservedwords[571] := 'ROWIDTOCHAR';
+ ado_reservedwords[572] := 'ROWLABEL';
+ ado_reservedwords[573] := 'ROWNUM';
+ ado_reservedwords[574] := 'ROWS';
+ ado_reservedwords[575] := 'ROWS';
+ ado_reservedwords[576] := 'RPAD';
+ ado_reservedwords[577] := 'RRN';
+ ado_reservedwords[578] := 'RTRIM';
+ ado_reservedwords[579] := 'RULE';
+ ado_reservedwords[580] := 'RUN';
+ ado_reservedwords[581] := 'RUNTIMESTATISTICS';
+ ado_reservedwords[582] := 'SAVE';
+ ado_reservedwords[583] := 'SAVEPOINT';
+ ado_reservedwords[584] := 'SCHEDULE';
+ ado_reservedwords[585] := 'SCHEMA';
+ ado_reservedwords[586] := 'SCN';
+ ado_reservedwords[587] := 'SCOPE';
+ ado_reservedwords[588] := 'SCREEN';
+ ado_reservedwords[589] := 'SCROLL';
+ ado_reservedwords[590] := 'SCROLLDOWN';
+ ado_reservedwords[591] := 'SCROLLUP';
+ ado_reservedwords[592] := 'SEARCH';
+ ado_reservedwords[593] := 'SECOND';
+ ado_reservedwords[594] := 'SECONDS';
+ ado_reservedwords[595] := 'SECQTY';
+ ado_reservedwords[596] := 'SECTION';
+ ado_reservedwords[597] := 'SEGMENT';
+ ado_reservedwords[598] := 'SELECT';
+ ado_reservedwords[599] := 'SEQUENCE';
+ ado_reservedwords[600] := 'SERIALIZABLE';
+ ado_reservedwords[601] := 'SERVICE';
+ ado_reservedwords[602] := 'SESSION';
+ ado_reservedwords[603] := 'SESSION_USER';
+ ado_reservedwords[604] := 'SET';
+ ado_reservedwords[605] := 'SETS';
+ ado_reservedwords[606] := 'SETUSER';
+ ado_reservedwords[607] := 'SETUSER';
+ ado_reservedwords[608] := 'SHARE';
+ ado_reservedwords[609] := 'SHARED';
+ ado_reservedwords[610] := 'SHORT';
+ ado_reservedwords[611] := 'SHUTDOWN';
+ ado_reservedwords[612] := 'SIGN';
+ ado_reservedwords[613] := 'SIMPLE';
+ ado_reservedwords[614] := 'SIN';
+ ado_reservedwords[615] := 'SIZE';
+ ado_reservedwords[616] := 'SLEEP';
+ ado_reservedwords[617] := 'SMALLINT';
+ ado_reservedwords[618] := 'SNAPSHOT';
+ ado_reservedwords[619] := 'SOME';
+ ado_reservedwords[620] := 'SORT';
+ ado_reservedwords[621] := 'SOUNDEX';
+ ado_reservedwords[622] := 'SPACE';
+ ado_reservedwords[623] := 'SPECIFIC';
+ ado_reservedwords[624] := 'SPECIFICTYPE';
+ ado_reservedwords[625] := 'SQL';
+ ado_reservedwords[626] := 'SQLBUF';
+ ado_reservedwords[627] := 'SQLCA';
+ ado_reservedwords[628] := 'SQLCODE';
+ ado_reservedwords[629] := 'SQLERROR';
+ ado_reservedwords[630] := 'SQLEXCEPTION';
+ ado_reservedwords[631] := 'SQLSTATE';
+ ado_reservedwords[632] := 'SQLWARNING';
+ ado_reservedwords[633] := 'SQRT';
+ ado_reservedwords[634] := 'START';
+ ado_reservedwords[635] := 'STATE';
+ ado_reservedwords[636] := 'STATEMENT';
+ ado_reservedwords[637] := 'STATIC';
+ ado_reservedwords[638] := 'STATISTICS';
+ ado_reservedwords[639] := 'STOGROUP';
+ ado_reservedwords[640] := 'STOP';
+ ado_reservedwords[641] := 'STORAGE';
+ ado_reservedwords[642] := 'STORPOOL';
+ ado_reservedwords[643] := 'STRUCTURE';
+ ado_reservedwords[644] := 'SUBMENU';
+ ado_reservedwords[645] := 'SUBPAGES';
+ ado_reservedwords[646] := 'SUBSTR';
+ ado_reservedwords[647] := 'SUBSTRING';
+ ado_reservedwords[648] := 'SUCCESSFUL';
+ ado_reservedwords[649] := 'SUFFIX';
+ ado_reservedwords[650] := 'SUM';
+ ado_reservedwords[651] := 'SUMU';
+ ado_reservedwords[652] := 'SWITCH';
+ ado_reservedwords[653] := 'SYNONYM';
+ ado_reservedwords[654] := 'SYSCAT';
+ ado_reservedwords[655] := 'SYSDATE';
+ ado_reservedwords[656] := 'SYSFUN';
+ ado_reservedwords[657] := 'SYSIBM';
+ ado_reservedwords[658] := 'SYSSTAT';
+ ado_reservedwords[659] := 'SYSTEM';
+ ado_reservedwords[660] := 'SYSTEM_USER';
+ ado_reservedwords[661] := 'SYSTIME';
+ ado_reservedwords[662] := 'SYSTIMESTAMP';
+ ado_reservedwords[663] := 'TABLE';
+ ado_reservedwords[664] := 'TABLEDATA';
+ ado_reservedwords[665] := 'TABLES';
+ ado_reservedwords[666] := 'TABLESPACE';
+ ado_reservedwords[667] := 'TAN';
+ ado_reservedwords[668] := 'TAPE';
+ ado_reservedwords[669] := 'TEMP';
+ ado_reservedwords[670] := 'TEMPORARY';
+ ado_reservedwords[671] := 'TERMINATE';
+ ado_reservedwords[672] := 'TEXTSIZE';
+ ado_reservedwords[673] := 'THAN';
+ ado_reservedwords[674] := 'THEN';
+ ado_reservedwords[675] := 'THREAD';
+ ado_reservedwords[676] := 'TIME';
+ ado_reservedwords[677] := 'TIMEOUT';
+ ado_reservedwords[678] := 'TIMESTAMP';
+ ado_reservedwords[679] := 'TIMEZONE_HOUR';
+ ado_reservedwords[680] := 'TIMEZONE_MINUTE';
+ ado_reservedwords[681] := 'TINYINT';
+ ado_reservedwords[682] := 'TO';
+ ado_reservedwords[683] := 'TOP';
+ ado_reservedwords[684] := 'TPE';
+ ado_reservedwords[685] := 'TRACING';
+ ado_reservedwords[686] := 'TRAILING';
+ ado_reservedwords[687] := 'TRAN';
+ ado_reservedwords[688] := 'TRANSACTION';
+ ado_reservedwords[689] := 'TRANSLATE';
+ ado_reservedwords[690] := 'TRANSLATION';
+ ado_reservedwords[691] := 'TREAT';
+ ado_reservedwords[692] := 'TRIGGER';
+ ado_reservedwords[693] := 'TRIGGERS';
+ ado_reservedwords[694] := 'TRIM';
+ ado_reservedwords[695] := 'TRUE';
+ ado_reservedwords[696] := 'TRUNCATE';
+ ado_reservedwords[697] := 'TSEQUAL';
+ ado_reservedwords[698] := 'TYPE';
+ ado_reservedwords[699] := 'UID';
+ ado_reservedwords[700] := 'UNCOMMITTED';
+ ado_reservedwords[701] := 'UNDER';
+ ado_reservedwords[702] := 'UNION';
+ ado_reservedwords[703] := 'UNIQUE';
+ ado_reservedwords[704] := 'UNKNOWN';
+ ado_reservedwords[705] := 'UNLIMITED';
+ ado_reservedwords[706] := 'UNLOADTABLE';
+ ado_reservedwords[707] := 'UNNEST';
+ ado_reservedwords[708] := 'UNSIGNED';
+ ado_reservedwords[709] := 'UNTIL';
+ ado_reservedwords[710] := 'UP';
+ ado_reservedwords[711] := 'UPDATE';
+ ado_reservedwords[712] := 'UPDATETEXT';
+ ado_reservedwords[713] := 'UPPER';
+ ado_reservedwords[714] := 'USAGE';
+ ado_reservedwords[715] := 'USE';
+ ado_reservedwords[716] := 'USER';
+ ado_reservedwords[717] := 'USING';
+ ado_reservedwords[718] := 'UUID';
+ ado_reservedwords[719] := 'VALIDATE';
+ ado_reservedwords[720] := 'VALIDPROC';
+ ado_reservedwords[721] := 'VALIDROW';
+ ado_reservedwords[722] := 'VALUE';
+ ado_reservedwords[723] := 'VALUES';
+ ado_reservedwords[724] := 'VARBINARY';
+ ado_reservedwords[725] := 'VARCHAR';
+ ado_reservedwords[726] := 'VARIABLE';
+ ado_reservedwords[727] := 'VARIABLES';
+ ado_reservedwords[728] := 'VARYING';
+ ado_reservedwords[729] := 'VCAT';
+ ado_reservedwords[730] := 'VERSION';
+ ado_reservedwords[731] := 'VIEW';
+ ado_reservedwords[732] := 'VOLUMES';
+ ado_reservedwords[733] := 'WAITFOR';
+ ado_reservedwords[734] := 'WEEK';
+ ado_reservedwords[735] := 'WHEN';
+ ado_reservedwords[736] := 'WHENEVER';
+ ado_reservedwords[737] := 'WHERE';
+ ado_reservedwords[738] := 'WHILE';
+ ado_reservedwords[739] := 'WITH';
+ ado_reservedwords[740] := 'WITHOUT';
+ ado_reservedwords[741] := 'WORK';
+ ado_reservedwords[742] := 'WRITE';
+ ado_reservedwords[743] := 'WRITETEXT';
+ ado_reservedwords[744] := 'YEAR';
+ ado_reservedwords[745] := 'YEARS';
+ ado_reservedwords[746] := 'ZONE';
+end;
+
+
+function TDAMSConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(iIdentifier) or MSSQL_IdentifierNeedsQuoting(iIdentifier);
+end;
+
+procedure TDAMSConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ MSSQL_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+end;
+
+{ TDAMSSQLDriver }
+
+function TDAMSSQLDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ Result := MSSQL_DriverType;
+end;
+
+function MSACCESS_GetFileExtensions: IROStrings;
+begin
+ Result := NewROStrings;
+ Result.Add('*.mdb;MSAccess files (*.mdb)');
+ Result.Add('*.*;All files (*.*)');
+end;
+
+initialization
+ ado_InitializeReservedWords;
+finalization
+ ado_reservedwords := nil;
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDABin2DataStreamer.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDABin2DataStreamer.pas
new file mode 100644
index 0000000..15cb2a0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDABin2DataStreamer.pas
@@ -0,0 +1,1999 @@
+unit uDABin2DataStreamer;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up }
+{ platform: Win32 }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+{.$DEFINE BIN2DEBUG_time}
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF}
+ Classes,
+ uDAInterfaces, uDADelta, uROClasses,
+ uDADataStreamer;
+
+type
+ TBIN2AdapterSignature = array[0..7] of ansichar;
+
+const
+ BIN2AdapterSignature: TBIN2AdapterSignature = 'DABIN200';
+type
+
+ TDASmallFieldInfo = record
+ Name: String;
+ Datatype: TDADataType;
+ Size: integer;
+ end;
+
+ TDADataForAppendBin2 = class(TDADataForAppend)
+ public
+ FieldsInfo: array of TDASmallFieldInfo;
+ end;
+
+ TDAElementType = (etDataset, etDelta);
+ { TElementInfo }
+ TDAElementInfo = class
+ ElementType: TDAElementType;
+ Name: string;
+ Offset: integer;
+ end;
+
+
+
+type
+ TDABin2DataStreamer = class(TDADataStreamer)
+ private
+ fInfoIntOffset: integer;
+ fHasReducedDelta: Boolean;
+ procedure ReadElementInfo;
+ procedure WriteElementInfo(ElementInfo: TDAElementInfo);
+ procedure AddElementInfo(ElementType: TDAElementType; ElementName: string; Offset: integer);
+ function GetElementInfo(ElementType: TDAElementType; const Name: string): TDAElementInfo;
+ procedure ReadAndApplySchema(const Destination: IDADataset; ApplySchema: boolean);
+ procedure WriteSchema(const Fields: TDAFieldCollection; const Params: TDAParamCollection; aFieldsIndex: array of integer); overload;
+ procedure WriteField(const AField: TDAField);
+ procedure WriteParam(const AParam: TDAParam);
+ procedure ReadParam(const AParam: TDAParam; const aParamPropertiesCount: integer);
+ procedure ReadField(const AField: TDAField; const aFieldPropertiesCount: integer);
+ protected
+ procedure InternalDoReadDataset(const Destination: IDAEditableDataset; ARecordCount: integer; ARealFields: array of integer;AppendMode: Boolean);virtual;
+ procedure InternalDoWriteDataset(const Source: IDADataset; var k: integer; const Maxrecords: integer; ARealFields: array of integer;aDataIndex: Integer; info: array of TDASmallFieldInfo);virtual;
+ procedure InternalDoWriteDataset_NonDataset(const Source: IDADataset; var k: integer; const Maxrecords: integer; ARealFields: array of integer;aDataIndex: Integer; info: array of TDASmallFieldInfo);virtual;
+ procedure CheckSignature(aSignature: TBIN2AdapterSignature);
+ // To override
+ function DoCreateStream: TStream; override;
+ procedure DoInitialize(Mode: TDAAdapterInitialization); override;
+ procedure DoFinalize; override;
+ function DoWriteDataset(const Source: IDADataset; Options: TDAWriteOptions; MaxRows: integer; ADynFieldNames: array of string): integer; override;
+
+ function DoBeginWriteDataset( const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend; override;
+ function DoWriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aDataIndex: Integer = -1): Integer; override;
+ function DoEndWriteDataset(aDataForAppend: TDADataForAppend): Integer; override;
+
+
+ procedure DoWriteDelta(const Source: IDADelta); override;
+ procedure DoReadDataset(const DatasetName: string; const Destination: IDADataset; ApplySchema: boolean;AppendMode: Boolean); override;
+ procedure DoReadDelta(const DeltaName: string; const Destination: IDADelta); override;
+ public
+ function HasReducedDelta: Boolean; override;
+ function GetTargetDataType: TRODataType; override;
+ published
+ property BufferSize;
+ property SendReducedDelta;
+ end;
+
+
+implementation
+{$IFNDEF MSWINDOWS}
+ {$UNDEF BIN2DEBUG_time}
+{$ENDIF}
+uses
+ SysUtils, Variants, FMTBcd, uROBinaryHelpers, DB,
+ uDAEngine, uDAClasses;
+
+type
+{$IFDEF FPC}
+ PBoolean = ^Boolean;
+{$ENDIF}
+ PUInt64 = ^UInt64;
+
+const
+ field_count = 34;
+ param_count = 11;
+ TAlignmentStrings: array[Low(TAlignment)..High(TAlignment)] of AnsiString =
+ ('taLeftJustify', 'taRightJustify', 'taCenter');
+ TDABlobTypeStrings: array[Low(TDABlobType)..High(TDABlobType)] of AnsiString =
+ ('dabtUnknown', 'dabtBlob', 'dabtMemo', 'dabtOraBlob',
+ 'dabtOraClob', 'dabtGraphic', 'dabtTypedBinary', 'dabtTimestamp');
+ TDADataTypeStrings: array[Low(TDADataType)..High(TDADataType)] of AnsiString =
+ ('datUnknown', 'datString', 'datDateTime', 'datFloat',
+ 'datCurrency', 'datAutoInc', 'datInteger', 'datLargeInt',
+ 'datBoolean', 'datMemo', 'datBlob', 'datWideString',
+ 'datWideMemo', 'datLargeAutoInc', 'datByte', 'datShortInt',
+ 'datWord', 'datSmallInt', 'datCardinal', 'datLargeUInt',
+ 'datGuid', 'datXml', 'datDecimal', 'datSingleFloat');
+ TDAParamTypeStrings:array[Low(TDAParamType)..High(TDAParamType)] of AnsiString =
+ ('daptUnknown', 'daptInput', 'daptOutput', 'daptInputOutput',
+ 'daptResult');
+
+
+function TAlignmentStringsToTAlignment(aValue: AnsiString): TAlignment;
+begin
+ for Result := Low(TAlignment) to High(TAlignment) do
+ if TAlignmentStrings[Result] = aValue then Exit;
+ raise Exception.CreateFmt('Unknown TAlignment value: ''%s''',[aValue]);
+end;
+
+function TDABlobTypeStringsToTDABlobType(aValue: AnsiString): TDABlobType;
+begin
+ for Result := Low(TDABlobType) to High(TDABlobType) do
+ if TDABlobTypeStrings[Result] = aValue then Exit;
+ raise Exception.CreateFmt('Unknown TDABlobType value: ''%s''',[aValue]);
+end;
+
+function TDADataTypeStringsToTDADataType(aValue: AnsiString): TDADataType;
+begin
+ for Result := Low(TDADataType) to High(TDADataType) do
+ if TDADataTypeStrings[Result] = aValue then Exit;
+ raise Exception.CreateFmt('Unknown TDADataType value: ''%s''',[aValue]);
+end;
+
+function TDAParamTypeStringsToTDAParamType(aValue: AnsiString): TDAParamType;
+begin
+ for Result := Low(TDAParamType) to High(TDAParamType) do
+ if TDAParamTypeStrings[Result] = aValue then Exit;
+ raise Exception.CreateFmt('Unknown TDAParamType value: ''%s''',[aValue]);
+end;
+
+procedure SetBitMask(Buffer: PAnsiChar; const Index: Integer; const Value: boolean);
+var
+ i: byte;
+begin
+ i := Index shr 3;
+ if Value then
+ Buffer[I] := AnsiChar(ord(Buffer[I]) or (1 shl (Index and 7)))
+ else
+ Buffer[I] := AnsiChar(ord(Buffer[I]) and not (1 shl (Index and 7)))
+end;
+
+function GetBitMask(Buffer: PAnsiChar; const Index: Integer): boolean;
+begin
+ Result := (ord(Buffer[Index shr 3]) shr (Index and 7)) and 1 = 1;
+end;
+
+procedure ClearBitMask(Buffer: PAnsiChar; BitMaskSize:integer; Value: byte = 0 );
+begin
+ FillChar(Buffer^, BitMaskSize, Value);
+end;
+
+function ReadBooleanFromStream(Stream: TStream): ByteBool;
+begin
+ Stream.Read(Result, SizeOf(ByteBool));
+end;
+
+procedure WriteBooleanToStream(Stream: TStream; const Value: ByteBool);
+begin
+ Stream.Write(Value, SizeOf(ByteBool));
+end;
+
+function ReadWordBoolFromStream(Stream: TStream): WordBool;
+begin
+ Stream.Read(Result, SizeOf(WordBool));
+end;
+
+procedure WriteWordBoolToStream(Stream: TStream; const Value: WordBool);
+begin
+ Stream.Write(Value, SizeOf(WordBool));
+end;
+
+
+function ReadByteFromStream(Stream: TStream): Byte;
+begin
+ Stream.Read(Result, SizeOf(Byte));
+end;
+
+procedure WriteByteToStream(Stream: TStream; const Value: Byte);
+begin
+ Stream.Write(Value, SizeOf(Byte));
+end;
+
+function ReadShortIntFromStream(Stream: TStream): ShortInt;
+begin
+ Stream.Read(Result, SizeOf(ShortInt));
+end;
+
+procedure WriteShortIntToStream(Stream: TStream; const Value: ShortInt);
+begin
+ Stream.Write(Value, SizeOf(ShortInt));
+end;
+
+function ReadWordFromStream(Stream: TStream): Word;
+begin
+ Stream.Read(Result, SizeOf(Word));
+end;
+
+procedure WriteWordToStream(Stream: TStream; const Value: Word);
+begin
+ Stream.Write(Value, SizeOf(Word));
+end;
+
+function ReadGUIDFromStream(Stream: TStream): Ansistring;
+begin
+ SetLength(Result,38);
+ Result[1]:='{';
+ Stream.Read(Result[2], 36 {Length(GuidString)-2});
+ Result[38]:='}'
+end;
+
+procedure WriteGUIDToStream(Stream: TStream; const Value: Ansistring);
+begin
+ if Length(Value) <> 38 then
+ raise Exception.CreateFmt('Invalid GUID: %s',[Value])
+ else
+ Stream.Write(Value[2], 36 {Length(GuidString)-2});
+end;
+
+
+function ReadDecimalFromStream(Stream: TStream): TDecimal;
+begin
+ Stream.Read(Result, Sizeof(Result));
+end;
+
+function ReadBCDFromStream(Stream: TStream): TBCD;
+begin
+ Result := DecimalToBCD(ReadDecimalFromStream(Stream));
+end;
+
+procedure WriteDecimalToStream(Stream: TStream; const Value: TDecimal);
+begin
+ Stream.Write(Value, Sizeof(Value));
+end;
+
+procedure WriteBCDToStream(Stream: TStream; const Value: TBCD);
+begin
+ WriteDecimalToStream(Stream,BCDToDecimal(Value));
+end;
+
+function ReadSingleFromStream(Stream: TStream): Single;
+begin
+ Stream.Read(Result, SizeOf(Single));
+end;
+
+procedure WriteSingleToStream(Stream: TStream; const Value: Single);
+begin
+ Stream.Write(Value, SizeOf(Single));
+end;
+
+function ReadSmallIntFromStream(Stream: TStream): SmallInt;
+begin
+ Stream.Read(Result, SizeOf(SmallInt));
+end;
+
+procedure WriteSmallIntToStream(Stream: TStream; const Value: SmallInt);
+begin
+ Stream.Write(Value, SizeOf(SmallInt));
+end;
+
+function ReadCardinalFromStream(Stream: TStream): Cardinal;
+begin
+ Stream.Read(Result, SizeOf(Cardinal));
+end;
+
+procedure WriteCardinalToStream(Stream: TStream; const Value: Cardinal);
+begin
+ Stream.Write(Value, SizeOf(Cardinal));
+end;
+
+function ReadCurrencyFromStream(Stream: TStream): Currency;
+begin
+ Stream.Read(Result, SizeOf(Currency));
+end;
+
+procedure WriteCurrencyToStream(Stream: TStream; const Value: Currency);
+begin
+ Stream.Write(Value, SizeOf(Currency));
+end;
+
+function ReadDoubleFromStream(Stream: TStream): Double;
+begin
+ Stream.Read(Result, SizeOf(Double));
+end;
+
+procedure WriteDoubleToStream(Stream: TStream; const Value: Double);
+begin
+ Stream.Write(Value, SizeOf(Double));
+end;
+
+function ReadDateTimeFromStream(Stream: TStream): TDateTime;
+begin
+ Stream.Read(Result, SizeOf(TDateTime));
+end;
+
+procedure WriteDateTimeToStream(Stream: TStream; const Value: TDateTime);
+begin
+ Stream.Write(Value, SizeOf(TDateTime));
+end;
+
+
+procedure Writeint64ToStream(Stream: TStream; const Value: int64);
+begin
+ Stream.Write(Value, SizeOf(int64));
+end;
+
+function Readint64FromStream(Stream: TStream): int64;
+begin
+ Stream.Read(Result, SizeOf(int64));
+end;
+
+procedure WriteUint64ToStream(Stream: TStream; const Value: UInt64); overload;
+begin
+ Stream.Write(Value, SizeOf(Uint64));
+end;
+
+procedure WriteUint64ToStream(Stream: TStream; const Value: Variant); overload;
+var
+ i: int64;
+begin
+ i := Value;
+ WriteUint64ToStream(Stream, UInt64(i));
+end;
+
+function ReadUint64FromStream(Stream: TStream): UInt64;
+begin
+ Stream.Read(Result, SizeOf(Uint64));
+end;
+
+procedure WriteIntegerToStream(Stream: TStream; const Value: Integer);
+begin
+ Stream.Write(Value, SizeOf(integer));
+end;
+
+function ReadIntegerFromStream(Stream: TStream): Integer;
+begin
+ Stream.Read(Result, SizeOf(integer));
+end;
+
+function ReadAnsistringFromStream(Stream: TStream): AnsiString;
+var
+ Len: Cardinal;
+begin
+ Len := ReadIntegerFromStream(Stream);
+ SetLength(Result, Len div SizeOf(AnsiChar));
+ Stream.Read(Pointer(Result)^, len);
+end;
+
+procedure WriteAnsistringToStream(Stream: TStream; const AString: AnsiString);
+var
+ Len: Cardinal;
+begin
+ Len := Length(AString);
+ WriteIntegerToStream(Stream, Len);
+ Stream.Write(Pointer(AString)^, len*SizeOf(AnsiChar));
+end;
+
+function ReadVariantasUTF8stringFromStream(Stream: TStream): Variant;
+var
+ Len: Integer;
+ s: AnsiString;
+begin
+ Len := ReadIntegerFromStream(Stream);
+ if Len = -1 then begin
+ Result := Null
+ end else begin
+ SetLength(s, Len div SizeOf(AnsiChar));
+ Stream.Read(Pointer(s)^, len);
+ Result := UTF8ToString(s);
+ end;
+end;
+
+procedure WriteVariantAsUTF8stringToStream(Stream: TStream; const AValue: Variant);
+begin
+ if VarIsNull(aValue) then
+ WriteIntegerToStream(Stream, -1)
+ else
+ WriteAnsistringToStream(Stream,UTF8Encode(VarToStr(aValue)));
+end;
+
+{$IFDEF UNICODE}
+procedure WriteWidestringToStream(Stream: TStream; const AString: Unicodestring); overload;
+var
+ Len: Cardinal;
+begin
+ Len := Length(AString) * sizeOf(WideChar);
+ WriteIntegerToStream(Stream, Len);
+ Stream.Write(Pointer(AString)^, len);
+end;
+{$ENDIF}
+
+procedure WriteWidestringToStream(Stream: TStream; const AString: Widestring); overload;
+var
+ Len: Cardinal;
+begin
+ Len := Length(AString) * sizeOf(WideChar);
+ WriteIntegerToStream(Stream, Len);
+ Stream.Write(Pointer(AString)^, len);
+end;
+
+function ReadWidestringFromStream(Stream: TStream): UnicodeString;
+var
+ Len: Cardinal;
+begin
+ Len := ReadIntegerFromStream(Stream);
+ SetLength(Result, Len div sizeOf(WideChar));
+ Stream.Read(Pointer(Result)^, len);
+end;
+
+procedure BlobToStreamAsStr(Stream: TStream; Value: Variant);
+var
+ p: pointer;
+ lSize: cardinal;
+begin
+ case VarType(Value) of
+ varEmpty: WriteIntegerToStream(Stream, 0);
+ {$IFDEF UNICODE}
+ varUString: WriteWidestringToStream(Stream, VarToStr(Value));
+ {$ELSE}
+ varUString,
+ {$ENDIF}
+ varOleStr: WriteWidestringToStream(Stream, VarToWideStr(Value));
+ varString: WriteAnsistringToStream(Stream, GetVarAnsiString(Value));
+ 8209: begin { 8209 is binary array }
+ lSize := VarArrayHighBound(Value, 1) - VarArrayLowBound(Value, 1) + 1;
+ p := VarArrayLock(Value);
+ try
+ WriteIntegerToStream(Stream, lSize);
+ Stream.Write(p^, lSize);
+ finally
+ VarArrayUnlock(Value);
+ end;
+ end;
+ else
+ raise Exception.CreateFmt('Invalid variant type (%d) for Blob.', [VarType(Value)]);
+ end;
+end;
+
+function WriteVariantToStream(Stream: TStream; Value: Variant; DataType: TDADataType): Boolean;
+begin
+ Result := True;
+
+ case Datatype of
+ datWideString, datWideMemo, datXml: WriteWidestringToStream(Stream, VarToWideStr(Value));
+ datString, datMemo: WriteAnsistringToStream(Stream, GetVarAnsiString(Value));
+ datDateTime: WriteDateTimeToStream(Stream, VarToDateTime(Value));
+ datFloat: WriteDoubleToStream(Stream, Value);
+ datBoolean: WriteBooleanToStream(Stream, Value = True);
+ datCurrency: WriteCurrencyToStream(Stream, Value);
+ datAutoInc, datInteger: WriteIntegerToStream(Stream, Value);
+ datLargeInt, datLargeAutoInc: Writeint64ToStream(Stream, Value);
+ datLargeUInt: WriteUint64ToStream(Stream, Value);
+ datBlob: BlobToStreamAsStr(Stream, Value);
+ datByte: WriteByteToStream(Stream, Value);
+ datShortInt: WriteShortIntToStream(Stream, Value);
+ datWord: WriteWordToStream(Stream, Value);
+ datSmallInt: WriteSmallIntToStream(Stream, Value);
+ datCardinal: WriteCardinalToStream(Stream, Value);
+ datGuid: WriteGuidToStream(Stream, GetVarAnsiString(Value));
+ datSingleFloat: WriteSingleToStream(Stream, Value);
+ datDecimal: WriteDecimalToStream(Stream, VariantToDecimal(Value));
+ else
+ Result := False;
+ end;
+end;
+
+function ReadVariantFromStream(Stream: TStream; DataType: TDADataType): Variant;
+begin
+ case Datatype of
+ datWideString, datWideMemo, datXml: Result := ReadWidestringFromStream(Stream);
+ datString, datMemo, DatBlob: Result := ReadAnsistringFromStream(Stream);
+ datDateTime: Result := ReadDateTimeFromStream(Stream);
+ datFloat: Result := ReadDoubleFromStream(Stream);
+ datCurrency: Result := ReadCurrencyFromStream(Stream);
+ datBoolean: Result := ReadBooleanFromStream(Stream);
+ datAutoInc, datInteger: Result := ReadIntegerFromStream(Stream);
+ datLargeInt, datLargeAutoInc: Result := Readint64FromStream(Stream);
+ datLargeUInt: Result := ReadUint64FromStream(Stream);
+ datByte: Result := ReadByteFromStream(Stream);
+ datShortInt: Result := ReadShortIntFromStream(Stream);
+ datWord: Result := ReadWordFromStream(Stream);
+ datSmallInt: Result := ReadSmallIntFromStream(Stream);
+ datCardinal: Result := ReadCardinalFromStream(Stream);
+ datGuid: Result := ReadGUIDFromStream(Stream);
+ datSingleFloat: Result := ReadSingleFromStream(Stream);
+ datDecimal: Result := DecimalToVariant(ReadDecimalFromStream(Stream));
+ else
+ Result := varNull;
+ end;
+end;
+
+{ TDABin2DataStreamer }
+
+procedure TDABin2DataStreamer.AddElementInfo(ElementType: TDAElementType;
+ ElementName: string; Offset: integer);
+var
+ element: TDAElementInfo;
+begin
+ element := TDAElementInfo.Create;
+ element.ElementType := ElementType;
+ element.Name := ElementName;
+ element.Offset := Offset;
+
+ if ElementType = etDataset then
+ AddingDataset(ElementName, element)
+ else
+ AddingDelta(ElementName, element);
+end;
+
+function TDABin2DataStreamer.DoCreateStream: TStream;
+begin
+ // outdated, for backward capability
+ result := nil;
+end;
+
+procedure TDABin2DataStreamer.DoFinalize;
+var
+ finalpos, i: integer;
+begin
+ if (AdapterInitialization in AdapterWriteModes) then try
+ finalpos := Data.Position;
+
+ // Element count. WIll be read by the DoInitialize method
+ WriteIntegerToStream(Data, DatasetCount + DeltaCount);
+
+ for i := 0 to (DatasetCount - 1) do
+ WriteElementInfo(TDAElementInfo(DatasetInfoObjects[i]));
+
+ for i := 0 to (DeltaCount - 1) do
+ WriteElementInfo(TDAElementInfo(DeltaInfoObjects[i]));
+
+ Data.Position := fInfoIntOffset;
+ WriteIntegerToStream(Data, finalpos);
+ except
+ beep;
+ raise;
+ end;
+end;
+
+procedure TDABin2DataStreamer.DoInitialize(Mode: TDAAdapterInitialization);
+var
+ signature: TBIN2AdapterSignature;
+ currpos, i: integer;
+begin
+ if (Mode in AdapterReadModes) then begin
+ // Checks the signature
+ Data.Read(signature, SizeOf(signature));
+ CheckSignature(signature);
+
+ fInfoIntOffset := ReadIntegerFromStream(Data);
+ currpos := Data.Position;
+ // Reads the information attached at the end of the stream
+ if (Data.Position = fInfoIntOffset) then Exit; // Nothing to read!
+ Data.Position := fInfoIntOffset;
+
+ // Number of elements
+ i := ReadIntegerFromStream(Data);
+ for i := i downto 1 do
+ ReadElementInfo;
+ // Restores its position and continues
+ Data.Position := currpos;
+ end
+ else if (Mode in AdapterWriteModes) then begin
+ // Writes the signature
+ signature := BIN2AdapterSignature;
+ Data.Write(signature, SizeOf(signature));
+
+ // This integer will contain the offset of the stream information (datasetcount, names, etc)
+ // which will be attached at the end of the stream since this is a sequential write
+ fInfoIntOffset := Data.Position;
+ WriteIntegerToStream(Data, 0);
+ end;
+end;
+
+
+procedure TDABin2DataStreamer.DoReadDataset(const DatasetName: string;
+ const Destination: IDADataset; ApplySchema: boolean;AppendMode: Boolean);
+
+var
+ elementinfo: TDAElementInfo;
+ editable: IDAEditableDataset;
+ schemaend, cnt, i, k: integer;
+ fld: TDAField;
+ schemapresent: boolean;
+ readonlyfields: array of boolean;
+ //
+ Realfldcount: integer;
+ info: array of TDASmallFieldInfo;
+ RealFields: array of integer;
+ lErrorMessage: String;
+ lErrorMesCnt: integer;
+ lFldList: TStringList;
+{$IFDEF BIN2DEBUG_time}
+ t1,t2,t3: TDateTime;
+{$ENDIF BIN2DEBUG_time}
+begin
+ if Destination.Active and ApplySchema then raise Exception.Create('Cannot apply a schema if the destination is active');
+
+ elementinfo := GetElementInfo(etDataset, DatasetName);
+ Data.Position := elementinfo.Offset;
+ lErrorMessage := '';
+ lErrorMesCnt := 0;
+
+ editable := Destination as IDAEditableDataset;
+
+ Destination.DisableControls;
+ try
+ editable.DisableEventHandlers;
+ try
+ if ApplySchema then begin
+ // Checks to see if the schema is present
+ schemapresent := ReadBooleanFromStream(Data);
+ schemaend := ReadIntegerFromStream(Data);
+
+ if schemapresent and ApplySchema then begin
+ ReadAndApplySchema(Destination, ApplySchema);
+ end
+ else if (schemaend > 0) then
+ Data.Position := schemaend;
+ Exit;
+ end
+ else begin
+ {$IFDEF BIN2DEBUG_time}
+ t1 := now;
+ {$ENDIF BIN2DEBUG_time}
+ {schemapresent :=} ReadBooleanFromStream(Data);
+ schemaend := ReadIntegerFromStream(Data);
+ if (schemaend > 0) then
+ Data.Position := schemaend;
+
+ // Reads the row count
+ cnt := ReadIntegerFromStream(Data);
+ if (cnt = -1) then Exit; // Only schema is present!
+
+ if not Destination.Active then Destination.Open;
+ with editable do try
+ // Temporarily sets all fields as writable
+ Destination.DisableConstraints;
+ Realfldcount := ReadIntegerFromStream(Data);
+ SetLength(info, Realfldcount);
+ SetLength(RealFields, Realfldcount);
+ //Data.Read(pointer(info)^, Sizeof(TDASmallFieldInfo) * Realfldcount);
+ lFldList:=TStringList.Create;
+ try
+ lFldList.Sorted:=False;
+ lFldList.Duplicates:=dupIgnore;
+ For i:= 0 to Fields.Count-1 do
+ lFldList.AddObject(Fields[i].Name,Pointer(Fields[i].Index));
+ lFldList.Sorted:=True;
+
+ for i := 0 to Realfldcount - 1 do begin
+ info[i].Name := UTF8ToString(ReadAnsistringFromStream(Data));
+ info[i].Datatype := TDADataType(ReadByteFromStream(Data));
+ info[i].Size := ReadIntegerFromStream(Data);
+ k:=lFldList.IndexOf(info[i].Name);
+ if k = -1 then begin
+ inc(lErrorMesCnt);
+ if lErrorMesCnt > 5 then begin
+ lErrorMessage := lErrorMessage + '' + sLineBreak;
+ break;
+ end
+ else begin
+ lErrorMessage := lErrorMessage + Format('The %s field isn''t found.' + sLineBreak,[info[i].Name])
+ end;
+ end
+ else begin
+ RealFields[i]:= Integer(lFldList.Objects[k]);
+ end;
+ end;
+ finally
+ lFldList.Free;
+ end;
+ if (Length(lErrorMessage) > 0) then begin
+ lErrorMessage := 'Format of the data in the stream doesn''t match the destination table format.'+ #13#10 + #13#10 + lErrorMessage;
+ RaiseError(lErrorMessage);
+ end;
+
+ k := 0;
+ SetLength(readonlyfields, Fields.Count);
+ for i := 0 to (Fields.Count - 1) do begin
+ readonlyfields[i] := Fields[i].ReadOnly;
+ Fields[i].ReadOnly := FALSE;
+ if Fields[i].Calculated or Fields[i].Lookup then Continue;
+ //RealFields[k] := i;
+ if (k >= Realfldcount) then begin
+ lErrorMessage := lErrorMessage + 'Fields count mismatch' + sLineBreak
+ end
+ else begin
+ fld:=Fields[RealFields[k]];
+ // if (fld.Name <> Info[k].Name) then lErrorMessage := lErrorMessage + Format('Name mismatch: %s expected but %s found in stream.', [fld.Name, Info[k].Name])+ sLineBreak
+ if (fld.DataType <> Info[k].Datatype) then lErrorMessage := lErrorMessage + Format('Data type mismatch for column ''%s.%s'': %s expected but %s found in stream.', [DatasetName, fld.Name, TDADataTypeStrings[fld.DataType], TDADataTypeStrings[Info[k].Datatype]]) + sLineBreak
+ else if (fld.Size <> Info[k].Size) then lErrorMessage := lErrorMessage + Format('Size mismatch for column ''%s.%s'': %d expected but %d found in stream.', [DatasetName, fld.Name, fld.Size, Info[k].Size]) + sLineBreak;
+ end;
+ inc(k);
+ end;
+ {$IFDEF BIN2DEBUG_time}
+ t2 := now;
+ {$ENDIF BIN2DEBUG_time}
+ try
+ if (k <> Realfldcount) then lErrorMessage := lErrorMessage + Format('Fields count mismatch: %d expected but %d found in the stream', [k, Realfldcount]) + sLineBreak;
+ if (Length(lErrorMessage) > 0) then begin
+ lErrorMessage := 'Format of the data in the stream doesn''t match the destination table format.'+ sLineBreak + sLineBreak + lErrorMessage;
+ RaiseError(lErrorMessage);
+ end;
+ // Inserts the records
+ try
+ // if table is empty then process in standard mode
+ AppendMode := AppendMode and not (editable.EOF and editable.GetBOF);
+ InternalDoReadDataset(editable, cnt, RealFields, AppendMode);
+ except
+ raise;
+ end;
+ finally
+ // Restores the read-only property
+ for i := 0 to (Fields.Count - 1) do
+ Fields[i].ReadOnly := readonlyfields[i];
+ end;
+ {$IFDEF BIN2DEBUG_time}
+ t3 := now;
+ OutputDebugString(PAnsiChar('TDABIN2DataStreamer.DoReadDataset:'+
+ TimeToStr(t2-t1)+' | ' +FloatToStr(t2-t1)+' || '+
+ TimeToStr(t3-t2)+' | ' +FloatToStr(t3-t2)
+ ));
+ {$ENDIF BIN2DEBUG_time}
+ finally
+ Destination.EnableConstraints;
+ end;
+ end;
+ finally
+ editable.EnableEventHandlers;
+ end;
+ finally
+ Destination.EnableControls;
+ end;
+end;
+
+procedure TDABin2DataStreamer.DoReadDelta(const DeltaName: string;
+ const Destination: IDADelta);
+var
+ elementinfo: TDAElementInfo;
+ msg, str: string;
+ recid, i, cnt, x: integer;
+ change: TDADeltaChange;
+ changetype: TDAChangeType;
+ status: TDAChangeStatus;
+ BitMask: AnsiString;
+ BitMaskSize: integer;
+ lProgress: Boolean;
+begin
+ elementinfo := GetElementInfo(etDelta, DeltaName);
+ Data.Position := elementinfo.Offset;
+
+ // Number of changes
+ cnt := ReadIntegerFromStream(Data);
+
+ // Field number, names and types
+ Destination.ClearFieldNames;
+ i := ReadIntegerFromStream(Data);
+ for i := i downto 1 do begin
+ str := UTF8ToString(ReadAnsistringFromStream(Data));
+ Destination.AddFieldName(str, TDADataType(ReadByteFromStream(Data)));
+// Destination.AddFieldName(str);
+// Destination.LoggedFieldTypes[Destination.LoggedFieldCount - 1] := TDADataType(ReadByteFromStream(Data));
+ end;
+
+ // Key fields
+ Destination.ClearKeyFieldNames;
+ i := ReadIntegerFromStream(Data);
+ for i := i downto 1 do begin
+ str := UTF8ToString(ReadAnsistringFromStream(Data));
+ Destination.AddKeyFieldName(str);
+ end;
+
+ if (cnt = 0) then Exit;
+
+ BitMaskSize := (Destination.LoggedFieldCount + 7) div 8;
+ SetLength(BitMask, BitMaskSize);
+
+ // mode of Delta
+ fHasReducedDelta := ReadBooleanFromStream(Data);
+ lProgress := Assigned(OnReadDeltaProgress);
+ // Actual changes
+ cnt := ReadIntegerFromStream(Data);
+ for i := 1 to cnt do begin
+ changetype := TDAChangeType(ReadIntegerFromStream(Data));
+ recid := ReadIntegerFromStream(Data);
+ status := TDAChangeStatus(ReadIntegerFromStream(Data));
+ msg := UTF8ToString(ReadAnsistringFromStream(Data));
+ change := Destination.Add(recid, changetype, status, msg);
+
+ // bitmask has different value that in ReadDeataset/WriteDataset !!!
+ // 1 = field is not null
+ // 0 = field is null
+ Data.Read(pointer(BitMask)^, BitMaskSize);
+ // Old values
+ for x := 0 to (Destination.LoggedFieldCount - 1) do
+ if GetBitMask(PAnsiChar(BitMask),x) then
+ change.OldValues[x] := ReadVariantFromStream(Data, Destination.LoggedFieldTypes[x]);
+
+ Data.Read(pointer(BitMask)^, BitMaskSize);
+ // new values
+ for x := 0 to (Destination.LoggedFieldCount - 1) do
+ if GetBitMask(PAnsiChar(BitMask),x) then
+ change.NewValues[x] := ReadVariantFromStream(Data, Destination.LoggedFieldTypes[x]);
+ if lProgress then OnReadDeltaProgress(Self, Destination, i, cnt);
+ end;
+end;
+
+function TDABin2DataStreamer.DoWriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions; MaxRows: integer; ADynFieldNames: array of string): integer;
+var
+ lDataForAppend: TDADataForAppend;
+begin
+ lDataForAppend := DoBeginWriteDataset(Source, {schema}nil, Options, MaxRows, ADynFieldNames);
+ if woRows in Options then begin
+ DoWriteDatasetData(Source, lDataForAppend);
+ result := DoEndWriteDataset(lDataForAppend);
+ end
+ else begin
+ lDataForAppend.Free;
+ result := -1;
+ end;
+end;
+
+procedure TDABin2DataStreamer.DoWriteDelta(const Source: IDADelta);
+var
+ i, x: integer;
+ pk_array: array of boolean;
+ BitMask_Old,BitMask_new: AnsiString;
+ BitMaskSize: integer;
+ old_val,new_val: variant;
+ l_bitmaskflag: boolean;
+ fLocalSendReducedDelta: Boolean;
+ lProgress: Boolean;
+ lTotal: integer;
+begin
+ // This information will be used later to complete the stream (see DoInitialize)
+ AddElementInfo(etDelta, Source.LogicalName, Data.Position);
+ Source.RemoveUnchangedChanges;
+
+ // Number of changes
+ WriteIntegertoStream(Data, Source.Count);
+
+ // Numnber of fields, field names and their types
+ WriteIntegertoStream(Data, Source.LoggedFieldCount);
+ for i := 0 to (Source.LoggedFieldCount - 1) do begin
+ WriteAnsistringToStream(Data,UTF8Encode(Source.LoggedFieldNames[i]));
+ WriteByteToStream(Data, Ord(Source.LoggedFieldTypes[i]));
+ end;
+
+ // Key fields
+ WriteIntegertoStream(Data, Source.KeyFieldCount);
+ for i := 0 to (Source.KeyFieldCount - 1) do begin
+ WriteAnsistringToStream(Data, UTF8Encode(Source.KeyFieldNames[i]));
+ end;
+
+ if (Source.Count = 0) then Exit;
+
+ // mode of Delta
+ WriteBooleanToStream(Data, SendReducedDelta);
+
+ // Actual changes
+ WriteIntegertoStream(Data, Source.Count);
+
+ BitMaskSize := (Source.LoggedFieldCount + 7) div 8;
+ SetLength(BitMask_old, BitMaskSize);
+ SetLength(BitMask_new, BitMaskSize);
+ fLocalSendReducedDelta := SendReducedDelta and (Source.KeyFieldCount >0);
+ if fLocalSendReducedDelta then begin
+ SetLength(pk_array, Source.LoggedFieldCount);
+ for i := 0 to Source.LoggedFieldCount - 1 do
+ pk_array[i]:=False;
+
+ for i := 0 to Source.KeyFieldCount - 1 do begin
+ x := Source.IndexOfLoggedField(Source.KeyFieldNames[i]);
+ if x <> -1 then pk_array[x]:=True;
+ end;
+ end;
+
+ lProgress := Assigned(OnWriteDeltaProgress);
+ lTotal := Source.Count;
+ for i := 0 to (Source.Count - 1) do begin
+ // Change type, RecID, status and message
+ WriteIntegertoStream(Data, integer(Source.Changes[i].ChangeType));
+ WriteIntegertoStream(Data, Source.Changes[i].RecID);
+ WriteIntegertoStream(Data, integer(Source.Changes[i].Status));
+ WriteAnsistringToStream(Data, UTF8Encode(Source.Changes[i].Message));
+
+ // bitmask has different value that in ReadDeataset/WriteDataset !!!
+ // 1 = field is not null
+ // 0 = field is null
+ ClearBitMask(PAnsiChar(BitMask_old),BitMaskSize,0);
+ ClearBitMask(PAnsiChar(BitMask_New),BitMaskSize,0);
+ if fLocalSendReducedDelta then begin
+ for x := 0 to (Source.LoggedFieldCount - 1) do begin
+ old_val := Null; // fix for "Invalid Variant Type" exception in Win2000
+ new_val := Null; // fix for "Invalid Variant Type" exception in Win2000
+ old_val:=Source.Changes[i].OldValues[x];
+ new_val:=Source.Changes[i].NewValues[x];
+ l_bitmaskflag:=pk_array[x] or not ROVariantsEqual(old_val,new_val);
+ SetBitMask(PAnsiChar(BitMask_Old), x, l_bitmaskflag and not (VarIsNull(old_val) or (VarIsEmpty(old_val))));
+ SetBitMask(PAnsiChar(BitMask_new), x, l_bitmaskflag and not (VarIsNull(new_val) or (VarIsEmpty(new_val))));
+ end;
+ end else begin
+ for x := 0 to (Source.LoggedFieldCount - 1) do begin
+ old_val := Null; // fix for "Invalid Variant Type" exception in Win2000
+ new_val := Null; // fix for "Invalid Variant Type" exception in Win2000
+ old_val:=Source.Changes[i].OldValues[x];
+ new_val:=Source.Changes[i].NewValues[x];
+ SetBitMask(PAnsiChar(BitMask_Old), x, not (VarIsNull(old_val) or (VarIsEmpty(old_val))));
+ SetBitMask(PAnsiChar(BitMask_new), x, not (VarIsNull(new_val) or (VarIsEmpty(new_val))));
+ end;
+ end;
+
+ // old
+ Data.Write(pointer(BitMask_Old)^, BitMaskSize);
+ for x := 0 to (Source.LoggedFieldCount - 1) do
+ if GetBitMask(PAnsiChar(BitMask_Old),x) then
+ WriteVariantToStream(Data,Source.Changes[i].OldValues[x],Source.LoggedFieldTypes[x]);
+
+ // new
+ Data.Write(pointer(BitMask_new)^, BitMaskSize);
+ for x := 0 to (Source.LoggedFieldCount - 1) do
+ if GetBitMask(PAnsiChar(BitMask_new),x) then
+ WriteVariantToStream(Data,Source.Changes[i].NewValues[x],Source.LoggedFieldTypes[x]);
+ if lProgress then OnWriteDeltaProgress(Self, Source, i+1, lTotal);
+ end;
+end;
+
+function TDABin2DataStreamer.GetElementInfo(ElementType: TDAElementType;
+ const Name: string): TDAElementInfo;
+begin
+ result := nil;
+ case ElementType of
+ etDataset: result := TDAElementInfo(DatasetInfoObjects[GetDatasetIndex(Name)]);
+ etDelta: result := TDAElementInfo(DeltaInfoObjects[GetDeltaIndex(Name)]);
+ end;
+end;
+
+function TDABin2DataStreamer.HasReducedDelta: Boolean;
+begin
+ Result:= fHasReducedDelta;
+end;
+
+procedure TDABin2DataStreamer.ReadAndApplySchema(
+ const Destination: IDADataset; ApplySchema: boolean);
+var
+ lField_cnt: integer;
+ lparam_cnt: integer;
+ i: integer;
+ cnt: integer;
+begin
+ Destination.Fields.Clear;
+ cnt := ReadIntegerFromStream(Data);
+ lField_cnt:= ReadIntegerFromStream(Data);
+ for i := 0 to (cnt - 1) do
+ ReadField(Destination.Fields.Add, lField_cnt);
+
+ Destination.Params.Clear;
+ cnt := ReadIntegerFromStream(Data);
+ lparam_cnt:= ReadIntegerFromStream(Data);
+ for i := 0 to (cnt - 1) do
+ ReadParam(Destination.Params.Add, lparam_cnt);
+end;
+
+procedure TDABin2DataStreamer.ReadElementInfo;
+var
+ et: TDAElementType;
+ nme: string;
+ ofs: integer;
+begin
+ et := TDAElementType(ReadIntegerFromStream(Data));
+ nme := UTF8ToString(ReadAnsistringFromStream(Data));
+ ofs := ReadIntegerFromStream(Data);
+ AddElementInfo(et, nme, ofs);
+end;
+
+procedure TDABin2DataStreamer.WriteElementInfo(
+ ElementInfo: TDAElementInfo);
+begin
+ WriteIntegerToStream(Data, integer(ElementInfo.ElementType));
+ WriteAnsistringToStream(Data, UTF8Encode(ElementInfo.Name));
+ WriteIntegerToStream(Data, ElementInfo.Offset);
+end;
+
+procedure TDABin2DataStreamer.WriteSchema(const Fields: TDAFieldCollection; const Params: TDAParamCollection; aFieldsIndex: array of integer);
+var
+ i: integer;
+begin
+ WriteIntegerToStream(Data, Length(aFieldsIndex));
+ WriteIntegerToStream(Data, field_count);
+ for i := 0 to High(aFieldsIndex) do
+ WriteField(Fields[aFieldsIndex[i]]);
+
+ WriteIntegerToStream(Data, Params.Count);
+ WriteIntegerToStream(Data, param_count);
+ for i := 0 to Params.Count - 1 do
+ WriteParam(Params[i]);
+end;
+
+function TDABin2DataStreamer.DoBeginWriteDataset(
+ const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend;
+var
+ max, cntpos, currpos, k, i, Realfldcnt: integer;
+ fld: TDAField;
+ wrtschema: boolean;
+ info: array of TDASmallFieldInfo;
+ RealFields: array of integer;
+ lfields: array of integer;
+ lDataForAppend : TDADataForAppendBin2;
+ lSchemaFields: TDAFieldCollection;
+ lSchemaParams: TDAParamCollection;
+ lLogicalName: String;
+begin
+ lDataForAppend := TDADataForAppendBin2.Create();
+ result := lDataForAppend;
+
+ if Assigned(Schema) then begin
+ lDataForAppend.TableSchema := Schema;
+ if Schema is TDAUnionDataTable then begin
+ fld := Schema.FindField(def_SourceTableFieldName);
+ if not Assigned(fld) then begin
+ fld := Schema.Fields.Add();
+ fld.Name := def_SourceTableFieldName;
+ fld.DataType := datInteger;
+ fld.InPrimaryKey := true;
+ fld.ServerAutoRefresh := true;
+ end;
+ end;
+ lSchemaFields := Schema.Fields;
+ lSchemaParams := Schema.Params;
+ lLogicalName := Schema.Name;
+ end else begin
+ if Assigned(Source) then begin
+ lSchemaFields := Source.Fields;
+ lSchemaParams := Source.Params;
+ lLogicalName := Source.LogicalName;
+ end else begin
+ raise EDAException.Create('Schema or source should be assigned.');
+ end;
+ end;
+
+ if Length(ADynFieldNames) > 0 then begin
+ SetLength(lfields, Length(ADynFieldNames));
+ For i:=0 to High(ADynFieldNames) do begin
+ fld := lSchemaFields.FindField(ADynFieldNames[i]);
+ if fld <> nil then
+ lfields[i]:= fld.Index
+ else
+ lfields[i]:= -1; // TODO: shoudln't this raise an exception "field not found", or the like?
+ end;
+ end else begin
+ SetLength(lfields, lSchemaFields.Count);
+ For i:=0 to lSchemaFields.Count-1 do
+ lfields[i]:=i;
+ end;
+
+ // This information will be used later to complete the stream (see DoInitialize)
+ AddElementInfo(etDataset, lLogicalName, Data.Position);
+
+ // Writes a boolean flag that indicates if the schema is being written
+ wrtschema := (woSchema in Options) or (Length(ADynFieldNames)>0);
+ WriteBooleanToStream(Data, wrtschema);
+ // Write the offset to jump to if the reader wants to skip the schema
+ currpos := Data.Position;
+ WriteIntegerToStream(Data, 0);
+
+ if wrtschema then begin
+ WriteSchema(lSchemaFields, lSchemaParams, lfields);
+
+ // Writes the offset of the schema's end
+ k := Data.Position;
+ Data.Position := currpos;
+ WriteIntegerToStream(Data, k);
+ Data.Position := k;
+ end;
+
+ // Writes the row count
+ if not (woRows in Options) then begin
+ WriteIntegerToStream(Data, -1);
+ Exit;
+ end
+ else begin
+ cntpos := Data.Position;
+ WriteIntegerToStream(Data, 0);
+ max := MaxRows;
+ end;
+
+ // write datatypes+offsets
+ SetLength(info, lSchemaFields.Count);
+ SetLength(RealFields, lSchemaFields.Count);
+ Realfldcnt := 0;
+ for i := 0 to High(lfields) do begin
+ if lSchemaFields[lfields[i]].Calculated or lSchemaFields[lfields[i]].Lookup then Continue;
+ RealFields[Realfldcnt] := lfields[i];
+ info[Realfldcnt].Name := lSchemaFields[lfields[i]].Name;
+ info[Realfldcnt].Datatype := lSchemaFields[lfields[i]].DataType;
+ info[Realfldcnt].Size := lSchemaFields[lfields[i]].Size;
+ inc(Realfldcnt);
+ end;
+ SetLength(info, Realfldcnt);
+ SetLength(RealFields, Realfldcnt);
+
+ WriteIntegerToStream(Data, Realfldcnt);
+ //Data.Write(pointer(info)^, Sizeof(TDASmallFieldInfo) * Realfldcnt);
+ for i := 0 to Realfldcnt - 1 do begin
+ WriteAnsistringToStream(Data, UTF8Encode(info[i].Name));
+ WriteByteToStream(Data, Byte(info[i].DataType));
+ WriteIntegerToStream(Data, info[i].Size);
+ end;
+
+
+ // prepare DataForAppend structure...
+ SetLength(lDataForAppend.RealFields, Realfldcnt);
+ SetLength(lDataForAppend.FieldsInfo, Realfldcnt);
+ for i := Low(RealFields) to High(RealFields) do begin
+ lDataForAppend.RealFields[i] := RealFields[i];
+ lDataForAppend.FieldsInfo[i].Name := info[i].Name;
+ lDataForAppend.FieldsInfo[i].Datatype := info[i].Datatype;
+ lDataForAppend.FieldsInfo[i].Size := info[i].Size;
+ end;
+
+ lDataForAppend.MaxRowCount := max;
+ lDataForAppend.CountOfRecordsPosition := cntpos;
+
+ k := 0;
+
+ lDataForAppend.EndDataPosition := Data.Position;
+ lDataForAppend.RecordCount := k;
+
+ result := lDataForAppend;
+end;
+
+
+function TDABin2DataStreamer.DoWriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aDataIndex: Integer = -1): Integer;
+var
+ max, k, i, Realfldcnt: integer;
+ info: array of TDASmallFieldInfo;
+ RealFields: array of integer;
+ lDataForAppend: TDADataForAppendBin2;
+ lMapToFieldName: String;
+ lColumnMappings: TDAColumnMappingCollection;
+ lColumnMapping: TDAColumnMapping;
+begin
+
+ lDataForAppend := aDataForAppend as TDADataForAppendBin2;
+ Realfldcnt := Length(lDataForAppend.RealFields);
+ Data.Position := lDataForAppend.EndDataPosition;
+ SetLength(info, Realfldcnt);
+ SetLength(RealFields, Realfldcnt);
+ for i := 0 to Realfldcnt - 1 do begin
+ info[i].Name := lDataForAppend.FieldsInfo[i].Name;
+ info[i].Datatype := lDataForAppend.FieldsInfo[i].Datatype;
+ info[i].Size := lDataForAppend.FieldsInfo[i].Size;
+ // these arrays always have the same size
+ RealFields[i] := lDataForAppend.RealFields[i];
+ end;
+ max := lDataForAppend.MaxRowCount;
+ k := lDataForAppend.RecordCount;
+
+ // Mapping fields of Source table to the streamed dataset
+ if Assigned(lDataForAppend.TableSchema) and (lDataForAppend.TableSchema is TDAUnionDataTable) then begin
+ lColumnMappings := TDAUnionSourceTable(TDAUnionDataTable(lDataForAppend.TableSchema).SourceTables.ItemByName(Source.Name)).ColumnMappings;
+ for i := 0 to Realfldcnt - 1 do begin
+ if info[i].Name = def_SourceTableFieldName then begin
+ RealFields[i] := -10;
+ continue;
+ end;
+ lMapToFieldName := info[i].Name;
+ if Assigned(lColumnMappings) then begin
+ lColumnMapping := lColumnMappings.MappingByDatasetField(info[i].Name);
+ if Assigned(lColumnMapping) and (lColumnMapping.TableField <> '') then
+ lMapToFieldName := lColumnMapping.TableField;
+ end;
+ RealFields[i] := Source.FieldByName(lMapToFieldName).Index;
+ end;
+ end;
+
+ with Source do try
+ DisableControls;
+
+ if not Source.Active then Source.Open;
+ try
+ InternalDoWriteDataset_NonDataset(Source,k, max, RealFields, aDataIndex, info)
+ except
+ raise;
+ end;
+
+ lDataForAppend.EndDataPosition := Data.Position;
+ lDataForAppend.RecordCount := k;
+
+ finally
+ EnableControls;
+ result := k;
+ end;
+end;
+
+function TDABin2DataStreamer.DoEndWriteDataset(aDataForAppend: TDADataForAppend): Integer;
+begin
+ result := aDataForAppend.RecordCount;
+ Data.Position := aDataForAppend.CountOfRecordsPosition;
+ WriteIntegerToStream(Data, aDataForAppend.RecordCount);
+ Data.Position := aDataForAppend.EndDataPosition;
+ aDataForAppend.Free();
+end;
+
+function BoolToAnsiStr(B: Boolean): AnsiString;
+begin
+ if b then
+ Result:= 'True'
+ else
+ Result := 'False';
+end;
+
+
+procedure TDABin2DataStreamer.WriteField(const AField: TDAField);
+begin
+ WriteAnsistringToStream(Data, 'Alignment');
+ WriteAnsistringToStream(Data, TAlignmentStrings[AField.Alignment]);
+ WriteAnsistringToStream(Data, 'BlobType');
+ WriteAnsistringToStream(Data, TDABlobTypeStrings[AField.BlobType]);
+ WriteAnsistringToStream(Data, 'BusinessClassID');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.BusinessClassID));
+ WriteAnsistringToStream(Data, 'Calculated');
+ WriteAnsistringToStream(Data, BoolToAnsiStr(AField.Calculated));
+ WriteAnsistringToStream(Data, 'CustomAttributes');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.CustomAttributes.Text));
+ WriteAnsistringToStream(Data, 'DataType');
+ WriteAnsistringToStream(Data, TDADataTypeStrings[AField.DataType]);
+ WriteAnsistringToStream(Data, 'DecimalPrecision');
+ WriteAnsistringToStream(Data, UTF8Encode(IntToStr(AField.DecimalPrecision)));
+ WriteAnsistringToStream(Data, 'DecimalScale');
+ WriteAnsistringToStream(Data, UTF8Encode(IntToStr(AField.DecimalScale)));
+ WriteAnsistringToStream(Data, 'DefaultValue');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.DefaultValue));
+ WriteAnsistringToStream(Data, 'Description');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.Description));
+ WriteAnsistringToStream(Data, 'DictionaryEntry');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.DictionaryEntry));
+ WriteAnsistringToStream(Data, 'DisplayFormat');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.DisplayFormat));
+ WriteAnsistringToStream(Data, 'DisplayLabel');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.DisplayLabel));
+ WriteAnsistringToStream(Data, 'DisplayWidth');
+ WriteAnsistringToStream(Data, UTF8Encode(IntToStr(AField.DisplayWidth)));
+ WriteAnsistringToStream(Data, 'EditFormat');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.EditFormat));
+ WriteAnsistringToStream(Data, 'EditMask');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.EditMask));
+ WriteAnsistringToStream(Data, 'Expression');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.Expression));
+ WriteAnsistringToStream(Data, 'GeneratorName');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.GeneratorName));
+ WriteAnsistringToStream(Data, 'InPrimaryKey');
+ WriteAnsistringToStream(Data, BoolToAnsiStr(AField.InPrimaryKey));
+ WriteAnsistringToStream(Data, 'KeyFields');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.KeyFields));
+ WriteAnsistringToStream(Data, 'LogChanges');
+ WriteAnsistringToStream(Data, BoolToAnsiStr(AField.LogChanges));
+ WriteAnsistringToStream(Data, 'Lookup');
+ WriteAnsistringToStream(Data, BoolToAnsiStr(AField.Lookup));
+ WriteAnsistringToStream(Data, 'LookupCache');
+ WriteAnsistringToStream(Data, BoolToAnsiStr(AField.LookupCache));
+ WriteAnsistringToStream(Data, 'LookupKeyFields');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.LookupKeyFields));
+ WriteAnsistringToStream(Data, 'LookupResultField');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.LookupResultField));
+ WriteAnsistringToStream(Data, 'LookupSource');
+ WriteAnsistringToStream(Data, '');
+ WriteAnsistringToStream(Data, 'Name');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.Name));
+ WriteAnsistringToStream(Data, 'ReadOnly');
+ WriteAnsistringToStream(Data, BoolToAnsiStr(AField.ReadOnly));
+ WriteAnsistringToStream(Data, 'RegExpression');
+ WriteAnsistringToStream(Data, UTF8Encode(AField.RegExpression));
+ WriteAnsistringToStream(Data, 'Required');
+ WriteAnsistringToStream(Data, BoolToAnsiStr(AField.Required));
+ WriteAnsistringToStream(Data, 'ServerAutoRefresh');
+ WriteAnsistringToStream(Data, BoolToAnsiStr(AField.ServerAutoRefresh));
+ WriteAnsistringToStream(Data, 'ServerCalculated');
+ WriteAnsistringToStream(Data, BoolToAnsiStr(AField.ServerCalculated));
+ WriteAnsistringToStream(Data, 'Size');
+ WriteAnsistringToStream(Data, UTF8Encode(IntToStr(AField.Size)));
+ WriteAnsistringToStream(Data, 'Visible');
+ WriteAnsistringToStream(Data, BoolToAnsiStr(AField.Visible));
+end;
+
+procedure TDABin2DataStreamer.WriteParam(const AParam: TDAParam);
+begin
+ WriteAnsistringToStream(Data, 'AsString');
+ WriteAnsistringToStream(Data, UTF8Encode(AParam.AsString));
+ WriteAnsistringToStream(Data, 'BlobType');
+ WriteAnsistringToStream(Data, TDABlobTypeStrings[AParam.BlobType]);
+ WriteAnsistringToStream(Data, 'DataType');
+ WriteAnsistringToStream(Data, TDADataTypeStrings[AParam.DataType]);
+ WriteAnsistringToStream(Data, 'DecimalPrecision');
+ WriteAnsistringToStream(Data, UTF8Encode(IntToStr(AParam.DecimalPrecision)));
+ WriteAnsistringToStream(Data, 'DecimalScale');
+ WriteAnsistringToStream(Data, UTF8Encode(IntToStr(AParam.DecimalScale)));
+ WriteAnsistringToStream(Data, 'Description');
+ WriteAnsistringToStream(Data, UTF8Encode(AParam.Description));
+ WriteAnsistringToStream(Data, 'GeneratorName');
+ WriteAnsistringToStream(Data, UTF8Encode(AParam.GeneratorName));
+ WriteAnsistringToStream(Data, 'Name');
+ WriteAnsistringToStream(Data, UTF8Encode(AParam.Name));
+ WriteAnsistringToStream(Data, 'ParamType');
+ WriteAnsistringToStream(Data, TDAParamTypeStrings[AParam.ParamType]);
+ WriteAnsistringToStream(Data, 'Size');
+ WriteAnsistringToStream(Data, UTF8Encode(IntToStr(AParam.Size)));
+ WriteAnsistringToStream(Data, 'Value');
+ WriteVariantAsUTF8stringToStream(Data, AParam.Value);
+end;
+
+procedure TDABin2DataStreamer.ReadParam(const AParam: TDAParam; const aParamPropertiesCount: integer);
+var
+ i: integer;
+ sName: AnsiString;
+ sAnsiValue: AnsiString;
+ sValue: String;
+begin
+ For i := 0 to aParamPropertiesCount-1 do begin
+ sName := ReadAnsistringFromStream(Data);
+ if sName <> 'Value' then begin
+ sAnsiValue :=ReadAnsistringFromStream(Data);
+ sValue :=UTF8ToString(sAnsiValue);
+ end;
+ if sName = 'AsString' then
+ else if sName = 'BlobType' then AParam.BlobType := TDABlobTypeStringsToTDABlobType(sAnsiValue)
+ else if sName = 'DataType' then AParam.DataType := TDADataTypeStringsToTDADataType(sAnsiValue)
+ else if sName = 'DecimalPrecision' then AParam.DecimalPrecision := StrToInt(sValue)
+ else if sName = 'DecimalScale' then AParam.DecimalScale := StrToInt(sValue)
+ else if sName = 'Description' then AParam.Description := sValue
+ else if sName = 'GeneratorName' then AParam.GeneratorName := sValue
+ else if sName = 'Name' then AParam.Name := sValue
+ else if sName = 'ParamType' then AParam.ParamType := TDAParamTypeStringsToTDAParamType(sAnsiValue)
+ else if sName = 'Size' then AParam.Size := StrToInt(sValue)
+ else if sName = 'Value' then AParam.Value := ReadVariantasUTF8stringFromStream(Data)
+ else ;
+ end;
+end;
+
+procedure TDABin2DataStreamer.ReadField(const AField: TDAField;
+ const aFieldPropertiesCount: integer);
+var
+ i: integer;
+ sName, sAnsiValue: AnsiString;
+ sValue: string;
+begin
+ For i := 0 to aFieldPropertiesCount-1 do begin
+ sName := ReadAnsistringFromStream(Data);
+ sAnsiValue :=ReadAnsistringFromStream(Data);
+ sValue :=UTF8ToString(sAnsiValue);
+ if sName = 'Alignment' then AField.Alignment := TAlignmentStringsToTAlignment(sAnsiValue)
+ else if sName = 'BlobType' then AField.BlobType := TDABlobTypeStringsToTDABlobType(sAnsiValue)
+ else if sName = 'BusinessClassID' then AField.BusinessClassID := sValue
+ else if sName = 'Calculated' then AField.Calculated := StrToBool(sValue)
+ else if sName = 'CustomAttributes' then AField.CustomAttributes.Text := sValue
+ else if sName = 'DataType' then AField.DataType := TDADataTypeStringsToTDADataType(sAnsiValue)
+ else if sName = 'DecimalPrecision' then AField.DecimalPrecision := StrToInt(sValue)
+ else if sName = 'DecimalScale' then AField.DecimalScale := StrToInt(sValue)
+ else if sName = 'DefaultValue' then AField.DefaultValue := sValue
+ else if sName = 'Description' then AField.Description := sValue
+ else if sName = 'DictionaryEntry' then AField.DictionaryEntry := sValue
+ else if sName = 'DisplayFormat' then AField.DisplayFormat := sValue
+ else if sName = 'DisplayLabel' then AField.DisplayLabel := sValue
+ else if sName = 'DisplayWidth' then AField.DisplayWidth := StrToInt(sValue)
+ else if sName = 'EditFormat' then AField.EditFormat := sValue
+ else if sName = 'EditMask' then AField.EditMask := sValue
+ else if sName = 'Expression' then AField.Expression := sValue
+ else if sName = 'GeneratorName' then AField.GeneratorName := sValue
+ else if sName = 'InPrimaryKey' then AField.InPrimaryKey := StrToBool(sValue)
+ else if sName = 'KeyFields' then AField.KeyFields := sValue
+ else if sName = 'LogChanges' then AField.LogChanges := StrToBool(sValue)
+ else if sName = 'Lookup' then AField.Lookup := StrToBool(sValue)
+ else if sName = 'LookupCache' then AField.LookupCache := StrToBool(sValue)
+ else if sName = 'LookupKeyFields' then AField.LookupKeyFields := sValue
+ else if sName = 'LookupResultField' then AField.LookupResultField := sValue
+ else if sName = 'LookupSource' then // AField.LookupSource:=nil;
+ else if sName = 'Name' then AField.Name := sValue
+ else if sName = 'ReadOnly' then AField.ReadOnly := StrToBool(sValue)
+ else if sName = 'RegExpression' then AField.RegExpression := sValue
+ else if sName = 'Required' then AField.Required := StrToBool(sValue)
+ else if sName = 'ServerAutoRefresh' then AField.ServerAutoRefresh := StrToBool(sValue)
+ else if sName = 'ServerCalculated' then AField.ServerCalculated := StrToBool(sValue)
+ else if sName = 'Size' then AField.Size := StrToInt(sValue)
+ else if sName = 'Visible' then AField.Visible := StrToBool(sValue)
+ else ;
+ end;
+end;
+
+procedure TDABin2DataStreamer.InternalDoReadDataset(const Destination: IDAEditableDataset; ARecordCount: integer;ARealFields: array of integer;AppendMode: Boolean);
+var
+ memdataset: IDAMemDatasetBatchAdding;
+type
+ PMemDatasetrecord_Native = ^TMemDatasetrecord_Native;
+ TMemDatasetrecord_Native = packed record
+ Ident: byte;
+ Data: PAnsichar;
+ end;
+
+ procedure BitmaskToNativeBuf(Bitmask, buf: PAnsiChar; aFields: array of integer);
+ var
+ i: integer;
+ begin
+ for i:=Low(aFields) to High(aFields) do
+ SetBitMask(buf, aFields[i], GetBitMask(Bitmask,i));
+ end;
+
+var
+ lPK: string; //for append mode
+ lPKValues: array of variant; //for append mode
+ lOnePK:Boolean; //for append mode
+
+ function Dataset_Locate(): boolean;
+ begin
+ if lOnePK then
+ Result:= Destination.Locate(lPK,lPKValues[0],[])
+ else
+ Result:= Destination.Locate(lPK,lPKValues,[]);
+ end;
+
+var
+ FRecordsList: TList;
+ buf1: pointer;
+ s: Ansistring;
+ Buf: PAnsiChar;
+ val: Variant;
+ memdataset_BitMaskSize: integer;
+ BindedFields: array of integer;
+ flds: TDAFieldArray; // flds in stream
+ BitMask: Ansistring;
+ streamer_BitMaskSize: integer;
+ i: integer;
+ Realfldcount: integer;
+{$IFDEF BIN2DEBUG_time}
+ t1,t2,t3: TDateTime;
+{$ENDIF BIN2DEBUG_time}
+ lProgress: Boolean;
+ lTotal: integer;
+ lCurrent: integer;
+ lFldValues: array of Variant; // flds values for append mode
+ lPKFlds: TDAFieldArray; // PK flds (Append mode)
+begin
+ if Destination.QueryInterface(IDAMemDatasetBatchAdding, memdataset) <> s_ok then memdataset := nil;
+ Realfldcount := Length(ARealFields);
+ setLength(flds, Realfldcount);
+ For i:= 0 to Realfldcount-1 do
+ flds[i] := Destination.Fields[ARealFields[i]];
+
+ streamer_BitMaskSize := (Realfldcount + 7) div 8;
+ SetLength(BitMask, streamer_BitMaskSize);
+ // bitmask has different value that in ReadDelta/WriteDelta !!!
+ // 0 = field is not null
+ // 1 = field is null
+
+ lProgress := Assigned(OnReadDatasetProgress);
+ lTotal := ARecordCount;
+ lCurrent := 0;
+
+ if (memdataset = nil) or Assigned(OnReadFieldValue) then begin
+ // standard mode
+ lPK := Dataset_GetPK(flds, lPKFlds);
+ lOnePK := Length(lPKFlds) = 1;
+ AppendMode := AppendMode and (Length(lPKFlds)>0);
+ if AppendMode then begin
+ SetLength(lFldValues, Length(flds));
+ SetLength(lPKValues, Length(lPKFlds));
+ end;
+ while (ARecordCount > 0) do try
+ // read bitmask
+ Data.Read(pointer(BitMask)^, streamer_BitMaskSize);
+ Destination.Append;
+
+ // initial filing dataset
+ for i := 0 to Realfldcount - 1 do begin
+ if GetBitMask(PAnsiChar(BitMask), i) then
+ //
+ else begin
+ case flds[i].Datatype of
+ datWideString, datWideMemo, datXml: flds[i].AsWideString := ReadWidestringFromStream(Data);
+ datString, datMemo, DatBlob: flds[i].AsAnsiString := ReadAnsistringFromStream(Data);
+ datDateTime: flds[i].AsDateTime := ReadDateTimeFromStream(Data);
+ datFloat: flds[i].AsFloat := ReadDoubleFromStream(Data);
+ datCurrency: flds[i].AsCurrency := ReadCurrencyFromStream(Data);
+ datBoolean: flds[i].AsBoolean := ReadBooleanFromStream(Data);
+ datAutoInc, datInteger: flds[i].AsInteger := ReadIntegerFromStream(Data);
+ datLargeInt, datLargeAutoInc: flds[i].AsLargeInt := Readint64FromStream(Data);
+ datLargeUInt: flds[i].AsLargeUInt := ReadUint64FromStream(Data);
+ datByte: flds[i].AsByte := ReadByteFromStream(Data);
+ datShortInt: flds[i].AsShortInt := ReadShortIntFromStream(Data);
+ datWord: flds[i].AsWord := ReadWordFromStream(Data);
+ datSmallInt: flds[i].AsSmallInt := ReadSmallIntFromStream(Data);
+ datCardinal: flds[i].AsCardinal := ReadCardinalFromStream(Data);
+ datGuid: flds[i].AsAnsiString := ReadGuidFromStream(Data);
+ datSingleFloat: flds[i].AsSingle := ReadSingleFromStream(Data);
+ datDecimal: flds[i].AsDecimal := ReadBCDFromStream(Data);
+ end;
+ end;
+ if Assigned(OnReadFieldValue) then begin
+ val := flds[i].Value;
+ OnReadFieldValue(flds[i], val);
+ flds[i].Value := val;
+ end;
+ end;
+
+ if AppendMode then begin
+ // store values and avoid firing OnReadFieldValue event
+ for I := 0 to Length(Flds) - 1 do
+ lFldValues[i]:= Flds[i].Value;
+ // store PK values for locate
+ for I := 0 to Length(lPKFlds) - 1 do
+ lPKValues[i]:= lPKFlds[i].Value;
+
+ Destination.Cancel;
+ if Dataset_Locate then
+ Destination.Edit
+ else
+ Destination.Append;
+ // assign new values
+ for I := 0 to Length(Flds) - 1 do
+ Flds[i].Value := lFldValues[i];
+ end;
+ try
+ Destination.Post;
+ except
+ // Introduced to restore the dsBrowse state of the datatable
+ // in case of errors
+ Destination.Cancel;
+ raise;
+ end;
+ if lProgress then begin
+ inc(lCurrent);
+ OnReadDatasetProgress(Self, Destination, lCurrent, lTotal);
+ end;
+ finally
+ Dec(ARecordCount);
+ end;
+ end
+ else begin
+ // superfast mode
+ {$IFDEF BIN2DEBUG_time}
+ t1:=now;
+ {$ENDIF BIN2DEBUG_time}
+ SetLength(BindedFields, Realfldcount);
+ For i:= 0 to Realfldcount - 1 do
+ BindedFields[i]:= memdataset.GetFieldNo(Destination.Fields[ARealFields[i]].BindedField);
+
+ FRecordsList := TList.Create;
+ try
+ memdataset_BitMaskSize := (Realfldcount + 1 {RECID} + 7) div 8;
+ SetLength(BitMask, memdataset_BitMaskSize);
+
+ while (ARecordCount > 0) do try
+ Buf := memdataset.AllocRecordBuffer;
+ try
+ Data.Read(pointer(BitMask)^, streamer_BitMaskSize);
+ BitmaskToNativeBuf(pointer(BitMask), Pointer(PMemDatasetrecord_Native(buf)^.Data), BindedFields);
+ //Data.Read(buf^, BitMaskSize);
+ for i := 0 to Realfldcount - 1 do begin
+ if GetBitMask(PAnsiChar(BitMask), i) then
+ //
+ else begin
+ buf1 := memdataset.GetFieldNativeBuffer(Buf, flds[i].BindedField);
+ case flds[i].DataType of
+ datWideString: memdataset.SetWideString(buf1,flds[i].BindedField,ReadWidestringFromStream(Data));//PWideString(buf1)^ := ReadWidestringFromStream(Data);
+ datString: memdataset.SetAnsiString(buf1,flds[i].BindedField,ReadAnsistringFromStream(Data));//PAnsiString(buf1)^ := ReadAnsistringFromStream(Data);
+ datDateTime: PDateTime(buf1)^ := TimeStampToMSecs(DateTimeToTimeStamp(ReadDateTimeFromStream(Data)));
+ datFloat: PDouble(buf1)^ := ReadDoubleFromStream(Data);
+ datCurrency: PCurrency(buf1)^ := ReadCurrencyFromStream(Data);
+ datBoolean: PBoolean(buf1)^ := ReadBooleanFromStream(Data);
+ datLargeInt, datLargeAutoInc: PInt64(buf1)^ := Readint64FromStream(Data);
+ datLargeUInt: PUInt64(buf1)^ := ReadUint64FromStream(Data);
+ datAutoInc, datInteger: PInteger(buf1)^ := ReadIntegerFromStream(Data);
+ datCardinal: PCardinal(buf1)^ := ReadCardinalFromStream(Data);
+ datWord: PWord(buf1)^ := ReadWordFromStream(Data);
+ datShortInt: PSmallInt(buf1)^ := ReadShortIntFromStream(Data);
+ datSmallInt: PSmallInt(buf1)^ := ReadSmallIntFromStream(Data);
+ datByte: PSmallInt(buf1)^ := ReadByteFromStream(Data);
+ datSingleFloat: PDouble(buf1)^ := ReadSingleFromStream(Data);
+ datDecimal: PBCD(buf1)^ := ReadBCDFromStream(Data);
+ datGuid: begin
+ s := ReadGUIDFromStream(Data);
+ Move(pointer(s)^, pointer(buf1)^, 38 {Length(GuidString)});
+ end;
+ datWideMemo, datMemo, DatBlob, datXml: begin
+ s := ReadAnsistringFromStream(Data);
+ PPointer(buf1)^ := memdataset.MakeBlobFromString(s);
+ end;
+ end;
+ end;
+ end;
+ FRecordsList.Add(Buf);
+ except
+ memdataset.FreeRecordBuffer(buf);
+ For i:=0 to FRecordsList.Count-1 do begin
+ buf:=FRecordsList[i];
+ memdataset.FreeRecordBuffer(Buf);
+ end;
+ raise;
+ end;
+ if lProgress then begin
+ inc(lCurrent);
+ OnReadDatasetProgress(Self, Destination, lCurrent, lTotal);
+ end;
+ finally
+ Dec(ARecordCount);
+ end;
+ {$IFDEF BIN2DEBUG_time}
+ t2:=now;
+ {$ENDIF BIN2DEBUG_time}
+ memdataset.AddRecordsfromList(FRecordsList,AppendMode);
+ {$IFDEF BIN2DEBUG_time}
+ t3:=now;
+ OutputDebugString(PAnsiChar('TDABIN2DataStreamer.InternalDoReadDataset: SF Mode '+TimeToStr(t2-t1)+' | ' +FloatToStr(t2-t1) + ' ||| Adding '+TimeToStr(t3-t2)+' | ' +FloatToStr(t3-t2)));
+ {$ENDIF BIN2DEBUG_time}
+ finally
+ FRecordsList.Free;
+ end;
+ end;
+end;
+
+procedure TDABin2DataStreamer.InternalDoWriteDataset(
+ const Source: IDADataset; var k: integer;const Maxrecords: integer;
+ ARealFields: array of integer;aDataIndex: Integer;info: array of TDASmallFieldInfo);
+var
+ currpos: integer;
+ ev1, ev2,ev3: boolean;
+ BitMask: Ansistring;
+ BitMaskSize: integer;
+ bitmaskpos : integer;
+ NeedWriteBitMask: Boolean;
+ i : integer;
+ Realfldcnt: integer;
+ flds: array of TDAField;
+ val: Variant;
+{$IFDEF BIN2DEBUG_time}
+ t1,t2: TDateTime;
+{$ENDIF BIN2DEBUG_time}
+ lProgress: Boolean;
+begin
+ Realfldcnt:= Length(ARealFields);
+ BitMaskSize := (Realfldcnt + 7) div 8;
+ SetLength(BitMask, BitMaskSize);
+ SetLength(flds,Realfldcnt);
+ for i := 0 to Realfldcnt-1 do begin
+ if ARealFields[i] = -10 then
+ flds[i]:=nil
+ else
+ flds[i]:=Source.Fields[ARealFields[i]];
+ end;
+
+
+ lProgress := Assigned(onWriteDatasetProgress);
+
+ // bitmask has different value that in ReadDelta/WriteDelta !!!
+ // 0 = field is not null
+ // 1 = field is null
+ ev1 := Assigned(OnBeforeFieldValueSerialization);
+ ev2 := Assigned(OnWriteFieldValue);
+ ev3 := Assigned(OnWriteFieldValueEx);
+ if ev1 or ev2 or ev3 then begin
+ // with events
+ while (k <> Maxrecords) and not Source.EOF do begin
+ ClearBitMask(PAnsiChar(BitMask),BitMaskSize); // all is not Null
+ bitmaskpos := Data.Position;
+ Data.Write(pointer(BitMask)^, BitMaskSize);
+ NeedWriteBitMask := False;
+ for i := 0 to (Realfldcnt - 1) do begin
+ //ARealFields[i] = -10 then this is @SourceTable field
+ if ARealFields[i] = -10 then begin
+ //We shouldn't fire events since this is special internal field
+ val := aDataIndex;
+ end else begin
+ val := Source.FieldValues[ARealFields[i]];
+ if ev1 then OnBeforeFieldValueSerialization(flds[i], val);
+ if ev2 then OnWriteFieldValue(flds[i], val);
+ if ev3 then OnWriteFieldValueEx(Source, flds[i], val);
+ end;
+
+ if VarIsNull(Val) or VarIsEmpty(Val) then begin
+ NeedWriteBitMask := True;
+ SetBitMask(PAnsiChar(BitMask), i, True);
+ end else begin
+ if not WriteVariantToStream(Data, val, Info[i].Datatype) then begin
+ NeedWriteBitMask := True;
+ SetBitMask(PAnsiChar(BitMask), i, True);
+ end;
+ end;
+ if NeedWriteBitMask then begin
+ currpos := Data.Position;
+ Data.Position := bitmaskpos;
+ Data.Write(pointer(BitMask)^, BitMaskSize);
+ Data.Position := currpos;
+ end;
+ end;
+ // Inc(result);
+ Inc(k);
+ if lProgress then OnWriteDatasetProgress(Self, Source, k, Maxrecords);
+ Source.Next;
+ if Source.EOF then Break;
+ end;
+ end
+ else begin
+ // Writes the actual records
+ // without events
+ {$IFDEF BIN2DEBUG_time}
+ t1:=now;
+ {$ENDIF BIN2DEBUG_time}
+ while (k <> Maxrecords) and not Source.EOF do begin
+ ClearBitMask(PAnsiChar(BitMask),BitMaskSize); // all is not Null
+
+ for i := 0 to (Realfldcnt - 1) do
+ //ARealFields[i] = -10 then this is @SourceTable field
+ if ((ARealFields[i] <> -10) and (flds[i].IsNull)) then
+ SetBitMask(PAnsiChar(BitMask), i, True);
+ Data.Write(pointer(BitMask)^, BitMaskSize);
+
+ for i := 0 to (Realfldcnt - 1) do begin
+
+ //ARealFields[i] = -10 then this is @SourceTable field
+ if ARealFields[i] = -10 then begin
+ WriteIntegerToStream(Data, aDataIndex);
+ end else begin
+ if GetBitMask(PAnsiChar(BitMask), i) then begin
+ end else begin
+ case Info[i].Datatype of
+ datWideString, datWideMemo, datXml: WriteWidestringToStream(Data, flds[i].AsWideString);
+ datString, datMemo, datBlob: WriteAnsistringToStream(Data, flds[i].AsAnsiString);
+ datDateTime: WriteDateTimeToStream(Data, flds[i].AsDateTime);
+ datFloat: WriteDoubleToStream(Data, flds[i].AsFloat);
+ datBoolean: WriteBooleanToStream(Data, flds[i].AsBoolean);
+ datCurrency: WriteCurrencyToStream(Data, flds[i].AsCurrency);
+ datAutoInc, datInteger: WriteIntegerToStream(Data, flds[i].AsInteger);
+ datLargeInt, datLargeAutoInc: Writeint64ToStream(Data, flds[i].AsLargeInt);
+ datLargeUInt: WriteUint64ToStream(Data, flds[i].AsLargeUInt);
+ datByte: WriteByteToStream(Data, flds[i].AsByte);
+ datShortInt: WriteShortIntToStream(Data, flds[i].AsShortInt);
+ datWord: WriteWordToStream(Data, flds[i].AsWord);
+ datSmallInt: WriteSmallIntToStream(Data, flds[i].AsSmallInt);
+ datCardinal: WriteCardinalToStream(Data, flds[i].AsCardinal);
+ datGuid: WriteGUIDToStream(Data, flds[i].AsAnsiString);
+ datSingleFloat: WriteSingleToStream(Data, flds[i].AsSingle);
+ datDecimal: WriteBCDToStream(Data, flds[i].AsDecimal);
+ end;
+ end;
+ end;
+ end;
+
+ // Inc(result);
+ Inc(k);
+ if lProgress then OnWriteDatasetProgress(Self, Source, k, Maxrecords);
+ Source.Next;
+ if Source.EOF then Break;
+ end;
+ {$IFDEF BIN2DEBUG_time}
+ t2:=now;
+ OutputDebugString(PAnsiChar('TDABIN2DataStreamer.InternalDoWriteDataset:'+TimeToStr(t2-t1)+' | ' +FloatToStr(t2-t1)));
+ {$ENDIF BIN2DEBUG_time}
+ end;
+end;
+
+function TDABin2DataStreamer.GetTargetDataType: TRODataType;
+begin
+ Result := rtBinary;
+end;
+
+procedure TDABin2DataStreamer.CheckSignature(aSignature: TBIN2AdapterSignature);
+begin
+ if (asignature <> BIN2AdapterSignature) then raise Exception.Create('Incompatible binary2 adapter stream');
+end;
+
+procedure TDABin2DataStreamer.InternalDoWriteDataset_NonDataset(
+ const Source: IDADataset; var k: integer; const Maxrecords: integer;
+ ARealFields: array of integer; aDataIndex: Integer;
+ info: array of TDASmallFieldInfo);
+
+type
+ TfldInfo = packed record
+ isNull: Boolean;
+ Data: pointer;
+ DataSize: Cardinal;
+ DataType: TFieldType;
+ end;
+
+var
+ currpos: integer;
+ ev1, ev2, ev3: boolean;
+ BitMask: Ansistring;
+ BitMaskSize: integer;
+ bitmaskpos : integer;
+ NeedWriteBitMask: Boolean;
+ i : integer;
+ Realfldcnt: integer;
+ flds: array of TDAField;
+ val: Variant;
+{$IFDEF BIN2DEBUG_time}
+ t1,t2: TDateTime;
+{$ENDIF BIN2DEBUG_time}
+ NativeDataset: IDASQLCommandNativeObject;
+ fldInfo: array of TfldInfo;
+ s: Ansistring;
+ lbcd: TBCD;
+ lCanFreeNativeData: Boolean;
+ lProgress: boolean;
+begin
+ if (Source.QueryInterface(IDASQLCommandNativeObject, NativeDataset) <> 0)
+ {$IFDEF Drivers_CompatibilityMode}or NativeDataset.IsTDatasetCompatible{$ENDIF} then begin
+ // dataset-compatible mode
+ InternalDoWriteDataset(Source, k, Maxrecords, ARealFields, aDataIndex, info);
+ exit;
+ end;
+ Realfldcnt:= Length(ARealFields);
+ BitMaskSize := (Realfldcnt + 7) div 8;
+ SetLength(BitMask, BitMaskSize);
+
+ lProgress := Assigned(onWriteDatasetProgress);
+ // bitmask has different value that in ReadDelta/WriteDelta !!!
+ // 0 = field is not null
+ // 1 = field is null
+ ev1 := Assigned(OnBeforeFieldValueSerialization);
+ ev2 := Assigned(OnWriteFieldValue);
+ ev3 := Assigned(OnWriteFieldValueEx);
+ if ev1 or ev2 or ev3 then begin
+ // with events
+ SetLength(flds,Realfldcnt);
+ for i := 0 to Realfldcnt-1 do begin
+ if ARealFields[i] = -10 then
+ flds[i]:=nil
+ else
+ flds[i]:=Source.Fields[ARealFields[i]];
+ end;
+ while (k <> Maxrecords) and not Source.EOF do begin
+ ClearBitMask(PAnsiChar(BitMask),BitMaskSize); // all is not Null
+ bitmaskpos := Data.Position;
+ Data.Write(pointer(BitMask)^, BitMaskSize);
+ NeedWriteBitMask := False;
+ for i := 0 to (Realfldcnt - 1) do begin
+ //ARealFields[i] = -10 then this is @SourceTable field
+ if ARealFields[i] = -10 then begin
+ //We shouldn't fire events since this is special internal field
+ val := aDataIndex;
+ end else begin
+ val := Source.FieldValues[ARealFields[i]];
+ if ev1 then OnBeforeFieldValueSerialization(flds[i], val);
+ if ev2 then OnWriteFieldValue(flds[i], val);
+ if ev3 then OnWriteFieldValueEx(Source,flds[i], val);
+ end;
+
+ if VarIsNull(Val) or VarIsEmpty(Val) then begin
+ NeedWriteBitMask := True;
+ SetBitMask(PAnsiChar(BitMask), i, True);
+ end else begin
+ if not WriteVariantToStream(Data, val, Info[i].Datatype) then begin
+ NeedWriteBitMask := True;
+ SetBitMask(PAnsiChar(BitMask), i, True);
+ end;
+ end;
+ if NeedWriteBitMask then begin
+ currpos := Data.Position;
+ Data.Position := bitmaskpos;
+ Data.Write(pointer(BitMask)^, BitMaskSize);
+ Data.Position := currpos;
+ end;
+ end;
+ // Inc(result);
+ Inc(k);
+ if lProgress then OnWriteDatasetProgress(Self, Source, k, Maxrecords);
+ Source.Next;
+ if Source.EOF then Break;
+ end;
+ end
+ else begin
+ // Writes the actual records
+ // without events
+ SetLength(fldInfo,Realfldcnt);
+ for i := 0 to (Realfldcnt - 1) do begin
+ if (ARealFields[i] = -10) then
+ fldInfo[i].DataType:= ftInteger
+ else
+ fldInfo[i].DataType:= NativeDataset.NativeFields[i].DataType;
+ end;
+ lCanFreeNativeData := NativeDataset.CanFreeNativeFieldData;
+ {$IFDEF BIN2DEBUG_time}
+ t1:=now;
+ {$ENDIF BIN2DEBUG_time}
+ while (k <> Maxrecords) and not Source.EOF do begin
+ ClearBitMask(PAnsiChar(BitMask),BitMaskSize); // all is not Null
+
+
+ for i := 0 to (Realfldcnt - 1) do begin
+ if (ARealFields[i] = -10) then begin
+ //ARealFields[i] = -10 then this is @SourceTable field
+ fldInfo[i].isNull := False;
+ GetMem(fldInfo[i].Data, SizeOf(Integer));
+ PInteger(fldInfo[i].Data)^ := aDataIndex;
+ fldInfo[i].DataSize:=4;
+ end
+ else begin
+ fldInfo[i].isNull:= not NativeDataset.GetNativeFieldData(ARealFields[i],fldInfo[i].Data, fldInfo[i].DataSize);
+ end;
+ if fldInfo[i].isNull then
+ SetBitMask(PAnsiChar(BitMask), i, True);
+ end;
+ Data.Write(pointer(BitMask)^, BitMaskSize);
+ for i := 0 to (Realfldcnt - 1) do begin
+ if not fldInfo[i].isNull then begin
+ try
+ case Info[i].Datatype of
+ datWideString, datWideMemo, datXml: begin
+ WriteIntegerToStream(Data, fldInfo[i].DataSize);
+ Data.Write(fldInfo[i].Data^, fldInfo[i].DataSize);
+ end;
+ datString, datMemo, datBlob: begin
+ if fldInfo[i].DataType in [
+ {$IFDEF DA_WideMemoSupport}ftWideMemo,{$ENDIF}
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF}
+ ftWideString] then begin
+ s:= WideStringToAnsiString(PWideChar(fldInfo[i].Data));
+ WriteIntegerToStream(Data, Length(s));
+ Data.Write(Pointer(s)^, Length(s));
+ end
+ else begin
+ WriteIntegerToStream(Data, fldInfo[i].DataSize);
+ Data.Write(fldInfo[i].Data^, fldInfo[i].DataSize);
+ end;
+ end;
+ datDecimal: begin
+ case fldInfo[i].DataType of
+ ftFMTBCD: WriteBCDToStream(Data, PBCD(fldinfo[i].Data)^);
+ ftBCD: begin
+ CurrToBcd(PCurrency(fldinfo[i].Data)^, lbcd);
+ WriteBCDToStream(Data, lbcd);
+ end;
+ end;
+ end;
+ datGuid: begin
+ if fldinfo[i].DataSize <> 39 then begin
+ SetString(s, PAnsiChar(fldinfo[i].Data),38);
+ raise Exception.CreateFmt('Invalid GUID: %s',[s])
+ end
+ else
+ Data.Write((PAnsiChar(fldinfo[i].Data)+1)^,36);
+ end;
+ datBoolean: WriteBooleanToStream(Data, PWordBool(fldinfo[i].Data)^);
+ else
+ Data.Write((fldinfo[i].Data)^, fldinfo[i].DataSize);
+ end;
+ finally
+ if lCanFreeNativeData then FreeMem(fldinfo[i].Data);
+ end;
+ end;
+ end;
+ // Inc(result);
+ Inc(k);
+ if lProgress then OnWriteDatasetProgress(Self, Source, k, Maxrecords);
+ Source.Next;
+ if Source.EOF then Break;
+ end;
+ {$IFDEF BIN2DEBUG_time}
+ t2:=now;
+ OutputDebugString(PAnsiChar('TDABIN2DataStreamer.InternalDoWriteDataset:'+TimeToStr(t2-t1)+' | ' +FloatToStr(t2-t1)));
+ {$ENDIF BIN2DEBUG_time}
+ end;
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDABinAdapter.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDABinAdapter.pas
new file mode 100644
index 0000000..68de6c9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDABinAdapter.pas
@@ -0,0 +1,1352 @@
+unit uDABinAdapter;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF}
+ Classes,
+ uROClasses,
+ uDADataTable, uDAInterfaces, uDADataStreamer, uDADelta, FMTBcd;
+
+type
+ TBINAdapterSignature = array[0..7] of ansichar;
+
+const
+ BINAdapterSignature: TBINAdapterSignature = 'DABIN100';
+
+type
+ TDAElementType = (etDataset, etDelta);
+
+ { TElementInfo }
+ TDAElementInfo = class
+ ElementType: TDAElementType;
+ Name: string;
+ Offset: integer;
+ end;
+
+ { TDABinDataStreamer }
+ TDABinDataStreamer = class(TDADataStreamer)
+ private
+ fReader: TReader;
+ fWriter: TWriter;
+
+ fInfoIntOffset: integer;
+ fIsCompatibleV4: boolean;
+
+ procedure AddElementInfo(ElementType: TDAElementType; ElementName: string; Offset: integer);
+ procedure WriteElementInfo(ElementInfo: TDAElementInfo);
+ procedure ReadElementInfo;
+ function GetElementInfo(ElementType: TDAElementType; const Name: string): TDAElementInfo;
+
+ procedure ReadAndApplySchema(const Destination: IDADataset; ApplySchema: boolean);
+ procedure WriteSchema(const Fields: TDAFieldCollection; const Params: TDAParamCollection; aFieldsIndex: array of integer); overload;
+ function ReadOffset: integer;
+ procedure WriteOffset(Offset: integer);
+
+ protected
+ // Overriden
+ function DoCreateStream: TStream; override;
+ procedure DoInitialize(Mode: TDAAdapterInitialization); override;
+ procedure DoFinalize; override;
+ function DoWriteDataset(const Source: IDADataset; Options: TDAWriteOptions; MaxRows: integer;ADynFieldNames: array of string): integer; override;
+ procedure DoWriteDelta(const Source: IDADelta); override;
+ procedure DoReadDataset(const DatasetName: string; const Destination: IDADataset; ApplySchema: boolean;AppendMode: Boolean); override;
+ procedure DoReadDelta(const DeltaName: string; const Destination: IDADelta); override;
+ procedure SetBufferSize(const Value: cardinal); override;
+
+ function DoBeginWriteDataset( const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend; override;
+
+ function DoWriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aDataIndex: Integer = -1): Integer; override;
+ function DoEndWriteDataset(aDataForAppend: TDADataForAppend): Integer; override;
+
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ function GetTargetDataType: TRODataType; override;
+ published
+ property BufferSize;
+ property IsCompatibleV4: boolean read fIsCompatibleV4 write fIsCompatibleV4 default True;
+ end;
+
+ TDABINAdapter = class(TDABinDataStreamer) end deprecated;
+
+implementation
+
+uses Math, SysUtils, Variants, uROBinaryHelpers, uDaClasses, uDAEngine {$IFDEF DELPHI6}, RTLConsts{$ENDIF};
+
+
+{$IFDEF FPC}
+type
+ THackBinaryObjectWriter = class(TBinaryObjectWriter)
+ end;
+
+ THackBinaryObjectReader = class(TBinaryObjectReader)
+ end;
+{$ENDIF}
+
+procedure Writer_FlushBuffer(AWriter: TWriter);
+begin
+ {$IFNDEF FPC}
+ AWriter.FlushBuffer;
+ {$ELSE}
+ THackBinaryObjectWriter(AWriter.Driver).FlushBuffer;
+ {$ENDIF}
+end;
+
+function GetWriterPosition(AWriter: TWriter):Longint;
+begin
+ {$IFNDEF FPC}
+ Result := AWriter.Position
+ {$ELSE}
+ Result := THackBinaryObjectWriter(AWriter.Driver).FStream.Position;
+ {$ENDIF}
+end;
+
+Procedure SetWriterPosition(AWriter: TWriter; APosition:Longint);
+begin
+ {$IFNDEF FPC}
+ AWriter.Position:=APosition;
+ {$ELSE}
+ Writer_FlushBuffer(AWriter);
+ THackBinaryObjectWriter(AWriter.Driver).FStream.Position:=APosition;
+ {$ENDIF}
+end;
+
+{$IFDEF FPC}
+procedure Writer_WriteValue(AWriter: TWriter; aValue: TValueType);
+begin
+ THackBinaryObjectWriter(AWriter.Driver).WriteValue(aValue);
+end;
+{$ENDIF}
+
+procedure Writer_WriteVariant(AWriter: TWriter; AValue: Variant);
+begin
+ {$IFNDEF FPC}
+ AWriter.WriteVariant(AValue);
+ {$ELSE}
+ if VarIsArray(aValue) then raise EWriteError.Create('Stream write error');
+ case VarType(aValue) and varTypeMask of
+ varEmpty: Writer_WriteValue(AWriter,vaNil);
+ varNull: Writer_WriteValue(AWriter,vaNull);
+ varUString,
+ varOleStr: aWriter.WriteWideString(aValue);
+ varString: aWriter.WriteString(aValue);
+ varByte, varShortInt, varWord, varSmallInt,
+ varInteger,varLongWord, varInt64: aWriter.WriteInteger(aValue);
+ varSingle: aWriter.WriteSingle(aValue);
+ varDouble: aWriter.WriteFloat(aValue);
+ varCurrency: aWriter.WriteCurrency(aValue);
+ varDate: aWriter.WriteDate(aValue);
+ varBoolean: aWriter.WriteBoolean(aValue);
+ else
+ aWriter.WriteString(aValue)
+ end;
+ {$ENDIF}
+end;
+
+function GetReaderPosition(AReader: TReader):Longint;
+begin
+ {$IFNDEF FPC}
+ Result := AReader.Position
+ {$ELSE}
+ Result := THackBinaryObjectReader(AReader.Driver).FStream.Position;
+ {$ENDIF}
+end;
+
+Procedure SetReaderPosition(AReader: TReader; APosition:Longint);
+begin
+ {$IFNDEF FPC}
+ AReader.Position:=APosition;
+ {$ELSE}
+ THackBinaryObjectReader(AReader.Driver).FStream.Position:=APosition;
+ {$ENDIF}
+end;
+
+
+{$IFDEF DELPHI6}
+
+function D6_Reader_ReadVariant(AReader: TReader): Variant;
+
+ function ReadCustomVariant: Variant;
+ var
+ OuterStream, InnerStream: TMemoryStream;
+ OuterReader: TReader;
+ StreamSize: Integer;
+ CustomType: TCustomVariantType;
+ CustomTypeClassName: string;
+ VarStreamer: IVarStreamable;
+ begin
+ with AReader do begin
+ CheckValue(vaBinary);
+ OuterStream := TMemoryStream.Create;
+ InnerStream := TMemoryStream.Create;
+ try
+ Read(StreamSize, SizeOf(StreamSize));
+ OuterStream.Size := StreamSize;
+ Read(OuterStream.Memory^, StreamSize);
+
+ OuterReader := TReader.Create(OuterStream, 1024);
+ try
+ CustomTypeClassName := OuterReader.ReadString;
+ OuterReader.Read(StreamSize, SizeOf(StreamSize));
+ InnerStream.Size := StreamSize;
+ OuterReader.Read(InnerStream.Memory^, StreamSize);
+
+ if not FindCustomVariantType(CustomTypeClassName, CustomType) or
+ not Supports(TObject(CustomType), IVarStreamable, VarStreamer) then
+ raise EReadError.CreateRes(@SReadError);
+ TVarData(Result).VType := CustomType.VarType;
+ VarStreamer.StreamIn(TVarData(Result), InnerStream);
+ finally
+ OuterReader.Free;
+ end;
+ finally
+ InnerStream.Free;
+ OuterStream.Free;
+ end;
+ end;
+ end;
+
+begin
+ with AReader do begin
+ VarClear(Result);
+ case NextValue of
+ vaNil, vaNull: if ReadValue <> vaNil then
+ Result := NULL;
+ // Delphi 6 has a bug vaInt8: Result := Byte(ReadInteger);
+ vaInt8: Result := Shortint(ReadInteger);
+ vaInt16: Result := Smallint(ReadInteger);
+ vaInt32: Result := ReadInteger;
+ vaExtended: Result := ReadFloat;
+ vaSingle: Result := ReadSingle;
+ vaCurrency: Result := ReadCurrency;
+ vaDate: Result := ReadDate;
+ vaString, vaLString: Result := ReadString;
+ vaWString,
+ vaUTF8String: Result := ReadWideString;
+ vaFalse, vaTrue: Result := ReadValue = vaTrue;
+ vaBinary: Result := ReadCustomVariant;
+ vaInt64: Result := ReadInt64;
+ else
+ raise EReadError.CreateRes(@SReadError);
+ end;
+ end;
+end;
+{$ENDIF}
+
+function Reader_ReadVariant(AReader: TReader): Variant;
+begin
+ {$IFDEF FPC}
+ Result := Null;
+ Raise Exception.Create('Not supported');
+ {$ELSE}
+ {$IFDEF DELPHI6}
+ Result:= D6_Reader_ReadVariant(AReader);
+ {$ELSE}
+ Result:= AReader.ReadVariant;
+ {$ENDIF}
+ {$ENDIF}
+end;
+
+{ TDABinDataStreamer }
+
+procedure TDABinDataStreamer.Assign(Source: TPersistent);
+var
+ lSource: TDABinDataStreamer;
+begin
+ inherited;
+ if Source is TDABinDataStreamer then begin
+ lSource := TDABinDataStreamer(Source);
+ IsCompatibleV4 := lSource.IsCompatibleV4;
+ end;
+end;
+
+constructor TDABinDataStreamer.Create(aOwner: TComponent);
+begin
+ inherited;
+ fIsCompatibleV4:=True;
+end;
+
+destructor TDABinDataStreamer.Destroy;
+begin
+ // Just in case the user did not call Finalize
+
+ {if Assigned(fReader) then fReader.Free;
+ if Assigned(fWriter) then fWriter.Free;}
+
+ inherited;
+end;
+
+procedure TDABinDataStreamer.SetBufferSize(const Value: cardinal);
+begin
+ if (Value > 0) then inherited SetBufferSize(Value);
+end;
+
+procedure TDABinDataStreamer.DoFinalize;
+var
+ finalpos, i: integer;
+begin
+ try
+ if (AdapterInitialization in AdapterWriteModes) then try
+ finalpos := GetWriterPosition(FWriter);
+
+ // Element count. WIll be read by the DoInitialize method
+ fWriter.WriteInteger(DatasetCount + DeltaCount);
+
+ for i := 0 to (DatasetCount - 1) do
+ WriteElementInfo(TDAElementInfo(DatasetInfoObjects[i]));
+
+ for i := 0 to (DeltaCount - 1) do
+ WriteElementInfo(TDAElementInfo(DeltaInfoObjects[i]));
+
+ Writer_FlushBuffer(FWriter);
+
+ SetWriterPosition(FWriter, fInfoIntOffset);
+ WriteOffset(finalpos);
+ except
+ beep;
+ raise;
+ end;
+ finally
+ // Somehow I need to check because the FreeAndNIL fails on these objects even if the are set to NIL...
+ if AdapterInitialization in AdapterReadModes then
+ FreeAndNIL(fReader)
+
+ else if AdapterInitialization in AdapterWriteModes then
+ FreeAndNIL(fWriter);
+ end;
+end;
+
+procedure TDABinDataStreamer.WriteElementInfo(ElementInfo: TDAElementInfo);
+begin
+ fWriter.WriteInteger(integer(ElementInfo.ElementType));
+ fWriter.WriteString(ElementInfo.Name);
+ fWriter.WriteInteger(ElementInfo.Offset);
+end;
+
+procedure TDABinDataStreamer.ReadElementInfo;
+var
+ et: TDAElementType;
+ nme: string;
+ ofs: integer;
+begin
+ et := TDAElementType(fReader.ReadInteger);
+ nme := fReader.ReadString;
+ ofs := fReader.ReadInteger;
+ AddElementInfo(et, nme, ofs);
+end;
+
+procedure TDABinDataStreamer.DoInitialize(Mode: TDAAdapterInitialization);
+var
+ signature: TBINAdapterSignature;
+ currpos, i: integer;
+begin
+ if (Mode in AdapterReadModes) then begin
+ fReader := TReader.Create(Data, BufferSize);
+ freader.Root := Owner;
+
+ // Checks the signature
+ signature := BINAdapterSignature;
+ fReader.Read(signature, SizeOf(signature));
+ if (signature <> BINAdapterSignature) then raise Exception.Create('Incompatible binary adapter stream');
+
+ fInfoIntOffset := ReadOffset;
+ currpos := GetReaderPosition(FReader);
+
+ // Reads the information attached at the end of the stream
+ if (GetReaderPosition(FReader) = fInfoIntOffset) then Exit; // Nothing to read!
+ SetReaderPosition(FReader, fInfoIntOffset);
+
+ // Number of elements
+ i := fReader.ReadInteger;
+
+ for i := i downto 1 do
+ ReadElementInfo;
+
+ // Restores its position and continues
+ SetReaderPosition(FReader, currpos);
+ end
+ else if (Mode in AdapterWriteModes) then begin
+ fWriter := TWriter.Create(Data, BufferSize);
+
+ // Writes the signature
+ signature := BINAdapterSignature;
+ fWriter.Write(signature, SizeOf(signature));
+
+ // This integer will contain the offset of the stream information (datasetcount, names, etc)
+ // which will be attached at the end of the stream since this is a sequential write
+ fInfoIntOffset := GetWriterPosition(FWriter);
+ WriteOffset(0);
+ end;
+end;
+
+function TDABinDataStreamer.GetElementInfo(ElementType: TDAElementType; const Name: string): TDAElementInfo;
+begin
+ result := nil;
+ case ElementType of
+ etDataset: result := TDAElementInfo(DatasetInfoObjects[GetDatasetIndex(Name)]);
+ etDelta: result := TDAElementInfo(DeltaInfoObjects[GetDeltaIndex(Name)]);
+ end;
+end;
+
+procedure TDABinDataStreamer.AddElementInfo(ElementType: TDAElementType; ElementName: string; Offset: integer);
+var
+ element: TDAElementInfo;
+begin
+ element := TDAElementInfo.Create;
+ element.ElementType := ElementType;
+ element.Name := ElementName;
+ element.Offset := Offset;
+
+ if ElementType = etDataset then
+ AddingDataset(ElementName, element)
+ else
+ AddingDelta(ElementName, element);
+end;
+
+function TDABinDataStreamer.DoCreateStream: TStream;
+begin
+ result := TMemoryStream.Create;
+end;
+
+procedure TDABinDataStreamer.ReadAndApplySchema(const Destination: IDADataset; ApplySchema: boolean);
+var
+ cnt: integer;
+ fields: TDAFieldCollection;
+ params: TDAParamCollection;
+begin
+ fields := Destination.Fields;
+ params := Destination.Params;
+
+ cnt := fReader.ReadInteger;
+
+ if (cnt > 0) then begin
+ fReader.ReadValue; // Must do for ReadCollection. Do not remove.
+ fReader.ReadCollection(fields);
+ end
+ else fields.Clear;
+
+ cnt := fReader.ReadInteger;
+ if (cnt > 0) then begin
+ fReader.ReadValue; // Must do for ReadCollection. Do not remove.
+ fReader.ReadCollection(params);
+ end
+ else params.Clear;
+end;
+
+procedure TDABinDataStreamer.WriteSchema(const Fields: TDAFieldCollection; const Params: TDAParamCollection; aFieldsIndex: array of integer);
+var
+ lcoll: TDAFieldCollection;
+ i: integer;
+begin
+ fWriter.WriteInteger(Length(aFieldsIndex));
+ if Length(aFieldsIndex) > 0 then begin
+ lcoll:=TDAFieldCollection.Create(nil);
+ lcoll.IsCompatibleV4:= self.IsCompatibleV4;
+ try
+ For i:=0 to High(aFieldsIndex) do
+ lcoll.Add.AssignField(Fields[aFieldsIndex[i]]);
+ fWriter.WriteCollection(lColl);
+ finally
+ lcoll.Free;
+ end;
+ end;
+
+ fWriter.WriteInteger(Params.Count);
+ if Params.Count > 0 then fWriter.WriteCollection(Params);
+end;
+
+procedure TDABinDataStreamer.WriteOffset(Offset: integer);
+begin
+ fWriter.Write(Offset, SizeOf(integer));
+end;
+
+function TDABinDataStreamer.ReadOffset: integer;
+begin
+ fReader.Read(result, SizeOf(integer));
+end;
+
+procedure VariantToWriterAsStr(aDataType : TDADataType; const aSourceVariant : Variant; aWriter : TWriter);
+var
+ p: pointer;
+ s: Ansistring;
+ lVt: TValueType;
+ lSize: cardinal;
+begin
+ case aDataType of
+ datBlob: begin
+ case VarType(aSourceVariant) of
+ varEmpty: begin
+ lSize := 0;
+ aWriter.Write(lSize, SizeOf(lSize));
+ end;
+ varUString,
+ varOleStr:
+ awriter.WriteWideString(aSourceVariant);
+ varString, VarNull:
+ begin
+ s := GetVarAnsiString(aSourceVariant);
+ lSize := Length(s);
+ if lSize < 256 then begin
+ lVt := vaString;
+ aWriter.Write(lVt, sizeof(lVt));
+ aWriter.Write(lSize, 1);
+ awriter.Write(pointer(s)^, lSize);
+ end
+ else begin
+ lVt := vaLString;
+ aWriter.Write(lVt, sizeof(lVt));
+ aWriter.Write(lSize, sizeof(lSize));
+ awriter.Write(pointer(s)^, lSize);
+ end;
+ end;
+ 8209:begin { 8209 is binary array }
+ lSize := VarArrayHighBound(aSourceVariant, 1)-VarArrayLowBound(aSourceVariant, 1)+1;
+ p := VarArrayLock(aSourceVariant);
+ try
+ if lSize < 256 then begin
+ lVt := vaString;
+ aWriter.Write(lVt, sizeof(lVt));
+ aWriter.Write(lSize, 1);
+ awriter.Write(p^, lSize);
+ end
+ else begin
+ lVt := vaLString;
+ aWriter.Write(lVt, sizeof(lVt));
+ aWriter.Write(lSize, sizeof(lSize));
+ awriter.Write(p^, lSize);
+ end;
+ finally
+ VarArrayUnlock(aSourceVariant);
+ end;
+ end;
+ else begin
+ RaiseError('Invalid variant type (%d) for Blob.',[VarType(aSourceVariant)]);
+ end;
+ end;
+ end;
+ else begin
+ Writer_WriteVariant(aWriter, aSourceVariant);
+ end;
+ end;
+end;
+
+procedure WriteGuid(aWriter: TWriter; const aVal: String);
+var
+ g: TGuid;
+begin
+ g := StringToGUID(aVal);
+ aWriter.Write(g, Sizeof(g));
+end;
+
+procedure WriteDecimal(aWriter: TWriter; const aVal: Variant);
+var
+ dec: TDecimal;
+begin
+ dec:= VariantToDecimal(aVal);
+ aWriter.Write(dec, Sizeof(Dec));
+end;
+
+
+function TDABinDataStreamer.DoWriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions;
+ MaxRows: integer;
+ ADynFieldNames: array of string): integer;
+var
+ lDataForAppend: TDADataForAppend;
+begin
+ lDataForAppend := DoBeginWriteDataset(Source, {schema}nil, Options, MaxRows, ADynFieldNames);
+ if woRows in Options then begin
+ DoWriteDatasetData(Source, lDataForAppend);
+ result := DoEndWriteDataset(lDataForAppend);
+ end
+ else begin
+ lDataForAppend.Free;
+ result := -1;
+ end;
+end;
+
+function CreateByteArray(const s: string): Variant;
+begin
+ result := VarArrayCreate([0, Length(s)-1], varByte);
+ if Length(s) > 0 then
+ Move(s[1], VarArrayLock(Result)^, Length(S));
+ VarArrayUnlock(Result);
+end;
+
+function ReadGuid(aReader: TReader): TGuid;
+begin
+ aReader.Read(Result, Sizeof(Result));
+end;
+
+function ReadDecimal(aReader: TReader): Variant;
+var
+ dec: TDecimal;
+begin
+ aReader.Read(dec, Sizeof(Dec));
+ Result := DecimalToVariant(dec);
+end;
+
+procedure TDABinDataStreamer.DoReadDataset(const DatasetName: string; const Destination: IDADataset; ApplySchema: boolean;AppendMode: Boolean);
+type
+ PMemDatasetrecord_Native = ^TMemDatasetrecord_Native;
+ TMemDatasetrecord_Native = packed record
+ Ident: byte;
+ Data: PAnsichar;
+ end;
+var
+ lPK: string; //for append mode
+ lPKValues: array of variant; //for append mode
+ lOnePK:Boolean; //for append mode
+
+ function Dataset_Locate(): boolean;
+ begin
+ if lOnePK then
+ Result:= Destination.Locate(lPK,lPKValues[0],[])
+ else
+ Result:= Destination.Locate(lPK,lPKValues,[]);
+ end;
+
+var
+ elementinfo: TDAElementInfo;
+ editable: IDAEditableDataset;
+ schemaend, cnt, i: integer;
+ flds: TDAFieldArray; // flds in stream
+ dt: TDADataType;
+ schemapresent: boolean;
+ val: Variant;
+ readonlyfields: array of boolean;
+ //bigVal: Int64;
+ memdataset: IDAMemDatasetBatchAdding;
+ buf, buf1: PAnsiChar;
+ ws: widestring;
+ s: Ansistring;
+ bcd: TDecimal;
+ FRecordsList: TList;
+ lProgress: Boolean;
+ lTotal: integer;
+ lCurrent: integer;
+ // appendmode
+ lFldValues: array of Variant; // flds values for append mode
+ lPKFlds: TDAFieldArray; // PK flds (Append mode)
+begin
+ if Destination.Active and ApplySchema then raise Exception.Create('Cannot apply a schema if the destination is active');
+
+ elementinfo := GetElementInfo(etDataset, DatasetName);
+ SetReaderPosition(FReader, elementinfo.Offset);
+
+ editable := Destination as IDAEditableDataset;
+
+ Destination.DisableControls;
+ try
+ editable.DisableEventHandlers;
+ try
+ fReader.BeginReferences;
+ try
+ // Checks to see if the schema is present
+ schemapresent := fReader.ReadBoolean;
+ schemaend := ReadOffset;
+
+ if schemapresent and ApplySchema then begin
+ ReadAndApplySchema(Destination, ApplySchema);
+ end
+ else if (schemaend > 0) then
+ SetReaderPosition(FReader, schemaend);
+ fReader.FixupReferences;
+
+ // Reads the row count
+ //cnt := fReader.ReadInteger;
+ {$IFDEF FPC}
+ cnt := 0;
+ {$ENDIF FPC}
+ fReader.Read(cnt, SizeOf(cnt));
+ if (cnt = -1) then Exit; // Only schema is present!
+
+ lProgress := Assigned(OnReadDatasetProgress);
+ lTotal := cnt;
+ lCurrent := 0;
+ // TODO: this is a nasty bug. If we read the schema AND the stream, also contains data
+ // it goes in recursion here... Temporary fix is you just do one of the two for now
+ if ApplySchema then Exit;
+
+ if not Destination.Active then Destination.Open;
+
+ with editable do try
+ // if table is empty then process in standard mode
+ AppendMode := AppendMode and not (EOF and GetBOF);
+ // Temporarily sets all fields as writable
+ Destination.DisableConstraints;
+ SetLength(readonlyfields, Fields.Count);
+ SetLength(flds, Fields.Count);
+ for i := 0 to (Fields.Count - 1) do begin
+ flds[i] := Fields[i];
+ readonlyfields[i] := flds[i].ReadOnly;
+ flds[i].ReadOnly := FALSE;
+ end;
+
+ {$IFDEF STORERECID}
+ Destination.CurrentRecIdValue := max(1,Destination.CurrentRecIdValue);
+ {$ENDIF}
+
+ if Destination.QueryInterface(IDAMemDatasetBatchAdding, memdataset) <> s_ok then memdataset := nil;
+
+ if (memdataset = nil) or Assigned(OnReadFieldValue) then begin
+ // standard mode
+ lPK := Dataset_GetPK(flds, lPKFlds);
+ lOnePK := Length(lPKFlds) = 1;
+ AppendMode := AppendMode and (Length(lPKFlds)>0);
+ if AppendMode then begin
+ SetLength(lFldValues, Length(flds));
+ SetLength(lPKValues, Length(lPKFlds));
+ end;
+
+ // Inserts the records
+ while (cnt > 0) do try
+ Append;
+
+ {$IFDEF STORERECID}
+ Destination.CurrentRecIdValue := max(Destination.CurrentRecIdValue,fReader.ReadInteger);//#2
+ {$ENDIF}
+
+ for i := 0 to (Fields.Count - 1) do begin
+
+ if flds[i].Calculated or flds[i].Lookup then Continue;
+
+ val := Null; // Default (see datUnknown below)
+ dt := TDADataType(fReader.ReadInteger);
+
+ case dt of
+ datUnknown: ; // Field was null
+ datWideString,
+ datWideMemo,
+ datXml: val := fReader.ReadWideString;
+ datString: val := fReader.ReadString;
+ datDateTime: val := fReader.ReadDate;
+ datFloat: val := fReader.ReadFloat;
+ datCurrency: val := fReader.ReadCurrency;
+ datBoolean: val := fReader.ReadBoolean;
+ datAutoInc,
+ datInteger: val := fReader.ReadInteger;
+ datSingleFloat: val := fReader.ReadSingle;
+ datLargeUInt,
+ datLargeAutoInc,
+ datLargeInt: val := fReader.ReadInt64;
+
+ datByte: val := Byte(fReader.ReadInteger);
+ datShortInt: val := ShortInt(fReader.ReadInteger);
+ datWord: val := Word(fReader.ReadInteger);
+ datSmallInt: val := SmallInt(fReader.ReadInteger);
+ datCardinal: val := Cardinal(fReader.ReadInteger);
+ datGuid: val := GuidToString(ReadGuid(fReader));
+ datDecimal: val := ReadDecimal(fReader);
+ datMemo: val := fReader.ReadString;
+ datBlob: val := fReader.ReadString;
+ end;
+
+ if Assigned(OnReadFieldValue) then OnReadFieldValue(flds[i], val);
+ if VarIsNull(val) then continue;
+ flds[i].Value := val;
+ end;
+
+ if AppendMode then begin
+ // store values and avoid firing OnReadFieldValue event
+ for I := 0 to Length(Flds) - 1 do
+ lFldValues[i]:= Flds[i].Value;
+ // store PK values for locate
+ for I := 0 to Length(lPKFlds) - 1 do
+ lPKValues[i]:= lPKFlds[i].Value;
+
+ Cancel;
+ if Dataset_Locate then
+ Edit
+ else
+ Append;
+ // assign new values
+ for I := 0 to Length(Flds) - 1 do
+ Flds[i].Value := lFldValues[i];
+ end;
+
+ try
+ Post;
+ except
+ // Introduced to restore the dsBrowse state of the datatable
+ // in case of errors
+ Cancel;
+ raise;
+ end;
+ if lProgress then begin
+ inc(lCurrent);
+ OnReadDatasetProgress(Self,Destination,lCurrent,lTotal);
+ end;
+ finally
+ Dec(cnt);
+ end;
+ end else begin
+ // batch loading
+ // Inserts the records
+ FRecordsList := TList.Create;
+ try
+ while (cnt > 0) do try
+ //Append;
+ buf:= memdataset.AllocRecordBuffer;
+ try
+ for i := 0 to (Fields.Count - 1) do begin
+ if flds[i].Calculated or flds[i].Lookup then Continue;
+ buf1:= memdataset.GetFieldNativeBuffer(buf,flds[i].BindedField);
+ dt := TDADataType(fReader.ReadInteger);
+ memdataset.SetNullMask(PMemDatasetrecord_Native(buf)^.Data,flds[i].BindedField, dt = datUnknown);
+ case dt of
+ datUnknown: ;
+ datWideString: memdataset.SetWideString(buf1,flds[i].BindedField,fReader.ReadWideString);
+ datString: begin
+ {$IFDEF UNICODE}
+ s:= WideStringToAnsiString(fReader.ReadString);
+ {$ELSE}
+ s:= fReader.ReadString;
+ {$ENDIF}
+ memdataset.SetAnsiString(buf1,flds[i].BindedField,s);
+ end;
+ datCurrency: PCurrency(buf1)^ := fReader.ReadCurrency;
+ datDateTime: PDateTime(buf1)^ := TimeStampToMSecs(DateTimeToTimeStamp(fReader.ReadDate));
+ datFloat: PDouble(buf1)^ := fReader.ReadFloat;
+ datLargeInt, datLargeAutoInc, datLargeUInt: PInt64(buf1)^ := fReader.ReadInt64;
+ datBoolean: System.PBoolean(buf1)^ := fReader.ReadBoolean;
+ datAutoInc, datInteger: PInteger(buf1)^ := fReader.ReadInteger;
+ datSingleFloat: PDouble(buf1)^ := fReader.ReadSingle;
+ datDecimal: begin
+ fReader.Read(bcd, Sizeof(bcd));
+ PBCD(buf1)^ := DecimalToBCD(bcd);
+ end;
+ datCardinal: PCardinal(buf1)^ := Cardinal(fReader.ReadInteger);
+ datByte: PSmallInt(buf1)^ := Byte(fReader.ReadInteger);
+ datWord: PWord(buf1)^ := Word(fReader.ReadInteger);
+ datShortInt: PSmallInt(buf1)^ := ShortInt(fReader.ReadInteger);
+ datSmallInt: PSmallInt(buf1)^ := SmallInt(fReader.ReadInteger);
+ datGuid: begin
+ s:= {$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(GuidToString(ReadGuid(fReader)));
+ Move(pointer(s)^, pointer(buf1)^, 38 {Length(GuidString)});
+ end;
+ datBlob,datMemo: begin
+ s:= {$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(fReader.ReadString);
+ PPointer(buf1)^ := memdataset.MakeBlobFromString(s);
+ end;
+ datWideMemo, datXml: begin
+ ws:= fReader.ReadWideString;
+ SetString(S,PAnsiChar(PWideChar(ws)),Length(ws)*SizeOf(WideChar));
+ PPointer(buf1)^ := memdataset.MakeBlobFromString(s);
+ ws:='';
+ end;
+ end;
+ // val =
+ // if Assigned(OnReadFieldValue) then OnReadFieldValue(flds[i], val);
+ // flds[i].Value := val;
+ end;
+ FRecordsList.Add(Buf);
+ except
+ memdataset.FreeRecordBuffer(buf);
+ For i:=0 to FRecordsList.Count-1 do begin
+ buf:=FRecordsList[i];
+ memdataset.FreeRecordBuffer(Buf);
+ end;
+ raise;
+ end;
+ if lProgress then begin
+ inc(lCurrent);
+ OnReadDatasetProgress(Self,Destination, lCurrent,lTotal);
+ end;
+ finally
+ Dec(cnt);
+ end;
+ // if table is empty then standard mode
+ AppendMode := AppendMode and not (editable.EOF and editable.GetBOF);
+ memdataset.AddRecordsfromList(FRecordsList,AppendMode);
+ finally
+ FRecordsList.Free;
+ end;
+ end;
+ finally
+ // Restores the read-only property
+ for i := 0 to (Fields.Count - 1) do
+ flds[i].ReadOnly := readonlyfields[i];
+ Destination.EnableConstraints;
+ end;
+
+ // TODO: temporary hack for the TClientDataset. Somehow if we don't do this the
+ // cursor is locked to the last record and there's no way to move!
+ {editable.Next;
+ editable.First;}
+ finally
+ fReader.EndReferences;
+ end;
+ finally
+ editable.EnableEventHandlers;
+ end;
+ finally
+ Destination.EnableControls;
+ end;
+end;
+
+procedure VariantToWriter(aDataType : TDADataType; const aSourceVariant : Variant; aWriter : TWriter);
+var
+ p: pointer;
+ lSize: cardinal;
+begin
+ case aDataType of
+ datBlob: begin
+ case VarType(aSourceVariant) of
+ varEmpty:begin
+ lSize := 0;
+ aWriter.Write(lSize, SizeOf(lSize));
+ end;
+ 8209:begin { 8209 is binary array }
+ lSize := VarArrayHighBound(aSourceVariant, 1)-VarArrayLowBound(aSourceVariant, 1)+1;
+ p := VarArrayLock(aSourceVariant);
+ try
+ aWriter.Write(lSize, SizeOf(lSize));
+ aWriter.Write(p^, lSize);
+ finally
+ VarArrayUnlock(aSourceVariant);
+ end;
+ end;
+ else begin
+ RaiseError('Invalid variant type (%d) for Blob.',[VarType(aSourceVariant)]);
+ end;
+ end;
+ end;
+ else begin
+ Writer_WriteVariant(aWriter, aSourceVariant);
+ end;
+ end;
+end;
+
+function ReaderToVariant(aDataType : TDADataType; aReader : TReader): Variant;
+var
+ p: pointer;
+ sze : cardinal;
+begin
+ case aDataType of
+ datBlob : begin
+ {$IFDEF FPC}
+ sze := 0;
+ {$ENDIF}
+ aReader.Read(sze, SizeOf(sze));
+
+ if (sze = 0) then
+ result := Unassigned
+ else try
+ result := VarArrayCreate([0, sze-1], varByte);
+ p := VarArrayLock(result);
+ aReader.Read(p^, sze);
+ finally
+ VarArrayUnlock(result);
+ end;
+ end;
+ else
+ result := Reader_ReadVariant(aReader);
+ end;
+end;
+
+procedure TDABinDataStreamer.DoWriteDelta(const Source: IDADelta);
+var
+ i, x: integer;
+ lProgress: Boolean;
+ lTotal: integer;
+begin
+ // This information will be used later to complete the stream (see DoInitialize)
+ AddElementInfo(etDelta, Source.LogicalName, GetWriterPosition(FWriter));
+ Source.RemoveUnchangedChanges;
+ // Number of changes
+ fWriter.WriteInteger(Source.Count);
+
+ // Numnber of fields, field names and their types
+ fWriter.WriteInteger(Source.LoggedFieldCount);
+ for i := 0 to (Source.LoggedFieldCount - 1) do begin
+ fWriter.WriteString(Source.LoggedFieldNames[i]);
+ fWriter.WriteInteger(integer(Source.LoggedFieldTypes[i]));
+ end;
+
+ // Key fields
+ fWriter.WriteInteger(Source.KeyFieldCount);
+ for i := 0 to (Source.KeyFieldCount - 1) do begin
+ fWriter.WriteString(Source.KeyFieldNames[i]);
+ end;
+
+ if (Source.Count = 0) then Exit;
+ lProgress := Assigned(OnWriteDeltaProgress);
+ lTotal := Source.Count;
+ // Actual changes
+ fWriter.WriteInteger(Source.Count);
+ for i := 0 to (Source.Count - 1) do begin
+ // Change type, RecID, status and message
+ x := integer(Source.Changes[i].ChangeType);
+ fWriter.WriteInteger(x);
+
+ fWriter.WriteInteger(Source.Changes[i].RecID);
+
+ x := integer(Source.Changes[i].Status);
+ fWriter.WriteInteger(x);
+
+ fWriter.WriteString(Source.Changes[i].Message);
+
+ // Old values
+ for x := 0 to (Source.LoggedFieldCount - 1) do begin
+ //fWriter.WriteVariant(Source.Changes[i].OldValues[x]);
+ VariantToWriter(Source.LoggedFieldTypes[x], Source.Changes[i].OldValues[x], fWriter);
+ end;
+
+ // New values
+ for x := 0 to (Source.LoggedFieldCount - 1) do begin
+ //fWriter.WriteVariant(Source.Changes[i].NewValues[x]); }
+ VariantToWriter(Source.LoggedFieldTypes[x], Source.Changes[i].NewValues[x], fWriter);
+ end;
+ if lProgress then OnWriteDeltaProgress(Self, Source, i+1, lTotal);
+ end;
+end;
+
+procedure TDABinDataStreamer.DoReadDelta(const DeltaName: string; const Destination: IDADelta);
+var
+ elementinfo: TDAElementInfo;
+ msg, str: string;
+ recid, i, cnt, x: integer;
+ change: TDADeltaChange;
+ changetype: TDAChangeType;
+ status: TDAChangeStatus;
+ val: Variant;
+ lProgress: boolean;
+begin
+ elementinfo := GetElementInfo(etDelta, DeltaName);
+ SetReaderPosition(FReader, elementinfo.Offset);
+
+ // Number of changes
+ cnt := fReader.ReadInteger;
+
+ // Field number, names and types
+ Destination.ClearFieldNames;
+ i := fReader.ReadInteger;
+ for i := i downto 1 do begin
+ str := fReader.ReadString;
+ Destination.AddFieldName(str, TDADataType(fReader.ReadInteger));
+// Destination.AddFieldName(str);
+// Destination.LoggedFieldTypes[Destination.LoggedFieldCount-1] := TDADataType(fReader.ReadInteger);
+ end;
+
+ // Key fields
+ Destination.ClearKeyFieldNames;
+ i := fReader.ReadInteger;
+ for i := i downto 1 do begin
+ str := fReader.ReadString;
+ Destination.AddKeyFieldName(str);
+ end;
+
+ if (cnt = 0) then Exit;
+
+ lProgress := Assigned(OnReadDeltaProgress);
+ // Actual changes
+ cnt := fReader.ReadInteger;
+ for i := 1 to cnt do begin
+ x := fReader.ReadInteger;
+ changetype := TDAChangeType(x);
+ recid := fReader.ReadInteger;
+
+ x := fReader.ReadInteger;
+ status := TDAChangeStatus(x);
+
+ msg := fReader.ReadString;
+
+ change := Destination.Add(recid, changetype, status, msg);
+ //Destination.Add(change);
+
+ // Old values
+ for x := 0 to (Destination.LoggedFieldCount - 1) do begin
+ {val := fReader.ReadVariant;
+ change.OldValues[x] := val;}
+ val := ReaderToVariant(Destination.LoggedFieldTypes[x], fReader);
+ change.OldValues[x] := val;
+ end;
+
+ // New values
+ for x := 0 to (Destination.LoggedFieldCount - 1) do begin
+ {val := fReader.ReadVariant;
+ change.NewValues[x] := val;}
+ val := ReaderToVariant(Destination.LoggedFieldTypes[x], fReader);
+ change.NewValues[x] := val;
+ end;
+ if lProgress then OnReadDeltaProgress(Self, Destination, i, cnt);
+ end;
+end;
+
+function TDABinDataStreamer.GetTargetDataType: TRODataType;
+begin
+ result := rtBinary
+end;
+
+function TDABinDataStreamer.DoBeginWriteDataset( const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend;
+var
+ cntpos, currpos, k, i: integer;
+ fld: TDAField;
+ wrtschema: boolean;
+ lfields: array of integer;
+ lDataForAppend : TDADataForAppend;
+ lSchemaFields: TDAFieldCollection;
+ lSchemaParams: TDAParamCollection;
+ lLogicalName: String;
+begin
+ lDataForAppend := TDADataForAppend.Create();
+ result := lDataForAppend;
+
+ if Assigned(Schema) then begin
+ lDataForAppend.TableSchema := Schema;
+ if Schema is TDAUnionDataTable then begin
+ fld := Schema.FindField(def_SourceTableFieldName);
+ if not Assigned(fld) then begin
+ fld := Schema.Fields.Add();
+ fld.Name := def_SourceTableFieldName;
+ fld.DataType := datInteger;
+ fld.InPrimaryKey := true;
+ fld.ServerAutoRefresh := true;
+ end;
+ end;
+ lSchemaFields := Schema.Fields;
+ lSchemaParams := Schema.Params;
+ lLogicalName := Schema.Name;
+ end else begin
+ if Assigned(Source) then begin
+ lSchemaFields := Source.Fields;
+ lSchemaParams := Source.Params;
+ lLogicalName := Source.LogicalName;
+ end else begin
+ raise EDAException.Create('Schema or source should be assigned.');
+ end;
+ end;
+
+
+ if Length(ADynFieldNames) > 0 then begin
+ SetLength(lfields, Length(ADynFieldNames));
+ For i:=0 to High(ADynFieldNames) do begin
+ fld:=lSchemaFields.FindField(ADynFieldNames[i]);
+ if fld <> nil then
+ lfields[i]:= fld.Index
+ else
+ lfields[i]:= -1;
+ end;
+ end else begin
+ SetLength(lfields, lSchemaFields.Count);
+ For i:=0 to lSchemaFields.Count-1 do
+ lfields[i]:=i;
+ end;
+
+ // This information will be used later to complete the stream (see DoInitialize)
+ AddElementInfo(etDataset, lLogicalName, GetWriterPosition(FWriter));
+
+ // Writes a boolean flag that indicates if the schema is being written
+ wrtschema := (woSchema in Options) or (Length(ADynFieldNames)>0);
+ fWriter.WriteBoolean(wrtschema);
+
+ // Write the offset to jump to if the reader wants to skip the schema
+ currpos := GetWriterPosition(FWriter);
+ WriteOffset(0);
+
+ if wrtschema then begin
+ WriteSchema(lSchemaFields, lSchemaParams, lfields);
+ Writer_FlushBuffer(FWriter);
+
+ // Writes the offset of the schema's end
+ k := GetWriterPosition(FWriter);
+ SetWriterPosition(FWriter, currpos);
+ WriteOffset(k);
+ SetWriterPosition(FWriter, k);
+ end;
+
+ // Writes the row count
+ cntpos := GetWriterPosition(FWriter);
+
+ if not (woRows in Options) then begin
+ fWriter.WriteInteger(-1);
+ end else begin
+ k := 0;
+ fWriter.Write(k, SizeOf(k));
+ end;
+
+ SetLength(lDataForAppend.RealFields, Length(lFields));
+ for i:= 0 to Length(lFields) -1 do
+ lDataForAppend.RealFields[i] := lFields[i];
+
+ lDataForAppend.MaxRowCount := MaxRows;
+ lDataForAppend.CountOfRecordsPosition := cntpos;
+ lDataForAppend.EndDataPosition := GetWriterPosition(FWriter);
+ lDataForAppend.RecordCount := k;
+end;
+
+function TDABinDataStreamer.DoWriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aDataIndex: Integer = -1): Integer;
+var
+ max, k, i: integer;
+ flds: array of TDAField;
+ val: Variant;
+ lDataForAppend: TDADataForAppend;
+ lFields: array of integer;
+ bigVal: Int64;
+ lFieldName: String;
+ lMapToFieldName: String;
+ lColumnMappings: TDAColumnMappingCollection;
+ lColumnMapping: TDAColumnMapping;
+ NativeDataset: IDASQLCommandNativeObject;
+ f: boolean;
+ ev, ev1: boolean;
+ lProgress: Boolean;
+ u32: Cardinal;
+begin
+ f:=(Source.QueryInterface(IDASQLCommandNativeObject, NativeDataset) = 0) and not NativeDataset.IsTDatasetCompatible;
+
+ lDataForAppend := aDataForAppend;
+ SetWriterPosition(FWriter, lDataForAppend.EndDataPosition);
+ SetLength(lfields, Length(lDataForAppend.RealFields));
+ SetLength(flds, Length(lDataForAppend.RealFields));
+ for i:= 0 to Length(lDataForAppend.RealFields) -1 do
+ lFields[i] := lDataForAppend.RealFields[i];
+
+ k := lDataForAppend.RecordCount;
+ max := lDataForAppend.MaxRowCount;
+ {$IFDEF FPC}
+ Result := 0; // else it's warn
+ {$ENDIF}
+
+ // Mapping fields of Source table to the streamed dataset
+ if Assigned(lDataForAppend.TableSchema) and (lDataForAppend.TableSchema is TDAUnionDataTable) then begin
+ lColumnMappings := TDAUnionSourceTable(TDAUnionDataTable(lDataForAppend.TableSchema).SourceTables.ItemByName(Source.Name)).ColumnMappings;
+ for i := 0 to lDataForAppend.TableSchema.Fields.Count - 1 do begin
+ lFieldName := lDataForAppend.TableSchema.Fields[lFields[i]].Name;
+ if lFieldName = def_SourceTableFieldName then begin
+ lFields[i] := -10;
+ continue;
+ end;
+ lMapToFieldName := lFieldName;
+ if Assigned(lColumnMappings) then begin
+ lColumnMapping := lColumnMappings.MappingByDatasetField(lFieldName);
+ if Assigned(lColumnMapping) and (lColumnMapping.TableField <> '') then
+ lMapToFieldName := lColumnMapping.TableField;
+ end;
+ lFields[i] := Source.FieldByName(lMapToFieldName).Index;
+ end;
+ end;
+
+
+ Source.DisableControls();
+ if not Source.active then Source.Open();
+ try
+ for i:= 0 to Length(lfields) -1 do begin
+ if lfields[i] = -10 then
+ flds[i] := lDataForAppend.TableSchema.FieldByName(def_SourceTableFieldName)
+ else
+ flds[i] := Source.Fields[lfields[i]];
+ end;
+ ev := Assigned(OnWriteFieldValue);
+ ev1 := Assigned(OnWriteFieldValueEx);
+ f := f or ev or ev1;
+ lProgress := Assigned(onWriteDatasetProgress);
+ // Writes the actual records
+ while (k<>max) and not Source.EOF do begin
+ {$IFDEF STORERECID}
+ fWriter.WriteInteger(Source.GetRowRecIdValue);
+ {$ENDIF}
+ for i := 0 to Length(lfields) - 1 do begin
+ //RealFields[i] = -10 then this is @SourceTable field
+ if lfields[i] = -10 then begin
+ val := aDataIndex;
+ end else begin
+ val := Source.FieldValues[lfields[i]];
+ end;
+
+ if Assigned(OnBeforeFieldValueSerialization) then OnBeforeFieldValueSerialization(flds[i], val);
+
+ if flds[i].Calculated or flds[i].Lookup then Continue;
+ if ev then OnWriteFieldValue(flds[i], val);
+ if ev1 then OnWriteFieldValueEx(Source, flds[i], val);
+
+ if (lfields[i] = -10) or ((f or not flds[i].IsNull) and (not VarIsNull(Val))) then begin
+ fWriter.WriteInteger(integer(flds[i].DataType));
+ case flds[i].DataType of
+ datWideString,
+ datWideMemo,
+ datXml: fWriter.WriteWideString(VarToWideStr(val));
+ datString: fWriter.WriteString(VarToStr(val));
+ datDateTime: fWriter.WriteDate(val);
+ datFloat: fWriter.WriteFloat(val);
+ datBoolean: fWriter.WriteBoolean(val);
+ datCurrency: fWriter.WriteCurrency(val);
+ datByte,
+ datShortInt,
+ datWord,
+ datSmallInt,
+ datAutoInc,
+ datInteger: fWriter.WriteInteger(val);
+ datCardinal: begin
+ u32 := val;
+ fWriter.WriteInteger(integer(u32));
+ end;
+ datSingleFloat: fwriter.WRiteSingle(val);
+
+ //datLargeInt: fWriter. WriteInteger(val);
+ datLargeAutoInc,
+ datLargeUInt,
+ datLargeInt: begin
+ bigVal := val;
+ fWriter.WriteInteger(bigVal);
+ end;
+ datGuid: WriteGuid(fWriter, Val);
+ datDecimal: WriteDecimal(fWriter, Val);
+ datMemo: fWriter.WriteString(VarToStr(val));
+ datBlob: begin
+ VariantToWriterAsStr(datBlob, val, fWriter);
+ end;
+ end;
+ end else
+ fWriter.WriteInteger(Ord(datUnknown));
+ end;
+
+ Inc(k);
+ if lProgress then OnWriteDatasetProgress(Self, Source, k, max);
+ Source.Next;
+
+ if Source.EOF then Break;
+ end;
+
+ lDataForAppend.EndDataPosition := GetWriterPosition(FWriter);
+ lDataForAppend.RecordCount := k;
+ result := k;
+ finally
+ Source.EnableControls;
+ end;
+end;
+
+function TDABinDataStreamer.DoEndWriteDataset(aDataForAppend: TDADataForAppend): Integer;
+begin
+ Writer_FlushBuffer(FWriter);
+ result := aDataForAppend.RecordCount;
+ SetWriterPosition(FWriter, aDataForAppend.CountOfRecordsPosition);
+ fWriter.Write(aDataForAppend.RecordCount, SizeOf(aDataForAppend.RecordCount));
+ SetWriterPosition(FWriter, aDataForAppend.EndDataPosition);
+ aDataForAppend.Free();
+end;
+
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDABusinessProcessor.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDABusinessProcessor.pas
new file mode 100644
index 0000000..0bd69f7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDABusinessProcessor.pas
@@ -0,0 +1,2599 @@
+unit uDABusinessProcessor;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+{ ToDo: for DA3, refactor the Oracle specific stuff OUT of here again }
+
+uses
+ Classes, DB, Contnrs, SysUtils,
+ uDAInterfaces, uDADataTable, uDAClasses, uDAOracleInterfaces,
+ uDAScriptingProvider, uDADelta
+ , uDASupportClasses
+ ;
+
+type
+ // These structs are to speed up mapping between command parameters and delta fields.
+ // See TDABusinessProcessor.ProcessDelta
+ TDAMappingType = (mtNewValue, mtOldValue{, mtNullCheck});
+ TDAParamMapping = record
+ CommandIndex,
+ DeltaIndex: integer;
+ MappingType: TDAMappingType;
+
+ GeneratorName : string;
+ GeneratorValue : integer;
+ end;
+
+ TDAParamMappingArray = array of TDAParamMapping;
+
+ TDADeltaChange = uDADelta.TDADeltaChange;
+ IDADelta = uDADelta.IDADelta;
+const
+ MappingPrefix: array[TDAMappingType] of string = ('', old_FieldPrefix{, 'NULL_'});
+
+type
+ TDABusinessProcessor = class;
+ TDABusinessProcessorRules = class;
+
+ TDADeltaProcessorItemCollection = class;
+
+
+ { Events }
+ TDAProcessDeltaEvent = procedure(Sender: TDABusinessProcessor; const aDelta: IDADelta) of object;
+
+ TDABeforeProcessChangeEvent = procedure(Sender: TDABusinessProcessor; aChangeType: TDAChangeType; aChange: TDADeltaChange; var ProcessChange: boolean) of object;
+
+ TDAAfterProcessChangeEvent = procedure(Sender: TDABusinessProcessor; aChange: TDADeltaChange; Processed: boolean; var CanRemoveFromDelta: boolean) of object;
+
+ TDAProcessChangeEvent = procedure(Sender: TDABusinessProcessor; aChangeType: TDAChangeType; aChange: TDADeltaChange; const aCommand: IDASQLCommand) of object;
+
+ TDARefreshDeltaChangeEvent = procedure(Sender: TDABusinessProcessor; aChangeType: TDAChangeType; aChange: TDADeltaChange; const aRefreshDataSet: IDADataSet) of object;
+
+ TDAProcessErrorEvent = procedure(Sender: TDABusinessProcessor;
+ aChangeType: TDAChangeType;
+ aChange: TDADeltaChange;
+ const aCommand: IDASQLCommand;
+ var CanRemoveFromDelta: boolean;
+ Error: Exception) of object;
+
+ TDAGenerateSQLEvent = procedure(Sender: TDABusinessProcessor;
+ ChangeType: TDAChangeType;
+ const ReferencedStatement: TDAStatement;
+ const aDelta: IDADelta;
+ var SQL: string) of object;
+
+ { Misc }
+ TDAProcessorOption = (poAutoGenerateInsert,
+ poAutoGenerateUpdate,
+ poAutoGenerateDelete,
+ poAutoGenerateRefreshDataset,
+ poPrepareCommands,
+ poIgnoreRowsAffected);
+ TDAProcessorOptions = set of TDAProcessorOption;
+
+ TDAUpdateMode = (updWhereKeyOnly, updWhereAll, updWhereKeyAndUserDefined, updWhereUserDefined);
+
+ { TDADeltaStruct }
+ TDADeltaStruct = class
+ private
+ fDelta : IDADelta;
+ fBusinessProcessor : TDABusinessProcessor;
+ fDetailDeltas : TDADeltaList;
+ fRelationShips: TDADatasetRelationshipList;
+
+ public
+ constructor Create(const aDelta : IDADelta; aBusinessProcessor : TDABusinessProcessor);
+ destructor Destroy; override;
+
+ property Delta : IDADelta read fDelta;
+ property BusinessProcessor : TDABusinessProcessor read fBusinessProcessor;
+ property DetailDeltas : TDADeltaList read fDetailDeltas;
+ property RelationShips : TDADatasetRelationshipList read fRelationShips;
+ end;
+
+ { TDADeltaStructList }
+ TDADeltaStructList = class(TObjectList)
+ private
+ function GetDADeltaStructs(Index: integer): TDADeltaStruct;
+ protected
+ public
+ function Add(const aDelta : IDADelta; aBusinessProcessor : TDABusinessProcessor): TDADeltaStruct;
+
+ function FindStruct(const aLogicalName : string) : TDADeltaStruct;
+ function StructByLogicalName(const aLogicalName : string) : TDADeltaStruct;
+
+ property DeltaStructs[Index : integer] : TDADeltaStruct read GetDADeltaStructs; default;
+ end;
+
+ IDABusinessProcessorScriptingProvider = interface(IDAScriptingProvider)
+ ['{7BF0D886-51D7-4E91-8073-0FBA78CC11F3}']
+ procedure RunBusinessProcessorScript(aBusinessProcessor: TDABusinessProcessor; const aScript: string; const aMethod: string; aLanguage:TROSEScriptLanguage);
+ end;
+
+ { IDASQLGenerator }
+ IDASQLGenerator = interface
+ ['{EDE4E068-C300-4991-89CF-F9A81D207930}']
+ function GenerateSQL(aChangeType: TDAChangeType;
+ aChange: TDADeltaChange;
+ aDataset: TDADataset;
+ const aDelta: IDADelta;
+ aDatasetStatement: TDAStatement;
+ aConnection: IDAConnection): string;
+
+ procedure UpdateSQLForOracle(aChangeType: TDAChangeType;
+ aDataset: TDADataset; const aDelta: IDADelta;
+ aDatasetStatement: TDAStatement; aConnection: IOracleConnection;
+ var OriginalSQL: string);
+
+ function GenerateRefreshDataset(aDataset: TDADataset; const aDelta: IDADelta;
+ aDatasetStatement: TDAStatement; aConnection: IDAConnection): IDADataset;
+
+ end;
+
+ { TDABusinessProcessor }
+ TDABusinessProcessor = class(TScriptableComponent, IDASQLGenerator)
+ private
+ fOnBeforeProcessChange: TDABeforeProcessChangeEvent;
+ fOnAfterProcessChange: TDAAfterProcessChangeEvent;
+
+ fInsertCommandName: string;
+ fDeleteCommandName: string;
+ fUpdateCommandName: string;
+
+ fSchema: TDASchema;
+
+ fOnAfterProcessDelta: TDAProcessDeltaEvent;
+ fOnBeforeProcessDelta: TDAProcessDeltaEvent;
+ fOnProcessChange: TDAProcessChangeEvent;
+ fOnProcessError: TDAProcessErrorEvent;
+ fOnRefreshDeltaChange: TDARefreshDeltaChangeEvent;
+
+ fReferencedDataset: string;
+ fProcessorOptions: TDAProcessorOptions;
+ fUserUpdateFields: TStringList;
+ fUpdateMode: TDAUpdateMode;
+ fOnGenerateSQL: TDAGenerateSQLEvent;
+
+ fBusinessRules: TDABusinessProcessorRules;
+ fCurrentChange: integer;
+ fCurrentDelta: TDADelta;
+ fBusinessRulesID: string;
+ fRefreshDataset: string;
+ FRaiseExceptionAtError: boolean;
+ fHasReducedDelta: Boolean;
+ FDynamicWhereInRefreshDataset: Boolean;
+
+ procedure SetSchema(const Value: TDASchema);
+ procedure SetDeleteCommandName(const Value: string);
+ procedure SetInsertCommandName(const Value: string);
+ procedure SetUpdateCommandName(const Value: string);
+ procedure SetReferencedDataset(const Value: string);
+ function GetUserUpdateFields: TStrings;
+ procedure SetUserUpdateFields(Value: TStrings);
+ function NeedsReferencedDataset: boolean;
+ function GetCurrentChange: TDADeltaChange;
+ procedure SetBusinessRulesID(const Value: string);
+ procedure SetupParameters(const aCommand: IDASQLCommand; aReferencedDataset : TDADataset; const aConnection: IDAConnection; AUnionMapping: TDAColumnMappingCollection = nil);
+ procedure SetRefreshDataset(const Value: string);
+
+ procedure RefreshDeltaChange(const aConnection : IDAConnection; const aRefreshDataset: IDADataset;
+ const aDelta: IDADelta; aDeltaChange: TDADeltaChange; GenAutoIncValue : variant);
+ function SetupRefreshDatasetForReducedDelta(const aConnection: IDAConnection; const aDelta: IDADelta):IDADataset;
+ procedure SetProcessorOptions(const Value: TDAProcessorOptions);
+ protected
+ procedure SetupCommands(const aConnection: IDAConnection; const aDelta: IDADelta;
+ out anInsertCmd, anUpdateCmd, anUpdateCMD_AutoInc, aDeleteCmd: IDASQLCommand;
+ out aRefreshDs : IDADataset; out aTargetTable : string); overload;dynamic;
+ procedure SetupCommands(const aConnection: IDAConnection; const aChange: TDADeltaChange;
+ out anCmd: IDASQLCommand; out aTargetTable : string; aUseAutoIncUpdate: Boolean=False); overload;dynamic;
+ // For unions
+ procedure SetupCommands(const aConnection: IDAConnection; const aDelta: IDADelta;
+ out aCommandsList : TDADeltaProcessorItemCollection); overload;dynamic;
+ procedure SetupCommandsWithMapping(const aConnection: IDAConnection; const aChange: TDADeltaChange;
+ out anCmd: IDASQLCommand; out aParamMapping: TDAParamMappingArray; out aRefreshDs: IDADataset; out aTargetTable : string; aUseAutoIncUpdate: Boolean=False);
+
+
+ procedure CreateMappings(const aDelta: IDADelta; var MappingArray: TDAParamMappingArray; const aCommand: IDASQLCommand; lAdditionalMapping: TDAColumnMappingCollection = nil; AValidateCommand: Boolean = False);
+
+ function GenerateSQL2(aChangeType: TDAChangeType;
+ aChange: TDADeltaChange;
+ aDataset: TDADataset;
+ const aDelta: IDADelta;
+ aDatasetStatement: TDAStatement;
+ aConnection: IDAConnection;aUseAutoIncUpdate: Boolean=False): string;
+ { IDASQLGenerator }
+ function GenerateSQL(aChangeType: TDAChangeType;
+ aChange: TDADeltaChange;
+ aDataset: TDADataset;
+ const aDelta: IDADelta;
+ aDatasetStatement: TDAStatement;
+ aConnection: IDAConnection): string; dynamic;
+
+ procedure UpdateSQLForOracle(aChangeType: TDAChangeType;
+ aDataset: TDADataset; const aDelta: IDADelta;
+ aDatasetStatement: TDAStatement; aConnection: IOracleConnection;
+ var OriginalSQL: string);
+
+ function GenerateRefreshDataset(aDataset: TDADataset; const aDelta: IDADelta;
+ aDatasetStatement: TDAStatement; aConnection: IDAConnection): IDADataset; overload;
+
+ function GenerateRefreshDataset(aDataset: TDADataset; aConnection: IDAConnection;
+ const aTargetTable : String; aColumnMappings, AUnionMapping: TDAColumnMappingCollection): IDADataset; overload;
+
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+
+ // IInterface
+ function QueryInterface(const IID: TGUID; out Obj): HResult; override;
+
+ function GetConnectionForObject(const aConnection: IDAConnection; const aName: string): IDAConnection;
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure SynchronizeAutoIncs(const aMasterDelta, aDetailDelta : IDADelta;
+ const aRelationship : TDADatasetRelationship);
+
+ procedure ProcessDelta(const aConnection: IDAConnection;
+ const aDelta: IDADelta;
+ ChangeTypes: TDAChangeTypes = AllChanges; ADeltaStruct : TDADeltaStruct = nil); overload;
+
+ procedure ProcessDelta(aDataTable: TDADataTable;
+ ChangeTypes: TDAChangeTypes; const aConnection : IDAConnection = NIL; ADeltaStruct : TDADeltaStruct = nil); overload;
+
+ procedure ProcessDeltaForUnion(const aConnection: IDAConnection;
+ const aDelta: IDADelta; ChangeTypes: TDAChangeTypes = AllChanges; ADeltaStruct : TDADeltaStruct = nil);
+
+
+ property CurrentDelta: TDADelta read fCurrentDelta;
+ property CurrentChange: TDADeltaChange read GetCurrentChange;
+ property HasReducedDelta: Boolean read fHasReducedDelta write fHasReducedDelta;
+ procedure CheckProperties;
+ published
+ property OnBeforeProcessDelta: TDAProcessDeltaEvent read fOnBeforeProcessDelta write fOnBeforeProcessDelta;
+ property OnAfterProcessDelta: TDAProcessDeltaEvent read fOnAfterProcessDelta write fOnAfterProcessDelta;
+ property OnBeforeProcessChange: TDABeforeProcessChangeEvent read fOnBeforeProcessChange write fOnBeforeProcessChange;
+ property OnAfterProcessChange: TDAAfterProcessChangeEvent read fOnAfterProcessChange write fOnAfterProcessChange;
+ property OnProcessChange: TDAProcessChangeEvent read fOnProcessChange write fOnProcessChange;
+ property OnProcessError: TDAProcessErrorEvent read fOnProcessError write fOnProcessError;
+ property OnGenerateSQL: TDAGenerateSQLEvent read fOnGenerateSQL write fOnGenerateSQL;
+ property OnRefreshDeltaChange: TDARefreshDeltaChangeEvent read fOnRefreshDeltaChange write fOnRefreshDeltaChange;
+
+ property Schema: TDASchema read fSchema write SetSchema;
+
+ property InsertCommandName: string read fInsertCommandName write SetInsertCommandName;
+ property DeleteCommandName: string read fDeleteCommandName write SetDeleteCommandName;
+ property UpdateCommandName: string read fUpdateCommandName write SetUpdateCommandName;
+ property RefreshDatasetName: string read fRefreshDataset write SetRefreshDataset;
+
+ property ReferencedDataset: string read fReferencedDataset write SetReferencedDataset;
+ property ProcessorOptions: TDAProcessorOptions read fProcessorOptions write SetProcessorOptions;
+
+ property UpdateMode: TDAUpdateMode read fUpdateMode write fUpdateMode;
+ property UserUpdateFields: TStrings read GetUserUpdateFields write SetUserUpdateFields;
+
+ property BusinessRulesID: string read fBusinessRulesID write SetBusinessRulesID;
+ property RaiseExceptionAtError: boolean read FRaiseExceptionAtError write FRaiseExceptionAtError default False;
+ end;
+
+ { TDABusinessProcessorRules }
+ TDABusinessProcessorRules = class(TDABusinessRules, IDAStronglyTypedDataTable)
+ private
+ fBusinessProcessor: TDABusinessProcessor;
+ protected
+ property BusinessProcessor: TDABusinessProcessor read fBusinessProcessor;
+
+ // Misc
+ procedure Attach(aBusinessProcessor: TDABusinessProcessor); virtual;
+ procedure Detach(aBusinessProcessor: TDABusinessProcessor); virtual;
+
+ // Business events
+ procedure BeforeProcessDelta(Sender: TDABusinessProcessor; const aDelta: IDADelta); virtual;
+ procedure AfterProcessDelta(Sender: TDABusinessProcessor; const aDelta: IDADelta); virtual;
+ procedure BeforeProcessChange(Sender: TDABusinessProcessor; aChangeType: TDAChangeType; aChange: TDADeltaChange; var ProcessChange: boolean); virtual;
+ procedure AfterProcessChange(Sender: TDABusinessProcessor; aChange: TDADeltaChange; Processed: boolean; var CanRemoveFromDelta: boolean); virtual;
+ procedure ProcessChange(Sender: TDABusinessProcessor; aChangeType: TDAChangeType; aChange: TDADeltaChange; const aCommand: IDASQLCommand); virtual;
+ procedure ProcessError(Sender: TDABusinessProcessor; aChangeType: TDAChangeType; aChange: TDADeltaChange;
+ const aCommand: IDASQLCommand; var CanRemoveFromDelta: boolean; Error: Exception); virtual;
+ procedure GenerateSQL(Sender: TDABusinessProcessor; ChangeType: TDAChangeType; const ReferencedStatement: TDAStatement;
+ const aDelta: IDADelta; var SQL: string); virtual;
+
+ procedure NotSupportedByBusinessProcessor;
+ procedure Open;
+ procedure Close;
+
+ function GetActive: boolean;
+ procedure SetActive(const Value: boolean);
+
+ procedure Append;
+ procedure Cancel;
+ procedure Delete;
+ procedure Edit;
+ procedure First;
+ procedure Insert;
+ procedure Last;
+ procedure Next;
+ procedure Post;
+ procedure Prior;
+ function GetBOF: Boolean;
+ function GetEOF: Boolean;
+ function GetRecordCount: Integer;
+ function Locate(const aKeyFields: String; const aKeyValues: Variant; aOptions: TLocateOptions = []): Boolean;
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant;
+
+ function GetMasterOptions : TDAMasterOptions;
+ procedure SetMasterOptions(Value : TDAMasterOptions);
+ function GetDetailOptions : TDADetailOptions;
+ procedure SetDetailOptions(Value : TDADetailOptions);
+ function GetState : TDatasetState;
+ function GetIsEmpty : boolean;
+
+ function IsFieldNull(const FieldIndexOrName : Variant) : boolean;
+ procedure ClearField(const FieldIndexOrName : Variant);
+
+ function GetDataTable : TDADataTable;
+
+ function GetRecNo: integer;
+ procedure SetRecNo(Value: integer);
+
+ public
+ constructor Create(aBusinessProcessor: TDABusinessProcessor); reintroduce; virtual;
+ end;
+
+ TDABusinessProcessorRulesClass = class of TDABusinessProcessorRules;
+
+ TDADeltaProcessorItem = class(TCollectionItem)
+ private
+ fName: String;
+ fRefreshDataset: IDADataset;
+
+ fInsertCommand: IDASQLCommand;
+ fUpdateCommand: IDASQLCommand;
+ fUpdateCommand_AutoInc: IDASQLCommand;
+ fDeleteCommand: IDASQLCommand;
+
+ fInsertCommandMapping: TDAParamMappingArray;
+ fUpdateCommandMapping: TDAParamMappingArray;
+ fUpdateCommandMapping_AutoInc: TDAParamMappingArray;
+ fDeleteCommandMapping: TDAParamMappingArray;
+ fTargetTable: string;
+
+ public
+ property TargetTable: string read fTargetTable write fTargetTable;
+ property RefreshDataset: IDADataset read fRefreshDataset write fRefreshDataset;
+
+ property InsertCommand: IDASQLCommand read fInsertCommand write fInsertCommand;
+ property UpdateCommand: IDASQLCommand read fUpdateCommand write fUpdateCommand;
+ property UpdateCommand_AutoInc: IDASQLCommand read fUpdateCommand_AutoInc write fUpdateCommand_AutoInc;
+ property DeleteCommand: IDASQLCommand read fDeleteCommand write fDeleteCommand;
+
+ property InsertCommandMapping: TDAParamMappingArray read fInsertCommandMapping write fInsertCommandMapping;
+ property UpdateCommandMapping: TDAParamMappingArray read fUpdateCommandMapping write fUpdateCommandMapping;
+ property UpdateCommandMapping_AutoInc: TDAParamMappingArray read fUpdateCommandMapping_AutoInc write fUpdateCommandMapping_AutoInc;
+ property DeleteCommandMapping: TDAParamMappingArray read fDeleteCommandMapping write fDeleteCommandMapping;
+ published
+ property Name: String read fName write fName;
+ end;
+
+ TDADeltaProcessorItemCollection = class(TSearcheableCollection)
+ private
+ function GetItem(Index: integer): TDADeltaProcessorItem;
+ procedure SetItem(Index: integer; const Value: TDADeltaProcessorItem);
+ protected
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner: TComponent);
+ function Add: TDADeltaProcessorItem; reintroduce;
+ function ItemByName(const aName: String): TDADeltaProcessorItem;
+ property Items[Index: integer]: TDADeltaProcessorItem read GetItem write SetItem; default;
+ end;
+
+
+// Registration routines
+procedure RegisterBusinessProcessorRules(const anID: string; const aDeltaChangeClass: TDABusinessProcessorRulesClass);
+function FindBusinessProcessorRules(const anID: string; out aDeltaChangeClass: TDABusinessProcessorRulesClass): boolean;
+
+implementation
+
+uses
+ {$IFDEF DEBUG_DATAABSTRACT_SQL}
+ eDebugServer,
+ {$ENDIF}
+ uROClasses, Variants, TypInfo, Types, uDAEngine;
+
+{$IFDEF DEBUG_DATAABSTRACT_SQL}
+const
+ cat_SQL = 'SQL Generation';
+{$ENDIF}
+
+var
+ _bizdeltachanges: TStringList;
+
+procedure RegisterBusinessProcessorRules(const anID: string; const aDeltaChangeClass: TDABusinessProcessorRulesClass);
+var
+ idx: integer;
+begin
+ idx := _bizdeltachanges.IndexOf(anID);
+
+ if (idx >= 0) then
+ _bizdeltachanges.Objects[idx] := TObject(aDeltaChangeClass)
+ else
+ _bizdeltachanges.AddObject(anID, TObject(aDeltaChangeClass));
+end;
+
+function FindBusinessProcessorRules(const anID: string; out aDeltaChangeClass: TDABusinessProcessorRulesClass): boolean;
+var
+ idx: integer;
+begin
+ result := FALSE;
+ idx := _bizdeltachanges.IndexOf(anID);
+ if (idx >= 0) then begin
+ aDeltaChangeClass := TDABusinessProcessorRulesClass(_bizdeltachanges.Objects[idx]);
+ result := TRUE;
+ end
+ else
+ aDeltaChangeClass := nil;
+end;
+
+function QuoteIdentifier(const aConnection : IDAConnection; const aFieldName: string): string;
+begin
+ {if (Pos(' ', aFieldName) > 0) then
+ result := QuoteChars[0] + aFieldName + QuoteChars[1]
+ else
+ result := aFieldName;}
+ result := aConnection.QuoteIdentifierIfNeeded(aFieldName);
+end;
+
+function QuoteFieldName(const aConnection : IDAConnection; const aTableName,aFieldName: string): string;
+begin
+ result := aConnection.QuoteFieldNameIfNeeded(aTableName, aFieldName);
+end;
+
+function QuoteParamName(const aConnection : IDAConnection; const aParamName: string): string;
+begin
+ if (pos('.',aParamName) >0) or (pos(' ',aParamName) >0) then
+ result := AnsiQuotedStr(aParamName,'"')
+ else
+ Result:= aParamName;
+end;
+
+
+{ TDADeltaStruct }
+
+constructor TDADeltaStruct.Create(const aDelta : IDADelta; aBusinessProcessor : TDABusinessProcessor);
+begin
+ inherited Create;
+
+ fDelta := aDelta;
+ fBusinessProcessor := aBusinessProcessor;
+ fDetailDeltas := TDADeltaList.Create;
+ fRelationShips := TDADatasetRelationshipList.Create;
+end;
+
+destructor TDADeltaStruct.Destroy;
+begin
+ inherited;
+
+ FreeAndNIL(fDetailDeltas);
+ FreeAndNIL(fRelationShips);
+end;
+
+{ TDADeltaStructList }
+
+function TDADeltaStructList.Add(const aDelta : IDADelta; aBusinessProcessor : TDABusinessProcessor): TDADeltaStruct;
+begin
+ result := TDADeltaStruct.Create(aDelta, aBusinessProcessor);
+ inherited Add(result);
+end;
+
+function TDADeltaStructList.FindStruct(
+ const aLogicalName: string): TDADeltaStruct;
+var i : integer;
+begin
+ result := NIL;
+ for i := 0 to (Count-1) do
+ if SameText(DeltaStructs[i].Delta.LogicalName, aLogicalName) then begin
+ result := DeltaStructs[i];
+ Exit;
+ end;
+end;
+
+function TDADeltaStructList.GetDADeltaStructs(
+ Index: integer): TDADeltaStruct;
+begin
+ result := TDADeltaStruct(inherited Items[Index])
+end;
+
+function TDADeltaStructList.StructByLogicalName(
+ const aLogicalName: string): TDADeltaStruct;
+begin
+ result := FindStruct(aLogicalName);
+ if result=NIL then raise Exception.Create('Cannot find struct '+aLogicalName);
+end;
+
+{ TDABusinessProcessor }
+
+constructor TDABusinessProcessor.Create(aOwner: TComponent);
+begin
+ inherited;
+
+ fUserUpdateFields := TStringList.Create;
+ fProcessorOptions := [poAutoGenerateInsert, poAutoGenerateUpdate, poAutoGenerateDelete, poPrepareCommands, poAutoGenerateRefreshDataset];
+ fUpdateMode := updWhereKeyOnly;
+end;
+
+destructor TDABusinessProcessor.Destroy;
+begin
+ Schema := nil;
+ FreeAndNIL(fUserUpdateFields);
+
+ if (fBusinessRules <> nil) then begin
+ fBusinessRules.Detach(Self);
+ fBusinessRules.Free;
+ end;
+
+ inherited;
+end;
+
+function TDABusinessProcessor.GetUserUpdateFields: TStrings;
+begin
+ result := fUserUpdateFields
+end;
+
+procedure TDABusinessProcessor.SetUserUpdateFields(Value: TStrings);
+begin
+ fUserUpdateFields.Assign((Value));
+end;
+
+procedure TDABusinessProcessor.CreateMappings(const aDelta: IDADelta; var MappingArray: TDAParamMappingArray; const aCommand: IDASQLCommand; lAdditionalMapping: TDAColumnMappingCollection = nil; AValidateCommand: Boolean = False);
+var
+ lDeltaFieldList: TStringList;
+ lAdditionalMappingList: TStringList;
+
+ function isPresentInDelta(str: string): boolean;
+ var
+ i: integer;
+ begin
+ if lAdditionalMapping <> nil then begin
+ i := lAdditionalMappingList.IndexOf(str);
+ if i <> -1 then
+ str := TDAColumnMapping(lAdditionalMappingList.Objects[i]).DatasetField;
+// else str := lAdditionalMapping.MappingByTableField(str).DatasetField; // raise 'native' exception
+ end;
+ Result := lDeltaFieldList.IndexOf(str) <> -1;
+ end;
+
+var
+ i,j: integer;
+ lParamName : string;
+ lDeltaIndex : integer;
+ lFieldName: String;
+begin
+ if aCommand = nil then Exit;
+
+ // The command is what determines how many mappings will be done
+ SetLength(MappingArray, aCommand.Params.Count);
+ lDeltaFieldList := TStringList.Create;
+ lAdditionalMappingList := TStringList.Create;
+ try
+ for i := 0 to aDelta.LoggedFieldCount-1 do
+ lDeltaFieldList.Add(aDelta.LoggedFieldNames[i]);
+ lDeltaFieldList.Sorted:=True;
+
+ if lAdditionalMapping <> nil then
+ for i:= 0 to lAdditionalMapping.Count -1 do
+ lAdditionalMappingList.AddObject(lAdditionalMapping[i].TableField, lAdditionalMapping[i]);
+
+ for i := 0 to (aCommand.Params.Count - 1) do begin
+ MappingArray[i].CommandIndex := 0;
+
+ lParamName := UpperCase(aCommand.Params[i].Name);
+
+ // Determines the mapping type
+ if (Pos(MappingPrefix[mtOldValue], lParamName) = 1) and not isPresentInDelta(lParamName) then
+ MappingArray[i].MappingType := mtOldValue
+
+ {else if (Pos(MappingPrefix[mtNullCheck], lParamName) = 1)
+ then MappingArray[i].MappingType := mtNullCheck}
+
+ else MappingArray[i].MappingType := mtNewValue;
+
+ if (MappingArray[i].MappingType = mtOldValue) then
+ lFieldName := Copy(aCommand.Params[i].Name, Length(MappingPrefix[mtOldValue])+1, MaxInt)
+ else
+ lFieldName := aCommand.Params[i].Name;
+
+ // if lAdditionalMapping is assigned (usually incase delta for union table)
+ // then translate it
+ if Assigned(lAdditionalMapping) then begin
+ j := lAdditionalMappingList.IndexOf(lFieldName);
+ if j <> -1 then
+ lFieldName := TDAColumnMapping(lAdditionalMappingList.Objects[j]).DatasetField
+ else
+ lFieldName := lAdditionalMapping.MappingByTableField(lFieldName).DatasetField; // raise "native" exception
+ end;
+
+ if AValidateCommand and
+ (lDeltaFieldList.IndexOf(lFieldName) = -1) then raise Exception.CreateFmt('%s command can''t be used as delta command for %s datatable: parameters mismatch',[aCommand.Name,aDelta.LogicalName]);
+
+ // Finds the index for this value in the delta
+ lDeltaIndex := aDelta.IndexOfLoggedField(lFieldName);
+
+ MappingArray[i].DeltaIndex := lDeltaIndex;
+
+ MappingArray[i].GeneratorName := aCommand.ParamByName(lParamName).GeneratorName;
+ MappingArray[i].GeneratorValue := -1;
+ end;
+ finally
+ lDeltaFieldList.Free;
+ lAdditionalMappingList.Free;
+ end;
+end;
+
+function TDABusinessProcessor.GenerateRefreshDataset(aDataset: TDADataset;
+ aConnection: IDAConnection;
+ const aTargetTable: String;
+ aColumnMappings, AUnionMapping: TDAColumnMappingCollection): IDADataset;
+var
+ i: integer;
+ // namesstr,
+ fullsql,
+ fieldsstr,
+ keystr,
+ //remotename,
+ lFieldName,
+ lParamName,
+ localname: string;
+ fld: TDAField;
+begin
+ result := aConnection.NewDataset('');
+ fieldsstr := '';
+// namesstr := '';
+ keystr := '';
+
+ with aDataset do try
+ // Generates the SELECT
+ for i := 0 to Fields.Count-1 do begin
+ if not (Fields[i].DataType in [datAutoInc,datLargeAutoInc]) and
+ (not Fields[i].ServerAutoRefresh or Fields[i].Lookup or Fields[i].ServerCalculated) then Continue;
+
+ localname := QuoteFieldName(aConnection, aTargetTable, aColumnMappings.MappingByDatasetField(Fields[i].Name).TableField);
+
+ if AUnionMapping <> nil then
+ lFieldName := AUnionMapping.MappingByTableField(Fields[i].Name).DatasetField
+ else
+ lFieldName := Fields[i].Name;
+
+ if (AUnionMapping <> nil) and (localname <> lFieldName) then
+ fieldsstr := fieldsstr+localname+' as '+QuoteFieldName(aConnection, aTargetTable, lFieldName)+','+#13#10
+ else
+ fieldsstr := fieldsstr+localname+','+#13#10;
+
+ with result.Fields.Add do begin
+ AssignField(Fields[i]);
+ Name := lFieldName;
+ end;
+ end;
+ if (fieldsstr='') then Exit;
+ fieldsstr := Copy(fieldsstr,1, Length(fieldsstr)-3{ = Lenght(','+#13#10) })+#13#10;
+
+ // Generates the WHERE using the primary key fields
+ for i := 0 to Fields.Count-1 do begin
+ if not Fields[i].InPrimaryKey then Continue;
+
+ localname := QuoteFieldName(aConnection,aTargetTable, aColumnMappings.MappingByDatasetField(Fields[i].Name).TableField);
+ if AUnionMapping <> nil then
+ lParamName := AUnionMapping.MappingByTableField(Fields[i].Name).DatasetField
+ else
+ lParamName := Fields[i].Name;
+ keystr := keystr+Format('%s = :%s', [localname, lParamName])+' AND '+#13#10;
+ end;
+ if (keystr='') then begin
+ // try to create WHERE with AutoInc fields
+ for i := 0 to Fields.Count-1 do begin
+ if not (Fields[i].DataType in [datAutoInc,datLargeAutoInc]) then Continue;
+
+ localname := QuoteFieldName(aConnection,aTargetTable, aColumnMappings.MappingByDatasetField(Fields[i].Name).TableField);
+ if AUnionMapping <> nil then
+ lParamName := AUnionMapping.MappingByTableField(Fields[i].Name).DatasetField
+ else
+ lParamName := Fields[i].Name;
+ keystr := keystr+Format('%s = :%s', [localname, lParamName])+' AND '+#13#10;
+ end;
+ end;
+ if (keystr='') then Exit;
+ keystr := Copy(keystr,1, Length(keystr)-6 {Length( 'AND '+#13#10)})+#13#10;
+
+ // Combines the two
+ fullsql := 'SELECT '#13#10+fieldsstr+' FROM '+ QuoteIdentifier(aConnection, aTargetTable) +#13#10+' WHERE '+#13#10+keystr;
+ result.SQL := fullsql;
+
+ {$IFDEF DEBUG_DATAABSTRACT_SQL}DebugServer.Write([cat_SQL], result.SQL);{$ENDIF}
+
+ for i := 0 to (aColumnMappings.Count - 1) do begin
+ fld := result.FindField(aColumnMappings[i].DatasetField);
+ if Assigned(fld) then begin
+ fld.TableField := aColumnMappings[i].TableField;
+ fld.SQLOrigin := aColumnMappings[i].SQLOrigin;
+ end;
+ end;
+
+ finally
+ if (result.SQL='') then result := NIL;
+ end;
+end;
+
+function TDABusinessProcessor.GenerateSQL(aChangeType: TDAChangeType;
+ aChange: TDADeltaChange;
+ aDataset: TDADataset;
+ const aDelta: IDADelta;
+ aDatasetStatement: TDAStatement;
+ aConnection: IDAConnection): string;
+begin
+ Result := GenerateSQL2(aChangeType,aChange,aDataset,aDelta,aDatasetStatement,aConnection);
+end;
+
+function TDABusinessProcessor.GenerateSQL2(aChangeType: TDAChangeType;
+ aChange: TDADeltaChange;
+ aDataset: TDADataset;
+ const aDelta: IDADelta;
+ aDatasetStatement: TDAStatement;
+ aConnection: IDAConnection;
+ aUseAutoIncUpdate: Boolean = False): string;
+
+ function _GetTableField(aMapping: TDAColumnMappingCollection; aDatasetField: string): string;
+ begin
+ if aMapping.Count = 0 then
+ Result:= aDatasetField
+ else
+ Result:= aMapping.MappingByDatasetField(aDatasetField).TableField;
+ end;
+
+var
+ i: integer;
+ namesstr,
+ valuesstr,
+ keystr,
+ remotename,
+ localname: string;
+ oraconn : IOracleConnection;
+ fld : TDAField;
+ usegenerators : boolean;
+ //lIsUnionTable : Boolean;
+ lUnionTable: TDAUnionDataTable;
+ lSrcTable: TDAUnionSourceTable;
+ lUpdateMode: TDAUpdateMode;
+ lPKList: TStringList;
+begin
+ result := '';
+ valuesstr := '';
+ namesstr := '';
+ keystr := '';
+ lSrcTable := nil;
+ if aDatasetStatement.TargetTable = '' then raise Exception.Create(aDelta.LogicalName+'. Can''t generate a delta''s SQL. TargetTable isn''t assigned.');
+ // If passed dataset is a source table for uniontable then lSrcTable will be assigned (used for distinguish unionsourcetables)
+ lUnionTable := fSchema.UnionDataTables.FindItem(fReferencedDataset) as TDAUnionDataTable;
+ if assigned(lUnionTable) then begin
+ lSrcTable := lUnionTable.SourceTables.UnionSourceTableByName(aDataset.Name);
+ end;
+
+ usegenerators := Supports(aConnection, IDAUseGenerators) or Supports(aConnection, IDAUseGenerators2);
+ lUpdateMode:=fUpdateMode;
+ if (aDelta.KeyFieldCount=0) and (lUpdateMode = updWhereKeyOnly) then
+ lUpdateMode:=updWhereAll;
+ lPKList:= TStringList.Create;
+ try
+ with aDatasetStatement, aDelta do begin
+ for i := 0 to (KeyFieldCount - 1) do
+ lPKList.Add(KeyFieldNames[i]);
+ lPKList.Sorted:=True;
+ // Generates the WHERE conditions. Done here because used by both deletes and updates
+ if (aChangeType <> ctInsert) then begin
+ case lUpdateMode of
+ updWhereKeyOnly, updWhereKeyAndUserDefined: begin
+ for i := 0 to (KeyFieldCount - 1) do begin
+ remotename := KeyFieldNames[i];
+
+ // If this is UnionSourceDataTable then we should do fields remapping
+ if Assigned(lSrcTable) then begin
+ if SameText(remotename, def_SourceTableFieldName) then Continue;
+ remotename := _GetTableField(lSrcTable.ColumnMappings, remotename);
+ end;
+
+ localname := QuoteFieldName(aConnection,aDatasetStatement.TargetTable, _GetTableField(ColumnMappings,remotename));
+ keystr := keystr + #13#10'(' + localname + '=:'+QuoteParamName(aConnection, MappingPrefix[mtOldValue] + remotename)+ ') AND ';
+ end;
+ end;
+
+ updWhereAll: begin
+ for i := 0 to (LoggedFieldCount - 1) do begin
+ remotename := LoggedFieldNames[i];
+
+ // If this is UnionSourceDataTable then we should do fields remapping
+ if Assigned(lSrcTable) then begin
+ if SameText(remotename, def_SourceTableFieldName) then Continue;
+ remotename := _GetTableField(lSrcTable.ColumnMappings,remotename);
+ end;
+
+ localname := QuoteFieldName(aConnection,aDatasetStatement.TargetTable, _GetTableField(ColumnMappings,remotename));
+ if (aDataset.FieldByName(remotename).DataType in [datBlob, datMemo]) then Continue;
+ if assigned(aChange) and ROVariantsEqual(aChange.OldValueByName[remotename],aChange.NewValueByName[remotename]) and (lPKList.IndexOf(remotename) = -1) then Continue;
+ keystr := keystr + #13#10'((' + localname + '=:'+QuoteParamName(aConnection, MappingPrefix[mtOldValue] + remotename) + ') OR (:'+QuoteParamName(aConnection, MappingPrefix[mtOldValue] + remotename) +
+ ' IS NULL AND ' + localname + ' IS NULL)) AND ';
+ end;
+ end;
+ end;
+
+ if (lUpdateMode in [updWhereKeyAndUserDefined, updWhereUserDefined]) then begin
+ for i := 0 to (fUserUpdateFields.Count - 1) do begin
+ remotename := fUserUpdateFields[i];
+
+ // If this is UnionSourceDataTable then we should do fields remapping
+ if Assigned(lSrcTable) then begin
+ if SameText(remotename, def_SourceTableFieldName) then Continue;
+ remotename := _GetTableField(lSrcTable.ColumnMappings,remotename);
+ end;
+
+ localname := QuoteFieldName(aConnection, aDatasetStatement.TargetTable, _GetTableField(ColumnMappings,remotename));
+ if assigned(aChange) and ROVariantsEqual(aChange.OldValueByName[remotename],aChange.NewValueByName[remotename]) then Continue;
+ keystr := keystr + #13#10'((' + localname + '=:'+QuoteParamName(aConnection, MappingPrefix[mtOldValue] + remotename) + ') OR (:'+QuoteParamName(aConnection,MappingPrefix[mtOldValue] + remotename) +
+ ' IS NULL AND ' + localname + ' IS NULL)) AND ';
+ end;
+ end;
+
+ keystr := Copy(keystr, 1, Length(keystr) - 5 {=Length(' AND ')});
+ end;
+
+ // Remaining part of the SQL command
+ case aChangeType of
+ // Insert
+ ctInsert: begin
+ result := 'INSERT INTO ' + QuoteIdentifier(aConnection, aDatasetStatement.TargetTable) + ' ('#13#10;
+
+ for i := 0 to (LoggedFieldCount - 1) do begin
+ remotename := LoggedFieldNames[i];
+
+ // If this is UnionSourceDataTable then we should do fields remapping
+ if Assigned(lSrcTable) then begin
+ if SameText(remotename, def_SourceTableFieldName) then Continue;
+ remotename := _GetTableField(lSrcTable.ColumnMappings,remotename);
+ end;
+
+
+ fld := aDataset.Fields.FieldByName(remotename);
+ if ((fld.DataType in [datAutoInc,datLargeAutoInc]) and not usegenerators) // Skips autoincs on DBs like MSSQL
+ or (fld.Calculated) or (fld.ReadOnly) or (fld.ServerCalculated)
+ then Continue;
+ if (Assigned(aChange) and (VarIsNull(aChange.NewValues[i]) or VarIsEmpty(aChange.NewValues[i]))) then Continue;
+
+ localname := _GetTableField(ColumnMappings,remotename);
+ if localname = mapping_Unknown then Continue;
+ localname := QuoteFieldName(aConnection, aDatasetStatement.TargetTable, localname);
+
+ namesstr := namesstr + localname + ', ';
+ valuesstr := valuesstr + ':' +QuoteParamName(aConnection, remotename) + ', ';
+ end;
+ if Assigned(aChange) and (namesstr = '') then begin
+ Result := '';
+ end
+ else begin
+ namesstr := Copy(namesstr, 1, Length(namesstr) - 2 {=Length(', ')}) + ')';
+ valuesstr := Copy(valuesstr, 1, Length(valuesstr) - 2{=Length(', ')}) + ')';
+
+ result := result + namesstr + #13#10' VALUES (' + valuesstr;
+ end;
+ end;
+
+ // Delete
+ ctDelete: result := 'DELETE FROM ' + QuoteIdentifier(aConnection, aDatasetStatement.TargetTable) + #13#10' WHERE ' + keystr;
+
+ // Update
+ ctUpdate: begin
+ result := '';
+
+ for i := 0 to (LoggedFieldCount - 1) do begin
+ remotename := LoggedFieldNames[i];
+
+ // If this is UnionSourceDataTable then we should do fields remapping
+ if Assigned(lSrcTable) then begin
+ if SameText(remotename, def_SourceTableFieldName) then Continue;
+ remotename := _GetTableField(lSrcTable.ColumnMappings,remotename);
+ end;
+
+
+ fld := aDataset.Fields.FieldByName(remotename);
+ if (fld.DataType in [datAutoInc,datLargeAutoInc]) and not aUseAutoIncUpdate then Continue; // Skips autoincs
+ if (fld.InPrimaryKey and not fld.LogChanges) then Continue;
+ if (fld.Calculated) or (fld.ReadOnly) or (fld.ServerCalculated) then Continue;
+ if assigned(aChange) and ROVariantsEqual(aChange.OldValues[i],aChange.NewValues[i]) then Continue;
+ localname := _GetTableField(ColumnMappings,remotename);
+ if localname = mapping_Unknown then Continue;
+ localname := QuoteFieldName(aConnection, aDatasetStatement.TargetTable, localname);
+
+ if (result<>'') then result := result + ', ';
+ result := result + #13#10 + localname + '= :' + QuoteParamName(aConnection,remotename);
+ //if (i < LoggedFieldCount - 1) then result := result + ', ';
+ end;
+ if assigned(aChange) and (Result = '') then begin
+ //
+ end
+ else begin
+ result := 'UPDATE '+QuoteIdentifier(aConnection, aDatasetStatement.TargetTable)+' SET '+result+#13#10' WHERE '+keystr;
+ end;
+ end;
+ end;
+ end;
+ finally
+ lPKList.Free;
+ end;
+
+ // Exception for Oracle's SQL
+ if Supports(aConnection, IOracleConnection, oraconn)
+ then UpdateSQLForOracle(aChangeType, aDataset, aDelta, aDatasetStatement, oraconn, result);
+
+ // Events
+ if Assigned(fOnGenerateSQL) then
+ fOnGenerateSQL(Self, aChangeType, aDatasetStatement, aDelta, result)
+ else if Assigned(fBusinessRules) then
+ fBusinessRules.GenerateSQL(Self, aChangeType, aDatasetStatement, aDelta, result);
+
+ {$IFDEF DEBUG_DATAABSTRACT_SQL}DebugServer.Write([cat_SQL], Result);{$ENDIF}
+end;
+
+procedure TDABusinessProcessor.UpdateSQLForOracle(aChangeType: TDAChangeType;
+ aDataset: TDADataset;
+ const aDelta: IDADelta;
+ aDatasetStatement: TDAStatement;
+ aConnection: IOracleConnection;
+ var OriginalSQL: string);
+var i : integer;
+ returningstr, intostr : string;
+begin
+ returningstr := '';
+ intostr := '';
+
+ with aDataset do begin
+ for i := 0 to (Fields.Count-1) do begin
+
+ if not aDataset.Fields[i].LogChanges then Continue;
+
+ case Fields[i].BlobType of
+ dabtOraBlob : begin
+ OriginalSQL := StringReplace(OriginalSQL, ':'+Fields[i].Name, 'empty_blob()', [rfIgnoreCase])
+ end;
+
+ dabtOraClob : begin
+ OriginalSQL := StringReplace(OriginalSQL, ':'+Fields[i].Name, 'empty_clob()', [rfIgnoreCase])
+ end;
+
+ else Continue;
+ end;
+
+ returningstr := returningstr+Fields[i].Name+',';
+ intostr := intostr+':'+Fields[i].Name+',';
+ end;
+ end;
+
+ if (returningstr<>'') then begin
+ Delete(returningstr, Length(returningstr), 1);
+ returningstr := 'RETURNING '+#13#10+returningstr+#13#10;
+
+ Delete(intostr, Length(intostr), 1);
+ intostr := 'INTO '+#13#10+intostr;
+
+ OriginalSQL := OriginalSQL+#13#10+returningstr+intostr;
+ end;
+
+ {$IFDEF DEBUG_DATAABSTRACT_SQL}DebugServer.Write([cat_SQL], OriginalSQL);{$ENDIF}
+end;
+
+function TDABusinessProcessor.NeedsReferencedDataset: boolean;
+begin
+ result :=
+ (
+ ((poAutoGenerateInsert in fProcessorOptions) and (InsertCommandName = '')) or
+ ((poAutoGenerateUpdate in fProcessorOptions) and (UpdateCommandName = '')) or
+ ((poAutoGenerateDelete in fProcessorOptions) and (DeleteCommandName = '')) or
+ ((poAutoGenerateRefreshDataset in fProcessorOptions) and (RefreshDatasetName = ''))
+ );
+end;
+
+procedure TDABusinessProcessor.SetupParameters(const aCommand : IDASQLCommand;
+ aReferencedDataset : TDADataset; const aConnection: IDAConnection;AUnionMapping: TDAColumnMappingCollection);
+var lParams: TParams;
+ fldname: string;
+ i: integer;
+ par: TDAParam;
+ fld : TDAField;
+begin
+ lParams := TParams.Create;
+ try
+ Params_ParseSQL(lParams,aCommand.SQL, True, aConnection.GetQuoteChars);
+
+ with aCommand do begin
+ Params.Clear; // Just in case
+
+ for i := 0 to (lParams.Count - 1) do begin
+ fldname := lParams[i].Name;
+ if AUnionMapping <> nil then fldname := AUnionMapping.FindMappingByDatasetField(fldname).TableField;
+
+ // Checks if it's one of the autogenerated params
+ fld := aReferencedDataset.Fields.FindField(fldname);
+ if fld = nil then begin
+ if (Pos(MappingPrefix[mtOldValue], fldname)=1) then Delete(fldname, 1, Length(MappingPrefix[mtOldValue]));
+ fld := aReferencedDataset.Fields.FieldByName(fldname);
+ end;
+
+ {else if (Pos(MappingPrefix[mtNullCheck], fldname)=1)
+ then Delete(fldname, 1, Length(MappingPrefix[mtNullCheck]));}
+
+ // Looks up the field and completes the param definition
+
+ par := aCommand.Params.Add;
+ par.Name := lParams[i].Name;
+ par.DataType := fld.DataType;
+ par.BlobType := fld.BlobType;
+ par.ParamType := daptInput; // ODAC Blobs require it and this is not covered by AssignField below
+ {par.Size := fld.Size;
+ par.GeneratorName := fld.GeneratorName;}
+ par.AssignField(fld);
+ par.Name := lParams[i].Name; // Leave this here! Must override the Assign
+ end;
+ end;
+ finally
+ lParams.Free;
+ end;
+end;
+
+procedure TDABusinessProcessor.SetupCommands(const aConnection: IDAConnection; const aDelta: IDADelta;
+ out anInsertCmd, anUpdateCmd, anUpdateCMD_AutoInc, aDeleteCmd: IDASQLCommand; out aRefreshDs : IDADataset; out aTargetTable : string);
+var
+ sql: string;
+ refstmt: TDAStatement;
+ ds: TDADataset;
+ needsref: boolean;
+ i: integer;
+begin
+ anInsertCmd := nil;
+ aDeleteCmd := nil;
+ anUpdateCmd := nil;
+ ds := nil;
+ refstmt := nil;
+ CheckProperties;
+ // Looks for the referenced statement which contains field mappings and TargetTableName
+ // in case the user specifies any AutoGenerateXXX option
+ needsref := NeedsReferencedDataset;
+ if needsref then begin
+ ds := TDADataset(fSchema.Datasets.FindItem(fReferencedDataset));
+ if (ds <> nil) then begin
+ refstmt := fSchema.FindCommandStatement(aConnection,ds);
+// refstmt := TDAStatement(ds.Statements.FindItem(aConnection.Name));
+// if (refstmt = nil) then refstmt := ds.Statements.StatementByName(Schema.ConnectionManager.GetDefaultConnectionName);
+ end
+ else
+ RaiseError(Name + '''s referenced dataset is not speficied or does not exist. Cannot generate SQL');
+ end;
+
+
+ if refstmt <> nil then
+ aTargetTable := refstmt.TargetTable
+ else
+ aTargetTable := '';
+
+ for i:= 0 to aDelta.Count-1 do
+ if aDelta.Changes[i].ChangeType = ctInsert then begin
+ // Tries to locate the specified commands
+ if (fInsertCommandName <> '') then anInsertCmd := fSchema.NewCommand(aConnection, fInsertCommandName);
+ // Auto generates the SQL for the undefined commands
+ if (anInsertCmd = nil) and (poAutoGenerateInsert in fProcessorOptions) then begin
+ sql := GenerateSQL(ctInsert, nil, ds, aDelta, refstmt, aConnection);
+ anInsertCmd := aConnection.NewCommand(sql, stSQL);
+ SetupParameters(anInsertCmd, ds, aConnection);
+ end;
+ Break;
+ end;
+
+ for i:= 0 to aDelta.Count-1 do
+ if aDelta.Changes[i].ChangeType = ctUpdate then begin
+ // Tries to locate the specified commands
+ if (fUpdateCommandName <> '') then begin
+ anUpdateCmd := fSchema.NewCommand(aConnection, fUpdateCommandName);
+ anUpdateCMD_AutoInc := fSchema.NewCommand(aConnection, fUpdateCommandName);
+ end;
+ // Auto generates the SQL for the undefined commands
+ if (anUpdateCmd = nil) and (poAutoGenerateUpdate in fProcessorOptions) then begin
+ sql := GenerateSQL(ctUpdate, nil, ds, aDelta, refstmt, aConnection);
+ anUpdateCmd := aConnection.NewCommand(sql, stSQL);
+ SetupParameters(anUpdateCmd, ds, aConnection);
+
+ // update for autoInc
+ sql := GenerateSQL2(ctUpdate, nil, ds, aDelta, refstmt, aConnection,True);
+ anUpdateCMD_AutoInc := aConnection.NewCommand(sql, stSQL);
+ SetupParameters(anUpdateCMD_AutoInc, ds, aConnection);
+ end;
+ Break;
+ end;
+
+ for i:= 0 to aDelta.Count-1 do
+ if aDelta.Changes[i].ChangeType = ctDelete then begin
+ // Tries to locate the specified commands
+ if (fDeleteCommandName <> '') then aDeleteCmd := fSchema.NewCommand(aConnection, fDeleteCommandName);
+ // Auto generates the SQL for the undefined commands
+ if (aDeleteCmd = nil) and (poAutoGenerateDelete in fProcessorOptions) then begin
+ sql := GenerateSQL(ctDelete, nil, ds, aDelta, refstmt, aConnection);
+ aDeleteCmd := aConnection.NewCommand(sql, stSQL);
+ SetupParameters(aDeleteCmd, ds, aConnection);
+ end;
+ Break;
+ end;
+
+ if (fRefreshDataset <> '')
+ then aRefreshDs := fSchema.NewDataset(aConnection, fRefreshDataset,[],'','',False,True);
+
+ if (aRefreshDs = nil) and (poAutoGenerateRefreshDataset in fProcessorOptions) then begin
+ aRefreshDs := GenerateRefreshDataset(ds, aDelta, refstmt, aConnection);
+ if (aRefreshDs<>NIL) then SetupParameters(aRefreshDs, ds, aConnection);
+ end;
+
+ // Finally prepares them
+ if (poPrepareCommands in fProcessorOptions) then begin
+ if (anInsertCmd <> nil) then anInsertCmd.Prepared := TRUE;
+ if (anUpdateCmd <> nil) then anUpdateCmd.Prepared := TRUE;
+ if (anUpdateCmd_AutoInc <> nil) then anUpdateCMD_AutoInc.Prepared := TRUE;
+ if (aDeleteCmd <> nil) then aDeleteCmd.Prepared := TRUE;
+ if (aRefreshDs <> NIL) then aRefreshDs.Prepared := TRUE;
+ end;
+end;
+
+function TDABusinessProcessor.GetCurrentChange: TDADeltaChange;
+begin
+ result := fCurrentDelta.Changes[fCurrentChange]
+end;
+
+const
+ lDynWhereParamPrefix = 'dynwhere';
+
+procedure TDABusinessProcessor.RefreshDeltaChange(const aConnection : IDAConnection;
+ const aRefreshDataset : IDADataset; const aDelta : IDADelta; aDeltaChange : TDADeltaChange; GenAutoIncValue : variant);
+var i : integer;
+ par : TDAParam;
+ nam: string;
+ val : Variant;
+ fld: TDAField;
+// genname : string;
+begin
+ if VarIsNull(GenAutoIncValue) or VarIsEmpty(GenAutoIncValue) then GenAutoIncValue := -1;
+
+ // Sets the parameters of the dataset
+ for i := 0 to aRefreshDataset.Params.Count-1 do begin
+ par := aRefreshDataset.Params[i];
+
+ if (aDelta.IndexOfLoggedField(par.Name) < 0) then Continue;
+ val := aDeltaChange.NewValueByName[par.Name];
+
+ if (aDeltaChange.ChangeType=ctInsert) then
+ if par.DataType in [datAutoInc, datLargeAutoInc] then begin
+ if (GenAutoIncValue<>-1) then
+ val := GenAutoIncValue
+ else
+ val := aConnection.GetLastAutoIncValue(par.GeneratorName);
+ end;
+
+ par.Value := val;
+ end;
+
+ if FDynamicWhereInRefreshDataset then
+ for i := 0 to aDelta.KeyFieldCount - 1 do begin
+ par := aRefreshDataset.ParamByName(lDynWhereParamPrefix+intToStr(i));
+ par.Value := aDeltaChange.NewValueByName[aDelta.KeyFieldNames[i]];
+
+ if (aDeltaChange.ChangeType=ctInsert) then
+ if par.DataType in [datAutoInc, datLargeAutoInc] then
+ if (GenAutoIncValue<>-1) then
+ par.Value := GenAutoIncValue
+ else
+ par.Value := aConnection.GetLastAutoIncValue(par.GeneratorName);
+ end;
+ if Assigned(fOnRefreshDeltaChange) then
+ fOnRefreshDeltaChange(Self, aDeltaChange.ChangeType, aDeltaChange, aRefreshDataset);
+
+ // Opens the dataset
+ aRefreshDataset.Open;
+ try
+{ if (aRefreshDataset.EOF) and (GenAutoIncValue <> -1) then begin
+ // user can rewrite value in trigger new new value
+ aRefreshDataset.Close;
+ For i:= 0 to aRefreshDataset.Params.Count -1 do
+ with aRefreshDataset.Params[i] do begin
+ if (DataType in [datAutoInc, datLargeAutoInc]) and (Value = GenAutoIncValue) then begin
+ Value := aConnection.GetLastAutoIncValue(GeneratorName);
+ end;
+ end;
+ aRefreshDataset.Open;
+ end;}
+ if (aRefreshDataset.EOF) then raise Exception.Create('Can''t refresh delta, record isn''t found');
+ case aDeltaChange.ChangeType of
+ ctUpdate : begin
+ // ctUpdate:
+ // Leaves the old values alone because they are needed on the client
+ // for merge purposes. This could probabily be optimized
+ for I := 0 to aDelta.LoggedFieldCount - 1 do begin
+ nam := aDelta.LoggedFieldNames[i];
+ fld := aRefreshDataset.FindField(nam);
+ if fld = nil then Continue;
+ aDeltaChange.OldValueByName[nam] := aDeltaChange.NewValueByName[nam];
+ aDeltaChange.NewValueByName[nam] := fld.Value;
+ end;
+ end;
+ ctInsert : begin
+ for I := 0 to aDelta.LoggedFieldCount - 1 do begin
+ nam := aDelta.LoggedFieldNames[i];
+ fld := aRefreshDataset.FindField(nam);
+ if fld = nil then Continue;
+// aDeltaChange.OldValueByName[nam] := aDeltaChange.NewValueByName[nam];// for compartibility with .net
+ aDeltaChange.NewValueByName[nam] := fld.Value;
+ end;
+ end;
+ end;
+ finally
+ aRefreshDataset.Close;
+ end;
+end;
+
+procedure TDABusinessProcessor.SynchronizeAutoIncs(const aMasterDelta, aDetailDelta : IDADelta;
+ const aRelationship : TDADatasetRelationship);
+var x, k, z: integer;
+ masterds : TDADataset;
+ masterfields, detailfields : TStringList;
+ oldmasterval, masterval, detailval : Variant;
+begin
+ CheckProperties;
+ masterfields := TStringList.Create;
+ masterfields.Delimiter := ';';
+
+ detailfields := TStringList.Create;
+ detailfields.Delimiter := ';';
+
+ try
+ masterds := Schema.Datasets.DatasetByName(aMasterDelta.LogicalName);
+
+ masterfields.DelimitedText := aRelationship.MasterFields;
+ detailfields.DelimitedText := aRelationship.DetailFields;
+
+ for x := 0 to (aMasterDelta.Count-1) do begin
+ if not (aMasterDelta[x].Status=csResolved) then Continue;
+
+ for k := 0 to (masterfields.Count-1) do begin
+ if not (masterds.FieldByName(masterfields[k]).DataType in [datAutoInc, datLargeAutoInc, datInteger, datLargeInt]) then Continue;
+
+ masterval := aMasterDelta[x].NewValueByName[masterfields[k]];
+ oldmasterval := aMasterDelta[x].OldValueByName[masterfields[k]];
+
+ for z := 0 to (aDetailDelta.Count-1) do begin
+ if not (aDetailDelta[z].ChangeType in [ctInsert,ctUpdate]) then Continue;
+
+ detailval := aDetailDelta[z].NewValueByName[detailfields[k]];
+ if (detailval<>oldmasterval) then Continue;
+
+ aDetailDelta[z].NewValueByName[detailfields[k]] := masterval;
+ aDetailDelta[z].RefreshedByServer := TRUE;
+ end;
+ end;
+ end;
+ finally
+ masterfields.Free;
+ detailfields.Free;
+ end;
+end;
+
+procedure TDABusinessProcessor.ProcessDelta(const aConnection: IDAConnection;
+ const aDelta: IDADelta;
+ ChangeTypes: TDAChangeTypes = AllChanges;
+ ADeltaStruct : TDADeltaStruct = nil);
+var
+ i, x, rowsaffected, z: integer;
+ canremove, ok: boolean;
+ currcmd, inscmd, delcmd, updcmd, updcmd_AutoInc: IDASQLCommand;
+ refds : IDADataset;
+ insmap, delmap, updmap, refmap, updmap_AutoInc: TDAParamMappingArray;
+ mapptr: ^TDAParamMappingArray;
+ change: TDADeltaChange;
+ todelete: TList;
+ val : variant;
+ parname : string;
+ autoincvalue: variant;
+ usegenerators,usegenerators2 : boolean;
+ lexpr: TDAWhereExpression;
+ lTargetTable: string;
+ lAutoIncFld: integer;
+ lbool: boolean;
+begin
+ Check(not Assigned(aDelta), 'Cannot process a NIL delta');
+ if (aDelta.Count=0) then Exit;
+
+ if Assigned(fSchema.UnionDataTables.FindItem(fReferencedDataset)) then begin
+ ProcessDeltaForUnion(aConnection, aDelta, ChangeTypes, ADeltaStruct);
+ exit;
+ end;
+
+ fCurrentDelta := aDelta.GetDelta;
+ fCurrentChange := 0;
+
+ usegenerators := Supports(aConnection, IDAUseGenerators);
+ usegenerators2 := Supports(aConnection, IDAUseGenerators2);
+
+ // detect AutoInc fld
+ lAutoIncFld := -1;
+ for i := 0 to aDelta.LoggedFieldCount - 1 do begin
+ if aDelta.LoggedFieldTypes[i] in [datAutoInc, datLargeAutoInc] then begin
+ lAutoIncFld := i;
+ break;
+ end;
+ end;
+
+
+ // Fires the "before" events
+ if Assigned(fOnBeforeProcessDelta)
+ then fOnBeforeProcessDelta(Self, aDelta)
+
+ else if Assigned(fBusinessRules)
+ then fBusinessRules.BeforeProcessDelta(Self, aDelta);
+
+ // Prepares the commands
+ if not fHasReducedDelta then begin
+ SetupCommands(aConnection, aDelta, inscmd, updcmd, updcmd_AutoInc, delcmd, refds, lTargetTable);
+
+ CreateMappings(aDelta, insmap, inscmd, nil, True);
+ CreateMappings(aDelta, updmap, updcmd, nil, True);
+ CreateMappings(aDelta, updmap_AutoInc, updcmd_AutoInc, nil, True);
+ CreateMappings(aDelta, delmap, delcmd, nil, True);
+ CreateMappings(aDelta, refmap, refds);
+
+ FDynamicWhereInRefreshDataset:=False;
+ // dynwhere
+ if (refds <> nil) and refds.SQLContainsDynamicWhere then begin
+ FDynamicWhereInRefreshDataset := True;
+ refds.DynamicWhere.Expression:=nil;
+ for i := 0 to aDelta.KeyFieldCount - 1 do begin
+ with refds.Params.Add do begin
+ ParamType:=daptInput;
+ DataType := refds.FieldByName(aDelta.KeyFieldNames[i]).DataType;
+ Name:=lDynWhereParamPrefix+IntToStr(i);
+ end;
+ with refds.DynamicWhere do begin
+ lexpr:= NewBinaryExpression(NewField('',aDelta.KeyFieldNames[i]),NewParameter(lDynWhereParamPrefix+IntToStr(i)),dboEqual);
+ if Expression = nil then
+ Expression := lexpr
+ else
+ Expression:= NewBinaryExpression(Expression,lexpr,dboEqual);
+ end;
+ end;
+ end;
+ end;
+ // Processes the delta
+ todelete := TList.Create;
+ try
+ for i := 0 to (aDelta.Count - 1) do begin
+ change := aDelta[i];
+ fCurrentChange := i; // Do NOT remove!!!
+ canremove := false;
+ autoincvalue := -1;
+
+ try
+ ok := change.ChangeType in ChangeTypes; // Filters
+
+
+ // Even if there might not be a command associated, the user might want to do something with this
+ // We just give an override chance here
+ if Assigned(fOnBeforeProcessChange) then
+ fOnBeforeProcessChange(Self, change.ChangeType, aDelta[i], ok)
+
+ else if Assigned(fBusinessRules) then
+ fBusinessRules.BeforeProcessChange(Self, change.ChangeType, aDelta[i], ok);
+
+ if ok then begin
+ // Selects the right command
+ mapptr := nil;
+ if not fHasReducedDelta then begin
+ case change.ChangeType of
+ ctInsert: begin
+ currcmd := inscmd;
+ mapptr := @insmap;
+ end;
+ ctUpdate: begin
+ // lBool = Allow updating datAutoInc
+ if (lAutoIncFld <> -1) then lBool := (change.OldValues[lAutoIncFld] <> change.NewValues[lAutoIncFld]) else lBool := False;
+ if lBool then begin
+ currcmd := updcmd_AutoInc;
+ mapptr := @updmap_AutoInc;
+ end
+ else begin
+ currcmd := updcmd;
+ mapptr := @updmap;
+ end;
+ end;
+ ctDelete: begin
+ currcmd := delcmd;
+ mapptr := @delmap;
+ end;
+ end;
+
+ end else begin
+ // lBool = generate update datAutoinc in update statement
+ if (lAutoIncFld <> -1) then lBool := (change.OldValues[lAutoIncFld] <> change.NewValues[lAutoIncFld]) else lBool := False;
+ SetupCommands(aConnection, Change, currCmd, lTargetTable, lBool);
+ if currCmd <> nil then begin
+ CreateMappings(aDelta, insmap, currCmd, nil, True);
+ mapptr := @insmap;
+ refds := SetupRefreshDatasetForReducedDelta(aConnection, aDelta);
+ CreateMappings(aDelta, refmap, refds);
+ end;
+ end;
+ // Assigns the values of the current change
+ if (currcmd <> nil) then
+ for x := 0 to (currcmd.Params.Count - 1) do
+ if (mapptr^[x].DeltaIndex >= 0) then begin
+ val := null;// fix for "Invalid Variant Type" exception in Win2000
+ case mapptr^[x].MappingType of
+ mtOldValue: val := change.OldValues[mapptr^[x].DeltaIndex];
+ else val := change.NewValues[mapptr^[x].DeltaIndex];
+ end;
+
+ if (currcmd.Params[x].DataType in [datAutoinc, datLargeAutoInc]) and (usegenerators or usegenerators2) and (change.ChangeType=ctInsert) and (mapptr^[x].MappingType=mtNewValue) then begin
+ // Gets the next generator values from the DB. This is for DBs such as IB or Oracle which lack autoinc fields
+ if (autoincvalue<>-1) then raise Exception.Create('Multiple auto incremental fields not supported');
+ parname := currcmd.Params[x].Name;
+ change.OldValueByName[parname] := val;
+ if usegenerators2 then
+ autoincvalue := (aConnection as IDAUseGenerators2).GetNextAutoinc2(currcmd.Params[x].GeneratorName)
+ else
+ autoincvalue := (aConnection as IDAUseGenerators).GetNextAutoinc(currcmd.Params[x].GeneratorName);
+ currcmd.Params[x].Value := autoincvalue;
+ change.RefreshedByServer := TRUE;
+ if not Assigned(refds) then begin
+ change.NewValueByName[parname] := autoincvalue;
+ end;
+ end
+ else currcmd.Params[x].Value := val;
+ end;
+
+ // Gives the user a chance to modify it before execution
+ if Assigned(fOnProcessChange) then
+ fOnProcessChange(Self, change.ChangeType, change, currcmd)
+ else if Assigned(fBusinessRules) then
+ fBusinessRules.ProcessChange(Self, change.ChangeType, change, currcmd);
+
+ // Executes it
+ if (currcmd <> nil)
+ then rowsaffected := currcmd.Execute
+ else rowsaffected := 0;
+
+ canremove := FALSE;
+
+ // IBX returns -1 even if updates are successful! This started to happen after I plugged the GetNextAutoinc call above.
+ // If records fail, an exception is usually generated so this check for <>0 should be sufficient for all cases...
+ // DO NOT CHANGE this to >0 !!!!
+ if (rowsaffected<>0) or (poIgnoreRowsAffected in fProcessorOptions) then begin
+ if (change.ChangeType<>ctDelete) and (refds<>NIL) then begin
+ RefreshDeltaChange(aConnection, refds, aDelta, change, autoincvalue);
+ change.RefreshedByServer := TRUE;
+ end;
+
+ canremove := not change.RefreshedByServer;
+ change.Status := csResolved;
+ if (ADeltaStruct <> nil) and (change.ChangeType in [ctInsert, ctUpdate]) and (lTargetTable <> '') then begin
+ for z:=0 to ADeltaStruct.RelationShips.Count - 1 do
+ if aDelta.LogicalName = ADeltaStruct.RelationShips[z].DetailDatasetName then
+ SynchronizeAutoIncs(aDelta,ADeltaStruct.fDetailDeltas[z], ADeltaStruct.RelationShips[z]);
+ end;
+ end
+ else begin
+ if fHasReducedDelta and (currcmd = nil) then begin
+ // no data for operations, i.e. oldvalues[] = newvalues[]
+ canremove := True;
+ change.Status := csResolved;
+ end
+ else begin
+ canremove := FALSE;
+ change.Status := csFailed;
+ change.Message := 'No rows were affected by this update';
+ end;
+ end;
+
+ // After processing gives the user a last chance to update the change and
+ // optionally set it so that it goes back to the client (i.e. updated values)
+ if Assigned(fOnAfterProcessChange)
+ then fOnAfterProcessChange(Self, change, ok, canremove)
+
+ else if Assigned(fBusinessRules)
+ then fBusinessRules.AfterProcessChange(Self, change, ok, canremove)
+ end;
+
+ except
+ on E: Exception do begin
+ change.Status := csFailed;
+ change.Message := E.Message;
+ canremove := FALSE;
+
+ if Assigned(fOnProcessError) then
+ fOnProcessError(Self, change.ChangeType, change, currcmd, canremove, E)
+ else if Assigned(fBusinessRules) then begin
+ fBusinessRules.ProcessError(Self, change.ChangeType, change, currcmd, canremove, E);
+ if FRaiseExceptionAtError then raise;
+ end
+ else if FRaiseExceptionAtError then begin
+ raise EDAApplyUpdateFailed.Create(change, E);
+ end;
+ end;
+ end;
+
+ if canremove then todelete.Add(change);
+ end;
+
+ for i := 0 to todelete.Count - 1 do
+ aDelta.RemoveChange(TDADeltaChange(todelete[i]));
+
+ if Assigned(fOnAfterProcessDelta) then
+ fOnAfterProcessDelta(Self, aDelta)
+ else if Assigned(fBusinessRules) then
+ fBusinessRules.AfterProcessDelta(Self, aDelta)
+
+ finally
+ todelete.Free;
+ end;
+end;
+
+procedure TDABusinessProcessor.SetDeleteCommandName(const Value: string);
+begin
+ if fDeleteCommandName <> Trim(Value) then begin
+ fDeleteCommandName := Trim(Value);
+ if fDeleteCommandName <> '' then
+ fProcessorOptions := fProcessorOptions - [poAutoGenerateDelete]
+ else
+ fProcessorOptions := fProcessorOptions + [poAutoGenerateDelete];
+ end;
+end;
+
+procedure TDABusinessProcessor.SetInsertCommandName(const Value: string);
+begin
+ if fInsertCommandName <> Trim(Value) then begin
+ fInsertCommandName := Trim(Value);
+ if fInsertCommandName <> '' then
+ fProcessorOptions := fProcessorOptions - [poAutoGenerateInsert]
+ else
+ fProcessorOptions := fProcessorOptions + [poAutoGenerateInsert];
+ end;
+end;
+
+procedure TDABusinessProcessor.SetUpdateCommandName(const Value: string);
+begin
+ if fUpdateCommandName <> Trim(Value) then begin
+ fUpdateCommandName := Trim(Value);
+ if fUpdateCommandName <> '' then
+ fProcessorOptions := fProcessorOptions - [poAutoGenerateUpdate]
+ else
+ fProcessorOptions := fProcessorOptions + [poAutoGenerateUpdate];
+ end;
+end;
+
+procedure TDABusinessProcessor.SetSchema(const Value: TDASchema);
+begin
+ if fSchema <> Value then begin
+ if (fSchema <> nil) then fSchema.RORemoveFreeNotification(Self);
+ fSchema := Value;
+ if (fSchema <> nil) then fSchema.ROFreeNotification(Self);
+ end;
+end;
+
+procedure TDABusinessProcessor.SetReferencedDataset(const Value: string);
+begin
+ fReferencedDataset := Value;
+end;
+
+procedure TDABusinessProcessor.ProcessDelta(aDataTable: TDADataTable;
+ ChangeTypes: TDAChangeTypes; const aConnection : IDAConnection = NIL; ADeltaStruct : TDADeltaStruct = nil);
+var
+ conn: IDAConnection;
+begin
+ with aDataTable do begin
+ Check(LocalSchema = nil, 'Datatable doesn''t reference any schema');
+ Check(LocalSchema.ConnectionManager = nil, 'Datatable''s schema doesn''t reference a connection manager');
+
+ if aConnection<>NIL
+ then conn := aConnection
+ else conn := LocalSchema.ConnectionManager.NewConnection(LocalConnection);
+
+ ProcessDelta(conn, aDataTable.Delta, ChangeTypes, ADeltaStruct);
+ end;
+end;
+
+function TDABusinessProcessor.QueryInterface(const IID: TGUID; out Obj): HResult;
+begin
+ result := inherited QueryInterface(IID, Obj);
+
+ if (result <> S_OK) and Assigned(fBusinessRules) then begin
+ // Users might introduce specific interfaces at the business rule level
+ // This allows to type cast the data table to any additional business oriented interface
+ // they decide to create.
+ result := fBusinessRules.QueryInterface(IID, Obj);
+ end;
+end;
+
+procedure TDABusinessProcessor.SetBusinessRulesID(const Value: string);
+var
+ bizclass: TDABusinessProcessorRulesClass;
+begin
+ if (Value = fBusinessRulesID) then Exit;
+
+ if Assigned(fBusinessRules) then begin
+ fBusinessRules.Detach(Self);
+ FreeAndNIL(fBusinessRules);
+ end;
+
+ fBusinessRulesID := Trim(Value);
+
+ if (fBusinessRulesID <> '') and not (csDesigning in ComponentState) then begin
+ Check(not FindBusinessProcessorRules(Value, bizclass), Name+'. Invalid BusinessRulesID "%s"', [Value]);
+
+ fBusinessRules := bizclass.Create(Self);
+ fBusinessRules.Attach(Self);
+ end;
+end;
+
+procedure TDABusinessProcessor.SetRefreshDataset(const Value: string);
+begin
+ if fRefreshDataset <> Trim(Value) then begin
+ fRefreshDataset := Trim(Value);
+ if fRefreshDataset <> '' then
+ fProcessorOptions := fProcessorOptions - [poAutoGenerateRefreshDataset]
+ else
+ fProcessorOptions := fProcessorOptions + [poAutoGenerateRefreshDataset];
+ end;
+end;
+
+procedure TDABusinessProcessor.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited;
+ if (Operation = opRemove) then begin
+ if (AComponent = fSchema) then fSchema := nil;
+ end;
+end;
+
+procedure TDABusinessProcessor.Assign(Source: TPersistent);
+var
+ lSource: TDABusinessProcessor;
+begin
+ inherited;
+ if Source is TDABusinessProcessor then begin
+ lSource := TDABusinessProcessor(Source);
+
+ BusinessRulesID := lSource.BusinessRulesID;
+ DeleteCommandName := lSource.DeleteCommandName;
+ InsertCommandName := lSource.InsertCommandName;
+ OnAfterProcessChange := lSource.OnAfterProcessChange;
+ OnAfterProcessDelta := lSource.OnAfterProcessDelta;
+ OnBeforeProcessChange := lSource.OnBeforeProcessChange;
+ OnBeforeProcessDelta := lSource.OnBeforeProcessDelta;
+ OnGenerateSQL := lSource.OnGenerateSQL;
+ OnProcessChange := lSource.OnProcessChange;
+ OnProcessError := lSource.OnProcessError;
+ OnRefreshDeltaChange := lSource.OnRefreshDeltaChange;
+ ProcessorOptions := lSource.ProcessorOptions;
+ RaiseExceptionAtError := lSource.RaiseExceptionAtError;
+ ReferencedDataset := lSource.ReferencedDataset;
+ RefreshDatasetName := lSource.RefreshDatasetName;
+ Schema := lSource.Schema;
+ UpdateCommandName := lSource.UpdateCommandName;
+ UpdateMode := lSource.UpdateMode;
+ UserUpdateFields := lSource.UserUpdateFields;
+ end;
+end;
+
+procedure TDABusinessProcessor.CheckProperties;
+begin
+ Check(Schema = nil, Name + '.Schema must be assinged.');
+end;
+
+procedure TDABusinessProcessor.SetupCommandsWithMapping(
+ const aConnection: IDAConnection;
+ const aChange: TDADeltaChange;
+ out anCmd: IDASQLCommand;
+ out aParamMapping: TDAParamMappingArray;
+ out aRefreshDs: IDADataset;
+ out aTargetTable : string;
+ aUseAutoIncUpdate: Boolean=False);
+var
+ lSql: string;
+ lDataset: TDADataset;
+ lRefStatement: TDAStatement;
+ lUnionTable: TDAUnionDataTable;
+ lVar: Variant;
+
+ lSourceTableIdx: Integer;
+ lUnionSourceTable : TDAUnionSourceTable;
+ lSourceTable : TDADataset;
+ lSourceTableName: String;
+ lSourceTableMapping: TDAColumnMappingCollection;
+ lConnection: IDAConnection;
+begin
+ anCmd := nil;
+ lRefStatement := nil;
+ lSourceTableMapping := nil;
+ aRefreshDs := nil;
+ CheckProperties;
+ lDataset := TDADataset(fSchema.FindDataset(fReferencedDataset));
+
+ // If Union table ...
+ if lDataset is TDAUnionDataTable then begin
+ lUnionTable := TDAUnionDataTable(lDataset);
+ if aChange.ChangeType = ctDelete then
+ lVar := aChange.oldValueByName[def_SourceTableFieldName]
+ else
+ lVar := aChange.NewValueByName[def_SourceTableFieldName];
+ if (VarIsNull(lVar)) then begin
+ lSourceTableName := lUnionTable.DefaultSourceTable;
+ lUnionSourceTable := TDAUnionSourceTable(lUnionTable.SourceTables.ItemByName(lSourceTableName));
+ end
+ else begin
+ lSourceTableIdx := lVar;
+ lUnionSourceTable := lUnionTable.SourceTables[lSourceTableIdx];
+ lSourceTableName := lUnionSourceTable.Name;
+ end;
+
+ // check do we have rights to change this table
+ if lUnionSourceTable.IsReadOnly then
+ raise EDAException.Create(Format('Union source table "%s" is read-only', [lSourceTableName]));
+ //------------------------------------------------------------------
+ lConnection := GetConnectionForObject(aConnection, lSourceTableName);
+
+ lSourceTableMapping := lUnionSourceTable.ColumnMappings;
+
+ lSourceTable := TDADataset(fSchema.Datasets.FindItem(lSourceTableName));
+ if Assigned(lSourceTable) then begin
+
+ lDataset := lSourceTable;
+
+ lRefStatement := lSourceTable.Statements.FindItem(lConnection.Name, '', lConnection.ConnectionType, True);
+ if (lRefStatement = nil) then lRefStatement := lSourceTable.Statements.StatementByName(Schema.ConnectionManager.GetDefaultConnectionName);
+ if lRefStatement <> nil then begin
+ // Assemble Refresh dataset ...
+ if (fRefreshDataset <> '') then aRefreshDs := fSchema.NewDataset(lConnection, fRefreshDataset, [], [], FALSE);
+
+ if (aRefreshDs = nil) and (poAutoGenerateRefreshDataset in fProcessorOptions) then begin
+ aRefreshDs := GenerateRefreshDataset(lSourceTable, lConnection, lRefStatement.TargetTable, lRefStatement.ColumnMappings, lSourceTableMapping);
+ if (aRefreshDs <> NIL) then begin
+ aRefreshDs.LogicalName := lSourceTableName;
+ SetupParameters(aRefreshDs, lSourceTable, lConnection, lSourceTableMapping);
+ end;
+ end;
+ if Assigned(aRefreshDs) then aRefreshDs.Prepared := True;
+ end;
+ end;
+ end
+ else begin
+ lConnection := aConnection;
+ if lDataset is TDADataset then begin // If plain table ...
+ lRefStatement := TDAStatement(lDataset.Statements.FindItem(aConnection.Name));
+ if (lRefStatement = nil) then lRefStatement := lDataset.Statements.StatementByName(Schema.ConnectionManager.GetDefaultConnectionName);
+ aRefreshDs := SetupRefreshDatasetForReducedDelta(lConnection,aChange.Delta);
+ end
+ else begin // If no dataset found
+ RaiseError(Name + '''s referenced dataset is not speficied or does not exist. Cannot generate SQL');
+ end;
+ end;
+
+ if lRefStatement <> nil then
+ aTargetTable := lRefStatement.TargetTable
+ else
+ aTargetTable := '';
+ lSql := GenerateSQL2(aChange.ChangeType, aChange, lDataset, aChange.Delta, lRefStatement, lConnection,aUseAutoIncUpdate);
+ if lSql <> '' then begin
+ anCmd := lConnection.NewCommand(lSql, stSQL);
+ SetupParameters(anCmd, lDataset, aConnection);
+ if anCmd <> nil then anCmd.Prepared:=True;
+ CreateMappings(aChange.Delta, aParamMapping, anCmd, lSourceTableMapping, True);
+ end;
+end;
+
+procedure TDABusinessProcessor.SetupCommands(
+ const aConnection: IDAConnection; const aChange: TDADeltaChange;
+ out anCmd: IDASQLCommand; out aTargetTable : string;aUseAutoIncUpdate: Boolean=False);
+var
+ sql: string;
+ ds: TDADataset;
+ refstmt: TDAStatement;
+begin
+ anCmd:=nil;
+ refstmt := nil;
+ CheckProperties;
+ ds := TDADataset(fSchema.Datasets.FindItem(fReferencedDataset));
+ if (ds <> nil) then begin
+ refstmt := fSchema.FindCommandStatement(aConnection,ds,aConnection.Name);
+// refstmt := TDAStatement(ds.Statements.FindItem(aConnection.Name));
+// if (refstmt = nil) then refstmt := ds.Statements.StatementByName(Schema.ConnectionManager.GetDefaultConnectionName);
+ end
+ else
+ RaiseError(Name + '''s referenced dataset is not speficied or does not exist. Cannot generate SQL');
+ if refstmt <> nil then
+ aTargetTable := refstmt.TargetTable
+ else
+ aTargetTable := '';
+ sql := GenerateSQL2(aChange.ChangeType, aChange, ds,aChange.Delta ,refstmt, aConnection,aUseAutoIncUpdate);
+ if sql <> '' then begin
+ anCmd := aConnection.NewCommand(sql, stSQL);
+ SetupParameters(anCmd, ds, aConnection);
+ if anCmd <> nil then anCmd.Prepared:=True;
+ end;
+end;
+
+
+
+function TDABusinessProcessor.SetupRefreshDatasetForReducedDelta(
+ const aConnection: IDAConnection; const aDelta: IDADelta): IDADataset;
+var
+ ds: TDADataset;
+begin
+ Result := nil;
+ if (fRefreshDataset <> '') then Result := fSchema.NewDataset(aConnection, fRefreshDataset,[],'','',False,True);
+ if (Result = nil) and (poAutoGenerateRefreshDataset in fProcessorOptions) then begin
+ ds := TDADataset(fSchema.Datasets.FindItem(fReferencedDataset));
+ if (ds <> nil) then begin
+ Result := GenerateRefreshDataset(ds, aDelta, fSchema.FindCommandStatement(aConnection,ds), aConnection);
+ if (Result<>NIL) then SetupParameters(Result, ds, aConnection);
+ end
+ else begin
+ RaiseError(Name + '''s referenced dataset is not speficied or does not exist. Cannot generate SQL');
+ end;
+ end;
+ // Finally prepares them
+ if (poPrepareCommands in fProcessorOptions) and (Result <> NIL) then Result.Prepared := TRUE;
+end;
+
+procedure TDABusinessProcessor.SetProcessorOptions(
+ const Value: TDAProcessorOptions);
+begin
+ fProcessorOptions := Value;
+ if csLoading in ComponentState then begin
+ if fInsertCommandName <> '' then fProcessorOptions:= fProcessorOptions - [poAutoGenerateInsert];
+ if fUpdateCommandName <> '' then fProcessorOptions:= fProcessorOptions - [poAutoGenerateUpdate];
+ if fDeleteCommandName <> '' then fProcessorOptions:= fProcessorOptions - [poAutoGenerateDelete];
+ if fRefreshDataset <> '' then fProcessorOptions:= fProcessorOptions - [poAutoGenerateRefreshDataset];
+ end
+ else begin
+ if poAutoGenerateInsert in fProcessorOptions then fInsertCommandName :='';
+ if poAutoGenerateUpdate in fProcessorOptions then fUpdateCommandName :='';
+ if poAutoGenerateDelete in fProcessorOptions then fDeleteCommandName :='';
+ if poAutoGenerateRefreshDataset in fProcessorOptions then fRefreshDataset :='';
+ end;
+end;
+
+function TDABusinessProcessor.GenerateRefreshDataset(aDataset: TDADataset;
+ const aDelta: IDADelta; aDatasetStatement: TDAStatement;
+ aConnection: IDAConnection): IDADataset;
+begin
+ Result := GenerateRefreshDataset(aDataset,aConnection,aDatasetStatement.TargetTable,aDatasetStatement.ColumnMappings, nil);
+end;
+
+{ TDABusinessProcessorRules }
+
+procedure TDABusinessProcessorRules.Attach(
+ aBusinessProcessor: TDABusinessProcessor);
+begin
+
+end;
+
+constructor TDABusinessProcessorRules.Create(aBusinessProcessor: TDABusinessProcessor);
+begin
+ inherited Create;
+ fBusinessProcessor := aBusinessProcessor;
+end;
+
+procedure TDABusinessProcessorRules.Detach(
+ aBusinessProcessor: TDABusinessProcessor);
+begin
+
+end;
+
+procedure TDABusinessProcessorRules.AfterProcessChange(
+ Sender: TDABusinessProcessor; aChange: TDADeltaChange;
+ Processed: boolean; var CanRemoveFromDelta: boolean);
+begin
+
+end;
+
+procedure TDABusinessProcessorRules.AfterProcessDelta(
+ Sender: TDABusinessProcessor; const aDelta: IDADelta);
+begin
+
+end;
+
+procedure TDABusinessProcessorRules.BeforeProcessChange(
+ Sender: TDABusinessProcessor; aChangeType: TDAChangeType;
+ aChange: TDADeltaChange; var ProcessChange: boolean);
+begin
+
+end;
+
+procedure TDABusinessProcessorRules.BeforeProcessDelta(
+ Sender: TDABusinessProcessor; const aDelta: IDADelta);
+begin
+
+end;
+
+procedure TDABusinessProcessorRules.GenerateSQL(
+ Sender: TDABusinessProcessor; ChangeType: TDAChangeType;
+ const ReferencedStatement: TDAStatement; const aDelta: IDADelta;
+ var SQL: string);
+begin
+
+end;
+
+procedure TDABusinessProcessorRules.ProcessChange(
+ Sender: TDABusinessProcessor; aChangeType: TDAChangeType;
+ aChange: TDADeltaChange; const aCommand: IDASQLCommand);
+begin
+
+end;
+
+procedure TDABusinessProcessorRules.ProcessError(
+ Sender: TDABusinessProcessor; aChangeType: TDAChangeType;
+ aChange: TDADeltaChange; const aCommand: IDASQLCommand;
+ var CanRemoveFromDelta: boolean; Error: Exception);
+begin
+ if Assigned(Error) then
+ raise Exception(Error.NewInstance).Create(Error.Message)
+ else
+ raise Exception.Create('Unknown error');
+end;
+
+//----------
+
+procedure TDABusinessProcessorRules.NotSupportedByBusinessProcessor;
+begin
+ RaiseError('This method is not supported on the Business Processor Rule, but only on the client.');
+end;
+
+procedure TDABusinessProcessorRules.Append;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.Cancel;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.Delete;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.Edit;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.First;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.GetBOF: Boolean;
+begin
+ result := false; { to avoid warning; }
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.GetEOF: Boolean;
+begin
+ result := false; { to avoid warning; }
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.GetRecordCount: Integer;
+begin
+ result := -1; { to avoid warning; }
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.Insert;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.Last;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.Locate(const aKeyFields: String; const aKeyValues: Variant; aOptions: TLocateOptions): Boolean;
+begin
+ result := false; { to avoid warning; }
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.Next;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.Post;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.Prior;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.GetDetailOptions: TDADetailOptions;
+begin
+ result := []
+end;
+
+function TDABusinessProcessorRules.GetMasterOptions: TDAMasterOptions;
+begin
+ result := []
+end;
+
+procedure TDABusinessProcessorRules.SetDetailOptions(
+ Value: TDADetailOptions);
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.SetMasterOptions(
+ Value: TDAMasterOptions);
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.GetRecNo: integer;
+begin
+ result := -1; { to avoid warning; }
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.SetRecNo(Value: integer);
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.GetIsEmpty: boolean;
+begin
+ result := FALSE;
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.GetState: TDatasetState;
+begin
+ result := dsBrowse
+end;
+
+function TDABusinessProcessorRules.Lookup(const KeyFields: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ Result:=Null;
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.ClearField(
+ const FieldIndexOrName: Variant);
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.IsFieldNull(
+ const FieldIndexOrName: Variant): boolean;
+begin
+ result := FALSE;
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.GetDataTable: TDADataTable;
+begin
+ result := NIL;
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.Close;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessorRules.Open;
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+function TDABusinessProcessorRules.GetActive: boolean;
+begin
+ NotSupportedByBusinessProcessor();
+ result:=FALSE
+end;
+
+procedure TDABusinessProcessorRules.SetActive(const Value: boolean);
+begin
+ NotSupportedByBusinessProcessor();
+end;
+
+procedure TDABusinessProcessor.ProcessDeltaForUnion(const aConnection: IDAConnection;
+ const aDelta: IDADelta;
+ ChangeTypes: TDAChangeTypes = AllChanges;
+ ADeltaStruct : TDADeltaStruct = nil);
+var
+ i, x, rowsaffected, z: integer;
+ canremove, ok: boolean;
+ refds : IDADataset;
+ insmap: TDAParamMappingArray;
+ mapptr: ^TDAParamMappingArray;
+ change: TDADeltaChange;
+ todelete: TList;
+ val : variant;
+ parname : string;
+ autoincvalue: variant;
+ usegenerators : boolean;
+ usegenerators2 : boolean;
+ currcmd: IDASQLCommand;
+ lCommands: TDADeltaProcessorItemCollection;
+ lUnionTable: TDAUnionDataTable;
+ lUnionSourceTable: TDAUnionSourceTable;
+ lSourceTableName: String;
+ lProcessorItem: TDADeltaProcessorItem;
+ lVar: Variant;
+ lConnection: IDAConnection;
+ lTargetTable: string;
+ lAutoIncFld: integer;
+ lBool: boolean;
+begin
+ Check(not Assigned(aDelta), 'Cannot process a NIL delta');
+ if (aDelta.Count=0) then Exit;
+ refds := nil;
+ fCurrentDelta := aDelta.GetDelta;
+ fCurrentChange := 0;
+
+ // detect AutoInc fld
+ lAutoIncFld := -1;
+ for i := 0 to aDelta.LoggedFieldCount - 1 do begin
+ if aDelta.LoggedFieldTypes[i] in [datAutoInc, datLargeAutoInc] then begin
+ lAutoIncFld := i;
+ break;
+ end;
+ end;
+
+ // Fires the "before" events
+ if Assigned(fOnBeforeProcessDelta)
+ then fOnBeforeProcessDelta(Self, aDelta)
+
+ else if Assigned(fBusinessRules)
+ then fBusinessRules.BeforeProcessDelta(Self, aDelta);
+
+ lUnionTable := fSchema.UnionDataTables.ItemByName(fReferencedDataset) as TDAUnionDataTable;
+ //lSourceTableFieldIdx := lUnionTable.Fields.FieldByName(def_SourceTableFieldName).Index;
+
+ try
+ // Prepares the commands
+ if not fHasReducedDelta then begin
+ SetupCommands(aConnection, aDelta, lCommands);
+ end;
+ // Processes the delta
+ todelete := TList.Create;
+ try
+ for i := 0 to (aDelta.Count - 1) do begin
+ change := aDelta[i];
+ fCurrentChange := i; // Do NOT remove!!!
+ canremove := false;
+ autoincvalue := -1;
+
+ ok := change.ChangeType in ChangeTypes; // Filters
+ try
+
+ // Even if there might not be a command associated, the user might want to do something with this
+ // We just give an override chance here
+ if Assigned(fOnBeforeProcessChange) then
+ fOnBeforeProcessChange(Self, change.ChangeType, aDelta[i], ok)
+
+ else if Assigned(fBusinessRules) then
+ fBusinessRules.BeforeProcessChange(Self, change.ChangeType, aDelta[i], ok);
+
+ // Define appripriate source table and get its commands
+
+ //lVar := aDelta.Changes[i].NewValues[lSourceTableFieldIdx];
+ if (aDelta.Changes[i].ChangeType = ctInsert) then
+ lVar := aDelta.Changes[i].NewValueByName[def_SourceTableFieldName]
+ else
+ lVar := aDelta.Changes[i].OldValueByName[def_SourceTableFieldName];
+
+ if (VarIsNull(lVar) or VarIsClear(lVar)) then begin
+ if lUnionTable.DefaultSourceTable <> '' then
+ lSourceTableName := lUnionTable.DefaultSourceTable
+ else
+ lSourceTableName := lUnionTable.SourceTables[0].Name;
+ end else
+ lSourceTableName := lUnionTable.SourceTables[lVar].Name;
+
+ lConnection := GetConnectionForObject(aConnection,lSourceTableName);
+ usegenerators := Supports(lConnection, IDAUseGenerators);
+ usegenerators2 := Supports(lConnection, IDAUseGenerators2);
+
+ if ok then begin
+ // Selects the right command
+ mapptr := nil;
+ if not fHasReducedDelta then begin
+
+ // Since we specified table for this particular change then let's
+ // check do we have rights to change this table
+ lUnionSourceTable :=
+ lUnionTable.SourceTables.UnionSourceTableByName(lSourceTableName);
+
+ if lUnionSourceTable.IsReadOnly then
+ raise EDAException.Create(Format('Union source table "%s" is read-only', [lSourceTableName]));
+ //------------------------------------------------------------------
+ lProcessorItem := TDADeltaProcessorItem(lCommands.FindItem(lSourceTableName));
+ lTargetTable := lProcessorItem.TargetTable;
+ case change.ChangeType of
+ ctInsert: begin
+ currcmd := lProcessorItem.fInsertCommand;
+ mapptr := @lProcessorItem.fInsertCommandMapping;
+ end;
+ ctUpdate: begin
+ // lBool = Allow updating datAutoInc
+ if (lAutoIncFld <> -1) then lBool := (change.OldValues[lAutoIncFld] <> change.NewValues[lAutoIncFld]) else lBool := False;
+ if lBool then begin
+ currcmd := lProcessorItem.fUpdateCommand_AutoInc;
+ mapptr := @lProcessorItem.fUpdateCommandMapping_AutoInc;
+ end
+ else begin
+ currcmd := lProcessorItem.fUpdateCommand;
+ mapptr := @lProcessorItem.fUpdateCommandMapping;
+ end;
+ end;
+ ctDelete: begin
+ currcmd := lProcessorItem.fDeleteCommand;
+ mapptr := @lProcessorItem.fDeleteCommandMapping;
+
+ end;
+ end;
+ refds := lProcessorItem.RefreshDataset;
+ end else begin
+ // lBool = Allow updating datAutoInc
+ if (lAutoIncFld <> -1) then lBool := (change.OldValues[lAutoIncFld] <> change.NewValues[lAutoIncFld]) else lBool := False;
+ SetupCommandsWithMapping(aConnection, Change, currCmd, insmap, refds, lTargetTable, lBool);
+ mapptr := @insmap;
+ end;
+
+ //GenerateRefreshDataset(Schema.FindDataset(lSourceTableName),aConnection,lSourceTableName,lUnionSourceTable.ColumnMappings);
+
+ // Assigns the values of the current change
+ if (currcmd <> nil) then
+ for x := 0 to (currcmd.Params.Count - 1) do
+ if (mapptr^[x].DeltaIndex >= 0) then begin
+ val := null;// fix for "Invalid Variant Type" exception in Win2000
+ case mapptr^[x].MappingType of
+ mtOldValue: val := change.OldValues[mapptr^[x].DeltaIndex];
+ else val := change.NewValues[mapptr^[x].DeltaIndex];
+ end;
+
+ if (currcmd.Params[x].DataType in [datAutoinc, datLargeAutoInc]) and (usegenerators or usegenerators2) and (change.ChangeType=ctInsert) and (mapptr^[x].MappingType=mtNewValue) then begin
+ // Gets the next generator values from the DB. This is for DBs such as IB or Oracle which lack autoinc fields
+ if (autoincvalue<>-1) then raise Exception.Create('Multiple auto incremental fields not supported');
+ parname := currcmd.Params[x].Name;
+ change.OldValues[mapptr^[x].DeltaIndex] := val;
+ if usegenerators2 then
+ autoincvalue := (aConnection as IDAUseGenerators2).GetNextAutoinc2(currcmd.Params[x].GeneratorName)
+ else
+ autoincvalue := (aConnection as IDAUseGenerators).GetNextAutoinc(currcmd.Params[x].GeneratorName);
+ currcmd.Params[x].Value := autoincvalue;
+ change.RefreshedByServer := TRUE;
+ if not Assigned(refds) then begin
+ change.NewValues[mapptr^[x].DeltaIndex] := autoincvalue;
+ end;
+ end
+ else currcmd.Params[x].Value := val;
+ end;
+
+ // Gives the user a chance to modify it before execution
+ if Assigned(fOnProcessChange) then
+ fOnProcessChange(Self, change.ChangeType, change, currcmd)
+ else if Assigned(fBusinessRules) then
+ fBusinessRules.ProcessChange(Self, change.ChangeType, change, currcmd);
+
+ // Executes it
+ if (currcmd <> nil)
+ then rowsaffected := currcmd.Execute
+ else rowsaffected := 0;
+
+ canremove := FALSE;
+
+ // IBX returns -1 even if updates are successful! This started to happen after I plugged the GetNextAutoinc call above.
+ // If records fail, an exception is usually generated so this check for <>0 should be sufficient for all cases...
+ // DO NOT CHANGE this to >0 !!!!
+ if (rowsaffected<>0) or (poIgnoreRowsAffected in fProcessorOptions) then begin
+ if (change.ChangeType<>ctDelete) and (refds<>NIL) then begin
+ lConnection := GetConnectionForObject(aConnection, refds.LogicalName);
+ RefreshDeltaChange(lConnection, refds, aDelta, change, autoincvalue);
+ change.RefreshedByServer := TRUE;
+ end;
+
+ canremove := not change.RefreshedByServer;
+ change.Status := csResolved;
+
+ if (ADeltaStruct <> nil) and (change.ChangeType in [ctInsert, ctUpdate]) and (lTargetTable <> '') then begin
+ for z:=0 to ADeltaStruct.RelationShips.Count - 1 do
+ if lTargetTable = ADeltaStruct.RelationShips[z].DetailDatasetName then
+ SynchronizeAutoIncs(aDelta,ADeltaStruct.fDetailDeltas[z], ADeltaStruct.RelationShips[z]);
+ end;
+ end
+ else begin
+ if fHasReducedDelta and (currcmd = nil) then begin
+ // no data for operations, i.e. oldvalues[] = newvalues[]
+ canremove := True;
+ change.Status := csResolved;
+ end
+ else begin
+ canremove := FALSE;
+ change.Status := csFailed;
+ change.Message := 'No rows were affected by this update';
+ end;
+ end;
+
+ // After processing gives the user a last chance to update the change and
+ // optionally set it so that it goes back to the client (i.e. updated values)
+ if Assigned(fOnAfterProcessChange)
+ then fOnAfterProcessChange(Self, change, ok, canremove)
+
+ else if Assigned(fBusinessRules)
+ then fBusinessRules.AfterProcessChange(Self, change, ok, canremove)
+ end;
+
+ except
+ on E: Exception do begin
+ change.Status := csFailed;
+ change.Message := E.Message;
+ canremove := FALSE;
+
+ if Assigned(fOnProcessError) then
+ fOnProcessError(Self, change.ChangeType, change, currcmd, canremove, E)
+ else if Assigned(fBusinessRules) then begin
+ fBusinessRules.ProcessError(Self, change.ChangeType, change, currcmd, canremove, E);
+ if FRaiseExceptionAtError then raise;
+ end
+ else if FRaiseExceptionAtError then begin
+ raise EDAApplyUpdateFailed.Create(change, E);
+ end;
+ end;
+ end;
+
+ if canremove then todelete.Add(change);
+ end;
+
+ for i := 0 to todelete.Count - 1 do
+ aDelta.RemoveChange(TDADeltaChange(todelete[i]));
+
+ if Assigned(fOnAfterProcessDelta) then
+ fOnAfterProcessDelta(Self, aDelta)
+ else if Assigned(fBusinessRules) then
+ fBusinessRules.AfterProcessDelta(Self, aDelta)
+
+ finally
+ todelete.Free;
+ end;
+ finally
+ lCommands.Free();
+ end;
+
+end;
+
+procedure TDABusinessProcessor.SetupCommands(const aConnection: IDAConnection;
+const aDelta: IDADelta; out aCommandsList : TDADeltaProcessorItemCollection);
+var i: Integer;
+ refstmt: TDAStatement;
+ lUnionTable: TDAUnionDataTable;
+ lSourceTable: TDADataset;
+ lSourceTableName: String;
+ lSourceTableIdx: integer;
+ lSourceTableMapping: TDAColumnMappingCollection;
+ lProcessorItem: TDADeltaProcessorItem;
+
+ lSql: String;
+ lVar: Variant;
+ lConnection: IDAConnection;
+begin
+ //lUnionTable := nil;
+ refstmt := nil;
+ CheckProperties;
+
+ aCommandsList := TDADeltaProcessorItemCollection.Create(Self);
+
+ lUnionTable := fSchema.UnionDataTables.ItemByName(fReferencedDataset) as TDAUnionDataTable;
+
+ if not Assigned(lUnionTable) then
+ RaiseError(Name + '''s referenced dataset is not speficied or does not exist. Cannot generate SQL');
+
+ // for each change in delta
+ for i:= 0 to aDelta.Count-1 do begin
+ case aDelta.Changes[i].ChangeType of
+ ctInsert: lVar := aDelta.Changes[i].NewValueByName[def_SourceTableFieldName];
+ ctUpdate, ctDelete: lVar := aDelta.Changes[i].OldValueByName[def_SourceTableFieldName];
+ end;
+
+ if (VarIsNull(lVar) or VarIsClear(lVar)) then begin
+ if lUnionTable.DefaultSourceTable <> '' then
+ lSourceTableName := lUnionTable.DefaultSourceTable
+ else
+ lSourceTableName := lUnionTable.SourceTables[0].Name;
+ lSourceTableIdx := lUnionTable.SourceTables.ItemByName(lSourceTableName).Index;
+ end else begin
+ lSourceTableIdx := lVar;
+ lSourceTableName := lUnionTable.SourceTables[lSourceTableIdx].Name;
+ end;
+ lSourceTableMapping := lUnionTable.SourceTables[lSourceTableIdx].ColumnMappings;
+ lConnection := GetConnectionForObject(aConnection, lSourceTableName);
+ lSourceTable := TDADataset(fSchema.Datasets.FindItem(lSourceTableName));
+ if Assigned(lSourceTable) then begin
+ refstmt := lSourceTable.Statements.FindItem(lConnection.Name, '', lConnection.ConnectionType, True);
+ end;
+
+ lProcessorItem := TDADeltaProcessorItem(aCommandsList.FindItem(lSourceTableName));
+
+ if not Assigned(lProcessorItem) then begin
+ lProcessorItem := aCommandsList.Add();
+ lProcessorItem.fName := lSourceTableName;
+ if refstmt <> nil then lProcessorItem.TargetTable := refstmt.TargetTable;
+ end;
+
+
+ // Assemble Refresh dataset ...
+ if (fRefreshDataset <> '') and (not Assigned(lProcessorItem.fRefreshDataset)) then
+ lProcessorItem.fRefreshDataset := fSchema.NewDataset(lConnection, fRefreshDataset, [], [], FALSE);
+
+ if (lProcessorItem.fRefreshDataset = nil) and (poAutoGenerateRefreshDataset in fProcessorOptions) then begin
+ lProcessorItem.fRefreshDataset := GenerateRefreshDataset(lSourceTable, lConnection, refstmt.TargetTable, refstmt.ColumnMappings, lSourceTableMapping);
+ if (lProcessorItem.fRefreshDataset <> NIL) then begin
+ lProcessorItem.fRefreshDataset.LogicalName := lSourceTableName;
+ SetupParameters(lProcessorItem.fRefreshDataset, lSourceTable, lConnection, lSourceTableMapping);
+ end;
+ end;
+
+ if Assigned(lProcessorItem.fRefreshDataset) and (not lProcessorItem.fRefreshDataset.Prepared) then
+ lProcessorItem.fRefreshDataset.Prepared := True;
+
+
+ // Assemble Insert command ...
+ if ((aDelta.Changes[i].ChangeType = ctInsert) and (not Assigned(lProcessorItem.fInsertCommand))) then begin
+ // Tries to locate the specified commands
+ if (fInsertCommandName <> '') then
+ lProcessorItem.fInsertCommand := fSchema.NewCommand(lConnection, fInsertCommandName);
+ // Auto generates the SQL for the undefined commands
+ if (lProcessorItem.fInsertCommand = nil) and (poAutoGenerateInsert in fProcessorOptions) then begin
+ lSql := GenerateSQL(ctInsert, nil, lSourceTable, aDelta, refstmt, lConnection);
+ lProcessorItem.fInsertCommand := lConnection.NewCommand(lSql, stSQL);
+ SetupParameters(lProcessorItem.fInsertCommand, lSourceTable, lConnection);
+ end;
+
+ if Assigned(lProcessorItem.fInsertCommand) then begin
+ CreateMappings(aDelta, lProcessorItem.fInsertCommandMapping , lProcessorItem.fInsertCommand, lSourceTableMapping, True);
+ lProcessorItem.fInsertCommand.Prepared := True;
+ end;
+ end;
+
+ // Assemble Update command ...
+ if ((aDelta.Changes[i].ChangeType = ctUpdate) and (not Assigned(lProcessorItem.fUpdateCommand))) then begin
+ // Tries to locate the specified commands
+ if (fUpdateCommandName <> '') then
+ lProcessorItem.fUpdateCommand := fSchema.NewCommand(lConnection, fUpdateCommandName);
+ // Auto generates the SQL for the undefined commands
+ if (lProcessorItem.fUpdateCommand = nil) and (poAutoGenerateUpdate in fProcessorOptions) then begin
+ lSql := GenerateSQL(ctUpdate, nil, lSourceTable, aDelta, refstmt, lConnection);
+ lProcessorItem.fUpdateCommand := lConnection.NewCommand(lSql, stSQL);
+ SetupParameters(lProcessorItem.fUpdateCommand, lSourceTable, lConnection);
+
+ // autoInc
+ lSql := GenerateSQL2(ctUpdate, nil, lSourceTable, aDelta, refstmt, lConnection,True);
+ lProcessorItem.fUpdateCommand_AutoInc := lConnection.NewCommand(lSql, stSQL);
+ SetupParameters(lProcessorItem.fUpdateCommand_AutoInc, lSourceTable, lConnection);
+ end;
+ if Assigned(lProcessorItem.fUpdateCommand) then begin
+ CreateMappings(aDelta, lProcessorItem.fUpdateCommandMapping , lProcessorItem.fUpdateCommand, lSourceTableMapping, True);
+ lProcessorItem.fUpdateCommand.Prepared := True;
+ end;
+
+ if Assigned(lProcessorItem.fUpdateCommand_AutoInc) then begin
+ CreateMappings(aDelta, lProcessorItem.fUpdateCommandMapping_AutoInc , lProcessorItem.fUpdateCommand_AutoInc, lSourceTableMapping, True);
+ lProcessorItem.fUpdateCommand_AutoInc.Prepared := True;
+ end;
+ end;
+
+ // Assemble Delete command ...
+ if ((aDelta.Changes[i].ChangeType = ctDelete) and (not Assigned(lProcessorItem.fDeleteCommand))) then begin
+ // Tries to locate the specified commands
+ if (fDeleteCommandName <> '') then
+ lProcessorItem.fDeleteCommand := fSchema.NewCommand(lConnection, fDeleteCommandName);
+ // Auto generates the SQL for the undefined commands
+ if (lProcessorItem.fDeleteCommand = nil) and (poAutoGenerateDelete in fProcessorOptions) then begin
+ lSql := GenerateSQL(ctDelete, nil, lSourceTable, aDelta, refstmt, lConnection);
+ lProcessorItem.fDeleteCommand := lConnection.NewCommand(lSql, stSQL);
+ SetupParameters(lProcessorItem.fDeleteCommand, lSourceTable, lConnection);
+ end;
+ if Assigned(lProcessorItem.fDeleteCommand) then begin
+ CreateMappings(aDelta, lProcessorItem.fDeleteCommandMapping , lProcessorItem.fDeleteCommand, lSourceTableMapping, True);
+ lProcessorItem.fDeleteCommand.Prepared := True;
+ end;
+ end;
+
+ end;
+end;
+
+function TDABusinessProcessor.GetConnectionForObject(const aConnection: IDAConnection; const aName: string): IDAConnection;
+var lHETConnection: IDAHETConnection;
+begin
+ result := aConnection;
+ if Supports(aConnection, IDAHETConnection, lHETConnection) then
+ result := lHETConnection.GetConnectionForObject(aName)
+end;
+
+
+{ TDADeltaProcessorItemCollection }
+constructor TDADeltaProcessorItemCollection.Create(aOwner: TComponent);
+begin
+ inherited Create(aOwner, TDADeltaProcessorItem);
+end;
+
+function TDADeltaProcessorItemCollection.GetItem(Index: integer): TDADeltaProcessorItem;
+begin
+ result := TDADeltaProcessorItem(inherited Items[Index])
+end;
+
+procedure TDADeltaProcessorItemCollection.SetItem(Index: integer; const Value: TDADeltaProcessorItem);
+begin
+ Items[Index].Assign(Value);
+end;
+
+function TDADeltaProcessorItemCollection.Add: TDADeltaProcessorItem;
+begin
+ result := TDADeltaProcessorItem(inherited Add);
+end;
+
+function TDADeltaProcessorItemCollection.ItemByName(const aName: String): TDADeltaProcessorItem;
+begin
+ result := TDADeltaProcessorItem(inherited ItemByName(aName));
+end;
+
+
+function TDADeltaProcessorItemCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result := TDADeltaProcessorItem(anItem).Name;
+end;
+
+function TDADeltaProcessorItemCollection.SetItemName(
+ anItem: TCollectionItem; const aName: string): string;
+begin
+ TDADeltaProcessorItem(anItem).Name := aName;
+end;
+
+initialization
+ _bizdeltachanges := TStringList.Create;
+ _bizdeltachanges.Sorted := TRUE;
+
+finalization
+ _bizdeltachanges.Free;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDACDSDataTable.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDACDSDataTable.pas
new file mode 100644
index 0000000..2445406
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDACDSDataTable.pas
@@ -0,0 +1,738 @@
+unit uDACDSDataTable;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up }
+{ platform: Win32 }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses Classes, DB, uDAInterfaces, uDADataTable, DBClient;
+
+
+const
+ DAFormatToCDSFormat : array[TDANativeDataFormat] of TDataPacketFormat = (dfBinary, dfXML);
+
+type
+ TDACDSDataTable = class;
+
+ { TDAClientdataset }
+ TDAClientdataset = class(TClientDataset, IDADataTableDataset)
+ private
+ FLocateRecordMode: Boolean;
+ function GetActive: boolean;
+
+ protected
+ function GetDataTable: TDADataTable; safecall;
+ procedure InternalRefresh; override;
+ function GetStateFieldValue(State: TDataSetState;
+ Field: TField): Variant; override;
+ procedure DataEvent(Event: TDataEvent; Info: Longint); override;
+ public
+ function Locate(const KeyFields: string; const KeyValues: Variant;
+ Options: TLocateOptions): Boolean; override;
+ function Lookup(const KeyFields: string; const KeyValues: Variant;
+ const ResultFields: string): Variant; override;
+{$IFDEF DELPHI7UP}
+ procedure GetFieldNames(List: TStrings); override;
+{$ENDIF}
+ published
+ property Active: boolean read GetActive;
+ end;
+
+ { TDACDSDataTable }
+ TDACDSDataTable = class(TDADataTable, IDARangeController, IDANativeDatasetStreaming)
+ private
+ fMasterSource : TDADataSource;
+ fClientDataset: TClientDataSet;
+ fWasReadonly : Boolean;
+ protected
+ function intDATypeToVCLType(aDAType: TDADataType): TFieldType; override;
+ function GetDatasetClass: TDatasetClass; override;
+ procedure CreateInternalFields(aDataset: TDataset; someFieldDefinitions: TDAFieldCollection); override;
+ procedure DoSort(const FieldNames: array of string; const Directions: array of TDASortDirection); override;
+
+ procedure DoBeforeOpenDataset; override;
+ procedure DoAfterCloseDataset; override;
+
+ procedure SetMasterSource(const Value: TDADataSource); override;
+ function GetMasterSource: TDADataSource; override;
+ procedure SetDetailsFields(const Value: string); override;
+ procedure SetMasterFields(const Value: string); override;
+ function GetDetailFields: string; override;
+ function GetMasterFields: string; override;
+
+ function GetIndexDefs: TIndexDefs;
+ procedure SetIndexDefs(const Value: TIndexDefs);
+ function GetIndexName: string;
+ procedure SetIndexName(const Value: string);
+
+ function GetFilter: string; override;
+ function GetFiltered: boolean; override;
+ procedure SetFilter(const Value: string); override;
+ procedure SetFiltered(const Value: boolean); override;
+
+ function GetReadOnly: boolean; override;
+ procedure SetReadOnly(const Value: boolean); override;
+ function GetMasterDataLink: TMasterDataLink; override;
+
+ public
+ constructor Create(aOwner: TComponent); override;
+ procedure Assign(Source: TPersistent); override;
+ procedure FindNearest(const KeyValues: array of const);
+
+ { IDAClonedCursorsSupport }
+ procedure CloneCursor(Source : TDADataTable); override; safecall;
+
+ { IDANativeDatasetStreaming }
+ procedure NativeSaveToFile(const aFileName : string; DataFormat : TDANativeDataFormat = ndfBinary);
+ procedure NativeLoadFromFile(const aFileName : string);
+ procedure NativeSaveToStream(aStream : TStream; DataFormat : TDANativeDataFormat = ndfBinary);
+ procedure NativeLoadFromStream(aStream : TStream);
+
+ { IDARangeController }
+ procedure ApplyRange; safecall;
+ procedure CancelRange; safecall;
+ procedure SetRange(const StartValues, EndValues: array of const); safecall;
+ procedure EditRangeEnd; safecall;
+ procedure EditRangeStart; safecall;
+ procedure SetRangeEnd; safecall;
+ procedure SetRangeStart; safecall;
+
+ procedure DisableConstraints; override; safecall;
+ procedure EnableConstraints; override; safecall;
+ published
+ property IndexDefs: TIndexDefs read GetIndexDefs write SetIndexDefs;
+ property IndexName: string read GetIndexName write SetIndexName;
+
+ end;
+
+// Table for quick CRC Calculations. Used to generate unique index names when sorting
+const crctable : array [0..255] of cardinal =
+(
+ $00000000, $77073096, $EE0E612C, $990951BA,
+ $076DC419, $706AF48F, $E963A535, $9E6495A3,
+ $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988,
+ $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91,
+ $1DB71064, $6AB020F2, $F3B97148, $84BE41DE,
+ $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7,
+ $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC,
+ $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5,
+ $3B6E20C8, $4C69105E, $D56041E4, $A2677172,
+ $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B,
+ $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940,
+ $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59,
+ $26D930AC, $51DE003A, $C8D75180, $BFD06116,
+ $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F,
+ $2802B89E, $5F058808, $C60CD9B2, $B10BE924,
+ $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D,
+ $76DC4190, $01DB7106, $98D220BC, $EFD5102A,
+ $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433,
+ $7807C9A2, $0F00F934, $9609A88E, $E10E9818,
+ $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01,
+ $6B6B51F4, $1C6C6162, $856530D8, $F262004E,
+ $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457,
+ $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C,
+ $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65,
+ $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2,
+ $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB,
+ $4369E96A, $346ED9FC, $AD678846, $DA60B8D0,
+ $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9,
+ $5005713C, $270241AA, $BE0B1010, $C90C2086,
+ $5768B525, $206F85B3, $B966D409, $CE61E49F,
+ $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4,
+ $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD,
+ $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A,
+ $EAD54739, $9DD277AF, $04DB2615, $73DC1683,
+ $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8,
+ $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1,
+ $F00F9344, $8708A3D2, $1E01F268, $6906C2FE,
+ $F762575D, $806567CB, $196C3671, $6E6B06E7,
+ $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC,
+ $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5,
+ $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252,
+ $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B,
+ $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60,
+ $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79,
+ $CB61B38C, $BC66831A, $256FD2A0, $5268E236,
+ $CC0C7795, $BB0B4703, $220216B9, $5505262F,
+ $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04,
+ $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D,
+ $9B64C2B0, $EC63F226, $756AA39C, $026D930A,
+ $9C0906A9, $EB0E363F, $72076785, $05005713,
+ $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38,
+ $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21,
+ $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E,
+ $81BE16CD, $F6B9265B, $6FB077E1, $18B74777,
+ $88085AE6, $FF0F6A70, $66063BCA, $11010B5C,
+ $8F659EFF, $F862AE69, $616BFFD3, $166CCF45,
+ $A00AE278, $D70DD2EE, $4E048354, $3903B3C2,
+ $A7672661, $D06016F7, $4969474D, $3E6E77DB,
+ $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0,
+ $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9,
+ $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6,
+ $BAD03605, $CDD70693, $54DE5729, $23D967BF,
+ $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94,
+ $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D
+);
+
+function CRC(S : String):LongInt;
+
+implementation
+
+uses Variants, SysUtils, uDAClasses;
+
+{ TDACDSDataTable }
+
+constructor TDACDSDataTable.Create(aOwner: TComponent);
+begin
+ inherited;
+
+ fClientDataset := TClientDataSet(Dataset);
+ fClientDataset.FetchOnDemand := FALSE;
+ fClientDataset.FilterOptions := [foCaseInsensitive];
+end;
+
+procedure TDACDSDataTable.CreateInternalFields(aDataset: TDataset; someFieldDefinitions: TDAFieldCollection);
+begin
+ inherited;
+
+ // Creates the dataset
+ if not MasterLink.Active then begin
+ // This should actually never happen since its mutually exclusive with IndexFieldNames...
+ if (fClientDataset.IndexName<>'') then
+ fClientDataset.IndexName := '';
+ end;
+
+ fClientDataset.CreateDataSet;
+ //fClientDataset.LogChanges := FALSE;
+ { Unfortunately a bug in the CDS provents us to disable the log.
+ Tables with multiple blob fields behave weird and lose data otherwise.
+ The Issue has been reported to Borland. }
+end;
+
+// CRC routine in ASM.
+// NOTE: This routine strips the signed bit from the CRC.
+// Written and posted on Google by Clifford Hammerschmidt
+// http://www.engr.uvic.ca/~chammers/
+// http://www.ultranet.ca/chcc/
+function CRC(S : String):LongInt;
+var
+ Len,crc : LongInt;
+ K : PChar;
+begin
+ Len := Length(S);
+ K := PChar(S);
+ asm
+ mov dword ptr [crc],$ffffffff
+@@2:
+ dec dword ptr [len]
+ cmp dword ptr [len],$FFFFFFFF
+ je @@1
+ mov eax,dword ptr [K]
+ movsx eax,byte ptr [eax]
+ mov ecx,dword ptr [crc]
+ sar ecx,$18
+ xor eax,ecx
+ and eax,$000000ff
+ mov eax,dword ptr [crctable+eax*$4]
+ mov ecx,dword ptr [crc]
+ shl ecx,$08
+ xor eax,ecx
+ mov dword ptr [crc],eax
+ inc dword ptr [K]
+ jmp @@2
+@@1:
+// NOTE: From here on the asm is optional...
+ mov eax,dword ptr [crc]
+ not eax
+// Next line strips signed bit...
+ and eax,$7fffffff
+ mov dword ptr [crc],eax
+ end;
+
+ Result := crc;
+end;
+
+procedure TDACDSDataTable.DoSort(const FieldNames: array of string; const Directions: array of TDASortDirection);
+const
+ DirectionStr: array[TDASortDirection] of string = ('ASC', 'DESC');
+var
+ ascfields, descfields,
+ idxname: string;
+ i: integer;
+ idx: TIndexDef;
+begin
+ with fClientDataset do begin
+ if (Length(FieldNames) = 0) then begin
+ IndexName := '';
+ Exit;
+ end;
+
+ idxname := '';
+ for i := 0 to Length(FieldNames) - 1 do
+ idxname := idxname + FieldNames[i] + '_' + DirectionStr[Directions[i]];
+
+ idxname := 'IDX'+IntToStr(CRC(idxname));
+
+ idx := TDefCollection(IndexDefs).Find(idxname) as TIndexDef;
+ if (idx = nil) then begin
+ ascfields := '';
+ descfields := '';
+
+ for i := 0 to Length(Directions) - 1 do begin
+ ascfields := ascfields + FieldNames[i] + ';'; //<-- IDX.Fields must include ALL Fieldnames
+ if Directions[i] = sdDescending then
+ descfields := descfields + FieldNames[i] + ';';
+ end;
+
+ idx := fClientDataset.IndexDefs.AddIndexDef;
+ idx.Name := idxname;
+ idx.DescFields := descfields;
+ idx.Fields := ascfields;
+ end;
+
+ IndexName := idxname;
+ end;
+end;
+
+function TDACDSDataTable.GetDatasetClass: TDatasetClass;
+begin
+ result := TDAClientDataset;
+end;
+
+function TDACDSDataTable.GetMasterSource: TDADataSource;
+begin
+ result := fMasterSource;
+end;
+
+procedure TDACDSDataTable.DoAfterCloseDataset;
+begin
+ inherited;
+ fClientDataset.Data := Null;
+end;
+
+function TDACDSDataTable.GetFilter: string;
+begin
+ result := fClientDataset.Filter
+end;
+
+//////////////
+procedure TDACDSDataTable.DoBeforeOpenDataset;
+begin
+ inherited;
+
+ // This helps prevending a design time problem which results in DetailFields being reset
+ // whenever something is wrong or the dataset cannot be open properly
+ // Keep in this orders!!!
+
+{ fClientDataset.IndexFieldNames := fDetailFields;
+ fClientDataset.MasterFields := fMasterFields;
+ fClientDataset.MasterSource := fMasterSource;}
+end;
+
+procedure TDACDSDataTable.SetMasterSource(const Value: TDADataSource);
+begin
+ fClientDataset.MasterSource := Value;
+ fMasterSource := Value;
+
+ inherited SetMasterSource(Value);
+end;
+
+procedure TDACDSDataTable.SetMasterFields(const Value: string);
+begin
+ fClientDataset.MasterFields := Value;
+
+ inherited;
+ //fMasterFields := Value;
+end;
+
+procedure TDACDSDataTable.SetDetailsFields(const Value: string);
+begin
+ fClientDataset.IndexFieldNames := Value
+ //fDetailFields := Value;
+end;
+
+function TDACDSDataTable.GetDetailFields: string;
+begin
+ result := fClientDataset.IndexFieldNames
+ //result := fDetailFields
+end;
+
+{$HINTS OFF}
+type
+{$IFDEF DELPHI2007}
+ THackCustomClientDataSet = class(TWideDataSet)
+ private
+ FActiveAggLists: TList;
+ FAggFieldsUpdated: TBits;
+ FAggFieldsInit: Boolean;
+ FAggFieldsSize: Integer;
+ FAggGrpIndOfs: Integer;
+ FAggFieldsOfs: Integer;
+ FAggGrpIndSize: Integer;
+ FAggregates: TAggregates;
+ FAggregatesActive: Boolean;
+ FCommandText: WideString;
+ FDisableStringTrim: Boolean;
+ FDSBase: IUnknown;
+ FDSCursor: IUnknown;
+ FDSOptions: TDataSetOptions;
+ FFindCursor: IUnknown;
+ FCloneSource: TCustomClientDataSet;
+ FReconcileDataSet: TCustomClientDataSet;
+ FSavedPacket: Pointer;
+ FDeltaPacket: Pointer;
+ FParams: TParams;
+ FIndexDefs: TIndexDefs;
+ FIndexName: WideString;
+ FExprFilter: pointer;
+ FFuncFilter: pointer;
+ FFileName: string;
+ FFilterBuffer: PChar;
+ FGroupingLevel: Integer;
+ FLastParentBM: array of byte;
+ FMasterLink: TMasterDataLink;
+ end;
+{$ELSE}
+ THackCustomClientDataSet = class(TDataSet)
+ private
+ FActiveAggLists: TList;
+ FAggFieldsUpdated: TBits;
+ FAggFieldsInit: Boolean;
+ FAggFieldsSize: Integer;
+ FAggGrpIndOfs: Integer;
+ FAggFieldsOfs: Integer;
+ FAggGrpIndSize: Integer;
+ FAggregates: TAggregates;
+ FAggregatesActive: Boolean;
+ FCommandText: string;
+ FDisableStringTrim: Boolean;
+ FDSBase: IUnknown;
+ FDSCursor: IUnknown;
+ FDSOptions: TDataSetOptions;
+ FFindCursor: IUnknown;
+ FCloneSource: TCustomClientDataSet;
+ FReconcileDataSet: TCustomClientDataSet;
+ FSavedPacket: Pointer;
+ FDeltaPacket: Pointer;
+ FParams: TParams;
+ FIndexDefs: TIndexDefs;
+ FIndexName: string;
+ FExprFilter: Pointer;
+ FFuncFilter: Pointer;
+ FFileName: string;
+ FFilterBuffer: PChar;
+ FGroupingLevel: Integer;
+ FLastParentBM: array of byte;
+ FMasterLink: TMasterDataLink;
+ end;
+{$ENDIF}
+{$HINTS ON}
+
+function TDACDSDataTable.GetMasterDataLink: TMasterDataLink;
+begin
+ Result := THackCustomClientDataSet(fClientDataset).FMasterLink;
+end;
+
+function TDACDSDataTable.GetMasterFields: string;
+begin
+ result := fClientDataset.MasterFields
+ //result := fMasterFields
+end;
+///////////
+
+function TDACDSDataTable.GetFiltered: boolean;
+begin
+ result := fClientDataset.Filtered
+end;
+
+procedure TDACDSDataTable.SetFilter(const Value: string);
+begin
+ fClientDataset.Filter := Value
+end;
+
+procedure TDACDSDataTable.SetFiltered(const Value: boolean);
+begin
+ fClientDataset.Filtered := Value
+end;
+
+function TDACDSDataTable.GetIndexDefs: TIndexDefs;
+begin
+ result := fClientDataset.IndexDefs
+end;
+
+procedure TDACDSDataTable.SetIndexDefs(const Value: TIndexDefs);
+begin
+ fClientDataset.IndexDefs.Assign(Value);
+end;
+
+function TDACDSDataTable.GetIndexName: string;
+begin
+ result := fClientDataset.IndexName
+end;
+
+procedure TDACDSDataTable.SetIndexName(const Value: string);
+begin
+ fClientDataset.IndexName := Value
+end;
+
+function TDACDSDataTable.GetReadOnly: boolean;
+begin
+ result := fClientDataset.ReadOnly
+end;
+
+procedure TDACDSDataTable.SetReadOnly(const Value: boolean);
+begin
+ fClientDataset.ReadOnly := Value
+end;
+
+procedure TDACDSDataTable.CloneCursor(Source: TDADataTable);
+var i: integer;
+begin
+ if Source = nil then Exception.Create('CloneCursor. Source should be specified.');
+ if not (Source is TDACDSDataTable) then Exception.Create('Can''t clone cursor from ' + Source.ClassName);
+ if Active then raise Exception.Create('Datatable is already open');
+
+ try
+ fCloneSource := Source;
+
+ Fields.Clear;
+ Fields.Assign(Source.Fields);
+
+ // Lookup fields are not cloned by the CDS. We must remove them
+ for i := (Fields.Count-1) downto 0 do
+ if Fields[i].Lookup then Fields.Delete(i);
+
+ // Proceeds
+ fClientDataset.CloneCursor(Source.Dataset as TClientDataset, False);
+
+ RecIDField := fClientDataset.FieldByName(RecIDFieldName) as TIntegerField;
+ RecIDField.Visible := FALSE;
+
+ Fields.Bind(fClientDataset);
+
+ // Prepares the delta
+ Delta := Source.Delta;
+
+ // Finishes to prepare the internal dataset (descendant might need additional customization and might not be open)
+ DoBeforeOpenDataset;
+ if not Dataset.Active then Dataset.Open;
+ DoAfterOpenDataset;
+ except
+ // Restores the previous state
+ fCloneSource := NIL;
+ Delta := NIL;
+
+ raise;
+ end;
+end;
+
+procedure TDACDSDataTable.ApplyRange;
+begin
+ fClientDataset.ApplyRange
+end;
+
+procedure TDACDSDataTable.Assign(Source: TPersistent);
+var
+ lSource: TDACDSDataTable;
+begin
+ inherited;
+ if Source is TDACDSDataTable then begin
+ lSource := TDACDSDataTable(Source);
+
+ IndexDefs := lSource.IndexDefs;
+ IndexName := lSource.IndexName;
+ end;
+end;
+
+procedure TDACDSDataTable.CancelRange;
+begin
+ fClientDataset.CancelRange
+end;
+
+procedure TDACDSDataTable.EditRangeEnd;
+begin
+ fClientDataset.EditRangeEnd
+end;
+
+procedure TDACDSDataTable.EditRangeStart;
+begin
+ fClientDataset.EditRangeStart
+end;
+
+procedure TDACDSDataTable.SetRange(const StartValues,
+ EndValues: array of const);
+begin
+ fClientDataset.SetRange(StartValues, EndValues);
+end;
+
+procedure TDACDSDataTable.SetRangeEnd;
+begin
+ fClientDataset.SetRangeEnd
+end;
+
+procedure TDACDSDataTable.SetRangeStart;
+begin
+ fClientDataset.SetRangeStart
+end;
+
+procedure TDACDSDataTable.NativeLoadFromFile(const aFileName: string);
+var fs : TFileStream;
+begin
+ fs := TFileStream.Create(aFileName, fmOpenRead+fmShareDenyWrite);
+ try
+ NativeLoadFromStream(fs);
+ finally
+ fs.Free;
+ end;
+end;
+
+procedure TDACDSDataTable.NativeSaveToFile(const aFileName: string;
+ DataFormat: TDANativeDataFormat);
+var fs : TFileStream;
+begin
+ fs := TFileStream.Create(aFileName, fmCreate);
+ try
+ NativeSaveToStream(fs, DataFormat);
+ finally
+ fs.Free;
+ end;
+end;
+
+procedure TDACDSDataTable.NativeLoadFromStream(aStream : TStream);
+var oldrf : boolean;
+ ls : TDASchema;
+begin
+ oldrf := RemoteFetchEnabled;
+ ls := LocalSchema;
+ try
+ RemoteFetchEnabled := FALSE;
+ ls := NIL;
+
+ if not Active then Active := TRUE
+ else if DeltaInitialized then Delta.Clear;
+
+ fClientDataset.LoadFromStream(aStream);
+ finally
+ RemoteFetchEnabled := oldrf;
+ LocalSchema := ls;
+ end;
+end;
+
+procedure TDACDSDataTable.NativeSaveToStream(aStream : TStream;
+ DataFormat: TDANativeDataFormat);
+begin
+ fClientDataset.SaveToStream(aStream, DAFormatToCDSFormat[DataFormat]);
+end;
+
+procedure TDACDSDataTable.DisableConstraints;
+begin
+ fWasReadonly := ReadOnly;
+ ReadOnly := False;
+ fClientDataset.DisableConstraints;
+end;
+
+procedure TDACDSDataTable.EnableConstraints;
+begin
+ fClientDataset.EnableConstraints;
+ ReadOnly := fWasReadonly;
+end;
+
+procedure TDACDSDataTable.FindNearest(const KeyValues: array of const);
+begin
+ fClientDataset.FindNearest(KeyValues);
+end;
+
+
+function TDACDSDataTable.intDATypeToVCLType(
+ aDAType: TDADataType): TFieldType;
+begin
+ if aDAType = datCurrency then
+ Result:= ftCurrency
+ else
+ Result := inherited intDATypeToVCLType(aDAType);
+end;
+
+{ TDAClientdataset }
+
+procedure TDAClientdataset.DataEvent(Event: TDataEvent; Info: Integer);
+begin
+ if FLocateRecordMode and (Event = deCheckBrowseMode) and (Info = 0) and (Self.State = dsBrowse) then
+ // nothing
+ else
+ inherited;
+end;
+
+function TDAClientdataset.GetActive: boolean;
+begin
+ result := inherited Active;
+end;
+
+function TDAClientdataset.GetDataTable: TDADataTable;
+begin
+ result := TDADataTable(Owner);
+end;
+{$IFDEF DELPHI7UP}
+procedure TDAClientdataset.GetFieldNames(List: TStrings);
+var
+ i: Integer;
+begin
+ if (not inherited Active) then
+ begin
+ for i := 0 to TDADataTable(Owner).FieldCount -1 do
+ List.Add(TDADataTable(Owner).Fields[i].Name);
+ exit;
+ end;
+{$IFDEF DELPHI10UP}{$WARN SYMBOL_DEPRECATED OFF}{$ENDIF}
+ inherited GetFieldNames(List);
+{$IFDEF DELPHI10UP}{$WARN SYMBOL_DEPRECATED ON}{$ENDIF}
+end;
+{$ENDIF}
+
+function TDAClientdataset.GetStateFieldValue(State: TDataSetState;
+ Field: TField): Variant;
+begin
+ if (State = dsOldValue) and (Self.State in [dsEdit, dsInsert]) then
+ Result := TDACDSDataTable(Owner).fOldValues[Field.Index]
+ else
+ result := Inherited GetStateFieldValue(State, Field);
+end;
+
+procedure TDAClientdataset.InternalRefresh;
+begin
+ // Does nothing
+end;
+
+function TDAClientdataset.Locate(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+begin
+ FLocateRecordMode:=True;
+ try
+ Result := inherited Locate(KeyFields,KeyValues,Options);
+ finally
+ FLocateRecordMode:= False;
+ end;
+end;
+
+function TDAClientdataset.Lookup(const KeyFields: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ FLocateRecordMode:=True;
+ try
+ Result := inherited Lookup(KeyFields, KeyValues, ResultFields);
+ finally
+ FLocateRecordMode:= False;
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDACache.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDACache.pas
new file mode 100644
index 0000000..6501789
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDACache.pas
@@ -0,0 +1,425 @@
+unit uDACache;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, SysUtils, SyncObjs,
+ uROClasses, uROTypes, uDAInterfaces;
+
+type
+ { TDACacheElement }
+ TDACacheElementOption = (ceoFlushOnUpdate);
+ TDACacheElementOptions = set of TDACacheElementOption;
+
+ TDACacheElement = class(TCollectionItem)
+ private
+ fEnabled: boolean;
+ fMaxReads: integer;
+ fReferencedDataset: string;
+ fOptions: TDACacheElementOptions;
+ fDuration: integer;
+ procedure SetDuration(const Value: integer);
+ procedure SetMaxReads(const Value: integer);
+
+ protected
+ function GetDisplayName: string; override;
+
+ public
+ constructor Create(aCollection : TCollection); override;
+
+ published
+ property ReferencedDataset : string read fReferencedDataset write fReferencedDataset;
+ property Enabled : boolean read fEnabled write fEnabled;
+ property Options : TDACacheElementOptions read fOptions write fOptions;
+ property MaxReads : integer read fMaxReads write SetMaxReads;
+ property Duration : integer read fDuration write SetDuration;
+ end;
+
+ { TDACacheElementCollection }
+ TDACacheElementCollection = class(TCollection)
+ private
+ function GetItems(Index: integer): TDACacheElement;
+ protected
+ public
+ constructor Create;
+ destructor Destroy; override;
+
+ function Add : TDACacheElement;
+ function FindByDatasetName(aDatasetName : string) : TDACacheElement;
+
+ property Items[Index : integer] : TDACacheElement read GetItems; default;
+ end;
+
+ { IDACacheEntry }
+ IDACacheEntry = interface
+ ['{87F5AFF3-590C-4749-A3D7-BD4F8B2D5166}']
+ function GetInvalid: boolean;
+ function GetData: TStream;
+ function GetExpirationTime: TDateTime;
+ function GetMaxReads: integer;
+ function GetName: string;
+ function GetOwnsStream: boolean;
+ function GetReadCount: integer;
+ function GetRecordCount: integer;
+ procedure SetReadCount(const Value: integer);
+
+ property Name : string read GetName;
+ property Data : TStream read GetData;
+ property ReadCount : integer read GetReadCount write SetReadCount;
+
+ property RecordCount : integer read GetRecordCount;
+
+ property ExpirationTime : TDateTime read GetExpirationTime;
+
+ property MaxReads : integer read GetMaxReads;
+ property OwnsStream : boolean read GetOwnsStream;
+ property Invalid : boolean read GetInvalid;
+ end;
+
+ { TDACacheEntry }
+ TDACacheEntry = class(TInterfacedObject, IDACacheEntry)
+ private
+ fOwnsStream : boolean;
+ fData: TStream;
+ fMaxReads: integer;
+ fReadCount: integer;
+ fName: string;
+ fExpirationTime: TDateTime;
+ fRecordCount: integer;
+
+ protected
+ { IDACacheEntry }
+ function GetInvalid: boolean;
+ function GetData: TStream;
+ function GetExpirationTime: TDateTime;
+ function GetMaxReads: integer;
+ function GetName: string;
+ function GetOwnsStream: boolean;
+ function GetReadCount: integer;
+ function GetRecordCount: integer;
+ procedure SetReadCount(const Value: integer);
+
+ public
+ constructor Create(const aName : string; aData : TStream; aRecordCount : integer;
+ aOwnsStream : boolean; aMaxReads : integer = -1; aDuration : integer = -1);
+ destructor Destroy; override;
+ end;
+
+ { TDACache }
+ TDACache = class(TComponent)
+ private
+ fTimer : TROThreadTimer;
+ fEntries : TInterfaceList;
+ fCritical : TCriticalSection;
+
+ function GetEntries(Index: integer): IDACacheEntry;
+ function GetEntryCount: integer;
+
+ protected
+ procedure OnTimerTick(CurrentTickCount : cardinal);
+
+ public
+ constructor Create(aOwner : TComponent); override;
+ destructor Destroy; override;
+
+ procedure Store(const anEntryName : string; Data : TStream;
+ CopyStream : boolean; RecordCount : integer = -1;
+ MaxReads : integer = -1; Duration : integer = -1);
+ function Get(const anEntryName : string) : IDACacheEntry;
+ procedure Flush(const anEntryName : string);
+
+ function Find(const anEntryName : string) : integer;
+
+ property Entries[Index : integer] : IDACacheEntry read GetEntries;
+ property EntryCount : integer read GetEntryCount;
+
+ end;
+
+implementation
+
+uses
+ DateUtils;
+
+{ TDACacheElementCollection }
+
+function TDACacheElementCollection.Add: TDACacheElement;
+begin
+ result := TDACacheElement(inherited Add);
+end;
+
+constructor TDACacheElementCollection.Create;
+begin
+ inherited Create(TDACacheElement);
+end;
+
+destructor TDACacheElementCollection.Destroy;
+begin
+
+ inherited;
+end;
+
+function TDACacheElementCollection.FindByDatasetName(
+ aDatasetName: string): TDACacheElement;
+var i : integer;
+begin
+ result := NIL;
+
+ for i := 0 to (Count-1) do
+ if SameText(Items[i].ReferencedDataset, aDatasetName) then begin
+ result := Items[i];
+ Exit;
+ end;
+end;
+
+function TDACacheElementCollection.GetItems(
+ Index: integer): TDACacheElement;
+begin
+ result := TDACacheElement(inherited Items[Index]);
+end;
+
+{ TDACacheElement }
+
+constructor TDACacheElement.Create(aCollection: TCollection);
+begin
+ inherited;
+
+ fEnabled := TRUE;
+ fMaxReads := -1;
+ fDuration := -1;
+ fOptions := [ceoFlushOnUpdate];
+end;
+
+function TDACacheElement.GetDisplayName: string;
+begin
+ if fReferencedDataset<>''
+ then result := fReferencedDataset
+ else result := ''
+end;
+
+procedure TDACacheElement.SetDuration(const Value: integer);
+begin
+ if (Value=-1) or (Value>0)
+ then fDuration := Value;
+end;
+
+procedure TDACacheElement.SetMaxReads(const Value: integer);
+begin
+ if (Value=-1) or (Value>0)
+ then fMaxReads := Value;
+end;
+
+{ TDACache }
+
+constructor TDACache.Create(aOwner: TComponent);
+begin
+ inherited;
+
+ fTimer := TROThreadTimer.Create(OnTimerTick, 60); // Checks every minute
+
+ fCritical := TCriticalSection.Create;
+ fEntries := TInterfaceList.Create;
+end;
+
+destructor TDACache.Destroy;
+begin
+ fTimer.Terminate;
+ fTimer.Free;
+
+ fEntries.Free;
+ fCritical.Free;
+
+ inherited;
+end;
+
+function TDACache.Find(const anEntryName: string): integer;
+var i : integer;
+begin
+ result := -1;
+ for i := 0 to (fEntries.Count-1) do
+ if SameText(Entries[i].Name, anEntryName) then begin
+ result := i;
+ Exit;
+ end;
+end;
+
+procedure TDACache.Flush(const anEntryName: string);
+var idx : integer;
+begin
+ fCritical.Enter;
+ try
+ idx := Find(anEntryName);
+ if (idx>=0)
+ then fEntries.Delete(idx);
+ finally
+ fCritical.Leave;
+ end;
+end;
+
+function TDACache.Get(const anEntryName: string): IDACacheEntry;
+var idx : integer;
+begin
+ result := NIL;
+ fCritical.Enter;
+ try
+ idx := Find(anEntryName);
+ if (idx>=0) then begin
+ result := Entries[idx];
+
+ if result.Invalid then begin
+ result := NIL;
+ fEntries.Delete(idx);
+ Exit;
+ end
+ else begin
+ result.ReadCount := result.ReadCount+1;
+ end;
+ end;
+ finally
+ fCritical.Leave;
+ end;
+end;
+
+function TDACache.GetEntries(Index: integer): IDACacheEntry;
+begin
+ result := fEntries[Index] as IDACacheEntry;
+end;
+
+function TDACache.GetEntryCount: integer;
+begin
+ result := fEntries.Count;
+end;
+
+procedure TDACache.OnTimerTick(CurrentTickCount: cardinal);
+var i : integer;
+begin
+ fCritical.Enter;
+ try
+ for i := fEntries.Count-1 downto 0 do begin
+ if Entries[i].Invalid
+ then fEntries.Delete(i);
+ end;
+ finally
+ fCritical.Leave;
+ end;
+end;
+
+procedure TDACache.Store(const anEntryName: string; Data: TStream; CopyStream : boolean;
+ RecordCount, MaxReads, Duration: integer);
+var entry : TDACacheEntry;
+ nme : string;
+ idx : integer;
+ newstream : Binary;
+begin
+ nme := UpperCase(anEntryName);
+
+ fCritical.Enter;
+ try
+ idx := Find(nme);
+
+ if (idx<0) then begin
+ if CopyStream then begin
+ newstream := Binary.Create;
+ newstream.CopyFrom(Data, 0);
+ entry := TDACacheEntry.Create(nme, newstream, RecordCount, TRUE, MaxReads, Duration);
+ end
+ else entry := TDACacheEntry.Create(nme, Data, RecordCount, FALSE, MaxReads, Duration);
+
+ fEntries.Add(entry);
+ end
+ else raise Exception.Create('Duplicated name '+anEntryName);
+ finally
+ fCritical.Leave;
+ end;
+end;
+
+{ TDACacheEntry }
+
+constructor TDACacheEntry.Create(const aName : string; aData : TStream; aRecordCount : integer;
+ aOwnsStream : boolean; aMaxReads : integer = -1; aDuration : integer = -1);
+begin
+ inherited Create;
+
+ fName := aName;
+ fData := aData;
+ fRecordCount := aRecordCount;
+
+ if (aDuration>0)
+ then fExpirationTime := IncMinute(Now, aDuration)
+ else fExpirationTime := -1;
+
+ fReadCount := 0;
+ fMaxReads := aMaxReads;
+end;
+
+destructor TDACacheEntry.Destroy;
+begin
+ if fOwnsStream
+ then fData.Free;
+
+ inherited;
+end;
+
+function TDACacheEntry.GetData: TStream;
+begin
+ result := fData;
+ //Inc(fReadCount);
+end;
+
+function TDACacheEntry.GetExpirationTime: TDateTime;
+begin
+ result := fExpirationTime
+end;
+
+function TDACacheEntry.GetInvalid: boolean;
+begin
+ result := ((fMaxReads<>-1) and (fReadCount>=fMaxReads))
+ or
+ ((fExpirationTime<>-1) and (fExpirationTime<=Now));
+end;
+
+function TDACacheEntry.GetMaxReads: integer;
+begin
+ result := fMaxReads
+end;
+
+function TDACacheEntry.GetName: string;
+begin
+ result := fName
+end;
+
+function TDACacheEntry.GetOwnsStream: boolean;
+begin
+ result := fOwnsStream
+end;
+
+function TDACacheEntry.GetReadCount: integer;
+begin
+ result := fReadCount
+end;
+
+function TDACacheEntry.GetRecordCount: integer;
+begin
+ result := fRecordCount
+end;
+
+procedure TDACacheEntry.SetReadCount(const Value: integer);
+begin
+ if (Value>=0)
+ then fReadCount := Value
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAClasses.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAClasses.pas
new file mode 100644
index 0000000..ff233ea
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAClasses.pas
@@ -0,0 +1,1788 @@
+unit uDAClasses;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS} Windows,{$ENDIF}
+ Classes, SysUtils, uROClasses, uDAInterfaces, uDARes, uROTypes, uROClient,
+ uDADriverManager, uDAXMLUtils, SyncObjs, uROXMLIntf;
+
+type
+ TDAPoolBehaviour = (pbWait, pbRaiseError, pbIgnoreAndReturn);
+ TDAPoolTransactionBehaviour = (ptNone, ptRollback, ptCommit, ptCustom);
+
+const
+ def_PoolingEnabled = TRUE;
+ def_PoolBehaviour = pbWait;
+ def_MaxPoolSize = 10;
+ def_WaitIntervalSeconds = 1;
+ def_PoolTimeoutSeconds = 60;
+
+ def_SourceTableFieldName = '@SourceTable';
+
+type
+ { Forwards }
+ TDAConnectionManager = class;
+ TDADataDictionary = class;
+
+ { TStreamableComponent }
+ TPointerArray = array of pointer;
+
+ TDAStreamableComponent = class(TROComponent)
+ private
+ fTempPropertiesSaved: boolean;
+ fTempStorage: TPointerArray;
+
+ protected
+ procedure SaveNonStreamableProperties(var TempStorage: TPointerArray); virtual;
+ procedure RestoreNonStreamableProperties(const TempStorage: TPointerArray); virtual;
+
+ public
+ procedure Clear; virtual;
+
+ procedure LoadFromStream(aStream: TStream; aFormat: TDAPersistFormat=pfXML); virtual;
+ {$IFDEF UNICODE}
+ procedure LoadFromXml(aXML: Ansistring); overload;
+ {$ENDIF}
+ procedure LoadFromXml(aXML: string); overload;
+ procedure SaveToStream(aStream: TStream; aFormat: TDAPersistFormat=pfXML); virtual;
+ procedure LoadFromFile(const aFileName: string; aFormat: TDAPersistFormat=pfXML);
+ procedure SaveToFile(const aFileName: string; aFormat: TDAPersistFormat=pfXML);
+ end;
+
+ { TDAConnectionManager }
+ TDAConnectionNotifyEvent = procedure(Sender: TDAConnectionManager; const Connection: IDAConnection) of object;
+ TDAConnectionFailureEvent = procedure(Sender: TDAConnectionManager; Ex: Exception) of object;
+ TDAConnectionTimeoutEvent = procedure(Sender: TDAConnectionManager) of object;
+ TDAUnknownMacroVariableEvent = procedure (Sender: TObject; const Name: string; var Value: string) of object;
+
+ TDAConnectionManager = class(TDAStreamableComponent, IDAConnectionManager, IDAConnectionPool)
+ private
+ fConnections: TDAConnectionCollection;
+ fDriverManager: TDADriverManager;
+ fConnectionWait: TROEvent;
+
+ fMaxPoolSize: Cardinal;
+ fTotalConnections: Integer;
+ fConnectionCache: TThreadList;
+ fPoolTimeoutSeconds: cardinal;
+ fTimer: TROThreadTimer;
+ fOnConnectionReleased: TDAConnectionNotifyEvent;
+ fOnConnectionTimedOut: TDAConnectionTimeoutEvent;
+ fPoolBehaviour: TDAPoolBehaviour;
+ fOnConnectionAcquired: TDAConnectionNotifyEvent;
+ fWaitIntervalSeconds: cardinal;
+ fPoolingEnabled: boolean;
+ fOnConnectionCreated: TDAConnectionNotifyEvent;
+ FOnConnectionFailure: TDAConnectionFailureEvent;
+ fPoolTransactionBehaviour: TDAPoolTransactionBehaviour;
+ fOnUnknownMacroVariable: TDAUnknownMacroVariableEvent;
+ fOnCustomPoolTransactionBehavior: TDAConnectionNotifyEvent;
+
+ procedure SetMaxPoolSize(const Value: cardinal);
+ procedure SetPoolTimeoutSeconds(const Value: cardinal);
+
+ procedure SetConnections(const Value: TDAConnectionCollection);
+ procedure SetDriverManager(const Value: TDADriverManager);
+ procedure SetPoolingEnabled(const Value: boolean);
+ function UnknownMacroIdentifier(Sender: TObject; const Name, OrgName: string; var Value: string): Boolean;
+ protected
+ procedure Loaded; override;
+ procedure OnTimerTick(CurrentTickCount: cardinal); dynamic;
+
+ function CreateNewConnection(const ConnectionName: string;
+ OpenConnection: boolean = TRUE;
+ const UserID: string = '';
+ const Password: string = ''): IDAConnection;
+
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure SaveNonStreamableProperties(var TempStorage: TPointerArray); override;
+ procedure RestoreNonStreamableProperties(const TempStorage: TPointerArray); override;
+
+ procedure ReleaseConnection(const Conn: IDAConnection);
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure LoadFromStream(aStream: TStream; aFormat: TDAPersistFormat=pfXML); override;
+ procedure SaveToStream(aStream: TStream; aFormat: TDAPersistFormat=pfXML); override;
+
+ // IDAConnectionManager
+ function GetDefaultConnectionName: string;
+ function NewConnection(const aConnectionName: string;
+ OpenConnection: boolean = TRUE;
+ const UserID: string = '';
+ const Password: string = ''): IDAConnection;
+
+ procedure Clear; override;
+
+ property PoolSize: Integer read fTotalConnections;
+ procedure ClearPool;
+ procedure CheckProperties;
+ published
+ property MaxPoolSize: cardinal read fMaxPoolSize write SetMaxPoolSize default def_MaxPoolSize;
+ property PoolTimeoutSeconds: cardinal read fPoolTimeoutSeconds write SetPoolTimeoutSeconds default def_PoolTimeoutSeconds;
+ property PoolBehaviour: TDAPoolBehaviour read fPoolBehaviour write fPoolBehaviour default def_PoolBehaviour;
+
+ property OnConnectionAcquired: TDAConnectionNotifyEvent read fOnConnectionAcquired write fOnConnectionAcquired;
+ property OnConnectionTimedOut: TDAConnectionTimeoutEvent read fOnConnectionTimedOut write fOnConnectionTimedOut;
+ property OnConnectionCreated: TDAConnectionNotifyEvent read fOnConnectionCreated write fOnConnectionCreated;
+ property OnConnectionFailure: TDAConnectionFailureEvent read FOnConnectionFailure write FOnConnectionFailure;
+ property OnConnectionReleased: TDAConnectionNotifyEvent read fOnConnectionReleased write fOnConnectionReleased;
+ property OnCustomPoolTransactionBehavior: TDAConnectionNotifyEvent read fOnCustomPoolTransactionBehavior write fOnCustomPoolTransactionBehavior;
+ property OnUnknownMacroVariable: TDAUnknownMacroVariableEvent read fOnUnknownMacroVariable write fOnUnknownMacroVariable;
+
+ property WaitIntervalSeconds: cardinal read fWaitIntervalSeconds write fWaitIntervalSeconds default def_WaitIntervalSeconds;
+
+ property Connections: TDAConnectionCollection read fConnections write SetConnections;
+ property DriverManager: TDADriverManager read fDriverManager write SetDriverManager;
+
+ property PoolingEnabled: boolean read fPoolingEnabled write SetPoolingEnabled;
+ property PoolTransactionBehaviour: TDAPoolTransactionBehaviour read fPoolTransactionBehaviour write fPoolTransactionBehaviour default ptNone;
+ end;
+
+ { TDADataDictionary }
+ TDADataDictionary = class(TDAStreamableComponent, IDADataDictionary)
+ private
+ fFields: TDADataDictionaryFieldCollection;
+ procedure SetFields(const Value: TDADataDictionaryFieldCollection);
+ function GetFields: TDADataDictionaryFieldCollection;
+ protected
+ procedure SaveNonStreamableProperties(var TempStorage: TPointerArray); override;
+ procedure RestoreNonStreamableProperties(const TempStorage: TPointerArray); override;
+ public
+ constructor Create(aOwner: TComponent); override;
+ procedure Assign(Source: TPersistent); override;
+ destructor Destroy; override;
+ published
+ property Fields: TDADataDictionaryFieldCollection read GetFields write SetFields;
+ end;
+
+ TDADiagrams = class(TROComponent)
+ private
+ fDiagramData: string;
+ procedure ReadDiagramData(Reader: TReader);
+ procedure WriteDiagramData(Writer: TWriter);
+ protected
+ procedure DefineProperties(Filer: TFiler); override;
+ public
+ procedure LoadFromFile(const aFilename: string);
+ procedure SaveToFile(const aFilename: string);
+ end;
+
+ { TDASchema }
+ TDASchema = class;
+
+ TDASchemaElementType = (setDataset, setCommand);
+ TDAOnGetSQLEvent = procedure(Sender : TDASchema; const ElementName : string; ElementType : TDASchemaElementType; var SQL : string) of object;
+
+ TDASchema = class(TDAStreamableComponent, IDASchema, IDAHasDataDictionary)
+ private
+ fDatasets: TDADatasetCollection;
+ fJoinDataTables: TDAJoinDataTableCollection;
+ fUnionDataTables: TDAUnionDataTableCollection;
+ fCommands: TDASQLCommandCollection;
+ fConnectionManager: TDAConnectionManager;
+ fDataDictionary: TDADataDictionary;
+ fOnGetSQL: TDAOnGetSQLEvent;
+ fUpdateRules: TDAUpdateRuleCollection;
+ fRelationShips: TDADatasetRelationshipCollection;
+ fDiagrams: TDADiagrams;
+ fCustomAttributes: TStrings;
+ fVersion: Integer;
+ fMergeDataDictionaries: Boolean;
+
+ procedure SetConnectionManager(const Value: TDAConnectionManager);
+ procedure SetDataDictionary(const Value: TDADataDictionary);
+ procedure SetUpdateRules(const Value: TDAUpdateRuleCollection);
+ procedure SetRelationShips(const Value: TDADatasetRelationshipCollection);
+ procedure SetDiagrams(const Value: TDADiagrams);
+
+ function DoNewDataset(
+ const aConnection: IDAConnection;
+ const aName: string;
+ aDynSelectFields: array of string;
+ aWhereClause: UnicodeString;
+ aStatementName: string='';
+ OpenIt: boolean = false;
+ AlwaysGenerateDynamicWhereStatement: Boolean=False;
+ anUnionMapping: TDAColumnMappingCollection = nil
+ ): IDADataset;
+
+
+ protected
+ function GetDataDictionary: IDADataDictionary;
+ function MergeDataDictionaries: Boolean;
+ function GetCommands: TDASQLCommandCollection; virtual;
+ function GetDatasets: TDADatasetCollection; virtual;
+ function GetJoinDataTables: TDAJoinDataTableCollection; virtual;
+ function GetUnionDataTables: TDAUnionDataTableCollection; virtual;
+ procedure SetCommands(const Value: TDASQLCommandCollection); virtual;
+ procedure SetDatasets(const Value: TDADatasetCollection); virtual;
+ procedure SetJoinDataTables(const Value: TDAJoinDataTableCollection); virtual;
+ procedure SetUnionDataTables(const Value: TDAUnionDataTableCollection); virtual;
+
+ procedure Notification(aComponent: TComponent; Operation: TOperation); override;
+ procedure Loaded; override;
+
+ procedure SaveNonStreamableProperties(var TempStorage: TPointerArray); override;
+ procedure RestoreNonStreamableProperties(const TempStorage: TPointerArray); override;
+
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ function FindCommandStatement(const aConnection: IDAConnection; aSQLCommand: TDASQLCommand; aStatementName: string=''): TDAStatement;
+ // IDASchema
+ function GetDatasetText(const aConnection: IDAConnection; const aName: string): string; virtual;
+ function GetCommandText(const aConnection: IDAConnection; const aName: string): string; virtual;
+
+ function NewDataset(const aConnection: IDAConnection; const aName: string;
+ aStatementName: string='';OpenIt: boolean = false): IDADataset; overload; virtual;
+ function NewDataset(const aConnection: IDAConnection; const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ OpenIt: boolean = TRUE;
+ aStatementName: string=''): IDADataset; overload;
+ function NewDataset(const aConnection: IDAConnection; const aName: string;
+ aDynSelectFields: array of string;
+ aWhereClause: WideString;
+ aStatementName: string='';
+ OpenIt: boolean = false;
+ AlwaysGenerateDynamicWhereStatement: Boolean=False): IDADataset; overload;
+ function NewDataset(
+ const aConnection: IDAConnection;
+ const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ aDynSelectFields: array of string;
+ aWhereClause: WideString;
+ OpenIt: boolean = TRUE;
+ aStatementName: string=''): IDADataset; overload;
+
+ function NewUnionItemDataset(
+ const aConnection: IDAConnection;
+ const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ aDynSelectFields: array of string;
+ aWhereClause: UnicodeString;
+ anUnionMapping: TDAColumnMappingCollection): IDADataset;
+
+ function NewCommand(const aConnection: IDAConnection; const aName: string;
+ aStatementName: string=''): IDASQLCommand; overload; virtual;
+ function NewCommand(const aConnection: IDAConnection; const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ ExecuteIt: boolean = TRUE; aStatementName: string=''): IDASQLCommand; overload;
+
+ procedure Clear; override;
+
+ procedure Copy(aSourceSchema : TDASchema;
+ DatasetNames : array of string;
+ CommandNames : array of string;
+ UpdateRuleNames : array of string;
+ RelationShipNames : array of string); overload; deprecated;
+ procedure Copy(aSourceSchema : TDASchema;
+ DatasetNames : array of string;
+ CommandNames : array of string;
+ UpdateRuleNames : array of string;
+ RelationShipNames : array of string;
+ UnionDataTablesNames: array of string;
+ JoinDataTablesNames: array of string); overload;
+ procedure Copy(aSourceSchema : TDASchema;
+ IncludeDatasets : boolean = TRUE;
+ IncludeCommands : boolean = TRUE;
+ IncludeUpdateRules : boolean = TRUE;
+ IncludeRelationShips : boolean = TRUE;
+ IncludeUnionDataTables: boolean = True;
+ IncludeJoinDataTables: boolean = True); overload;
+ procedure CheckProperties;
+ function FindDataset(aDatasetName: String): TDADataset;
+ procedure SaveToStream(aStream: TStream;
+ aFormat: TDAPersistFormat = pfXML); override;
+ published
+ property ConnectionManager: TDAConnectionManager read fConnectionManager write SetConnectionManager;
+ property DataDictionary: TDADataDictionary read fDataDictionary write SetDataDictionary;
+ property Diagrams: TDADiagrams read fDiagrams write SetDiagrams;
+ property Datasets: TDADatasetCollection read GetDatasets write SetDatasets;
+ property JoinDataTables: TDAJoinDataTableCollection read GetJoinDataTables write SetJoinDataTables;
+ property UnionDataTables: TDAUnionDataTableCollection read GetUnionDataTables write SetUnionDataTables;
+ property Commands: TDASQLCommandCollection read GetCommands write SetCommands;
+ property RelationShips: TDADatasetRelationshipCollection read fRelationShips write SetRelationShips;
+ property UpdateRules : TDAUpdateRuleCollection read fUpdateRules write SetUpdateRules;
+
+ property OnGetSQL : TDAOnGetSQLEvent read fOnGetSQL write fOnGetSQL;
+ property Version : Integer read fVersion write fVersion;
+ property CustomAttributes : TStrings read fCustomAttributes;
+ end;
+
+procedure FillROStruct(const aDataset: IDADataset; const aStruct: TROComplexType);
+
+implementation
+
+uses TypInfo, uDAEngine, uDAUtils, DB, uDAMemDataTable, uDAWhere;
+
+procedure FillROStruct(const aDataset: IDADataset; const aStruct: TROComplexType);
+var
+ proplist: TStringList;
+ i: integer;
+ fld: TDACustomField;
+begin
+ proplist := TStringList.Create;
+ try
+ aStruct.GetFieldNames(proplist);
+ for i := 0 to (proplist.Count - 1) do begin
+ fld := aDataset.Fields.FindField(proplist[i]);
+ if (fld <> nil) then aStruct.SetFieldValue(proplist[i], fld.Value);
+ end;
+ finally
+ proplist.Free;
+ end;
+end;
+
+{ TDAStreamableComponent }
+
+procedure TDAStreamableComponent.LoadFromStream(aStream: TStream; aFormat: TDAPersistFormat);
+var
+ oldname: string;
+begin
+ Clear;
+
+ oldname := Name;
+ try Name := ''; except end;
+ try
+ case aFormat of
+ pfBinary: aStream.ReadComponent(Self);
+ pfXML: LoadObjectFromStream(aStream, Self, ['Name']);
+ end;
+
+ if fTempPropertiesSaved then begin
+ RestoreNonStreamableProperties(fTempStorage);
+ SetLength(fTempStorage, 0);
+ end;
+ finally
+ fTempPropertiesSaved := FALSE;
+ try Name := oldname; except end;
+ end;
+end;
+
+procedure TDAStreamableComponent.LoadFromXml(aXML: string);
+var lStream:TStringStream;
+begin
+ lStream := TStringStream.Create(aXML);
+ try
+ lStream.Seek(0,soFromBeginning);
+ LoadFromStream(lStream,pfXML);
+ finally
+ lStream.Free();
+ end;
+end;
+
+{$IFDEF UNICODE}
+procedure TDAStreamableComponent.LoadFromXml(aXML: Ansistring);
+var
+ lStream: TROBinaryMemoryStream;
+begin
+ lStream := TROBinaryMemoryStream.Create(aXML);
+ try
+ lStream.Seek(0,soFromBeginning);
+ LoadFromStream(lStream,pfXML);
+ finally
+ lStream.Free();
+ end;
+end;
+{$ENDIF}
+
+procedure TDAStreamableComponent.SaveToStream(aStream: TStream; aFormat: TDAPersistFormat);
+var
+ oldname: string;
+begin
+ fTempPropertiesSaved := TRUE;
+
+ oldname := Name;
+ //Name := '';
+ try
+ try
+ SaveNonStreamableProperties(fTempStorage);
+
+ case aFormat of
+ pfBinary: aStream.WriteComponent(Self);
+ pfXML: SaveObjectToStream(Self, aStream, ['Name']);
+ end;
+ finally
+ Name := oldname;
+ end;
+ except
+ fTempPropertiesSaved := FALSE;
+ raise;
+ end;
+end;
+
+procedure TDAStreamableComponent.SaveToFile(const aFileName: string;
+ aFormat: TDAPersistFormat);
+var
+ fs: TFileStream;
+begin
+ fs := TFileStream.Create(aFileName, fmCreate);
+ try
+ SaveToStream(fs, aFormat);
+ finally
+ fs.Free;
+ end;
+end;
+
+procedure TDAStreamableComponent.LoadFromFile(const aFileName: string;
+ aFormat: TDAPersistFormat);
+var
+ fs: TFileStream;
+begin
+ fs := TFileStream.Create(aFileName, fmOpenRead OR fmShareDenyWrite);
+ try
+ LoadFromStream(fs, aFormat);
+ finally
+ fs.Free;
+ end;
+end;
+
+procedure TDAStreamableComponent.RestoreNonStreamableProperties(
+ const TempStorage: TPointerArray);
+begin
+end;
+
+procedure TDAStreamableComponent.SaveNonStreamableProperties(
+ var TempStorage: TPointerArray);
+begin
+
+end;
+
+procedure TDAStreamableComponent.Clear;
+begin
+end;
+
+type
+ TCachedConnection = class
+ private
+ fConnection: IDAConnection;
+ fLastUse: TDateTime;
+ public
+ constructor Create(const aConnection: IDAConnection);
+ property Connection: IDAConnection read fConnection write fConnection;
+ property LastUse: TDateTime read fLastUse write fLastUse;
+ end;
+
+constructor TCachedConnection.Create(const aConnection: IDAConnection);
+begin
+ inherited Create;
+ fConnection := aConnection;
+ fLastUse := Now;
+end;
+
+{ TDAConnectionManager }
+
+constructor TDAConnectionManager.Create(aOwner: TComponent);
+begin
+ inherited;
+ fConnectionWait := TROEvent.Create(nil, false, false, '');
+
+ fConnections := TDAConnectionCollection.Create(Self);
+
+ fPoolingEnabled := def_PoolingEnabled;
+ fPoolBehaviour := def_PoolBehaviour;
+ fMaxPoolSize := def_MaxPoolSize;
+ fWaitIntervalSeconds := def_WaitIntervalSeconds;
+ fPoolTimeoutSeconds := def_PoolTimeoutSeconds;
+
+ fConnectionCache := TThreadList.Create;
+end;
+
+destructor TDAConnectionManager.Destroy;
+begin
+ DriverManager := nil;
+
+ fConnections.Free;
+ ClearPool;
+ fConnectionCache.Free;
+
+ fTimer.Free;
+ fConnectionWait.Free;
+ inherited;
+end;
+
+procedure TDAConnectionManager.SetConnections(const Value: TDAConnectionCollection);
+begin
+ fConnections.Assign(Value);
+end;
+
+function TDAConnectionManager.CreateNewConnection(const ConnectionName: string;
+ OpenConnection: boolean = TRUE;
+ const UserID: string = '';
+ const Password: string = ''): IDAConnection;
+var
+ conndef: TDAConnection;
+ drv: IDADriver;
+ mac: IDAHasMacroProcessor;
+ drvid: string;
+begin
+ CheckProperties;
+
+ conndef := Connections.ItemByName(ConnectionName) as TDAConnection; // Raises exception if not found
+ drvid := TDAConnectionStringParser.ExtractDriverID(conndef.ConnectionString);
+
+ drv := fDriverManager.DriverByDriverID(drvid); // Raises exception if not found
+ result := drv.NewConnection(self, conndef);
+
+ // If not empty strings, these will override any specific UserID, Password specified below
+ result.ConnectionString := conndef.ConnectionString;
+
+ if (UserID <> '') then result.UserID := UserID;
+ if (Password <> '') then result.Password := Password;
+
+ if OpenConnection then result.Open;
+
+ if Assigned(fOnConnectionCreated) then fOnConnectionCreated(Self, result);
+ if Supports(Result, IDAHasMacroProcessor, mac) and (mac.GetMacroProcessor <> nil) then begin
+ mac.GetMacroProcessor.OnUnknownIdentifier := UnknownMacroIdentifier;
+ end;
+end;
+
+procedure TDAConnectionManager.SetDriverManager(const Value: TDADriverManager);
+begin
+ if fDriverManager <> Value then begin
+ if (fDriverManager <> nil) then fDriverManager.RORemoveFreeNotification(Self);
+ fDriverManager := Value;
+ ClearPool();
+ if (fDriverManager <> nil) then fDriverManager.ROFreeNotification(Self);
+ end;
+end;
+
+procedure TDAConnectionManager.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited;
+
+ if (Operation <> opRemove) then Exit;
+ if (AComponent = fDriverManager) then DriverManager := nil;
+end;
+
+procedure TDAConnectionManager.RestoreNonStreamableProperties(
+ const TempStorage: TPointerArray);
+begin
+ DriverManager := TempStorage[0];
+end;
+
+procedure TDAConnectionManager.SaveNonStreamableProperties(
+ var TempStorage: TPointerArray);
+begin
+ SetLength(TempStorage, 1);
+ TempStorage[0] := DriverManager;
+end;
+
+function TDAConnectionManager.GetDefaultConnectionName: string;
+var
+ i: integer;
+begin
+ result := '';
+ for i := 0 to (fConnections.Count - 1) do
+ if Connections[i].Default then begin
+ result := Connections[i].Name;
+ Exit;
+ end;
+end;
+
+procedure TDAConnectionManager.Clear;
+begin
+ fConnections.Clear;
+end;
+
+procedure TDAConnectionManager.SetMaxPoolSize(const Value: cardinal);
+begin
+ fMaxPoolSize := Value;
+end;
+
+procedure TDAConnectionManager.SetPoolTimeoutSeconds(const Value: cardinal);
+begin
+ if (fPoolTimeoutSeconds = Value) and (fTimer <> nil) then Exit;
+ fPoolTimeoutSeconds := Value;
+
+ if not (csDesigning in ComponentState) then begin
+ if (PoolSize > 0) then RaiseError(err_PoolIsNotEmpty);
+
+ if Assigned(fTimer) then begin
+ fTimer.Free;
+ fTimer := nil;
+ end;
+
+ if (fPoolTimeoutSeconds > 0) then fTimer := TROThreadTimer.Create(OnTimerTick, fPoolTimeoutSeconds * 500);
+ end;
+end;
+
+procedure TDAConnectionManager.OnTimerTick(CurrentTickCount: cardinal);
+var
+ i: integer;
+ tempconn: TCachedConnection;
+ list: TList;
+begin
+ list := fConnectionCache.LockList;
+ try
+ for i := list.Count - 1 downto 0 do
+ begin
+ tempconn := TCachedConnection(list[i]);
+ if tempconn.LastUse + (fPoolTimeoutSeconds / 86400.0) < Now then begin
+ if Assigned(fOnConnectionTimedOut) then fOnConnectionTimedOut(Self);
+ list.Delete(i);
+ tempconn.Connection.ConnectionPool := nil;
+ tempconn.Free;
+ dec(fTotalConnections);
+ end;
+ end;
+ finally
+ fConnectionCache.UnlockList;
+ end;
+end;
+
+function TDAConnectionManager.NewConnection(const aConnectionName: string;
+ OpenConnection: boolean = TRUE; const UserID: string = ''; const Password: string = ''): IDAConnection;
+var
+ i: integer;
+ conn: TDAConnection;
+ list: TList;
+ tempconn: TCachedConnection;
+begin
+ try
+ // If pooling is not enable immediately creates a connection.
+ // This is the quickest way to Acquire one
+ if not fPoolingEnabled then begin
+ result := CreateNewConnection(aConnectionName, OpenConnection, UserID, Password);
+ if Assigned(fOnConnectionAcquired) then fOnConnectionAcquired(Self, result);
+ Exit;
+ end;
+
+ // Pooling is enabled and has to be thread safe
+ result := nil;
+ conn := fConnections.ConnectionByName(aConnectionName);
+ while true do begin
+ list := fConnectionCache.LockList;
+ try
+ for i := list.Count -1 downto 0 do begin
+ tempconn := TCachedConnection(list[i]);
+ if not tempconn.Connection.IsAlive then begin
+ tempconn.Connection:=nil;
+ list.Delete(i);
+ end;
+ end;
+ for i := 0 to list.Count -1 do begin
+ tempconn := TCachedConnection(list[i]);
+
+ if SameText(tempconn.Connection.ConnectionString, conn.ConnectionString) and
+ SameText(tempconn.Connection.ConnectionType, conn.ConnectionType) then begin
+ list.Delete(i);
+ Result := tempconn.Connection;
+ tempconn.Free;
+ if Assigned(fOnConnectionAcquired) then fOnConnectionAcquired(Self, result);
+ Exit;
+ end;
+ end;
+
+ // If it doesn't find one and the max poolsize is not reached then creates it...
+ if Cardinal(fTotalConnections) < fMaxPoolSize then begin
+ result := CreateNewConnection(aConnectionName, OpenConnection, UserID, Password);
+ result.ConnectionPool := self;
+ inc(fTotalConnections);
+ if Assigned(fOnConnectionAcquired) then fOnConnectionAcquired(Self, result);
+ Exit;
+ end;
+
+ finally
+ fConnectionCache.UnlockList;
+ end;
+ // Otherwise either waits and tries again or raises an error
+ case PoolBehaviour of
+ pbRaiseError: RaiseError(err_MaxPoolSizeReached);
+ pbWait: begin
+ if fConnectionWait.WaitFor(1000 * fWaitIntervalSeconds) <> wrSignaled then
+ RaiseError(err_MaxPoolSizeReached);
+ end;
+ pbIgnoreAndReturn: Exit;
+ end;
+ end;
+ except
+ on e: Exception do begin
+ if assigned(FOnConnectionFailure) then FOnConnectionFailure(self, E);
+ raise;
+ end;
+ end;
+end;
+
+procedure TDAConnectionManager.ReleaseConnection(const Conn: IDAConnection);
+var
+ list: TList;
+begin
+ case fPoolTransactionBehaviour of
+ ptRollback: if Conn.InTransaction then Conn.RollbackTransaction;
+ ptCommit: if Conn.InTransaction then Conn.CommitTransaction;
+ ptCustom: if Conn.InTransaction and assigned(fOnCustomPoolTransactionBehavior) then
+ fOnCustomPoolTransactionBehavior(Self, Conn);
+ end;
+ if assigned(fOnConnectionReleased) then
+ fOnConnectionReleased(Self, Conn);
+ if fPoolingEnabled then begin
+ list := fConnectionCache.LockList;
+ try
+ if (Cardinal(list.Count) < fMaxPoolSize) and Conn.isAlive then begin
+ fConnectionCache.Add(TCachedConnection.Create(Conn))
+ end else
+ Dec(fTotalConnections);
+ finally
+ fConnectionCache.UnlockList;
+ end;
+ fConnectionWait.SetEvent;
+ end
+ else begin
+ if Conn.ConnectionPool <> nil then begin
+ Dec(fTotalConnections);
+ Conn.ConnectionPool := nil;
+ end;
+ end;
+end;
+
+procedure TDAConnectionManager.SetPoolingEnabled(const Value: boolean);
+begin
+ fPoolingEnabled := Value;
+end;
+
+procedure TDAConnectionManager.ClearPool;
+var
+ i: Integer;
+ list: TList;
+begin
+ list := fConnectionCache.LockList;
+ try
+ for i := list.Count -1 downto 0 do begin
+ TCachedConnection(List[i]).Connection.ConnectionPool := nil;
+ TCachedConnection(List[i]).Free;
+ end;
+ Dec(fTotalConnections, list.Count);
+ list.Clear;
+ finally
+ fConnectionCache.UnlockList;
+ end;
+end;
+
+const
+ nn_Connections = 'Connections';
+ nn_Definitions = 'Definitions';
+ nn_Definition = 'Definition';
+
+ nn_PoolingEnabled = 'PoolingEnabled';
+ nn_PoolingBehavior = 'PoolingBehavior';
+ nn_MaxPoolSize = 'MaxPoolSize';
+ nn_WaitIntervalSeconds = 'WaitIntervalSeconds';
+ nn_PoolTimeoutSeconds = 'PoolTimeoutSeconds';
+
+ nn_ConnectionString = 'ConnectionString';
+ nn_Default = 'Default';
+ nn_Name = 'Name';
+ nn_Description = 'Description';
+ nn_ConnectionType = 'ConnectionType';
+
+procedure TDAConnectionManager.LoadFromStream(aStream: TStream;
+ aFormat: TDAPersistFormat);
+var buff: array[0..21] of char;
+ xmlDoc: IXMLDocument;
+ s: string;
+ i : integer;
+ connsNode, thisNode: IXMLNode;
+ conn: TDAConnection;
+begin
+ aStream.Position := 0;
+ aStream.ReadBuffer(buff, SizeOf(buff));
+ if (buff<>'') then begin
+ aStream.Position := 0;
+ xmlDoc := NewROXmlDocument;
+ xmlDoc.New();
+ xmlDoc.LoadFromStream(aStream);
+
+ Clear;
+
+ PoolingEnabled := xmlDoc.DocumentNode.GetNodeValue(nn_PoolingEnabled, def_PoolingEnabled);
+ // TDAPoolBehaviour = (pbWait, pbRaiseError, pbIgnoreAndReturn);
+ s := xmlDoc.DocumentNode.GetNodeValue(nn_PoolingBehavior, GetEnumName(TypeInfo(TDAPoolBehaviour), Ord(def_PoolBehaviour)));
+ if (Pos('pb', s)<>1) then s := 'pb'+s;
+ PoolBehaviour := TDAPoolBehaviour(GetEnumValue(TypeInfo(TDAPoolBehaviour), s));
+ MaxPoolSize := xmlDoc.DocumentNode.GetNodeValue(nn_MaxPoolSize, def_MaxPoolSize);
+ WaitIntervalSeconds := xmlDoc.DocumentNode.GetNodeValue(nn_WaitIntervalSeconds, def_WaitIntervalSeconds);
+ PoolTimeoutSeconds := xmlDoc.DocumentNode.GetNodeValue(nn_PoolTimeoutSeconds, def_PoolTimeoutSeconds);
+
+ connsNode := xmlDoc.DocumentNode.GetNodeByName(nn_Definitions);
+ if (connsNode=NIL) then Exit;
+ for i := 0 to (connsNode.ChildrenCount-1) do begin
+ thisNode := connsNode.Children[i];
+ if thisNode.Name <> nn_Definition then continue;
+
+ conn := Connections.Add;
+ conn.Name := thisNode.GetNodeValue(nn_Name, 'Connection'+IntToStr(i+1));
+ conn.Description:= thisNode.GetNodeValue(nn_Description, '');
+ conn.Default := thisNode.GetNodeValue(nn_Default, FALSE);
+ conn.ConnectionString := thisNode.GetNodeValue(nn_ConnectionString, '');
+ conn.ConnectiontYPE := thisNode.GetNodeValue(nn_ConnectionType, '');
+ end;
+ end
+ else inherited;
+end;
+
+procedure TDAConnectionManager.SaveToStream(aStream: TStream;
+ aFormat: TDAPersistFormat);
+var xmlDoc : IXMLDocument;
+ connNode, thisNode: IXMLNode;
+ s: string;
+ i: integer;
+begin
+ if (aFormat=pfBinary) then begin
+ inherited;
+ Exit;
+ end;
+
+ xmlDoc := NewROXmlDocument;
+ xmlDoc.New(nn_Connections);
+ thisNode := xmlDoc.DocumentNode;
+
+ thisnode.Add(nn_PoolingEnabled).Value := PoolingEnabled;
+ s := GetEnumName(TypeInfo(TDAPoolBehaviour), Ord(PoolBehaviour));
+ thisnode.Add(nn_PoolingBehavior).Value := Copy(s, 3, MaxInt);
+ thisnode.Add(nn_MaxPoolSize).Value := MaxPoolSize;
+ thisnode.Add(nn_WaitIntervalSeconds).Value := WaitIntervalSeconds;
+ thisnode.Add(nn_PoolTimeoutSeconds).Value := PoolTimeoutSeconds;
+
+ connNode := thisNode.Add(nn_Definitions);
+ for i := 0 to (Connections.Count-1) do begin
+ thisNode := connNode.Add(nn_Definition);
+ thisNode.Add(nn_Name).Value := Connections[i].Name;
+ thisNode.Add(nn_ConnectionString).Value := Connections[i].ConnectionString;
+ thisNode.Add(nn_Default).Value := Connections[i].Default;
+ thisNode.Add(nn_Description).Value := Connections[i].Description;
+ thisNode.Add(nn_ConnectionType).Value := Connections[i].ConnectionType;
+ end;
+
+ xmlDoc.SaveToStream(aStream);
+end;
+
+procedure TDAConnectionManager.Loaded;
+begin
+ inherited;
+ if not (csDesigning in ComponentState) then
+ begin
+ SetPoolTimeoutSeconds(fPoolTimeoutSeconds);
+ end;
+end;
+
+function TDAConnectionManager.UnknownMacroIdentifier(Sender: TObject;
+ const Name, OrgName: string; var Value: string): Boolean;
+begin
+ Value := Name;
+ result := TRUE;
+ if assigned(fOnUnknownMacroVariable) then begin
+ fOnUnknownMacroVariable(Self, OrgName, Value);
+ end;
+end;
+
+procedure TDAConnectionManager.Assign(Source: TPersistent);
+var
+ lSource: TDAConnectionManager;
+begin
+ inherited;
+ if Source is TDAConnectionManager then begin
+ lSource := TDAConnectionManager(Source);
+
+ Connections := lSource.Connections;
+ DriverManager := lSource.DriverManager;
+ MaxPoolSize := lSource.MaxPoolSize;
+ OnConnectionAcquired := lSource.OnConnectionAcquired;
+ OnConnectionCreated := lSource.OnConnectionCreated;
+ OnConnectionFailure := lSource.OnConnectionFailure;
+ OnConnectionReleased := lSource.OnConnectionReleased;
+ OnConnectionTimedOut := lSource.OnConnectionTimedOut;
+ OnCustomPoolTransactionBehavior := lSource.OnCustomPoolTransactionBehavior;
+ OnUnknownMacroVariable := lSource.OnUnknownMacroVariable;
+ PoolBehaviour := lSource.PoolBehaviour;
+ PoolingEnabled := lSource.PoolingEnabled;
+ PoolTimeoutSeconds := lSource.PoolTimeoutSeconds;
+ PoolTransactionBehaviour := lSource.PoolTransactionBehaviour;
+ WaitIntervalSeconds := lSource.WaitIntervalSeconds;
+ end;
+end;
+
+procedure TDAConnectionManager.CheckProperties;
+begin
+ Check(not Assigned(DriverManager), Name + '. '+err_DriverManagerNotAssigned);
+end;
+
+{ TDADataDictionary }
+
+procedure TDADataDictionary.Assign(Source: TPersistent);
+var
+ lSource: TDADataDictionary;
+begin
+ inherited;
+ if Source is TDADataDictionary then begin
+ lSource := TDADataDictionary(Source);
+ Fields := lSource.Fields;
+ end;
+end;
+
+constructor TDADataDictionary.Create(aOwner: TComponent);
+begin
+ inherited;
+ fFields := TDADataDictionaryFieldCollection.Create(self, TDADataDictionaryField);
+end;
+
+destructor TDADataDictionary.Destroy;
+begin
+ fFields.Free;
+ inherited;
+end;
+
+function TDADataDictionary.GetFields: TDADataDictionaryFieldCollection;
+begin
+ result := fFields;
+end;
+
+procedure TDADataDictionary.RestoreNonStreamableProperties(const TempStorage: TPointerArray);
+begin
+
+end;
+
+procedure TDADataDictionary.SaveNonStreamableProperties(var TempStorage: TPointerArray);
+begin
+
+end;
+
+procedure TDADataDictionary.SetFields(const Value: TDADataDictionaryFieldCollection);
+begin
+ fFields.Assign(Value);
+end;
+
+{ TDASchema }
+
+constructor TDASchema.Create(aOwner: TComponent);
+begin
+ inherited;
+ fCustomAttributes := TStringList.Create;
+ fDatasets := TDADatasetCollection.Create(Self);
+ fJoinDataTables := TDAJoinDataTableCollection.Create(Self);
+ fUnionDataTables := TDAUnionDataTableCollection.Create(Self);
+ fCommands := TDASQLCommandCollection.Create(Self);
+ fRelationShips := TDADatasetRelationshipCollection.Create(Self);
+ fUpdateRules := TDAUpdateRuleCollection.Create(Self);
+end;
+
+destructor TDASchema.Destroy;
+begin
+ ConnectionManager := nil;
+ DataDictionary := nil;
+ Diagrams := nil;
+ FreeAndNil(fDatasets);
+ FreeAndNil(fJoinDataTables);
+ FreeAndNil(fUnionDataTables);
+ FreeAndNil(fCommands);
+ FreeAndNil(fRelationShips);
+ FreeAndNil(fUpdateRules);
+ fCustomAttributes.Free;
+
+ inherited;
+end;
+
+procedure TDASchema.Notification(aComponent: TComponent; Operation: TOperation);
+begin
+ inherited;
+ if (Operation <> opRemove) then Exit;
+ if aComponent = ConnectionManager then
+ ConnectionManager := nil
+ else if aComponent = DataDictionary then
+ DataDictionary := nil
+ else if aComponent = Diagrams then
+ Diagrams := nil;
+end;
+
+function TDASchema.GetCommands: TDASQLCommandCollection;
+begin
+ Result := fCommands;
+end;
+
+function TDASchema.GetDatasets: TDADatasetCollection;
+begin
+ Result := fDatasets;
+end;
+
+function TDASchema.GetJoinDataTables: TDAJoinDataTableCollection;
+begin
+ Result := fJoinDataTables;
+end;
+
+function TDASchema.GetUnionDataTables: TDAUnionDataTableCollection;
+begin
+ Result := fUnionDataTables;
+end;
+
+procedure TDASchema.SetCommands(const Value: TDASQLCommandCollection);
+begin
+ fCommands.Assign(Value);
+end;
+
+procedure TDASchema.SetDatasets(const Value: TDADatasetCollection);
+begin
+ fDatasets.Assign(Value);
+end;
+
+procedure TDASchema.SetJoinDataTables(const Value: TDAJoinDataTableCollection);
+begin
+ fJoinDataTables.Assign(Value);
+end;
+
+procedure TDASchema.SetUnionDataTables(const Value: TDAUnionDataTableCollection);
+begin
+ fUnionDataTables.Assign(Value);
+end;
+
+procedure TDASchema.Loaded;
+begin
+ inherited;
+end;
+
+procedure TDASchema.SetConnectionManager(const Value: TDAConnectionManager);
+begin
+ if fConnectionManager <> Value then begin
+ if (fConnectionManager <> nil) then fConnectionManager.RORemoveFreeNotification(Self);
+ fConnectionManager := Value;
+ if (fConnectionManager <> nil) then fConnectionManager.ROFreeNotification(Self);
+ end;
+end;
+
+procedure TDASchema.SetDataDictionary(const Value: TDADataDictionary);
+begin
+ if fDataDictionary <> Value then begin
+ if (fDataDictionary <> nil) then fDataDictionary.RORemoveFreeNotification(Self);
+ fDataDictionary := Value;
+ if (fDataDictionary <> nil) then fDataDictionary.ROFreeNotification(Self);
+ end;
+end;
+
+procedure TDASchema.RestoreNonStreamableProperties(
+ const TempStorage: TPointerArray);
+begin
+ fConnectionManager := TempStorage[0];
+ fDataDictionary := TempStorage[1];
+end;
+
+procedure TDASchema.SaveNonStreamableProperties(
+ var TempStorage: TPointerArray);
+begin
+ SetLength(TempStorage, 2);
+ TempStorage[0] := fConnectionManager;
+ TempStorage[1] := fDataDictionary;
+end;
+
+function TDASchema.GetCommandText(const aConnection: IDAConnection; const aName: string): string;
+var
+ cmd: TDASQLCommand;
+begin
+ cmd := TDASQLCommand(Commands.ItemByName(aName));
+ result := FindCommandStatement(aConnection, cmd).SQL;
+end;
+
+function TDASchema.GetDatasetText(const aConnection: IDAConnection; const aName: string): string;
+var
+ ds: TDADataset;
+begin
+ ds := TDADataset(Datasets.ItemByName(aName));
+ result := FindCommandStatement(aConnection, ds).SQL;
+end;
+
+function TDASchema.FindCommandStatement(const aConnection: IDAConnection; aSQLCommand: TDASQLCommand; aStatementName: string=''): TDAStatement;
+var
+ connname: string;
+ i: integer;
+begin
+ // Tries to find the statement associated with the given connection
+
+ result := nil;
+ if (aConnection <> nil) then begin
+ connname := aConnection.Name;
+ result := TDAStatement(aSQLCommand.Statements.FindItem(connname, aStatementName));
+ end;
+
+ //check for statement matching the connection TYPE of the active connection [matching means same *non-empty* value for both]
+ if (Result = nil) and assigned(aConnection) and (aConnection.ConnectionType<>'') then begin
+ For i:=0 to aSQLCommand.Statements.Count-1 do
+ if AnsiSameText(aConnection.ConnectionType,aSQLCommand.Statements[i].ConnectionType) then begin
+ Result:=aSQLCommand.Statements[i];
+ Break;
+ end;
+ end;
+
+ //check for a default statement ["Default" is new property on statement]
+ if (Result = nil) then
+ For i:=0 to aSQLCommand.Statements.Count-1 do
+ if aSQLCommand.Statements[i].Default then begin
+ Result:=aSQLCommand.Statements[i];
+ Break;
+ end;
+
+ // If none is found then reverts to the default connection
+ if (result = nil) then begin
+ connname := ConnectionManager.GetDefaultConnectionName;
+ result := TDAStatement(aSQLCommand.Statements.FindItem(connname, aStatementName));
+ end;
+
+ Check(result = nil, err_CannotFindStatement, [aSQLCommand.Name, connname]);
+end;
+
+{function TDASchema.NewDataset(aConnectionName: string; const aName: string): IDADataset;
+begin
+ Check(not Assigned(ConnectionManager), err_ConnectionManagerNotAssigned);
+ result := NewDataset(ConnectionManager.NewConnection(aConnectionName), aName);
+end;}
+
+function TDASchema.NewUnionItemDataset(
+ const aConnection: IDAConnection;
+ const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ aDynSelectFields: array of string;
+ aWhereClause: UnicodeString;
+ anUnionMapping: TDAColumnMappingCollection): IDADataset;
+var
+ i: integer;
+begin
+ if (High(ParamNames) <> High(ParamValues)) then RaiseError('Names and values counts are different');
+
+ result := Self.DoNewDataset(aConnection, aName, aDynSelectFields, aWhereClause,
+ '', false, false, //default values
+ anUnionMapping);
+
+ for i := 0 to High(ParamValues) do
+ result.ParamByName(ParamNames[i]).Value := ParamValues[i];
+
+end;
+
+function TDASchema.NewDataset(
+ const aConnection: IDAConnection;
+ const aName: string;
+ aDynSelectFields: array of string;
+ aWhereClause: WideString;
+ aStatementName: string;
+ OpenIt: boolean;
+ AlwaysGenerateDynamicWhereStatement:Boolean): IDADataset;
+begin
+ result := Self.DoNewDataset(aConnection, aName, aDynSelectFields,
+ aWhereClause, aStatementName, OpenIt, AlwaysGenerateDynamicWhereStatement,
+ nil);
+end;
+
+function TDASchema.DoNewDataset(
+ const aConnection: IDAConnection;
+ const aName: string;
+ aDynSelectFields: array of string;
+ aWhereClause: UnicodeString;
+ aStatementName: string;
+ OpenIt: boolean;
+ AlwaysGenerateDynamicWhereStatement:Boolean;
+ anUnionMapping: TDAColumnMappingCollection): IDADataset;
+
+var
+ ds: TDADataset;
+ fld : TDAField;
+
+ function IsRealField(aFieldName: string; ACheckForCalulated: boolean): boolean;
+ begin
+ Result:=not SameText(aFieldName, def_SourceTableFieldName);
+ if Result and ACheckForCalulated then begin
+ fld:=ds.Fields.FindField(aFieldName);
+ if fld <> nil then
+ Result:= not fld.Calculated;
+ end;
+ end;
+
+var
+ sql: string;
+ statement: TDAStatement;
+ i,j: integer;
+ lConnection: IDAConnection;
+ lFields: TDAFieldCollection;
+ lFields2:TDAFieldCollection;
+ lColumnMapping: TDAColumnMapping;
+ lWhereFields: TWhereFieldsArray;
+ lWhereFlag: Boolean;
+ lstatname: string;
+ lWhereClause: UnicodeString;
+ lserversideDynWhere: Unicodestring;
+ lwb: TDAQueryBuilder;
+begin
+ lConnection := aConnection;
+ if not assigned(lConnection) then begin
+ CheckProperties;
+ lConnection := ConnectionManager.NewConnection(ConnectionManager.GetDefaultConnectionName);
+ end;
+ result := nil;
+ lColumnMapping := nil;
+ SetLength(lWhereFields,0); // remove warning
+ ds := (Datasets.DatasetByName(aName) as TDADataset);
+ if Assigned(ds) then begin
+ lserversideDynWhere := Trim(ds.DynamicWhereXML);
+ statement := FindCommandStatement(lConnection, ds, aStatementName);
+ sql := statement.SQL;
+ // generate AutoSQL
+ if statement.StatementType = stAutoSQL then begin
+ if statement.TargetTable = '' then begin
+ if statement.Name = '' then
+ lstatname:= '['+statement.ConnectionType+']'
+ else
+ lstatname:= statement.Name;
+ raise Exception.Create(aName+'. Statement: '+lstatname+ '. TargetTable must be specified.');
+ end;
+ lwb := aConnection.GetQueryBuilder;
+ With lwb do try
+ if Length(aDynSelectFields) > 0 then begin
+ For i:=0 to ds.Fields.Count-1 do begin
+ fld:=ds.Fields[i];
+ if not (not Assigned(fld) or fld.Calculated or fld.Lookup or fld.ServerCalculated) then
+ for j:=Low(aDynSelectFields) to High(aDynSelectFields) do
+ if SameText(aDynSelectFields[j],Fld.Name) then begin
+ AddSelect('',fld.Name);
+ Break;
+ end;
+ end;
+ end
+ else begin
+ For i:=0 to ds.Fields.Count-1 do begin
+ fld:=ds.Fields[i];
+ if not (fld.Calculated or fld.Lookup or fld.ServerCalculated) then
+ AddSelect('',fld.Name);
+ end;
+ end;
+ MainTable.MasterTable:=statement.TargetTable;
+ if (aWhereClause <> '') or AlwaysGenerateDynamicWhereStatement or (lserversideDynWhere <> '') then
+ Options := Options + [qboGenerateDynamicWhereStatement];
+ ColumnMapping:=statement.ColumnMappings;
+ sql := GenerateSelectSQL;
+ finally
+ Free;
+ end;
+ end;
+
+ if Assigned(fOnGetSQL) then fOnGetSQL(Self, aName, setDataset, sql);
+
+ result := lConnection.NewDataset(sql, aName);
+
+ if (aWhereClause <> '') or (lserversideDynWhere <> '') then begin
+
+ //Do remapping for unions
+ if (aWhereClause <> '') then begin
+ if (Assigned(anUnionMapping)) then
+ lWhereClause := Where_RemapFieldNames(aWhereClause, anUnionMapping, statement.TargetTable)
+ else
+ lWhereClause := aWhereClause;
+ Result.DynamicWhere.Xml := lWhereClause;
+ end;
+
+ if lserversideDynWhere <> '' then begin
+ with Result.DynamicWhere do
+ try
+ if Expression <> nil then
+ Expression := NewBinaryExpression(Expression,XMLToExpression(lserversideDynWhere), dboAnd)
+ else
+ Expression := XMLToExpression(lserversideDynWhere);
+ except
+ raise EDAException.Create('Can''t apply Dynamic Expression:'#13#10+lserversideDynWhere);
+ end;
+ end;
+
+ if Result.DynamicWhere.Expression <> nil then Where_RemapTableNames(Result.DynamicWhere.Expression, aName, statement.TargetTable);
+
+ // Checking conformity dynamic where fields to table fields
+ lWhereFields := Where_ExtractFieldNames(Result.DynamicWhere.Expression);
+ if Length(lWhereFields) <> 0 then begin
+ {// remapping
+ for i:=0 to High(lWhereFields) do begin
+ lColumnMapping := statement.ColumnMappings.FindMappingByDatasetField(lWhereFields[i]);
+ if Assigned(lColumnMapping) then lWhereFields[i] := lColumnMapping.TableField;
+ end;
+ }
+ if Length(aDynSelectFields) > 0 then begin
+ For i:= 0 to High(lWhereFields) do begin
+ lWhereFlag:=False;
+ for j:=0 to High(aDynSelectFields) do
+ if IsRealField(aDynSelectFields[j],True) then
+ if SameText(lWhereFields[i],aDynSelectFields[j]) then begin
+ lWhereFlag:=True;
+ break;
+ end;
+ if not lWhereFlag then
+ raise EDAException.CreateFmt('''%s'' field can''t be used inside the where clause',[lWhereFields[i]]);
+ end;
+ end
+ else begin
+ For i:= 0 to High(lWhereFields) do begin
+ lWhereFlag:= ds.Fields.Count = 0;
+ for j:=0 to ds.Fields.Count-1 do
+ if not ds.Fields[j].Calculated and IsRealField(ds.Fields[j].Name, False) then
+ if SameText(lWhereFields[i],ds.Fields[j].Name) then begin
+ lWhereFlag:=True;
+ break;
+ end;
+ if not lWhereFlag then
+ raise EDAException.CreateFmt('''%s'' field can''t be used inside the where clause',[lWhereFields[i]]);
+ end;
+ end;
+ end;
+ // end Checking conformity dynamic where fields to table fields
+ Result.DynamicWhere.ColumnMapping := statement.ColumnMappings;
+ end;
+ // Copies the definitions of the schema
+
+ { not sure if this is unproblematic, but we need to copy access to the data
+ dictionary. though some more explicit access (say a Fields.DataDictionary
+ property would be better. }
+
+ result.Fields.DataDictionary := self.DataDictionary;
+ if statement.StatementType <> stAutoSQL then begin
+ result.Fields.AssignFieldCollection(ds.Fields);
+
+ with statement do
+ for i := 0 to (ColumnMappings.Count - 1) do begin
+ fld := result.Fields.FieldByName(ColumnMappings[i].DatasetField);
+
+ fld.TableField := ColumnMappings[i].TableField;
+ fld.SQLOrigin := ColumnMappings[i].SQLOrigin;
+ end;
+ end else begin
+ // stAutoSQL
+ lFields:=nil;
+ if ds.Fields.Count = 0 then begin
+ lConnection.GetTableFields(statement.TargetTable,lFields);
+ lFields2:=lFields;
+ end
+ else begin
+ lFields2:=ds.Fields;
+ end;
+ try
+ if Length(aDynSelectFields) > 0 then begin
+ if statement.ColumnMappings.Count = 0 then begin
+ For i:=0 to High(aDynSelectFields) do begin
+ if aDynSelectFields[i] = def_SourceTableFieldName then Continue;
+ fld:=Result.Fields.Add;
+ fld.AssignField(lfields2.FieldByName(aDynSelectFields[i]));
+ if lColumnMapping <> nil then begin
+ fld.Name := lColumnMapping.DatasetField;
+ fld.TableField := lColumnMapping.TableField;
+ fld.SQLOrigin := lColumnMapping.SQLOrigin;
+ end;
+ end;
+ end
+ else begin
+ For i:=0 to statement.ColumnMappings.Count-1 do begin
+ lColumnMapping := statement.ColumnMappings[i];
+ for j:=Low(aDynSelectFields) to High(aDynSelectFields) do
+ if SameText(aDynSelectFields[j],lColumnMapping.DatasetField) then begin
+ fld:=Result.Fields.Add;
+ fld.AssignField(lfields2.FieldByName(lColumnMapping.DatasetField));
+ fld.Name := lColumnMapping.DatasetField;
+ fld.TableField := lColumnMapping.TableField;
+ fld.SQLOrigin := lColumnMapping.SQLOrigin;
+ Break;
+ end;
+ end;
+ end;
+ end
+ else begin
+ result.Fields.AssignFieldCollection(lfields2);
+ with statement do
+ for i := 0 to (ColumnMappings.Count - 1) do begin
+ fld := Result.Fields.FindField(ColumnMappings[i].DatasetField);
+ if fld = nil then Continue;
+ fld.Name := ColumnMappings[i].DatasetField;
+ fld.TableField := ColumnMappings[i].TableField;
+ fld.SQLOrigin := ColumnMappings[i].SQLOrigin;
+ end;
+ end;
+ finally
+ if lFields <> nil then lFields.Free;
+ end;
+ end;
+ // checking for DynamicFields
+ if Length(aDynSelectFields) > 0 then begin
+ For i:=0 to High(aDynSelectFields) do
+ if IsRealField(aDynSelectFields[i],True) then
+ Result.FieldByName(aDynSelectFields[i]);
+ end;
+ result.Params.AssignParamCollection(ds.Params);
+ if Result.DynamicWhere.Expression <> nil then
+ Where_CreateParameters(Result.DynamicWhere.Expression, Result.Params);
+ if OpenIt then result.Open;
+
+ end;
+end;
+
+function TDASchema.NewCommand(const aConnection: IDAConnection; const aName: string; aStatementName: string=''): IDASQLCommand;
+var
+ statement: TDAStatement;
+ sql: string;
+ cmd: TDASQLCommand;
+ lConnection: IDAConnection;
+begin
+ lConnection := aConnection;
+ if not assigned(lConnection) then begin
+ CheckProperties;
+ lConnection := ConnectionManager.NewConnection(ConnectionManager.GetDefaultConnectionName);
+ end;
+ result := nil;
+ cmd := TDASQLCommand(Commands.ItemByName(aName));
+
+ statement := FindCommandStatement(lConnection, cmd, aStatementName);
+ sql := statement.SQL;
+
+ if Assigned(fOnGetSQL) then fOnGetSQL(Self, aName, setCommand, sql);
+
+ result := lConnection.NewCommand(sql, statement.StatementType, aName);
+
+ // Copies the definitions of the schema
+ result.Params.AssignParamCollection(cmd.Params);
+end;
+
+procedure TDASchema.Clear;
+begin
+ Datasets.Clear();
+ Commands.Clear();
+ JoinDataTables.Clear();
+ UnionDataTables.Clear();
+ UpdateRules.Clear;
+ RelationShips.Clear;
+end;
+
+function TDASchema.NewDataset(
+ const aConnection: IDAConnection;
+ const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ aDynSelectFields: array of string;
+ aWhereClause: WideString;
+ OpenIt: boolean;
+ aStatementName: string): IDADataset;
+var
+ i: integer;
+begin
+ if (High(ParamNames) <> High(ParamValues)) then RaiseError('Names and values counts are different');
+
+ result := NewDataset(aConnection, aName, aDynSelectFields, aWhereClause, aStatementName, False, False);
+
+ for i := 0 to High(ParamValues) do
+ result.ParamByName(ParamNames[i]).Value := ParamValues[i];
+
+ if OpenIt then result.Open;
+end;
+
+function TDASchema.NewCommand(const aConnection: IDAConnection; const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ ExecuteIt: boolean = TRUE;
+ aStatementName: string=''): IDASQLCommand;
+var
+ i: integer;
+begin
+ if (High(ParamNames) <> High(ParamValues)) then RaiseError('Names and values counts are different');
+
+ result := NewCommand(aConnection, aName);
+
+ for i := 0 to High(ParamValues) do
+ result.ParamByName(ParamNames[i]).Value := ParamValues[i];
+
+ if ExecuteIt then result.Execute;
+end;
+
+procedure TDASchema.SetUpdateRules(const Value: TDAUpdateRuleCollection);
+begin
+ fUpdateRules.Assign(Value);
+end;
+
+procedure TDASchema.SetRelationShips(
+ const Value: TDADatasetRelationshipCollection);
+begin
+ fRelationShips.Assign(Value);
+end;
+
+procedure TDASchema.SetDiagrams(const Value: TDADiagrams);
+begin
+ if fDiagrams <> Value then begin
+ if (fDiagrams <> nil) then fDiagrams.RORemoveFreeNotification(Self);
+ fDiagrams := Value;
+ if (fDiagrams <> nil) then fDiagrams.ROFreeNotification(Self);
+ end;
+
+end;
+
+procedure TDASchema.Copy(aSourceSchema: TDASchema; DatasetNames, CommandNames,
+ UpdateRuleNames, RelationShipNames, UnionDataTablesNames,
+ JoinDataTablesNames: array of string);
+var i : integer;
+ sourcedataset,
+ destdataset : TDADataset;
+ sourcecommand,
+ destcommand : TDASQLCommand;
+ sourceupdaterule,
+ destupdaterule : TDAUpdateRule;
+ sourcerelationship,
+ destrelationship : TDADatasetRelationship;
+ lSourceJoinDataTable,
+ lDestJoinDataTable: TDAJoinDataTable;
+ lSourceUnionDataTable,
+ lDestUnionDataTable: TDAUnionDataTable;
+begin
+ for i := 0 to High(DatasetNames) do begin
+ sourcedataset := aSourceSchema.Datasets.DatasetByName(DatasetNames[i]);
+ destdataset := Datasets.Add;
+ destdataset.Assign(sourcedataset);
+ end;
+
+ for i := 0 to High(CommandNames) do begin
+ sourcecommand := aSourceSchema.Commands.SQLCommandByName(CommandNames[i]);
+ destcommand := Commands.Add;
+ destcommand.Assign(sourcecommand);
+ end;
+
+ for i := 0 to High(UpdateRuleNames) do begin
+ sourceupdaterule := aSourceSchema.UpdateRules.UpdateRuleByName(UpdateRuleNames[i]);
+ destupdaterule := UpdateRules.Add;
+ destupdaterule.Assign(sourceupdaterule);
+ end;
+
+ for i := 0 to High(RelationShipNames) do begin
+ sourcerelationship := aSourceSchema.RelationShips.RelationShipByName(RelationShipNames[i]);
+ destrelationship := RelationShips.Add;
+ destrelationship.Assign(sourcerelationship);
+ end;
+
+ for i := 0 to High(UnionDataTablesNames) do begin
+ lSourceUnionDataTable := aSourceSchema.UnionDataTables.UnionDataTableByName(UnionDataTablesNames[i]);
+ lDestUnionDataTable := UnionDataTables.Add;
+ lDestUnionDataTable.Assign(lSourceUnionDataTable);
+ end;
+
+ for i := 0 to High(JoinDataTablesNames) do begin
+ lSourceJoinDataTable := aSourceSchema.JoinDataTables.JoinTableByName(JoinDataTablesNames[i]);
+ lDestJoinDataTable := JoinDataTables.Add;
+ lDestJoinDataTable.Assign(lSourceJoinDataTable);
+ end;
+
+end;
+
+procedure TDASchema.Copy(aSourceSchema : TDASchema;
+ IncludeDatasets : boolean = TRUE;
+ IncludeCommands : boolean = TRUE;
+ IncludeUpdateRules : boolean = TRUE;
+ IncludeRelationShips : boolean = TRUE;
+ IncludeUnionDataTables: boolean = True;
+ IncludeJoinDataTables: boolean = True);
+var
+ lDatasetNames,
+ lCommandNames,
+ lUpdateRuleNames,
+ lRelationShipNames,
+ lJoinDataTablesNames,
+ lUnionDataTablesNames: array of string;
+ i : integer;
+begin
+ if not IncludeDatasets then SetLength(lDatasetNames, 0)
+ else begin
+ SetLength(lDatasetNames, aSourceSchema.Datasets.Count);
+ for i := 0 to (aSourceSchema.Datasets.Count-1) do
+ lDatasetNames[i] := aSourceSchema.Datasets[i].Name;
+ end;
+
+ if not IncludeCommands then SetLength(lCommandNames, 0)
+ else begin
+ SetLength(lCommandNames, aSourceSchema.Commands.Count);
+ for i := 0 to (aSourceSchema.Commands.Count-1) do
+ lCommandNames[i] := aSourceSchema.Commands[i].Name;
+ end;
+
+ if not IncludeUpdateRules then SetLength(lUpdateRuleNames, 0)
+ else begin
+ SetLength(lUpdateRuleNames, aSourceSchema.UpdateRules.Count);
+ for i := 0 to (aSourceSchema.UpdateRules.Count-1) do
+ lUpdateRuleNames[i] := aSourceSchema.UpdateRules[i].Name;
+ end;
+
+ if not IncludeRelationShips then SetLength(lRelationShipNames, 0)
+ else begin
+ SetLength(lRelationShipNames, aSourceSchema.RelationShips.Count);
+ for i := 0 to (aSourceSchema.RelationShips.Count-1) do
+ lRelationShipNames[i] := aSourceSchema.RelationShips[i].Name;
+ end;
+
+ if not IncludeUnionDataTables then SetLength(lUnionDataTablesNames, 0)
+ else begin
+ SetLength(lUnionDataTablesNames, aSourceSchema.UnionDataTables.Count);
+ for i := 0 to (aSourceSchema.UnionDataTables.Count-1) do
+ lUnionDataTablesNames[i] := aSourceSchema.UnionDataTables[i].Name;
+ end;
+
+ if not IncludeJoinDataTables then SetLength(lJoinDataTablesNames, 0)
+ else begin
+ SetLength(lJoinDataTablesNames, aSourceSchema.JoinDataTables.Count);
+ for i := 0 to (aSourceSchema.JoinDataTables.Count-1) do
+ lJoinDataTablesNames[i] := aSourceSchema.JoinDataTables[i].Name;
+ end;
+{$WARN SYMBOL_DEPRECATED OFF}
+ Copy(aSourceSchema, lDatasetNames, lCommandNames, lUpdateRuleNames, lRelationShipNames,lUnionDataTablesNames, lJoinDataTablesNames);
+{$WARN SYMBOL_DEPRECATED ON}
+end;
+
+procedure TDASchema.Copy(aSourceSchema: TDASchema; DatasetNames, CommandNames,
+ UpdateRuleNames, RelationShipNames: array of string);
+begin
+{$WARN SYMBOL_DEPRECATED OFF}
+ Copy(aSourceSchema,DatasetNames,CommandNames,UpdateRuleNames,RelationShipNames,[],[]);
+{$WARN SYMBOL_DEPRECATED ON}
+end;
+
+procedure TDASchema.Assign(Source: TPersistent);
+var
+ lSource: TDASchema;
+begin
+ inherited;
+ if Source is TDASchema then begin
+ lSource := TDASchema(Source);
+
+ Commands := lSource.Commands;
+ ConnectionManager := lSource.ConnectionManager;
+ CustomAttributes.Assign(lSource.CustomAttributes);
+ DataDictionary := lSource.DataDictionary;
+ Datasets := lSource.Datasets;
+ Diagrams := lSource.Diagrams;
+ JoinDataTables := lSource.JoinDataTables;
+ OnGetSQL := lSource.OnGetSQL;
+ RelationShips := lSource.RelationShips;
+ UnionDataTables := lSource.UnionDataTables;
+ UpdateRules := lSource.UpdateRules;
+ Version := lSource.Version;
+ end;
+end;
+
+procedure TDASchema.CheckProperties;
+begin
+ Check(not assigned(ConnectionManager), Name+'.ConnectionManager must be assigned.');
+ Check(ConnectionManager.GetDefaultConnectionName = '', Name+'.ConnectionManager does not have a default connection.');
+ ConnectionManager.CheckProperties;
+end;
+
+function TDASchema.FindDataset(aDatasetName: String): TDADataset;
+begin
+ result := Self.fDatasets.FindItem(aDatasetName) as TDADataset;
+ if not Assigned(result) then
+ result := Self.fUnionDataTables.FindItem(aDatasetName) as TDADataset;
+ if not Assigned(result) then
+ result := Self.fJoinDataTables.FindItem(aDatasetName) as TDADataset;
+end;
+
+function TDASchema.NewDataset(const aConnection: IDAConnection;
+ const aName: string;
+ aStatementName: string='';
+ OpenIt: boolean = false): IDADataset;
+begin
+ result := NewDataset(aConnection, aName, [], '', aStatementName, OpenIt);
+end;
+
+function TDASchema.NewDataset(const aConnection: IDAConnection; const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ OpenIt: boolean = TRUE;
+ aStatementName: string=''): IDADataset;
+begin
+ result := NewDataset(aConnection, aName, ParamNames, ParamValues,[],'', OpenIt,aStatementName);
+end;
+
+function TDASchema.GetDataDictionary: IDADataDictionary;
+begin
+ Result := fDataDictionary;
+end;
+
+procedure TDASchema.SaveToStream(aStream: TStream;
+ aFormat: TDAPersistFormat);
+begin
+ fMergeDataDictionaries := true;
+ try
+ inherited SaveToStream(aStream, aFormat);
+ finally
+ fMergeDataDictionaries := false;
+ end;
+end;
+
+function TDASchema.MergeDataDictionaries: Boolean;
+begin
+ result := fMergeDataDictionaries;
+end;
+
+{ TDADiagrams }
+
+procedure TDADiagrams.DefineProperties(Filer: TFiler);
+begin
+ inherited;
+ Filer.DefineProperty('DiagramData', ReadDiagramData, WriteDiagramData, fDiagramData <> '');
+end;
+
+procedure TDADiagrams.LoadFromFile(const aFilename: string);
+var
+ t: TextFile;
+ S: string;
+begin
+ AssignFile(t, aFilename);
+ Reset(t);
+ try
+ fDiagramData := '';
+ while not Eof(t) do begin
+ Readln(t, s);
+ fDiagramData := fDiagramData+s+#13#10;
+ end;
+ finally
+ CloseFile(t);
+ end;
+end;
+
+procedure TDADiagrams.SaveToFile(const aFilename: string);
+var
+ t:TextFile;
+begin
+ AssignFile(t, aFilename);
+ Rewrite(t);
+ try
+ Write(t, fDiagramData);
+ finally
+ CloseFile(t);
+ end;
+end;
+
+procedure TDADiagrams.ReadDiagramData(Reader: TReader);
+begin
+ fDiagramData := Reader.ReadString;
+end;
+
+procedure TDADiagrams.WriteDiagramData(Writer: TWriter);
+begin
+ Writer.WriteString(fDiagramData);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAClientDataModule.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAClientDataModule.pas
new file mode 100644
index 0000000..d72017a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAClientDataModule.pas
@@ -0,0 +1,30 @@
+unit uDAClientDataModule {$IFNDEF FPC}deprecated{$ENDIF};
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes;
+
+type
+ TDAClientDataModule = class(TDataModule)
+ private
+
+ end deprecated;
+
+implementation
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADB2Interfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADB2Interfaces.pas
new file mode 100644
index 0000000..ec21663
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADB2Interfaces.pas
@@ -0,0 +1,567 @@
+unit uDADB2Interfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses uDAInterfaces, uDAEngine;
+
+type
+ { IDADB2Connection
+ For identification purposes. Implemented by all DB2 connections }
+ IDADB2Connection = interface(IDAConnection)
+ ['{E1449C52-8AEF-432C-BABC-823E592A8116}']
+ end;
+
+
+function DB2_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+
+implementation
+uses
+ SysUtils;
+
+var
+ db2_reservedwords: array of string;
+
+function DB2_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+begin
+ Result := TestIdentifier(iIdentifier, db2_reservedwords);
+end;
+
+procedure db2_InitializeReservedWords;
+begin
+// from http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0001095.html
+ SetLength(db2_reservedwords, 513);
+ // sorted with TStringList.Sort (bds2007)
+ db2_reservedwords[0] := 'ABS';
+ db2_reservedwords[1] := 'ACTIVATE';
+ db2_reservedwords[2] := 'ADD';
+ db2_reservedwords[3] := 'AFTER';
+ db2_reservedwords[4] := 'ALIAS';
+ db2_reservedwords[5] := 'ALL';
+ db2_reservedwords[6] := 'ALLOCATE';
+ db2_reservedwords[7] := 'ALLOW';
+ db2_reservedwords[8] := 'ALTER';
+ db2_reservedwords[9] := 'AND';
+ db2_reservedwords[10] := 'ANY';
+ db2_reservedwords[11] := 'ARE';
+ db2_reservedwords[12] := 'ARRAY';
+ db2_reservedwords[13] := 'AS';
+ db2_reservedwords[14] := 'ASENSITIVE';
+ db2_reservedwords[15] := 'ASSOCIATE';
+ db2_reservedwords[16] := 'ASUTIME';
+ db2_reservedwords[17] := 'ASYMMETRIC';
+ db2_reservedwords[18] := 'AT';
+ db2_reservedwords[19] := 'ATOMIC';
+ db2_reservedwords[20] := 'ATTRIBUTES';
+ db2_reservedwords[21] := 'AUDIT';
+ db2_reservedwords[22] := 'AUTHORIZATION';
+ db2_reservedwords[23] := 'AUX';
+ db2_reservedwords[24] := 'AUXILIARY';
+ db2_reservedwords[25] := 'AVG';
+ db2_reservedwords[26] := 'BEFORE';
+ db2_reservedwords[27] := 'BEGIN';
+ db2_reservedwords[28] := 'BETWEEN';
+ db2_reservedwords[29] := 'BIGINT';
+ db2_reservedwords[30] := 'BINARY';
+ db2_reservedwords[31] := 'BLOB';
+ db2_reservedwords[32] := 'BOOLEAN';
+ db2_reservedwords[33] := 'BOTH';
+ db2_reservedwords[34] := 'BUFFERPOOL';
+ db2_reservedwords[35] := 'BY';
+ db2_reservedwords[36] := 'CACHE';
+ db2_reservedwords[37] := 'CALL';
+ db2_reservedwords[38] := 'CALLED';
+ db2_reservedwords[39] := 'CAPTURE';
+ db2_reservedwords[40] := 'CARDINALITY';
+ db2_reservedwords[41] := 'CASCADED';
+ db2_reservedwords[42] := 'CASE';
+ db2_reservedwords[43] := 'CAST';
+ db2_reservedwords[44] := 'CCSID';
+ db2_reservedwords[45] := 'CEIL';
+ db2_reservedwords[46] := 'CEILING';
+ db2_reservedwords[47] := 'CHAR';
+ db2_reservedwords[48] := 'CHAR_LENGTH';
+ db2_reservedwords[49] := 'CHARACTER';
+ db2_reservedwords[50] := 'CHARACTER_LENGTH';
+ db2_reservedwords[51] := 'CHECK';
+ db2_reservedwords[52] := 'CLOB';
+ db2_reservedwords[53] := 'CLONE';
+ db2_reservedwords[54] := 'CLOSE';
+ db2_reservedwords[55] := 'CLUSTER';
+ db2_reservedwords[56] := 'COALESCE';
+ db2_reservedwords[57] := 'COLLATE';
+ db2_reservedwords[58] := 'COLLECT';
+ db2_reservedwords[59] := 'COLLECTION';
+ db2_reservedwords[60] := 'COLLID';
+ db2_reservedwords[61] := 'COLUMN';
+ db2_reservedwords[62] := 'COMMENT';
+ db2_reservedwords[63] := 'COMMIT';
+ db2_reservedwords[64] := 'CONCAT';
+ db2_reservedwords[65] := 'CONDITION';
+ db2_reservedwords[66] := 'CONNECT';
+ db2_reservedwords[67] := 'CONNECTION';
+ db2_reservedwords[68] := 'CONSTRAINT';
+ db2_reservedwords[69] := 'CONTAINS';
+ db2_reservedwords[70] := 'CONTINUE';
+ db2_reservedwords[71] := 'CONVERT';
+ db2_reservedwords[72] := 'CORR';
+ db2_reservedwords[73] := 'CORRESPONDING';
+ db2_reservedwords[74] := 'COUNT';
+ db2_reservedwords[75] := 'COUNT_BIG';
+ db2_reservedwords[76] := 'COVAR_POP';
+ db2_reservedwords[77] := 'COVAR_SAMP';
+ db2_reservedwords[78] := 'CREATE';
+ db2_reservedwords[79] := 'CROSS';
+ db2_reservedwords[80] := 'CUBE';
+ db2_reservedwords[81] := 'CUME_DIST';
+ db2_reservedwords[82] := 'CURRENT';
+ db2_reservedwords[83] := 'CURRENT_DATE';
+ db2_reservedwords[84] := 'CURRENT_DEFAULT_TRANSFORM_GROUP';
+ db2_reservedwords[85] := 'CURRENT_LC_CTYPE';
+ db2_reservedwords[86] := 'CURRENT_PATH';
+ db2_reservedwords[87] := 'CURRENT_ROLE';
+ db2_reservedwords[88] := 'CURRENT_SCHEMA';
+ db2_reservedwords[89] := 'CURRENT_SERVER';
+ db2_reservedwords[90] := 'CURRENT_TIME';
+ db2_reservedwords[91] := 'CURRENT_TIMESTAMP';
+ db2_reservedwords[92] := 'CURRENT_TIMEZONE';
+ db2_reservedwords[93] := 'CURRENT_TRANSFORM_GROUP_FOR_TYPE';
+ db2_reservedwords[94] := 'CURRENT_USER';
+ db2_reservedwords[95] := 'CURSOR';
+ db2_reservedwords[96] := 'CYCLE';
+ db2_reservedwords[97] := 'DATA';
+ db2_reservedwords[98] := 'DATABASE';
+ db2_reservedwords[99] := 'DATAPARTITIONNAME';
+ db2_reservedwords[100] := 'DATAPARTITIONNUM';
+ db2_reservedwords[101] := 'DATE';
+ db2_reservedwords[102] := 'DAY';
+ db2_reservedwords[103] := 'DAYS';
+ db2_reservedwords[104] := 'DB2GENERAL';
+ db2_reservedwords[105] := 'DB2GENRL';
+ db2_reservedwords[106] := 'DB2SQL';
+ db2_reservedwords[107] := 'DBINFO';
+ db2_reservedwords[108] := 'DBPARTITIONNAME';
+ db2_reservedwords[109] := 'DBPARTITIONNUM';
+ db2_reservedwords[110] := 'DEALLOCATE';
+ db2_reservedwords[111] := 'DEC';
+ db2_reservedwords[112] := 'DECIMAL';
+ db2_reservedwords[113] := 'DECLARE';
+ db2_reservedwords[114] := 'DEFAULT';
+ db2_reservedwords[115] := 'DEFAULTS';
+ db2_reservedwords[116] := 'DEFINITION';
+ db2_reservedwords[117] := 'DELETE';
+ db2_reservedwords[118] := 'DENSE_RANK';
+ db2_reservedwords[119] := 'DENSERANK';
+ db2_reservedwords[120] := 'DEREF';
+ db2_reservedwords[121] := 'DESCRIBE';
+ db2_reservedwords[122] := 'DESCRIPTOR';
+ db2_reservedwords[123] := 'DETERMINISTIC';
+ db2_reservedwords[124] := 'DIAGNOSTICS';
+ db2_reservedwords[125] := 'DISABLE';
+ db2_reservedwords[126] := 'DISALLOW';
+ db2_reservedwords[127] := 'DISCONNECT';
+ db2_reservedwords[128] := 'DISTINCT';
+ db2_reservedwords[129] := 'DO';
+ db2_reservedwords[130] := 'DOCUMENT';
+ db2_reservedwords[131] := 'DOUBLE';
+ db2_reservedwords[132] := 'DROP';
+ db2_reservedwords[133] := 'DSSIZE';
+ db2_reservedwords[134] := 'DYNAMIC';
+ db2_reservedwords[135] := 'EACH';
+ db2_reservedwords[136] := 'EDITPROC';
+ db2_reservedwords[137] := 'ELEMENT';
+ db2_reservedwords[138] := 'ELSE';
+ db2_reservedwords[139] := 'ELSEIF';
+ db2_reservedwords[140] := 'ENABLE';
+ db2_reservedwords[141] := 'ENCODING';
+ db2_reservedwords[142] := 'ENCRYPTION';
+ db2_reservedwords[143] := 'END';
+ db2_reservedwords[144] := 'END-EXEC';
+ db2_reservedwords[145] := 'ENDING';
+ db2_reservedwords[146] := 'ERASE';
+ db2_reservedwords[147] := 'ESCAPE';
+ db2_reservedwords[148] := 'EVERY';
+ db2_reservedwords[149] := 'EXCEPT';
+ db2_reservedwords[150] := 'EXCEPTION';
+ db2_reservedwords[151] := 'EXCLUDING';
+ db2_reservedwords[152] := 'EXCLUSIVE';
+ db2_reservedwords[153] := 'EXEC';
+ db2_reservedwords[154] := 'EXECUTE';
+ db2_reservedwords[155] := 'EXISTS';
+ db2_reservedwords[156] := 'EXIT';
+ db2_reservedwords[157] := 'EXP';
+ db2_reservedwords[158] := 'EXPLAIN';
+ db2_reservedwords[159] := 'EXTERNAL';
+ db2_reservedwords[160] := 'EXTRACT';
+ db2_reservedwords[161] := 'FALSE';
+ db2_reservedwords[162] := 'FENCED';
+ db2_reservedwords[163] := 'FETCH';
+ db2_reservedwords[164] := 'FIELDPROC';
+ db2_reservedwords[165] := 'FILE';
+ db2_reservedwords[166] := 'FILTER';
+ db2_reservedwords[167] := 'FINAL';
+ db2_reservedwords[168] := 'FLOAT';
+ db2_reservedwords[169] := 'FLOOR';
+ db2_reservedwords[170] := 'FOR';
+ db2_reservedwords[171] := 'FOREIGN';
+ db2_reservedwords[172] := 'FREE';
+ db2_reservedwords[173] := 'FROM';
+ db2_reservedwords[174] := 'FULL';
+ db2_reservedwords[175] := 'FUNCTION';
+ db2_reservedwords[176] := 'FUSION';
+ db2_reservedwords[177] := 'GENERAL';
+ db2_reservedwords[178] := 'GENERATED';
+ db2_reservedwords[179] := 'GET';
+ db2_reservedwords[180] := 'GLOBAL';
+ db2_reservedwords[181] := 'GO';
+ db2_reservedwords[182] := 'GOTO';
+ db2_reservedwords[183] := 'GRANT';
+ db2_reservedwords[184] := 'GRAPHIC';
+ db2_reservedwords[185] := 'GROUP';
+ db2_reservedwords[186] := 'GROUPING';
+ db2_reservedwords[187] := 'HANDLER';
+ db2_reservedwords[188] := 'HASH';
+ db2_reservedwords[189] := 'HASHED_VALUE';
+ db2_reservedwords[190] := 'HAVING';
+ db2_reservedwords[191] := 'HINT';
+ db2_reservedwords[192] := 'HOLD';
+ db2_reservedwords[193] := 'HOUR';
+ db2_reservedwords[194] := 'HOURS';
+ db2_reservedwords[195] := 'IDENTITY';
+ db2_reservedwords[196] := 'IF';
+ db2_reservedwords[197] := 'IMMEDIATE';
+ db2_reservedwords[198] := 'IN';
+ db2_reservedwords[199] := 'INCLUDING';
+ db2_reservedwords[200] := 'INCLUSIVE';
+ db2_reservedwords[201] := 'INCREMENT';
+ db2_reservedwords[202] := 'INDEX';
+ db2_reservedwords[203] := 'INDICATOR';
+ db2_reservedwords[204] := 'INF';
+ db2_reservedwords[205] := 'INFINITY';
+ db2_reservedwords[206] := 'INHERIT';
+ db2_reservedwords[207] := 'INNER';
+ db2_reservedwords[208] := 'INOUT';
+ db2_reservedwords[209] := 'INSENSITIVE';
+ db2_reservedwords[210] := 'INSERT';
+ db2_reservedwords[211] := 'INT';
+ db2_reservedwords[212] := 'INTEGER';
+ db2_reservedwords[213] := 'INTEGRITY';
+ db2_reservedwords[214] := 'INTERSECT';
+ db2_reservedwords[215] := 'INTERSECTION';
+ db2_reservedwords[216] := 'INTERVAL';
+ db2_reservedwords[217] := 'INTO';
+ db2_reservedwords[218] := 'IS';
+ db2_reservedwords[219] := 'ISOBID';
+ db2_reservedwords[220] := 'ISOLATION';
+ db2_reservedwords[221] := 'ITERATE';
+ db2_reservedwords[222] := 'JAR';
+ db2_reservedwords[223] := 'JAVA';
+ db2_reservedwords[224] := 'JOIN';
+ db2_reservedwords[225] := 'KEEP';
+ db2_reservedwords[226] := 'KEY';
+ db2_reservedwords[227] := 'LABEL';
+ db2_reservedwords[228] := 'LANGUAGE';
+ db2_reservedwords[229] := 'LARGE';
+ db2_reservedwords[230] := 'LATERAL';
+ db2_reservedwords[231] := 'LC_CTYPE';
+ db2_reservedwords[232] := 'LEADING';
+ db2_reservedwords[233] := 'LEAVE';
+ db2_reservedwords[234] := 'LEFT';
+ db2_reservedwords[235] := 'LIKE';
+ db2_reservedwords[236] := 'LINKTYPE';
+ db2_reservedwords[237] := 'LN';
+ db2_reservedwords[238] := 'LOCAL';
+ db2_reservedwords[239] := 'LOCALDATE';
+ db2_reservedwords[240] := 'LOCALE';
+ db2_reservedwords[241] := 'LOCALTIME';
+ db2_reservedwords[242] := 'LOCALTIMESTAMP';
+ db2_reservedwords[243] := 'LOCATOR';
+ db2_reservedwords[244] := 'LOCATORS';
+ db2_reservedwords[245] := 'LOCK';
+ db2_reservedwords[246] := 'LOCKMAX';
+ db2_reservedwords[247] := 'LOCKSIZE';
+ db2_reservedwords[248] := 'LONG';
+ db2_reservedwords[249] := 'LOOP';
+ db2_reservedwords[250] := 'LOWER';
+ db2_reservedwords[251] := 'MAINTAINED';
+ db2_reservedwords[252] := 'MATCH';
+ db2_reservedwords[253] := 'MATERIALIZED';
+ db2_reservedwords[254] := 'MAX';
+ db2_reservedwords[255] := 'MAXVALUE';
+ db2_reservedwords[256] := 'MEMBER';
+ db2_reservedwords[257] := 'MERGE';
+ db2_reservedwords[258] := 'METHOD';
+ db2_reservedwords[259] := 'MICROSECOND';
+ db2_reservedwords[260] := 'MICROSECONDS';
+ db2_reservedwords[261] := 'MIN';
+ db2_reservedwords[262] := 'MINUTE';
+ db2_reservedwords[263] := 'MINUTES';
+ db2_reservedwords[264] := 'MINVALUE';
+ db2_reservedwords[265] := 'MOD';
+ db2_reservedwords[266] := 'MODE';
+ db2_reservedwords[267] := 'MODIFIES';
+ db2_reservedwords[268] := 'MODULE';
+ db2_reservedwords[269] := 'MONTH';
+ db2_reservedwords[270] := 'MONTHS';
+ db2_reservedwords[271] := 'MULTISET';
+ db2_reservedwords[272] := 'NAN';
+ db2_reservedwords[273] := 'NATIONAL';
+ db2_reservedwords[274] := 'NATURAL';
+ db2_reservedwords[275] := 'NCHAR';
+ db2_reservedwords[276] := 'NCLOB';
+ db2_reservedwords[277] := 'NEW';
+ db2_reservedwords[278] := 'NEW_TABLE';
+ db2_reservedwords[279] := 'NEXTVAL';
+ db2_reservedwords[280] := 'NO';
+ db2_reservedwords[281] := 'NOCACHE';
+ db2_reservedwords[282] := 'NOCYCLE';
+ db2_reservedwords[283] := 'NODENAME';
+ db2_reservedwords[284] := 'NODENUMBER';
+ db2_reservedwords[285] := 'NOMAXVALUE';
+ db2_reservedwords[286] := 'NOMINVALUE';
+ db2_reservedwords[287] := 'NONE';
+ db2_reservedwords[288] := 'NOORDER';
+ db2_reservedwords[289] := 'NORMALIZE';
+ db2_reservedwords[290] := 'NORMALIZED';
+ db2_reservedwords[291] := 'NOT';
+ db2_reservedwords[292] := 'NULL';
+ db2_reservedwords[293] := 'NULLIF';
+ db2_reservedwords[294] := 'NULLS';
+ db2_reservedwords[295] := 'NUMERIC';
+ db2_reservedwords[296] := 'NUMPARTS';
+ db2_reservedwords[297] := 'OBID';
+ db2_reservedwords[298] := 'OCTET_LENGTH';
+ db2_reservedwords[299] := 'OF';
+ db2_reservedwords[300] := 'OLD';
+ db2_reservedwords[301] := 'OLD_TABLE';
+ db2_reservedwords[302] := 'ON';
+ db2_reservedwords[303] := 'ONLY';
+ db2_reservedwords[304] := 'OPEN';
+ db2_reservedwords[305] := 'OPTIMIZATION';
+ db2_reservedwords[306] := 'OPTIMIZE';
+ db2_reservedwords[307] := 'OPTION';
+ db2_reservedwords[308] := 'OR';
+ db2_reservedwords[309] := 'ORDER';
+ db2_reservedwords[310] := 'OUT';
+ db2_reservedwords[311] := 'OUTER';
+ db2_reservedwords[312] := 'OVER';
+ db2_reservedwords[313] := 'OVERLAPS';
+ db2_reservedwords[314] := 'OVERLAY';
+ db2_reservedwords[315] := 'OVERRIDING';
+ db2_reservedwords[316] := 'PACKAGE';
+ db2_reservedwords[317] := 'PADDED';
+ db2_reservedwords[318] := 'PAGESIZE';
+ db2_reservedwords[319] := 'PARAMETER';
+ db2_reservedwords[320] := 'PART';
+ db2_reservedwords[321] := 'PARTITION';
+ db2_reservedwords[322] := 'PARTITIONED';
+ db2_reservedwords[323] := 'PARTITIONING';
+ db2_reservedwords[324] := 'PARTITIONS';
+ db2_reservedwords[325] := 'PASSWORD';
+ db2_reservedwords[326] := 'PATH';
+ db2_reservedwords[327] := 'PERCENT_RANK';
+ db2_reservedwords[328] := 'PERCENTILE_CONT';
+ db2_reservedwords[329] := 'PERCENTILE_DISC';
+ db2_reservedwords[330] := 'PIECESIZE';
+ db2_reservedwords[331] := 'PLAN';
+ db2_reservedwords[332] := 'POSITION';
+ db2_reservedwords[333] := 'POWER';
+ db2_reservedwords[334] := 'PRECISION';
+ db2_reservedwords[335] := 'PREPARE';
+ db2_reservedwords[336] := 'PREVVAL';
+ db2_reservedwords[337] := 'PRIMARY';
+ db2_reservedwords[338] := 'PRIQTY';
+ db2_reservedwords[339] := 'PRIVILEGES';
+ db2_reservedwords[340] := 'PROCEDURE';
+ db2_reservedwords[341] := 'PROGRAM';
+ db2_reservedwords[342] := 'PSID';
+ db2_reservedwords[343] := 'PUBLIC';
+ db2_reservedwords[344] := 'QUERY';
+ db2_reservedwords[345] := 'QUERYNO';
+ db2_reservedwords[346] := 'RANGE';
+ db2_reservedwords[347] := 'RANK';
+ db2_reservedwords[348] := 'READ';
+ db2_reservedwords[349] := 'READS';
+ db2_reservedwords[350] := 'REAL';
+ db2_reservedwords[351] := 'RECOVERY';
+ db2_reservedwords[352] := 'RECURSIVE';
+ db2_reservedwords[353] := 'REF';
+ db2_reservedwords[354] := 'REFERENCES';
+ db2_reservedwords[355] := 'REFERENCING';
+ db2_reservedwords[356] := 'REFRESH';
+ db2_reservedwords[357] := 'REGR_AVGX';
+ db2_reservedwords[358] := 'REGR_AVGY';
+ db2_reservedwords[359] := 'REGR_COUNT';
+ db2_reservedwords[360] := 'REGR_INTERCEPT';
+ db2_reservedwords[361] := 'REGR_R2';
+ db2_reservedwords[362] := 'REGR_SLOPE';
+ db2_reservedwords[363] := 'REGR_SXX';
+ db2_reservedwords[364] := 'REGR_SXY';
+ db2_reservedwords[365] := 'REGR_SYY';
+ db2_reservedwords[366] := 'RELEASE';
+ db2_reservedwords[367] := 'RENAME';
+ db2_reservedwords[368] := 'REPEAT';
+ db2_reservedwords[369] := 'RESET';
+ db2_reservedwords[370] := 'RESIGNAL';
+ db2_reservedwords[371] := 'RESTART';
+ db2_reservedwords[372] := 'RESTRICT';
+ db2_reservedwords[373] := 'RESULT';
+ db2_reservedwords[374] := 'RESULT_SET_LOCATOR';
+ db2_reservedwords[375] := 'RETURN';
+ db2_reservedwords[376] := 'RETURNS';
+ db2_reservedwords[377] := 'REVOKE';
+ db2_reservedwords[378] := 'RIGHT';
+ db2_reservedwords[379] := 'ROLE';
+ db2_reservedwords[380] := 'ROLLBACK';
+ db2_reservedwords[381] := 'ROLLUP';
+ db2_reservedwords[382] := 'ROUND_CEILING';
+ db2_reservedwords[383] := 'ROUND_DOWN';
+ db2_reservedwords[384] := 'ROUND_FLOOR';
+ db2_reservedwords[385] := 'ROUND_HALF_DOWN';
+ db2_reservedwords[386] := 'ROUND_HALF_EVEN';
+ db2_reservedwords[387] := 'ROUND_HALF_UP';
+ db2_reservedwords[388] := 'ROUND_UP';
+ db2_reservedwords[389] := 'ROUTINE';
+ db2_reservedwords[390] := 'ROW';
+ db2_reservedwords[391] := 'ROW_NUMBER';
+ db2_reservedwords[392] := 'ROWNUMBER';
+ db2_reservedwords[393] := 'ROWS';
+ db2_reservedwords[394] := 'ROWSET';
+ db2_reservedwords[395] := 'RRN';
+ db2_reservedwords[396] := 'RUN';
+ db2_reservedwords[397] := 'SAVEPOINT';
+ db2_reservedwords[398] := 'SCHEMA';
+ db2_reservedwords[399] := 'SCOPE';
+ db2_reservedwords[400] := 'SCRATCHPAD';
+ db2_reservedwords[401] := 'SCROLL';
+ db2_reservedwords[402] := 'SEARCH';
+ db2_reservedwords[403] := 'SECOND';
+ db2_reservedwords[404] := 'SECONDS';
+ db2_reservedwords[405] := 'SECQTY';
+ db2_reservedwords[406] := 'SECURITY';
+ db2_reservedwords[407] := 'SELECT';
+ db2_reservedwords[408] := 'SENSITIVE';
+ db2_reservedwords[409] := 'SEQUENCE';
+ db2_reservedwords[410] := 'SESSION';
+ db2_reservedwords[411] := 'SESSION_USER';
+ db2_reservedwords[412] := 'SET';
+ db2_reservedwords[413] := 'SIGNAL';
+ db2_reservedwords[414] := 'SIMILAR';
+ db2_reservedwords[415] := 'SIMPLE';
+ db2_reservedwords[416] := 'SMALLINT';
+ db2_reservedwords[417] := 'SNAN';
+ db2_reservedwords[418] := 'SOME';
+ db2_reservedwords[419] := 'SOURCE';
+ db2_reservedwords[420] := 'SPECIFIC';
+ db2_reservedwords[421] := 'SPECIFICTYPE';
+ db2_reservedwords[422] := 'SQL';
+ db2_reservedwords[423] := 'SQLEXCEPTION';
+ db2_reservedwords[424] := 'SQLID';
+ db2_reservedwords[425] := 'SQLSTATE';
+ db2_reservedwords[426] := 'SQLWARNING';
+ db2_reservedwords[427] := 'SQRT';
+ db2_reservedwords[428] := 'STACKED';
+ db2_reservedwords[429] := 'STANDARD';
+ db2_reservedwords[430] := 'START';
+ db2_reservedwords[431] := 'STARTING';
+ db2_reservedwords[432] := 'STATEMENT';
+ db2_reservedwords[433] := 'STATIC';
+ db2_reservedwords[434] := 'STATMENT';
+ db2_reservedwords[435] := 'STAY';
+ db2_reservedwords[436] := 'STDDEV_POP';
+ db2_reservedwords[437] := 'STDDEV_SAMP';
+ db2_reservedwords[438] := 'STOGROUP';
+ db2_reservedwords[439] := 'STORES';
+ db2_reservedwords[440] := 'STYLE';
+ db2_reservedwords[441] := 'SUBMULTISET';
+ db2_reservedwords[442] := 'SUBSTRING';
+ db2_reservedwords[443] := 'SUM';
+ db2_reservedwords[444] := 'SUMMARY';
+ db2_reservedwords[445] := 'SYMMETRIC';
+ db2_reservedwords[446] := 'SYNONYM';
+ db2_reservedwords[447] := 'SYSFUN';
+ db2_reservedwords[448] := 'SYSIBM';
+ db2_reservedwords[449] := 'SYSPROC';
+ db2_reservedwords[450] := 'SYSTEM';
+ db2_reservedwords[451] := 'SYSTEM_USER';
+ db2_reservedwords[452] := 'TABLE';
+ db2_reservedwords[453] := 'TABLESAMPLE';
+ db2_reservedwords[454] := 'TABLESPACE';
+ db2_reservedwords[455] := 'THEN';
+ db2_reservedwords[456] := 'TIME';
+ db2_reservedwords[457] := 'TIMESTAMP';
+ db2_reservedwords[458] := 'TIMEZONE_HOUR';
+ db2_reservedwords[459] := 'TIMEZONE_MINUTE';
+ db2_reservedwords[460] := 'TO';
+ db2_reservedwords[461] := 'TRAILING';
+ db2_reservedwords[462] := 'TRANSACTION';
+ db2_reservedwords[463] := 'TRANSLATE';
+ db2_reservedwords[464] := 'TRANSLATION';
+ db2_reservedwords[465] := 'TREAT';
+ db2_reservedwords[466] := 'TRIGGER';
+ db2_reservedwords[467] := 'TRIM';
+ db2_reservedwords[468] := 'TRUE';
+ db2_reservedwords[469] := 'TRUNCATE';
+ db2_reservedwords[470] := 'TYPE';
+ db2_reservedwords[471] := 'UESCAPE';
+ db2_reservedwords[472] := 'UNDO';
+ db2_reservedwords[473] := 'UNION';
+ db2_reservedwords[474] := 'UNIQUE';
+ db2_reservedwords[475] := 'UNKNOWN';
+ db2_reservedwords[476] := 'UNNEST';
+ db2_reservedwords[477] := 'UNTIL';
+ db2_reservedwords[478] := 'UPDATE';
+ db2_reservedwords[479] := 'UPPER';
+ db2_reservedwords[480] := 'USAGE';
+ db2_reservedwords[481] := 'USER';
+ db2_reservedwords[482] := 'USING';
+ db2_reservedwords[483] := 'VALIDPROC';
+ db2_reservedwords[484] := 'VALUE';
+ db2_reservedwords[485] := 'VALUES';
+ db2_reservedwords[486] := 'VAR_POP';
+ db2_reservedwords[487] := 'VAR_SAMP';
+ db2_reservedwords[488] := 'VARCHAR';
+ db2_reservedwords[489] := 'VARIABLE';
+ db2_reservedwords[490] := 'VARIANT';
+ db2_reservedwords[491] := 'VARYING';
+ db2_reservedwords[492] := 'VCAT';
+ db2_reservedwords[493] := 'VERSION';
+ db2_reservedwords[494] := 'VIEW';
+ db2_reservedwords[495] := 'VOLATILE';
+ db2_reservedwords[496] := 'VOLUMES';
+ db2_reservedwords[497] := 'WHEN';
+ db2_reservedwords[498] := 'WHENEVER';
+ db2_reservedwords[499] := 'WHERE';
+ db2_reservedwords[500] := 'WHILE';
+ db2_reservedwords[501] := 'WIDTH_BUCKET';
+ db2_reservedwords[502] := 'WINDOW';
+ db2_reservedwords[503] := 'WITH';
+ db2_reservedwords[504] := 'WITHIN';
+ db2_reservedwords[505] := 'WITHOUT';
+ db2_reservedwords[506] := 'WLM';
+ db2_reservedwords[507] := 'WRITE';
+ db2_reservedwords[508] := 'XMLELEMENT';
+ db2_reservedwords[509] := 'XMLEXISTS';
+ db2_reservedwords[510] := 'XMLNAMESPACES';
+ db2_reservedwords[511] := 'YEAR';
+ db2_reservedwords[512] := 'YEARS';
+end;
+
+initialization
+ db2_InitializeReservedWords;
+finalization
+ db2_reservedwords := nil;
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADBSessionManager.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADBSessionManager.pas
new file mode 100644
index 0000000..d708ffb
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADBSessionManager.pas
@@ -0,0 +1,424 @@
+unit uDADBSessionManager;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {vcl:}SysUtils, Classes,
+ {RemObjects: SDK}uROSessions,
+ {Data Abstract:}uDAInterfaces, uDAClasses;
+
+type
+ TDAConvertGUIDEvent = function(Sender: TROCustomSessionManager; const aGUID: TGUID): string of object;
+ TDADBSessionManager = class(TROCustomSessionManager)
+ private
+ fSchema: TDASchema;
+ fDeleteSession: string;
+ fUpdateSession: string;
+ fInsertSession: string;
+ fGetSession: string;
+ fClearSessions: string;
+ fGetSessionCount: string;
+ fConnection: string;
+ fFieldNameSessionID: string;
+ fFieldNameCreated: string;
+ fFieldNameLastAccessed: string;
+ fFieldNameData: string;
+ fClearSessionsOnCreate: boolean;
+ fClearSessionsOnDestroy: boolean;
+ fGetAllSessionIDs: string;
+ fOnConvertGUID: TDAConvertGUIDEvent;
+ FForceTransaction: Boolean;
+ FNeedTransactionAction: Boolean;
+ procedure SetSchema(const Value: TDASchema);
+ { Private declarations }
+ procedure BeginTransaction(AConnection: IDAConnection);
+ procedure CommitTransaction(AConnection: IDAConnection);
+ procedure RollbackTransaction(AConnection: IDAConnection);
+ function GetConnection: IDAConnection;
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+
+ function DoFindSession(const aSessionID: TGUID; aUpdateTime: Boolean): TROSession; override;
+ procedure DoDeleteSession(const aSessionID: TGUID; IsExpired: boolean); override;
+ procedure DoClearSessions(OnlyExpired: boolean); override;
+ function DoGetSessionCount: integer; override;
+ procedure DoReleaseSession(aSession: TROSession; NewSession: boolean); override;
+ procedure DoGetAllSessions(Dest: TStringList); override;
+
+ function DoConvertGUID(const aGUID: TGUID): string; virtual;
+ public
+ { Public declarations }
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure CheckProperties; override;
+ published
+ property Schema: TDASchema read fSchema write SetSchema;
+
+ property FieldNameSessionID: string read fFieldNameSessionID write fFieldNameSessionID;
+ property FieldNameCreated: string read fFieldNameCreated write fFieldNameCreated;
+ property FieldNameLastAccessed: string read fFieldNameLastAccessed write fFieldNameLastAccessed;
+ property FieldNameData: string read fFieldNameData write fFieldNameData;
+
+ property InsertSessionCommand: string read fInsertSession write fInsertSession;
+ property UpdateSessionCommand: string read fUpdateSession write fUpdateSession;
+ property DeleteSessionCommand: string read fDeleteSession write fDeleteSession;
+ property ClearSessionsCommand: string read fClearSessions write fClearSessions;
+ property GetSessionCountDataSet: string read fGetSessionCount write fGetSessionCount;
+ property GetSessionDataSet: string read fGetSession write fGetSession;
+ property GetAllSessionIDsDataset: string read fGetAllSessionIDs write fGetAllSessionIDs;
+
+ property ClearSessionsOnCreate: boolean read fClearSessionsOnCreate write fClearSessionsOnCreate default true;
+ property ClearSessionsOnDestroy: boolean read fClearSessionsOnDestroy write fClearSessionsOnDestroy default true;
+
+ property Connection: string read fConnection write fConnection;
+ property OnConvertGUID: TDAConvertGUIDEvent read fOnConvertGUID write fOnConvertGUID;
+ property AutoTransaction: Boolean read FForceTransaction write FForceTransaction default false;
+ property SessionDuration;
+ property SessionCheckInterval;
+ end;
+
+implementation
+
+uses
+ uROClasses, uROTypes;
+
+constructor TDADBSessionManager.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ fClearSessionsOnDestroy := TRUE;
+ ClearSessionsOnCreate := TRUE;
+
+ fFieldNameSessionID := 'SessionID';
+ fFieldNameCreated := 'Created';
+ fFieldNameLastAccessed := 'LastAccessed';
+ fFieldNameData := 'Data';
+end;
+
+destructor TDADBSessionManager.Destroy;
+begin
+ Schema := nil;
+ inherited;
+end;
+
+procedure TDADBSessionManager.DoClearSessions(OnlyExpired: boolean);
+var
+ lCommand: IDASQLCommand;
+ lDataSet: IDADataset;
+ lConnection: IDAConnection;
+ lDate: TDateTime;
+ lFieldNameSessionID: integer;
+ lLastAccessIndex: integer;
+begin
+ if OnlyExpired then
+ lDate := ((Now * MinsPerDay) - SessionDuration) / MinsPerDay
+ else
+ lDate := Now + 30; // 30 days from now. Enough to say all!
+ if Assigned(OnBeforeDeleteSession) then begin
+ lConnection := GetConnection;
+ lDataSet := Schema.NewDataset(lConnection, GetAllSessionIDsDataset);
+ BeginTransaction(lConnection);
+ try
+ lDataSet.Open;
+ except
+ RollbackTransaction(lConnection);
+ raise;
+ end;
+ CommitTransaction(lConnection);
+ lFieldNameSessionID:= lDataSet.FieldByName(FieldNameSessionID).Index;
+ lLastAccessIndex:= lDataSet.FieldByName(FieldNameLastAccessed).Index;
+ try
+ while not lDataSet.EOF do
+ try
+ if lDataSet.Fields[lLastAccessIndex].AsDateTime <= lDate then
+ DeleteSession(lDataSet.Fields[lFieldNameSessionID].AsGuid,OnlyExpired);
+ finally
+ lDataSet.Next;
+ end;
+ finally
+ lDataSet.Close();
+ end;
+ end
+ else begin
+ lConnection:=GetConnection;
+ lCommand := Schema.NewCommand(lConnection, ClearSessionsCommand);
+ lCommand.ParamByName(FieldNameLastAccessed).Value := lDate;
+ BeginTransaction(lConnection);
+ try
+ lCommand.Execute();
+ except
+ RollbackTransaction(lConnection);
+ Raise;
+ end;
+ CommitTransaction(lConnection);
+ end;
+end;
+
+procedure TDADBSessionManager.DoDeleteSession(const aSessionID: TGUID; IsExpired: boolean);
+var
+ lCommand: IDASQLCommand;
+ lConnection: IDAConnection;
+begin
+ {$IFDEF FPC}
+ if IsExpired then lConnection := GetConnection else // remove warning
+ {$ENDIF}
+ lConnection := GetConnection;
+ lCommand := Schema.NewCommand(lConnection, DeleteSessionCommand);
+ lCommand.ParamByName(FieldNameSessionID).Value := DoConvertGUID(aSessionID);
+ BeginTransaction(lConnection);
+ try
+ lCommand.Execute();
+ except
+ RollbackTransaction(lConnection);
+ raise;
+ end;
+ CommitTransaction(lConnection);
+end;
+
+function TDADBSessionManager.DoFindSession(const aSessionID: TGUID; aUpdateTime: Boolean): TROSession;
+var
+ lDataSet: IDADataSet;
+ lData: Binary;
+ lDataField: TDAField;
+ lConnection: IDAConnection;
+begin
+ {$IFDEF FPC}
+ if aUpdateTime then result := nil else //remove warning
+ {$ENDIF}
+ result := nil;
+
+ lConnection := GetConnection;
+ lDataSet := Schema.NewDataset(lConnection, GetSessionDataSet);
+ lDataSet.ParamByName(FieldNameSessionID).AsString := DoConvertGUID(aSessionID);
+
+ BeginTransaction(lConnection);
+ try
+ lDataSet.Open;
+ except
+ RollbackTransaction(lConnection);
+ raise;
+ end;
+ CommitTransaction(lConnection);
+
+ try
+ if lDataSet.EOF then Exit;
+
+ result := DoCreateSession(aSessionID);
+ result.Created := lDataSet.FieldByName(FieldNameCreated).AsDateTime;
+ result.LastAccessed := lDataSet.FieldByName(FieldNameLastAccessed).AsDateTime;
+
+ lData := Binary.Create;
+ try
+ lDataField := lDataSet.FieldByName(fFieldNameData);
+ lDataField.SaveToStream(NewROStream(lData, false));
+ //lData := BinaryFromVariant(lDataSet.FieldByName(FieldNameData).Value);
+ //try
+ lData.Seek(0, soFromBeginning);
+ result.LoadFromStream(lData, true);
+ finally
+ lData.Free;
+ end;
+ finally
+ lDataSet.Close();
+ end;
+end;
+
+procedure TDADBSessionManager.DoGetAllSessions(Dest: TStringList);
+var
+ lDataSet: IDADataSet;
+ lConnection: IDAConnection;
+begin
+ lConnection := GetConnection;
+
+ lDataSet := Schema.NewDataset(lConnection, GetAllSessionIDsDataset);
+ BeginTransaction(lConnection);
+ try
+ lDataSet.Open;
+ except
+ RollbackTransaction(lConnection);
+ raise;
+ end;
+ CommitTransaction(lConnection);
+
+ try
+ while not lDataSet.EOF do try
+ Dest.Add(lDataSet.Fields[0].AsString);
+ finally
+ lDataSet.Next;
+ end;
+ finally
+ lDataSet.Close();
+ end;
+end;
+
+function TDADBSessionManager.DoGetSessionCount: integer;
+var
+ lDataSet: IDADataSet;
+ lConnection: IDAConnection;
+begin
+ lConnection := GetConnection;
+ lDataSet := Schema.NewDataset(lConnection, GetSessionCountDataSet);
+ BeginTransaction(lConnection);
+ try
+ lDataSet.Open;
+ except
+ RollbackTransaction(lConnection);
+ raise;
+ end;
+ CommitTransaction(lConnection);
+ try
+ result := lDataSet.Fields[0].AsInteger;
+ finally
+ lDataSet.Close();
+ end;
+end;
+
+procedure TDADBSessionManager.DoReleaseSession(aSession: TROSession; NewSession: boolean);
+var
+ lCommand: IDASQLCommand;
+ lData: Binary;
+ lConnection: IDAConnection;
+begin
+ inherited;
+ lConnection := GetConnection;
+ if NewSession then begin
+ lCommand := Schema.NewCommand(lConnection, InsertSessionCommand);
+ lCommand.ParamByName(FieldNameCreated).AsDateTime := aSession.Created;
+ end
+ else begin
+ lCommand := Schema.NewCommand(lConnection, UpdateSessionCommand);
+ end;
+ lCommand.ParamByName(FieldNameSessionID).AsString := DoConvertGUID(aSession.SessionID);
+ lCommand.ParamByName(FieldNameLastAccessed).AsDateTime := aSession.LastAccessed;
+ lData := Binary.Create;
+ try
+ aSession.SaveToStream(lData, TRUE);
+ lData.Seek(0, soFromBeginning);
+ lCommand.ParamByName(FieldNameData).LoadFromStream(NewROStream(lData, false));
+ finally
+ lData.Free;
+ end;
+ BeginTransaction(lConnection);
+ try
+ lCommand.Execute();
+ except
+ RollbackTransaction(lConnection);
+ raise;
+ end;
+ CommitTransaction(lConnection);
+// if ((NewSession) and (Assigned(OnSessionCreated))) then OnSessionCreated(aSession);
+ aSession.Free();
+end;
+
+procedure TDADBSessionManager.Notification(AComponent: TComponent; Operation: TOperation);
+begin
+ inherited;
+ if Operation <> opRemove then exit;
+ if AComponent = Schema then Schema := nil;
+end;
+
+procedure TDADBSessionManager.SetSchema(const Value: TDASchema);
+begin
+ if fSchema <> Value then begin
+ if Assigned(Schema) then Schema.RORemoveFreeNotification(self);
+ fSchema := Value;
+ if Assigned(Schema) then Schema.ROFreeNotification(self);
+ end;
+end;
+
+function TDADBSessionManager.DoConvertGUID(const aGUID: TGUID): string;
+begin
+ if Assigned(fOnConvertGUID) then
+ try
+ Result:= fOnConvertGUID(Self, aGUID);
+ except
+ Result:= GUIDToString(aGUID);
+ end
+ else
+ Result:= GUIDToString(aGUID);
+end;
+
+procedure TDADBSessionManager.Assign(Source: TPersistent);
+var
+ lSource: TDADBSessionManager;
+begin
+ inherited;
+ if Source is TDADBSessionManager then begin
+ lSource := TDADBSessionManager(Source);
+
+ AutoTransaction := lSource.AutoTransaction;
+ ClearSessionsCommand := lSource.ClearSessionsCommand;
+ ClearSessionsOnCreate := lSource.ClearSessionsOnCreate;
+ ClearSessionsOnDestroy := lSource.ClearSessionsOnDestroy;
+ Connection := lSource.Connection;
+ DeleteSessionCommand := lSource.DeleteSessionCommand;
+ FieldNameCreated := lSource.FieldNameCreated;
+ FieldNameData := lSource.FieldNameData;
+ FieldNameLastAccessed := lSource.FieldNameLastAccessed;
+ FieldNameSessionID := lSource.FieldNameSessionID;
+ GetAllSessionIDsDataset := lSource.GetAllSessionIDsDataset;
+ GetSessionCountDataSet := lSource.GetSessionCountDataSet;
+ GetSessionDataSet := lSource.GetSessionDataSet;
+ InsertSessionCommand := lSource.InsertSessionCommand;
+ OnConvertGUID := lSource.OnConvertGUID;
+ Schema := lSource.Schema;
+ UpdateSessionCommand := lSource.UpdateSessionCommand;
+ end;
+end;
+
+procedure TDADBSessionManager.BeginTransaction(AConnection: IDAConnection);
+begin
+ with AConnection do begin
+ FNeedTransactionAction := FForceTransaction and not InTransaction;
+ if FNeedTransactionAction then BeginTransaction;
+ end;
+end;
+
+procedure TDADBSessionManager.CommitTransaction(AConnection: IDAConnection);
+begin
+ if FNeedTransactionAction then AConnection.CommitTransaction;
+end;
+
+procedure TDADBSessionManager.RollbackTransaction(AConnection: IDAConnection);
+begin
+ if FNeedTransactionAction then AConnection.RollbackTransaction;
+end;
+
+function TDADBSessionManager.GetConnection: IDAConnection;
+begin
+ CheckProperties;
+ Result := Schema.ConnectionManager.NewConnection(Connection);
+end;
+
+procedure TDADBSessionManager.CheckProperties;
+begin
+ Check(Schema = nil, Name+'.Schema must be assigned.');
+ Schema.CheckProperties;
+ Check(FieldNameSessionID = '', Name + '.FieldNameSessionID must be set.');
+ Check(FieldNameCreated = '', Name + '.FieldNameCreated must be set.');
+ Check(FieldNameLastAccessed = '', Name + '.FieldNameLastAccessed must be assigned.');
+ Check(FieldNameData = '', Name + '.FieldNameData must be set.');
+ Check(InsertSessionCommand = '', Name + '.InsertSessionCommand must be set.');
+ Check(DeleteSessionCommand = '', Name + '.DeleteSessionCommand must be set.');
+ Check(UpdateSessionCommand = '', Name + '.UpdateSessionCommand must be set.');
+ Check(ClearSessionsCommand = '', Name + '.ClearSessionsCommand must be set.');
+ Check(GetSessionCountDataSet = '', Name + '.GetSessionCountDataSet must be set.');
+ Check(GetSessionDataSet = '', Name + '.GetSessionDataSet must be set.');
+ Check(GetAllSessionIDsDataset = '', Name + '.GetAllSessionIDsDataset must be set.');
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataAdapter.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataAdapter.pas
new file mode 100644
index 0000000..0dadd4f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataAdapter.pas
@@ -0,0 +1,748 @@
+unit uDADataAdapter;
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+{$I DataAbstract.inc}
+
+interface
+uses
+ SysUtils, Variants, Classes, DB,
+ uROClasses, uROClient,
+ uDAInterfaces, uDAClasses, DataAbstract4_Intf, uDADataTable, uDADataStreamer, uDADelta;
+
+type
+ TDATableOptions = record
+ // Fill
+ Bookmark: TBookMark;
+ GoFirst, OldLogChanges: boolean;
+ OldPos: cardinal;
+ // FillSchema
+ FieldHandlers : TStringList;
+ AppendMode: Boolean;
+ end;
+
+ TDAFailureBehavior = (fbNone, fbRaiseException, fbShowReconcile, fbBoth);
+ TDAApplyUpdatesEvent = procedure(Sender: TObject; aTable: TDADataTable; const Delta: IDADelta) of object;
+ TDABeforeProcessFailuresEvent = procedure(Sender: TObject; aTablesList: TList; aFailedDeltas: TList; var aFailureBehavior: TDAFailureBehavior) of object;
+ TDAShowReconcleDialogEvent = procedure(Sender: TObject; var AFailedDeltaList: TList; aTableList: TList; var aHandled: boolean) of object;
+ TDAOnGenerateRecordMessage = procedure(Sender: TObject; aChange: TDADeltaChange; ADatatable: TDADataTable; var aMessage: string) of object;
+ TDAReconcileDialogAction = (rdlgNone,rdlgSkip,rdlgCancel, rdlgRepost, rdlgRevert);
+ TDAShowReconcileRecordInAppUIEvent = procedure(Sender: TObject; aChange: TDADeltaChange; aDatatable: TDADataTable; var aHandled: Boolean; var aAction: TDAReconcileDialogAction) of object;
+
+ TDATableOptionsArray = array of TDATableOptions;
+
+ TDABaseDataAdapter = class(TDACustomDataAdapter)
+ private
+ FDataStreamer: TDADataStreamer;
+ fBeforeApplyUpdates, fAfterApplyUpdates: TDAApplyUpdatesEvent;
+ FFailureBehavior: TDAFailureBehavior;
+ fBeforeProcessFailures: TDABeforeProcessFailuresEvent;
+ fOnShowReconcleDialog: TDAShowReconcleDialogEvent;
+ FOnGenerateRecordMessage: TDAOnGenerateRecordMessage;
+ fOnShowReconcleRecordInAppUI: TDAShowReconcileRecordinAppUIEvent;
+ FDynamicSelect: Boolean;
+ fAutoFillScripts: Boolean;
+ fCacheSchema: boolean;
+ fSchema: TDASchema;
+ procedure ThrowFailures(ATableList,AFailedDeltas:TList);
+ procedure SetCacheSchema(const Value: boolean);
+ function GetSchema: TDASchema;
+ protected
+ { abstract }
+ procedure InternalApplyUpdates(aTables,aTablesWithDetails: array of TDADataTable); virtual; abstract;
+ procedure InternalFill(aTableArray: array of TDADataTable; aArray: TableRequestInfoArray; const aIncludeSchema, aAppendMode: boolean; aSavedOptions: TDATableOptionsArray);virtual; abstract;
+ function InternalFillSchema(var aStream: TROBinaryMemoryStream): TRODataType; virtual; abstract;
+ function InternalFillScripts(aTables: array of TDADataTable):UTF8String; virtual; abstract;
+ function InternalReadSchema: UTF8String; virtual; abstract;
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ function GetDataStreamer: TDADataStreamer; override;
+ procedure SetDataStreamer(const Value: TDADataStreamer); override;
+ function CreateTableRequestInfo(aTable: TDADataTable; aIncludeSchema: boolean; aDynamicWhereExpression: TDAWhereExpression = nil): TableRequestInfo;
+ function GetTableNamesAsCommaText(aTableArray: array of TDADataTable): UTF8String;
+ property CacheSchema: boolean read fCacheSchema write SetCacheSchema default false;
+ property DataStreamer: TDADataStreamer read GetDataStreamer write SetDataStreamer;
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ function ApplyUpdates(aTables: array of TDADataTable; aRefetchAll: boolean = false): boolean; override;
+ procedure FillSchema(aTables: array of TDADataTable; aPreserveLookupFields: boolean = false; aPreserveClientCalcFields : boolean = false);override;
+ procedure CheckProperties; virtual;
+ function ReadSchema(aForceReRead: boolean = false): TDASchema;
+ procedure FillScripts(aTables: array of TDADataTable); override;
+ procedure Fill(aTables: array of TDADataTable; aTableRequestInfoArray: array of TableRequestInfo; aSaveCursor: boolean=false;aIncludeSchema: boolean=false; aAppendMode:Boolean = False); overload;
+ procedure Fill(aTables: array of TDADataTable; aWhereClauses : array of TDAWhereExpression; aSaveCursor: boolean=false; aIncludeSchema: boolean=false; aAppendMode:Boolean = False); overload;
+ procedure Fill(aTables: array of TDADataTable; aSaveCursor: boolean = False; aIncludeSchema: boolean = False; aAppendMode:Boolean = False); overload; override;
+ procedure FlushSchema;
+ property Schema: TDASchema read GetSchema;
+ published
+ property BeforeApplyUpdates: TDAApplyUpdatesEvent read fBeforeApplyUpdates write fBeforeApplyUpdates;
+ property AfterApplyUpdates: TDAApplyUpdatesEvent read fAfterApplyUpdates write fAfterApplyUpdates;
+ property FailureBehavior: TDAFailureBehavior read FFailureBehavior write FFailureBehavior default fbBoth;
+ property BeforeProcessFailures: TDABeforeProcessFailuresEvent read fBeforeProcessFailures write fBeforeProcessFailures;
+ property OnShowReconcleDialog:TDAShowReconcleDialogEvent read fOnShowReconcleDialog write fOnShowReconcleDialog;
+ property OnGenerateRecordMessage: TDAOnGenerateRecordMessage read FOnGenerateRecordMessage write FOnGenerateRecordMessage;
+ property OnShowReconcileRecordInAppUI: TDAShowReconcileRecordInAppUIEvent read fOnShowReconcleRecordInAppUI write fOnShowReconcleRecordInAppUI;
+ property AutoFillScripts: Boolean read fAutoFillScripts write fAutoFillScripts default false;
+ property DynamicSelect: Boolean read FDynamicSelect write FDynamicSelect default False;
+ end;
+
+implementation
+
+uses
+ TypInfo,
+ uROBinaryHelpers, uROXMLIntf,
+ uDAEngine, uDAReconcileDialog;
+
+{ TDABaseDataAdapter }
+
+function TDABaseDataAdapter.ApplyUpdates(aTables: array of TDADataTable;
+ aRefetchAll: boolean): boolean;
+
+ procedure CheckTable(ATable: TDADataTable);
+ begin
+ if ATable.RemoteDataAdapter <> Self then EDAException.CreateFmt('Can not do ApplyUpdate:%s.RemoteDataAdapter must use %s',[ATable.Name, Self.Name]);
+ end;
+
+ procedure List_RemoveDuplicates(AList: TList);
+ var
+ i,j: integer;
+ p: pointer;
+ begin
+ i := 0;
+ while i < AList.Count do begin
+ p:=AList[i];
+ for j := AList.Count - 1 downto i+1 do
+ if p = AList[j] then
+ AList.Delete(j);
+ inc(i);
+ end;
+ end;
+
+var
+ i,k,j : Integer;
+ details: TList;
+ lTables: TList;
+ dt: TDADataTable;
+ aTables2,aTables3: array of TDADataTable;
+ lFailedDeltas: TList;
+begin
+ CheckProperties;
+ Result := False;
+
+ // we need to process correctly case when MasterTables and DetailTable use different RDAs
+ // currently we don't support it
+ // probably we should do apply updates for each RDA separately
+ SetLength(aTables2, Length(aTables));
+ j:=0;
+ lTables := TList.Create;
+ try
+ for i := Low(aTables) to High(aTables) do begin
+ if Assigned(aTables[i]) and aTables[i].Active and aTables[i].DeltaInitialized then begin
+ CheckTable(aTables[i]);
+ aTables2[j] := aTables[i];
+ inc(j);
+ lTables.Add(aTables[i]);
+ details:= aTables[i].GetDetailTablesforApplyUpdate;
+ try
+ for k := 0 to details.Count-1 do begin
+ CheckTable(TDADataTable(details[k]));
+ lTables.Add(TDADataTable(details[k]));
+ end;
+ finally
+ details.free;
+ end;
+ end;
+ end;
+ SetLength(aTables2,j);
+ List_RemoveDuplicates(lTables);
+ if lTables.Count = 0 then Exit;
+ SetLength(aTables3,lTables.Count);
+ for I := 0 to lTables.Count - 1 do
+ aTables3[i] := TDADataTable(lTables[i]);
+
+ // post all unposted records
+ for i := 0 to lTables.Count-1 do
+ with TDADataTable(lTables[i]) do
+ if not (ruoOnPost in RemoteUpdatesOptions) then Delta.EndChangesInAllTables;
+
+ // BeforeApplyUpdates
+ for i := 0 to lTables.Count-1 do begin
+ dt := TDADataTable(lTables[i]);
+ if Assigned(dt.RemoteDataAdapter) and (dt.RemoteDataAdapter is TDABaseDataAdapter) and Assigned(TDABaseDataAdapter(dt.RemoteDataAdapter).BeforeApplyUpdates) then
+ TDABaseDataAdapter(dt.RemoteDataAdapter).BeforeApplyUpdates(dt.RemoteDataAdapter, dt, dt.Delta);
+ end;
+
+ InternalApplyUpdates(aTables2, aTables3);
+ lFailedDeltas := TList.Create;
+ try
+ for i := 0 to lTables.Count-1 do
+ with TDADataTable(lTables[i]).Delta do
+ for j := 0 to Count - 1 do
+ if Changes[j].Status = csFailed then lFailedDeltas.Add(Changes[j]);
+
+ for i := 0 to lTables.Count-1 do
+ TDADataTable(lTables[i]).MergeDelta;
+ ThrowFailures(lTables,lFailedDeltas);
+ finally
+ lFailedDeltas.Free;
+ end;
+
+ // AfterApplyUpdates
+ for i := 0 to lTables.Count-1 do begin
+ dt := TDADataTable(lTables[i]);
+ if Assigned(dt.RemoteDataAdapter) and (dt.RemoteDataAdapter is TDABaseDataAdapter) and Assigned(TDABaseDataAdapter(dt.RemoteDataAdapter).AfterApplyUpdates) then
+ TDABaseDataAdapter(dt.RemoteDataAdapter).AfterApplyUpdates(dt.RemoteDataAdapter, dt, nil);
+ end;
+
+ Result := True;
+ if aRefetchAll then begin
+ for i := 0 to lTables.Count-1 do
+ with TDADataTable(lTables[i]) do
+ if Active then Close();
+ for i := 0 to lTables.Count-1 do
+ TDADataTable(lTables[i]).Open;
+ end;
+ finally
+ lTables.Free;
+ end;
+end;
+
+procedure TDABaseDataAdapter.Assign(Source: TPersistent);
+var
+ lSource: TDABaseDataAdapter;
+begin
+ inherited;
+ if Source is TDABaseDataAdapter then begin
+ lSource := TDABaseDataAdapter(Source);
+
+ AfterApplyUpdates := lSource.AfterApplyUpdates;
+ AutoFillScripts := lSource.AutoFillScripts;
+ BeforeApplyUpdates := lSource.BeforeApplyUpdates;
+ BeforeProcessFailures := lSource.BeforeProcessFailures;
+ CacheSchema := lSource.CacheSchema;
+ DataStreamer := lSource.DataStreamer;
+ DynamicSelect := lSource.DynamicSelect;
+ FailureBehavior := lSource.FailureBehavior;
+ OnGenerateRecordMessage := lSource.OnGenerateRecordMessage;
+ OnShowReconcileRecordInAppUI := lSource.OnShowReconcileRecordInAppUI;
+ OnShowReconcleDialog := lSource.OnShowReconcleDialog;
+ end;
+end;
+
+procedure TDABaseDataAdapter.CheckProperties;
+begin
+ // nothing
+end;
+
+constructor TDABaseDataAdapter.Create(aOwner: TComponent);
+begin
+ inherited;
+ FFailureBehavior := fbBoth;
+ FDynamicSelect := False;
+ fCacheSchema := False;
+end;
+
+function TDABaseDataAdapter.CreateTableRequestInfo(aTable: TDADataTable;
+ aIncludeSchema: boolean;
+ aDynamicWhereExpression: TDAWhereExpression): TableRequestInfo;
+var
+ lParam: DataParameter;
+ j: integer;
+ lExpression: TDAWhereExpression;
+begin
+ if aDynamicWhereExpression <> nil then
+ lExpression := aDynamicWhereExpression
+ else
+ lExpression := aTable.DynamicWhere.Expression;
+ if lExpression <> nil then lExpression.Validate;
+
+ if DynamicSelect or (lExpression <> nil) then begin
+ Result := TableRequestInfoV5.Create();
+ if DynamicSelect then begin
+ TableRequestInfoV5(Result).DynamicSelectFieldNames := StringArray.Create;
+ For j:=0 to aTable.FieldCount-1 do
+ if not (aTable.Fields[j].Lookup or (aTable.Fields[j].Calculated and not aTable.Fields[j].ServerCalculated)) then
+ TableRequestInfoV5(Result).DynamicSelectFieldNames.Add(AnsiToUtf8(aTable.Fields[j].Name));
+ end;
+ if lExpression <> nil then
+ TableRequestInfoV5(Result).WhereClause:=aTable.DynamicWhere.ExpressionToXmlNode(lExpression);
+ end
+ else
+ Result := TableRequestInfo.Create();
+
+ Result.MaxRecords := aTable.MaxRecords;
+ Result.IncludeSchema := aIncludeSchema and not (soIgnoreStreamSchema in aTable.StreamingOptions);
+ Result.UserFilter := AnsiToUtf8(aTable.Where.Clause);
+ for j := 0 to aTable.Params.Count-1 do begin
+ lParam := Result.Parameters.Add();
+ lParam.Name := AnsiToUtf8(aTable.Params[j].Name);
+ lParam.Value := aTable.Params[j].Value;
+ end;
+end;
+
+destructor TDABaseDataAdapter.Destroy;
+begin
+ DataStreamer := nil;
+ FlushSchema;
+ inherited;
+end;
+
+procedure TDABaseDataAdapter.Fill(aTables: array of TDADataTable;
+ aWhereClauses: array of TDAWhereExpression; aSaveCursor, aIncludeSchema,
+ aAppendMode: Boolean);
+var
+ lTableRequestInfoArray: array of TableRequestInfo;
+ lTables: array of TDADataTable;
+ i,j: integer;
+begin
+ if Length(aTables) <> Length(aWhereClauses) then raise Exception.Create('aTables and aWhereClauses should contain equal members count.');
+ SetLength(lTableRequestInfoArray, Length(aTables));
+ SetLength(lTables, Length(aTables));
+ j:=0;
+ for i := 0 to High(aTables) do begin
+ if aTables[i] <> nil then begin
+ lTables[j]:=aTables[i];
+ lTableRequestInfoArray[j]:= CreateTableRequestInfo(aTables[j],aIncludeSchema, aWhereClauses[i]);
+ inc(j);
+ end;
+ end;
+ SetLength(lTables, j);
+ SetLength(lTableRequestInfoArray, j);
+ Fill(lTables, lTableRequestInfoArray, aSaveCursor,aIncludeSchema,aAppendMode);
+end;
+
+procedure TDABaseDataAdapter.Fill(aTables: array of TDADataTable; aSaveCursor,
+ aIncludeSchema, aAppendMode: Boolean);
+var
+ lTableRequestInfoArray: array of TableRequestInfo;
+ lTables: array of TDADataTable;
+ i,j: integer;
+begin
+ SetLength(lTableRequestInfoArray, Length(aTables));
+ SetLength(lTables, Length(aTables));
+ j:=0;
+ for i := 0 to High(aTables) do begin
+ if aTables[i] <> nil then begin
+ lTables[j]:=aTables[i];
+ lTableRequestInfoArray[j]:= CreateTableRequestInfo(aTables[j],aIncludeSchema);
+ inc(j);
+ end;
+ end;
+ SetLength(lTables, j);
+ SetLength(lTableRequestInfoArray, j);
+ Fill(lTables, lTableRequestInfoArray, aSaveCursor, aIncludeSchema, aAppendMode);
+end;
+
+procedure TDABaseDataAdapter.Fill(aTables: array of TDADataTable;
+ aTableRequestInfoArray: array of TableRequestInfo; aSaveCursor,
+ aIncludeSchema, aAppendMode: Boolean);
+var
+ lSavedOptions: TDATableOptionsArray;
+ i: integer;
+ ltablearray: array of TDADataTable;
+ ltableList: TList;
+ llocalList: TList;
+ ltbl: TDADataTable;
+ lArray: TableRequestInfoArray;
+begin
+ if Length(aTables) <> Length(aTableRequestInfoArray) then raise Exception.Create('aTables and aTableRequestInfoArray should contain equal members count.');
+
+ CheckProperties;
+
+ lArray:= TableRequestInfoArray.Create;
+ try
+ ltableList := TList.Create;
+ llocalList := TList.Create;
+ try
+ for i := Low(aTables) to High(aTables) do begin
+ ltbl:=aTables[i];
+ if ltbl = nil then continue;
+ if ltableList.IndexOf(ltbl) = -1 then ltableList.Add(ltbl);
+ if not aAppendMode then ltbl.GetDetailTablesforAllinOneFetch(ltableList,llocalList,True);
+ end;
+ SetLength(ltablearray,ltableList.Count);
+ for i := 0 to ltableList.Count - 1 do
+ ltablearray[i]:=TDADataTable(ltableList[i]);
+ for i := 0 to High(ltablearray) do
+ lArray.Add(nil);
+ for i := 0 to High(aTableRequestInfoArray) do
+ lArray.Items[ltableList.IndexOf(aTables[i])]:=aTableRequestInfoArray[i];
+ if aAppendMode then begin
+ for i := 0 to High(ltablearray) do
+ Check(ltablearray[i].HasDelta and (ltablearray[i].Delta.Count > 0),
+ '%s.Fill: %s contains uncommited changes. AppendMode is incompatible with this.',
+ [Self.Name,ltablearray[i].Name]);
+ end;
+ for i := 0 to lArray.Count-1 do
+ if lArray.Items[i] = nil then lArray.Items[i]:= CreateTableRequestInfo(ltablearray[i],aIncludeSchema);
+ finally
+ ltableList.Free;
+ llocalList.Free;
+ end;
+ if length(ltablearray) = 0 then Exit;
+ SetLength(lSavedOptions, length(ltablearray));
+ try
+ for i := 0 to High(ltablearray) do begin
+ ltbl:= ltablearray[i];
+ lSavedOptions[i].OldLogChanges := ltbl.LogChanges;
+ lSavedOptions[i].AppendMode := ltbl.Active and aAppendMode;
+ ltbl.LogChanges := false;
+ ltbl.InternalSetFetching(true);
+
+ if ltbl.Active then begin
+ lSavedOptions[i].GoFirst := false;
+ if aSaveCursor then
+ lSavedOptions[i].Bookmark := ltbl.GetBookMark;
+ end
+ else begin
+ lSavedOptions[i].GoFirst := true;
+ end;
+ end;
+ try
+ InternalFill(lTableArray,lArray,aIncludeSchema,aIncludeSchema, lSavedOptions);
+ finally
+ for i := 0 to High(ltablearray) do begin
+ ltbl:= ltablearray[i];
+ if ltbl.Active then begin
+ if lSavedOptions[i].GoFirst then begin
+ ltbl.First;
+ end
+ else begin
+ if aSaveCursor then begin
+ if ltbl.BookmarkValid(lSavedOptions[i].Bookmark) then ltbl.GotoBookmark(lSavedOptions[i].Bookmark);
+ ltbl.FreeBookmark(lSavedOptions[i].Bookmark);
+ end;
+ end;
+ end;
+ ltbl.LogChanges := lSavedOptions[i].OldLogChanges;
+ ltbl.InternalSetFetching(false);
+ end;
+ end;
+ finally
+ SetLength(lSavedOptions,0);
+ SetLength(ltablearray,0);
+ end;
+ finally
+ lArray.Free;
+ end;
+end;
+
+procedure TDABaseDataAdapter.FillSchema(
+ aTables: array of TDADataTable; aPreserveLookupFields,
+ aPreserveClientCalcFields: boolean);
+type
+ THandlerArray = array[0..1] of TMethod;
+ PHandlerArray = ^THandlerArray;
+
+const
+ HandlersToSave : array[0..1] of string = ('OnChange', 'OnValidate');
+
+var
+ lSavedOptions: array of TDATableOptions;
+ i, j, k, lIndex: integer;
+ lHandlers : PHandlerArray;
+ lSchema: TDASchema;
+ lDataTableSchema: TDADataset;
+ lookupfields : TDAFieldCollection;
+ clientcalcfields : TDAFieldCollection;
+ lField: TDAField;
+ lBinary: TROBinaryMemoryStream;
+begin
+ CheckProperties;
+
+ SetLength(lSavedOptions, Length(aTables));
+
+ for i := Low(aTables) to High(aTables) do
+ if aTables[i].Active then aTables[i].Close();
+
+ lookupfields := nil;
+ clientcalcfields := nil;
+
+ for i := Low(aTables) to High(aTables) do
+ aTables[i].Fields.FieldEventsDisabled := true;
+ try
+
+ for i := Low(aTables) to High(aTables) do begin
+ lSavedOptions[i-Low(aTables)].FieldHandlers := TStringList.Create;
+
+ { Saves the current event handler pointers }
+ for j := 0 to aTables[i].Fields.Count-1 do begin
+ New(lHandlers);
+ for k := Low(HandlersToSave) to High(HandlersToSave) do
+ lHandlers[k] := GetMethodProp(aTables[i].Fields[j], HandlersToSave[k]);
+ lSavedOptions[i-Low(aTables)].FieldHandlers.AddObject(aTables[i].Fields[j].Name, TObject(lHandlers));
+ end;
+
+ { Save lookup and calced fields}
+ if aPreserveLookupFields then begin
+ lookupfields := TDAFieldCollection.Create(nil);
+ lookupfields.Assign(aTables[i].Fields);
+ for j := (lookupfields.Count-1) downto 0 do
+ if not (lookupfields[j] as TDACustomField).Lookup then
+ lookupfields.Delete(j);
+ end;
+
+ if aPreserveClientCalcFields then begin
+ clientcalcfields := TDAFieldCollection.Create(nil);
+ clientcalcfields.Assign(aTables[i].Fields);
+ for j :=(clientcalcfields.Count-1) downto 0 do
+ if not (clientcalcfields[j] as TDACustomField).Calculated then
+ clientcalcfields.Delete(j);
+ end;
+
+ aTables[i].Fields.Clear;
+ end;
+
+ try
+ lBinary := nil;
+ case InternalFillSchema(lBinary) of
+ rtBinary:begin
+ // only RDA
+ DataStreamer.Initialize(lBinary, aiRead);
+ try
+ if (DataStreamer.DatasetCount = 0) then raise Exception.Create('Stream does not contain any dataset');
+ for i := Low(aTables) to High(aTables) do
+ DataStreamer.ReadDataset(aTables[i].LogicalName, aTables[i], true, false);
+ finally
+ DataStreamer.Finalize;
+ end;
+ end;
+ rtString, rtUTF8String:begin
+ //LDA+RDA
+ lSchema := GetSchema;
+ for i := Low(aTables) to High(aTables) do begin
+ lDataTableSchema := lSchema.Datasets.FindDatasetByName(aTables[i].LogicalName);
+ if not assigned(lDataTableSchema) then
+ lDataTableSchema := lSchema.UnionDataTables.FindUnionDataTableByName(aTables[i].LogicalName);
+ if not assigned(lDataTableSchema) then
+ lDataTableSchema := lSchema.JoinDataTables.FindJoinTableByName(aTables[i].LogicalName);
+ if not assigned(lDataTableSchema) then raise Exception.CreateFmt('Data table "%s" was not found in schema.',[aTables[i].LogicalName]);
+
+ aTables[i].Fields.AssignFieldCollection(lDataTableSchema.Fields);
+ // ToDo: the code below is shared with TableWizard. Refactor.
+ if lDataTableSchema is TDAUnionDataTable then begin
+ if not Assigned(aTables[i].Fields.FindField(def_SourceTableFieldName) as TDAField) then begin
+ lField := aTables[i].Fields.Add();
+ lField.Name := def_SourceTableFieldName;
+ lField.DataType := datInteger;
+ lField.InPrimaryKey := True;
+ lField.ServerAutoRefresh := True;
+ end;
+ end;
+ aTables[i].Params.AssignParamCollection(lDataTableSchema.Params);
+ aTables[i].CustomAttributes.Assign(lDataTableSchema.CustomAttributes);
+ end;
+ end;
+ end;
+ finally
+ FreeAndNil(lBinary);
+ { Save lookup and calced fields}
+ if aPreserveLookupFields then
+ for i := Low(aTables) to High(aTables) do
+ for j := 0 to (lookupfields.Count-1) do
+ aTables[i].Fields.Add.Assign(lookupfields[j]);
+ if aPreserveClientCalcFields then
+ for i := Low(aTables) to High(aTables) do
+ for j := 0 to (clientcalcfields.Count-1) do
+ if not Assigned(aTables[i].Fields.FindField(clientcalcfields[j].Name)) then
+ aTables[i].Fields.Add.Assign(clientcalcfields[j]);
+
+ { restores the old event handler pointers }
+ for i := Low(aTables) to High(aTables) do begin
+ for j := 0 to aTables[i].Fields.Count-1 do begin
+ lIndex := lSavedOptions[i-Low(aTables)].FieldHandlers.IndexOf(aTables[i].Fields[j].Name);
+ if lIndex >= 0 then begin
+ lHandlers := PHandlerArray(lSavedOptions[i-Low(aTables)].FieldHandlers.Objects[lIndex]);
+ for k := Low(HandlersToSave) to High(HandlersToSave) do
+ SetMethodProp(aTables[i].Fields[j], HandlersToSave[k], lHandlers[k]);
+ end;
+ end;
+ { deallocating memory used to store the old event handler pointers }
+ for j := 0 to lSavedOptions[i-Low(aTables)].FieldHandlers.Count - 1 do
+ Dispose(PHandlerArray(lSavedOptions[i-Low(aTables)].FieldHandlers.Objects[j]));
+ lSavedOptions[i-Low(aTables)].FieldHandlers.Free();
+ end;
+ end;
+ finally
+ clientcalcfields.Free;
+ lookupfields.Free;
+ for i := Low(aTables) to High(aTables) do
+ aTables[i].Fields.FieldEventsDisabled := false;
+ end;
+end;
+
+procedure TDABaseDataAdapter.FillScripts(aTables: array of TDADataTable);
+var
+ lXmlStr: UTF8String;
+ lXml: IXMLDocument;
+ lScriptNode: IXMLNode;
+ i: integer;
+begin
+ CheckProperties;
+ lXmlStr := InternalFillScripts(aTables);
+ lXml := NewROXmlDocument;
+ lXml.New;
+ lXml.XML := UTF8ToString(lXmlStr);
+ for i := Low(aTables) to High(aTables) do begin
+ lScriptNode := lXml.DocumentNode.GetNodeByName(aTables[i].Logicalname);
+ if assigned(lScriptNode) then
+ aTables[i].ScriptCode.Text := VarToWideStr(lScriptNode.Value)
+ else
+ aTables[i].ScriptCode.Text := '';
+ end;
+end;
+
+
+procedure TDABaseDataAdapter.FlushSchema;
+begin
+ FreeAndNil(fSchema);
+end;
+
+function TDABaseDataAdapter.GetDataStreamer: TDADataStreamer;
+begin
+ Result := FDataStreamer;
+end;
+
+function TDABaseDataAdapter.GetSchema: TDASchema;
+begin
+ Result := ReadSchema(not fCacheSchema);
+end;
+
+function TDABaseDataAdapter.GetTableNamesAsCommaText(
+ aTableArray: array of TDADataTable): UTF8String;
+var
+ names: TStringList;
+ i: integer;
+begin
+ names := TStringList.Create;
+ names.Duplicates := dupIgnore;
+ try
+ for i := 0 to Length(aTableArray) - 1 do
+ names.Add(aTableArray[i].LogicalName);
+ Result := UTF8Encode(names.CommaText);
+ finally
+ names.Free;
+ end;
+end;
+
+procedure TDABaseDataAdapter.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited;
+ if (Operation = opRemove) and (AComponent = FDataStreamer) then FDataStreamer := nil
+end;
+
+function TDABaseDataAdapter.ReadSchema(aForceReRead: boolean): TDASchema;
+var
+ lSchemaAsXmlString: UTF8String;
+begin
+ CheckProperties;
+ if aForceReRead then FlushSchema;
+ if not assigned(fSchema) then begin
+ lSchemaAsXmlString := InternalReadSchema;
+ fSchema := TDASchema.Create(nil);
+ fSchema.LoadFromXml(AnsiString(lSchemaAsXmlString));
+ end;
+ result := fSchema;
+end;
+
+procedure TDABaseDataAdapter.SetCacheSchema(const Value: boolean);
+begin
+ fCacheSchema := Value;
+ if not fCacheSchema then FlushSchema();
+end;
+
+procedure TDABaseDataAdapter.SetDataStreamer(
+ const Value: TDADataStreamer);
+begin
+ if Value <> fDataStreamer then begin
+ if assigned(fDataStreamer) then fDataStreamer.RORemoveFreeNotification(self);
+ fDataStreamer := Value;
+ if assigned(fDataStreamer) then fDataStreamer.ROFreeNotification(self);
+ end;
+end;
+
+procedure TDABaseDataAdapter.ThrowFailures(ATableList,
+ AFailedDeltas: TList);
+
+ function FindDatatable(ADelta: IDADelta): TDADatatable;
+ var
+ i: integer;
+ begin
+ Result := nil;
+ for i := 0 to ATableList.Count - 1 do
+ if SameText(ADelta.LogicalName, TDADatatable(ATableList[i]).LogicalName) then begin
+ Result := TDADatatable(ATableList[i]);
+ Break;
+ end;
+ end;
+
+ function _VarToStr(AValue: variant; ADataType: TDADataType): string;
+ begin
+ if ADataType = datDecimal then
+ Result := DecimalVariantToString(AValue)
+ else
+ Result := VarToStr(AValue)
+ end;
+
+var
+ lFailureBehavior: TDAFailureBehavior;
+ lExceptionMessage: string;
+ i,j: integer;
+ lHandled: boolean;
+ lMes: string;
+begin
+ // we need to process correctly case when MasterTables and DetailTable use different RDA
+ // currently we don't support it
+ // probably we should ThrowFailures for each RDA separately
+
+ if AFailedDeltas.Count >0 then begin
+ lFailureBehavior:= FFailureBehavior;
+ if Assigned(fBeforeProcessFailures) then fBeforeProcessFailures(Self, ATableList, AFailedDeltas, lFailureBehavior);
+ //(fbNone, fbRaiseException, fbShowReconcile, fbBoth);
+ if lFailureBehavior in [fbShowReconcile, fbBoth] then begin
+ lHandled := false;
+ if assigned(OnShowReconcleDialog) then OnShowReconcleDialog(self, AFailedDeltas, ATableList, lHandled);
+ if not lHandled then ReconcileDialog(Self, AFailedDeltas, ATableList);
+ end;
+ if (AFailedDeltas.Count >0) and (lFailureBehavior in [fbRaiseException, fbBoth]) then begin
+ lExceptionMessage := 'One or more updates failed to apply on the server.'+sLineBreak;
+ for i := 0 to AFailedDeltas.Count-1 do begin
+ lExceptionMessage := lExceptionMessage + sLineBreak ;
+ With TDADeltaChange(AFailedDeltas[i]), Delta do
+ for j := 0 to KeyFieldCount-1 do
+ begin
+
+ if ChangeType = uDAInterfaces.ctDelete then
+ lExceptionMessage := lExceptionMessage + _VarToStr(OldValueByName[KeyFieldNames[j]], LoggedFieldTypes[j])
+ else
+ lExceptionMessage := lExceptionMessage + _VarToStr(NewValueByName[KeyFieldNames[j]], LoggedFieldTypes[j]);
+
+ if j = KeyFieldCount-1 then
+ lExceptionMessage := lExceptionMessage + ': '
+ else
+ lExceptionMessage := lExceptionMessage + ', ';
+ end;
+
+ lMes := TDADeltaChange(AFailedDeltas[i]).Message;
+ if Assigned(FOnGenerateRecordMessage) then
+ FOnGenerateRecordMessage(Self, TDADeltaChange(AFailedDeltas[i]),FindDatatable(TDADeltaChange(AFailedDeltas[i]).Delta),lMes);
+ lExceptionMessage := lExceptionMessage + lMes;
+ if i = 10 then break;
+ end;
+ RaiseError(lExceptionMessage);
+ end;
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataStreamer.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataStreamer.pas
new file mode 100644
index 0000000..3d25302
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataStreamer.pas
@@ -0,0 +1,757 @@
+unit uDADataStreamer;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, SysUtils,
+ uRODL, uROClasses, uROClientIntf, uROClient,
+ uDAInterfaces, uDAEngine, uDADelta,
+ DataAbstract3_Intf, DataAbstract4_Intf;
+
+const
+ AllRows = -1;
+ DEFAULT_BUFFER_SIZE = 262144; //256kb
+
+type
+ TDADataForAppend = class
+ public
+ TableSchema: TDADataset;
+ EndDataPosition: Integer;
+ CountOfRecordsPosition: Integer;
+ RecordCount: Integer;
+ MaxRowCount: Integer;
+ RealFields: array of integer;
+ end;
+
+type
+ TDAAdapterInitialization = (aiUnknown, aiRead, aiReadFromBeginning, aiWrite);
+
+ TDAWriteOption = (woRows, woSchema);
+ TDAWriteOptions = set of TDAWriteOption;
+
+const
+ AdapterReadModes = [aiRead, aiReadFromBeginning];
+ AdapterWriteModes = [aiWrite];
+
+type
+ TDADataStreamer = class;
+
+ TDADatasetOperation = procedure(DataStreamer: TDADataStreamer; const Datasetname: string; const Dataset: IDADataset) of object;
+ TDADeltaOperation = procedure(DataStreamer: TDADataStreamer; const DeltaName: string; const Delta: IDADelta) of object;
+
+ TDAReadWriteFieldValue = procedure(const aField: TDAField; var Value: Variant) of object;
+ TDAReadWriteFieldValueEx = procedure(const aDataset: IDADataset; const aField: TDAField; var Value: Variant) of object;
+ TDADataStreamerDeltaProgress = procedure(Sender: TDADataStreamer; const aDelta: IDADelta; const aCurrent, aTotal: Integer) of object;
+ TDADataStreamerReadDatasetProgress = procedure(Sender: TDADataStreamer; const aDataset: IDADataset; const aCurrent, aTotal: Integer) of object;
+ TDADataStreamerWriteDatasetProgress = procedure(Sender: TDADataStreamer; const aDataset: IDADataset; const aCurrent, aMaxRecords: Integer) of object;
+
+ TDAFieldArray = array of TDAField;
+ { TDADataStreamer }
+ TDADataStreamer = class(TROComponent)
+ private
+ fDeltaNames,
+ fDatasetNames: TStringList;
+
+ fOnInitialized,
+ fOnFinalized: TNotifyEvent;
+
+ fOnWriteDataset,
+ fOnReadDataset: TDADatasetOperation;
+
+ fOnWriteDelta,
+ fOnReadDelta: TDADeltaOperation;
+
+ fOnWriteFieldValue,
+ fOnReadFieldValue,
+ fOnBeforeFieldValueSerialization: TDAReadWriteFieldValue;
+
+ fBusy: boolean;
+ fAdapterInitialization: TDAAdapterInitialization;
+ fData: TStream;
+ FBufferSize: cardinal;
+ FSendReducedDelta: boolean;
+ fOnReadDeltaProgress: TDADataStreamerDeltaProgress;
+ fOnReadDatasetProgress: TDADataStreamerReadDatasetProgress;
+ fOnWriteDeltaProgress: TDADataStreamerDeltaProgress;
+ fOnWriteDatasetProgress: TDADataStreamerWriteDatasetProgress;
+ fOnWriteFieldValueEx: TDAReadWriteFieldValueEx;
+
+ function GetDatasetCount: integer;
+ function GetDatasetNames(Index: integer): string;
+ function GetDeltaCount: integer;
+ function GetDeltaNames(Index: integer): string;
+ procedure ClearReferences;
+ procedure CheckCanRead;
+ procedure CheckCanWrite;
+ function GetDatasetInfoObjects(Index: integer): TObject;
+ function GetDeltaInfoObjects(Index: integer): TObject;
+ procedure SetAdapterInitialization(const Value: TDAAdapterInitialization);
+
+ protected
+ // To override
+ function DoCreateStream: TStream; virtual; abstract;
+ procedure DoInitialize(Mode: TDAAdapterInitialization); virtual; abstract;
+ procedure DoFinalize; virtual; abstract;
+
+ function DoWriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions;
+ MaxRows: integer): integer;overload;
+
+ function DoWriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions;
+ MaxRows: integer;
+ ADynFieldNames: array of string): integer; overload; virtual; abstract;
+
+ procedure DoWriteDelta(const Source: IDADelta); virtual; abstract;
+
+ procedure DoReadDataset(const DatasetName: string;
+ const Destination: IDADataset;
+ ApplySchema: boolean;
+ AppendMode: Boolean); virtual;
+
+ procedure DoReadDelta(const DeltaName: string;
+ const Destination: IDADelta); virtual; abstract;
+
+ function DoBeginWriteDataset( const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend; virtual; abstract;
+
+ function DoWriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aUnionSourceIndex: Integer = -1): Integer; virtual; abstract;
+ function DoEndWriteDataset(aDataForAppend: TDADataForAppend): Integer;virtual; abstract;
+
+
+ // Internal
+ procedure AddingDataset(const aDatasetName: string; InfoObject: TObject = nil);
+ procedure AddingDelta(const aDeltaName: string; InfoObject: TObject = nil);
+
+ property AdapterInitialization: TDAAdapterInitialization read fAdapterInitialization write SetAdapterInitialization;
+
+ property Data: TStream read fData;
+ property DatasetInfoObjects[Index: integer]: TObject read GetDatasetInfoObjects;
+ property DeltaInfoObjects[Index: integer]: TObject read GetDeltaInfoObjects;
+ procedure SetBufferSize(const Value: cardinal); virtual;
+ function Dataset_GetPK(const ASource: TDAFieldArray; var ADest: TDAFieldArray):string;
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+
+ // Initialization methods
+ procedure Initialize({var }Stream: TStream; Mode: TDAAdapterInitialization);
+ procedure Finalize;
+
+ // Writing methods
+ function WriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions;
+ MaxRows: integer;
+ ADynFieldNames: array of string): integer; overload;
+
+ function WriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions;
+ MaxRows: integer = AllRows): integer; overload;
+
+ function WriteDataset(Stream: TStream;
+ const Source: IDADataset;
+ Options: TDAWriteOptions;
+ MaxRows: integer = AllRows): integer; overload;
+
+ function WriteDataset(Stream: TStream;
+ const Schema: IDASchema;
+ const Connection: IDAConnection;
+ const DatasetName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ InitializeStream: boolean = TRUE;
+ FinalizeStream: boolean = TRUE;
+ MaxRows: integer = AllRows): integer; overload;
+
+ function WriteDataset(Stream: TStream;
+ const Schema: IDASchema;
+ const Connection: IDAConnection;
+ const DatasetName: string;
+ InitializeStream: boolean = TRUE;
+ FinalizeStream: boolean = TRUE;
+ MaxRows: integer = AllRows): integer; overload;
+
+ procedure WriteDelta(const Source: IDADataset); overload;
+ procedure WriteDelta(const Source: IDADelta); overload;
+ procedure WriteDelta(Stream: TStream; const Source: IDADataset); overload;
+
+ // Reading methods
+ procedure ReadDelta(const DeltaName: string; const Destination: IDADelta); overload;
+ function ReadDelta(const DeltaName: string): IDADelta; overload;
+ procedure ReadDelta(const Destination: IDADataset); overload;
+ procedure ReadDelta(Stream: TStream;
+ const Destination: IDADelta;
+ DeltaName: string = '';
+ ReadFromBeginning: boolean = TRUE); overload;
+
+ procedure ReadDataset(const DatasetName: string;
+ const Destination: IDADataset;
+ ApplySchema: boolean = FALSE;
+ LoadRecords: boolean = TRUE;
+ AppendMode: Boolean = False); overload;
+ procedure ReadDataset(Stream: TStream;
+ const Destination: IDADataset;
+ ApplySchema: boolean = FALSE;
+ DatasetName: string = '';
+ LoadRecords: boolean = TRUE;
+ ReadFromBeginning: boolean = TRUE;
+ AppendMode: Boolean = False); overload;
+
+ function BeginWriteDataset(const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend;
+ function WriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aUnionSourceIndex: Integer = -1): Integer;
+ function EndWriteDataset(aDataForAppend: TDADataForAppend): Integer;
+
+
+ // Misc
+ function FindDatasetIndex(const aName: string): integer;
+ function FindDeltaIndex(const aName: string): integer;
+
+ function GetDatasetIndex(const aName: string): integer;
+ function GetDeltaIndex(const aName: string): integer;
+
+ function GetTargetDataType: TRODataType; virtual; abstract;
+ function HasReducedDelta: Boolean; virtual;
+ property DatasetCount: integer read GetDatasetCount;
+ property DatasetNames[Index: integer]: string read GetDatasetNames;
+
+ property DeltaCount: integer read GetDeltaCount;
+ property DeltaNames[Index: integer]: string read GetDeltaNames;
+
+ property TargetDataType: TRODataType read GetTargetDataType;
+ property BufferSize: Cardinal read FBufferSize write SetBufferSize default DEFAULT_BUFFER_SIZE;
+ property SendReducedDelta: boolean read FSendReducedDelta write FSendReducedDelta default False;
+ published
+ property OnInitialized: TNotifyEvent read fOnInitialized write fOnInitialized;
+ property OnFinalized: TNotifyEvent read fOnFinalized write fOnFinalized;
+
+ property OnReadDataset: TDADatasetOperation read fOnReadDataset write fOnReadDataset;
+ property OnWriteDataset: TDADatasetOperation read fOnWriteDataset write fOnWriteDataset;
+
+ property OnReadDelta: TDADeltaOperation read fOnReadDelta write fOnReadDelta;
+ property OnWriteDelta: TDADeltaOperation read fOnWriteDelta write fOnWriteDelta;
+
+ property OnReadFieldValue: TDAReadWriteFieldValue read fOnReadFieldValue write fOnReadFieldValue;
+ property OnWriteFieldValue: TDAReadWriteFieldValue read fOnWriteFieldValue write fOnWriteFieldValue;
+ property OnWriteFieldValueEx: TDAReadWriteFieldValueEx read fOnWriteFieldValueEx write fOnWriteFieldValueEx;
+ property OnBeforeFieldValueSerialization: TDAReadWriteFieldValue read fOnBeforeFieldValueSerialization write fOnBeforeFieldValueSerialization;
+ property OnReadDeltaProgress: TDADataStreamerDeltaProgress read fOnReadDeltaProgress write fOnReadDeltaProgress;
+ property OnWriteDeltaProgress: TDADataStreamerDeltaProgress read fOnWriteDeltaProgress write fOnWriteDeltaProgress;
+ property OnReadDatasetProgress: TDADataStreamerReadDatasetProgress read fOnReadDatasetProgress write fOnReadDatasetProgress;
+ property OnWriteDatasetProgress: TDADataStreamerWriteDatasetProgress read fOnWriteDatasetProgress write fOnWriteDatasetProgress;
+ end;
+
+ TDADataAdapter = TDADataStreamer;
+
+implementation
+
+{ TDADataStreamer }
+
+constructor TDADataStreamer.Create(aOwner: TComponent);
+begin
+ inherited;
+ FBufferSize := DEFAULT_BUFFER_SIZE;
+ fDeltaNames := TStringList.Create;
+ { Doesn't work correctly because it messes up the order in which the server processes the deltas!!!!
+ Fixed the methods that add elements to this down.
+
+ fDeltaNames.Sorted := TRUE;
+ fDeltaNames.Duplicates := dupError;}
+
+ fDatasetNames := TStringList.Create;
+ { Fixed for consistency with the above
+
+ fDatasetNames.Sorted := TRUE;
+ fDatasetNames.Duplicates := dupError;}
+end;
+
+function TDADataStreamer.Dataset_GetPK(const ASource: TDAFieldArray; var ADest: TDAFieldArray): string;
+var
+ i: integer;
+ lcnt: integer;
+begin
+ Result := '';
+ lcnt := 0;
+ SetLength(ADest,Length(ASource));
+ for i := 0 to Length(ASource)-1 do
+ if ASource[i].InPrimaryKey then begin
+ Result := Result + ASource[i].Name+';';
+ ADest[lcnt]:=ASource[i];
+ inc(lcnt);
+ end;
+ if Length(Result) > 0 then begin
+ Result := Copy(Result, 1, Length(Result)-1);
+ end
+ else begin
+ // use AutoInc as PK
+ for i := 0 to Length(ASource)-1 do
+ if ASource[i].DataType in [datAutoInc, datLargeAutoInc] then begin
+ Result := ASource[i].Name;
+ ADest[lcnt]:=ASource[i];
+ inc(lcnt);
+ break;
+ end;
+ end;
+ SetLength(ADest, lcnt);
+end;
+
+destructor TDADataStreamer.Destroy;
+begin
+ ClearReferences;
+
+ FreeAndNIL(fDeltaNames);
+ FreeAndNIL(fDatasetNames);
+
+ inherited;
+end;
+
+function TDADataStreamer.GetDatasetCount: integer;
+begin
+ result := fDatasetNames.Count;
+end;
+
+function TDADataStreamer.GetDatasetNames(Index: integer): string;
+begin
+ result := fDatasetNames[Index];
+end;
+
+function TDADataStreamer.GetDeltaCount: integer;
+begin
+ result := fDeltaNames.Count;
+end;
+
+function TDADataStreamer.GetDeltaNames(Index: integer): string;
+begin
+ result := fDeltaNames[Index];
+end;
+
+procedure TDADataStreamer.ClearReferences;
+var
+ i: integer;
+begin
+ for i := 0 to (fDatasetNames.Count - 1) do
+ if (fDatasetNames.Objects[i] <> nil) then fDatasetNames.Objects[i].Free;
+
+ fDatasetNames.Clear;
+
+ for i := 0 to (fDeltaNames.Count - 1) do
+ if (fDeltaNames.Objects[i] <> nil) then fDeltaNames.Objects[i].Free;
+
+ fDeltaNames.Clear;
+end;
+
+procedure TDADataStreamer.Initialize({var }Stream: TStream; Mode: TDAAdapterInitialization);
+begin
+ if fBusy then
+ raise EDAException.Create('Cannot Initialize Streamer that is already in use.');
+
+ ClearReferences;
+ fAdapterInitialization := aiUnknown;
+ fData := nil;
+
+ if Mode = aiUnknown then raise Exception.Create('Invalid DataStreamer initialization parameter.');
+ if (Stream = nil) then raise Exception.Create('Stream parameter must assigned.');
+ if (Mode in AdapterReadModes) and (Stream.Size = 0) then raise Exception.Create('Stream may not me empty for Read mode.');
+
+ try
+ if (Mode = aiReadFromBeginning) then Stream.Position := 0;
+
+ // Sets internal references
+ fData := Stream;
+ AdapterInitialization := Mode;
+
+ fDatasetNames.Clear;
+
+ DoInitialize(Mode); // Calls descendant's implementation
+
+ if Assigned(fOnInitialized) then fOnInitialized(Self);
+
+ fBusy := true;
+ except
+ ClearReferences;
+ raise;
+ end;
+end;
+
+procedure TDADataStreamer.Finalize;
+begin
+ DoFinalize; // Calls descendant's implementation
+
+ if Assigned(fOnFinalized) then fOnFinalized(Self);
+ fBusy := false;
+end;
+
+procedure TDADataStreamer.CheckCanRead;
+begin
+ if not (AdapterInitialization in AdapterReadModes) then raise Exception.Create('Adapter was not initialized for this operation');
+end;
+
+procedure TDADataStreamer.CheckCanWrite;
+begin
+ if not (AdapterInitialization in AdapterWriteModes) then raise Exception.Create('Adapter was not initialized for this operation');
+end;
+
+procedure TDADataStreamer.ReadDelta(const DeltaName: string;
+ const Destination: IDADelta);
+begin
+ CheckCanRead;
+ Destination.EndChangesInAllTables;
+
+ if Assigned(fOnReadDelta) then fOnReadDelta(Self, DeltaName, Destination);
+
+ DoReadDelta(DeltaName, Destination); // Calls descendant's implementation
+end;
+
+function TDADataStreamer.WriteDataset(const Source: IDADataset; Options: TDAWriteOptions;
+ MaxRows: integer = AllRows): integer;
+begin
+ Result := WriteDataset(Source, Options, MaxRows, []);
+end;
+
+procedure TDADataStreamer.WriteDelta(const Source: IDADataset);
+var
+ deltaowner: IDADeltaOwner;
+ delta: IDADelta;
+begin
+ if not Supports(Source, IDADeltaOwner, deltaowner)
+ then raise Exception.Create('Source does not have a delta')
+ else delta := deltaowner.GetDelta;
+
+ CheckCanWrite;
+ delta.EndChangesInAllTables;
+ if Assigned(fOnWriteDelta) then fOnWriteDelta(Self, delta.LogicalName, delta);
+
+ DoWriteDelta(delta); // Calls descendant's implementation
+end;
+
+procedure TDADataStreamer.AddingDataset(const aDatasetName: string; InfoObject: TObject = nil);
+var i : integer;
+begin
+ i := fDatasetNames.IndexOf(aDatasetName);
+ if (i>=0)
+ then raise Exception.Create('A dataset called "'+aDatasetName+'" is already present')
+ else fDatasetNames.AddObject(aDatasetName, InfoObject)
+end;
+
+procedure TDADataStreamer.AddingDelta(const aDeltaName: string; InfoObject: TObject = nil);
+var i : integer;
+begin
+ i := fDeltaNames.IndexOf(aDeltaName);
+ if (i>=0)
+ then raise Exception.Create('A delta called "'+aDeltaName+'" is already present')
+ else fDeltaNames.AddObject(aDeltaName, InfoObject)
+end;
+
+procedure TDADataStreamer.Assign(Source: TPersistent);
+var
+ lSource: TDADataStreamer;
+begin
+ inherited;
+ if Source is TDADataStreamer then begin
+ lSource := TDADataStreamer(Source);
+
+ BufferSize := lSource.BufferSize;
+ SendReducedDelta := lSource.SendReducedDelta;
+
+ OnBeforeFieldValueSerialization := lSource.OnBeforeFieldValueSerialization;
+ OnFinalized := lSource.OnFinalized;
+ OnInitialized := lSource.OnInitialized;
+ OnReadDataset := lSource.OnReadDataset;
+ OnReadDatasetProgress := lSource.OnReadDatasetProgress;
+ OnReadDelta := lSource.OnReadDelta;
+ OnReadDeltaProgress := lSource.OnReadDeltaProgress;
+ OnReadFieldValue := lSource.OnReadFieldValue;
+ OnWriteDataset := lSource.OnWriteDataset;
+ OnWriteDatasetProgress := lSource.OnWriteDatasetProgress;
+ OnWriteDelta := lSource.OnWriteDelta;
+ OnWriteDeltaProgress := lSource.OnWriteDeltaProgress;
+ OnWriteFieldValue := lSource.OnWriteFieldValue;
+ OnWriteFieldValueEx := lSource.OnWriteFieldValueEx;
+ end;
+end;
+
+function TDADataStreamer.GetDatasetInfoObjects(Index: integer): TObject;
+begin
+ result := fDatasetNames.Objects[Index]
+end;
+
+function TDADataStreamer.GetDeltaInfoObjects(Index: integer): TObject;
+begin
+ result := fDeltaNames.Objects[Index]
+end;
+
+function TDADataStreamer.GetDatasetIndex(const aName: string): integer;
+begin
+ result := FindDatasetIndex(aName);
+ if (result = -1) then raise Exception.Create('Unknown dataset ' + aName);
+end;
+
+function TDADataStreamer.GetDeltaIndex(const aName: string): integer;
+begin
+ result := FindDeltaIndex(aName);
+ if (result = -1) then raise Exception.Create('Unknown delta ' + aName);
+end;
+
+procedure TDADataStreamer.ReadDataset(const DatasetName: string;
+ const Destination: IDADataset; ApplySchema: boolean = FALSE; LoadRecords: boolean = TRUE; AppendMode: Boolean = False);
+var
+ editable: IDAEditableDataset;
+ i:integer;
+ lAppendMode: Boolean;
+begin
+ CheckCanRead;
+
+ if Assigned(fOnReadDataset) then fOnReadDataset(Self, DatasetName, Destination);
+
+ editable := Destination as IDAEditableDataset;
+
+ Destination.DisableControls;
+ try
+ editable.DisableEventHandlers;
+ try
+ if ApplySchema then begin
+ if Destination.Active then Destination.Close;
+ DoReadDataset(DatasetName, Destination, TRUE,False);
+ end;
+
+ if LoadRecords then begin
+ lAppendMode:=False;
+ if AppendMode then begin
+ // at least 1 field with PK should be present.
+ for I := 0 to Destination.Fields.Count - 1 do
+ if (Destination.Fields[i].InPrimaryKey) or (Destination.Fields[i].DataType in [datAutoInc, datLargeAutoInc]) then begin
+ lAppendMode := True;
+ Break;
+ end;
+ end;
+ DoReadDataset(DatasetName, Destination, FALSE, lAppendMode);
+ end;
+ finally
+ editable.EnableEventHandlers;
+ end;
+ if LoadRecords then editable.Dataset.Resync([]);
+ finally
+ Destination.EnableControls;
+ end;
+end;
+
+procedure TDADataStreamer.ReadDataset(Stream: TStream;
+ const Destination: IDADataset;
+ ApplySchema: boolean = FALSE;
+ DatasetName: string = '';
+ LoadRecords: boolean = TRUE;
+ ReadFromBeginning: boolean = TRUE;
+ AppendMode: Boolean = False);
+var
+ nme: string;
+begin
+ if ReadFromBeginning then
+ Initialize(Stream, aiReadFromBeginning)
+ else
+ Initialize(Stream, aiRead);
+
+ try
+ if (DatasetName = '') then
+ nme := DatasetNames[0]
+ else
+ nme := DatasetName;
+
+ ReadDataset(nme, Destination, ApplySchema, LoadRecords,AppendMode);
+ finally
+ Finalize;
+ end;
+end;
+
+procedure TDADataStreamer.ReadDelta(Stream: TStream;
+ const Destination: IDADelta;
+ DeltaName: string = '';
+ ReadFromBeginning: boolean = TRUE);
+var
+ nme: string;
+begin
+ if ReadFromBeginning then
+ Initialize(Stream, aiReadFromBeginning)
+ else
+ Initialize(Stream, aiRead);
+
+ try
+ if (DeltaName <> '') then
+ nme := DeltaName
+ else
+ nme := DeltaNames[0];
+ ReadDelta(nme, Destination);
+ finally
+ Finalize;
+ end;
+end;
+
+function TDADataStreamer.WriteDataset(Stream: TStream;
+ const Source: IDADataset; Options: TDAWriteOptions;
+ MaxRows: integer): integer;
+begin
+ Initialize(Stream, aiWrite);
+ try
+ result := WriteDataset(Source, Options, MaxRows);
+ finally
+ Finalize;
+ end;
+end;
+
+procedure TDADataStreamer.WriteDelta(Stream: TStream;
+ const Source: IDADataset);
+begin
+ Initialize(Stream, aiWrite);
+ try
+ WriteDelta(Source);
+ finally
+ Finalize;
+ end;
+end;
+
+procedure TDADataStreamer.WriteDelta(const Source: IDADelta);
+begin
+ DoWriteDelta(Source);
+end;
+
+procedure TDADataStreamer.ReadDelta(const Destination: IDADataset);
+var
+ deltaowner: IDADeltaOwner;
+ delta: IDADelta;
+begin
+ if not Supports(Destination, IDADeltaOwner, deltaowner)
+ then raise Exception.Create('Destination does not have a delta')
+ else delta := deltaowner.GetDelta;
+
+ ReadDelta(delta.LogicalName, delta);
+end;
+
+function TDADataStreamer.WriteDataset(Stream: TStream;
+ const Schema: IDASchema; const Connection: IDAConnection;
+ const DatasetName: string; const ParamNames: array of string;
+ const ParamValues: array of Variant; InitializeStream: boolean = TRUE;
+ FinalizeStream: boolean = TRUE; MaxRows: integer = AllRows): integer;
+var
+ ds: IDADataset;
+begin
+ if InitializeStream then Initialize(Stream, aiWrite);
+ try
+ ds := Schema.NewDataset(Connection, DatasetName, ParamNames, ParamValues, TRUE);
+ result := WriteDataset(ds, [woRows], MaxRows);
+ finally
+ if FinalizeStream then Finalize;
+ end;
+end;
+
+function TDADataStreamer.WriteDataset(Stream: TStream;
+ const Schema: IDASchema; const Connection: IDAConnection;
+ const DatasetName: string; InitializeStream, FinalizeStream: boolean;
+ MaxRows: integer): integer;
+begin
+ result := WriteDataset(Stream, Schema, Connection, DatasetName, [], [],
+ InitializeStream, FinalizeStream, MaxRows);
+end;
+
+procedure TDADataStreamer.SetAdapterInitialization(
+ const Value: TDAAdapterInitialization);
+begin
+ fAdapterInitialization := Value;
+end;
+
+function TDADataStreamer.ReadDelta(const DeltaName: string): IDADelta;
+begin
+ result := NewDelta(DeltaName);
+ ReadDelta(DeltaName, Result);
+end;
+
+function TDADataStreamer.FindDatasetIndex(const aName: string): integer;
+begin
+ result := fDatasetNames.IndexOf(aName);
+end;
+
+function TDADataStreamer.FindDeltaIndex(const aName: string): integer;
+begin
+ result := fDeltaNames.IndexOf(aName);
+end;
+
+procedure TDADataStreamer.DoReadDataset(const DatasetName: string;
+ const Destination: IDADataset; ApplySchema: boolean; AppendMode: Boolean);
+begin
+ if Destination.Active and ApplySchema then raise Exception.Create('Cannot apply a schema if the destination is active');
+end;
+
+procedure TDADataStreamer.SetBufferSize(const Value: cardinal);
+begin
+ FBufferSize := Value;
+end;
+
+function TDADataStreamer.HasReducedDelta: Boolean;
+begin
+ Result:=False;
+end;
+
+function TDADataStreamer.DoWriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions; MaxRows: integer): integer;
+begin
+ Result:= DoWriteDataset(Source, Options, MaxRows, []);
+end;
+
+function TDADataStreamer.WriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): integer;
+var
+ ldeltaOwner: IDADeltaOwner;
+begin
+ CheckCanWrite;
+ if Supports(Source, IDADeltaOwner, ldeltaOwner) then begin
+ try
+ ldeltaOwner.GetDelta.EndChangesInAllTables;
+ except
+ end;
+ ldeltaOwner := nil;
+ end;
+
+ if Assigned(fOnWriteDataset) then fOnWriteDataset(Self, Source.LogicalName, Source);
+
+ result := DoWriteDataset(Source, Options, MaxRows, ADynFieldNames); // Calls descendant's implementation
+end;
+
+function TDADataStreamer.BeginWriteDataset(const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend;
+begin
+ result := DoBeginWriteDataset(Source, Schema, Options, MaxRows, ADynFieldNames); // Calls descendant's implementation
+end;
+
+function TDADataStreamer.WriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aUnionSourceIndex: Integer = -1): Integer;
+begin
+ CheckCanWrite;
+ if Assigned(fOnWriteDataset) then fOnWriteDataset(Self, Source.LogicalName, Source);
+
+ result := DoWriteDatasetData(Source, aDataForAppend, aUnionSourceIndex); // Calls descendant's implementation
+end;
+
+function TDADataStreamer.EndWriteDataset(aDataForAppend: TDADataForAppend): Integer;
+begin
+ result := DoEndWriteDataset(aDataForAppend); // Calls descendant's implementation
+end;
+
+
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataTable.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataTable.pas
new file mode 100644
index 0000000..cd00d3a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataTable.pas
@@ -0,0 +1,5524 @@
+unit uDADataTable;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS}ActiveX,{$ENDIF}
+ SysUtils, Classes, Contnrs, DB,
+ uROClientIntf, uROClient, uROClasses, uRODynamicRequest,
+ uDAInterfaces, uDAClasses, uDADelta, uDAExpressionEvaluator,
+ uDAEngine, uDADataStreamer, uDAScriptingProvider, DataAbstract3_Intf;
+
+const
+ RecIDFieldName = 'RecID'; // Do not change!
+ AllChanges = [ctInsert, ctUpdate, ctDelete];
+
+type
+ TDADetailOption = (dtCascadeOpenClose,
+ dtCascadeApplyUpdates,
+ dtAutoFetch,
+ dtCascadeDelete,
+ dtCascadeUpdate,
+ dtDisableLogOfCascadeDeletes,
+ dtDisableLogOfCascadeUpdates,
+ dtIncludeInAllInOneFetch);
+ TDADetailOptions = set of TDADetailOption;
+
+ TDAMasterOption = (moCascadeOpenClose,
+ moCascadeApplyUpdates,
+ moCascadeDelete,
+ moCascadeUpdate,
+ moDisableLogOfCascadeDeletes,
+ moDisableLogOfCascadeUpdates,
+ moAllInOneFetch);
+
+ TDAMasterOptions = set of TDAMasterOption;
+
+const
+ DetailOptions_Default = [dtCascadeOpenClose,
+ dtCascadeApplyUpdates,
+ dtAutoFetch,
+ dtDisableLogOfCascadeDeletes,
+ dtIncludeInAllInOneFetch // Done to avoid breaking existing apps
+ ];
+
+ MasterOptions_Default = [moCascadeOpenClose,
+ moCascadeApplyUpdates,
+ moCascadeDelete];
+
+ DetailOptions_unused = [dtCascadeDelete,
+ dtCascadeUpdate,
+ dtDisableLogOfCascadeUpdates];
+
+ MasterOptions_unused = [moCascadeUpdate,
+ moDisableLogOfCascadeDeletes,
+ moDisableLogOfCascadeUpdates];
+type
+ //ToDo: remove and replace these three with TRO(Dynamic)Request*
+ TDARemoteRequest = TRODynamicRequest;
+ TDARemoteRequestParam = TRORequestParam;
+ TDARemoteRequestParams = TRORequestParamCollection;
+
+ { Other types }
+ float = double;
+ datetime = TDateTime;
+
+ TDADataTable = class;
+ TDatasetClass = class of TDataset;
+ TDADataTableRules = class;
+
+ TDADataTableNotifyEvent = procedure(DataTable: TDADataTable) of object;
+ TDADataTableFilterEvent = procedure(DataTable: TDADataTable; var Accept: Boolean) of object;
+ TDADataTableErrorEvent = procedure(DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction) of object;
+ TDADataTableDynamicMethodEvent = procedure(DataTable: TDADataTable; const aMessage: IROMessage) of object;
+ TDADataTableRemoteRequestEvent = procedure(DataTable: TDADataTable; Request: TDARemoteRequest) of object;
+ TDADataTableDataChangeEvent = procedure(DataTable: TDADataTable; Field: TDAField) of object;
+ TDADataRequestStreamEvent = procedure(DataTable: TDADataTable; Stream: TStream) of object;
+
+ //TDADelta = class;
+
+ TDAApplyUpdatesError = procedure(DataTable: TDADataTable; const Delta: IDADelta; var Ignore: boolean) of object;
+ TDAAfterApplyUpdatesEvent = procedure(DataTable: TDADataTable; const Delta: IDADelta) of object;
+ TDABeforeApplyUpdatesEvent = procedure(DataTable: TDADataTable; const Delta: IDADelta) of object;
+
+ TDAStreamingOption = (soIgnoreStreamSchema, soDisableEventsWhileStreaming, soDisableFiltering);
+ TDAStreamingOptions = set of TDAStreamingOption;
+
+ TDARemoteUpdatesOption = (ruoOnPost);
+ TDARemoteUpdatesOptions = set of TDARemoteUpdatesOption;
+
+ TDACustomDataAdapter = class(TROComponent)
+ private
+ protected
+ { backward compatibility: to provide access to these in the legacy events }
+ function Get_GetSchemaCall: TDARemoteRequest; virtual;
+ function Get_GetDataCall: TDARemoteRequest; virtual;
+ function Get_UpdateDataCall: TDARemoteRequest; virtual;
+ function Get_GetScriptsCall: TDARemoteRequest; virtual;
+ function GetDataStreamer: TDADataStreamer; virtual;abstract;
+ procedure SetDataStreamer(const Value: TDADataStreamer);virtual;abstract;
+ public
+ function ApplyUpdates(aTables: array of TDADataTable; aRefetchAll: boolean = false): boolean; virtual; abstract;
+ procedure Fill(aTables: array of TDADataTable; aSaveCursor: boolean; aIncludeSchema: boolean; aAppendMode:Boolean = False); overload; virtual; abstract;
+ procedure FillSchema(aTables: array of TDADataTable; aPreserveLookupFields: boolean = false; areserveClientCalcFields : boolean = false); virtual; abstract;
+ procedure FillScripts(aTables: array of TDADataTable); virtual; abstract;
+ property DataStreamer: TDADataStreamer read GetDataStreamer write SetDataStreamer;
+ end;
+
+
+ { IDADataTableDataset }
+ IDADataTableDataset = interface
+ ['{3BADA4F8-BA32-411C-A7CD-DEBD10A4AF06}']
+ function GetDataTable: TDADataTable;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ { IDARangeController }
+ IDARangeController = interface
+ ['{5A182854-B824-496F-80C2-6F8064003E13}']
+ procedure ApplyRange; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CancelRange; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRange(const StartValues, EndValues: array of const); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure EditRangeEnd; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure EditRangeStart; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRangeEnd; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRangeStart; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ { IDANativeDatasetStreaming }
+ TDANativeDataFormat = (ndfBinary, ndfXML);
+ IDANativeDatasetStreaming = interface
+ ['{00B37B20-23DA-49A5-BB5D-B96E50C210F4}']
+ procedure NativeSaveToFile(const aFileName : string; DataFormat : TDANativeDataFormat = ndfBinary);
+ procedure NativeLoadFromFile(const aFileName : string);
+ procedure NativeSaveToStream(aStream : TStream; DataFormat : TDANativeDataFormat = ndfBinary);
+ procedure NativeLoadFromStream(aStream : TStream);
+ end;
+
+
+ { TDADataSource }
+ TDADataSource = class(TDABaseDataSource)
+ private
+ fDataTable: TDADataTable;
+
+ function GetDataset: TDataset;
+ procedure SetDataTable(const Value: TDADataTable);
+ procedure SetDataset(const Value: TDataset);
+ function GetOpening: boolean;
+ function GetActive: boolean;
+
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+
+ property Dataset: TDataset read GetDataset write SetDataset; // hide base class property
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+
+ property Opening: boolean read GetOpening;
+ property Active: boolean read GetActive;
+ published
+ property DataTable: TDADataTable read fDataTable write SetDataTable;
+ end;
+
+ { TDADataTable }
+ TDASortDirection = (sdAscending, sdDescending);
+ TDAMasterMappingMode = (mmDataRequest, mmParams, mmWhere);
+
+ TDASortDirectionArray = array of TDASortDirection;
+
+ IDADataTableScriptingProvider = interface(IDAScriptingProvider)
+ ['{E16B7359-C733-4F09-96A8-10527CFABB6D}']
+ procedure RunDataTableScript(aDataTable: TDADataTable; const aScript: string; const aMethod: string; aLanguage:TROSEScriptLanguage);
+ end;
+
+ { IDAClonedCursorsSupport }
+ IDAClonedCursorsSupport = interface(IDASimpleClonedCursorsSupport)
+ ['{A43A70A2-7438-4C21-B2E2-A5212082EFD0}']
+ function GetCloneSource : TDADataTable; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CloneCursor(Source : TDADataTable); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetUsingClonedCursor : boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ property CloneSource : TDADataTable read GetCloneSource;
+ property UsingClonedCursor : boolean read GetUsingClonedCursor;
+ end;
+
+ TAutoIncArray = array of Int64;
+ TDALocalUpdateDataTransactionEvent = procedure(Sender: TObject; var aUseDefaultTransactionLogic: Boolean) of object;
+
+ TDAMasterKeyID = PByteArray;
+
+ TDAMasterKeyList = class(TList)
+ private
+ fNeedSort: Boolean;
+ procedure SortList;
+ public
+ procedure Clear; override;
+ procedure Add(aKey: TDAMasterKeyID);
+ function IndexOf(aKey: TDAMasterKeyID): integer;
+ end;
+
+ {$WARN SYMBOL_DEPRECATED OFF}
+ TDADataTable = class(TScriptableComponent, {$IFDEF MSWINDOWS}ISupportErrorInfo,{$ENDIF} IDADataTable, IDASQLCommand, IDADataset, IDAEditableDataset, IDADeltaOwner, IDADataReader, IDADatasetEx,IDAClonedCursorsSupport)
+ private
+ fCurrRecId: integer;
+
+ fMasterLink: TMasterDataLink;
+
+ fDelta: IDADelta;
+ fWhere: TDAWhere;
+
+ fRecIDField: TIntegerField;
+
+ fStreamedActive,
+ fRefreshing,
+ fOpening: boolean;
+
+ fDataset: TDataset;
+
+ fFields: TDAFieldCollection;
+
+ fAfterEdit: TDADataTableNotifyEvent;
+ fAfterInsert: TDADataTableNotifyEvent;
+ fAfterDelete: TDADataTableNotifyEvent;
+ fBeforeScroll: TDADataTableNotifyEvent;
+ fAfterClose: TDADataTableNotifyEvent;
+ fBeforePost: TDADataTableNotifyEvent;
+ fAfterScroll: TDADataTableNotifyEvent;
+ fBeforeCancel: TDADataTableNotifyEvent;
+ fBeforeRefresh: TDADataTableNotifyEvent;
+ fBeforeOpen: TDADataTableNotifyEvent;
+ fAfterRefresh: TDADataTableNotifyEvent;
+ fAfterOpen: TDADataTableNotifyEvent;
+ fBeforeEdit: TDADataTableNotifyEvent;
+ fBeforeClose: TDADataTableNotifyEvent;
+ fBeforeDelete: TDADataTableNotifyEvent;
+ fAfterPost: TDADataTableNotifyEvent;
+ fOnCalcFields: TDADataTableNotifyEvent;
+ fOnNewRecord: TDADataTableNotifyEvent;
+ fAfterCancel: TDADataTableNotifyEvent;
+ fBeforeInsert: TDADataTableNotifyEvent;
+ fOnFilterRecord: TDADataTableFilterEvent;
+ fOnEditError: TDADataTableErrorEvent;
+ fOnDeleteError: TDADataTableErrorEvent;
+ fOnPostError: TDADataTableErrorEvent;
+ fBeforeFieldChange: TDADataTableDataChangeEvent;
+ fAfterFieldChange: TDADataTableDataChangeEvent;
+ fLogChanges: boolean;
+
+ fRemoteFetchEnabled: boolean;
+ fSortDirections: TDASortDirectionArray;
+ fSortFieldNames: TStringArray;
+ fParams: TDAParamCollection;
+
+ fFetchedMasters: TDAMasterKeyList;
+
+ fMasterParamsMappings,
+ fMasterRequestMappings: TStringList;
+ fDynamicWhere: TDAWhereBuilder;
+
+ fDetailOptions: TDADetailOptions;
+ fMasterOptions: TDAMasterOptions;
+ fLogicalName: string;
+ fClosing: boolean;
+ fFetching: boolean;
+ fStreaming: boolean;
+ fOnAfterSchemaCall: TDADataTableRemoteRequestEvent;
+ fOnAfterDataRequestCall: TDADataTableRemoteRequestEvent;
+ fOnBeforeSchemaCall: TDADataTableRemoteRequestEvent;
+ fOnBeforeDataRequestCall: TDADataTableRemoteRequestEvent;
+ fOnBeforeDataUpdateCall: TDADataTableRemoteRequestEvent;
+ fOnAfterDataUpdateCall: TDADataTableRemoteRequestEvent;
+ //fOnApplyUpdatesError: TDAApplyUpdatesError;
+ fOnReceiveDataStream: TDADataRequestStreamEvent;
+ fStreamingOptions: TDAStreamingOptions;
+ fRemoteUpdateOptions: TDARemoteUpdatesOptions;
+ fLocalSchema: TDASchema;
+ fLocalConnection: string;
+
+ fBusinessRulesID: string;
+ fBusinessRules: TDADataTableRules;
+ fFieldRules: TObjectList;
+
+ fAutoIncs : TAutoIncArray;
+ fOnAfterApplyUpdates: TDADataTableNotifyEvent;
+ fOnBeforeApplyUpdates: TDABeforeApplyUpdatesEvent;
+ fMasterMappingMode: TDAMasterMappingMode;
+ fMaxRecords: integer;
+ fOnBeforeMergeDelta: TDADataTableNotifyEvent;
+ fOnAfterMergeDelta: TDADataTableNotifyEvent;
+ fStoreActive: boolean;
+ fScriptCode: TStrings;
+ fOnBeforeScriptCall: TDADataTableRemoteRequestEvent;
+ fOnAfterScriptCall: TDADataTableRemoteRequestEvent;
+
+ fOpenTick: cardinal;
+ fAfterOpenIDataset: TDAAfterOpenDatasetEvent;
+ fBeforeOpenIDataset: TDABeforeOpenDatasetEvent;
+
+ fRemoteDataAdapter: TDACustomDataAdapter;
+ fLocalDataStreamer: TDADataStreamer;
+ fCustomAttributes: TStrings;
+ fExpressionEvaluator: TDAStdExpressionEvaluator;
+ fHasReducedDelta: Boolean;
+ fOnLocalUpdateDataBeginTransaction: TDALocalUpdateDataTransactionEvent;
+ fOnLocalUpdateDataRollBackTransaction: TDALocalUpdateDataTransactionEvent;
+ fOnLocalUpdateDataCommitTransaction: TDALocalUpdateDataTransactionEvent;
+ FLocConnection: IDAConnection;
+ fOldMasterKey: TDAMasterKeyID;
+ procedure SetLocalDataStreamer(const Value: TDADataStreamer);
+ procedure SetRemoteDataAdapter(const Value: TDACustomDataAdapter);
+
+ procedure SetLogChanges(const Value: boolean);
+ function GetDataset: TDataset; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFields: TDAFieldCollection; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetFields(const Value: TDAFieldCollection);
+ function GetActive: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetActive(Value: boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetLogChanges: boolean;
+ procedure SetParams(const Value: TDAParamCollection);
+ function GetEditing: boolean;
+ function GetMasterRequestMappings: TStrings;
+ procedure SetMasterRequestMappings(const Value: TStrings);
+
+ procedure TempSetRowRecIDValue(Sender: TDataset);
+
+ procedure SetLocalSchema(const Value: TDASchema);
+ procedure LoadFromLocalSchema(AppendMode: Boolean = False);
+ procedure LoadLocalSchema(aPreserveLookupFields: Boolean; aPreserveClientCalcFields: Boolean);
+
+ procedure SetBusinessRulesID(const Value: string);
+ function GetHasDelta: boolean;
+ function GetHasDeltaRecursive: boolean;
+ function GetRecNo: integer;
+ procedure SetRecNo(const Value: integer);
+
+ { published property accessors cannot be safecall, so we need wrappers: }
+ function GetFieldsProperty: TDAFieldCollection;
+ function GetActiveProperty: boolean;
+ procedure SetActiveProperty(const Value: boolean);
+ function GetParamsProperty: TDAParamCollection;
+ function GetMasterParamsMappings: TStrings;
+ procedure SetMasterParamsMappings(const Value: TStrings);
+
+ procedure PackAllInOneFetchInfoArray(aDataTable : TDADataTable; OutArray: TDADatasetRequestInfoArray);
+ procedure OnWhereChange(Sender: TObject);
+ procedure SetScriptCode(const Value: TStrings);
+ function GetDeltaInitialized: boolean;
+ procedure SetCustomAttributes(const Value: TStrings);
+ function Local_ApplyUpdates(RefetchAll: boolean = FALSE): boolean;
+ procedure InternalCancelUpdateChange(Change: TDADeltaChange);
+ procedure ExpessionEvaluatorGetValue(Sender: TDAExpressionEvaluator; const aIdentifier: string; out aValue: Variant);
+ procedure DoCascadeRemoteAllInOneFetch(aStreamer: TDADataStreamer);
+ function TriggerTransactionEvent(aEvent: TDALocalUpdateDataTransactionEvent): boolean;
+ procedure SetDetailOptions(const Value: TDADetailOptions);
+ procedure SetMasterOptions(const Value: TDAMasterOptions);
+ function IsNeedToFetch(AKey: TDAMasterKeyID):Boolean;
+ function GenerateKeyfromMasterRecID: TDAMasterKeyID;
+ procedure AddMasterKey(aKey: TDAMasterKeyID);
+ procedure ReplaceMasterKey(aOldKey, aNewKey: TDAMasterKeyID);
+ procedure SetOldMasterKey(aKey: TDAMasterKeyID);
+ protected
+ function intDATypeToVCLType(aDAType: TDADataType): TFieldType;virtual;
+ function GetRangeState: Boolean; virtual;
+ function CreateAutoIncArray: TAutoIncArray;
+ function GetAutoIncs: TAutoIncArray;
+ procedure SetAutoIncs(const Value: TAutoIncArray);
+
+ property AutoIncs: TAutoIncArray read GetAutoIncs write SetAutoIncs;
+
+ function GetCurrRecId: integer;
+ procedure SetCurrRecId(const Value: integer);
+
+ procedure Loaded; override;
+
+ // To override
+ function GetMasterDataLink: TMasterDataLink;virtual; abstract;
+ function GetDatasetClass: TDatasetClass; virtual; abstract;
+ procedure CreateInternalFields(aDataset: TDataset; someFieldDefinitions: TDAFieldCollection); virtual;
+ procedure DoRefresh(aDataset: TDataset);
+ procedure DoSort(const FieldNames: array of string; const Directions: array of TDASortDirection); virtual; abstract;
+
+ procedure SetMasterSource(const Value: TDADataSource); virtual;
+ function GetMasterSource: TDADataSource; virtual; abstract;
+ procedure SetDetailsFields(const Value: string); virtual; abstract;
+ procedure SetMasterFields(const Value: string); virtual;
+ function GetDetailFields: string; virtual; abstract;
+ function GetMasterFields: string; virtual; abstract;
+
+ function GetFilter: string; virtual; abstract;
+ function GetFiltered: boolean; virtual; abstract;
+ procedure SetFilter(const Value: string); virtual; abstract;
+ procedure SetFiltered(const Value: boolean); virtual; abstract;
+
+ function GetReadOnly: boolean; virtual;
+ procedure SetReadOnly(const Value: boolean); virtual;
+
+ procedure AttachEventHooks(aDataset: TDataset); virtual;
+ procedure DetachEventHooks(aDataset: TDataset); virtual;
+
+ // Internal
+ procedure DoBeforeOpenDataset; virtual;
+ procedure DoBeforeCloseDataset; virtual;
+ procedure DoAfterOpenDataset; virtual;
+ procedure DoAfterCloseDataset; virtual;
+ procedure DoOpen(IgnoreAutoFetchSettings: Boolean = False); virtual;
+
+ // Internal TDataset event handler hooks
+ procedure InternalAfterInsert(Sender: TDataset); dynamic;
+ procedure InternalAfterEdit(Sender: TDataset); dynamic;
+ procedure InternalBeforePost(Sender: TDataset); dynamic;
+ procedure InternalBeforeCancel(Sender: TDataset); dynamic;
+ procedure InternalAfterDelete(Sender: TDataset); dynamic;
+ procedure InternalBeforeScroll(Sender: TDataset); dynamic;
+ procedure InternalAfterScroll(Sender: TDataset); dynamic;
+ procedure InternalBeforeRefresh(Sender: TDataset); dynamic;
+ procedure InternalAfterRefresh(Sender: TDataset); dynamic;
+ procedure InternalOnCalcFields(Sender: TDataset); dynamic;
+ procedure InternalOnNewRecord(Sender: TDataset); dynamic;
+ procedure InternalAfterCancel(Sender: TDataset); dynamic;
+ procedure InternalBeforeInsert(Sender: TDataset); dynamic;
+ procedure InternalBeforeDelete(Sender: TDataset); dynamic;
+ procedure InternalBeforeEdit(Sender: TDataset); dynamic;
+ procedure InternalAfterPost(Sender: TDataset); dynamic;
+ procedure InternalBeforeFieldUpdate(Sender: TDACustomField);
+ procedure InternalAfterFieldUpdate(Sender: TDACustomField);
+
+ procedure InternalOnFilterRecord(Dataset: TDataset; var Accept: Boolean); dynamic;
+
+ procedure InternalOnDeleteError(DataSet: TDataSet; Error: EDatabaseError; var Action: TDataAction); dynamic;
+ procedure InternalOnEditError(DataSet: TDataSet; Error: EDatabaseError; var Action: TDataAction); dynamic;
+ procedure InternalOnPostError(DataSet: TDataSet; Error: EDatabaseError; var Action: TDataAction); dynamic;
+
+ // IDASQLCommand
+ function GetParams: TDAParamCollection; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure RefreshParams; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Execute: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetText: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetText(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDADeltaOwner
+ function GetDelta: IDADelta; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDADataReader
+ function IDADataReader.First = DataReaderFirst;
+ function IDADataReader.Next = DataReaderNext;
+ function DataReaderFirst: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DataReaderNext: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetFieldNames(Index: integer): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldIndexes(const aName: string): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsBoolean(Index: integer): boolean; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsCurrency(Index: integer): currency; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsDateTime(Index: integer): TDateTime; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsFloat(Index: integer): double; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsInteger(Index: integer): integer; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsString(Index: integer): string; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsVariant(Index: integer): variant; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsBoolean(const FieldName: string): boolean; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsCurrency(const FieldName: string): currency; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsDateTime(const FieldName: string): TDateTime; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsFloat(const FieldName: string): double; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsInteger(const FieldName: string): integer; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsString(const FieldName: string): string; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsVariant(const FieldName: string): variant; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDADataset
+ function GetIsEmpty: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetRecordCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetBOF: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetEOF: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetSQL: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetSQL(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function SQLContainsDynamicWhere: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldValues(Index: integer): Variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetNames(Index: integer): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetWhere: TDAWhere; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDynamicWhere: TDAWhereBuilder; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetDynamicWhere(const Value: TDAWhereBuilder); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetPrepared: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetPrepared(Value: boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetState: TDataSetState; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetLogicalName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetLogicalName(aName : string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+
+ procedure OnMasterChange(Sender: TObject); virtual;
+ procedure OnMasterDisable(Sender: TObject); virtual;
+
+ function GetOnAfterOpen: TDAAfterOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeOpen: TDABeforeOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterOpen(const Value: TDAAfterOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeOpen(const Value: TDABeforeOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetOnAfterExecute: TDAAfterExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeExecute: TDABeforeExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterExecute(const Value: TDAAfterExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeExecute(const Value: TDABeforeExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnExecuteError: TDAExecuteCommandErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnExecuteError(const Value: TDAExecuteCommandErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnOpenError: TDAOpenDatasetErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnOpenError(const Value: TDAOpenDatasetErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure NotifyFieldsClear;
+
+ // IInterface
+ function QueryInterface(const IID: TGUID; out Obj): HResult; override;
+
+ property MasterLink: TMasterDataLink read fMasterLink;
+ function InternalApplyUpdates(RefetchAll: boolean = FALSE): boolean;
+ {$IFDEF MSWINDOWS}
+ protected
+ function InterfaceSupportsErrorInfo(const iid: TGUID): HResult; stdcall;
+
+ public
+ function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult; override;
+ {$ENDIF}
+
+ // begin IDAClonedCursorsSupport
+ protected
+ fOldValues : array of Variant;
+ fCloneSource : TDADataTable;
+ function GetSimpleCloneSource : TObject;
+ procedure CloneCursor(Source : TDADataTable); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ function GetUsingClonedCursor : boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetCloneSource : TDADataTable; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ property CloneSource : TDADataTable read GetCloneSource;
+ property UsingClonedCursor : boolean read GetUsingClonedCursor;
+ // end IDAClonedCursorsSupport
+
+ public { for Delta }
+ property RecIDField : TIntegerField read fRecIDField write fRecIDField;
+ function GetRowRecIDValue: integer;
+
+
+ procedure CallScript(const aEvent: string);
+
+ procedure InitializeDataTable;
+ procedure DoCascadeOperation(aStreamer: TDADataStreamer; aOption: TDAMasterOption);
+ procedure WriteDeltaToStream(aStreamer: TDADataStreamer);
+ procedure ReadDeltaFromStream(aStreamer: TDADataStreamer; aFailedDeltas:TList);overload;
+ procedure ReadDeltaFromStream(aStreamer: TDADataStreamer); overload;
+
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure EnableConstraints; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+ procedure DisableConstraints; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+
+ procedure LoadFromRemoteSource(BookmarkPosition: boolean = FALSE); virtual;
+ procedure FetchMastersDetails(aMasterTable : TDADataTable = NIL; aRequestMappings : TStrings = NIL; IgnoreAutoFetchSettings : Boolean = False); dynamic;
+ procedure LoadSchema(PreserveLookupFields : boolean = FALSE; PreserveClientCalcFields : boolean = FALSE);
+ procedure LoadScript(aDatasetName : string = '');
+
+ function ApplyUpdates(RefetchAll: boolean = FALSE): boolean; dynamic;
+ procedure CancelUpdates(IncludeDetails : boolean = TRUE);
+ procedure CancelUpdateChange(Change: TDADeltaChange;IncludeDetails : boolean = TRUE);
+
+ procedure Sort(const FieldNames: array of string; const Directions: array of TDASortDirection);
+ procedure UnSort;
+
+ procedure ClearFields;
+ procedure ClearRows(const aClearDelta: Boolean = False);
+
+ procedure CloneSelectedRecord(Source: TDADataTable; DoPost: boolean = TRUE); overload;
+ procedure CloneSelectedRecord(const Source: IDADataset; DoPost: boolean = TRUE); overload;
+
+ procedure SaveToStream(aStream: TStream);
+ procedure LoadFromStream(aStream: TStream);
+ procedure SaveToFile(const aFileName: string);
+ procedure LoadFromFile(const aFileName: string);
+
+ procedure MergeDelta; virtual;
+
+ // Master detail
+ function GetDetailDataTables: TList;
+ function GetDetailTablesforApplyUpdate(aRecursive: boolean = True): TList;
+ procedure GetDetailTablesforAllinOneFetch(aRemote, aLocal:TList; aRecursive: boolean);
+ function GetMasterDataTable : TDADataTable;
+
+ // Methods
+ procedure Open; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Close; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure EnableControls; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableControls; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function ControlsDisabled: Boolean;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Next; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Edit; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Insert; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Post; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Cancel; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Append; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Delete; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Prior; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure First; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Last; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Refresh; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function FieldByName(const aName: string): TDAField; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function FindField(const aName: string): TDAField; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function ParamByName(const aName: string): TDAParam; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetBookmark: TBookmark; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GotoBookmark(Bookmark: TBookmark); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure FreeBookmark(Bookmark: TBookmark); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function BookmarkValid(Bookmark: TBookmark): Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure EnableEventHandlers; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableEventHandlers; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure InternalSetFetching(aFetching: boolean);
+
+ procedure AddRecord(const FieldNames : array of string; const FieldValues : array of Variant); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetCurrentRecIdValue: integer;
+ procedure SetCurrentRecIdValue(Value: integer);
+
+ // Properties
+ property CurrRecId: integer read GetCurrRecId write SetCurrRecId;
+ property RecIDValue: integer read GetRowRecIDValue;
+ property Delta: IDADelta read GetDelta write fDelta;
+ property RecNo : integer read GetRecNo write SetRecNo;
+
+ property BOF: boolean read GetBOF;
+ property EOF: boolean read GetEOF;
+ property RecordCount: integer read GetRecordCount;
+ property FieldCount: integer read GetFieldCount;
+ property FieldValues[Index: integer]: Variant read GetFieldValues;
+ property Names[Index: integer]: string read GetNames;
+
+ property SortFieldNames: TStringArray read fSortFieldNames;
+ property SortDirections: TDASortDirectionArray read fSortDirections;
+
+ property Opening: boolean read fOpening;
+ property Closing: boolean read fClosing;
+ property Editing: boolean read GetEditing;
+ property Fetching: boolean read fFetching;
+
+ property State: TDataSetState read GetState;
+ property Dataset: TDataset read GetDataset;
+
+ property IsEmpty : boolean read GetIsEmpty;
+
+ property BusinessEventsObj: TDADataTableRules read fBusinessRules;
+
+ property HasDelta: boolean read GetHasDelta;
+ property HasDeltaRecursive: boolean read GetHasDeltaRecursive;
+ property DeltaInitialized: boolean read GetDeltaInitialized;
+
+ property Where : TDAWhere read GetWhere;
+ property DynamicWhere: TDAWhereBuilder read GetDynamicWhere write SetDynamicWhere;
+ procedure CheckProperties(ACheckRemoteFetching: Boolean=False; ACheckOnlyForLocalSchema: Boolean = False); virtual;
+ property HasReducedDelta: boolean read fHasReducedDelta;
+ property LocalDAConnection: IDAConnection read FLocConnection;
+ procedure RefreshFromServer;
+ // checks if the current record isn't locked by other table
+ function IsCanEditCurrentRow: Boolean;
+ published
+ property Active: boolean read GetActiveProperty write SetActiveProperty stored fStoreActive default false;
+ property StoreActive: boolean read fStoreActive write fStoreActive default false;
+
+ property RemoteUpdatesOptions: TDARemoteUpdatesOptions read fRemoteUpdateOptions write fRemoteUpdateOptions;
+
+ property MaxRecords : integer read fMaxRecords write fMaxRecords default -1;
+
+ property Fields: TDAFieldCollection read GetFieldsProperty write SetFields;
+ property Params: TDAParamCollection read GetParamsProperty write SetParams;
+
+ property MasterMappingMode : TDAMasterMappingMode read fMasterMappingMode write fMasterMappingMode default mmParams;
+ property MasterParamsMappings : TStrings read GetMasterParamsMappings write SetMasterParamsMappings;
+
+ property LogChanges: boolean read GetLogChanges write SetLogChanges default true;
+ property StreamingOptions: TDAStreamingOptions read fStreamingOptions write fStreamingOptions;
+ property RemoteFetchEnabled: boolean read fRemoteFetchEnabled write fRemoteFetchEnabled default true;
+
+ property ScriptCode : TStrings read fScriptCode write SetScriptCode;
+ property CustomAttributes : TStrings read fCustomAttributes write SetCustomAttributes;
+
+ property RemoteDataAdapter: TDACustomDataAdapter read fRemoteDataAdapter write SetRemoteDataAdapter;
+
+ property BeforeOpen: TDADataTableNotifyEvent read fBeforeOpen write fBeforeOpen;
+ property AfterOpen: TDADataTableNotifyEvent read fAfterOpen write fAfterOpen;
+ property BeforeClose: TDADataTableNotifyEvent read fBeforeClose write fBeforeClose;
+ property AfterClose: TDADataTableNotifyEvent read fAfterClose write fAfterClose;
+ property BeforeInsert: TDADataTableNotifyEvent read fBeforeInsert write fBeforeInsert;
+ property AfterInsert: TDADataTableNotifyEvent read fAfterInsert write fAfterInsert;
+ property BeforeEdit: TDADataTableNotifyEvent read fBeforeEdit write fBeforeEdit;
+ property AfterEdit: TDADataTableNotifyEvent read fAfterEdit write fAfterEdit;
+ property BeforePost: TDADataTableNotifyEvent read fBeforePost write fBeforePost;
+ property AfterPost: TDADataTableNotifyEvent read fAfterPost write fAfterPost;
+ property BeforeCancel: TDADataTableNotifyEvent read fBeforeCancel write fBeforeCancel;
+ property AfterCancel: TDADataTableNotifyEvent read fAfterCancel write fAfterCancel;
+ property BeforeDelete: TDADataTableNotifyEvent read fBeforeDelete write fBeforeDelete;
+ property AfterDelete: TDADataTableNotifyEvent read fAfterDelete write fAfterDelete;
+ property BeforeScroll: TDADataTableNotifyEvent read fBeforeScroll write fBeforeScroll;
+ property AfterScroll: TDADataTableNotifyEvent read fAfterScroll write fAfterScroll;
+ property BeforeRefresh: TDADataTableNotifyEvent read fBeforeRefresh write fBeforeRefresh;
+ property AfterRefresh: TDADataTableNotifyEvent read fAfterRefresh write fAfterRefresh;
+ property OnCalcFields: TDADataTableNotifyEvent read fOnCalcFields write fOnCalcFields;
+ property OnNewRecord: TDADataTableNotifyEvent read fOnNewRecord write fOnNewRecord;
+
+ property OnFilterRecord: TDADataTableFilterEvent read fOnFilterRecord write fOnFilterRecord;
+
+ property ReadOnly : boolean read GetReadOnly write SetReadOnly default False;
+
+ property OnDeleteError: TDADataTableErrorEvent read fOnDeleteError write fOnDeleteError;
+ property OnEditError: TDADataTableErrorEvent read fOnEditError write fOnEditError;
+ property OnPostError: TDADataTableErrorEvent read fOnPostError write fOnPostError;
+
+ property LocalSchema: TDASchema read fLocalSchema write SetLocalSchema;
+ property LocalDataStreamer: TDADataStreamer read fLocalDataStreamer write SetLocalDataStreamer;
+ property LocalConnection: string read fLocalConnection write fLocalConnection;
+
+ property MasterSource: TDADataSource read GetMasterSource write SetMasterSource;
+ property MasterFields: string read GetMasterFields write SetMasterFields;
+ property DetailFields: string read GetDetailFields write SetDetailsFields;
+ property MasterRequestMappings: TStrings read GetMasterRequestMappings write SetMasterRequestMappings;
+
+ property DetailOptions: TDADetailOptions read fDetailOptions write SetDetailOptions default DetailOptions_Default;
+ property MasterOptions: TDAMasterOptions read fMasterOptions write SetMasterOptions default MasterOptions_Default;
+
+ property Filtered: boolean read GetFiltered write SetFiltered default false;
+ property Filter: string read GetFilter write SetFilter;
+
+ property LogicalName: string read fLogicalName write fLogicalName;
+
+ //property OnApplyUpdatesError: TDAApplyUpdatesError read fOnApplyUpdatesError write fOnApplyUpdatesError;
+
+ property OnAfterApplyUpdates : TDADataTableNotifyEvent read fOnAfterApplyUpdates write fOnAfterApplyUpdates;
+ property OnBeforeApplyUpdates : TDABeforeApplyUpdatesEvent read fOnBeforeApplyUpdates write fOnBeforeApplyUpdates;
+ property OnBeforeMergeDelta : TDADataTableNotifyEvent read fOnBeforeMergeDelta write fOnBeforeMergeDelta;
+ property OnAfterMergeDelta : TDADataTableNotifyEvent read fOnAfterMergeDelta write fOnAfterMergeDelta;
+
+ property OnBeforeDataRequestCall: TDADataTableRemoteRequestEvent read fOnBeforeDataRequestCall write fOnBeforeDataRequestCall;
+ property OnAfterDataRequestCall: TDADataTableRemoteRequestEvent read fOnAfterDataRequestCall write fOnAfterDataRequestCall;
+ property OnBeforeDataUpdateCall: TDADataTableRemoteRequestEvent read fOnBeforeDataUpdateCall write fOnBeforeDataUpdateCall;
+ property OnAfterDataUpdateCall: TDADataTableRemoteRequestEvent read fOnAfterDataUpdateCall write fOnAfterDataUpdateCall;
+ property OnBeforeSchemaCall: TDADataTableRemoteRequestEvent read fOnBeforeSchemaCall write fOnBeforeSchemaCall;
+ property OnAfterSchemaCall: TDADataTableRemoteRequestEvent read fOnAfterSchemaCall write fOnAfterSchemaCall;
+ property OnBeforeScriptCall: TDADataTableRemoteRequestEvent read fOnBeforeScriptCall write fOnBeforeScriptCall;
+ property OnAfterScriptCall: TDADataTableRemoteRequestEvent read fOnAfterScriptCall write fOnAfterScriptCall;
+
+ property OnReceiveDataStream: TDADataRequestStreamEvent read fOnReceiveDataStream write fOnReceiveDataStream;
+
+ property OnBeforeFieldChange: TDADataTableDataChangeEvent read fBeforeFieldChange write fBeforeFieldChange;
+ property OnAfterFieldChange: TDADataTableDataChangeEvent read fAfterFieldChange write fAfterFieldChange;
+ property BusinessRulesID: string read fBusinessRulesID write SetBusinessRulesID;
+ property OnLocalUpdateDataBeginTransaction : TDALocalUpdateDataTransactionEvent read fOnLocalUpdateDataBeginTransaction write fOnLocalUpdateDataBeginTransaction;
+ property OnLocalUpdateDataCommitTransaction : TDALocalUpdateDataTransactionEvent read fOnLocalUpdateDataCommitTransaction write fOnLocalUpdateDataCommitTransaction;
+ property OnLocalUpdateDataRollBackTransaction : TDALocalUpdateDataTransactionEvent read fOnLocalUpdateDataRollBackTransaction write fOnLocalUpdateDataRollBackTransaction;
+ end;
+
+ TDADataTableClass = class of TDADataTable;
+ {$WARN SYMBOL_DEPRECATED ON}
+
+ { Exceptions }
+ EDABizValidationException = class(EROException);
+
+ { TDABusinessRules }
+ TDABusinessRules = class(TDAEngineBaseObject)
+ private
+ protected
+ function _AddRef: Integer; override;
+ function _Release: Integer; override;
+
+ public
+ constructor Create; virtual;
+ destructor Destroy; override;
+
+ end;
+
+ IDAStronglyTypedDataTable = interface
+ ['{4D4063AA-DFD0-4B4D-8CC2-FCE3BE1D2F87}']
+ procedure Open;
+ procedure Close;
+
+ function GetActive: boolean;
+ procedure SetActive(const Value: boolean);
+
+ property Active: boolean read GetActive write SetActive;
+
+ procedure Append;
+ procedure Cancel;
+ procedure Delete;
+ procedure Edit;
+ procedure First;
+ procedure Insert;
+ procedure Last;
+ procedure Next;
+ procedure Post;
+ procedure Prior;
+
+ function Locate(const aKeyFields: string; const aKeyValues: Variant; aOptions: TLocateOptions = []): Boolean;
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant;
+
+ function GetDataTable : TDADataTable;
+
+ function GetState : TDatasetState;
+ function GetIsEmpty : boolean;
+ function GetRecNo : integer;
+ procedure SetRecNo(Value : integer);
+ function GetMasterOptions : TDAMasterOptions;
+ procedure SetMasterOptions(Value : TDAMasterOptions);
+ function GetDetailOptions : TDADetailOptions;
+ procedure SetDetailOptions(Value : TDADetailOptions);
+
+ function IsFieldNull(const FieldIndexOrName : Variant) : boolean;
+ procedure ClearField(const FieldIndexOrName : Variant);
+
+ function GetBOF: boolean;
+ function GetEOF: boolean;
+ function GetRecordCount: integer;
+
+ property BOF: boolean read GetBOF;
+ property EOF: boolean read GetEOF;
+ property RecordCount: integer read GetRecordCount;
+ property RecNo : integer read GetRecNo write SetRecNo;
+
+ property MasterOptions : TDAMasterOptions read GetMasterOptions write SetMasterOptions;
+ property DetailOptions : TDADetailOptions read GetDetailOptions write SetDetailOptions;
+
+ property IsEmpty : boolean read GetIsEmpty;
+ property State : TDatasetState read GetState;
+ property DataTable : TDADataTable read GetDataTable;
+ end;
+
+ { TDAFieldRules }
+ TDAFieldRules = class(TDABusinessRules)
+ private
+ fField : TDAField;
+ fDataTable : TDADataTable;
+
+ protected
+ // Misc
+ procedure Attach(aDataTable: TDADataTable); virtual;
+ procedure Detach(aDataTable: TDADataTable); virtual;
+
+ // Event handler hooks
+ procedure OnValidate(Sender: TDACustomField); virtual;
+ procedure OnChange(Sender: TDACustomField); virtual;
+
+ property DataTable : TDADataTable read fDataTable;
+
+ public
+ constructor Create(aField : TDAField; aDataTable : TDADataTable); reintroduce; virtual;
+ destructor Destroy; override;
+ end;
+
+ TDAFieldRulesClass = class of TDAFieldRules;
+
+ { TDADataTableRules }
+ TDADataTableRules = class(TDABusinessRules, IDAStronglyTypedDataTable, IDARangeController)
+ private
+ fDataTable: TDADataTable;
+ fDetails : TStringList;
+
+ function GetDetails(Index: integer): TDADataTable;
+ function GetDetailsCount: integer;
+
+ protected
+ // Misc
+ function GetDataTable: TDADataTable;
+ procedure Attach(aDataTable: TDADataTable); virtual;
+ procedure Detach(aDataTable: TDADataTable); virtual;
+
+ procedure RefreshDetails;
+
+ function FindDetail(const aLogicalName : string) : TDADataTable;
+ function DetailByName(const aLogicalName : string) : TDADataTable;
+
+ // Business events
+ procedure BeforeOpen(Sender: TDADataTable); virtual;
+ procedure AfterOpen(Sender: TDADataTable); virtual;
+ procedure BeforeClose(Sender: TDADataTable); virtual;
+ procedure AfterClose(Sender: TDADataTable); virtual;
+ procedure BeforeInsert(Sender: TDADataTable); virtual;
+ procedure AfterInsert(Sender: TDADataTable); virtual;
+ procedure BeforeEdit(Sender: TDADataTable); virtual;
+ procedure AfterEdit(Sender: TDADataTable); virtual;
+ procedure BeforePost(Sender: TDADataTable); virtual;
+ procedure AfterPost(Sender: TDADataTable); virtual;
+ procedure BeforeCancel(Sender: TDADataTable); virtual;
+ procedure AfterCancel(Sender: TDADataTable); virtual;
+ procedure BeforeDelete(Sender: TDADataTable); virtual;
+ procedure AfterDelete(Sender: TDADataTable); virtual;
+ procedure BeforeScroll(Sender: TDADataTable); virtual;
+ procedure AfterScroll(Sender: TDADataTable); virtual;
+ procedure BeforeRefresh(Sender: TDADataTable); virtual;
+ procedure AfterRefresh(Sender: TDADataTable); virtual;
+ procedure OnCalcFields(Sender: TDADataTable); virtual;
+ procedure OnNewRecord(Sender: TDADataTable); virtual;
+
+ procedure OnDeleteError(DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); virtual;
+ procedure OnEditError(DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); virtual;
+ procedure OnPostError(DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); virtual;
+ procedure OnFilterRecord(DataTable: TDADataTable; var Accept : boolean); virtual;
+
+ procedure OnAfterSchemaCall(DataTable: TDADataTable; Request: TDARemoteRequest); virtual;
+ procedure OnAfterDataRequestCall(DataTable: TDADataTable; Request: TDARemoteRequest); virtual;
+ procedure OnBeforeSchemaCall(DataTable: TDADataTable; Request: TDARemoteRequest); virtual;
+ procedure OnBeforeDataRequestCall(DataTable: TDADataTable; Request: TDARemoteRequest); virtual;
+ procedure OnBeforeDataUpdateCall(DataTable: TDADataTable; Request: TDARemoteRequest); virtual;
+ procedure OnAfterDataUpdateCall(DataTable: TDADataTable; Request: TDARemoteRequest); virtual;
+ procedure OnBeforeScriptCall(DataTable: TDADataTable; Request: TDARemoteRequest); virtual;
+ procedure OnAfterScriptCall(DataTable: TDADataTable; Request: TDARemoteRequest); virtual;
+
+ procedure OnAfterApplyUpdates(DataTable: TDADataTable); virtual;
+ procedure OnBeforeMergeDelta(DataTable: TDADataTable); virtual;
+ procedure OnAfterMergeDelta(DataTable: TDADataTable); virtual;
+
+ procedure OnReceiveDataStream(DataTable: TDADataTable; Stream: TStream); virtual;
+ procedure OnBeforeApplyUpdates(DataTable: TDADataTable; const Delta: IDADelta); virtual;
+
+ procedure Open; virtual;
+ procedure Close; virtual;
+
+ function GetActive: boolean;
+ procedure SetActive(const Value: boolean);
+
+ property Active: boolean read GetActive write SetActive;
+
+ procedure Append; virtual;
+ procedure Cancel; virtual;
+ procedure Delete; virtual;
+ procedure Edit; virtual;
+ procedure First; virtual;
+ procedure Insert; virtual;
+ procedure Last; virtual;
+ procedure Next; virtual;
+ procedure Post; virtual;
+ procedure Prior; virtual;
+
+ function GetBOF: Boolean; virtual;
+ function GetEOF: Boolean; virtual;
+ function GetRecordCount: Integer; virtual;
+ function Locate(const aKeyFields: String; const aKeyValues: Variant; aOptions: TLocateOptions = []): Boolean; virtual;
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant;
+
+ function GetMasterOptions : TDAMasterOptions;
+ procedure SetMasterOptions(Value : TDAMasterOptions);
+ function GetDetailOptions : TDADetailOptions;
+ procedure SetDetailOptions(Value : TDADetailOptions);
+ function GetRecNo : integer;
+ procedure SetRecNo(Value : integer);
+ function GetIsEmpty: boolean;
+ function GetState: TDatasetState;
+
+ function IsFieldNull(const FieldIndexOrName : Variant) : boolean;
+ procedure ClearField(const FieldIndexOrName : Variant);
+
+ property DataTable: TDADataTable read GetDataTable;
+ property Details[Index : integer] : TDADataTable read GetDetails;
+ property DetailCount : integer read GetDetailsCount;
+ property State : TDatasetState read GetState;
+ property IsEmpty : boolean read GetIsEmpty;
+
+ { IDARangeController }
+ procedure ApplyRange; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CancelRange; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRange(const StartValues, EndValues: array of const); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure EditRangeEnd; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure EditRangeStart; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRangeEnd; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRangeStart; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ public
+ constructor Create(aDataTable: TDADataTable); reintroduce; virtual;
+ destructor Destroy; override;
+ end;
+
+ TDADataTableRulesClass = class of TDADataTableRules;
+
+ { TDADataTableList }
+ TDADataTableList = class(TList)
+ private
+ function GetItems(Index: integer): TDADataTable;
+ function GetPendingChangeCount: integer;
+ protected
+ public
+ constructor Create(aOwnerComponent : TComponent);
+
+ function ScanAndAdd(aOwnerComponent : TComponent) : integer;
+
+ function Add(aDataTable : TDADataTable) : integer;
+ procedure Remove(aDataTable : TDADataTable);
+
+ property Items[Index : integer] : TDADataTable read GetItems; default;
+ property PendingChangeCount : integer read GetPendingChangeCount;
+ end deprecated;
+
+// Registration routines
+procedure RegisterDataTableRules(const anID: string; const aDataTableRulesClass: TDADataTableRulesClass);
+function FindDataTableRules(const anID: string; out aDataTableRulesClass: TDADataTableRulesClass): boolean;
+
+procedure RegisterFieldRules(const anID: string; const aFieldRulesClass: TDAFieldRulesClass);
+function FindFieldRules(const anID: string; out aFieldRulesClass: TDAFieldRulesClass): boolean;
+
+// Helper functions
+function NewDelta(aDataTable: TDADataTable): IDADelta; overload;
+
+function DatatableFromStream(aStream : TStream;
+ aDataTableClass : TDADataTableClass;
+ anAdapter : TDADataAdapter;
+ const aDatasetName : string = '') : TDADataTable;
+
+implementation
+
+uses
+ {$IFDEF DESIGNTIME}
+ Dialogs,
+ {$ENDIF DESIGNTIME}
+ Variants,TypInfo,
+ uDABusinessProcessor, uDAWhere, uDARegExpr, uDARes;
+
+var
+ _bizfields,
+ _bizdatatables: TStringList;
+
+type
+ TDataSetHack = class(TDataSet);
+
+procedure FreeMasterKey(aKey: TDAMasterKeyID);
+begin
+ if aKey <> nil then FreeMem(aKey);
+end;
+
+function NewDelta(aDataTable: TDADataTable): IDADelta;
+begin
+ result := TDADelta.Create(aDataTable);
+end;
+
+procedure RegisterDataTableRules(const anID: string; const aDataTableRulesClass: TDADataTableRulesClass);
+var
+ idx: integer;
+begin
+ idx := _bizdatatables.IndexOf(anID);
+
+ if (idx >= 0) then
+ _bizdatatables.Objects[idx] := TObject(aDataTableRulesClass)
+ else
+ _bizdatatables.AddObject(anID, TObject(aDataTableRulesClass));
+end;
+
+function FindDataTableRules(const anID: string; out aDataTableRulesClass: TDADataTableRulesClass): boolean;
+var
+ idx: integer;
+begin
+ result := FALSE;
+ idx := _bizdatatables.IndexOf(anID);
+ if (idx >= 0) then begin
+ aDataTableRulesClass := TDADataTableRulesClass(_bizdatatables.Objects[idx]);
+ result := TRUE;
+ end
+ else
+ aDataTableRulesClass := nil;
+end;
+
+procedure RegisterFieldRules(const anID: string; const aFieldRulesClass: TDAFieldRulesClass);
+var
+ idx: integer;
+begin
+ idx := _bizfields.IndexOf(anID);
+
+ if (idx >= 0) then
+ _bizfields.Objects[idx] := TObject(aFieldRulesClass)
+ else
+ _bizfields.AddObject(anID, TObject(aFieldRulesClass));
+end;
+
+function FindFieldRules(const anID: string; out aFieldRulesClass: TDAFieldRulesClass): boolean;
+var
+ idx: integer;
+begin
+ result := FALSE;
+ idx := _bizfields.IndexOf(anID);
+ if (idx >= 0) then begin
+ aFieldRulesClass := TDAFieldRulesClass(_bizfields.Objects[idx]);
+ result := TRUE;
+ end
+ else
+ aFieldRulesClass := nil;
+end;
+
+function DatatableFromStream(aStream : TStream;
+ aDataTableClass : TDADataTableClass;
+ anAdapter : TDADataAdapter;
+ const aDatasetName : string = '') : TDADataTable;
+begin
+ result := aDataTableClass.Create(NIL);
+ result.RemoteFetchEnabled := FALSE;
+ anAdapter.ReadDataset(aStream, result, TRUE, aDatasetName);
+ result.First;
+end;
+
+{ TDADataTable }
+
+type
+ TDAStringList = class(TStringList)
+ protected
+ {$IFDEF FPC}
+ Function DoCompareText(const s1,s2 : string) : PtrInt; override;
+ {$ELSE}
+ function CompareStrings(const S1: string; const S2: string): Integer; override;
+ {$ENDIF}
+ end;
+
+{$IFDEF FPC}
+Function TDAStringList.DoCompareText(const s1,s2 : string) : PtrInt;
+{$ELSE}
+function TDAStringList.CompareStrings(const S1: string; const S2: string): Integer;
+{$ENDIF}
+begin
+ Result := CompareStr(s1,s2)
+end;
+
+constructor TDADataTable.Create(aOwner: TComponent);
+begin
+ inherited;
+ fHasReducedDelta := False;
+ fScriptCode := TStringList.Create;
+ fCustomAttributes := TStringList.Create;
+ fMaxRecords := -1;
+
+ fMasterMappingMode := mmParams;
+ fMasterParamsMappings := TStringList.Create;
+
+ fFieldRules := TObjectList.Create;
+
+ fRemoteUpdateOptions := [];
+ fStreamingOptions := [soDisableEventsWhileStreaming, soDisableFiltering];
+
+ fDetailOptions := DetailOptions_Default;
+ fMasterOptions := MasterOptions_Default;
+
+ fFetchedMasters := TDAMasterKeyList.Create;
+
+ fMasterRequestMappings := TStringList.Create;
+
+ fRemoteFetchEnabled := TRUE;
+ fStreaming := False;
+
+ SetLength(fSortDirections, 0);
+ SetLength(fSortFieldNames, 0);
+
+ fFields := TDAFieldCollection.Create(Self);
+ fFields.OnFieldBeforeUpdate := InternalBeforeFieldUpdate;
+ fFields.OnFieldAfterUpdate := InternalAfterFieldUpdate;
+ fParams := TDAParamCollection.Create(Self);
+
+ fWhere := TDAWhere.Create(fFields, TRUE);
+ fWhere.OnChange := OnWhereChange;
+
+ fDataset := GetDatasetClass.Create(Self);
+ fDataset.Name := 'Dataset';
+
+ fMasterLink := TMasterDataLink.Create(fDataset);
+ fMasterLink.OnMasterChange := OnMasterChange;
+ fMasterLink.OnMasterDisable := OnMasterDisable;
+
+ fExpressionEvaluator := TDAStdExpressionEvaluator.Create;
+ fExpressionEvaluator.OnGetValue := ExpessionEvaluatorGetValue;
+
+ fDynamicWhere := TDAWhereBuilder.Create;
+ fLogChanges := TRUE;
+ EnableEventHandlers;
+end;
+
+destructor TDADataTable.Destroy;
+begin
+ SetOldMasterKey(nil);
+ RemoteDataAdapter := nil;
+ LocalDataStreamer := nil;
+ LocalSchema := nil;
+ DisableEventHandlers;
+ fDynamicWhere.Free;
+ fExpressionEvaluator.Free;
+ fWhere.Free;
+
+ fMasterLink.Free;
+ fMasterRequestMappings.Free;
+ fMasterParamsMappings.Free;
+
+ fFetchedMasters.Free;
+
+ if (fBusinessRules <> nil) then begin
+ fBusinessRules.Detach(Self);
+ fBusinessRules.Free;
+ end;
+
+ fFieldRules.Free;
+ fParams.Free;
+ fFields.Free;
+
+ fDelta := NIL;
+ fScriptCode.Free;
+ fCustomAttributes.Free;
+
+ inherited;
+end;
+
+procedure TDADataTable.OnWhereChange(Sender : TObject);
+//var par : TDARemoteRequestParam;
+begin
+ //TODO: par := DataRequestCall.FindParam(par_UserFilter);
+ //if (par<>NIL) then par.AsString := fWhere.Clause;
+end;
+
+procedure TDADataTable.AttachEventHooks(aDataset: TDataset);
+var i : integer;
+ lFieldRulesClass : TDAFieldRulesClass;
+ lFieldRules : TDAFieldRules;
+ lField : TDAField;
+begin
+ if (csDesigning in ComponentState) then Exit;
+
+ aDataset.BeforeInsert := InternalBeforeInsert;
+ aDataset.AfterInsert := InternalAfterInsert;
+ aDataset.BeforeEdit := InternalBeforeEdit;
+ aDataset.AfterEdit := InternalAfterEdit;
+ aDataset.BeforePost := InternalBeforePost;
+ aDataset.AfterPost := InternalAfterPost;
+ aDataset.BeforeCancel := InternalBeforeCancel;
+ aDataset.AfterCancel := InternalAfterCancel;
+ aDataset.BeforeDelete := InternalBeforeDelete;
+ aDataset.AfterDelete := InternalAfterDelete;
+ aDataset.BeforeScroll := InternalBeforeScroll;
+ aDataset.AfterScroll := InternalAfterScroll;
+ aDataset.BeforeRefresh := InternalBeforeRefresh;
+ aDataset.AfterRefresh := InternalAfterRefresh;
+
+ aDataset.OnCalcFields := InternalOnCalcFields;
+ aDataset.OnNewRecord := InternalOnNewRecord;
+
+ aDataset.OnFilterRecord := InternalOnFilterRecord;
+
+ aDataset.OnDeleteError := InternalOnDeleteError;
+ aDataset.OnEditError := InternalOnEditError;
+ aDataset.OnPostError := InternalOnPostError;
+
+ for i := 0 to (fFields.Count-1) do begin
+ lField := Fields[i];
+ if (lField.BusinessClassID='') then Continue;
+
+ Check(not FindFieldRules(lField.BusinessClassID, lFieldRulesClass), 'Invalid BusinessClassID "%s"', [lField.BusinessClassID]);
+
+ lFieldRules := lFieldRulesClass.Create(lField, Self);
+ fFieldRules.Add(lFieldRules);
+ end;
+
+ fFields.FieldEventsDisabled := FALSE;
+end;
+
+procedure TDADataTable.DetachEventHooks(aDataset: TDataset);
+begin
+ if (csDesigning in ComponentState) then Exit;
+
+ aDataset.BeforeInsert := nil;
+ aDataset.AfterInsert := nil;
+ aDataset.BeforeEdit := nil;
+ aDataset.AfterEdit := nil;
+ aDataset.BeforePost := TempSetRowRecIDValue; // We still need to autoinc the RecID!!!
+ aDataset.AfterPost := nil;
+ aDataset.BeforeCancel := nil;
+ aDataset.AfterCancel := nil;
+ aDataset.BeforeDelete := nil;
+ aDataset.AfterDelete := nil;
+ aDataset.BeforeScroll := nil;
+ aDataset.AfterScroll := nil;
+ aDataset.BeforeRefresh := nil;
+ aDataset.AfterRefresh := nil;
+ if not Filtered then
+ aDataset.OnCalcFields := nil;
+ aDataset.OnNewRecord := nil;
+
+ aDataset.OnFilterRecord := nil;
+
+ aDataset.OnDeleteError := nil;
+ aDataset.OnEditError := nil;
+ aDataset.OnPostError := nil;
+
+ fFields.FieldEventsDisabled := TRUE;
+ fFieldRules.Clear; // Destroyes them
+end;
+
+procedure TDADataTable.InternalAfterDelete(Sender: TDataset);
+begin
+ CallScript('AfterDelete');
+ if Assigned(AfterDelete) then AfterDelete(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.AfterDelete(Self);
+
+ if (ruoOnPost in RemoteUpdatesOptions) then InternalApplyUpdates();
+end;
+
+procedure TDADataTable.InternalAfterEdit(Sender: TDataset);
+begin
+ CallScript('AfterEdit');
+ if Assigned(AfterEdit) then AfterEdit(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.AfterEdit(Self);
+end;
+
+procedure TDADataTable.InternalAfterInsert(Sender: TDataset);
+begin
+ CallScript('AfterInsert');
+
+ if Assigned(AfterInsert) then AfterInsert(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.AfterInsert(Self);
+end;
+
+procedure TDADataTable.InternalAfterRefresh(Sender: TDataset);
+begin
+ CallScript('AfterRefresh');
+ if Assigned(AfterRefresh) then AfterRefresh(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.AfterRefresh(Self);
+end;
+
+procedure TDADataTable.InternalAfterScroll(Sender: TDataset);
+begin
+ if fStreaming and (soDisableEventsWhileStreaming in fStreamingOptions)
+ then Exit;
+ CallScript('AfterScroll');
+ if Assigned(AfterScroll) then AfterScroll(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.AfterScroll(Self);
+end;
+
+function TDADataTable.InternalApplyUpdates(RefetchAll: boolean): boolean;
+var
+ details: TList;
+ i: integer;
+ dt: TDADataTable;
+begin
+ if not (ruoOnPost in RemoteUpdatesOptions) and DeltaInitialized then Delta.EndChangesInAllTables;
+ details:= GetDetailTablesforApplyUpdate;
+ try
+ // check RDA
+ CheckProperties;
+ for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ {if dt.RemoteFetchEnabled then } dt.CheckProperties;
+ end;
+
+ //fOnBeforeApplyUpdates
+ if Assigned(fOnBeforeApplyUpdates) then fOnBeforeApplyUpdates(Self, GetDelta);
+ for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fOnBeforeApplyUpdates) then dt.fOnBeforeApplyUpdates(dt, GetDelta);
+ end;
+
+ //fBusinessRules.OnBeforeApplyUpdates
+ if Assigned(fBusinessRules) then fBusinessRules.OnBeforeApplyUpdates(Self, GetDelta);
+ for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fBusinessRules) then dt.fBusinessRules.OnBeforeApplyUpdates(dt, GetDelta);
+ end;
+
+ if RemoteFetchEnabled then begin
+
+ //fOnBeforeDataUpdateCall
+ if Assigned(fOnBeforeDataUpdateCall) then fOnBeforeDataUpdateCall(Self, RemoteDataAdapter.Get_UpdateDataCall);
+ for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fOnBeforeDataUpdateCall) then dt.fOnBeforeDataUpdateCall(dt, dt.RemoteDataAdapter.Get_UpdateDataCall);
+ end;
+
+ //fBusinessRules.OnBeforeDataUpdateCall
+ if Assigned(fBusinessRules) then fBusinessRules.OnBeforeDataUpdateCall(Self, RemoteDataAdapter.Get_UpdateDataCall);
+ for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fBusinessRules) then dt.fBusinessRules.OnBeforeDataUpdateCall(dt, dt.RemoteDataAdapter.Get_UpdateDataCall);
+ end;
+
+ result := RemoteDataAdapter.ApplyUpdates([self], RefetchAll);
+
+ //fOnAfterDataUpdateCall
+ if Assigned(fOnAfterDataUpdateCall) then fOnAfterDataUpdateCall(Self, RemoteDataAdapter.Get_UpdateDataCall);
+ for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fOnAfterDataUpdateCall) then dt.fOnAfterDataUpdateCall(dt, dt.RemoteDataAdapter.Get_UpdateDataCall);
+ end;
+
+ //fBusinessRules.OnAfterDataUpdateCall
+ if Assigned(fBusinessRules) then fBusinessRules.OnAfterDataUpdateCall(Self, RemoteDataAdapter.Get_UpdateDataCall);
+ for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fBusinessRules) then dt.fBusinessRules.OnAfterDataUpdateCall(dt, dt.RemoteDataAdapter.Get_UpdateDataCall);
+ end;
+
+ end
+ else begin
+ result := Local_ApplyUpdates(RefetchAll);
+ end;
+
+ //fOnAfterApplyUpdates
+ if Assigned(fOnAfterApplyUpdates) then fOnAfterApplyUpdates(Self);
+ for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fOnAfterApplyUpdates) then dt.fOnAfterApplyUpdates(dt);
+ end;
+
+ //fBusinessRules.OnAfterApplyUpdates
+ if Assigned(fBusinessRules) then fBusinessRules.OnAfterApplyUpdates(Self);
+ for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fBusinessRules) then dt.fBusinessRules.OnAfterApplyUpdates(dt);
+ end;
+ finally
+ details.Free;
+ end;
+end;
+
+procedure TDADataTable.InternalBeforeCancel(Sender: TDataset);
+begin
+ CallScript('BeforeCancel');
+ if Assigned(BeforeCancel) then BeforeCancel(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.BeforeCancel(Self);
+end;
+
+procedure TDADataTable.InternalBeforeRefresh(Sender: TDataset);
+begin
+ CallScript('BeforeRefresh');
+ if Assigned(BeforeRefresh) then BeforeRefresh(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.BeforeRefresh(Self);
+ DoRefresh(fDataset);
+end;
+
+procedure TDADataTable.InternalBeforeScroll(Sender: TDataset);
+begin
+ if fStreaming and (soDisableEventsWhileStreaming in fStreamingOptions)
+ then Exit;
+ CallScript('BeforeScroll');
+ if Assigned(BeforeScroll) then BeforeScroll(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.BeforeScroll(Self);
+end;
+
+procedure TDADataTable.InternalOnCalcFields(Sender: TDataset);
+var
+ i: integer;
+begin
+ CallScript('OnCalcFields');
+ if Assigned(OnCalcFields) then OnCalcFields(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.OnCalcFields(Self);
+ For i:= 0 to fFields.Count-1 do
+ With fFields[i] do
+ if Calculated and (Expression <> '') then Value:= fExpressionEvaluator.Evaluate(Expression);
+end;
+
+procedure TDADataTable.InternalOnDeleteError(DataSet: TDataSet; Error: EDatabaseError; var Action: TDataAction);
+begin
+ if Assigned(OnDeleteError) then OnDeleteError(Self, Error, Action);
+ if Assigned(fBusinessRules) then fBusinessRules.OnDeleteError(Self, Error, Action);
+end;
+
+procedure TDADataTable.InternalOnEditError(DataSet: TDataSet; Error: EDatabaseError; var Action: TDataAction);
+begin
+ if Assigned(OnEditError) then OnEditError(Self, Error, Action);
+ if Assigned(fBusinessRules) then fBusinessRules.OnEditError(Self, Error, Action);
+end;
+
+procedure TDADataTable.InternalOnFilterRecord(Dataset: TDataset; var Accept: Boolean);
+begin
+ if Assigned(OnFilterRecord) then OnFilterRecord(Self, Accept);
+ if Assigned(fBusinessRules) then fBusinessRules.OnFilterRecord(Self, Accept);
+end;
+
+procedure TDADataTable.InternalOnPostError(DataSet: TDataSet; Error: EDatabaseError; var Action: TDataAction);
+begin
+ GetDelta.RestoreLastChange(self); // ALEF: added as follow up to the Post errors (Jeff B.)
+
+ if Assigned(OnPostError) then OnPostError(Self, Error, Action);
+ if Assigned(fBusinessRules) then fBusinessRules.OnPostError(Self, Error, Action);
+end;
+
+procedure TDADataTable.SetLogChanges(const Value: boolean);
+begin
+ fLogChanges := Value;
+end;
+
+function TDADataTable.GetDataset: TDataset;
+begin
+ result := fDataset // inherited Dataset;
+end;
+
+function TDADataTable.GetFields: TDAFieldCollection;
+begin
+ result := fFields;
+end;
+
+procedure TDADataTable.SetFields(const Value: TDAFieldCollection);
+begin
+ if Active then Close;
+ fFields.Assign(Value);
+end;
+
+(*
+ key struct
+
+ fieldcount = word
+ nativefieldtype = byte*fieldcount
+ {
+ size = word
+ fieldname = Length(fieldname) * SizeOf(char)
+ }*fieldcount
+ {
+ nativedata
+ }*fieldcount
+*)
+function TDADataTable.GenerateKeyfromMasterRecID: TDAMasterKeyID;
+
+ procedure MakeKeyFromInteger(aValue: Integer);
+ begin
+ GetMem(Result,SizeOf(Integer)*2);
+ Move(PInteger(@aValue)^, Result[SizeOf(Integer)],SizeOf(Integer));
+ aValue := SizeOf(Integer);
+ Move(PInteger(@aValue)^, Result[0],SizeOf(Integer));
+ end;
+
+var
+ p: PAnsiChar;
+ i,l: integer;
+ lLink: TMasterDataLink;
+ buf: array [0..4096] of byte;
+ fld: TField;
+ lMasterDataset: TDataset;
+ s: string;
+begin
+ lLink := GetMasterDataLink;
+ if (lLink = nil) or (lLink.Fields.Count = 0) then begin
+ // if something is wrong so we will use old method
+ MakeKeyFromInteger(MasterSource.DataTable.GetRowRecIDValue);
+ exit;
+ end;
+ lMasterDataset := MasterSource.DataTable.Dataset;
+ p:= PAnsiChar(@buf[0]);
+ PWord(p)^ := lLink.Fields.Count;
+ inc(p, sizeOf(word));
+ for I := 0 to lLink.Fields.Count - 1 do begin
+ PByte(p)^ := ord(TField(lLink.Fields[i]).DataType);
+ inc(p);
+ end;
+ for I := 0 to lLink.Fields.Count - 1 do begin
+ s := TField(lLink.Fields[i]).FieldName;
+ Move( pointer(s)^, p^, Length(s)*SizeOf(Char) );
+ inc(p,Length(s)*SizeOf(Char));
+ p^ := #0; // fieldname delimiter
+ inc(p);
+ end;
+ for I := 0 to lLink.Fields.Count - 1 do begin
+ fld := TField(lLink.Fields[i]);
+ lMasterDataset.GetFieldData(fld,p,true);
+ inc(p, fld.DataSize);
+ end;
+ l := p -PAnsiChar(@buf[0]);
+ GetMem(Result, l+SizeOf(Integer));
+ Move(PInteger(@l)^,Result[0],SizeOf(integer));
+ Move(buf[0],Result[SizeOf(integer)],l);
+end;
+
+function TDADataTable.GetActive: boolean;
+begin
+ result := fDataset.Active;
+end;
+
+procedure TDADataTable.SetActive(Value: boolean);
+begin
+ if (csLoading in ComponentState) then
+ fStreamedActive := Value
+ else begin
+ if (Value <> Active) then begin
+ if Value then
+ Open
+ else
+ Close
+ end;
+ end;
+end;
+
+procedure TDADataTable.InternalOnNewRecord(Sender: TDataset);
+var
+ i: integer;
+begin
+ fFields.FieldEventsDisabled := TRUE;
+ try
+ try
+ for i := 0 to (fFields.Count - 1) do begin
+ if (fFields[i].DefaultValue <> '') then fFields[i].Value := fFields[i].DefaultValue;
+ // (autoinc)
+ if (fFields[i].DataType=datLargeAutoInc) then begin
+ fFields[i].AsLargeInt := AutoIncs[i];
+ AutoIncs[i] := AutoIncs[i]-1;
+ end
+ else if (fFields[i].DataType=datAutoInc) then begin
+ fFields[i].AsInteger := AutoIncs[i];
+ AutoIncs[i] := AutoIncs[i]-1;
+ end;
+ end;
+
+ fFields.FieldEventsDisabled := FALSE;
+
+ CallScript('OnNewRecord');
+ if Assigned(OnNewRecord) then OnNewRecord(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.OnNewRecord(Self);
+ except
+ GetDelta.CancelChange(self); // OnNewRecord's exception put the dataset in read mode so we must cancel the change
+ raise;
+ end;
+ finally
+ fFields.FieldEventsDisabled := FALSE; // Just in case...
+ end;
+end;
+
+procedure TDADataTable.DoCascadeOperation(aStreamer: TDADataStreamer; aOption: TDAMasterOption);
+var
+ i: integer;
+ details: TList;
+ dt: TDADataTable;
+ flag: boolean;
+ lRemoteList,lLocalList: TList;
+begin
+ if aOption = moAllInOneFetch then begin
+ DoCascadeRemoteAllInOneFetch(aStreamer);
+ exit;
+ end;
+
+ lRemoteList:= TList.Create;
+ lLocalList:= TList.Create;
+
+ GetDetailTablesforAllinOneFetch(lRemoteList,lLocalList, False);
+ details := GetDetailDataTables;
+ try
+ for i := 0 to (details.Count - 1) do begin
+ dt := TDADataTable(details[i]);
+ flag := dt.LogChanges;
+
+ case aOption of
+ moCascadeDelete: begin
+ if (dtDisableLogOfCascadeDeletes in dt.DetailOptions) then dt.LogChanges := FALSE;
+
+ dt.ClearRows;
+ end;
+
+ moCascadeOpenClose: begin
+ if (dtCascadeOpenClose in dt.DetailOptions) then begin
+ if Opening then begin
+ if (lLocalList.IndexOf(dt)=-1)and (lRemoteList.IndexOf(dt)=-1) then begin
+ dt.Close;
+ dt.DoOpen;
+ end;
+ end
+ else if Closing then
+ dt.Close;
+ end;
+ end;
+
+ moCascadeUpdate: begin
+ end;
+
+ moAllInOneFetch: begin
+ {
+ if (dtIncludeInAllInOneFetch in dt.DetailOptions) then try
+ dt.LogChanges := FALSE;
+
+ if Opening and not (soIgnoreStreamSchema in fStreamingOptions) then
+ begin
+ aStreamer.ReadDataset(dt.LogicalName, dt, TRUE, FALSE);
+ dt.InitializeDataTable;
+ end;
+
+ aStreamer.ReadDataset(dt.LogicalName, dt);
+ dt.DoCascadeOperation(aStreamer, moAllInOneFetch);
+ finally
+ dt.LogChanges := flag;
+ end; }
+ end;
+ end;
+
+ dt.LogChanges := flag;
+ end;
+ finally
+ details.Free;
+ lRemoteList.Free;
+ lLocalList.Free;
+ end;
+end;
+
+procedure TDADataTable.DoCascadeRemoteAllInOneFetch(aStreamer: TDADataStreamer);
+
+ procedure ProcessDetailTable(aTable: TDADataTable);
+ begin
+ First;
+ while not eof do begin
+ aTable.AddMasterKey(aTable.GenerateKeyfromMasterRecID);
+ Next;
+ end;
+ aTable.DoCascadeRemoteAllInOneFetch(aStreamer);
+ end;
+
+var
+ lLocalList, lRemoteList: TList;
+ ltbl: TDADataTable;
+ i: integer;
+ lflag: boolean;
+ lold_Filtered: Boolean;
+ lold_mastersource: TDADataSource;
+begin
+ if moAllInOneFetch in fMasterOptions then begin
+ lRemoteList:= TList.Create;
+ lLocalList:= TList.Create;
+ try
+ GetDetailTablesforAllinOneFetch(lRemoteList,lLocalList, False);
+ if (lRemoteList.Count > 0) or (lLocalList.Count > 0) then begin
+ lold_Filtered:= Filtered;
+ lold_mastersource := MasterSource;
+ try
+ Filtered := False;
+ MasterSource:=nil;
+ First;
+ // these tables are read in RDA
+ for i := 0 to lRemoteList.Count - 1 do begin
+ ProcessDetailTable(TDADataTable(lRemoteList[i]));
+ end;
+
+ // these tables we should read manually from streamer
+ for i := 0 to lLocalList.Count - 1 do begin
+ ltbl:= TDADataTable(lLocalList[i]);
+ if aStreamer.FindDatasetIndex(ltbl.LogicalName) = -1 then Continue; // may be to better raise an exception!
+ lflag := ltbl.LogChanges;
+ try
+ ltbl.LogChanges := False;
+ if Opening and not (soIgnoreStreamSchema in fStreamingOptions) then begin
+ aStreamer.ReadDataset(ltbl.LogicalName, ltbl, TRUE, FALSE);
+ ltbl.InitializeDataTable;
+ end;
+ aStreamer.ReadDataset(ltbl.LogicalName, ltbl);
+ finally
+ ltbl.LogChanges := lflag;
+ end;
+ ProcessDetailTable(ltbl);
+ end;
+ finally
+ Filtered := lold_Filtered;
+ MasterSource := lold_mastersource;
+ end;
+ end;
+ finally
+ lRemoteList.Free;
+ lLocalList.Free;
+ end;
+ end;
+end;
+
+procedure TDADataTable.TempSetRowRecIDValue(Sender: TDataset);
+begin
+ if (State <> dsEdit) then begin // Somehow it's gets in dsBrowse here...
+ fRecIDField.AsInteger := CurrRecId;
+ CurrRecId := CurrRecId + 1;
+ end;
+end;
+
+procedure TDADataTable.CreateInternalFields(aDataset: TDataset; someFieldDefinitions: TDAFieldCollection);
+var
+ i, cnt: integer;
+ fld: TFieldDef;
+ fldcls: TFieldClass;
+ realfld: TField;
+begin
+ // Creates the RecID field
+ fld := aDataset.FieldDefs.AddFieldDef;
+ fld.DataType := ftInteger;
+ fld.Name := RecIDFieldName;
+
+ // Creates the autoinc map (autoinc)
+ AutoIncs := CreateAutoIncArray;
+
+ // Adds the data fields (non calculated) to the FieldDefs
+ for i := 0 to (Fields.Count - 1) do begin
+ if Fields[i].Calculated or Fields[i].Lookup then Continue; // Added as fields later
+
+ fld := aDataset.FieldDefs.AddFieldDef;
+
+ // (autoinc)
+ if (Fields[i].DataType=datLargeAutoInc)then fld.DataType := ftLargeint
+ else if (Fields[i].DataType=datAutoInc)then fld.DataType := ftInteger
+ else fld.DataType := intDATypeToVCLType(Fields[i].DataType);
+
+ fld.Name := Fields[i].Name;
+
+ {if not (fld.DataType in [ftFloat, ftCurrency, ftBlob, ftInteger])
+ then fld.Size := Fields[i].Size;}
+
+ if (fld.DataType = ftString) or (fld.DataType = ftWideString) then fld.Size := Fields[i].Size;
+ if (fld.DataType = ftGuid) then fld.Size := 38;
+{
+ if (fld.DataType = ftBcd) then begin
+ fld.Size:=Fields[i].DecimalScale;
+ fld.Precision:=Fields[i].DecimalPrecision;
+ end;
+}
+ if (fld.DataType = ftFMTBcd) then begin
+ fld.Size:=Fields[i].DecimalScale;
+ fld.Precision:=Fields[i].DecimalPrecision;
+ end;
+
+ fld.Required := Fields[i].Required;
+ end;
+
+ // Creates the data fields
+ for i := 0 to (aDataset.FieldDefs.Count - 1) do begin
+ realfld := aDataset.FieldDefs[i].CreateField(aDataset);
+ realfld.DataSet := aDataset; // NEW
+ end;
+
+ // Creates the calculated fields
+ for i := 0 to (Fields.Count - 1) do begin
+ if not Fields[i].Calculated then Continue;
+
+ fldcls := DefaultFieldClasses[intDATypeToVCLType(Fields[i].DataType)];
+ if fldcls = nil then fldcls := TStringField;
+ realfld := fldcls.Create(Self);
+ realfld.Name := aDataset.Name + Fields[i].Name;
+ realfld.FieldName := Fields[i].Name;
+ realfld.DataSet := aDataset;
+
+ if (Fields[i].DataType = datString) or (Fields[i].DataType = datWideString) then realfld.Size := Fields[i].Size;
+
+ realfld.Required := Fields[i].Required;
+ if Fields[i].Calculated then realfld.FieldKind := fkCalculated;
+
+ realfld.DataSet := aDataset;
+ end;
+
+ // Creates the lookup fields
+ for i := 0 to (Fields.Count - 1) do begin
+ if not Fields[i].Lookup then Continue;
+
+ fldcls := DefaultFieldClasses[intDATypeToVCLType(Fields[i].DataType)];
+
+ if not Assigned(fldcls) then
+ RaiseError('No or invalid DataType specified for lookup field %s.%s',[self.Name, Fields[i].DisplayLabel]);
+
+ realfld := fldcls.Create(Self);
+ realfld.Name := aDataset.Name + Fields[i].Name;
+ realfld.FieldName := Fields[i].Name;
+ realfld.DataSet := aDataset; // NEW
+
+ // Sets lookup properties
+ with Fields[i] do begin
+ {$IFNDEF FPC}
+ realfld.Lookup := TRUE;
+ {$ENDIF}
+ realfld.FieldKind:=fkLookup;
+ if (LookupSource<>NIL) then
+ with TDADataSource(LookupSource) do
+ if Assigned(DataTable)
+ then realfld.LookupDataSet := DataTable.Dataset;
+
+ realfld.LookupKeyFields := LookupKeyFields;
+ realfld.LookupCache := LookupCache;
+ realfld.LookupResultField := LookupResultField;
+ realfld.KeyFields := KeyFields;
+ end;
+
+ if (Fields[i].DataType = datString) or (Fields[i].DataType = datWideString) then realfld.Size := Fields[i].Size;
+
+ //realfld.DataSet := aDataset;
+ end;
+
+ // Adjusts field positions (less intrusive than changing the code above)
+ cnt := Fields.Count-1;
+ for i := 0 to cnt do begin
+ realfld := aDataSet.FieldByName(Fields[i].Name);
+ realfld.Index := i+1;
+ if (Fields[i].DataType = datCurrency) and (realfld is TBCDField) then TBcdField(realfld).currency := True;
+ end;
+end;
+
+procedure TDADataTable.Loaded;
+begin
+ inherited;
+
+ if Assigned(fBusinessRules)
+ then fBusinessRules.Attach(Self);
+
+ //Active := fStreamedActive;
+ if fStreamedActive then Active:=True;
+
+// AttachEventHooks(fDataset);
+end;
+
+procedure TDADataTable.DoRefresh(aDataset: TDataset);
+begin
+ if fRefreshing then Exit;
+
+ fRefreshing := TRUE;
+ try
+ Close;
+ Open;
+ finally
+ fRefreshing := FALSE;
+ end;
+end;
+
+procedure TDADataTable.InternalBeforeInsert(Sender: TDataset);
+var
+ i: Integer;
+begin
+ if UsingClonedCursor and DeltaInitialized then Delta.AssignDataTable(Self);
+ try
+ CallScript('BeforeInsert');
+ if Assigned(BeforeInsert) then BeforeInsert(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.BeforeInsert(Self);
+
+ if not LogChanges or (csDesigning in ComponentState) then Exit;
+
+ GetDelta.StartChange(ctInsert,Self);
+
+ SetLength(fOldValues, FieldCount);
+ for i := 0 to Length(fOldValues) -1 do
+ fOldValues[i] := null;
+ except
+ // Somehow the insert failed, so we restore the original data table to the delta
+ if UsingClonedCursor and HasDelta then Delta.AssignDataTable(fCloneSource);
+ raise;
+ end;
+end;
+
+procedure TDADataTable.InternalBeforeDelete(Sender: TDataset);
+begin
+ if UsingClonedCursor and DeltaInitialized then Delta.AssignDataTable(Self);
+ try
+ CallScript('BeforeDelete');
+ if Assigned(BeforeDelete) then BeforeDelete(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.BeforeDelete(Self);
+
+ if not LogChanges or (csDesigning in ComponentState) then Exit;
+
+ // Deletes the records from the detail tables
+ if (moCascadeDelete in MasterOptions) then DoCascadeOperation(nil, moCascadeDelete);
+
+ // Logs the delete
+ GetDelta.StartChange(ctDelete,Self);
+ GetDelta.EndChange(self);
+ finally
+ if UsingClonedCursor and HasDelta then Delta.AssignDataTable(fCloneSource);
+ end;
+end;
+
+procedure TDADataTable.InternalBeforeEdit(Sender: TDataset);
+
+ procedure _GenerateMasterIDinDetailsTables;
+ var
+ List: TList;
+ i: integer;
+ dt: TDADataTable;
+ begin
+ List := GetDetailDataTables;
+ try
+ for i := 0 to List.Count - 1 do begin
+ dt := TDADataTable(List[i]);
+ if not dt.Active then Continue;
+ SetOldMasterKey(dt.GenerateKeyfromMasterRecID);
+ end;
+ finally
+ List.Free;
+ end;
+ end;
+
+var
+ i: integer;
+begin
+ if UsingClonedCursor and DeltaInitialized then Delta.AssignDataTable(Self);
+ try
+ _GenerateMasterIDinDetailsTables;
+ CallScript('BeforeEdit');
+ if Assigned(BeforeEdit) then BeforeEdit(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.BeforeEdit(Self);
+
+ if not LogChanges or (csDesigning in ComponentState) then Exit;
+
+ GetDelta.StartChange(ctUpdate, Self);
+
+ SetLength(fOldValues, Dataset.Fields.Count);
+ for i := 0 to Length(fOldValues) -1 do
+ fOldValues[i] := Dataset.Fields[i].Value;
+ except
+ // Somehow the edit failed, so we restore the original data table to the delta
+ if UsingClonedCursor and HasDelta then Delta.AssignDataTable(fCloneSource);
+ raise;
+ end;
+end;
+
+procedure TDADataTable.InternalBeforePost(Sender: TDataset);
+var details : TList;
+ key : TDAMasterKeyID;
+ i : integer;
+ dt: TDADataTable;
+begin
+ CallScript('BeforePost');
+ if Assigned(BeforePost) then BeforePost(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.BeforePost(Self);
+
+ for i := 0 to (fFields.Count - 1) do
+ if (fFields[i].RegExpression <> '') and not fFields[i].IsNull then begin
+ if not ExecRegExpr(fFields[i].RegExpression, fFields[i].AsString) then RaiseError('Invalid input value for field ' + fFields[i].DisplayLabel);
+ end;
+
+ if (State <> dsEdit) then begin // Somehow it's gets in dsBrowse here...
+ fRecIDField.AsInteger := CurrRecId;
+ CurrRecId := CurrRecId + 1;
+ end;
+
+ // This was originally in AfterPost. Moved here because after a post filters might step in and the current
+ // record can change resulting in half change from record X and the remaining from record Y
+
+ if not LogChanges or (csDesigning in ComponentState) then Exit;
+ GetDelta.EndChange(Self);
+
+ case State of
+ dsInsert: begin
+ // Adds a reference to the RecID of this record to avoid double fetching records
+ // This is a new master record, so it means there are no details to fetch remotely
+ details := GetDetailDataTables;
+ try
+ for i := 0 to (details.Count-1) do begin
+ dt := TDADataTable(details[i]);
+ if dt.Active then begin
+ key := dt.GenerateKeyfromMasterRecID;
+ if dt.IsNeedToFetch(key) then
+ dt.AddMasterKey(key)
+ else
+ FreeMasterKey(key);
+ end;
+ end;
+ finally
+ details.Free;
+ end;
+ end;
+ dsEdit: begin
+ details := GetDetailDataTables;
+ try
+ for i := 0 to (details.Count-1) do begin
+ dt := TDADataTable(details[i]);
+ if dt.Active and (dt.fOldMasterKey <> nil) then begin
+ key := dt.GenerateKeyfromMasterRecID;
+ dt.ReplaceMasterKey(dt.fOldMasterKey, Key);
+ SetOldMasterKey(nil);
+ end;
+ end;
+ finally
+ details.Free;
+ end;
+ end;
+ end;
+ if (ruoOnPost in RemoteUpdatesOptions) then try
+ InternalApplyUpdates();
+ except
+ on E: Exception do
+ begin
+ if GetDelta.Count > 0 then
+ GetDelta.RestoreLastChange(Self)
+ else case Self.State of
+ dsEdit: GetDelta.StartChange(ctUpdate,Self);
+ dsInsert: GetDelta.StartChange(ctInsert,Self);
+ end;
+ raise;
+ end;
+ end;
+end;
+
+procedure TDADataTable.InternalAfterPost(Sender: TDataset);
+begin
+ try
+ CallScript('AfterPost');
+ if Assigned(AfterPost) then AfterPost(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.AfterPost(Self);
+
+ if not LogChanges or (csDesigning in ComponentState) then Exit;
+ finally
+ // Finally restores the original datatable to the delta
+ if UsingClonedCursor and DeltaInitialized then Delta.AssignDataTable(fCloneSource);
+ end;
+end;
+
+procedure TDADataTable.InternalAfterCancel(Sender: TDataset);
+begin
+ CallScript('AfterCancel');
+ if Assigned(AfterCancel) then AfterCancel(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.AfterCancel(Self);
+
+ GetDelta.CancelChange(Self);
+end;
+
+function TDADataTable.GetLogChanges: boolean;
+begin
+ result := fLogChanges;
+end;
+
+procedure TDADataTable.DisableControls;
+begin
+ fDataset.DisableControls;
+end;
+
+procedure TDADataTable.EnableControls;
+begin
+ fDataset.EnableControls;
+end;
+
+function TDADataTable.GetBOF: boolean;
+begin
+ result := fDataset.BOF
+end;
+
+function TDADataTable.GetEOF: boolean;
+begin
+ result := fDataset.EOF
+end;
+
+function TDADataTable.GetFieldCount: integer;
+begin
+ result := fFields.Count
+end;
+
+function TDADataTable.GetFieldValues(Index: integer): Variant;
+begin
+ result := Fields[Index].Value
+end;
+
+function TDADataTable.GetNames(Index: integer): string;
+begin
+ result := Fields[Index].Name
+end;
+
+function TDADataTable.GetRecordCount: integer;
+begin
+ result := fDataset.RecordCount;
+end;
+
+function TDADataTable.GetSQL: string;
+begin
+ // Not implemented in DataTables
+ result := '';
+end;
+
+function TDADataTable.Locate(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+begin
+ if VarIsArray(KeyValues) and (VarArrayHighBound(KeyValues, 1) = 0)
+ then result := fDataset.Locate(KeyFields, KeyValues[0], Options)
+ else result := fDataset.Locate(KeyFields, KeyValues, Options);
+end;
+
+procedure TDADataTable.Next;
+begin
+ fDataset.Next;
+end;
+
+procedure TDADataTable.SetSQL(const Value: string);
+begin
+ // Not implemented in DataTables
+end;
+
+function TDADataTable.Execute: integer;
+begin
+ // Not implemented in DataTables
+ result := -1;
+end;
+
+function TDADataTable.GetParams: TDAParamCollection;
+begin
+ // Not implemented in DataTables
+ result := fParams;
+end;
+
+procedure TDADataTable.RefreshParams;
+begin
+ // Not implemented in DataTables
+end;
+
+procedure TDADataTable.ReplaceMasterKey(aOldKey, aNewKey: TDAMasterKeyID);
+var
+ i: integer;
+begin
+ if aOldKey = aNewKey then Exit;
+ i := fFetchedMasters.IndexOf(aOldKey);
+ if i <> -1 then begin
+ FreeMasterKey(TDAMasterKeyID(fFetchedMasters.Items[i]));
+ fFetchedMasters.Delete(i);
+ fFetchedMasters.Add(aNewKey);
+ end;
+end;
+
+procedure TDADataTable.Append;
+begin
+ fDataset.Append;
+end;
+
+procedure TDADataTable.Delete;
+begin
+ fDataset.Delete;
+end;
+
+procedure TDADataTable.Cancel;
+begin
+ fDataset.Cancel;
+end;
+
+procedure TDADataTable.Edit;
+begin
+ fDataset.Edit;
+end;
+
+procedure TDADataTable.Insert;
+begin
+ fDataset.Insert;
+end;
+
+procedure TDADataTable.Post;
+begin
+ fDataset.Post;
+end;
+
+{$WARN SYMBOL_DEPRECATED OFF}
+function TDADataTable.GetWhere: TDAWhere;
+begin
+ result := fWhere
+end;
+{$WARN SYMBOL_DEPRECATED ON}
+
+procedure TDADataTable.SetRemoteDataAdapter(const Value: TDACustomDataAdapter);
+begin
+ if Value <> fRemoteDataAdapter then begin
+ if assigned(fRemoteDataAdapter) then fRemoteDataAdapter.RORemoveFreeNotification(self);
+ fRemoteDataAdapter := Value;
+ if assigned(fRemoteDataAdapter) then fRemoteDataAdapter.ROFreeNotification(self);
+ end;
+end;
+
+procedure TDADataTable.Close;
+begin
+ if not Active then Exit;
+
+ fClosing := TRUE;
+ try
+ DoBeforeCloseDataset;
+ if Assigned(BeforeClose) then BeforeClose(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.BeforeClose(Self);
+
+ if (moCascadeOpenClose in MasterOptions) then DoCascadeOperation(nil, moCascadeOpenClose);
+
+ Dataset.Close;
+ fFields.Unbind;
+
+ //Dataset.Fields.Clear;
+ if DeltaInitialized then Delta.CancelChange(Self);
+
+ fDelta := nil;
+
+ fFetchedMasters.Clear;
+
+ DoAfterCloseDataset;
+ if Assigned(AfterClose) then AfterClose(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.AfterClose(Self);
+ finally
+ fClosing := FALSE;
+ end;
+end;
+
+procedure TDADataTable.InitializeDataTable;
+begin
+ fCurrRecId := 1;
+
+ try
+ fDataset.Fields.Clear;
+ fDataset.FieldDefs.Clear;
+ finally
+ NotifyFieldsClear;
+ end;
+ try
+ // Creates the fields for the internal dataset
+ CreateInternalFields(fDataset, Fields);
+ finally
+ NotifyFieldsClear;
+ end;
+
+ fRecIDField := fDataset.FieldByName(RecIDFieldName) as TIntegerField;
+ fRecIDField.Visible := FALSE;
+
+ fFields.Bind(fDataset);
+
+ // Prepares the delta
+ fDelta := TDADelta.Create(Self);
+
+(*
+ // Finishes to prepare the internal dataset (descendant might need additional customization and might not be open)
+ if RemoteFetchEnabled and
+ (RemoteDataAdapter<>nil) and
+ (TDARemoteDataAdapter(RemoteDataAdapter).GetDataCall.Default) then
+ LoadScript();
+*)
+ DoBeforeOpenDataset;
+ if not Dataset.Active then Dataset.Open;
+ DoAfterOpenDataset;
+end;
+
+procedure TDADataTable.LoadFromLocalSchema(AppendMode: Boolean = False);
+var
+ lConnection: IDAConnection;
+ data: TStream;
+ gofirst, oldlog: boolean;
+ ds: IDADataset;
+ i: integer;
+ lDynFields: array of string;
+begin
+ if (LocalSchema = nil) or (LogicalName = '') or fStreaming then begin
+ InitializeDataTable;
+ Exit;
+ end;
+
+ // Local but from schema. Client/Server mode
+ CheckProperties;
+
+ lConnection := LocalSchema.ConnectionManager.NewConnection(fLocalConnection);
+ try
+ SetLength(lDynFields, 0);
+ ds := LocalSchema.NewDataset(lConnection, fLogicalName,lDynFields,fDynamicWhere.Xml);
+ ds.Where.AddText(Where.Clause);
+
+ oldlog := LogChanges;
+ fFetching := TRUE;
+ LogChanges := FALSE;
+ // book := nil;
+
+ data := TROBinaryMemoryStream.Create;
+ TROBinaryMemoryStream(data).CapacityIncrement := LocalDataStreamer.BufferSize;
+ try
+ for i := 0 to (ds.Params.Count - 1) do
+ ds.Params[i].Value := ParamByName(ds.Params[i].Name).Value;
+
+ LocalDataStreamer.WriteDataset(data, ds, [woRows, woSchema], MaxRecords);
+
+ if Active then
+ gofirst := FALSE
+ else
+ gofirst := TRUE;
+
+ if Assigned(fOnReceiveDataStream) then fOnReceiveDataStream(Self, data);
+ if Assigned(fBusinessRules) then fBusinessRules.OnReceiveDataStream(Self, data);
+ data.Position := 0;
+
+ // Reads the data
+ LocalDataStreamer.Initialize(data, aiRead);
+ try
+ if (LocalDataStreamer.DatasetCount = 0) then RaiseError('Stream does not contain any dataset');
+
+ if Opening then begin
+ AppendMode := False;
+ if not (soIgnoreStreamSchema in fStreamingOptions) then LocalDataStreamer.ReadDataset(LogicalName, Self, FieldCount = 0, FALSE);
+
+ InitializeDataTable;
+ end;
+
+ LocalDataStreamer.ReadDataset(LogicalName, Self, FALSE,True, AppendMode);
+ {
+ if (moAllInOneFetch in MasterOptions) then begin
+ DoCascadeOperation(LocalDataStreamer, moAllInOneFetch);
+ end;}
+ finally
+ LocalDataStreamer.Finalize;
+ end;
+
+ if gofirst then First;
+ finally
+ fFetching := FALSE;
+ data.Free;
+ LogChanges := oldlog;
+ end;
+ finally
+ lConnection := nil;
+ end;
+end;
+
+procedure TDADataTable.LoadLocalSchema(aPreserveLookupFields,
+ aPreserveClientCalcFields: Boolean);
+type
+ THandlerArray = array[0..1] of TMethod;
+ PHandlerArray = ^THandlerArray;
+
+const
+ HandlersToSave : array[0..1] of string = ('OnChange', 'OnValidate');
+
+var
+ lFieldHandlers : TStringList;
+ lHandlers : PHandlerArray;
+ lookupfields : TDAFieldCollection;
+ clientcalcfields : TDAFieldCollection;
+ i, j, lIndex: integer;
+ lConnection: IDAConnection;
+ lDataset: IDADataset;
+ data: TStream;
+ ds: TDADataset;
+begin
+ if Active then Close();
+
+ lookupfields := nil;
+ clientcalcfields := nil;
+
+ Fields.FieldEventsDisabled := true;
+
+ try
+ lFieldHandlers := TStringList.Create;
+
+ { Saves the current event handler pointers }
+ for i := 0 to Fields.Count-1 do begin
+ New(lHandlers);
+ for j := Low(HandlersToSave) to High(HandlersToSave) do
+ lHandlers[j] := GetMethodProp(Fields[i], HandlersToSave[j]);
+ lFieldHandlers.AddObject(Fields[i].Name, TObject(lHandlers));
+ end;
+
+ { Save lookup and calced fields}
+ if aPreserveLookupFields then begin
+ lookupfields := TDAFieldCollection.Create(nil);
+ lookupfields.Assign(Fields);
+ for i := (lookupfields.Count-1) downto 0 do
+ if not (lookupfields[i] as TDACustomField).Lookup then
+ lookupfields.Delete(i);
+ end;
+
+ if aPreserveClientCalcFields then begin
+ clientcalcfields := TDAFieldCollection.Create(nil);
+ clientcalcfields.Assign(Fields);
+ for i :=(clientcalcfields.Count-1) downto 0 do
+ if not (clientcalcfields[i] as TDACustomField).Calculated then
+ clientcalcfields.Delete(i);
+ end;
+
+ try
+ if csDesigning in ComponentState then begin
+ ds := LocalSchema.Datasets.DatasetByName(LogicalName);
+ Fields.AssignFieldCollection(ds.Fields);
+ Params.AssignParamCollection(ds.Params);
+ end
+ else begin
+ Fields.Clear;
+ lConnection := LocalSchema.ConnectionManager.NewConnection(fLocalConnection);
+ lDataset := LocalSchema.NewDataset(lConnection, fLogicalName);
+
+ data := TROBinaryMemoryStream.Create;
+ TROBinaryMemoryStream(data).CapacityIncrement := LocalDataStreamer.BufferSize;
+ try
+ LocalDataStreamer.WriteDataset(data, lDataset, [woSchema], MaxRecords);
+ data.Position := 0;
+ LocalDataStreamer.Initialize(data, aiRead);
+ try
+ if (LocalDataStreamer.DatasetCount = 0) then RaiseError('Stream does not contain any dataset');
+ LocalDataStreamer.ReadDataset(LogicalName, Self, true, false);
+ finally
+ LocalDataStreamer.Finalize;
+ end;
+ finally
+ data.Free;
+ end;
+ end;
+
+
+ finally
+ if aPreserveLookupFields then
+ for i := 0 to (lookupfields.Count-1) do
+ Fields.Add.Assign(lookupfields[i]);
+ if aPreserveClientCalcFields then
+ for i := 0 to (clientcalcfields.Count-1) do
+ if not Assigned(Fields.FindField(clientcalcfields[i].Name)) then
+ Fields.Add.Assign(clientcalcfields[i]);
+
+ { restores the old event handler pointers }
+ for i := 0 to Fields.Count-1 do begin
+ lIndex := lFieldHandlers.IndexOf(Fields[i].Name);
+ if lIndex >= 0 then begin
+ lHandlers := PHandlerArray(lFieldHandlers.Objects[lIndex]);
+ for j := Low(HandlersToSave) to High(HandlersToSave) do
+ SetMethodProp(Fields[i], HandlersToSave[j], lHandlers[j]);
+ Dispose(lHandlers);
+ end;
+ end;
+ lFieldHandlers.Free;
+ end;
+ finally
+ clientcalcfields.Free;
+ lookupfields.Free;
+ Fields.FieldEventsDisabled := false;
+ end;
+end;
+
+procedure TDADataTable.DoOpen(IgnoreAutoFetchSettings: Boolean);
+
+ procedure CheckForMaster(aMasterTable, aLookupTable: TDADataTable);
+ begin
+ if aMasterTable = aLookupTable then raise Exception.Create('You can''t use master source as lookup source');
+ if aMasterTable.MasterSource <> nil then CheckForMaster(aMasterTable.MasterSource.DataTable,aLookupTable);
+ end;
+
+ procedure CheckForCloneSource(aSourceTable, aLookupTable: TDADataTable);
+ begin
+ if aSourceTable = aLookupTable then raise Exception.Create('You can''t use clone source as lookup source');
+ if aSourceTable.CloneSource <> nil then CheckForCloneSource(aSourceTable.CloneSource,aLookupTable);
+ end;
+
+var
+ i : integer;
+begin
+ if Active or fOpening then Exit;
+ SetOldMasterKey(nil);
+ fOpening := TRUE;
+ try
+ if (MasterSource <> nil) then
+ if (MasterSource.DataTable <> nil) then begin
+ for i := 0 to (FieldCount-1) do
+ if Fields[i].Lookup and (Fields[i].LookupSource<>NIL) and (Fields[i].LookupSource is TDADataSource) and
+ Assigned(TDADataSource(Fields[i].LookupSource).DataTable) then begin
+ CheckForMaster(MasterSource.DataTable, TDADataSource(Fields[i].LookupSource).DataTable)
+ end;
+ end;
+ if (CloneSource <> nil) then
+ for i := 0 to (FieldCount-1) do
+ if Fields[i].Lookup and (Fields[i].LookupSource<>NIL) and (Fields[i].LookupSource is TDADataSource) and
+ Assigned(TDADataSource(Fields[i].LookupSource).DataTable) then begin
+ CheckForCloneSource(CloneSource,TDADataSource(Fields[i].LookupSource).DataTable);
+ end;
+
+ { Checks that all the lookup datasets are open. If not, we would get the error "Missing Data Provider"}
+ for i := 0 to (FieldCount-1) do
+ if Fields[i].Lookup and (Fields[i].LookupSource<>NIL) then begin
+ if (Fields[i].LookupSource is TDADataSource) then begin
+ if Assigned(TDADataSource(Fields[i].LookupSource).DataTable)
+ then TDADataSource(Fields[i].LookupSource).DataTable.Open;
+ end
+ else begin
+ if Assigned(Fields[i].LookupSource.DataSet)
+ then Fields[i].LookupSource.DataSet.Open;
+ end;
+ end;
+
+
+ if Assigned(BeforeOpen) then BeforeOpen(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.BeforeOpen(Self);
+
+ try
+ if not fFetching then begin
+ if fMasterLink.Active then
+ FetchMastersDetails(nil, nil, IgnoreAutoFetchSettings) // This calls InitializeDataTable possibily applying a new schema
+ else begin
+ if fCloneSource <> nil then begin
+ fCloneSource.Open;
+ if fCloneSource.Active then
+ CloneCursor(fCloneSource)
+ else
+ Exit;
+ end
+ else begin
+ if RemoteFetchEnabled then
+ LoadFromRemoteSource
+ else
+ LoadFromLocalSchema;
+ end;
+ end;
+ end;
+
+ if (moCascadeOpenClose in MasterOptions) then DoCascadeOperation(nil, moCascadeOpenClose);
+
+ if Assigned(AfterOpen) then AfterOpen(Self);
+ if Assigned(fBusinessRules) then fBusinessRules.AfterOpen(Self);
+ except
+ on E: Exception do begin
+ Close;
+ {$IFDEF DESIGNTIME}
+ if (csDesigning in ComponentState) then begin
+ SysUtils.Beep;
+ MessageDlg(E.Message, mtError, [mbOK], 0);
+ end
+ else
+ {$ENDIF DESIGNTIME}
+ raise;
+ end;
+ end;
+ finally
+ fOpening := FALSE;
+ end;
+end;
+
+procedure TDADataTable.Open;
+begin
+ DoOpen(True);
+end;
+
+
+procedure TDADataTable.OnMasterChange(Sender: TObject);
+begin
+ if (MasterSource <> nil) and (MasterSource.DataTable <> nil) then begin
+ if MasterSource.DataTable.fFetching then
+ exit;
+ end;
+
+ FetchMastersDetails;
+end;
+
+procedure TDADataTable.OnMasterDisable(Sender: TObject);
+begin
+
+end;
+
+procedure TDADataTable.LoadFromRemoteSource(BookmarkPosition: boolean = FALSE);
+begin
+ CheckProperties(True);
+ if Assigned(fOnBeforeDataRequestCall) then fOnBeforeDataRequestCall(Self, RemoteDataAdapter.Get_GetDataCall);
+ if Assigned(fBusinessRules) then fBusinessRules.OnBeforeDataRequestCall(Self, RemoteDataAdapter.Get_GetDataCall);
+ RemoteDataAdapter.Fill([self], BookmarkPosition, FieldCount = 0);
+ if Assigned(fOnAfterDataRequestCall) then fOnAfterDataRequestCall(Self, RemoteDataAdapter.Get_GetDataCall);
+ if Assigned(fBusinessRules) then fBusinessRules.OnAfterDataRequestCall(Self, RemoteDataAdapter.Get_GetDataCall);
+end;
+
+function TDADataTable.ApplyUpdates(RefetchAll: boolean = FALSE): boolean;
+begin
+ if (fCloneSource<>NIL) then begin
+ result := fCloneSource.ApplyUpdates(RefetchAll)
+ end
+ else if ruoOnPost in RemoteUpdatesOptions then begin
+ Post;
+ Result := True;
+ end
+ else begin
+ Result := InternalApplyUpdates(RefetchAll);
+ end;
+end;
+
+procedure TDADataTable.Assign(Source: TPersistent);
+var
+ lSource: TDADataTable;
+begin
+ inherited;
+ if Source is TDADataTable then begin
+ lSource := TDADataTable(Source);
+
+ Active := False;
+
+ AfterCancel := lSource.AfterCancel;
+ AfterClose := lSource.AfterClose;
+ AfterDelete := lSource.AfterDelete;
+ AfterEdit := lSource.AfterEdit;
+ AfterInsert := lSource.AfterInsert;
+ AfterOpen := lSource.AfterOpen;
+ AfterPost := lSource.AfterPost;
+ AfterRefresh := lSource.AfterRefresh;
+ AfterScroll := lSource.AfterScroll;
+ BeforeCancel := lSource.BeforeCancel;
+ BeforeClose := lSource.BeforeClose;
+ BeforeDelete := lSource.BeforeDelete;
+ BeforeEdit := lSource.BeforeEdit;
+ BeforeInsert := lSource.BeforeInsert;
+ BeforeOpen := lSource.BeforeOpen;
+ BeforePost := lSource.BeforePost;
+ BeforeRefresh := lSource.BeforeRefresh;
+ BeforeScroll := lSource.BeforeScroll;
+ BusinessRulesID := lSource.BusinessRulesID;
+ CustomAttributes := lSource.CustomAttributes;
+ DetailFields := lSource.DetailFields;
+ DetailOptions := lSource.DetailOptions;
+ Fields := lSource.Fields;
+ Filter := lSource.Filter;
+ Filtered := lSource.Filtered;
+ LocalConnection := lSource.LocalConnection;
+ LocalDataStreamer := lSource.LocalDataStreamer;
+ LocalSchema := lSource.LocalSchema;
+ LogChanges := lSource.LogChanges;
+ LogicalName := lSource.LogicalName;
+ MasterFields := lSource.MasterFields;
+ MasterMappingMode := lSource.MasterMappingMode;
+ MasterOptions := lSource.MasterOptions;
+ MasterParamsMappings := lSource.MasterParamsMappings;
+ MasterRequestMappings := lSource.MasterRequestMappings;
+ MasterSource := lSource.MasterSource;
+ MaxRecords := lSource.MaxRecords;
+ OnAfterApplyUpdates := lSource.OnAfterApplyUpdates;
+ OnAfterDataRequestCall := lSource.OnAfterDataRequestCall;
+ OnAfterDataUpdateCall := lSource.OnAfterDataUpdateCall;
+ OnAfterFieldChange := lSource.OnAfterFieldChange;
+ OnAfterMergeDelta := lSource.OnAfterMergeDelta;
+ OnAfterSchemaCall := lSource.OnAfterSchemaCall;
+ OnAfterScriptCall := lSource.OnAfterScriptCall;
+ OnBeforeApplyUpdates := lSource.OnBeforeApplyUpdates;
+ OnBeforeDataRequestCall := lSource.OnBeforeDataRequestCall;
+ OnBeforeDataUpdateCall := lSource.OnBeforeDataUpdateCall;
+ OnBeforeFieldChange := lSource.OnBeforeFieldChange;
+ OnBeforeMergeDelta := lSource.OnBeforeMergeDelta;
+ OnBeforeSchemaCall := lSource.OnBeforeSchemaCall;
+ OnBeforeScriptCall := lSource.OnBeforeScriptCall;
+ OnCalcFields := lSource.OnCalcFields;
+ OnDeleteError := lSource.OnDeleteError;
+ OnEditError := lSource.OnEditError;
+ OnFilterRecord := lSource.OnFilterRecord;
+ OnLocalUpdateDataBeginTransaction := lSource.OnLocalUpdateDataBeginTransaction;
+ OnLocalUpdateDataCommitTransaction := lSource.OnLocalUpdateDataCommitTransaction;
+ OnLocalUpdateDataRollBackTransaction := lSource.OnLocalUpdateDataRollBackTransaction;
+ OnNewRecord := lSource.OnNewRecord;
+ OnPostError := lSource.OnPostError;
+ OnReceiveDataStream := lSource.OnReceiveDataStream;
+ Params := lSource.Params;
+ ReadOnly := lSource.ReadOnly;
+ RemoteDataAdapter := lSource.RemoteDataAdapter;
+ RemoteUpdatesOptions := lSource.RemoteUpdatesOptions;
+ ScriptCode := lSource.ScriptCode;
+ StoreActive := lSource.StoreActive;
+ StreamingOptions := lSource.StreamingOptions;
+
+ RemoteFetchEnabled := lSource.RemoteFetchEnabled;
+ Active := lSource.Active;
+ end;
+end;
+
+procedure TDADataTable.LoadSchema(PreserveLookupFields : boolean = FALSE; PreserveClientCalcFields : boolean = FALSE);
+begin
+ if RemoteFetchEnabled then begin
+ CheckProperties(True);
+ if Assigned(fOnBeforeSchemaCall) then fOnBeforeSchemaCall(Self, RemoteDataAdapter.Get_GetSchemaCall);
+ if Assigned(fBusinessRules) then fBusinessRules.OnBeforeSchemaCall(self, RemoteDataAdapter.Get_GetSchemaCall);
+ RemoteDataAdapter.FillSchema([self], PreserveLookupFields, PreserveClientCalcFields);
+ if Assigned(fOnAfterSchemaCall) then fOnAfterSchemaCall(Self, RemoteDataAdapter.Get_GetSchemaCall);
+ if Assigned(fBusinessRules) then fBusinessRules.OnAfterSchemaCall(self, RemoteDataAdapter.Get_GetSchemaCall);
+ end
+ else begin
+ CheckProperties(False, True);
+ LoadLocalSchema(PreserveLookupFields, PreserveClientCalcFields);
+ end;
+end;
+
+procedure TDADataTable.LoadScript(aDatasetName : string = '');
+begin
+ CheckProperties(True);
+ if Assigned(fOnBeforeScriptCall) then fOnBeforeScriptCall(Self, RemoteDataAdapter.Get_GetScriptsCall);
+ if Assigned(fBusinessRules) then fBusinessRules.OnBeforeScriptCall(Self, RemoteDataAdapter.Get_GetScriptsCall);
+ RemoteDataAdapter.FillScripts([self]);
+ if Assigned(fOnAfterScriptCall) then fOnAfterScriptCall(Self, RemoteDataAdapter.Get_GetScriptsCall);
+ if Assigned(fBusinessRules) then fBusinessRules.OnAfterScriptCall(Self, RemoteDataAdapter.Get_GetScriptsCall);
+end;
+
+procedure TDADataTable.FetchMastersDetails(aMasterTable : TDADataTable = NIL; aRequestMappings : TStrings = NIL; IgnoreAutoFetchSettings: Boolean = False);
+
+ procedure CombineDynamicWhere(aWhereExpression:TDAWhereExpression);
+ begin
+ if fMasterMappingMode = mmWhere then begin
+ if fDynamicWhere.Expression = nil then
+ fDynamicWhere.Expression:= aWhereExpression
+ else
+ fDynamicWhere.Expression:= fDynamicWhere.NewBinaryExpression(fDynamicWhere.Expression,aWhereExpression,dboAnd);
+ end;
+ end;
+
+ procedure RevertDynamicWhere(aWhereExpression:TDAWhereExpression);
+ var
+ fUserWhereExpression: TDAWhereExpression;
+ begin
+ if fMasterMappingMode = mmWhere then begin
+ fUserWhereExpression:= nil;
+ if fDynamicWhere.Expression <> aWhereExpression then begin
+ fUserWhereExpression:= TDABinaryExpression(fDynamicWhere.Expression).Left;
+ TDABinaryExpression(fDynamicWhere.Expression).Left:=nil;
+ end;
+ fDynamicWhere.Clear;
+ fDynamicWhere.Expression:= fUserWhereExpression;
+ end;
+ end;
+
+
+ function GenerateWhereStatement: TDAWhereExpression;
+ var
+ lFieldName: string;
+ pos1, pos2: integer;
+ lfld1: TDAField;
+ lfld2: TDAField;
+ lExpression: TDAWhereExpression;
+ begin
+ //fDynamicWhere.Clear;
+ Pos1 := 1;
+ pos2 := 1;
+ Result:=nil;
+ while True do begin
+ if (Pos1 > Length(DetailFields)) and (Pos2 > Length(MasterFields)) then Break;
+
+ if ((Pos1 > Length(DetailFields)) and (Pos2 <= Length(MasterFields))) or
+ ((Pos1 <= Length(DetailFields)) and (Pos2 > Length(MasterFields))) then
+ RaiseError('DetailFields should have same number of items as MasterFields');
+
+ {$WARN SYMBOL_DEPRECATED OFF}
+ lFieldName:= ExtractFieldName(DetailFields, Pos1);
+ {$WARN SYMBOL_DEPRECATED ON}
+ lfld1 := FindField(lFieldName);
+ if lfld1 = nil then RaiseError('Invalid field name %s in DetailFields', [lFieldName]);
+ {$WARN SYMBOL_DEPRECATED OFF}
+ lFieldName:= ExtractFieldName(MasterFields, Pos2);
+ {$WARN SYMBOL_DEPRECATED ON}
+ lfld2 := MasterSource.DataTable.Fields.FindField(lFieldName);
+ if lfld2 = nil then RaiseError('Invalid field name %s in MasterFields', [lFieldName]);
+
+ lExpression := fDynamicWhere.NewBinaryExpression(
+ fDynamicWhere.NewField(LogicalName,lfld1.Name),
+ fDynamicWhere.NewConstant(lfld2.Value,lfld2.DataType),
+ dboEqual);
+
+ if Result <> nil then
+ Result:=fDynamicWhere.NewBinaryExpression(Result,lExpression,dboAnd)
+ else
+ Result:= lExpression;
+ end;
+ end;
+
+var
+ master: TDataset;
+ par: TDARemoteRequestParam;
+ fld: TDAField;
+ key: TDAMasterKeyID;
+ i: integer;
+ dofetch: boolean;
+ mappings : TStrings;
+ detailparam : TDAParam;
+ lmmWhereExpression: TDAWhereExpression;
+begin
+ if RemoteFetchEnabled then CheckProperties
+ else if not(Assigned(LocalSchema) and Assigned(LocalDataStreamer)) then begin
+ if fOpening then InitializeDataTable;
+ Exit;
+ end;
+
+ //
+ //
+ // TODO: this doesnt properly use the new RDA's DMB yet. we need to discuss/rethink how to handle that!
+ //
+ //
+
+ mappings := NIL;
+
+ dofetch := (((dtAutoFetch in DetailOptions) or IgnoreAutoFetchSettings) {and RemoteFetchEnabled}) or (aMasterTable<>NIL);
+
+ if (aRequestMappings<>NIL) then mappings := aRequestMappings
+ else begin
+ case fMasterMappingMode of
+ mmDataRequest : mappings := MasterRequestMappings;
+ mmParams : mappings := MasterParamsMappings;
+ end;
+ end;
+
+ if (aMasterTable<>NIL)
+ then master := aMasterTable.Dataset
+ else master := fMasterLink.DataSet;
+
+ if master = nil then exit;
+
+ if (master.RecordCount = 0) then begin
+ if not Active then InitializeDataTable; // Master opened with 0 records and detail wasn't open yet
+
+ Exit;
+ end
+ else if (MasterSource = nil) then Exit;
+ if (master.State=dsBrowse) and not((MasterSource.DataTable.State = dsInsert) or (Active and MasterSource.DataTable.Delta.IsNewRecord)) then begin
+ if dofetch then begin
+ // Determines if the details for this master have been fetched
+ key := GenerateKeyfromMasterRecID;
+ if not IsNeedToFetch(key) then begin
+ FreeMasterKey(Key);
+ Exit;
+ end;
+ try
+ if (fMasterMappingMode = mmWhere) or ((mappings<>NIL) and (mappings.Count > 0)) then begin
+ lmmWhereExpression:=nil;
+ if RemoteFetchEnabled then begin
+ // remotemode
+
+ // If not, then assigns the param values from the current master record,
+ // invokes the remote call and loads the data
+ case MasterMappingMode of
+ mmWhere: begin
+ lmmWhereExpression:=GenerateWhereStatement;
+ end;
+ mmDataRequest : begin
+ for i := 0 to (mappings.Count - 1) do begin
+ par := nil;
+ if RemoteDataAdapter.Get_GetDataCall <> nil then
+ par := RemoteDataAdapter.Get_GetDataCall.Params.ParamByName(Trim(mappings.Names[i]));
+ if (par=NIL) then RaiseError('Invalid parameter name %s in master mappings', [Trim(mappings.Names[i])]);
+
+ fld := MasterSource.DataTable.Fields.FindField(Trim(mappings.Values[mappings.Names[i]]));
+ if (fld=NIL) then RaiseError('Invalid field name %s in master mappings', [Trim(mappings.Values[mappings.Names[i]])]);
+
+ if (par <> nil) and (fld <> nil) and not VarIsNull(fld.Value)
+ then par.AsVariant := fld.Value
+ end;
+ end;
+ mmParams : begin
+ // Fills it in
+ for i := 0 to (mappings.Count - 1) do begin
+ detailparam := Params.ParamByName(Trim(mappings.Names[i]));
+ if (detailparam=NIL) then RaiseError('Invalid parameter name %s in param mappings', [Trim(mappings.Names[i])]);
+
+ fld := MasterSource.DataTable.Fields.FindField(Trim(mappings.Values[mappings.Names[i]]));
+ if (fld=NIL) then RaiseError('Invalid field name %s in param mappings', [Trim(mappings.Values[mappings.Names[i]])]);
+
+ if (detailparam <> nil) and (fld <> nil) and not VarIsNull(fld.Value)
+ then detailparam.Value := fld.Value
+ end;
+ end;
+ end;
+
+ CombineDynamicWhere(lmmWhereExpression);
+ try
+ LoadFromRemoteSource;
+ finally
+ RevertDynamicWhere(lmmWhereExpression);
+ end;
+
+ try
+ AddMasterKey(key);
+ except
+ raise Exception.CreateFmt('Master record %s has been fetched twice', [key]);
+ end;
+ end { RemoteFetchEnabled }else begin
+ // localmode
+
+ // If not, then assigns the param values from the current master record,
+ // invokes the remote call and loads the data
+ case MasterMappingMode of
+ mmWhere: begin
+ lmmWhereExpression := GenerateWhereStatement;
+ end;
+ mmParams: begin
+ // Fills it in
+ for i := 0 to (mappings.Count - 1) do begin
+ detailparam := Params.ParamByName(Trim(mappings.Names[i]));
+ if (detailparam=NIL) then RaiseError('Invalid parameter name %s in param mappings', [Trim(mappings.Names[i])]);
+
+ fld := MasterSource.DataTable.Fields.FindField(Trim(mappings.Values[mappings.Names[i]]));
+ if (fld=NIL) then RaiseError('Invalid field name %s in param mappings', [Trim(mappings.Values[mappings.Names[i]])]);
+
+ if (detailparam <> nil) and (fld <> nil) and not VarIsNull(fld.Value) then detailparam.Value := fld.Value
+ end;
+ end;
+ mmDataRequest: raise Exception.Create('mmDataRequest mode only supported in RemoteFetchEnabled mode');
+ end;
+
+ CombineDynamicWhere(lmmWhereExpression);
+ try
+ LoadFromLocalSchema;
+ finally
+ RevertDynamicWhere(lmmWhereExpression);
+ end;
+
+ try
+ AddMasterKey(key);
+ except
+ raise Exception.CreateFmt('Master record %s has been fetched twice', [key]);
+ end;
+ end;
+ end else begin
+ { ALEF: I removed the code below because it was never meant to be here to begin with. Very error prone.
+ Who added this???
+
+ // Automatics
+ for i := 0 to (DataRequestCall.Params.Count - 1) do begin
+ par := DataRequestCall.Params[i];
+ fld := MasterSource.DataTable.Fields.FindField(par.Name);
+
+ if (par <> nil) and (fld <> nil) and not VarIsNull(fld.Value) then par.Value := fld.Value;
+ end;}
+
+ RaiseError('There are no mappings defined. Cannot fetch records for detail table '+Name);
+ end;
+ except
+ FreeMasterKey(key);
+ end;
+ end; {dofetch}
+ end;
+end;
+
+procedure TDADataTable.WriteDeltaToStream(aStreamer: TDADataStreamer);
+var
+ i: integer;
+ details: TList;
+ lHasReducedDelta: Boolean;
+ oldMode: boolean;
+begin
+ // And the details' updates (if specified)
+ details := GetDetailTablesforApplyUpdate(False);
+ try
+ lHasReducedDelta:= fHasReducedDelta;
+ if not aStreamer.SendReducedDelta then begin
+ if not lHasReducedDelta then
+ for i := 0 to (details.Count - 1) do begin
+ lHasReducedDelta:= TDADataTable(details[i]).fHasReducedDelta;
+ if lHasReducedDelta then Break;
+ end;
+ end;
+ oldMode:=aStreamer.SendReducedDelta;
+ if lHasReducedDelta then aStreamer.SendReducedDelta:=True;
+ try
+ // Writes its own updates
+ if self.HasDelta then aStreamer.WriteDelta(Self);
+ for i := 0 to (details.Count - 1) do
+ TDADataTable(details[i]).WriteDeltaToStream(aStreamer);
+ finally
+ aStreamer.SendReducedDelta := oldMode;
+ end;
+ finally
+ details.Free;
+ end;
+end;
+
+procedure TDADataTable.ReadDeltaFromStream(aStreamer: TDADataStreamer;aFailedDeltas:TList);
+var
+ i: integer;
+ details: TList;
+begin
+ // Reads its own updates
+ if aStreamer.FindDeltaIndex(Self.LogicalName) <> -1 then begin
+ Delta.Clear;
+ aStreamer.ReadDelta(Self);
+ if Delta.Count>0 then fHasReducedDelta := aStreamer.HasReducedDelta;
+
+ For i := 0 to Delta.Count-1 do
+ if Delta.Changes[i].Status = csFailed then
+ aFailedDeltas.Add(Delta.Changes[i]);
+ end;
+
+ // And the details' updates (if specified)
+ details := GetDetailTablesforApplyUpdate(False);
+ try
+ for i := 0 to (details.Count - 1) do
+ TDADataTable(details[i]).ReadDeltaFromStream(aStreamer, aFailedDeltas);
+ finally
+ details.Free;
+ end;
+end;
+
+procedure TDADataTable.ReadDeltaFromStream(aStreamer: TDADataStreamer);
+var
+ i: integer;
+ details: TList;
+begin
+ Delta.Clear;// moved out of condition below. if there is no such delta in stream then all were fine on server side
+ // Reads its own updates
+ if aStreamer.FindDeltaIndex(Self.LogicalName) <> -1 then begin
+ //Delta.Clear;
+ aStreamer.ReadDelta(Self);
+ if Delta.Count>0 then fHasReducedDelta := aStreamer.HasReducedDelta;
+ end;
+
+ // And the details' updates (if specified)
+ details := GetDetailTablesforApplyUpdate(False);
+ try
+ for i := 0 to (details.Count - 1) do
+ TDADataTable(details[i]).ReadDeltaFromStream(aStreamer);
+ finally
+ details.Free;
+ end;
+end;
+
+procedure TDADataTable.MergeDelta;
+var
+ i, k, x: integer;
+ details: TList;
+// dt: TDADataTable;
+// ok : boolean;
+// failed, pending, resolved : integer;
+ oldval, newval : Variant;
+ fld : TDAField;
+ pkfields : string;
+ oldopt : TDARemoteUpdatesOptions;
+ oldlog : boolean;
+ keynames: array of string;
+ keyvals : array of variant;
+ oldmastersource : TDADataSource;
+ lhasDelta: Boolean;
+ pk_array: array of boolean;
+ lReadOnly: boolean;
+ key_cnt: integer;
+begin
+ details:=GetDetailTablesforApplyUpdate(False);
+ try
+ //fOnBeforeMergeDelta
+ if Assigned(fOnBeforeMergeDelta) then fOnBeforeMergeDelta(Self);
+ {for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fOnBeforeMergeDelta) then dt.fOnBeforeMergeDelta(dt);
+ end;}
+
+ //fBusinessRules.OnBeforeMergeDelta
+ if Assigned(fBusinessRules) then fBusinessRules.OnBeforeMergeDelta(Self);
+ {for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fBusinessRules) then dt.fBusinessRules.OnBeforeMergeDelta(dt);
+ end;}
+
+ oldopt := RemoteUpdatesOptions;
+ oldlog := LogChanges;
+ oldmastersource := MasterSource;
+
+ lhasDelta := Delta.Count > 0;
+ if lhasDelta then begin
+ RemoteUpdatesOptions := RemoteUpdatesOptions-[ruoOnPost];
+ LogChanges := FALSE;
+ // Disables the M/D relationship so that Locates can work in all cases (master or detail tables, regardless
+ // of their positioning)
+ if not (ruoOnPost in oldopt) then MasterSource := NIL;
+ end;
+
+ try
+ pkfields := '';
+ key_cnt:=Delta.KeyFieldCount;
+ SetLength(keynames, key_cnt);
+ if key_cnt > 0 then begin
+ for i := 0 to (key_cnt-1) do
+ keynames[i]:=Delta.KeyFieldNames[i];
+ end
+ else begin
+ // use AutoInc as PK
+ SetLength(keynames, Delta.LoggedFieldCount);
+ for i := 0 to (Delta.LoggedFieldCount-1) do
+ if Delta.LoggedFieldTypes[i] in [datAutoInc, datLargeAutoInc] then begin
+ keynames[key_cnt]:=Delta.LoggedFieldNames[i];
+ inc(key_cnt);
+ end;
+ SetLength(keynames, key_cnt);
+ end;
+
+ For i:=0 to key_cnt -1 do
+ pkfields := pkfields+keynames[i]+';';
+ if pkfields <> '' then pkfields := Copy(pkfields, 1, Length(pkfields)-1);
+ SetLength(keyvals, key_cnt);
+
+ // Merges the updates
+ if (Delta.Count>0) then begin
+ SetLength(pk_array, Delta.LoggedFieldCount);
+ for i := 0 to Delta.LoggedFieldCount - 1 do
+ pk_array[i]:=False;
+
+ for i := 0 to key_cnt - 1 do begin
+ x := Delta.IndexOfLoggedField(keynames[i]);
+ if x <> -1 then pk_array[x]:=True;
+ end;
+ for i := (Delta.Count-1) downto 0 do begin
+ if (Delta[i].Status = csPending) then continue;
+ if (Delta[i].ChangeType<>ctDelete) then begin
+ if (Self.State in [dsEdit, dsInsert]) and (ruoOnPost in oldopt) then begin
+ // Merge the details
+ for x := 0 to (details.Count - 1) do
+ TDADataTable(details[x]).MergeDelta;
+ for x := 0 to (Delta.LoggedFieldCount-1) do begin
+ fld := FindField(Delta.LoggedFieldNames[x]);
+ if fld <> nil then begin
+ newval := Delta[i].NewValueByName[fld.Name];
+ oldval := Delta[i].OldValueByName[fld.Name];
+ if fHasReducedDelta then begin
+ if not pk_array[x] and ROVariantsEqual(oldVal,newVal) then continue;
+ end;
+ if fld.ServerAutoRefresh or (not VarIsArray(newVal) and not ROVariantsEqual(newval,oldval)) then begin
+ VariantToFieldValue(Delta[i].NewValueByName[fld.Name], fld);
+ end;
+ end;
+ end;
+ end
+ else begin
+ for k := 0 to (key_cnt-1) do
+ keyvals[k] := Delta[i].OldValueByName[keynames[k]];
+
+ // Locates the original record
+ First;
+ if not Locate(pkfields, keyvals, []) then Continue;
+
+ // Merge the details
+ for x := 0 to (details.Count - 1) do
+ TDADataTable(details[x]).MergeDelta;
+
+ // Merges its own updates
+ Edit;
+ for x := 0 to (Delta.LoggedFieldCount-1) do begin
+ fld := FieldByName(Delta.LoggedFieldNames[x]);
+
+ newval := Delta[i].NewValueByName[fld.Name];
+ oldval := Delta[i].OldValueByName[fld.Name];
+ if fHasReducedDelta then begin
+ if not pk_array[x] and ROVariantsEqual(oldVal,newVal) then continue;
+ end;
+ if fld.ServerAutoRefresh or (not VarIsArray(newVal) and (newval<>oldval)) then begin
+ lReadOnly := fld.ServerAutoRefresh and fld.ReadOnly;
+ if lReadOnly then fld.ReadOnly:=False;
+ VariantToFieldValue(Delta[i].NewValueByName[fld.Name], fld);
+ if lReadOnly then fld.ReadOnly:=True;
+ end;
+ end;
+ Post;
+ end;
+ end;
+ // Removes this merged change
+ if (Delta[i].Status = csResolved) then Delta.Delete(i);
+ end;
+ end
+
+ // If there are no updates for this master, the children still need to be processed
+ else begin
+ // Merge the details
+ for x := 0 to (details.Count - 1) do
+ TDADataTable(details[x]).MergeDelta;
+ end;
+ finally
+ if lhasDelta then begin
+ RemoteUpdatesOptions := oldopt;
+ LogChanges := oldlog;
+
+ // Restores the M/D relationship
+ if not (ruoOnPost in oldopt) then MasterSource := oldmastersource;
+ end;
+ //fOnAfterMergeDelta
+ if Assigned(fOnAfterMergeDelta) then fOnAfterMergeDelta(Self);
+ {for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fOnAfterMergeDelta) then dt.fOnAfterMergeDelta(dt);
+ end;}
+
+ //fBusinessRules.OnAfterMergeDelta
+ if Assigned(fBusinessRules) then fBusinessRules.OnAfterMergeDelta(Self);
+ {for i := 0 to details.Count-1 do begin
+ dt:= TDADataTable(details[i]);
+ if Assigned(dt.fBusinessRules) then dt.fBusinessRules.OnAfterMergeDelta(dt);
+ end;}
+ end;
+ finally
+ details.Free;
+ if Delta.Count = 0 then fHasReducedDelta:=False;
+ end;
+end;
+
+
+procedure TDADataTable.PackAllInOneFetchInfoArray(aDataTable : TDADataTable; OutArray: TDADatasetRequestInfoArray);
+var outinfo : TDADatasetRequestInfo;
+ details : TList;
+ dt : TDADataTable;
+ i : integer;
+begin
+ outinfo := outarray.Add;
+ outinfo.DatasetName := UTF8Encode(aDataTable.LogicalName);
+ outinfo.MaxRecords := aDataTable.MaxRecords;
+ outinfo.IncludeSchema := TRUE;
+ outinfo.Params := NIL;
+
+ details := aDataTable.GetDetailDataTables;
+ try
+ for i := 0 to (details.Count - 1) do begin
+ dt := TDADataTable(details[i]);
+
+ if (dtIncludeInAllInOneFetch in dt.DetailOptions)
+ then PackAllInOneFetchInfoArray(dt, OutArray);
+ end;
+ finally
+ details.Free;
+ end;
+end;
+
+function TDADataTable.FieldByName(const aName: string): TDAField;
+begin
+ result := fFields.FieldByName(aName)
+end;
+
+function TDADataTable.ParamByName(const aName: string): TDAParam;
+begin
+ result := fParams.ParamByName(aName)
+end;
+
+procedure TDADataTable.First;
+begin
+ fDataset.First
+end;
+
+procedure TDADataTable.Last;
+begin
+ fDataset.Last
+end;
+
+procedure TDADataTable.Prior;
+begin
+ fDataset.Prior
+end;
+
+procedure TDADataTable.Sort(const FieldNames: array of string; const Directions: array of TDASortDirection);
+var
+ i: integer;
+begin
+ DoSort(FieldNames, Directions);
+
+ // Stores the new settings for convenience
+ SetLength(fSortDirections, Length(Directions));
+ for i := 0 to Length(Directions) - 1 do
+ fSortDirections[i] := Directions[i];
+
+ SetLength(fSortFieldNames, Length(FieldNames));
+ for i := 0 to Length(FieldNames) - 1 do
+ fSortFieldNames[i] := FieldNames[i];
+end;
+
+procedure TDADataTable.UnSort;
+begin
+ Sort([], []);
+end;
+
+procedure TDADataTable.LoadFromStream(aStream: TStream);
+var
+ //remfetch,
+ oldlogchanges, oldcascadeopenclose: boolean;
+ lStreamer: TDADataStreamer;
+ i: integer;
+begin
+ Check(RemoteFetchEnabled, Name+'. Cannot do this operation when RemoteFetchEnabled is set to TRUE');
+ if RemoteDataAdapter <> nil then
+ lStreamer:=RemoteDataAdapter.DataStreamer
+ else
+ lStreamer:=LocalDataStreamer;
+
+ Check(lStreamer = nil, Name+'. RemoteDataAdapter or LocalDataStreamer must be assigned.');
+
+ Close;
+
+ oldlogchanges := LogChanges;
+// remfetch := RemoteFetchEnabled;
+ oldcascadeopenclose := moCascadeOpenClose in fMasterOptions;
+
+// RemoteFetchEnabled := FALSE;
+ LogChanges := FALSE;
+ if oldcascadeopenclose then fMasterOptions := fMasterOptions - [moCascadeOpenClose];
+ try
+ fStreaming := True;
+ lStreamer.Initialize(aStream, aiRead);
+ try
+ if not (soIgnoreStreamSchema in fStreamingOptions) then
+ lStreamer.ReadDataset(LogicalName, Self, TRUE)
+ else
+ lStreamer.ReadDataset(LogicalName, Self, FALSE);
+
+ lStreamer.ReadDelta(Self);
+ if Delta <> nil then
+ For i:= 0 to Delta.Count-1 do
+ if fCurrRecId <= Delta.Changes[i].RecID then
+ fCurrRecId := Delta.Changes[i].RecID+1;
+ finally
+ lStreamer.Finalize;
+ fStreaming := False;
+ end;
+ finally
+ LogChanges := oldlogchanges;
+// RemoteFetchEnabled := remfetch;
+ if oldcascadeopenclose then begin
+ fMasterOptions := fMasterOptions + [moCascadeOpenClose];
+ fOpening := True;
+ try
+ DoCascadeOperation(nil, moCascadeOpenClose);
+ finally
+ fOpening := False;
+ end;
+ end;
+ if Active then First;
+ end;
+end;
+
+procedure TDADataTable.SaveToStream(aStream: TStream);
+var
+ lStreamer: TDADataStreamer;
+ OldMasterSource: TDADataSource;
+ oldFiltered: Boolean;
+begin
+ oldFiltered := False;
+ if (soDisableEventsWhileStreaming in fStreamingOptions) then DisableControls;
+ if (soDisableFiltering in fStreamingOptions) then begin
+ oldFiltered := Filtered;
+ Filtered := False;
+ end;
+
+ try
+ OldMasterSource := MasterSource;
+ MasterSource := nil;
+ fStreaming := True;
+ try
+ First; // Important!
+ if RemoteFetchEnabled then
+ lStreamer:= RemoteDataAdapter.DataStreamer
+ else
+ lStreamer:=LocalDataStreamer;
+ if lStreamer = nil then CheckProperties;
+ lStreamer.Initialize(aStream, aiWrite);
+ try
+ lStreamer.WriteDataset(Self, [woRows, woSchema]);
+ lStreamer.WriteDelta(Self);
+ finally
+ lStreamer.Finalize;
+ end;
+ finally
+ fStreaming := False;
+ MasterSource := OldMasterSource;
+ end;
+ finally
+ if (soDisableFiltering in fStreamingOptions) then begin
+ Filtered := oldFiltered;
+ end;
+ if (soDisableEventsWhileStreaming in fStreamingOptions) then EnableControls;
+ end;
+end;
+
+procedure TDADataTable.LoadFromFile(const aFileName: string);
+var
+ fs: TFileStream;
+ oldval : boolean;
+begin
+ oldval := RemoteFetchEnabled;
+ RemoteFetchEnabled := FALSE;
+ try
+ fs := TFileStream.Create(aFileName, fmOpenRead);
+ try
+ LoadFromStream(fs);
+ finally
+ fs.Free;
+ end;
+ finally
+ RemoteFetchEnabled := oldval;
+ end;
+end;
+
+procedure TDADataTable.SaveToFile(const aFileName: string);
+var
+ fs: TFileStream;
+begin
+ fs := TFileStream.Create(aFileName, fmCreate);
+ try
+ SaveToStream(fs);
+ finally
+ fs.Free;
+ end;
+end;
+
+procedure TDADataTable.SetParams(const Value: TDAParamCollection);
+begin
+ fParams.Assign(Value);
+end;
+
+procedure TDADataTable.ClearFields;
+var
+ i: integer;
+begin
+ for i := 0 to FieldCount - 1 do
+ Fields[i].Value := Null;
+end;
+
+procedure TDADataTable.ClearRows(const aClearDelta: Boolean = False);
+var
+ lold_Filtered: Boolean;
+ lold_logChanges: boolean;
+begin
+ lold_Filtered:= Filtered;
+ lold_logChanges := LogChanges;
+// DisableControls;
+ try
+ Filtered := False;
+ if aClearDelta then LogChanges := False;
+ if DeltaInitialized then GetDelta.CancelChangesInAllTables;
+ while (RecordCount > 0) do Delete;
+ if aClearDelta and DeltaInitialized then GetDelta.Clear;
+ finally
+ Filtered := lold_Filtered;
+ LogChanges := lold_logChanges;
+// EnableControls;
+ end;
+end;
+
+function TDADataTable.GetState: TDataSetState;
+begin
+ result := fDataset.State
+end;
+
+function TDADataTable.GetEditing: boolean;
+begin
+ result := State in [dsEdit, dsInsert]
+end;
+
+function TDADataTable.GetPrepared: boolean;
+begin
+ result := FALSE
+end;
+
+procedure TDADataTable.SetPrepared(Value: boolean);
+begin
+
+end;
+
+function TDADataTable.GetText: string;
+begin
+ result := ''
+end;
+
+procedure TDADataTable.SetText(const Value: string);
+begin
+
+end;
+
+procedure TDADataTable.Notification(AComponent: TComponent;
+ Operation: TOperation);
+var
+ i: Integer;
+begin
+ inherited;
+
+ if (Operation = opRemove) then begin
+ if (AComponent = fLocalSchema) then fLocalSchema := nil;
+ if (AComponent = fRemoteDataAdapter) then fRemoteDataAdapter := nil;
+ if (AComponent = fLocalDataStreamer) then fLocalDataStreamer := nil;
+ if AComponent is TDataSource then begin
+ for i := 0 to Fields.Count - 1 do begin
+ if Fields[i].LookupSource = AComponent then
+ Fields[i].LookupSource := nil;
+ end;
+ end;
+
+ end;
+
+end;
+
+procedure TDADataTable.SetMasterSource(const Value: TDADataSource);
+begin
+ fMasterLink.DataSource := Value;
+end;
+
+procedure TDADataTable.SetMasterFields(const Value: string);
+begin
+ fMasterLink.FieldNames := Value;
+end;
+
+function TDADataTable.GetMasterRequestMappings: TStrings;
+begin
+ result := fMasterRequestMappings;
+end;
+
+procedure TDADataTable.SetMasterRequestMappings(const Value: TStrings);
+begin
+ fMasterRequestMappings.Assign(Value);
+end;
+
+function TDADataTable.GetDetailDataTables: TList;
+var
+ i: integer;
+ ownerdt: TDADataTable;
+ dtdataset: IDADataTableDataset;
+ tmplist: TList;
+begin
+ // This function only returns the linked datatables and removes duplicates
+ // from the GetDetailDataSets call. I assume the duplicates are because of
+ // the masterlink TDADatatables create.
+
+ result := TList.Create;
+ tmplist := TList.Create;
+
+ try
+ {$IFNDEF FPC}
+ Dataset.GetDetailDataSets(tmplist);
+ {$ENDIF}
+ for i := 0 to (tmplist.Count - 1) do begin
+ if not Supports(TDataset(tmplist[i]), IDADataTableDataset, dtdataset) then Continue;
+ ownerdt := dtdataset.GetDataTable;
+
+ if (result.IndexOf(ownerdt) < 0) then result.Add(ownerdt);
+ end;
+ finally
+ tmplist.Free;
+ end;
+end;
+
+function TDADataTable.GetDelta: IDADelta;
+begin
+ if UsingClonedCursor then
+ Result := fCloneSource.GetDelta
+ else
+ Result := fDelta;
+ if (Result = nil) then raise Exception.Create('Delta has not yet been initialized by the datatable');
+end;
+
+function TDADataTable.GetName: string;
+begin
+ if (LogicalName = '') then
+ result := Name
+ else
+ result := LogicalName;
+end;
+
+procedure TDADataTable.DoAfterCloseDataset;
+begin
+ CallScript('AfterClose');
+ fCloneSource := NIL;
+end;
+
+procedure TDADataTable.DoAfterOpenDataset;
+begin
+ CallScript('AfterOpen');
+
+ if Assigned(fAfterOpenIDataset) then fAfterOpenIDataset(Self, '', ROGetTickCount-fOpenTick);
+end;
+
+procedure TDADataTable.DoBeforeCloseDataset;
+begin
+ if (fCloneSource<>NIL) then Fields.Clear;
+ CallScript('BeforeClose');
+end;
+
+procedure TDADataTable.CloneSelectedRecord(Source: TDADataTable; DoPost: boolean = TRUE);
+begin
+ CloneSelectedRecord(Source as IDADataset, DoPost);
+end;
+
+procedure TDADataTable.CloneSelectedRecord(const Source: IDADataset; DoPost: boolean = TRUE);
+var
+ i: integer;
+ destfld,
+ srcfld: TDAField;
+ lreadonly: boolean;
+begin
+ Insert;
+ for i := 0 to (Source.FieldCount - 1) do begin
+ srcfld := Source.Fields[i];
+ destfld := Fields.FindField(srcfld.Name);
+ lreadonly := destfld.ReadOnly;
+ destfld.ReadOnly := False;
+ try
+ if destfld <> nil then destfld.Value := srcfld.Value;
+ finally
+ destfld.ReadOnly := lreadonly;
+ end;
+ end;
+ if DoPost then Post;
+end;
+
+procedure TDADataTable.FreeBookmark(Bookmark: TBookmark);
+begin
+ Dataset.FreeBookmark(Bookmark);
+end;
+
+function TDADataTable.GetBookmark: TBookmark;
+begin
+ result := Dataset.GetBookmark;
+end;
+
+procedure TDADataTable.GotoBookmark(Bookmark: TBookmark);
+begin
+ Dataset.GotoBookmark(Bookmark);
+end;
+
+function TDADataTable.GetRowRecIDValue: integer;
+begin
+ result := fRecIDField.AsInteger
+end;
+
+procedure TDADataTable.DisableEventHandlers;
+begin
+ DetachEventHooks(Dataset);
+end;
+
+procedure TDADataTable.EnableEventHandlers;
+begin
+ AttachEventHooks(Dataset);
+end;
+
+procedure TDADataTable.Refresh;
+begin
+ fDataset.Refresh;
+end;
+
+procedure TDADataTable.RefreshFromServer;
+begin
+ if (not Active) or (FieldCount = 0) then begin
+ Open;
+ end
+ else begin
+ CheckProperties;
+ Check(Delta.Count > 0, Name+': Can''t perform RefreshFromServer - uncommited changes are present');
+ if RemoteFetchEnabled then begin
+ if Assigned(fOnBeforeDataRequestCall) then fOnBeforeDataRequestCall(Self, RemoteDataAdapter.Get_GetDataCall);
+ if Assigned(fBusinessRules) then fBusinessRules.OnBeforeDataRequestCall(Self, RemoteDataAdapter.Get_GetDataCall);
+ RemoteDataAdapter.Fill([self], True, False, True);
+ if Assigned(fOnAfterDataRequestCall) then fOnAfterDataRequestCall(Self, RemoteDataAdapter.Get_GetDataCall);
+ if Assigned(fBusinessRules) then fBusinessRules.OnAfterDataRequestCall(Self, RemoteDataAdapter.Get_GetDataCall);
+ end
+ else begin
+ LoadFromLocalSchema(True);
+ end;
+ end;
+end;
+
+procedure TDADataTable.SetLocalDataStreamer(const Value: TDADataStreamer);
+begin
+ if fLocalDataStreamer <> Value then begin
+ if (fLocalDataStreamer <> nil) then fLocalDataStreamer.RORemoveFreeNotification(Self);
+ fLocalDataStreamer := Value;
+ if (fLocalDataStreamer <> nil) then fLocalDataStreamer.ROFreeNotification(Self);
+ end;
+end;
+
+procedure TDADataTable.SetLocalSchema(const Value: TDASchema);
+begin
+ if fLocalSchema <> Value then begin
+ if (fLocalSchema <> nil) then fLocalSchema.RORemoveFreeNotification(Self);
+ fLocalSchema := Value;
+ if (fLocalSchema <> nil) then begin
+ fLocalSchema.ROFreeNotification(Self);
+
+ if not (csLoading in ComponentState) then RemoteFetchEnabled := FALSE;
+ end;
+ end;
+end;
+
+function TDADataTable.DataReaderFirst: boolean;
+begin
+ result := RecordCount > 0;
+ if result then First;
+end;
+
+function TDADataTable.DataReaderNext: boolean;
+begin
+ result := not EOF;
+ if result then Next;
+end;
+
+function TDADataTable.GetAsBoolean(Index: integer): boolean;
+begin
+ result := fFields[Index].AsBoolean;
+end;
+
+function TDADataTable.GetAsBoolean(const FieldName: string): boolean;
+begin
+ result := FieldByName(FieldName).AsBoolean;
+end;
+
+function TDADataTable.GetAsCurrency(Index: integer): Currency;
+begin
+ Result:= fFields[Index].AsCurrency;
+end;
+
+function TDADataTable.GetAsCurrency(const FieldName: string): currency;
+begin
+ result := FieldByName(FieldName).AsCurrency;
+end;
+
+function TDADataTable.GetAsDateTime(const FieldName: string): TDateTime;
+begin
+ result := FieldByName(FieldName).AsDateTime;
+end;
+
+function TDADataTable.GetAsDateTime(Index: integer): TDateTime;
+begin
+ result := fFields[Index].AsDateTime;
+end;
+
+function TDADataTable.GetAsFloat(const FieldName: string): double;
+begin
+ result := FieldByName(FieldName).AsFloat;
+end;
+
+function TDADataTable.GetAsFloat(Index: integer): double;
+begin
+ result := fFields[Index].AsFloat;
+end;
+
+function TDADataTable.GetAsInteger(Index: integer): integer;
+begin
+ result := fFields[Index].AsInteger;
+end;
+
+function TDADataTable.GetAsInteger(const FieldName: string): integer;
+begin
+ result := FieldByName(FieldName).AsInteger;
+end;
+
+function TDADataTable.GetAsString(const FieldName: string): string;
+begin
+ result := FieldByName(FieldName).AsString;
+end;
+
+function TDADataTable.GetAsString(Index: integer): string;
+begin
+ result := fFields[Index].AsString;
+end;
+
+function TDADataTable.GetAsVariant(const FieldName: string): variant;
+begin
+ result := FieldByName(FieldName).Value;
+end;
+
+function TDADataTable.GetAsVariant(Index: integer): variant;
+begin
+ result := fFields[Index].Value
+end;
+
+function TDADataTable.GetFieldIndexes(const aName: string): integer;
+begin
+ result := fFields.FindItem(aName).Index
+end;
+
+function TDADataTable.GetFieldNames(Index: integer): string;
+begin
+ result := fFields[Index].Name
+end;
+
+procedure TDADataTable.SetBusinessRulesID(const Value: string);
+var
+ bizclass: TDADataTableRulesClass;
+begin
+ if (Value = fBusinessRulesID) then Exit;
+
+ if Assigned(fBusinessRules) then begin
+ fBusinessRules.Detach(Self);
+ FreeAndNIL(fBusinessRules);
+ end;
+
+ fBusinessRulesID := Trim(Value);
+
+ if (fBusinessRulesID <> '') and not (csDesigning in ComponentState) then begin
+ Check(not FindDataTableRules(Value, bizclass), 'Invalid BusinessRulesID "%s"', [Value]);
+
+ fBusinessRules := bizclass.Create(Self);
+ fBusinessRules.Attach(Self);
+ end;
+end;
+
+function TDADataTable.QueryInterface(const IID: TGUID; out Obj): HResult;
+begin
+ result := inherited QueryInterface(IID, Obj);
+
+ if (result <> S_OK) and Assigned(fBusinessRules) then begin
+ // Users might introduce specific interfaces at the business rule level
+ // This allows to type cast the data table to any additional business oriented interface
+ // they decide to create.
+ result := fBusinessRules.QueryInterface(IID, Obj);
+ end;
+end;
+
+function TDADataTable.GetHasDelta: boolean;
+begin
+ result := DeltaInitialized and (GetDelta.Count > 0);
+end;
+
+function TDADataTable.GetHasDeltaRecursive: boolean;
+var
+ lDetails: TList;
+ lTable: TDADataTable;
+ i: integer;
+begin
+ result := DeltaInitialized and (GetDelta.Count > 0);
+ if not result then begin
+ lDetails := nil;
+ if (moCascadeApplyUpdates in fMasterOptions) then try
+ lDetails := GetDetailDataTables;
+ for i := 0 to (lDetails.Count-1) do begin
+ lTable := TDADataTable(lDetails[i]);
+ if lTable.HasDeltaRecursive then begin
+ result := true;
+ exit;
+ end;
+ end;
+ finally
+ lDetails.Free;
+ end;
+ end;
+end;
+
+function TDADataTable.GetMasterDataTable: TDADataTable;
+var lDatatableDataset : IDADataTableDataset;
+begin
+ if Supports(fMasterLink.DataSet, IDADataTableDataset, lDatatableDataset)
+ then result := lDatatableDataset.GetDataTable
+ else result := NIL;
+end;
+
+function TDADataTable.GetRecNo: integer;
+begin
+ result := fDataset.RecNo
+end;
+
+procedure TDADataTable.SetRecNo(const Value: integer);
+begin
+ fDataset.RecNo := Value
+end;
+
+function TDADataTable.GetFieldsProperty: TDAFieldCollection;
+begin
+ result := GetFields;
+end;
+
+function TDADataTable.GetActiveProperty: boolean;
+begin
+ result := GetActive();
+end;
+
+procedure TDADataTable.SetActiveProperty(const Value: boolean);
+begin
+ SetActive(Value);
+end;
+
+function TDADataTable.GetParamsProperty: TDAParamCollection;
+begin
+ result := GetParams();
+end;
+
+{$IFDEF MSWINDOWS}
+function TDADataTable.InterfaceSupportsErrorInfo(const iid: TGUID): HResult;
+begin
+ if GetInterfaceEntry(iid) <> nil then
+ Result := S_OK
+ else
+ Result := S_FALSE;
+end;
+
+function TDADataTable.SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult;
+begin
+ Result := uDAEngine.DAHandleSafeCallException(self,ExceptObject, ExceptAddr);
+end;
+{$ENDIF}
+
+procedure TDADataTable.CancelUpdates(IncludeDetails: boolean);
+var list : TList;
+ i, orignextinc : integer;
+ wasfiltered,
+ remotefetch : boolean;
+ lOldMasterFields: string;
+ IRC: IDARangeController;
+begin
+ if DeltaInitialized then GetDelta.CancelChangesInAllTables;
+ if not LogChanges then Exit;
+
+ DisableControls;
+ wasfiltered := Filtered;
+ Filtered := FALSE;
+ if GetRangeState and (QueryInterface(IDARangeController,IRC) = 0) then IRC.CancelRange else IRC := nil;
+ try
+ // Truns off the remote fetching for this datatable and its details
+ remotefetch := RemoteFetchEnabled;
+ RemoteFetchEnabled := FALSE;
+ if IncludeDetails then list := GetDetailDataTables else list := TList.Create;
+
+ // Disable the log of changes (we're about to make a bunch!)
+ LogChanges := FALSE;
+
+ // Saves the current recinc (we'll change this during the restore)
+ orignextinc := CurrRecId;
+ try
+ lOldMasterFields := MasterFields;
+ MasterFields := '';
+ try
+ // Reverts the records to the original state
+ for i := 0 to (Delta.Count-1) do
+ InternalCancelUpdateChange(Delta[i]);
+ finally
+ MasterFields := lOldMasterFields;
+ end;
+
+ // Cancels the updates for the details
+ for i := 0 to list.Count-1 do begin
+ TDADataTable(list[i]).CancelUpdates(TRUE);
+ end;
+
+ // Erases the delta
+ Delta.Clear;
+
+ finally
+ fHasReducedDelta:=False;
+ list.Free;
+ CurrRecId := orignextinc;
+ LogChanges := TRUE;
+ RemoteFetchEnabled := remotefetch;
+ end;
+ finally
+ if IRC <> nil then IRC.ApplyRange;
+ Filtered := wasfiltered;
+ EnableControls;
+ end;
+end;
+
+procedure TDADataTable.DoBeforeOpenDataset;
+begin
+ CallScript('BeforeOpen');
+
+ fOpenTick := ROGetTickCount;
+ if Assigned(fBeforeOpenIDataset) then fBeforeOpenIDataset(Self);
+end;
+
+function TDADataTable.Lookup(const KeyFields: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ result := fDataset.Lookup(KeyFields, KeyValues, ResultFields);
+end;
+
+function TDADataTable.GetIsEmpty: boolean;
+begin
+ result := fDataset.IsEmpty;
+end;
+
+function TDADataTable.GetMasterParamsMappings: TStrings;
+begin
+ result := fMasterParamsMappings
+end;
+
+procedure TDADataTable.SetMasterParamsMappings(const Value: TStrings);
+begin
+ fMasterParamsMappings.Assign(Value);
+end;
+
+function TDADataTable.GetLogicalName: string;
+begin
+ result := fLogicalName;
+end;
+
+function TDADataTable.GetReadOnly: boolean;
+begin
+ result := FALSE;
+end;
+
+procedure TDADataTable.SetReadOnly(const Value: boolean);
+begin
+ // By default this property cannot be set. Raising exceptions creates problems
+ // at design time and it's useless
+end;
+
+procedure TDADataTable.SetScriptCode(const Value: TStrings);
+begin
+ fScriptCode.Assign(Value);
+end;
+
+procedure TDADataTable.CallScript(const aEvent: string);
+begin
+ if Assigned(ScriptingProvider) and (ScriptCode.Count > 0) then begin
+ (ScriptingProvider as IDADataTableScriptingProvider).RunDataTableScript(self, ScriptCode.Text, aEvent, rslPascalScript);
+ end;
+end;
+
+function TDADataTable.FindField(const aName: string): TDAField;
+begin
+ result := fFields.FindField(aName);
+end;
+
+procedure TDADataTable.AddMasterKey(aKey: TDAMasterKeyID);
+begin
+ fFetchedMasters.Add(aKey);
+end;
+
+procedure TDADataTable.AddRecord(const FieldNames: array of string;
+ const FieldValues: array of Variant);
+var i : integer;
+begin
+ Insert;
+ for i := 0 to Length(FieldNames)-1 do
+ FieldByName(FieldNames[i]).Value := FieldValues[i];
+ Post;
+end;
+
+procedure TDADataTable.SetLogicalName(aName: string);
+begin
+ fLogicalName := aName;
+end;
+
+function TDADataTable.GetDeltaInitialized: boolean;
+begin
+ if UsingClonedCursor then Result := fCloneSource.GetDeltaInitialized
+ else Result := Assigned(fDelta);
+end;
+
+procedure TDADataTable.NotifyFieldsClear;
+var
+ i, lLockCount: integer;
+begin
+ // This method patches VCL issue with notification
+ // of datasources when clearing fields and controls is disabled
+ lLockCount := 0;
+ while DataSet.ControlsDisabled do begin
+ inc(lLockCount);
+ DataSet.EnableControls;
+ end;
+ TDataSetHack(DataSet).DataEvent(deFieldListChange, 0);
+ for i := 0 to lLockCount - 1 do begin
+ DataSet.DisableControls;
+ end;
+end;
+
+function TDADataTable.GetOnAfterOpen: TDAAfterOpenDatasetEvent;
+begin
+ result := fAfterOpenIDataset;
+end;
+
+function TDADataTable.GetOnBeforeOpen: TDABeforeOpenDatasetEvent;
+begin
+ result := fBeforeOpenIDataset;
+end;
+
+procedure TDADataTable.SetOnAfterOpen(
+ const Value: TDAAfterOpenDatasetEvent);
+begin
+ fAfterOpenIDataset := Value;
+end;
+
+procedure TDADataTable.SetOnBeforeOpen(
+ const Value: TDABeforeOpenDatasetEvent);
+begin
+ fBeforeOpenIDataset := Value;
+end;
+
+function TDADataTable.GetOnAfterExecute: TDAAfterExecuteCommandEvent;
+begin
+ Result := nil;
+ NotSupported();
+end;
+
+function TDADataTable.GetOnBeforeExecute: TDABeforeExecuteCommandEvent;
+begin
+ Result := nil;
+ NotSupported();
+end;
+
+procedure TDADataTable.SetOldMasterKey(aKey: TDAMasterKeyID);
+begin
+ FreeMasterKey(fOldMasterKey);
+ fOldMasterKey := aKey;
+end;
+
+procedure TDADataTable.SetOnAfterExecute(
+ const Value: TDAAfterExecuteCommandEvent);
+begin
+ NotSupported();
+end;
+
+procedure TDADataTable.SetOnBeforeExecute(
+ const Value: TDABeforeExecuteCommandEvent);
+begin
+ NotSupported();
+end;
+
+function TDADataTable.GetOnExecuteError: TDAExecuteCommandErrorEvent;
+begin
+ Result := nil;
+ NotSupported();
+end;
+
+function TDADataTable.GetOnOpenError: TDAOpenDatasetErrorEvent;
+begin
+ Result := nil;
+ NotSupported();
+end;
+
+procedure TDADataTable.SetOnExecuteError(
+ const Value: TDAExecuteCommandErrorEvent);
+begin
+ NotSupported();
+end;
+
+procedure TDADataTable.SetOnOpenError(
+ const Value: TDAOpenDatasetErrorEvent);
+begin
+ NotSupported();
+end;
+
+function TDADataTable.GetCurrRecId: integer;
+begin
+ if CloneSource = nil then
+ result := fCurrRecId
+ else
+ result := CloneSource.CurrRecId;
+end;
+
+procedure TDADataTable.SetCurrRecId(const Value: integer);
+begin
+ if CloneSource = nil then
+ fCurrRecId := Value
+ else
+ CloneSource.CurrRecId := Value
+end;
+
+function TDADataTable.GetAutoIncs: TAutoIncArray;
+begin
+ if CloneSource = nil then
+ result := fAutoIncs
+ else
+ result := CloneSource.AutoIncs;
+end;
+
+procedure TDADataTable.SetAutoIncs(const Value: TAutoIncArray);
+begin
+ if CloneSource = nil then
+ fAutoIncs := Value
+ else
+ CloneSource.AutoIncs := Value
+end;
+
+function TDADataTable.CreateAutoIncArray: TAutoIncArray;
+var i: integer;
+begin
+ SetLength(result, Fields.Count);
+ for i := 0 to Fields.Count-1 do result[i] := -1;
+end;
+
+function TDADataTable.GetCurrentRecIdValue: integer;
+begin
+ result := fCurrRecId;
+end;
+
+procedure TDADataTable.SetCurrentRecIdValue(Value: integer);
+begin
+ fCurrRecId := Value;
+end;
+
+procedure TDADataTable.InternalAfterFieldUpdate(Sender: TDACustomField);
+begin
+ if assigned(fAfterFieldChange) and (Sender is TDAField) then
+ fAfterFieldChange(self, TDAField(Sender));
+end;
+
+procedure TDADataTable.InternalBeforeFieldUpdate(Sender: TDACustomField);
+begin
+ if assigned(fBeforeFieldChange) and (Sender is TDAField) then
+ fBeforeFieldChange(self, TDAField(Sender));
+end;
+
+procedure TDADataTable.InternalSetFetching(aFetching: boolean);
+begin
+ fFetching := aFetching;
+end;
+
+function TDADataTable.IsCanEditCurrentRow: Boolean;
+begin
+ Result := GetDeltaInitialized and GetDelta.IsCanEditCurrentRow(Self);
+end;
+
+function TDADataTable.IsNeedToFetch(AKey: TDAMasterKeyID):Boolean;
+begin
+ Result := fFetchedMasters.IndexOf(aKey) = -1;
+end;
+
+procedure TDADataTable.SetCustomAttributes(const Value: TStrings);
+begin
+ fCustomAttributes.Assign(Value);
+end;
+
+function TDADataTable.Local_ApplyUpdates(RefetchAll: boolean): boolean;
+
+ function UnpackDeltas(var lStruct: TDADeltaStruct): TDABusinessProcessor;
+ var
+ j: integer;
+ lBizProc: TDABusinessProcessor;
+ lDetails: TDADatasetRelationshipList;
+ lFound: boolean;
+ begin
+ result := nil;
+ lStruct := nil;
+ // Reads the deltas.
+ lFound := false;
+ { Tries to locate a user-defined business processor }
+ if LocalSchema.Owner <> nil then
+ for j := 0 to (LocalSchema.Owner.ComponentCount - 1) do begin
+ if (LocalSchema.Owner.Components[j] is TDABusinessProcessor) then begin
+ lBizProc := TDABusinessProcessor(LocalSchema.Owner.Components[j]);
+ if SameText(lBizProc.ReferencedDataset, Self.LogicalName) then begin
+ lStruct := TDADeltaStruct.Create(Self.Delta, lBizProc);
+ lFound := true;
+ Break;
+ end;
+ end;
+ end;
+ { Either creates one}
+ if not lFound then begin
+ lBizProc := TDABusinessProcessor.Create(nil);
+ lBizProc.ReferencedDataset := Self.LogicalName;
+ lBizProc.Schema := LocalSchema;
+ Result := lBizProc;
+ lStruct := TDADeltaStruct.Create(Self.Delta, lBizProc);
+ end;
+
+ { Sets the master/detail relationships }
+ if (LocalSchema.RelationShips.Count > 0) then begin
+ lDetails := TDADatasetRelationshipList.Create;
+ try
+ LocalSchema.RelationShips.GetDetails(lStruct.BusinessProcessor.ReferencedDataset, lDetails);
+ if (lDetails.Count <> 0) then begin
+ { Prepares an array with the references to the detail deltas that will be used later on to adjust
+ autoincs, etc. }
+ for j := 0 to lDetails.Count - 1 do begin
+ if lDetails[j].DetailDatasetName = LogicalName then begin
+ lStruct.DetailDeltas.Add(lStruct.Delta);
+ lStruct.RelationShips.Add(lDetails[j]);
+ end;
+ end;
+ end;
+ finally
+ lDetails.Free;
+ end;
+ end;
+ end;
+
+var
+ lProcessedDeltas: TStringList;
+ lStruct: TDADeltaStruct;
+ lBizProc: TDABusinessProcessor;
+ i, j: integer;
+begin
+ Result:=False;
+ CheckProperties;
+ FLocConnection := LocalSchema.ConnectionManager.NewConnection(LocalConnection);
+ if (Delta = nil) or (Delta.Count = 0) then Exit;
+ lBizProc := UnpackDeltas(lStruct);
+ try
+ if TriggerTransactionEvent(fOnLocalUpdateDataBeginTransaction) then FLocConnection.BeginTransaction;
+ try
+ if (LocalSchema.UpdateRules.Count = 0) then begin
+ lStruct.BusinessProcessor.ProcessDelta(FLocConnection, lStruct.Delta, AllChanges);
+ end
+ else begin
+ lProcessedDeltas := TStringList.Create;
+ try
+
+ for i := 0 to (LocalSchema.UpdateRules.Count - 1) do begin
+ // Processes them in the order defined in the schema
+ if LocalSchema.UpdateRules[i].DatasetName = LogicalName then begin
+ // Adds the dataset name to the list of processed deltas. Those that don't have update rules will be processed later
+ lProcessedDeltas.Add(LogicalName);
+
+ // Processes the delta
+ lStruct.BusinessProcessor.ProcessDelta(FLocConnection, lStruct.Delta, LocalSchema.UpdateRules[i].ChangeTypes, lStruct);
+
+ if (ctInsert in LocalSchema.UpdateRules[i].ChangeTypes) then begin
+ for j := 0 to (lStruct.DetailDeltas.Count - 1) do
+ lStruct.BusinessProcessor.SynchronizeAutoIncs(lStruct.Delta, lStruct.DetailDeltas[j], lStruct.RelationShips[j]);
+ end;
+ end;
+ end;
+ // Processes the deltas for which update rules were not defined
+ if lProcessedDeltas.IndexOf(LogicalName) = -1 then
+ lStruct.BusinessProcessor.ProcessDelta(FLocConnection, lStruct.Delta, AllChanges);
+ finally
+ lProcessedDeltas.Free;
+ end;
+ end;
+ if FLocConnection.InTransaction and TriggerTransactionEvent(fOnLocalUpdateDataCommitTransaction) then FLocConnection.CommitTransaction;
+ MergeDelta;
+ Result:=True;
+ except
+ on E: Exception do begin
+ if FLocConnection.InTransaction and TriggerTransactionEvent(fOnLocalUpdateDataRollBackTransaction) then FLocConnection.RollbackTransaction;
+ raise;
+ end;
+ end;
+ finally
+ if lStruct <> nil then lStruct.Free;
+ if lBizProc <> nil then lBizProc.Free;
+ FLocConnection := nil;
+ end;
+ if RefetchAll and result then begin
+ if Active then Close;
+ Open;
+ end;
+end;
+
+procedure TDADataTable.GetDetailTablesforAllinOneFetch(aRemote, aLocal:TList; aRecursive: boolean);
+var
+ i: integer;
+ dt: TDADataTable;
+ dtList: TList;
+ scc: IDAClonedCursorsSupport;
+begin
+ if (moAllInOneFetch in fMasterOptions) then begin
+ dtList:=GetDetailDataTables;
+ try
+ for i := 0 to dtList.Count-1 do begin
+ dt := TDADataTable(dtList[i]);
+ if (dtIncludeInAllInOneFetch in dt.DetailOptions) then begin
+ if (dt.QueryInterface(IDAClonedCursorsSupport, scc) = S_OK) and scc.UsingClonedCursor then begin
+ dt:= scc.CloneSource;
+ end;
+
+ if self.RemoteFetchEnabled and dt.RemoteFetchEnabled and (dt.RemoteDataAdapter = Self.RemoteDataAdapter) then begin
+ if aRemote.IndexOf(dt) = -1 then aRemote.Add(dt);
+ end
+ else begin
+ if aLocal.IndexOf(dt) = -1 then aLocal.Add(dt);
+ end;
+ if aRecursive then dt.GetDetailTablesforAllinOneFetch(aRemote,aLocal, aRecursive);
+ end;
+ end;
+ finally
+ dtList.Free;
+ end;
+ end
+end;
+
+{$IFDEF FPC}
+procedure List_Union(List1,List2: TList);
+var
+ i: integer;
+begin
+ if List1 = List2 then Exit;
+ for i := 0 to List2.Count-1 do
+ if List1.IndexOf(List2[i])=-1 then
+ List1.Add(List2[i]);
+end;
+{$ENDIF}
+
+function TDADataTable.GetDetailTablesforApplyUpdate(aRecursive: boolean): TList;
+
+ procedure _GetCloneSource(var dt: TDADataTable);
+ begin
+ if dt.UsingClonedCursor then begin
+ dt:= dt.CloneSource;
+ _GetCloneSource(dt);
+ end;
+ end;
+
+
+var
+ i: integer;
+ dt: TDADataTable;
+ dtList, dtlist1: TList;
+begin
+ Result:= TList.Create;
+ if (moCascadeApplyUpdates in fMasterOptions) then begin
+ dtList:=GetDetailDataTables;
+ try
+ for i := 0 to dtList.Count-1 do begin
+ dt := TDADataTable(dtList[i]);
+ if dt.Active and (dtCascadeApplyUpdates in dt.DetailOptions) then begin
+ _GetCloneSource(dt);
+ if Result.IndexOf(dt) = -1 then Result.Add(dt);
+ if aRecursive then begin
+ dtlist1:= dt.GetDetailTablesforApplyUpdate(aRecursive);
+ try
+ {$IFDEF FPC}
+ List_Union(Result, dtlist1);
+ {$ELSE}
+ Result.Assign(dtlist1,laOr);
+ {$ENDIF}
+ finally
+ dtlist1.Free;
+ end;
+ end;
+ end;
+ end;
+ finally
+ dtList.Free;
+ end;
+ end
+end;
+
+procedure TDADataTable.CancelUpdateChange(Change: TDADeltaChange;IncludeDetails : boolean = TRUE);
+var
+ orignextinc : integer;
+ wasfiltered,
+ remotefetch : boolean;
+ lOldMasterFields: string;
+ details: TList;
+ i,j,k: integer;
+ detailChange: TDADeltaChange;
+ ChangePKValueArray: array of Variant;
+ lNeedDeleteChange: boolean;
+ keyvalue: variant;
+ IRC: IDARangeController;
+begin
+ if Editing then begin
+ if (ruoOnPost in RemoteUpdatesOptions) and (GetDelta.Count=1) then begin
+ InternalCancelUpdateChange(GetDelta.Changes[0]);
+ GetDelta.Clear;
+ Exit;
+ end else begin
+ Cancel;
+ end;
+ end;
+ if not LogChanges then Exit;
+
+ DisableControls;
+ wasfiltered := Filtered;
+ Filtered := FALSE;
+ if GetRangeState and (QueryInterface(IDARangeController,IRC) = 0) then IRC.CancelRange else IRC := nil;
+ try
+ // Truns off the remote fetching for this datatable and its details
+ remotefetch := RemoteFetchEnabled;
+ RemoteFetchEnabled := FALSE;
+
+ // Disable the log of changes (we're about to make a bunch!)
+ LogChanges := FALSE;
+ // Saves the current recinc (we'll change this during the restore)
+ orignextinc := CurrRecId;
+ try
+ lOldMasterFields := MasterFields;
+ MasterFields := '';
+ try
+ // Reverts the records to the original state
+
+ if IncludeDetails then begin
+ SetLength(ChangePKValueArray,Change.Delta.KeyFieldCount);
+ For i:=1 to Change.Delta.KeyFieldCount do begin
+ if Change.ChangeType = ctInsert then
+ keyvalue:=Change.NewValueByName[Change.Delta.KeyFieldNames[i-1]]
+ else
+ keyvalue:=Change.OldValueByName[Change.Delta.KeyFieldNames[i-1]];
+ ChangePKValueArray[0]:=keyvalue;
+ end;
+ details:=GetDetailTablesforApplyUpdate(False);
+ try
+ for i:=0 to details.Count-1 do begin
+ for j:=0 to TDADataTable(details[i]).Delta.Count-1 do begin
+ detailChange :=TDADataTable(details[i]).Delta.Changes[j];
+ if detailChange.Status <> csResolved then begin
+ lNeedDeleteChange:= True;
+ for k:=0 to Change.Delta.KeyFieldCount-1 do begin
+ if detailChange.ChangeType = ctInsert then
+ keyvalue:=detailChange.NewValueByName[Change.Delta.KeyFieldNames[k]]
+ else
+ keyvalue:=detailChange.oldValueByName[Change.Delta.KeyFieldNames[k]];
+ if not VarSameValue(keyValue, ChangePKValueArray[k]) then begin
+ lNeedDeleteChange:= False;
+ Break;
+ end;
+ end;
+ if lNeedDeleteChange then TDADataTable(details[i]).CancelUpdateChange(detailChange,IncludeDetails);
+ end;
+ end;
+ end;
+ finally
+ details.Free;
+ end;
+ end;
+ InternalCancelUpdateChange(change);
+ Delta.RemoveChange(change);
+ finally
+ if Delta.Count = 0 then fHasReducedDelta:=False;
+ MasterFields := lOldMasterFields;
+ end;
+ finally
+ CurrRecId := orignextinc;
+ LogChanges := TRUE;
+ RemoteFetchEnabled := remotefetch;
+ end;
+ finally
+ if IRC <> nil then IRC.ApplyRange;
+ Filtered := wasfiltered;
+ EnableControls;
+ end;
+end;
+
+procedure TDADataTable.InternalCancelUpdateChange(Change: TDADeltaChange);
+var
+ i, x : integer;
+ fldname : string;
+ fldvalue : Variant;
+ details: TList;
+ RecID:string;
+ key: TDAMasterKeyID;
+ ldetailTable: TDADataTable;
+begin
+ case Change.ChangeType of
+ ctDelete : begin
+ CurrRecId := change.RecID; // We want the same autoinc regenerated
+ RecID:=IntToStr(Change.RecID);
+ Insert;
+ for x := 0 to (Delta.LoggedFieldCount-1) do begin
+ fldname := Delta.LoggedFieldNames[x];
+ fldvalue := null; // fix for "Invalid Variant Type" exception in Win2000
+ fldvalue := change.OldValues[x];
+ VariantToFieldValue(fldValue, FieldByName(fldname));
+ end;
+ Post;
+ details := GetDetailDataTables;
+ try
+ for x := 0 to (details.Count-1) do begin
+ ldetailTable := TDADataTable(details[x]);
+ key := ldetailTable.GenerateKeyfromMasterRecID;
+ try
+ i:=ldetailTable.fFetchedMasters.IndexOf(key);
+ if i<>-1 then ldetailTable.fFetchedMasters.Delete(i);
+ finally
+ FreeMasterKey(Key);
+ end;
+ end;
+ finally
+ details.Free;
+ end;
+ end;
+
+ else begin
+ if ruoOnPost in RemoteUpdatesOptions then begin
+ if Self.State = dsInsert then
+ Cancel
+ else begin
+ for x := 0 to (Delta.LoggedFieldCount-1) do begin
+ fldname := Delta.LoggedFieldNames[x];
+ fldvalue := null;// fix for "Invalid Variant Type" exception in Win2000
+ fldvalue := change.OldValues[x];
+ if fHasReducedDelta and ROVariantsEqual(fldvalue, change.NewValues[x]) then Continue;
+ VariantToFieldValue(fldValue, FieldByName(fldname));
+ end;
+ end;
+ end
+ else begin
+ First;
+ if not Locate(RecIDFieldName, change.RecID, []) then RaiseError('Couldn''t find record #'+FormatRecIDString(change.RecID));
+
+ if (change.ChangeType=ctInsert) then Delete
+ else begin
+ Edit;
+ for x := 0 to (Delta.LoggedFieldCount-1) do begin
+ fldname := Delta.LoggedFieldNames[x];
+ fldvalue := null;// fix for "Invalid Variant Type" exception in Win2000
+ fldvalue := change.OldValues[x];
+ if fHasReducedDelta and ROVariantsEqual(fldvalue, change.NewValues[x]) then Continue;
+ VariantToFieldValue(fldValue, FieldByName(fldname));
+ end;
+ Post;
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure TDADataTable.CheckProperties(ACheckRemoteFetching: Boolean=False; ACheckOnlyForLocalSchema: Boolean = False);
+begin
+ if (fCloneSource<>NIL) then
+ fCloneSource.CheckProperties(ACheckRemoteFetching)
+ else begin
+ if LogicalName = '' then raise Exception.Create(Name+'.LogicalName must be specified.');
+ if RemoteFetchEnabled or ACheckRemoteFetching then begin
+ Check(RemoteDataAdapter = nil, Name+'.RemoteDataAdapter must be assigned.');
+ end
+ else begin
+ Check(LocalSchema = nil, Name+'.LocalSchema must be assigned.');
+ if not ACheckOnlyForLocalSchema then begin
+ Check(LocalDataStreamer = nil , Name+'.LocalDataStreamer must be assigned.');
+ LocalSchema.CheckProperties;
+ end;
+ end;
+ end;
+end;
+
+
+procedure TDADataTable.ExpessionEvaluatorGetValue(
+ Sender: TDAExpressionEvaluator; const aIdentifier: string;
+ out aValue: Variant);
+begin
+ aValue := Fields.FieldByName(aIdentifier).Value;
+end;
+
+function TDADataTable.GetDynamicWhere: TDAWhereBuilder;
+begin
+ Result := fDynamicWhere;
+end;
+
+procedure TDADataTable.SetDynamicWhere(const Value: TDAWhereBuilder);
+begin
+ if Value <> nil then
+ FDynamicWhere.Xml := Value.Xml
+ else
+ FDynamicWhere.Clear;
+end;
+
+function TDADataTable.SQLContainsDynamicWhere: boolean;
+begin
+ Result:=False;
+ // Not implemented in DataTables
+end;
+
+function TDADataTable.GetCloneSource: TDADataTable;
+begin
+ Result:= FCloneSource;
+end;
+
+function TDADataTable.GetUsingClonedCursor: boolean;
+begin
+ Result:=FCloneSource<>nil;
+end;
+
+function TDADataTable.GetSimpleCloneSource: TObject;
+begin
+ Result:= GetCloneSource;
+end;
+
+procedure TDADataTable.CloneCursor(Source: TDADataTable);
+begin
+ Raise Exception.Create(err_NotSupported);
+end;
+
+function TDADataTable.BookmarkValid(Bookmark: TBookmark): Boolean;
+begin
+ Result := fDataset.BookmarkValid(Bookmark);
+end;
+
+function TDADataTable.ControlsDisabled: Boolean;
+begin
+ Result := fDataset.ControlsDisabled;
+end;
+
+function TDADataTable.TriggerTransactionEvent(
+ aEvent: TDALocalUpdateDataTransactionEvent): boolean;
+begin
+ result := true;
+ if assigned(aEvent) then aEvent(self, result);
+end;
+
+procedure TDADataTable.SetDetailOptions(const Value: TDADetailOptions);
+begin
+ fDetailOptions := Value - DetailOptions_unused;
+end;
+
+procedure TDADataTable.SetMasterOptions(const Value: TDAMasterOptions);
+begin
+ fMasterOptions := Value - MasterOptions_unused;
+end;
+
+function TDADataTable.GetRangeState: Boolean;
+begin
+ Result := False;
+end;
+
+function TDADataTable.intDATypeToVCLType(aDAType: TDADataType): TFieldType;
+begin
+ Result := DATypeToVCLType(aDAType);
+end;
+
+{ TDADataSource }
+
+procedure TDADataSource.Assign(Source: TPersistent);
+var
+ lSource: TDADataSource;
+begin
+ inherited;
+ if Source is TDADataSource then begin
+ lSource := TDADataSource(Source);
+ DataTable := lSource.DataTable;
+ end;
+end;
+
+constructor TDADataSource.Create(aOwner: TComponent);
+begin
+ inherited;
+end;
+
+destructor TDADataSource.Destroy;
+begin
+ DataTable := nil;
+ inherited;
+end;
+
+function TDADataSource.GetActive: boolean;
+begin
+ result := (fDataTable <> nil) and fDataTable.Active
+end;
+
+function TDADataSource.GetDataset: TDataset;
+begin
+ result := nil;
+end;
+
+function TDADataSource.GetOpening: boolean;
+begin
+ result := (fDataTable <> nil) and fDataTable.Opening
+end;
+
+procedure TDADataSource.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited;
+
+ if (AComponent = fDataTable) then begin
+ DataTable := nil;
+ inherited Dataset := nil;
+ end;
+end;
+
+procedure TDADataSource.SetDataset(const Value: TDataset);
+begin
+
+end;
+
+procedure TDADataSource.SetDataTable(const Value: TDADataTable);
+begin
+ if fDataTable <> Value then begin
+ if (fDataTable <> nil) then fDataTable.RORemoveFreeNotification(Self);
+ fDataTable := Value;
+ if (fDataTable <> nil) then begin
+ fDataTable.ROFreeNotification(Self);
+ inherited Dataset := fDataTable.Dataset;
+ end
+ else
+ inherited Dataset := nil;
+ end;
+end;
+
+{ TDABusinessRules }
+
+constructor TDABusinessRules.Create;
+begin
+ inherited;
+end;
+
+destructor TDABusinessRules.Destroy;
+begin
+ inherited;
+end;
+
+function TDABusinessRules._AddRef: Integer;
+begin
+ result := -1;
+end;
+
+function TDABusinessRules._Release: Integer;
+begin
+ result := -1;
+end;
+
+{ TDADataTableRules }
+
+constructor TDADataTableRules.Create(aDataTable: TDADataTable);
+begin
+ inherited Create;
+
+ Check(not Assigned(aDatatable), 'DataTable cannot be NIL');
+
+ fDetails := TStringList.Create;
+ fDetails.Sorted := TRUE;
+ fDetails.Duplicates := dupError;
+
+ fDataTable := aDataTable;
+end;
+
+destructor TDADataTableRules.Destroy;
+begin
+ fDetails.Free;
+
+ inherited;
+end;
+
+procedure TDADataTableRules.AfterCancel(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.AfterClose(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.AfterDelete(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.AfterEdit(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.AfterInsert(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.AfterOpen(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.AfterPost(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.AfterRefresh(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.AfterScroll(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.BeforeCancel(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.BeforeClose(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.BeforeDelete(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.BeforeEdit(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.BeforeInsert(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.BeforeOpen(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.BeforePost(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.BeforeRefresh(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.BeforeScroll(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.OnCalcFields(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.OnNewRecord(Sender: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.OnDeleteError(DataTable: TDADataTable;
+ Error: EDatabaseError; var Action: TDataAction);
+begin
+
+end;
+
+procedure TDADataTableRules.OnEditError(DataTable: TDADataTable;
+ Error: EDatabaseError; var Action: TDataAction);
+begin
+
+end;
+
+procedure TDADataTableRules.Attach(aDataTable: TDADataTable);
+begin
+ RefreshDetails;
+end;
+
+procedure TDADataTableRules.Detach(aDataTable: TDADataTable);
+begin
+ fDetails.Clear;
+end;
+
+procedure TDADataTableRules.Append;
+begin
+ fDataTable.Append();
+end;
+
+procedure TDADataTableRules.Cancel;
+begin
+ fDataTable.Cancel();
+end;
+
+procedure TDADataTableRules.Delete;
+begin
+ fDataTable.Delete();
+end;
+
+procedure TDADataTableRules.Edit;
+begin
+ fDataTable.Edit();
+end;
+
+procedure TDADataTableRules.First;
+begin
+ fDataTable.First();
+end;
+
+procedure TDADataTableRules.Insert;
+begin
+ fDataTable.Insert();
+end;
+
+procedure TDADataTableRules.Last;
+begin
+ fDataTable.Last();
+end;
+
+procedure TDADataTableRules.Next;
+begin
+ fDataTable.Next();
+end;
+
+procedure TDADataTableRules.Post;
+begin
+ fDataTable.Post();
+end;
+
+procedure TDADataTableRules.Prior;
+begin
+ fDataTable.Prior();
+end;
+
+function TDADataTableRules.GetBOF: Boolean;
+begin
+ result := fDataTable.BOF;
+end;
+
+function TDADataTableRules.GetEOF: Boolean;
+begin
+ result := fDataTable.EOF;
+end;
+
+function TDADataTableRules.GetRecordCount: Integer;
+begin
+ result := fDataTable.RecordCount;
+end;
+
+function TDADataTableRules.Locate(const aKeyFields: String; const aKeyValues: Variant; aOptions: TLocateOptions = []): boolean;
+begin
+ result := fDataTable.Locate(aKeyFields, aKeyValues, aOptions);
+end;
+
+function TDADataTableRules.GetDetails(Index: integer): TDADataTable;
+begin
+ result := TDADataTable(fDetails[Index])
+end;
+
+function TDADataTableRules.GetDetailsCount: integer;
+begin
+ result := fDetails.Count
+end;
+
+function TDADataTableRules.FindDetail(
+ const aLogicalName: string): TDADataTable;
+var i : integer;
+begin
+ result := NIL;
+ i := fDetails.IndexOf(aLogicalName);
+
+ if (i>=0) then result := TDADataTable(fDetails.Objects[i]);
+end;
+
+function TDADataTableRules.DetailByName(
+ const aLogicalName: string): TDADataTable;
+begin
+ result := FindDetail(aLogicalName);
+ if (result=NIL)
+ then raise Exception.CreateFmt('Cannot find the detail DataTable %s ', [aLogicalName]);
+end;
+
+procedure TDADataTableRules.RefreshDetails;
+var lList : TList;
+ i : integer;
+ lLogicalName : string;
+begin
+ lList := DataTable.GetDetailDataTables;
+ fDetails.Clear;
+ try
+ for i := 0 to (lList.Count-1) do begin
+ lLogicalName := TDADataTable(lList[i]).LogicalName;
+
+ if (lLogicalName<>'')
+ then fDetails.AddObject(lLogicalName, lList[i]);
+ end;
+ finally
+ lList.Free;
+ end;
+end;
+
+function TDADataTableRules.GetDetailOptions: TDADetailOptions;
+begin
+ result := DataTable.DetailOptions
+end;
+
+function TDADataTableRules.GetMasterOptions: TDAMasterOptions;
+begin
+ result := DataTable.MasterOptions
+end;
+
+procedure TDADataTableRules.SetDetailOptions(Value: TDADetailOptions);
+begin
+ DataTable.DetailOptions := Value
+end;
+
+procedure TDADataTableRules.SetMasterOptions(Value: TDAMasterOptions);
+begin
+ DataTable.MasterOptions := Value
+end;
+
+function TDADataTableRules.GetRecNo: integer;
+begin
+ result := fDataTable.RecNo
+end;
+
+procedure TDADataTableRules.SetRecNo(Value: integer);
+begin
+ fDataTable.RecNo := Value
+end;
+
+procedure TDADataTableRules.OnFilterRecord(DataTable: TDADataTable;
+ var Accept: boolean);
+begin
+
+end;
+
+procedure TDADataTableRules.OnPostError(DataTable: TDADataTable;
+ Error: EDatabaseError; var Action: TDataAction);
+begin
+
+end;
+
+function TDADataTableRules.Lookup(const KeyFields: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ result := fDataTable.Lookup(KeyFields, KeyValues, ResultFields);
+end;
+
+function TDADataTableRules.GetIsEmpty: boolean;
+begin
+ result := fDataTable.IsEmpty
+end;
+
+function TDADataTableRules.GetState: TDatasetState;
+begin
+ result := fDataTable.State
+end;
+
+function TDADataTableRules.IsFieldNull(
+ const FieldIndexOrName: Variant): boolean;
+var fld : TDAField;
+begin
+ case VarType(FieldIndexOrName) of
+ varString, varUString, varOleStr, varStrArg : fld := DataTable.FieldByName(VarToStr(FieldIndexOrName));
+ else fld := DataTable.Fields[FieldIndexOrName];
+ end;
+
+ result := fld.IsNull;
+end;
+
+procedure TDADataTableRules.ClearField(const FieldIndexOrName: Variant);
+var fld : TDAField;
+begin
+ case VarType(FieldIndexOrName) of
+ varString, varUString, varOleStr, varStrArg : fld := DataTable.FieldByName(VarToStr(FieldIndexOrName));
+ else fld := DataTable.Fields[FieldIndexOrName];
+ end;
+
+ fld.Clear;
+end;
+
+function TDADataTableRules.GetDataTable: TDADataTable;
+begin
+ result := fDataTable;
+end;
+
+procedure TDADataTableRules.ApplyRange;
+begin
+ (fDataTable as IDARangeController).ApplyRange
+end;
+
+procedure TDADataTableRules.CancelRange;
+begin
+ (fDataTable as IDARangeController).CancelRange
+end;
+
+procedure TDADataTableRules.EditRangeEnd;
+begin
+ (fDataTable as IDARangeController).EditRangeEnd
+end;
+
+procedure TDADataTableRules.EditRangeStart;
+begin
+ (fDataTable as IDARangeController).EditRangeStart
+end;
+
+procedure TDADataTableRules.SetRange(const StartValues,
+ EndValues: array of const);
+begin
+ (fDataTable as IDARangeController).SetRange(StartValues, EndValues);
+end;
+
+procedure TDADataTableRules.SetRangeEnd;
+begin
+ (fDataTable as IDARangeController).SetRangeEnd
+end;
+
+procedure TDADataTableRules.SetRangeStart;
+begin
+ (fDataTable as IDARangeController).SetRangeStart
+end;
+
+procedure TDADataTableRules.Close;
+begin
+ fDataTable.Close;
+end;
+
+procedure TDADataTableRules.Open;
+begin
+ fDataTable.Open;
+end;
+
+function TDADataTableRules.GetActive: boolean;
+begin
+ result := fDataTable.Active;
+end;
+
+procedure TDADataTableRules.SetActive(const Value: boolean);
+begin
+ fDataTable.Active := Value;
+end;
+
+procedure TDADataTableRules.OnAfterApplyUpdates(DataTable: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.OnAfterDataRequestCall(DataTable: TDADataTable;
+ Request: TDARemoteRequest);
+begin
+
+end;
+
+procedure TDADataTableRules.OnAfterDataUpdateCall(DataTable: TDADataTable;
+ Request: TDARemoteRequest);
+begin
+
+end;
+
+procedure TDADataTableRules.OnAfterMergeDelta(DataTable: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.OnAfterSchemaCall(DataTable: TDADataTable;
+ Request: TDARemoteRequest);
+begin
+
+end;
+
+procedure TDADataTableRules.OnAfterScriptCall(DataTable: TDADataTable;
+ Request: TDARemoteRequest);
+begin
+
+end;
+
+procedure TDADataTableRules.OnBeforeApplyUpdates(DataTable: TDADataTable;
+ const Delta: IDADelta);
+begin
+
+end;
+
+procedure TDADataTableRules.OnBeforeDataRequestCall(
+ DataTable: TDADataTable; Request: TDARemoteRequest);
+begin
+
+end;
+
+procedure TDADataTableRules.OnBeforeDataUpdateCall(DataTable: TDADataTable;
+ Request: TDARemoteRequest);
+begin
+
+end;
+
+procedure TDADataTableRules.OnBeforeMergeDelta(DataTable: TDADataTable);
+begin
+
+end;
+
+procedure TDADataTableRules.OnBeforeSchemaCall(DataTable: TDADataTable;
+ Request: TDARemoteRequest);
+begin
+
+end;
+
+procedure TDADataTableRules.OnBeforeScriptCall(DataTable: TDADataTable;
+ Request: TDARemoteRequest);
+begin
+
+end;
+
+procedure TDADataTableRules.OnReceiveDataStream(DataTable: TDADataTable;
+ Stream: TStream);
+begin
+
+end;
+
+{ TDAFieldRules }
+constructor TDAFieldRules.Create(aField : TDAField; aDataTable : TDADataTable);
+begin
+ inherited Create;
+
+ fDataTable := aDataTable;
+
+ fField := aField;
+ fField.OnValidate := OnValidate;
+ fField.OnChange := OnChange;
+
+ Attach(fDataTable);
+end;
+
+destructor TDAFieldRules.Destroy;
+begin
+ Detach(fDataTable);
+ inherited;
+end;
+
+procedure TDAFieldRules.Attach(aDataTable: TDADataTable);
+begin
+
+end;
+
+procedure TDAFieldRules.Detach(aDataTable: TDADataTable);
+begin
+
+end;
+
+procedure TDAFieldRules.OnChange(Sender: TDACustomField);
+begin
+end;
+
+procedure TDAFieldRules.OnValidate(Sender: TDACustomField);
+begin
+end;
+
+{ TDADataTableList }
+constructor TDADataTableList.Create(aOwnerComponent: TComponent);
+begin
+ inherited Create;
+
+ ScanAndAdd(aOwnerComponent);
+end;
+
+function TDADataTableList.Add(aDataTable: TDADataTable): integer;
+begin
+ result := inherited Add(aDataTable);
+end;
+
+function TDADataTableList.GetItems(Index: integer): TDADataTable;
+begin
+ result := TDADataTable(inherited Items[Index]);
+end;
+
+procedure TDADataTableList.Remove(aDataTable: TDADataTable);
+begin
+ inherited Remove(aDataTable);
+end;
+
+
+function TDADataTableList.ScanAndAdd(aOwnerComponent: TComponent): integer;
+var i : integer;
+begin
+ result := 0;
+ with aOwnerComponent do begin
+ for i := 0 to (Count-1) do
+ if (Components[i] is TDADataTable) then begin
+ Add(TDADataTable(Components[i]));
+ Inc(result);
+ end;
+ end;
+end;
+
+function TDADataTableList.GetPendingChangeCount: integer;
+var i : integer;
+begin
+ result := 0;
+ for i := 0 to (Count-1) do
+ if Items[i].Active and Items[i].LogChanges
+ then Inc(result, Items[i].Delta.Count);
+end;
+
+
+{ TDACustomDataAdapter }
+
+function TDACustomDataAdapter.Get_GetDataCall: TDARemoteRequest;
+begin
+ Result := nil;
+end;
+
+function TDACustomDataAdapter.Get_GetSchemaCall: TDARemoteRequest;
+begin
+ Result := nil;
+end;
+
+function TDACustomDataAdapter.Get_GetScriptsCall: TDARemoteRequest;
+begin
+ Result := nil;
+end;
+
+function TDACustomDataAdapter.Get_UpdateDataCall: TDARemoteRequest;
+begin
+ Result := nil;
+end;
+
+
+{ TDAMasterKeyList }
+
+procedure TDAMasterKeyList.Add(aKey: TDAMasterKeyID);
+begin
+ fNeedSort := True;
+ inherited Add(aKey);
+end;
+
+procedure TDAMasterKeyList.Clear;
+var
+ i: integer;
+begin
+ for I := 0 to Count - 1 do
+ FreeMasterKey(TDAMasterKeyID(Items[i]));
+ inherited;
+ fNeedSort := False;
+end;
+
+
+function TDAMasterKeyList_Compare(aKey1, aKey2: pointer):integer;
+var
+ l1, l2: Integer;
+ l: integer;
+ i: integer;
+ lKey1, lKey2: TDAMasterKeyID;
+begin
+ Result := 0;
+ lKey1 := TDAMasterKeyID(aKey1);
+ lKey2 := TDAMasterKeyID(aKey2);
+ l1 := PInteger(@lKey1[0])^;
+ l2 := PInteger(@lKey2[0])^;
+ if (l1 = 0) then begin
+ if l2 > 0 then Result := l2;
+ //else Result := 0
+ exit;
+ end
+ else if (l2 = 0) then begin
+ Result := - l1;
+ exit;
+ end;
+ if l1 > l2 then l := l2 else l := l1;
+ for I := SizeOf(integer) to l-1+SizeOf(integer) do begin
+ Result := lKey2[i] - lKey1[i];
+ if Result <> 0 then break;
+ end;
+ if Result = 0 then Result := l2-l1;
+end;
+
+function TDAMasterKeyList.IndexOf(aKey: TDAMasterKeyID): integer;
+var
+ L, H, I, C: Integer;
+ R: Boolean;
+begin
+ if fNeedSort then SortList;
+// from TStringList.Find
+ Result := -1;
+ R := False;
+ L := 0;
+ H := Count - 1;
+ while L <= H do
+ begin
+ I := (L + H) shr 1;
+ C := TDAMasterKeyList_Compare(List^[i], aKey);
+ if C < 0 then begin
+ L := I + 1
+ end
+ else begin
+ H := I - 1;
+ if C = 0 then begin
+ R := True;
+ L := I;
+ end;
+ end;
+ end;
+ if R then Result := L;
+end;
+
+procedure TDAMasterKeyList.SortList;
+begin
+ Sort(TDAMasterKeyList_Compare);
+ fNeedSort := False;
+end;
+
+initialization
+ RegisterExceptionClass(EDABizValidationException);
+
+ _bizfields := TStringList.Create;
+ _bizfields.Sorted := TRUE;
+
+ _bizdatatables := TStringList.Create;
+ _bizdatatables.Sorted := TRUE;
+
+finalization
+ UnregisterExceptionClass(EDABizValidationException);
+ _bizdatatables.Free;
+ _bizfields.Free;
+
+end.
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataTableReferenceCollection.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataTableReferenceCollection.pas
new file mode 100644
index 0000000..427049e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADataTableReferenceCollection.pas
@@ -0,0 +1,217 @@
+unit uDADataTableReferenceCollection;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes,
+ uDAInterfaces,uDADataTable;
+
+type
+ { TDADataTableReference }
+ TDADataTableReferenceCollection = class;
+ TDADataTableReference = class(TCollectionItem)
+ private
+ fDataTable: TComponent;
+ FDataset: IDADataset;
+ FLogicalName: string; // fro Tdataset
+ function GetIsValidReference: boolean;
+ procedure SetDataTable(const Value: TComponent);
+ function GetReferenceCollection: TDADataTableReferenceCollection;
+ function GetDataset: IDADataset;
+ function GetLogicalName: string;
+ procedure SetLogicalName(const Value: string);
+
+ protected
+ function GetDisplayName : string; override;
+ public
+ constructor Create(aCollection : TDADataTableReferenceCollection); reintroduce;
+ property IsValidReference : boolean read GetIsValidReference;
+ property ReferenceCollection : TDADataTableReferenceCollection read GetReferenceCollection;
+ property Dataset: IDADataset read GetDataset;
+ destructor Destroy; override;
+ published
+ property DataTable : TComponent read fDataTable write SetDataTable;
+ property LogicalName: string read GetLogicalName write SetLogicalName;
+ end;
+
+ { TDADataTableReferenceCollection }
+ TDADataTableReferenceCollection = class(TCollection)
+ private
+ fOwner: TComponent;
+
+ function GetItems(Index: integer): TDADataTableReference;
+ protected
+ public
+ constructor Create(aOwner: TComponent);
+ destructor Destroy; override;
+
+ function FindByDataTable(aDataTable : TComponent) : TDADataTableReference;
+ function FindByName(const aLogicalName : string) : TDADataTableReference;
+
+ property Items[Index : integer] : TDADataTableReference read GetItems; default;
+
+ property OwnerService: TComponent read fOwner;
+ end;
+
+implementation
+
+uses
+ SysUtils,DB,
+ uROClasses, uDADatasetWrapper;
+
+{ TDADataTableReferenceCollection }
+
+constructor TDADataTableReferenceCollection.Create(aOwner: TComponent);
+begin
+ inherited Create(TDADataTableReference);
+
+ fOwner := aOwner;
+end;
+
+destructor TDADataTableReferenceCollection.Destroy;
+begin
+
+ inherited;
+end;
+
+function TDADataTableReferenceCollection.FindByDataTable(aDataTable: TComponent): TDADataTableReference;
+var i : integer;
+begin
+ result := NIL;
+ if (aDataTable=NIL) then Exit;
+
+ for i := 0 to (Count-1) do
+ if (Items[i].DataTable=aDataTable) then begin
+ result := Items[i];
+ Exit;
+ end;
+end;
+
+function TDADataTableReferenceCollection.FindByName(const aLogicalName: string): TDADataTableReference;
+var i : integer;
+begin
+ result := NIL;
+
+ for i := 0 to (Count-1) do
+ if Items[i].IsValidReference and SameText(Items[i].Dataset.LogicalName, aLogicalName) then begin
+ result := Items[i];
+ Exit;
+ end;
+end;
+
+function TDADataTableReferenceCollection.GetItems(
+ Index: integer): TDADataTableReference;
+begin
+ result := TDADataTableReference(inherited Items[Index]);
+end;
+
+{ TDADataTableReference }
+
+constructor TDADataTableReference.Create(aCollection : TDADataTableReferenceCollection);
+begin
+ inherited Create(aCollection);
+end;
+
+function TDADataTableReference.GetDataset: IDADataset;
+begin
+ Result := FDataset;
+ if (Result = nil) and (fDataTable is TDADataTable) then
+ Result := fDataTable as IDADataset;
+end;
+
+procedure TDADataTableReference.SetDataTable(const Value: TComponent);
+begin
+ if (fDataTable<>Value) then begin
+
+ //RemoveFreeNotification
+ if (fDataTable <> nil) then begin
+ if fDataTable is TDADataTable then
+ TDADataTable(fDataTable).RORemoveFreeNotification(ReferenceCollection.OwnerService)
+ else if fDataTable is TDataSet then
+ TDataSet(fDataTable).RemoveFreeNotification(ReferenceCollection.OwnerService);
+ end;
+
+
+ if Value is TDataSet then begin
+ FDataset := TDatasetWrapper.Create(TDataSet(Value));
+ FDataset.LogicalName := FLogicalName;
+ end
+ else
+ FDataset := nil;
+
+ if (Value is TDataSet) or (Value is TDADataTable) then
+ fDataTable := Value
+ else
+ // don't supported other types
+ fDataTable := nil;
+
+ //FreeNotification
+ if (fDataTable <> nil) then begin
+ if fDataTable is TDADataTable then
+ TDADataTable(fDataTable).ROFreeNotification(ReferenceCollection.OwnerService)
+ else if fDataTable is TDataSet then
+ TDataSet(fDataTable).FreeNotification(ReferenceCollection.OwnerService);
+ end;
+ end;
+end;
+
+function TDADataTableReference.GetDisplayName: string;
+var F_logicalname : string;
+begin
+ if (fDataTable<>NIL) then begin
+ F_logicalname := LogicalName;
+ if (F_logicalname='') then F_logicalname := '???';
+ result := Format('%s (%s)', [F_logicalname, fDataTable.Name])
+ end
+ else result := '';
+end;
+
+function TDADataTableReference.GetIsValidReference: boolean;
+begin
+ result := fDataTable<>NIL
+end;
+
+function TDADataTableReference.GetReferenceCollection: TDADataTableReferenceCollection;
+begin
+ result := TDADataTableReferenceCollection(inherited Collection);
+end;
+
+function TDADataTableReference.GetLogicalName: string;
+begin
+ if (fDataTable<>NIL) then begin
+ Result := Dataset.LogicalName;
+ if fDataTable is TDataset then Result:= FLogicalName;
+ end
+ else
+ result := '';
+end;
+
+procedure TDADataTableReference.SetLogicalName(const Value: string);
+begin
+ FLogicalName := Value;
+ if (Dataset <> nil) then Dataset.LogicalName := Value;
+end;
+
+
+destructor TDADataTableReference.Destroy;
+begin
+ DataTable := nil;
+ FDataset:=nil;
+ inherited;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADatasetProvider.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADatasetProvider.pas
new file mode 100644
index 0000000..6ab4ce3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADatasetProvider.pas
@@ -0,0 +1,101 @@
+unit uDADatasetProvider;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up }
+{ platform: Win32 }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, DB, Provider, uDADataTable;
+
+type
+ { TDADatasetProvider }
+ TDADatasetProvider = class(TDataSetProvider)
+ private
+ fDataTable: TDADataTable;
+ procedure SetDataTable(const Value: TDADataTable);
+ function GetDataset: TDataset;
+
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ function InternalGetRecords(Count: Integer; out RecsOut: Integer;
+ Options: TGetRecordOptions; const CommandText: WideString;
+ var Params: OleVariant): OleVariant; override;
+ public
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ published
+ property Dataset: TDataset read GetDataset;
+ property DataTable: TDADataTable read fDataTable write SetDataTable;
+ end;
+
+
+implementation
+
+{ TDADatasetProvider }
+
+procedure TDADatasetProvider.Assign(Source: TPersistent);
+var
+ lSource: TDADatasetProvider;
+begin
+ inherited;
+ if Source is TDADatasetProvider then begin
+ lSource := TDADatasetProvider(Source);
+ DataTable := lSource.DataTable;
+ end;
+end;
+
+destructor TDADatasetProvider.Destroy;
+begin
+ DataTable := nil;
+ inherited;
+end;
+
+function TDADatasetProvider.GetDataset: TDataset;
+begin
+ result := NIL;
+end;
+
+function TDADatasetProvider.InternalGetRecords(Count: Integer;
+ out RecsOut: Integer; Options: TGetRecordOptions;
+ const CommandText: WideString; var Params: OleVariant): OleVariant;
+begin
+ if not DataTable.Active then DataTable.Open;
+
+ result := inherited InternalGetRecords(Count, RecsOut, Options, CommandText, Params);
+end;
+
+procedure TDADatasetProvider.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited;
+
+ if (Operation=opRemove) then begin
+ if (aComponent=fDatatable) then fDataTable := NIL;
+ end;
+end;
+
+procedure TDADatasetProvider.SetDataTable(const Value: TDADataTable);
+begin
+ if fDataTable <> Value then begin
+ if (fDataTable<>NIL) then fDataTable.RORemoveFreeNotification(Self);
+ fDataTable := Value;
+ if (fDataTable<>NIL) then begin
+ fDataTable.ROFreeNotification(Self);
+ inherited Dataset := fDataTable.Dataset;
+ end;
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADatasetWrapper.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADatasetWrapper.pas
new file mode 100644
index 0000000..a77d78e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADatasetWrapper.pas
@@ -0,0 +1,674 @@
+unit uDADatasetWrapper;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, DB,
+ {$IFDEF MSWINDOWS}ActiveX,{$ENDIF}
+ uDAInterfaces;
+
+type
+ TDatasetWrapper = class(TInterfacedObject, {$IFDEF MSWINDOWS}ISupportErrorInfo,{$ENDIF} IDADataset, IDAEditableDataset)
+ private
+ FDataset: TDataset;
+ FLogicalName: string;
+ fFields: TDAFieldCollection;
+ fParams: TDAParamCollection;
+ fAfterOpenIDataset: TDAAfterOpenDatasetEvent;
+ fBeforeOpenIDataset: TDABeforeOpenDatasetEvent;
+ FOld_BeforeClose: TDataSetNotifyEvent;
+ FOld_BeforeOpen: TDataSetNotifyEvent;
+ FOld_AfterOpen: TDataSetNotifyEvent;
+ procedure DatasetBeforeOpen(DataSet: TDataSet);
+ procedure DatasetBeforeClose(DataSet: TDataSet);
+ procedure DatasetAfterOpen(DataSet: TDataSet);
+ procedure AttachEventHooks(aDataset: TDataset);
+ procedure DetachEventHooks(aDataset: TDataset);
+ procedure BindFields;
+ procedure UnbindFields;
+ protected
+ function GetParams: TDAParamCollection; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetPrepared: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetPrepared(Value: boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetWhere: TDAWhere; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDynamicWhere: TDAWhereBuilder; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetDynamicWhere(const Value: TDAWhereBuilder); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetSQL: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetSQL(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function SQLContainsDynamicWhere: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDataset: TDataset; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnAfterExecute: TDAAfterExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeExecute: TDABeforeExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterExecute(const Value: TDAAfterExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeExecute(const Value: TDABeforeExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnExecuteError: TDAExecuteCommandErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnExecuteError(const Value: TDAExecuteCommandErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Methods
+ procedure RefreshParams; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Execute: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function ParamByName(const aName: string): TDAParam; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Properties readers/writers
+ function GetRecordCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFields: TDAFieldCollection; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetActive: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetActive(Value: boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetBOF: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetEOF: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldValues(Index: integer): Variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetNames(Index: integer): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetIsEmpty: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetState: TDatasetState; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetLogicalName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetLogicalName(aName: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetOnAfterOpen: TDAAfterOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeOpen: TDABeforeOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterOpen(const Value: TDAAfterOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeOpen(const Value: TDABeforeOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnOpenError: TDAOpenDatasetErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnOpenError(const Value: TDAOpenDatasetErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Methods
+ procedure Open; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Close; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure EnableControls; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableControls; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Refresh; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Next; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function FieldByName(const aName: string): TDAField; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function FindField(const aName: string): TDAField; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetBookMark: TBookmark; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GotoBookmark(Bookmark: TBookmark); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure FreeBookmark(Bookmark: TBookmark); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function BookmarkValid(Bookmark: TBookmark): Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetCurrentRecIdValue: integer;
+ procedure SetCurrentRecIdValue(Value: integer);
+
+ function GetRowRecIDValue: integer;
+
+ procedure EnableConstraints; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableConstraints; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Edit; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Insert; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Post; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Cancel; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Append; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Delete; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Prior; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure First; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Last; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure AddRecord(const FieldNames: array of string; const FieldValues: array of Variant); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure EnableEventHandlers; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableEventHandlers; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function ControlsDisabled: Boolean;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ {$IFDEF MSWINDOWS}
+ protected
+ function InterfaceSupportsErrorInfo(const iid: TGUID): HResult; stdcall;
+ public
+ function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult; override;
+ {$ENDIF}
+ public
+ constructor Create(ADataset: TDataset);
+ destructor Destroy; override;
+ property RowRecIdValue: integer read GetRowRecIdValue;
+ property CurrentRecIdValue: integer read GetCurrentRecIdValue write SetCurrentRecIdValue;
+ // Properties
+ property IsEmpty: boolean read GetIsEmpty;
+ property State: TDatasetState read GetState;
+ property BOF: boolean read GetBOF;
+ property EOF: boolean read GetEOF;
+ property RecordCount: integer read GetRecordCount;
+ property Fields: TDAFieldCollection read GetFields;
+ property Active: boolean read GetActive write SetActive;
+ property FieldCount: integer read GetFieldCount;
+ property FieldValues[Index: integer]: Variant read GetFieldValues;
+ property Names[Index: integer]: string read GetNames;
+ property LogicalName: string read GetLogicalName write SetLogicalName;
+
+ property OnBeforeOpen: TDABeforeOpenDatasetEvent read GetOnBeforeOpen write SetOnBeforeOpen;
+ property OnAfterOpen: TDAAfterOpenDatasetEvent read GetOnAfterOpen write SetOnAfterOpen;
+ property OnOpenError: TDAOpenDatasetErrorEvent read GetOnOpenError write SetOnOpenError;
+ property Name: string read GetName;
+ property Dataset: TDataSet read GetDataset;
+ property SQL: string read GetSQL write SetSQL;
+ property Params: TDAParamCollection read GetParams;
+ property Prepared: boolean read GetPrepared write SetPrepared;
+ property Where: TDAWhere read GetWhere;
+ property OnBeforeExecute: TDABeforeExecuteCommandEvent read GetOnBeforeExecute write SetOnBeforeExecute;
+ property OnAfterExecute: TDAAfterExecuteCommandEvent read GetOnAfterExecute write SetOnAfterExecute;
+ property OnExecuteError: TDAExecuteCommandErrorEvent read GetOnExecuteError write SetOnExecuteError;
+ end;
+
+implementation
+
+uses
+ SysUtils,
+ uROClasses, uDARes, uDAEngine;
+
+{ TDatasetWrapper }
+
+procedure TDatasetWrapper.AddRecord(const FieldNames: array of string;
+ const FieldValues: array of Variant);
+var
+ i: integer;
+begin
+ Insert;
+ for i := 0 to Length(FieldNames) - 1 do
+ FieldByName(FieldNames[i]).Value := FieldValues[i];
+ Post;
+end;
+
+procedure TDatasetWrapper.Append;
+begin
+ FDataset.Append;
+end;
+
+procedure TDatasetWrapper.AttachEventHooks(aDataset: TDataset);
+begin
+ fFields.FieldEventsDisabled := FALSE;
+end;
+
+procedure TDatasetWrapper.BindFields;
+var
+ i: integer;
+ fld: TField;
+ daFld: TDAField;
+ l: TDABlobType;
+begin
+ fFields.Clear;
+ for i := 0 to (Fdataset.FieldCount - 1) do begin
+ fld := Fdataset.Fields[i];
+ daFld := fFields.Add;
+ with daFld do begin
+ Name := fld.FieldName;
+ Size := fld.Size;
+ DataType := VCLTypeToDAType(fld.DataType);
+ for l := dabtBlob to High(TDABlobType) do begin
+ if fld.DataType = BlobTypeMappings[l] then begin
+ BlobType:=l;
+ Break;
+ end;
+ end;
+ end;
+ dafld.Bind(fld);
+ end;
+end;
+
+procedure TDatasetWrapper.Cancel;
+begin
+ FDataset.Cancel;
+end;
+
+procedure TDatasetWrapper.Close;
+begin
+ FDataset.Close;
+end;
+
+constructor TDatasetWrapper.Create(ADataset: TDataset);
+begin
+ Check(ADataset = nil, err_InvalidDataset);
+ inherited Create;
+ FDataset := ADataset;
+ fFields := TDAFieldCollection.Create(nil);
+ fParams := TDAParamCollection.Create(nil);
+ FOld_BeforeClose := FDataset.BeforeClose;
+ FOld_BeforeOpen := FDataset.BeforeOpen;
+ FOld_AfterOpen := FDataset.AfterOpen;
+ FDataset.BeforeClose := DatasetBeforeClose;
+ FDataset.BeforeOpen := DatasetBeforeOpen;
+ FDataset.AfterOpen := DatasetAfterOpen;
+ if FDataset.Active then BindFields;
+end;
+
+procedure TDatasetWrapper.DatasetAfterOpen(DataSet: TDataSet);
+begin
+ BindFields;
+ if Assigned(fAfterOpenIDataset) then fAfterOpenIDataset(Self, '', 0);
+ if Assigned(FOld_AfterOpen) then FOld_AfterOpen(Dataset);
+end;
+
+procedure TDatasetWrapper.DatasetBeforeClose(DataSet: TDataSet);
+begin
+ UnbindFields;
+ if Assigned(FOld_BeforeClose) then FOld_BeforeClose(DataSet);
+end;
+
+procedure TDatasetWrapper.DatasetBeforeOpen(DataSet: TDataSet);
+begin
+ if Assigned(fBeforeOpenIDataset) then fBeforeOpenIDataset(Self);
+ if Assigned(FOld_BeforeOpen) then FOld_BeforeOpen(DataSet);
+end;
+
+procedure TDatasetWrapper.Delete;
+begin
+ FDataset.Delete;
+end;
+
+destructor TDatasetWrapper.Destroy;
+begin
+ UnbindFields;
+ if FDataset <> nil then begin
+ FDataset.BeforeClose := FOld_BeforeClose;
+ FDataset.BeforeOpen := FOld_BeforeOpen;
+ FDataset.AfterOpen := FOld_AfterOpen;
+ end;
+ fFields.Free;
+ fParams.Free;
+ inherited;
+end;
+
+procedure TDatasetWrapper.DetachEventHooks(aDataset: TDataset);
+begin
+ fFields.FieldEventsDisabled := TRUE;
+end;
+
+procedure TDatasetWrapper.DisableConstraints;
+begin
+ // nothing
+end;
+
+procedure TDatasetWrapper.DisableControls;
+begin
+ FDataset.DisableControls;
+end;
+
+procedure TDatasetWrapper.DisableEventHandlers;
+begin
+ DetachEventHooks(Dataset);
+end;
+
+procedure TDatasetWrapper.Edit;
+begin
+ FDataset.Edit;
+end;
+
+procedure TDatasetWrapper.EnableConstraints;
+begin
+ // nothing
+end;
+
+procedure TDatasetWrapper.EnableControls;
+begin
+ FDataset.EnableControls;
+end;
+
+procedure TDatasetWrapper.EnableEventHandlers;
+begin
+ AttachEventHooks(Dataset);
+end;
+
+function TDatasetWrapper.Execute: integer;
+begin
+ // Not implemented
+ result := -1;
+end;
+
+function TDatasetWrapper.FieldByName(const aName: string): TDAField;
+begin
+ Result := fFields.FieldByName(aName);
+end;
+
+function TDatasetWrapper.FindField(const aName: string): TDAField;
+begin
+ result := fFields.FindField(aName);
+end;
+
+procedure TDatasetWrapper.First;
+begin
+ FDataset.First;
+end;
+
+procedure TDatasetWrapper.FreeBookmark(Bookmark: TBookmark);
+begin
+ FDataset.FreeBookmark(Bookmark);
+end;
+
+function TDatasetWrapper.GetActive: boolean;
+begin
+ Result := FDataset.Active;
+end;
+
+function TDatasetWrapper.GetBOF: boolean;
+begin
+ Result := FDataset.Bof;
+end;
+
+function TDatasetWrapper.GetBookMark: TBookmark;
+begin
+ Result := FDataset.GetBookmark;
+end;
+
+function TDatasetWrapper.GetCurrentRecIdValue: integer;
+begin
+ Result := FDataset.RecNo;
+end;
+
+function TDatasetWrapper.GetDataset: TDataset;
+begin
+ Result := FDataset;
+end;
+
+function TDatasetWrapper.GetEOF: boolean;
+begin
+ Result := FDataset.Eof;
+end;
+
+function TDatasetWrapper.GetFieldCount: integer;
+begin
+ Result := fFields.Count;
+end;
+
+function TDatasetWrapper.GetFields: TDAFieldCollection;
+begin
+ result := fFields;
+end;
+
+function TDatasetWrapper.GetFieldValues(Index: integer): Variant;
+begin
+ Result := fFields[Index].Value;
+end;
+
+function TDatasetWrapper.GetIsEmpty: boolean;
+begin
+ Result := FDataset.IsEmpty;
+end;
+
+function TDatasetWrapper.GetLogicalName: string;
+begin
+ Result := FLogicalName;
+end;
+
+function TDatasetWrapper.GetName: string;
+begin
+ if (LogicalName = '') then
+ result := Fdataset.Name
+ else
+ result := LogicalName;
+end;
+
+function TDatasetWrapper.GetNames(Index: integer): string;
+begin
+ Result := Fields[Index].Name;
+end;
+
+function TDatasetWrapper.GetOnAfterExecute: TDAAfterExecuteCommandEvent;
+begin
+ Result := nil;
+ NotSupported();
+end;
+
+function TDatasetWrapper.GetOnAfterOpen: TDAAfterOpenDatasetEvent;
+begin
+ result := fAfterOpenIDataset;
+end;
+
+function TDatasetWrapper.GetOnBeforeExecute: TDABeforeExecuteCommandEvent;
+begin
+ Result := nil;
+ NotSupported();
+end;
+
+function TDatasetWrapper.GetOnBeforeOpen: TDABeforeOpenDatasetEvent;
+begin
+ result := fBeforeOpenIDataset;
+end;
+
+function TDatasetWrapper.GetOnExecuteError: TDAExecuteCommandErrorEvent;
+begin
+ Result := nil;
+ NotSupported();
+end;
+
+function TDatasetWrapper.GetOnOpenError: TDAOpenDatasetErrorEvent;
+begin
+ Result := nil;
+ NotSupported();
+end;
+
+function TDatasetWrapper.GetParams: TDAParamCollection;
+begin
+ Result := fParams;
+end;
+
+function TDatasetWrapper.GetPrepared: boolean;
+begin
+ Result := False;
+ NotSupported();
+end;
+
+function TDatasetWrapper.GetRecordCount: integer;
+begin
+ Result := FDataset.RecordCount;
+end;
+
+function TDatasetWrapper.GetRowRecIDValue: integer;
+begin
+ result := -1;
+end;
+
+function TDatasetWrapper.GetSQL: string;
+begin
+ // Not implemented
+ result := '';
+end;
+
+function TDatasetWrapper.GetState: TDatasetState;
+begin
+ Result := FDataset.State;
+end;
+
+function TDatasetWrapper.GetWhere: TDAWhere;
+begin
+ Result := nil;
+end;
+
+procedure TDatasetWrapper.GotoBookmark(Bookmark: TBookmark);
+begin
+ FDataset.GotoBookmark(Bookmark);
+end;
+
+procedure TDatasetWrapper.Insert;
+begin
+ FDataset.Insert;
+end;
+
+procedure TDatasetWrapper.Last;
+begin
+ FDataset.Last;
+end;
+
+function TDatasetWrapper.Locate(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+begin
+ Result := FDataset.Locate(KeyFields, KeyValues, Options);
+end;
+
+function TDatasetWrapper.Lookup(const KeyFields: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ Result := FDataset.Lookup(KeyFields, KeyValues, ResultFields);
+end;
+
+procedure TDatasetWrapper.Next;
+begin
+ FDataset.Next;
+end;
+
+procedure TDatasetWrapper.Open;
+begin
+ Dataset.Open;
+end;
+
+function TDatasetWrapper.ParamByName(const aName: string): TDAParam;
+begin
+ Result := nil;
+ NotSupported();
+end;
+
+procedure TDatasetWrapper.Post;
+begin
+ FDataset.Post;
+end;
+
+procedure TDatasetWrapper.Prior;
+begin
+ FDataset.Prior;
+end;
+
+procedure TDatasetWrapper.Refresh;
+begin
+ FDataset.Refresh;
+end;
+
+procedure TDatasetWrapper.RefreshParams;
+begin
+ // Not implemented
+ NotSupported();
+end;
+
+procedure TDatasetWrapper.SetActive(Value: boolean);
+begin
+ FDataset.Active := Value;
+end;
+
+procedure TDatasetWrapper.SetCurrentRecIdValue(Value: integer);
+begin
+ FDataset.RecNo := Value;
+end;
+
+procedure TDatasetWrapper.SetLogicalName(aName: string);
+begin
+ FLogicalName := AName;
+end;
+
+procedure TDatasetWrapper.SetOnAfterExecute(
+ const Value: TDAAfterExecuteCommandEvent);
+begin
+ NotSupported();
+end;
+
+procedure TDatasetWrapper.SetOnAfterOpen(
+ const Value: TDAAfterOpenDatasetEvent);
+begin
+ fAfterOpenIDataset := Value;
+end;
+
+procedure TDatasetWrapper.SetOnBeforeExecute(
+ const Value: TDABeforeExecuteCommandEvent);
+begin
+ NotSupported();
+end;
+
+procedure TDatasetWrapper.SetOnBeforeOpen(
+ const Value: TDABeforeOpenDatasetEvent);
+begin
+ fBeforeOpenIDataset := Value;
+end;
+
+procedure TDatasetWrapper.SetOnExecuteError(
+ const Value: TDAExecuteCommandErrorEvent);
+begin
+ NotSupported();
+end;
+
+procedure TDatasetWrapper.SetOnOpenError(
+ const Value: TDAOpenDatasetErrorEvent);
+begin
+ NotSupported();
+end;
+
+procedure TDatasetWrapper.SetPrepared(Value: boolean);
+begin
+ NotSupported();
+end;
+
+procedure TDatasetWrapper.SetSQL(const Value: string);
+begin
+ // Not implemented
+end;
+
+procedure TDatasetWrapper.UnbindFields;
+var
+ i: integer;
+begin
+ for i := 0 to (FFields.Count - 1) do
+ fFields[i].Unbind;
+end;
+
+
+{$IFDEF MSWINDOWS}
+function TDatasetWrapper.InterfaceSupportsErrorInfo(const iid: TGUID): HResult;
+begin
+ if GetInterfaceEntry(iid) <> nil then
+ Result := S_OK
+ else
+ Result := S_FALSE;
+
+end;
+
+function TDatasetWrapper.SafeCallException(ExceptObject: TObject;
+ ExceptAddr: Pointer): HResult;
+begin
+ Result := uDAEngine.DAHandleSafeCallException(self,ExceptObject, ExceptAddr);
+end;
+{$ENDIF}
+
+function TDatasetWrapper.GetDynamicWhere: TDAWhereBuilder;
+begin
+ Result:=nil;
+end;
+
+procedure TDatasetWrapper.SetDynamicWhere(const Value: TDAWhereBuilder);
+begin
+ // nothing
+end;
+
+function TDatasetWrapper.SQLContainsDynamicWhere: boolean;
+begin
+ Result:=False;
+ // Not implemented
+end;
+
+function TDatasetWrapper.BookmarkValid(Bookmark: TBookmark): Boolean;
+begin
+ Result := FDataset.BookmarkValid(Bookmark);
+end;
+
+function TDatasetWrapper.ControlsDisabled: Boolean;
+begin
+ Result := FDataset.ControlsDisabled;
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADelta.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADelta.pas
new file mode 100644
index 0000000..07ef2f3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADelta.pas
@@ -0,0 +1,1455 @@
+unit uDADelta;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+{.$DEFINE uDADelta_DEBUG}
+interface
+
+uses
+ Classes, DB, SysUtils,
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF}
+ uRODL, uROTypes, uROClasses, uROClientIntf,
+ uDAInterfaces, uDAEngine,
+ DataAbstract3_Intf, DataAbstract4_Intf;
+
+const
+ UndefinedRecordID = -1;
+
+type
+ IDADelta = interface;
+ TDADelta = class;
+ TDADeltaChange = class;
+
+ TVariantArray = array of variant;
+
+ { Exceptions }
+ EDAApplyUpdateFailed = class(EROException)
+ private
+ fRecID: integer;
+ fDeltaName: string;
+
+ public
+ constructor Create(aChange: TDADeltaChange; anOriginalException: Exception);
+
+ published
+ property RecID: integer read fRecID write fRecID;
+ property DeltaName: string read fDeltaName write fDeltaName;
+ end;
+
+ IDADataTable = interface
+ ['{BC6CD610-6D6E-4CD7-B181-73B3A5F9DE4F}']
+ end;
+
+ { IDADeltaOwner }
+ IDADeltaOwner = interface
+ ['{A92ECD00-14B2-4147-AE49-9493C56763A0}']
+ function GetDelta: IDADelta; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ { TDADeltaChange }
+ TDADeltaChange = class
+ private
+ fDelta: TDADelta;
+ fRecID: integer;
+ fNewValues: TVariantArray;
+ fOldValues: TVariantArray;
+ fChangeType: TDAChangeType;
+ fStatus: TDAChangeStatus;
+ fMessage: string;
+ fRefreshedByServer: boolean;
+
+ procedure SetNewValue(const aName: string; const Value: Variant);
+ procedure SetOldValue(const aName: string; const Value: Variant);
+ function GetNewValue(const aName: string): Variant;
+ function GetOldValue(const aName: string): Variant;
+ function GetDelta: IDADelta;
+ protected
+
+ public
+ constructor Create(aDelta: TDADelta;
+ aRecID: integer;
+ aChangeType: TDAChangeType;
+ aStatus: TDAChangeStatus = csPending;
+ aMessage: string = '');
+ destructor Destroy; override;
+
+ property RecID: integer read fRecID write fRecID;
+ property ChangeType: TDAChangeType read fChangeType write fChangeType;
+ property OldValues: TVariantArray read fOldValues write fOldValues;
+ property NewValues: TVariantArray read fNewValues write fNewValues;
+
+ property OldValueByName[const aName: string]: Variant read GetOldValue write SetOldValue;
+ property NewValueByName[const aName: string]: Variant read GetNewValue write SetNewValue;
+
+ property Status: TDAChangeStatus read fStatus write fStatus;
+ property Message: string read fMessage write fMessage;
+
+ property Delta : IDADelta read GetDelta;
+
+ property RefreshedByServer : boolean read fRefreshedByServer write fRefreshedByServer;
+ end;
+
+ { IDADelta }
+ IDADelta = interface
+ ['{0FD17DDB-3C34-4520-9106-4D3D540BA3D3}']
+ // Property readers/writers
+ function GetLoggedFieldCount: integer;
+ function GetInChange(aDataTable: TComponent = nil): boolean;
+ function GetCount: integer;
+ function GetBlockedRecordCount: integer;
+ function GetChange(Index: integer): TDADeltaChange;
+ function GetLoggedFieldNames(Index: integer): string;
+ function GetKeyFieldCount: integer;
+ function GetKeyFieldNames(Index: integer): string;
+ function GetLoggedFieldTypes(Index : integer): TDADataType;
+ procedure SetLoggedFieldTypes(anIndex : integer; aFieldType : TDADataType);
+ function GetLogicalName : string;
+ procedure SetLogicalName(const aName : string);
+
+ // Methods
+ procedure AssignDataTable(aDataTable : TComponent);
+
+ function FindChange(aRecID: integer): TDADeltaChange;
+ procedure RemoveChange(aChange: TDADeltaChange);
+
+ procedure Clear(DoClearFieldNames: boolean = FALSE; DoClearKeyFieldNames: boolean = FALSE);
+
+ procedure AddFieldName(const aFieldName: string; const aDataType: TDADataType = datUnknown);
+ procedure AddKeyFieldName(const aKeyFieldName: string);
+
+ procedure ClearFieldNames;
+ procedure ClearKeyFieldNames;
+
+ procedure StartChange(aChangeType: TDAChangeType; aDataTable : TComponent = nil);
+ procedure CancelChange(aDataTable : TComponent = nil);
+ procedure CancelChangesInAllTables;
+ procedure EndChange(aDataTable : TComponent = nil);
+ procedure EndChangesInAllTables;
+ procedure RestoreLastChange(aDataTable : TComponent = nil);
+ function IsCanEditCurrentRow(aDataTable : TComponent): Boolean;
+
+ function IsNewRecord(aRecordID: integer = -1): boolean;
+
+ procedure Add(aChange: TDADeltaChange); overload;
+ function Add(aRecordID: integer; aChangeType: TDAChangeType;
+ aStatus: TDAChangeStatus = csPending; const aMessage: string = ''): TDADeltaChange; overload;
+ procedure Delete(Index: integer);
+
+ function GetCountByStatus(aChangeStatus : TDAChangeStatus) : integer;
+
+ function IndexOfLoggedField(const aName: string): integer;
+ property LoggedFieldNames[Index: integer]: string read GetLoggedFieldNames;
+ property LoggedFieldCount: integer read GetLoggedFieldCount;
+
+ property KeyFieldNames[Index: integer]: string read GetKeyFieldNames;
+ property KeyFieldCount: integer read GetKeyFieldCount;
+
+ property LoggedFieldTypes[Index : integer]: TDADataType read GetLoggedFieldTypes write SetLoggedFieldTypes;
+
+ function GetDelta: TDADelta;
+ procedure RemoveUnchangedChanges;
+ procedure RemoveLoggedField(Index: integer); overload;
+ procedure RemoveLoggedField(AFieldName: string);overload;
+
+ property LogicalName : string read GetLogicalName write SetLogicalName;
+ property Changes[Index: integer]: TDADeltaChange read GetChange; default;
+ property Count: integer read GetCount;
+ property BlockedRecordCount: integer read GetBlockedRecordCount;
+ end;
+
+ { IDADataReader }
+ IDADataReader = interface
+ ['{7D2FC996-7A04-4ECE-91B0-4F17EFEC4985}']
+ function GetFieldNames(Index: integer): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldIndexes(const aName: string): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetRecordCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetAsBoolean(Index: integer): boolean; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsCurrency(Index: integer): currency; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsDateTime(Index: integer): TDateTime; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsFloat(Index: integer): double; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsInteger(Index: integer): integer; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsString(Index: integer): string; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsVariant(Index: integer): variant; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetAsBoolean(const FieldName: string): boolean; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsCurrency(const FieldName: string): currency; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsDateTime(const FieldName: string): TDateTime; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsFloat(const FieldName: string): double; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsInteger(const FieldName: string): integer; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsString(const FieldName: string): string; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsVariant(const FieldName: string): variant; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function First: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Next: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ property FieldNames[Index: integer]: string read GetFieldNames;
+ property FieldIndexes[const aFieldName: string]: integer read GetFieldIndexes;
+ property FieldCount: integer read GetFieldCount;
+
+ property RecordCount: integer read GetRecordCount;
+ end;
+
+ { TDADeltaList }
+ TDADeltaList = class(TInterfaceList)
+ private
+ function GetDeltas(Index: integer): IDADelta;
+
+ protected
+ public
+ function Add(const aDelta : IDADelta) : integer; reintroduce;
+ procedure Insert(Index: Integer; const aDelta: IDADelta); reintroduce;
+
+ function DeltaByName(const aDeltaName : string) : IDADelta;
+ function FindDelta(const aDeltaName : string) : IDADelta;
+
+ property Deltas[Index : integer] : IDADelta read GetDeltas; default;
+ end;
+
+ PDAChangeRecord = ^TDAChangeRecord;
+ TDAChangeRecord = record
+ DataTable: TComponent;
+ LastChange,
+ CurrentChange: TDADeltaChange;
+ NewChange: boolean;
+ CurrentChangeType: TDAChangeType;
+ end;
+
+ { TDADelta }
+ TDADelta = class(TDAEngineBaseObject, IDADelta, IDADataReader)
+ private
+ fDataTable: TComponent;
+ fChanges: TStringList;
+ fKeyFields,
+ fFieldNames: TStringList;
+ fCurrPosition: integer;
+ fLogicalName : string;
+ fChangeRecordList: TThreadList;
+ fBlockedRecordList: TThreadList;
+
+ function GetLoggedFieldCount: integer;
+ function GetInChange(aDataTable: TComponent = nil): boolean;
+ function GetCount: integer;
+ function GetChange(Index: integer): TDADeltaChange;
+ function GetLoggedFieldNames(Index: integer): string;
+ function GetKeyFieldCount: integer;
+ function GetKeyFieldNames(Index: integer): string;
+ function GetLoggedFieldTypes(Index : integer): TDADataType;
+ procedure SetLoggedFieldTypes(anIndex : integer; aFieldType : TDADataType);
+ procedure DeleteChange(anIndex : integer);
+ function GetChangeRecord(aDataTable: TComponent = nil; aCreateIfEmpty: Boolean = False): PDAChangeRecord;
+ function IsBlockedRecord(aChange: TDADeltaChange):Boolean;overload;
+ function IsBlockedRecord(aRecID: integer):Boolean;overload;
+ function BlockRecord(aChange: TDADeltaChange): Boolean;
+ procedure UnblockRecord(aChange: TDADeltaChange);
+ function GetBlockedRecordCount: integer;
+ procedure CanApplyDeltaChanges;
+ procedure intRemoveChange(aChange: TDADeltaChange);
+ function TryToLockDelta(aDataTable: TComponent; aRaiseException: Boolean): Boolean;
+ protected
+ function GetDelta: TDADelta;
+ function GetLogicalName : string;
+ procedure SetLogicalName(const aName : string);
+
+ // IDADataReader
+ function GetFieldNames(Index: integer): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldIndexes(const aName: string): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsBoolean(Index: integer): boolean; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsCurrency(Index: integer): currency; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsDateTime(Index: integer): TDateTime; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsFloat(Index: integer): double; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsInteger(Index: integer): integer; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsString(Index: integer): string; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsVariant(Index: integer): variant; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsBoolean(const FieldName: string): boolean; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsCurrency(const FieldName: string): currency; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsDateTime(const FieldName: string): TDateTime; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsFloat(const FieldName: string): double; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsInteger(const FieldName: string): integer; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsString(const FieldName: string): string; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAsVariant(const FieldName: string): variant; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetRecordCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function First: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Next: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ public
+ constructor Create(aDataTable: TComponent); overload;
+ constructor Create(const aLogicalName : string); overload;
+ constructor Create; overload;
+ destructor Destroy; override;
+
+ function FindChange(aRecID: integer): TDADeltaChange;
+ procedure RemoveChange(aChange: TDADeltaChange);
+
+ procedure Clear(DoClearFieldNames: boolean = FALSE; DoClearKeyFieldNames: boolean = FALSE);
+
+ procedure AssignDataTable(aDataTable : TComponent);
+
+ procedure AddFieldName(const aFieldName: string; const aDataType: TDADataType = datUnknown);
+ procedure AddKeyFieldName(const aKeyFieldName: string);
+ procedure ClearFieldNames;
+ procedure ClearKeyFieldNames;
+ procedure RemoveUnchangedChanges;
+
+ procedure Add(aChange: TDADeltaChange); overload;
+ function Add(aRecordID: integer; aChangeType: TDAChangeType;
+ aStatus: TDAChangeStatus = csPending; const aMessage: string = ''): TDADeltaChange; overload;
+ procedure Delete(Index: integer);
+
+ procedure StartChange(aChangeType: TDAChangeType; aDataTable : TComponent = nil);
+ procedure CancelChange(aDataTable : TComponent = nil);
+ procedure CancelChangesInAllTables;
+ procedure EndChange(aDataTable : TComponent = nil);
+ procedure EndChangesInAllTables;
+ procedure RestoreLastChange(aDataTable : TComponent = nil);
+ function IsCanEditCurrentRow(aDataTable : TComponent): Boolean;
+
+ function IsNewRecord(aRecordID: integer = -1): boolean;
+
+ function IndexOfLoggedField(const aName: string): integer;
+
+ function GetCountByStatus(aChangeStatus : TDAChangeStatus) : integer;
+ procedure RemoveLoggedField(Index: integer); overload;
+ procedure RemoveLoggedField(AFieldName: string);overload;
+
+ function CurrentChange(aDataTable : TComponent = nil): TDADeltaChange;
+
+ property KeyFieldNames[Index: integer]: string read GetKeyFieldNames;
+ property KeyFieldCount: integer read GetKeyFieldCount;
+
+ property LoggedFieldNames[Index: integer]: string read GetLoggedFieldNames;
+ property LoggedFieldCount: integer read GetLoggedFieldCount;
+ property LoggedFieldTypes[Index : integer]: TDADataType read GetLoggedFieldTypes write SetLoggedFieldTypes;
+ function InChange(aDataTable : TComponent = nil): boolean;
+
+ property Changes[Index: integer]: TDADeltaChange read GetChange; default;
+ property Count: integer read GetCount;
+ //property DataTable: TComponent read fDataTable;
+ end;
+
+function FormatRecIDString(aRecID: integer): string;
+function NewDelta(aDeltaName: string): IDADelta; overload;
+
+function FieldValueToVariant(aSourceField : TDAField) : Variant;
+procedure VariantToFieldValue(const aSourceVariant : Variant; aField : TDAField);
+
+
+implementation
+
+uses
+ Variants, TypInfo,
+ uROClient, uROSessions, uROXMLIntf,
+ uDARes, uDARegExpr, uDADataTable;
+
+function CreateChangeRecord(aDataTable: TComponent): PDAChangeRecord;
+begin
+ GetMem(Result, SizeOf(TDAChangeRecord));
+ FillChar(Result^, SizeOf(TDAChangeRecord), 0);
+ Result^.DataTable := aDataTable;
+end;
+
+procedure FreeChangeRecord(aRecord: pointer);
+begin
+ FreeMem(aRecord);
+end;
+
+function FormatRecIDString(aRecID: integer): string;
+begin
+ result := FormatFloat('0000000000', aRecID);
+end;
+
+function NewDelta(aDeltaName: string): IDADelta;
+begin
+ result := TDADelta.Create(aDeltaName);
+end;
+
+{ TDADeltaList }
+
+function TDADeltaList.Add(const aDelta: IDADelta): integer;
+begin
+ result := inherited Add(aDelta);
+end;
+
+function TDADeltaList.DeltaByName(const aDeltaName: string): IDADelta;
+begin
+ result := FindDelta(aDeltaName);
+ if (result=NIL) then raise Exception.Create('Cannot find delta '+aDeltaName);
+end;
+
+function TDADeltaList.FindDelta(const aDeltaName: string): IDADelta;
+var i : integer;
+begin
+ result := NIL;
+ for i := 0 to (Count-1) do
+ if SameText(Deltas[i].LogicalName, aDeltaName) then begin
+ result := Deltas[i];
+ Exit;
+ end;
+end;
+
+function TDADeltaList.GetDeltas(Index: integer): IDADelta;
+begin
+ result := inherited Items[Index] as IDADelta;
+end;
+
+procedure TDADeltaList.Insert(Index: Integer; const aDelta: IDADelta);
+begin
+ inherited Insert(Index, aDelta);
+end;
+
+{ TDADelta }
+
+constructor TDADelta.Create(const aLogicalName: string);
+begin
+ inherited Create;
+
+ // This error is often generated if the user forgets to set LogicalName in the data table
+ if (aLogicalName='') then raise Exception.Create('Cannot create a delta without a name');
+
+ fLogicalName := aLogicalName;
+
+ fKeyFields := TStringList.Create;
+ fFieldNames := TStringList.Create;
+
+ fChanges := TStringList.Create;
+ fChanges.Duplicates := dupError;
+// fChanges.Sorted := TRUE;
+ fChangeRecordList:= TThreadList.Create;
+ fBlockedRecordList:= TThreadList.Create;
+end;
+
+constructor TDADelta.Create;
+begin
+ Create(NewGuidAsString);
+end;
+
+function TDADelta.CurrentChange(aDataTable: TComponent): TDADeltaChange;
+var
+ lRecord : PDAChangeRecord;
+begin
+ if aDataTable = nil then aDataTable := fDataTable;
+ lRecord := GetChangeRecord(aDataTable, False);
+ if Assigned(lRecord) then
+ Result := lRecord^.CurrentChange
+ else
+ Result := nil;
+end;
+
+constructor TDADelta.Create(aDataTable: TComponent);
+var i: integer;
+ dnme : string;
+ dt: TDADataTable;
+begin
+ { AleF: Changed the logic of how delta creation works. The name of the delta is required and, if using
+ this overloaded version of create, it will be taken from the datatable.LogicalName.
+ This was made to optimize the adapters which, right noiw, require a list of delta names and
+ one of deltas. Because of this change, adapters can find the name from the delta itself.
+ }
+ if (aDataTable=NIL) then raise Exception.Create('Datatable must be assigned');
+ dt:=aDataTable as TDADataTable;
+ if (dt.LogicalName<>'') then
+ dnme := dt.LogicalName
+ else
+ dnme := dt.Name;
+
+ Create(dnme); // Calls the constructor above;
+ fDataTable := aDataTable;
+
+ for i := 0 to (dt.Fields.Count - 1) do
+ with dt.Fields[i] do begin
+ if LogChanges or InPrimaryKey then fFieldNames.Add(Name);
+ if InPrimaryKey then fKeyFields.Add(Name);
+ end;
+
+ for i := 0 to (fFieldNames.Count-1) do
+ fFieldNames.Objects[i] := TObject(ord(dt.FieldByName(fFieldNames[i]).DataType));
+end;
+
+destructor TDADelta.Destroy;
+var
+ lList: TList;
+ lRecord: PDAChangeRecord;
+ i: integer;
+begin
+ // Removes the current change (if new and not yet in the changes list)
+ lList := fChangeRecordList.LockList;
+ try
+ for I := 0 to lList.Count - 1 do begin
+ lRecord := PDAChangeRecord(lList[i]);
+ if (lRecord <> nil) then
+ if (lRecord^.CurrentChange<>NIL) then
+ if (FindChange(lRecord^.CurrentChange.RecID)=NIL) then FreeAndNIL(lRecord^.CurrentChange);
+ end;
+ finally
+ fChangeRecordList.UnlockList;
+ end;
+
+
+ if (fChanges<>NIL) then begin
+ Clear;
+ fChanges.Free;
+ end;
+
+ fFieldNames.Free;
+ fKeyFields.Free;
+ fChangeRecordList.Free;
+ fBlockedRecordList.Free;
+ inherited;
+end;
+
+function TDADelta.GetLoggedFieldCount: integer;
+begin
+ result := fFieldNames.Count;
+end;
+
+function FieldValueToVariant(aSourceField : TDAField) : Variant;
+var stream : IROStream;
+ p : pointer;
+ sze : cardinal;
+begin
+ case aSourceField.DataType of
+ datBlob : begin
+ if aSourceField.IsNull {or (aSourceField.BlobSize = 0)} then result := Unassigned
+ else begin
+ stream := NewROStream;
+ aSourceField.SaveToStream(stream);
+ sze := stream.Size;
+ if stream.Size = 0 then
+ result := Unassigned
+ else begin
+ stream.Position := 0;
+ result := VarArrayCreate([0, sze-1], varByte);
+ p := VarArrayLock(result);
+ try
+ stream.Read(p^, sze);
+ finally
+ VarArrayUnlock(result);
+ end;
+ stream.Position := 0;
+ end;
+ end;
+ end;
+ {$IFDEF DA_WideMemoSupport}
+ datXml,
+ datWideMemo:
+ if aSourceField.IsNull then
+ Result := Unassigned
+ else
+ Result:= aSourceField.AsWideString;
+ {$ENDIF}
+ else result := aSourceField.Value;
+ end;
+end;
+
+procedure VariantToFieldValue(const aSourceVariant : Variant; aField : TDAField);
+var stream : IROStream;
+ p : pointer;
+ readcount, sze : cardinal;
+begin
+ case aField.DataType of
+ datBlob:
+ if VarIsEmpty(aSourceVariant) then begin
+ aField.Value := Unassigned;
+ end
+ else begin
+ if VarType(aSourceVariant) = varString then begin
+ aField.AsAnsiString:= VarToAnsiStr(aSourceVariant);
+ end
+ else begin
+ stream := NewROStream;
+
+ sze := VarArrayHighBound(aSourceVariant, 1) - VarArrayLowBound(aSourceVariant, 1) + 1;
+ p := VarArrayLock(aSourceVariant);
+ try
+ readcount := stream.Write(p^, sze);
+ finally
+ VarArrayUnlock(aSourceVariant);
+ end;
+
+ if (readcount<>sze)
+ then raise Exception.CreateFmt('Couldn''t read all data. Expected %d read %d', [sze, readcount]);
+
+ stream.Position := 0;
+ aField.LoadFromStream(stream);
+ end;
+ end;
+ {$IFDEF DA_WideMemoSupport}
+ datXml,
+ datWideMemo: aField.AsWideString:=aSourceVariant;
+ {$ENDIF DA_WideMemoSupport}
+ else aField.Value := aSourceVariant;
+ end;
+end;
+
+procedure TDADelta.StartChange(aChangeType: TDAChangeType; aDataTable : TComponent = nil);
+var
+ recid: integer;
+ x, i: integer;
+ lRecord: PDAChangeRecord;
+ lChange: TDADeltaChange;
+begin
+ {$IFDEF uDADelta_DEBUG}
+ OutputDebugString(Pchar('StartChange('+inttoStr(ord(aChangeType))+', $'+inttoHex(Cardinal(aDataTable),8)+')'));
+ {$ENDIF}
+ if aDataTable = nil then aDataTable := fDataTable;
+ if not Assigned(aDataTable) then RaiseError(err_NotAttachedToDataTable);
+ if not Assigned(fDataTable) then RaiseError(err_NotAttachedToDataTable);
+ TryToLockDelta(aDataTable, True);
+
+ lRecord := GetChangeRecord(aDataTable,True);
+ if lRecord^.CurrentChange <> nil then RaiseError(err_ChangeLogAlreadyStarted);
+
+
+ // Checks to see if this is the first time this record was changed
+ if (aChangeType <> ctInsert) then begin
+ recid := (aDataTable as TDADataTable).GetRowRecIDValue; // CurrRecId;
+ if IsBlockedRecord(recid) then RaiseError('Cannot edit the record because it is edited by other table');
+ lChange := FindChange(recid);
+ if (lChange <> nil) and (not BlockRecord(lChange)) then RaiseError('Cannot edit the record because it is edited by other table');
+ lRecord^.CurrentChange := lChange;
+ lRecord^.NewChange := (lChange = nil);
+ end
+ else begin
+ recid := UndefinedRecordID;
+ lRecord^.NewChange := TRUE;
+ end;
+
+ lRecord^.CurrentChangeType := aChangeType;
+
+ if lRecord^.NewChange then begin
+ lRecord^.CurrentChange := TDADeltaChange.Create(Self, recid, aChangeType);
+ BlockRecord(lRecord^.CurrentChange);
+
+ // For deletes and edit, we want to store the original values.
+ // This happens only once.
+ case aChangeType of
+ ctDelete, ctUpdate: begin
+ with (fDataTable as TDADataTable).Fields do begin
+ x := 0;
+ for i := 0 to ((fDataTable as TDADataTable).FieldCount - 1) do begin
+ if Fields[i].LogChanges or Fields[i].InPrimaryKey then begin
+ lRecord^.CurrentChange.OldValues[x] := FieldValueToVariant(Fields[i]);
+ Inc(x);
+ end;
+ end;
+ end;
+ end
+ end;
+ end;
+end;
+
+procedure TDADelta.UnblockRecord(aChange: TDADeltaChange);
+begin
+ if aChange <> nil then fBlockedRecordList.Remove(aChange);
+ {$IFDEF uDADelta_DEBUG}
+ OutputDebugString(Pchar('UnblockRecord($'+inttoHex(integer(aChange),8)+')'));
+ {$ENDIF}
+end;
+
+procedure TDADelta.CanApplyDeltaChanges;
+begin
+ if GetBlockedRecordCount <> 0 then RaiseError('Cannot update delta, some records are under editing!');
+end;
+
+procedure TDADelta.CancelChange(aDataTable : TComponent = nil);
+var
+ lRecord: PDAChangeRecord;
+begin
+ {$IFDEF uDADelta_DEBUG}
+ OutputDebugString(Pchar('CancelChange($'+inttoHex(Cardinal(aDataTable),8)+')'));
+ {$ENDIF}
+ if aDataTable = nil then aDataTable := fDataTable;
+ lRecord := GetChangeRecord(aDataTable,False);
+ if lRecord = nil then Exit; // no changes for this table
+ UnblockRecord(lRecord^.CurrentChange);
+ //if not Assigned(fDataTable) then RaiseError(err_NotAttachedToDataTable);
+ if lRecord^.NewChange then FreeAndNIL(lRecord^.CurrentChange); // if it is not a new change (i.e. cancelling an edit) should not free!
+ lRecord^.CurrentChange := nil; // nil it in either case!
+end;
+
+procedure TDADelta.CancelChangesInAllTables;
+var
+ i: integer;
+ lList: TList;
+ lrecord: PDAChangeRecord;
+ dt: TDADataTable;
+begin
+ lList:= fChangeRecordList.LockList;
+ try
+ for I := 0 to lList.Count - 1 do begin
+ lrecord := PDAChangeRecord(lList[i]);
+ if (lrecord^.CurrentChange <> nil) then begin
+ dt := TDADataTable(lrecord^.DataTable);
+ if dt.State in [dsInsert, dsEdit] then dt.Cancel;
+ end;
+ FreeChangeRecord(lrecord);
+ end;
+ lList.Clear;
+ finally
+ fChangeRecordList.UnlockList;
+ end;
+end;
+
+function TDADelta.IsCanEditCurrentRow(aDataTable: TComponent): Boolean;
+var
+ recid: integer;
+ lRecord: PDAChangeRecord;
+ lChange: TDADeltaChange;
+begin
+ Result := False;
+ if aDataTable = nil then aDataTable := fDataTable;
+ if not Assigned(aDataTable) or not Assigned(fDataTable) then exit;
+ if not TryToLockDelta(aDataTable,False) then Exit;
+
+ lRecord := GetChangeRecord(aDataTable, False);
+ if (lRecord <> nil) and (lRecord^.CurrentChange <> nil) then Exit;
+
+ recid := (aDataTable as TDADataTable).GetRowRecIDValue; // CurrRecId;
+ if IsBlockedRecord(recid) then Exit;
+ lChange := FindChange(recid);
+ Result := (lChange = nil) or not IsBlockedRecord(lChange);
+end;
+
+function TDADelta.TryToLockDelta(aDataTable: TComponent; aRaiseException: Boolean): Boolean;
+var
+ lList: TList;
+ i,l: integer;
+ ldatatable: TDADataTable;
+begin
+ Result := True;
+ l := 0;
+ ldatatable := nil;
+ lList := fChangeRecordList.LockList;
+ try
+ for I := 0 to lList.Count - 1 do begin
+ if PDAChangeRecord(lList[i])^.CurrentChange <> nil then begin
+ Inc(l);
+ ldatatable := TDADataTable(PDAChangeRecord(lList[i])^.DataTable);
+ end;
+ end;
+ if l = 0 then
+ Exit
+ else if (l = 1) and (ruoOnPost in ldatatable.RemoteUpdatesOptions) then begin
+ Result := False;
+ if aRaiseException then RaiseError('Cannot StartChange. Another table (%s) exclusively locks delta.',[lDataTable.Name])
+ end
+ else if (ruoOnPost in TDADataTable(adatatable).RemoteUpdatesOptions) then begin
+ Result := False;
+ if aRaiseException then RaiseError('%s:Cannot exclusively lock delta. %d change(s) are already started.',[aDataTable.Name,l]);
+ end;
+ finally
+ fChangeRecordList.UnlockList;
+ end;
+end;
+
+procedure TDADelta.EndChange(aDataTable : TComponent = nil);
+var
+ x, i: integer;
+ lWasChanged: Boolean;
+ lLoggedFieldName: string;
+ lNewValue, lOldValue: Variant;
+ lDataTable: TDAdataTable;
+ lRecord: PDAChangeRecord;
+begin
+ {$IFDEF uDADelta_DEBUG}
+ OutputDebugString(Pchar('EndChange($'+inttoHex(Cardinal(aDataTable),8)+')'));
+ {$ENDIF}
+ if aDataTable = nil then aDataTable := fDataTable;
+ if not Assigned(aDataTable) then RaiseError(err_NotAttachedToDataTable);
+ if not Assigned(fDataTable) then RaiseError(err_NotAttachedToDataTable);
+ lRecord := GetChangeRecord(aDataTable,False);
+ if not Assigned(lRecord) then begin
+ if (aDataTable <> fDataTable) then
+ RaiseError('Delta is not been started for %s',[aDataTable.Name])
+ else
+ RaiseError('Delta is not been started');
+ end;
+
+ lDataTable := (aDataTable as TDADataTable);
+ try
+ if (lRecord^.CurrentChange.RecID = UndefinedRecordID) then
+ lRecord^.CurrentChange.RecID := lDataTable.GetRowRecIDValue // Happens on inserts and first time changes (except deletes)
+ else if (lRecord^.CurrentChange.RecID <> lDataTable.GetRowRecIDValue)then
+ raise Exception.Create('Record pointer changed!');
+
+ // Doing a new operation on the same record
+ if (lRecord^.CurrentChange.ChangeType <> lRecord^.CurrentChangeType) then begin
+ case lRecord^.CurrentChangeType of
+ ctDelete: begin
+ if (lRecord^.CurrentChange.ChangeType = ctInsert) then begin // No need to track new records that have been deleted
+ UnblockRecord(lRecord^.CurrentChange);
+ intRemoveChange(lRecord^.CurrentChange);
+ lRecord^.CurrentChange := nil;
+ Exit; // Done!
+ end
+ else begin
+ lRecord^.CurrentChange.ChangeType := lRecord^.CurrentChangeType; // Deletes have precedence over anything else
+ for i := 0 to (LoggedFieldCount - 1) do
+ lRecord^.CurrentChange.NewValues[i] := UnAssigned;
+ end;
+ end;
+ end;
+ end;
+
+ case lRecord^.CurrentChange.ChangeType of
+ ctUpdate, ctInsert: begin
+ with lDataTable.Fields do begin
+ lWasChanged := False;
+ x := 0;
+ for i := 0 to (lDataTable.FieldCount - 1) do begin
+ if Fields[i].LogChanges or Fields[i].InPrimaryKey then begin
+ lRecord^.CurrentChange.NewValues[x] := FieldValueToVariant(Fields[i]);
+ lOldValue := null; // fix for "Invalid Variant Type" exception in Win2000
+ lNewValue := null; // fix for "Invalid Variant Type" exception in Win2000
+ lOldValue := lRecord^.CurrentChange.OldValues[x];
+ lNewValue := lRecord^.CurrentChange.NewValues[x];
+ if lRecord^.CurrentChange.ChangeType = ctUpdate then begin
+ lWasChanged := lWasChanged or not ROVariantsEqual(lOldValue, lNewValue);
+ end else begin
+ lLoggedFieldName := lRecord^.CurrentChange.Delta.LoggedFieldNames[x];
+ if FieldByName(lLoggedFieldName).InPrimaryKey {and VarIsEmpty(lOldValue)} then begin
+ lRecord^.CurrentChange.OldValues[x] := lNewValue;
+ end;
+ end;
+ Inc(x);
+ end;
+ end;
+ if (lRecord^.CurrentChange.ChangeType = ctUpdate) and (not lWasChanged) then begin //The change doesn't affect any fields with LogChanges
+ CancelChange(aDataTable);
+ Exit; // Done!
+ end;
+ end;
+ end;
+ end;
+
+ if lRecord^.NewChange then fChanges.AddObject(FormatRecIDString(lRecord^.CurrentChange.RecID), lRecord^.CurrentChange);
+
+ finally
+ // ALEF: added to keep a log of the last change in case a post fails. It will be restored in such case
+ // via the InternalOnPostError through a call to RestoreLastChange
+ UnblockRecord(lRecord^.CurrentChange);
+ lRecord^.LastChange := lRecord^.CurrentChange;
+
+ lRecord^.CurrentChange := nil;
+ end;
+end;
+
+procedure TDADelta.EndChangesInAllTables;
+var
+ i: integer;
+ lList: TList;
+ lrecord: PDAChangeRecord;
+ dt: TDADataTable;
+begin
+ lList:= fChangeRecordList.LockList;
+ try
+ for I := 0 to lList.Count - 1 do begin
+ lrecord := PDAChangeRecord(lList[i]);
+ if (lrecord^.CurrentChange <> nil) then begin
+ dt := TDADataTable(lrecord^.DataTable);
+ if dt.State in [dsInsert, dsEdit] then dt.Post;
+ end;
+ end;
+ finally
+ fChangeRecordList.UnlockList;
+ end;
+end;
+
+function TDADelta.GetInChange(aDataTable: TComponent = nil): boolean;
+var
+ lRecord : PDAChangeRecord;
+begin
+ if aDataTable = nil then aDataTable := fDataTable;
+ lRecord := GetChangeRecord(aDataTable, False);
+ Result := Assigned(lRecord) and (lRecord^.CurrentChange <> nil);
+end;
+
+function TDADelta.FindChange(aRecID: integer): TDADeltaChange;
+var
+ idx: integer;
+begin
+ result := nil;
+ idx := fChanges.IndexOf(FormatRecIDString(aRecID));
+ if (idx >= 0) then result := TDADeltaChange(fChanges.Objects[idx]);
+end;
+
+function TDADelta.GetCount: integer;
+begin
+ result := fChanges.Count;
+end;
+
+procedure TDADelta.Clear(DoClearFieldNames: boolean = FALSE; DoClearKeyFieldNames: boolean = FALSE);
+var
+ i: integer;
+begin
+ CancelChangesInAllTables;
+
+ CanApplyDeltaChanges;
+
+ for i := 0 to (fChanges.Count - 1) do
+ if (fChanges.Objects[i]<>NIL) then fChanges.Objects[i].Free;
+
+ fChanges.Clear;
+
+ if DoClearFieldNames then fFieldNames.Clear;
+ if DoClearKeyFieldNames then ClearKeyFieldNames;
+
+ fCurrPosition := 0;
+end;
+
+function TDADelta.GetChange(Index: integer): TDADeltaChange;
+begin
+ result := TDADeltaChange(fChanges.Objects[Index]);
+end;
+
+function TDADelta.GetChangeRecord(aDataTable: TComponent = nil; aCreateIfEmpty: Boolean = False): PDAChangeRecord;
+var
+ i : integer;
+ lList: TList;
+begin
+ lList := fChangeRecordList.LockList;
+ try
+ for i := 0 to LList.Count - 1 do begin
+ Result := PDAChangeRecord(lList[i]);
+ if Result^.DataTable = aDataTable then Exit;
+ end;
+ Result := CreateChangeRecord(aDataTable);
+ llist.Add(Result);
+ finally
+ fChangeRecordList.UnlockList;
+ end;
+end;
+
+procedure TDADelta.RemoveChange(aChange: TDADeltaChange);
+begin
+ if IsBlockedRecord(aChange) then RaiseError('Cannot delete change, it is under editing!');
+ intRemoveChange(aChange);
+end;
+
+procedure TDADelta.RemoveLoggedField(Index: integer);
+var
+ i,j: integer;
+ lChange: TDADeltaChange;
+begin
+ CanApplyDeltaChanges;
+ // don't have to validate for Index because it is validated in "fFieldNames[Index]"
+ i := fKeyFields.IndexOf(fFieldNames[Index]);
+ if i <> -1 then fKeyFields.Delete(i);
+
+ for i := 0 to Count - 1 do begin
+ lChange := GetChange(i);
+ for j := Index to LoggedFieldCount - 2 do begin
+ lChange.OldValues[j] := lChange.OldValues[j+1];
+ lChange.NewValues[j] := lChange.NewValues[j+1];
+ end;
+ SetLength(lChange.fOldValues, LoggedFieldCount-1);
+ SetLength(lChange.fNewValues, LoggedFieldCount-1);
+ end;
+ fFieldNames.Delete(Index);
+end;
+
+procedure TDADelta.RemoveLoggedField(AFieldName: string);
+var
+ i: integer;
+begin
+ i := IndexOfLoggedField(AFieldName);
+ if i = -1 then
+ RaiseError(err_CannotFindField, [aFieldName])
+ else
+ RemoveLoggedField(i);
+end;
+
+function TDADelta.GetLoggedFieldNames(Index: integer): string;
+begin
+ result := fFieldNames[Index]
+end;
+
+procedure TDADelta.AddFieldName(const aFieldName: string; const aDataType: TDADataType = datUnknown);
+var
+ i: integer;
+ lChange: TDADeltaChange;
+begin
+ CanApplyDeltaChanges;
+ fFieldNames.AddObject(aFieldName, TObject(ord(aDataType)));
+ for i := 0 to Count - 1 do begin
+ lChange := GetChange(i);
+ SetLength(lChange.fOldValues, LoggedFieldCount);
+ SetLength(lChange.fNewValues, LoggedFieldCount);
+ end;
+end;
+
+procedure TDADelta.ClearFieldNames;
+begin
+ Clear(True,False);
+end;
+
+procedure TDADelta.Add(aChange: TDADeltaChange);
+begin
+ fChanges.AddObject(FormatRecIDString(aChange.RecId), aChange);
+end;
+
+procedure TDADelta.Delete(Index: integer);
+begin
+ if IsBlockedRecord(TDADeltaChange(fChanges.Objects[Index])) then RaiseError('Cannot delete change, it is under editing!');
+ DeleteChange(Index);
+end;
+
+function TDADelta.InChange(aDataTable: TComponent = nil): boolean;
+begin
+ if aDataTable = nil then aDataTable := fDataTable;
+ Result := GetInChange(aDataTable);
+end;
+
+function TDADelta.IndexOfLoggedField(const aName: string): integer;
+begin
+ result := fFieldNames.IndexOf(aName)
+end;
+
+function TDADelta.GetDelta: TDADelta;
+begin
+ result := Self;
+end;
+
+function TDADelta.IsBlockedRecord(aChange: TDADeltaChange): Boolean;
+var
+ lList: TList;
+begin
+ lList := fBlockedRecordList.LockList;
+ try
+ Result := lList.IndexOf(aChange) <> -1;
+ finally
+ fBlockedRecordList.UnlockList;
+ end;
+ {$IFDEF uDADelta_DEBUG}
+ OutputDebugString(Pchar('IsBlockedRecord($'+inttoHex(integer(aChange),8)+')= ' + BoolToStr(Result,True)));
+ {$ENDIF}
+end;
+
+function TDADelta.IsNewRecord(aRecordID: integer = -1): boolean;
+var
+ recid, i: integer;
+begin
+ result := FALSE;
+ recid := aRecordID;
+
+ if (aRecordID = -1) then begin
+ if ((fDataTable as TDADataTable).RecordCount > 0) then
+ recid := (fDataTable as TDADataTable).GetRowRecIDValue
+ else
+ Exit;
+ end;
+
+ for i := 0 to Count - 1 do
+ if (Changes[i].RecID = recid) then begin
+ result := Changes[i].ChangeType = ctInsert;
+ Exit;
+ end;
+end;
+
+function TDADelta.GetKeyFieldCount: integer;
+begin
+ result := fKeyFields.Count
+end;
+
+function TDADelta.GetKeyFieldNames(Index: integer): string;
+begin
+ result := fKeyFields[Index]
+end;
+
+procedure TDADelta.ClearKeyFieldNames;
+begin
+ fKeyFields.Clear;
+end;
+
+procedure TDADelta.AddKeyFieldName(const aKeyFieldName: string);
+begin
+ if IndexOfLoggedField(aKeyFieldName) = -1 then raise EDAException.CreateFmt('%s should be in LoggedField', [aKeyFieldName]);
+ fKeyFields.Add(aKeyFieldName)
+end;
+
+function TDADelta.Add(aRecordID: integer; aChangeType: TDAChangeType;
+ aStatus: TDAChangeStatus; const aMessage: string): TDADeltaChange;
+begin
+ result := TDADeltaChange.Create(Self, aRecordID, aChangeType, aStatus, aMessage);
+ Add(result);
+end;
+
+function TDADelta.GetFieldCount: integer;
+begin
+ result := fFieldNames.Count;
+end;
+
+function TDADelta.GetFieldIndexes(const aName: string): integer;
+begin
+ result := fFieldNames.IndexOf(aName);
+end;
+
+function TDADelta.GetFieldNames(Index: integer): string;
+begin
+ result := fFieldNames[Index];
+end;
+
+function TDADelta.GetAsBoolean(const FieldName: string): boolean;
+begin
+ result := GetVarBoolean(Changes[fCurrPosition].NewValueByName[FieldName]);
+end;
+
+function TDADelta.GetAsBoolean(Index: integer): boolean;
+begin
+ result := GetVarBoolean(Changes[fCurrPosition].NewValues[Index]);
+end;
+
+function TDADelta.GetAsCurrency(Index: integer): currency;
+begin
+ result := GetVarCurrency(Changes[fCurrPosition].NewValues[Index]);
+end;
+
+function TDADelta.GetAsCurrency(const FieldName: string): currency;
+begin
+ result := GetVarCurrency(Changes[fCurrPosition].NewValueByName[FieldName]);
+end;
+
+function TDADelta.GetAsDateTime(Index: integer): TDateTime;
+begin
+ result := GetVarDateTime(Changes[fCurrPosition].NewValues[Index]);
+end;
+
+function TDADelta.GetAsDateTime(const FieldName: string): TDateTime;
+begin
+ result := GetVarDateTime(Changes[fCurrPosition].NewValueByName[FieldName]);
+end;
+
+function TDADelta.GetAsFloat(Index: integer): double;
+begin
+ result := GetVarFloat(Changes[fCurrPosition].NewValues[Index]);
+end;
+
+function TDADelta.GetAsFloat(const FieldName: string): double;
+begin
+ result := GetVarFloat(Changes[fCurrPosition].NewValueByName[FieldName]);
+end;
+
+function TDADelta.GetAsInteger(Index: integer): integer;
+begin
+ result := GetVarInteger(Changes[fCurrPosition].NewValues[Index]);
+end;
+
+function TDADelta.GetAsInteger(const FieldName: string): integer;
+begin
+ result := GetVarInteger(Changes[fCurrPosition].NewValueByName[FieldName]);
+end;
+
+function TDADelta.GetAsString(const FieldName: string): string;
+begin
+ result := GetVarString(Changes[fCurrPosition].NewValueByName[FieldName]);
+end;
+
+function TDADelta.GetAsString(Index: integer): string;
+begin
+ result := GetVarString(Changes[fCurrPosition].NewValues[Index]);
+end;
+
+function TDADelta.GetAsVariant(Index: integer): variant;
+begin
+ result := Changes[fCurrPosition].NewValues[Index];
+end;
+
+function TDADelta.GetAsVariant(const FieldName: string): variant;
+begin
+ result := Changes[fCurrPosition].NewValueByName[FieldName];
+end;
+
+function TDADelta.GetBlockedRecordCount: integer;
+var
+ lList: TList;
+begin
+ lList := fBlockedRecordList.LockList;
+ try
+ Result := lList.Count;
+ finally
+ fBlockedRecordList.UnlockList;
+ end;
+end;
+
+function TDADelta.First: boolean;
+begin
+ result := (fChanges.Count > 0);
+ if result then fCurrPosition := 0;
+end;
+
+function TDADelta.GetRecordCount: integer;
+begin
+ result := fChanges.Count;
+end;
+
+function TDADelta.Next: boolean;
+begin
+ result := (fCurrPosition < fChanges.Count - 1);
+
+ if result then Inc(fCurrPosition);
+end;
+
+function TDADelta.Locate(const KeyFields: string; const KeyValues: Variant;
+ Options: TLocateOptions): Boolean;
+begin
+ result := FALSE; // Deltas don't support searches for now
+end;
+
+function TDADelta.GetLoggedFieldTypes(Index: integer): TDADataType;
+begin
+ result := TDADataType(Cardinal(fFieldNames.Objects[Index]));
+end;
+
+procedure TDADelta.SetLoggedFieldTypes(anIndex: integer;
+ aFieldType: TDADataType);
+begin
+ fFieldNames.Objects[anIndex] := TObject(ord(aFieldType));
+end;
+
+procedure TDADelta.RestoreLastChange(aDataTable : TComponent = nil);
+var
+ i: integer;
+ lRecord: PDAChangeRecord;
+begin
+ {$IFDEF uDADelta_DEBUG}
+ OutputDebugString(Pchar('RestoreLastChange($'+inttoHex(Cardinal(aDataTable),8)+')'));
+ {$ENDIF}
+ if aDataTable = nil then aDataTable := fDataTable;
+ lRecord := GetChangeRecord(aDataTable,False);
+ if lRecord = nil then Exit; // we can't restore if no operations were here
+
+
+ if (lRecord^.LastChange = nil) and (fChanges.Count=1) and (aDataTable = fDataTable) and
+ (fDataTable <>nil) and (fDataTable is TDADataTable) and
+ (ruoOnPost in TDADataTable(fDataTable).RemoteUpdatesOptions) and
+ (TDADataTable(fDataTable).State in [dsEdit,dsInsert]) then
+ lRecord^.LastChange := Changes[0];
+ if (lRecord^.LastChange <> nil) and (FindChange(lRecord^.LastChange.fRecID) = nil) then lRecord^.LastChange := nil;
+ lRecord^.CurrentChange := lRecord^.LastChange;
+ if lRecord^.NewChange and (lRecord^.CurrentChange <> nil) then begin
+ i:=fChanges.IndexOf(FormatRecIDString(lRecord^.CurrentChange.RecID));
+ if i <> -1 then fChanges.Delete(i);
+ lRecord^.CurrentChange.RecID := UndefinedRecordID;
+// basically nulls this --> fChanges.AddObject(FormatRecIDString(fCurrentChange.RecID), fCurrentChange);
+ end;
+end;
+
+function TDADelta.GetCountByStatus(
+ aChangeStatus: TDAChangeStatus): integer;
+var i : integer;
+begin
+ result := 0;
+ for i := 0 to fChanges.Count-1 do begin
+ if (Changes[i].Status=aChangeStatus) then Inc(result);
+ end;
+end;
+
+function TDADelta.GetLogicalName: string;
+begin
+ result := fLogicalName;
+end;
+
+procedure TDADelta.SetLogicalName(const aName: string);
+begin
+ fLogicalName := aName;
+end;
+
+procedure TDADelta.AssignDataTable(aDataTable: TComponent);
+begin
+ fDataTable := aDataTable as TDADataTable;
+end;
+
+function TDADelta.BlockRecord(aChange: TDADeltaChange): Boolean;
+begin
+ Result := not IsBlockedRecord(aChange);
+ if Result then fBlockedRecordList.Add(aChange);
+ {$IFDEF uDADelta_DEBUG}
+ OutputDebugString(Pchar('BlockRecord($'+inttoHex(integer(aChange),8)+')= ' + BoolToStr(Result,True)));
+ {$ENDIF}
+end;
+
+procedure TDADelta.RemoveUnchangedChanges;
+
+ function isUnchangedChange(aChange: TDADeltaChange): boolean;
+ var
+ i: integer;
+ begin
+ Result:= (aChange.Status = csPending) and (aChange.fChangeType = ctUpdate);
+ if result then
+ For i := 0 to LoggedFieldCount-1 do begin
+ if not ROVariantsEqual(aChange.OldValues[i],aChange.NewValues[i]) then begin
+ Result:=False;
+ Break;
+ end;
+ end;
+ end;
+
+var
+ i,j: integer;
+ lList: TList;
+ lRecord: PDAChangeRecord;
+begin
+ CanApplyDeltaChanges;
+ lList := fChangeRecordList.LockList;
+ try
+ For i:= Count-1 downto 0 do
+ if isUnchangedChange(Changes[i]) then begin
+ for j := 0 to lList.Count - 1 do begin
+ lRecord := PDAChangeRecord(lList[j]);
+ if Assigned(lRecord) then
+ if lRecord^.CurrentChange = Changes[i] then lRecord^.CurrentChange := nil;
+ end;
+ DeleteChange(i);
+ end;
+ finally
+ fChangeRecordList.UnlockList;
+ end;
+end;
+
+procedure TDADelta.DeleteChange(anIndex: integer);
+begin
+ fChanges.Objects[anIndex].Free;
+ fChanges.Delete(anIndex);
+end;
+
+procedure TDADelta.intRemoveChange(aChange: TDADeltaChange);
+var
+ idx: integer;
+begin
+ idx := fChanges.IndexOfObject(aChange);
+ if (idx >= 0) then DeleteChange(idx);
+end;
+
+function TDADelta.IsBlockedRecord(aRecID: integer): Boolean;
+var
+ lList: TList;
+ i: integer;
+begin
+ Result := False;
+ lList := fBlockedRecordList.LockList;
+ try
+ for i := 0 to lList.Count -1 do begin
+ if TDADeltaChange(lList[i]).fRecID = aRecID then begin
+ Result := True;
+ Break;
+ end;
+ end;
+ finally
+ fBlockedRecordList.UnlockList;
+ end;
+ {$IFDEF uDADelta_DEBUG}
+ OutputDebugString(Pchar('IsBlockedRecord('+inttoStr(aRecID)+')= ' + BoolToStr(Result,True)));
+ {$ENDIF}
+end;
+
+{ TDADeltaChange }
+
+constructor TDADeltaChange.Create(aDelta: TDADelta;
+ aRecID: integer;
+ aChangeType: TDAChangeType;
+ aStatus: TDAChangeStatus = csPending;
+ aMessage: string = '');
+begin
+ inherited Create;
+
+ fRefreshedByServer := FALSE;
+ fStatus := aStatus;
+ fDelta := aDelta;
+ fRecID := aRecID;
+ fChangeType := aChangeType;
+ fMessage := aMessage;
+
+ SetLength(fOldValues, aDelta.LoggedFieldCount);
+ SetLength(fNewValues, aDelta.LoggedFieldCount);
+end;
+
+destructor TDADeltaChange.Destroy;
+begin
+ inherited;
+end;
+
+function TDADeltaChange.GetDelta: IDADelta;
+begin
+ result := fDelta as IDADelta;
+end;
+
+function TDADeltaChange.GetNewValue(const aName: string): Variant;
+var
+ idx: integer;
+begin
+ idx := fDelta.IndexOfLoggedField(aName);
+ if (idx < 0) then RaiseError(err_CannotFindField, [aName]);
+ //exists problem with uninitialized variant in Win 2000
+ result := Null;
+ //
+ result := fNewValues[idx];
+end;
+
+function TDADeltaChange.GetOldValue(const aName: string): Variant;
+var
+ idx: integer;
+begin
+ idx := fDelta.IndexOfLoggedField(aName);
+ if (idx < 0) then RaiseError(err_CannotFindField, [aName]);
+ //exists problem with uninitialized variant in Win 2000
+ result := Null;
+ //
+ result := fOldValues[idx];
+end;
+
+procedure TDADeltaChange.SetNewValue(const aName: string; const Value: Variant);
+var
+ idx: integer;
+begin
+ idx := fDelta.IndexOfLoggedField(aName);
+ if (idx < 0) then RaiseError(err_CannotFindField, [aName]);
+ if idx >= Length(fNewValues) then
+ SetLength(fNewValues, idx + 1);
+ fNewValues[idx] := Value;
+end;
+
+procedure TDADeltaChange.SetOldValue(const aName: string; const Value: Variant);
+var
+ idx: integer;
+begin
+ idx := fDelta.IndexOfLoggedField(aName);
+ if (idx < 0) then RaiseError(err_CannotFindField, [aName]);
+ if idx >= Length(fOldValues) then
+ SetLength(fOldValues, idx + 1);
+ fOldValues[idx] := Value;
+end;
+
+{ EDAApplyUpdateFailed }
+
+constructor EDAApplyUpdateFailed.Create(aChange: TDADeltaChange; anOriginalException: Exception);
+begin
+ if (anOriginalException<>NIL) then begin
+ inherited Create(anOriginalException.Message);
+ end
+ else inherited Create('');
+
+ fRecID := aChange.RecID;
+ fDeltaName := aChange.Delta.LogicalName;
+end;
+
+initialization
+ RegisterExceptionClass(EDAApplyUpdateFailed);
+finalization
+ UnregisterExceptionClass(EDAApplyUpdateFailed);
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADesigntimeCall.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADesigntimeCall.pas
new file mode 100644
index 0000000..60b723f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADesigntimeCall.pas
@@ -0,0 +1,40 @@
+unit uDADesigntimeCall;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes,
+ uDADataTable, uRODynamicRequest;
+
+type
+ TDADesigntimeCall = class(TRODynamicRequest)
+ private
+ public
+ procedure MakeRequest;
+ published
+ end;
+
+implementation
+
+{ TDADesigntimeCall }
+
+procedure TDADesigntimeCall.MakeRequest;
+begin
+ Execute();
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADriverInfo.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADriverInfo.pas
new file mode 100644
index 0000000..e97f7ef
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADriverInfo.pas
@@ -0,0 +1,56 @@
+unit uDADriverInfo;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ uDADriverManager;
+
+procedure ShowDriverInfo(aDriverManager: TDADriverManager);
+
+implementation
+
+uses
+ SysUtils,
+ Dialogs;
+
+procedure ShowDriverInfo(aDriverManager: TDADriverManager);
+var
+ s: string;
+ i: integer;
+begin
+ if (aDriverManager.DriverCount = 0) then
+ MessageDlg('No drivers are currently loaded', mtWarning, [mbOK], 0)
+ else begin
+ s := 'The following ' + IntToStr(aDriverManager.DriverCount) + ' drivers are currently loaded:'#13;
+ for i := 0 to (aDriverManager.DriverCount - 1) do begin
+ with aDriverManager.DriverInfo[i] do begin
+ if (Handle = 0) then
+ s := s + #13 + Format('%s - %s %d.%d (Statically Linked)',
+ [Driver.DriverID, Driver.Description, Driver.MajVersion, Driver.MinVersion])
+
+ else
+ s := s + #13 + Format('%s - %s %d.%d (%s)',
+ [Driver.DriverID, Driver.Description, Driver.MajVersion, Driver.MinVersion, FileName]);
+ end;
+ end;
+
+ MessageDlg(s, mtInformation, [mbOK], 0);
+ end;
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADriverManager.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADriverManager.pas
new file mode 100644
index 0000000..c3c987a
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDADriverManager.pas
@@ -0,0 +1,513 @@
+unit uDADriverManager;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses Classes, uDAInterfaces, uROClasses, uROClient;
+
+type
+ { TDriverInfo }
+ PDADriverInfo = ^TDADriverInfo;
+ TDADriverInfo = record
+ FileName: string;
+ Handle: cardinal;
+ Driver: IDADriver;
+ GetDriverObjectFunc: TDAGetDriverObject;
+ end;
+
+ TDADriverNameType = (dntFileName, dntDriverID);
+
+ { TDADriverManager }
+ TDADriverLoadNotification = procedure(DriverInfo: TDADriverInfo) of object;
+
+ TDADriverManager = class(TROComponent, IDADriverManager)
+ private
+ fDriverDirectory: string;
+ fDrivers: TList;
+ fLoadingAutoLoad,
+ fAutoLoad: boolean;
+ fOnDriverUnloaded: TDADriverLoadNotification;
+ fOnDriverLoaded: TDADriverLoadNotification;
+ fStreamedTraceActive,
+ fTraceActive: boolean;
+ fTraceFlags: TDATraceOptions;
+ fOnTraceEvent: TDALogTraceEvent;
+
+ procedure SetDriverDirectory(const Value: string);
+
+ function GetDrivers(Index: integer): IDADriver;
+ function GetDriverCount: integer;
+ function GetDriverInfo(Index: integer): TDADriverInfo;
+ procedure SetAutoLoad(const Value: boolean);
+
+ protected
+ procedure Loaded; override;
+ procedure LoadStaticDrivers; virtual;
+ procedure UnloadDriver(anIndex: integer; aForceUnloadForStaticDriver: boolean); overload;
+ procedure UnloadAllDrivers(aForceUnloadForStaticDriver: boolean); overload;
+
+ //procedure HandleDriverError(anErrorCode : integer; const anErrorMessage : string); dynamic;
+
+ procedure SetTraceActive(const Value: boolean);
+ procedure SetTraceFlags(const Value: TDATraceOptions);
+
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ // IDADriverManager
+ procedure LoadDriver(const aFileName: string);
+ procedure UnloadDriver(anIndex: integer); overload;
+
+ procedure LoadDrivers;overload;
+ procedure LoadDrivers(const aDriverList: IROStrings; aIgnoreDuplicates: boolean = false; aIgnoreErrors: boolean = false);overload;
+ procedure UnloadAllDrivers; overload;
+
+ function ListDrivers(const aDirectory: string; out FileNames: IROStrings): integer;
+
+ function FindDriver(const aDriverID: string; out Driver: IDADriver): boolean;
+ function FindDriverIndex(const aDriverID: string): integer;
+
+ function DriverByDriverID(const aDriverID: string): IDADriver;
+
+ property Drivers[Index: integer]: IDADriver read GetDrivers; default;
+ property DriverInfo[Index: integer]: TDADriverInfo read GetDriverInfo;
+ property DriverCount: integer read GetDriverCount;
+
+ published
+ property DriverDirectory: string read fDriverDirectory write SetDriverDirectory;
+ property AutoLoad: boolean read fAutoLoad write SetAutoLoad default false;
+ property OnDriverLoaded: TDADriverLoadNotification read fOnDriverLoaded write fOnDriverLoaded;
+ property OnDriverUnloaded: TDADriverLoadNotification read fOnDriverUnloaded write fOnDriverUnloaded;
+
+ property TraceActive: boolean read fTraceActive write SetTraceActive;
+ property TraceFlags: TDATraceOptions read fTraceFlags write SetTraceFlags;
+ property OnTraceEvent: TDALogTraceEvent read fOnTraceEvent write fOnTraceEvent;
+ end;
+
+function DriverManager: TDADriverManager;
+
+procedure RegisterDriverProc(aDriverProc: TDAGetDriverObject);
+procedure UnregisterDriverProc(aDriverProc: TDAGetDriverObject);
+
+implementation
+
+uses
+ {$IFDEF MSWINDOWS}Windows, {$ENDIF}SysUtils,
+ {$IFDEF FPC}dynlibs,{$ENDIF}
+ uDAUtils, uDARes;
+
+var
+ _DriverManager: TDADriverManager;
+ _DriverProcs: TList;
+
+function DriverManager: TDADriverManager;
+begin
+ if (_DriverManager = nil) then RaiseError(err_DriverManagerNotAssigned);
+
+ result := _DriverManager;
+end;
+
+procedure RegisterDriverProc(aDriverProc: TDAGetDriverObject);
+var
+ p: pointer;
+begin
+ p := @aDriverProc;
+ if (_DriverProcs.IndexOf(p) >= 0) then RaiseError(err_DriverProcAlreadyRegistered, [{$IFDEF cpu64}UINT64{$ELSE}integer{$ENDIF}(p)]);
+
+ _DriverProcs.Add(p);
+end;
+
+procedure UnregisterDriverProc(aDriverProc: TDAGetDriverObject);
+var
+ idx: integer;
+begin
+ idx := _DriverProcs.IndexOf(@aDriverProc);
+ if (idx >= 0) then _DriverProcs.Delete(idx);
+end;
+
+{ TDADriverManager }
+
+procedure TDADriverManager.Assign(Source: TPersistent);
+var
+ lSource: TDADriverManager;
+begin
+ inherited;
+ if Source is TDADriverManager then begin
+ lSource := TDADriverManager(Source);
+
+ AutoLoad := lSource.AutoLoad;
+ DriverDirectory := lSource.DriverDirectory;
+ OnDriverLoaded := lSource.OnDriverLoaded;
+ OnDriverUnloaded := lSource.OnDriverUnloaded;
+ OnTraceEvent := lSource.OnTraceEvent;
+ TraceActive := lSource.TraceActive;
+ TraceFlags := lSource.TraceFlags;
+ end;
+end;
+
+constructor TDADriverManager.Create(aOwner: TComponent);
+begin
+ inherited;
+
+ // Cannot create multiple Driver Managers
+ if not (csDesigning in ComponentState) then begin
+ Check(_DriverManager <> nil, err_DriverManagerAlreadyCreated);
+ _DriverManager := Self;
+ end;
+
+ fAutoLoad := FALSE;
+ fDriverDirectory := alias_System;
+ fDrivers := TList.Create;
+
+ if not (csDesigning in ComponentState) then begin
+ LoadStaticDrivers;
+ end;
+end;
+
+destructor TDADriverManager.Destroy;
+begin
+ if (_DriverManager = Self) then _DriverManager := nil;
+
+ if (fDrivers <> nil) then begin // In case of the multplie driver exception
+ UnloadAllDrivers(true);
+ fDrivers.Free;
+ end;
+
+ inherited;
+end;
+
+function TDADriverManager.ListDrivers(const aDirectory: string; out FileNames: IROStrings): integer;
+var
+ actualdir: string;
+ dir: TSearchRec;
+begin
+ result := 0;
+ FileNames := TROStrings.Create;
+
+ if (aDirectory = '') then
+ actualdir := DriverDirectory
+ else
+ actualdir := IncludeTrailingPathDelimiter(aDirectory);
+
+ actualdir := TranslateFileName(actualdir);
+
+ // If no path is specified looks in the Windows\System32 directory
+ {if (Length(actualdir)<=1)
+ then actualdir := IncludeTrailingPathDelimiter(GetSystemDir);}
+
+ if (FindFirst(actualdir + drv_AllDrivers, faAnyFile, dir) = 0) then begin
+ repeat
+ if (dir.Attr and faDirectory) <> faDirectory then begin
+ Inc(result);
+ FileNames.Add(ExpandFileName(actualdir + dir.Name));
+ end;
+ until (FindNext(dir) <> 0);
+ SysUtils.FindClose(dir);
+ end;
+end;
+
+function TDADriverManager.FindDriver(const aDriverID: string; out Driver: IDADriver): boolean;
+var
+ i: integer;
+begin
+ result := FALSE;
+ Driver := nil;
+
+ for i := 0 to (DriverCount - 1) do
+ if SameText(Drivers[i].DriverID, aDriverID) then begin
+ Driver := Drivers[i];
+ result := TRUE;
+ Exit;
+ end;
+end;
+
+function TDADriverManager.FindDriverIndex(const aDriverID:string):integer;
+var
+ i: integer;
+begin
+ result := -1;
+ for i := 0 to (DriverCount - 1) do
+ if SameText(Drivers[i].DriverID, aDriverID) then begin
+ result := i;
+ Exit;
+ end;
+end;
+
+procedure TDADriverManager.LoadStaticDrivers;
+var
+ i: integer;
+ driver: PDADriverInfo;
+ drv: IDADriver;
+begin
+ driver := nil;
+
+ for i := 0 to (_DriverProcs.Count - 1) do try
+ New(driver);
+
+ driver^.GetDriverObjectFunc := _DriverProcs[i];
+ driver^.FileName := '';
+ driver^.Handle := 0;
+ driver^.Driver := driver^.GetDriverObjectFunc;
+
+ Check(FindDriver(driver^.Driver.DriverID, drv), err_DriverAlreadyLoaded, [driver^.Driver.DriverID]); // Checks this driver's not already loaded
+
+ driver^.Driver.Initialize; //(HandleDriverError); // Calls the initialization routine for the DLL
+
+ fDrivers.Add(driver);
+
+ if Assigned(OnDriverLoaded) then OnDriverLoaded(driver^);
+
+ driver := nil;
+ except
+ if (driver <> nil) then begin
+ if (fDrivers.IndexOf(driver) > 0) then fDrivers.Delete(fDrivers.IndexOf(driver));
+
+ Dispose(driver);
+ end;
+
+ raise;
+ end;
+end;
+
+{$IFDEF DataAbstract_SchemaModeler}
+{$INCLUDE DataAbstract_SchemaModelerOnly.inc}
+{$ENDIF DataAbstract_SchemaModeler}
+
+const function_AuthorizeSchemaModeler = 'AuthorizeSchemaModeler';
+
+procedure TDADriverManager.LoadDriver(const aFileName: string);
+var
+ lHandle: cardinal;
+ driver: PDADriverInfo;
+ ptr: pointer;
+ drv: IDADriver;
+ fname: string;
+ alreadyloaded: boolean;
+begin
+ fname := aFileName;
+
+ if not IsMemoryManagerSet then
+ raise Exception.Create(err_NeedShareMem);
+
+ New(driver);
+ try
+ driver^.FileName := aFileName;
+ pointer(driver^.Driver) := nil;
+ driver^.Handle := 0;
+ driver^.Handle := LoadLibrary(PChar(fname));
+
+ Check(driver^.Handle = 0, err_LoadPackageFailed, [fname]); // Checks LoadLibrary's ok
+
+ {$IFDEF DataAbstract_SchemaModeler}
+ ptr := GetProcAddress(driver^.Handle, function_AuthorizeSchemaModeler);
+ if Assigned(ptr) then begin
+ TAuthorizeSchemaModeler(ptr)(AuthorizeSchemaModelerKey);
+ end;
+ {$ENDIF DataAbstract_SchemaModeler}
+
+ ptr := GetProcAddress(driver^.Handle, func_GetDriverObject);
+ Check(ptr = nil, err_InvalidDLL, [fname]); // Checks the DLL exports the required function
+
+ @driver^.GetDriverObjectFunc := ptr;
+ drv := driver.GetDriverObjectFunc();
+ driver^.Driver := drv;
+ drv := nil;
+ { We need a local variable, because else the driver pointer will remain on the
+ stack with a refcount, and Release'd on the "end;".not good, if the .dad is
+ unloaded by then. }
+
+ if not Assigned(driver^.Driver) then begin
+ if GetProcAddress(driver^.Handle, function_AuthorizeSchemaModeler) <> nil then begin
+ RaiseError('Driver %s may only be used inside the Schema Modeler',[fname],EDASchemaModelerOnly);
+ end
+ else begin
+ RaiseError(err_InvalidDriverReference, [fname]);
+ end;
+ end;
+
+ Check(driver^.Driver = nil, err_InvalidDriverReference, [fname]); // Checks the reference to the driver is ok
+
+ alreadyloaded := FindDriver(driver^.Driver.DriverID, drv);
+ Check(alreadyloaded, err_DriverAlreadyLoaded, [driver^.Driver.DriverID], EDADriverAlreadyLoaded); // Checks this driver's not already loaded
+ drv := nil;
+
+ driver^.Driver.Initialize; //(HandleDriverError); // Calls the initialization routine for the DLL
+
+ fDrivers.Add(driver);
+
+ if Assigned(fOnDriverLoaded) then fOnDriverLoaded(driver^);
+ except
+ lHandle := driver^.Handle;
+ driver^.Driver := nil;
+ Dispose(driver);
+ if (lHandle <> 0) then FreeLibrary(lHandle);
+ raise;
+ end;
+end;
+
+procedure TDADriverManager.UnloadDriver(anIndex: integer; aForceUnloadForStaticDriver: boolean);
+var
+ driver: PDADriverInfo;
+begin
+
+ driver := fDrivers[anIndex];
+ if (driver^.Handle = 0) and not aForceUnloadForStaticDriver then Exit;
+
+ try
+ fDrivers.Delete(anIndex);
+
+ driver^.Driver.Finalize; // Calls the finalization routine for the DLL
+ driver^.Driver := nil;
+
+ if (driver^.Handle <> 0) then FreeLibrary(driver^.Handle);
+
+ if Assigned(OnDriverUnloaded) then OnDriverUnloaded(driver^);
+ finally
+ Dispose(driver);
+ end;
+end;
+
+procedure TDADriverManager.UnloadDriver(anIndex: integer);
+begin
+ UnloadDriver(anIndex, false);
+end;
+
+function TDADriverManager.GetDriverCount: integer;
+begin
+ result := fDrivers.Count
+end;
+
+function TDADriverManager.GetDrivers(Index: integer): IDADriver;
+begin
+ result := PDADriverInfo(fDrivers[Index])^.Driver
+end;
+
+procedure TDADriverManager.LoadDrivers;
+var
+ DriverList:IROStrings;
+begin
+ ListDrivers(DriverDirectory,DriverList);
+ LoadDrivers(DriverList,True);
+end;
+
+procedure TDADriverManager.LoadDrivers(const aDriverList: IROStrings; aIgnoreDuplicates: boolean = false; aIgnoreErrors: boolean = false);
+var
+ i: integer;
+begin
+ for i := 0 to (aDriverList.Count - 1) do try
+ LoadDriver(aDriverList[i]);
+ except
+ on E: EDADriverAlreadyLoaded do begin
+ if not aIgnoreDuplicates then raise;
+ end
+ else begin
+ if not aIgnoreErrors then raise;
+ end;
+ end;
+end;
+
+procedure TDADriverManager.UnloadAllDrivers(aForceUnloadForStaticDriver: boolean);
+var
+ i: integer;
+begin
+ for i := DriverCount - 1 downto 0 do
+ UnloadDriver(i, aForceUnloadForStaticDriver);
+end;
+
+procedure TDADriverManager.UnloadAllDrivers;
+begin
+ UnloadAllDrivers(false);
+end;
+
+function TDADriverManager.DriverByDriverID(const aDriverID: string): IDADriver;
+begin
+ Check(not FindDriver(aDriverID, result), err_UnknownDriver, [aDriverID]);
+end;
+
+procedure TDADriverManager.SetDriverDirectory(const Value: string);
+begin
+ fDriverDirectory := Trim(Value);
+ if (fDriverDirectory <> '') then
+ fDriverDirectory := IncludeTrailingPathDelimiter(fDriverDirectory)
+end;
+
+function TDADriverManager.GetDriverInfo(Index: integer): TDADriverInfo;
+begin
+ result := PDADriverInfo(fDrivers[Index])^
+end;
+
+procedure TDADriverManager.SetAutoLoad(const Value: boolean);
+var
+ sl: IROStrings;
+begin
+ if (csLoading in ComponentState) then
+ fLoadingAutoLoad := Value
+ else begin
+ //if (Value=fAutoLoad) then Exit; // Prevents a strange double set done by the IDE....
+
+ //if not Value and (DriverCount>0) then UnloadAllDrivers;
+
+ fAutoLoad := Value;
+
+ if fAutoLoad and not (csDesigning in ComponentState) then begin
+ sl := TROStrings.Create;
+ ListDrivers('', sl);
+ if sl.Count > 0 then begin
+ LoadDrivers(sl);
+ end;
+ end;
+ end;
+end;
+
+procedure TDADriverManager.Loaded;
+begin
+ inherited;
+
+ AutoLoad := fLoadingAutoLoad;
+ TraceActive := fStreamedTraceActive;
+end;
+
+procedure TDADriverManager.SetTraceActive(const Value: boolean);
+var
+ i: integer;
+begin
+ if (Value = fTraceActive) then Exit;
+
+ if (csLoading in ComponentState) then
+ fStreamedTraceActive := Value
+ else begin
+ fTraceActive := Value;
+
+ for i := 0 to (DriverCount - 1) do
+ Drivers[i].SetTraceOptions(Value, TraceFlags, OnTraceEvent);
+ end;
+end;
+
+procedure TDADriverManager.SetTraceFlags(const Value: TDATraceOptions);
+begin
+ fTraceFlags := Value;
+end;
+
+
+initialization
+ _DriverManager := nil;
+ _DriverProcs := TList.Create;
+
+finalization
+ _DriverProcs.Free;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAElevateDBInterfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAElevateDBInterfaces.pas
new file mode 100644
index 0000000..06cc03d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAElevateDBInterfaces.pas
@@ -0,0 +1,667 @@
+unit uDAElevateDBInterfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses uROClasses, uDAInterfaces, uDAEngine;
+
+type
+ IDAElevateConnection = interface(IDAConnection)
+ ['{30A997EA-0EBE-41D0-AD13-521DEFCDFE0D}']
+ end;
+
+ TDAElevateDBDriver = class(TDAEDriver)
+ protected
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ TDAElevateDBConnection = class(TDAEConnection, IDAConnection, IDAElevateConnection, IDADirectoryBasedDatabase)
+ protected
+ Procedure CheckConnected; virtual;
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ function GetSPSelectSyntax(HasArguments: Boolean): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function DoGetLastAutoInc(const GeneratorName: string): integer; override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ end;
+
+const
+ ElevateDB_DriverType = 'ElevateDB';
+ ElevateDB_ConfigDBName = 'Configuration';
+
+procedure ElevateDB_RegisterDatabase(Query: IDADataset; ADataBaseName: string;aPath: String);
+procedure ElevateDB_DoGetNames(Query: IDADataset; AList: IROStrings; AObjectType: TDAObjecttype);
+procedure ElevateDB_DoGetForeignKeys(Query: IDADataset; ForeignKeys: TDADriverForeignKeyCollection);
+procedure ElevateDB_DoGetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection);
+function ElevateDB_GetSPSelectSyntax(HasArguments: Boolean): String;
+function ElevateDB_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+function ElevateDB_GetLastAutoInc(const GeneratorName: string; Query: IDADataset): variant;
+
+implementation
+
+uses Classes,SysUtils;
+
+var
+ ElevateDB_reservedwords: array of string;
+
+
+procedure ElevateDB_RegisterDatabase(Query: IDADataset; ADataBaseName: string;aPath: String);
+const
+ s_SQL = 'Select Count(*) from Databases Where name = ''%s''';
+ s_DropDataBaseSQL = 'DROP DATABASE "%s" KEEP CONTENTS';
+ s_CreateDataBaseSQL = 'CREATE DATABASE "%s" PATH ''%s''';
+begin
+ try
+ Query.SQL := Format(s_SQL, [aDataBaseName]);
+ Query.Open;
+ if Query.Fields[0].AsInteger =0 then begin
+ Query.Close;
+ Query.SQL := Format(s_CreateDataBaseSQL, [aDataBaseName, aPath]);
+ Query.Execute;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+procedure ElevateDB_DoGetNames(Query: IDADataset; AList: IROStrings; AObjectType: TDAObjecttype);
+const
+ sDoGetTableNames = 'SELECT Name FROM Information.Tables';
+ sDoGetViewNames = 'SELECT Name FROM Information.Views';
+ sDoGetProcedures = 'SELECT Name FROM Information.Procedures';
+begin
+ try
+ case AObjectType of
+ dotTable: Query.SQL := sDoGetTableNames;
+ dotView: Query.SQL := sDoGetViewNames;
+ dotProcedure: Query.SQL := sDoGetProcedures;
+ end;
+ Query.Open;
+ while not Query.Eof do begin
+ Alist.Add(Query.Fields[0].AsString);
+ Query.Next;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+procedure ElevateDB_DoGetForeignKeys(Query: IDADataset; ForeignKeys: TDADriverForeignKeyCollection);
+const
+ sFK_SQL = 'Select c.tablename,c.name, c.targettable, cc.columnname '+
+ 'from Information.Constraints as c '+
+ 'join Information.ConstraintColumns as cc on ((c.tablename = cc.tablename) and (cc.constraintname = c.EnforcingIndex)) '+
+ 'where c.type = ''foreign key''';
+ sPK_SQL = 'Select c.tablename,c.name, c.targettable, cc.columnname '+
+ 'from Information.Constraints as c '+
+ 'join Information.ConstraintColumns as cc on ((c.Targettable = cc.tablename) and (cc.constraintname = c.TargetTableConstraint)) '+
+ 'where c.type = ''foreign key''';
+var
+ lCurrConstraint : string;
+ lCurrFK : TDADriverForeignKey;
+ lList: TStringList;
+ i: integer;
+begin
+ lList:=TstringList.Create;
+ try
+ Query.SQL := sFK_SQL;
+ Query.Open;
+
+ lCurrConstraint := '';
+ lCurrFK := nil;
+ ForeignKeys.Clear;
+ while (not Query.EOF) do begin
+ if lCurrConstraint <> Query.Fields[0].AsString + '.' + Query.Fields[1].AsString then begin
+ lCurrConstraint := Query.Fields[0].AsString + '.' + Query.Fields[1].AsString;
+ lCurrFK := ForeignKeys.Add();
+ lList.AddObject(lCurrConstraint,lCurrFK);
+ with lCurrFK do begin
+ Name:=lCurrConstraint;
+ PKTable := TrimRight(Query.Fields[2].AsString);
+ FKTable := TrimRight(Query.Fields[0].AsString);
+ // PKField := TrimRight(Query.Fields[2].AsString);
+ FKField := TrimRight(Query.Fields[3].AsString);
+ end;
+ end else begin
+ with lCurrFK do begin
+ // PKField := PKField + ';' + TrimRight(Query.Fields[2].AsString);
+ FKField := FKField + ';' + TrimRight(Query.Fields[3].AsString);
+ end;
+ end;
+ Query.Next;
+ end;
+ Llist.Sorted:=True;
+ Query.close;
+ Query.SQL := sPK_SQL;
+ Query.Open;
+ while (not Query.EOF) do begin
+ lCurrConstraint := Query.Fields[0].AsString + '.' + Query.Fields[1].AsString;
+ i:= lList.IndexOf(lCurrConstraint);
+ if i <> -1 then begin
+ lCurrFK:= TDADriverForeignKey(lList.Objects[i]);
+ if lCurrFK.PKField = '' then
+ lCurrFK.PKField := TrimRight(Query.Fields[3].AsString)
+ else
+ lCurrFK.PKField := lCurrFK.PKField + ';' +TrimRight(Query.Fields[3].AsString);
+ end;
+ Query.Next;
+ end;
+ finally
+ Query := nil;
+ LList.Free;
+ end;
+end;
+
+procedure ElevateDB_DoGetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection);
+const
+ s_sql = 'SELECT tc.Name, tc.Nullable, tc.Identity, cc.ColumnName, tc.scale FROM Information.TableColumns as tc '+
+ 'LEFT JOIN Information.Constraints AS c ON ((c.TableName = tc.TableName) and (c.Type = ''Primary Key'')) '+
+ 'LEFT JOIN Information.ConstraintColumns as cc on ((c.tablename = cc.tablename) and (cc.constraintname = c.EnforcingIndex) and (cc.ColumnName = tc.Name)) '+
+ 'WHERE tc.TableName = ';
+var
+ fld: TDAField;
+begin
+ Fields := TDAFieldCollection.Create(nil);
+ try
+ Query.SQL := 'SELECT * FROM ' + aTableName +' WHERE 1=0';
+ Query.Open;
+ Fields.Assign(Query.Fields);
+ Query.Close;
+ Query.SQL := s_SQL+ '''' + aTableName+'''';
+ Query.Open;
+ While not Query.Eof do begin
+ fld := Fields.FindField(Trim(Query.Fields[0].AsString));
+ if Fld <> nil then begin
+ Fld.Required:=not Query.Fields[1].AsBoolean;
+ if not Query.Fields[2].IsNull and Query.Fields[2].AsBoolean then begin
+ if fld.DataType = datInteger then fld.DataType := datAutoInc;
+ if fld.DataType = datLargeInt then fld.DataType := datLargeAutoInc;
+ end;
+ if not Query.Fields[3].IsNull then fld.InPrimaryKey:=True;
+ if fld.DataType = datDecimal then begin
+ fld.DecimalPrecision:=20;
+ fld.DecimalScale:=Query.Fields[4].AsInteger;
+ end;
+ end;
+ Query.Next;
+ end;
+ finally
+ Query:=nil;
+ end;
+end;
+
+function ElevateDB_GetSPSelectSyntax(HasArguments: Boolean): String;
+begin
+ if HasArguments then
+ Result:='CALL {0} ({1})'
+ else
+ Result:='CALL {0} ()';
+end;
+
+function ElevateDB_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+begin
+ Result := TestIdentifier(iIdentifier, ElevateDB_reservedwords);
+end;
+
+function ElevateDB_GetLastAutoInc(const GeneratorName: string; Query: IDADataset): Variant;
+const
+ s_SQL = 'SELECT Name FROM Information.TableColumns WHERE Generated and TableName = ';
+var
+ fld: string;
+begin
+ Result := -1;
+ try
+ Query.SQL := s_SQL+ '''' + GeneratorName + '''';
+ Query.Open;
+ if not query.EOF then begin
+ fld := Query.Fields[0].AsString;
+ Query.Close;
+ Query.SQL := 'SELECT MAX("'+fld+'") FROM '+ '''' + GeneratorName +'''';
+ Query.Open;
+ Result := Query.Fields[0].Value;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+{ TDAElevateDBDriver }
+
+function TDAElevateDBDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ Result:= ElevateDB_DriverType;
+end;
+
+
+{ TDAElevateDBConnection }
+
+procedure TDAElevateDBConnection.CheckConnected;
+begin
+ if not GetConnected then SetConnected(True);
+end;
+
+procedure TDAElevateDBConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ CheckConnected;
+ inherited;
+ ElevateDB_DoGetForeignKeys(GetDatasetClass.Create(Self),ForeignKeys);
+end;
+
+function TDAElevateDBConnection.DoGetLastAutoInc(
+ const GeneratorName: string): integer;
+begin
+ Result := DoGetLastAutoIncValue(GeneratorName);
+end;
+
+function TDAElevateDBConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+begin
+ Result := ElevateDB_GetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+end;
+
+procedure TDAElevateDBConnection.DoGetStoredProcedureNames(
+ out List: IROStrings);
+begin
+ CheckConnected;
+ inherited;
+ ElevateDB_DoGetNames(GetDatasetClass.Create(Self),List,dotProcedure);
+end;
+
+procedure TDAElevateDBConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ CheckConnected;
+ ElevateDB_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName),GetDatasetClass.Create(Self),Fields);
+end;
+
+procedure TDAElevateDBConnection.DoGetTableNames(out List: IROStrings);
+begin
+ CheckConnected;
+ inherited;
+ ElevateDB_DoGetNames(GetDatasetClass.Create(Self),List,dotTable);
+end;
+
+procedure TDAElevateDBConnection.DoGetViewNames(out List: IROStrings);
+begin
+ CheckConnected;
+ inherited;
+ ElevateDB_DoGetNames(GetDatasetClass.Create(Self),List,dotView);
+end;
+
+function TDAElevateDBConnection.GetSPSelectSyntax(
+ HasArguments: Boolean): string;
+begin
+ Result := ElevateDB_GetSPSelectSyntax(HasArguments);
+end;
+
+procedure ElevateDB_InitializeReservedWords;
+begin
+ SetLength(ElevateDB_reservedwords, 335);
+ // sorted with TStringList.Sort (bds2007)
+ ElevateDB_reservedwords[0] := 'ABS';
+ ElevateDB_reservedwords[1] := 'ABSOLUTE';
+ ElevateDB_reservedwords[2] := 'ACOS';
+ ElevateDB_reservedwords[3] := 'ACTION';
+ ElevateDB_reservedwords[4] := 'ADD';
+ ElevateDB_reservedwords[5] := 'AFTER';
+ ElevateDB_reservedwords[6] := 'ALL';
+ ElevateDB_reservedwords[7] := 'ALLTRIM';
+ ElevateDB_reservedwords[8] := 'ALTER';
+ ElevateDB_reservedwords[9] := 'ALWAYS';
+ ElevateDB_reservedwords[10] := 'AM';
+ ElevateDB_reservedwords[11] := 'AND';
+ ElevateDB_reservedwords[12] := 'AS';
+ ElevateDB_reservedwords[13] := 'ASC';
+ ElevateDB_reservedwords[14] := 'ASCENDING';
+ ElevateDB_reservedwords[15] := 'ASENSITIVE';
+ ElevateDB_reservedwords[16] := 'ASIN';
+ ElevateDB_reservedwords[17] := 'AT';
+ ElevateDB_reservedwords[18] := 'ATAN';
+ ElevateDB_reservedwords[19] := 'ATAN2';
+ ElevateDB_reservedwords[20] := 'AVG';
+ ElevateDB_reservedwords[21] := 'BACKUP';
+ ElevateDB_reservedwords[22] := 'BACKUPS';
+ ElevateDB_reservedwords[23] := 'BEFORE';
+ ElevateDB_reservedwords[24] := 'BEGIN';
+ ElevateDB_reservedwords[25] := 'BETWEEN';
+ ElevateDB_reservedwords[26] := 'BIGINT';
+ ElevateDB_reservedwords[27] := 'BINARY';
+ ElevateDB_reservedwords[28] := 'BLOB';
+ ElevateDB_reservedwords[29] := 'BLOCK';
+ ElevateDB_reservedwords[30] := 'BOF';
+ ElevateDB_reservedwords[31] := 'BOOL';
+ ElevateDB_reservedwords[32] := 'BOOLEAN';
+ ElevateDB_reservedwords[33] := 'BOTH';
+ ElevateDB_reservedwords[34] := 'BUFFER';
+ ElevateDB_reservedwords[35] := 'BY';
+ ElevateDB_reservedwords[36] := 'BYTE';
+ ElevateDB_reservedwords[37] := 'CALL';
+ ElevateDB_reservedwords[38] := 'CASCADE';
+ ElevateDB_reservedwords[39] := 'CASE';
+ ElevateDB_reservedwords[40] := 'CAST';
+ ElevateDB_reservedwords[41] := 'CATALOG';
+ ElevateDB_reservedwords[42] := 'CATEGORY';
+ ElevateDB_reservedwords[43] := 'CEIL';
+ ElevateDB_reservedwords[44] := 'CEILING';
+ ElevateDB_reservedwords[45] := 'CHAR';
+ ElevateDB_reservedwords[46] := 'CHAR_LENGTH';
+ ElevateDB_reservedwords[47] := 'CHARACTER';
+ ElevateDB_reservedwords[48] := 'CHARACTER_LENGTH';
+ ElevateDB_reservedwords[49] := 'CHECK';
+ ElevateDB_reservedwords[50] := 'CLOB';
+ ElevateDB_reservedwords[51] := 'CLOSE';
+ ElevateDB_reservedwords[52] := 'COALESCE';
+ ElevateDB_reservedwords[53] := 'CODE';
+ ElevateDB_reservedwords[54] := 'COLLATE';
+ ElevateDB_reservedwords[55] := 'COLUMN';
+ ElevateDB_reservedwords[56] := 'COLUMNS';
+ ElevateDB_reservedwords[57] := 'COMMIT';
+ ElevateDB_reservedwords[58] := 'COMPRESSION';
+ ElevateDB_reservedwords[59] := 'COMPUTED';
+ ElevateDB_reservedwords[60] := 'CONCAT';
+ ElevateDB_reservedwords[61] := 'CONSTRAINT';
+ ElevateDB_reservedwords[62] := 'CONSTRAINTS';
+ ElevateDB_reservedwords[63] := 'CONTAIN';
+ ElevateDB_reservedwords[64] := 'CONTAINS';
+ ElevateDB_reservedwords[65] := 'CONTENTS';
+ ElevateDB_reservedwords[66] := 'COS';
+ ElevateDB_reservedwords[67] := 'COT';
+ ElevateDB_reservedwords[68] := 'COUNT';
+ ElevateDB_reservedwords[69] := 'CREATE';
+ ElevateDB_reservedwords[70] := 'CURRENT';
+ ElevateDB_reservedwords[71] := 'CURRENT_DATE';
+ ElevateDB_reservedwords[72] := 'CURRENT_GUID';
+ ElevateDB_reservedwords[73] := 'CURRENT_TIME';
+ ElevateDB_reservedwords[74] := 'CURRENT_TIMESTAMP';
+ ElevateDB_reservedwords[75] := 'CURRENT_USER';
+ ElevateDB_reservedwords[76] := 'CURSOR';
+ ElevateDB_reservedwords[77] := 'CURSOR_SENSITIVITY';
+ ElevateDB_reservedwords[78] := 'DAILY';
+ ElevateDB_reservedwords[79] := 'DATA';
+ ElevateDB_reservedwords[80] := 'DATABASE';
+ ElevateDB_reservedwords[81] := 'DATE';
+ ElevateDB_reservedwords[82] := 'DAY';
+ ElevateDB_reservedwords[83] := 'DAYOFWEEK';
+ ElevateDB_reservedwords[84] := 'DAYOFYEAR';
+ ElevateDB_reservedwords[85] := 'DAYS';
+ ElevateDB_reservedwords[86] := 'DECIMAL';
+ ElevateDB_reservedwords[87] := 'DECLARE';
+ ElevateDB_reservedwords[88] := 'DEFAULT';
+ ElevateDB_reservedwords[89] := 'DEFAULTS';
+ ElevateDB_reservedwords[90] := 'DEGREES';
+ ElevateDB_reservedwords[91] := 'DELETE';
+ ElevateDB_reservedwords[92] := 'DELIMITER';
+ ElevateDB_reservedwords[93] := 'DESC';
+ ElevateDB_reservedwords[94] := 'DESCENDING';
+ ElevateDB_reservedwords[95] := 'DESCRIPTION';
+ ElevateDB_reservedwords[96] := 'DISCONNECT';
+ ElevateDB_reservedwords[97] := 'DISTINCT';
+ ElevateDB_reservedwords[98] := 'DO';
+ ElevateDB_reservedwords[99] := 'DOES';
+ ElevateDB_reservedwords[100] := 'DOUBLE';
+ ElevateDB_reservedwords[101] := 'DROP';
+ ElevateDB_reservedwords[102] := 'ELSE';
+ ElevateDB_reservedwords[103] := 'ELSEIF';
+ ElevateDB_reservedwords[104] := 'EMPTY';
+ ElevateDB_reservedwords[105] := 'ENCRYPTED';
+ ElevateDB_reservedwords[106] := 'END';
+ ElevateDB_reservedwords[107] := 'EOF';
+ ElevateDB_reservedwords[108] := 'ERROR';
+ ElevateDB_reservedwords[109] := 'ERRORCODE';
+ ElevateDB_reservedwords[110] := 'ERRORMSG';
+ ElevateDB_reservedwords[111] := 'ESCAPE';
+ ElevateDB_reservedwords[112] := 'EVERY';
+ ElevateDB_reservedwords[113] := 'EXCEPT';
+ ElevateDB_reservedwords[114] := 'EXCEPTION';
+ ElevateDB_reservedwords[115] := 'EXCLUDING';
+ ElevateDB_reservedwords[116] := 'EXECUTE';
+ ElevateDB_reservedwords[117] := 'EXISTS';
+ ElevateDB_reservedwords[118] := 'EXP';
+ ElevateDB_reservedwords[119] := 'EXPORT';
+ ElevateDB_reservedwords[120] := 'EXTERNAL';
+ ElevateDB_reservedwords[121] := 'EXTRACT';
+ ElevateDB_reservedwords[122] := 'FALSE';
+ ElevateDB_reservedwords[123] := 'FETCH';
+ ElevateDB_reservedwords[124] := 'FILE';
+ ElevateDB_reservedwords[125] := 'FILTER';
+ ElevateDB_reservedwords[126] := 'FIRST';
+ ElevateDB_reservedwords[127] := 'FLOAT';
+ ElevateDB_reservedwords[128] := 'FLOOR';
+ ElevateDB_reservedwords[129] := 'FLUSH';
+ ElevateDB_reservedwords[130] := 'FOR';
+ ElevateDB_reservedwords[131] := 'FOREIGN';
+ ElevateDB_reservedwords[132] := 'FORMAT';
+ ElevateDB_reservedwords[133] := 'FOURTH';
+ ElevateDB_reservedwords[134] := 'FROM';
+ ElevateDB_reservedwords[135] := 'FULL';
+ ElevateDB_reservedwords[136] := 'FUNCTION';
+ ElevateDB_reservedwords[137] := 'GENERATED';
+ ElevateDB_reservedwords[138] := 'GENERATOR';
+ ElevateDB_reservedwords[139] := 'GRANT';
+ ElevateDB_reservedwords[140] := 'GROUP';
+ ElevateDB_reservedwords[141] := 'GUID';
+ ElevateDB_reservedwords[142] := 'HAVING';
+ ElevateDB_reservedwords[143] := 'HEADERS';
+ ElevateDB_reservedwords[144] := 'HOUR';
+ ElevateDB_reservedwords[145] := 'IDENTITY';
+ ElevateDB_reservedwords[146] := 'IF';
+ ElevateDB_reservedwords[147] := 'IFNULL';
+ ElevateDB_reservedwords[148] := 'IMMEDIATE';
+ ElevateDB_reservedwords[149] := 'IMPORT';
+ ElevateDB_reservedwords[150] := 'IN';
+ ElevateDB_reservedwords[151] := 'INCLUDE';
+ ElevateDB_reservedwords[152] := 'INCLUDING';
+ ElevateDB_reservedwords[153] := 'INCREMENT';
+ ElevateDB_reservedwords[154] := 'INDEX';
+ ElevateDB_reservedwords[155] := 'INDEXED';
+ ElevateDB_reservedwords[156] := 'INNER';
+ ElevateDB_reservedwords[157] := 'INOUT';
+ ElevateDB_reservedwords[158] := 'INSENSITIVE';
+ ElevateDB_reservedwords[159] := 'INSERT';
+ ElevateDB_reservedwords[160] := 'INT';
+ ElevateDB_reservedwords[161] := 'INTEGER';
+ ElevateDB_reservedwords[162] := 'INTERSECT';
+ ElevateDB_reservedwords[163] := 'INTERVAL';
+ ElevateDB_reservedwords[164] := 'INTO';
+ ElevateDB_reservedwords[165] := 'IS';
+ ElevateDB_reservedwords[166] := 'ITERATE';
+ ElevateDB_reservedwords[167] := 'JOB';
+ ElevateDB_reservedwords[168] := 'JOIN';
+ ElevateDB_reservedwords[169] := 'JOINOPTIMIZECOSTS';
+ ElevateDB_reservedwords[170] := 'KEEP';
+ ElevateDB_reservedwords[171] := 'KEY';
+ ElevateDB_reservedwords[172] := 'LARGE';
+ ElevateDB_reservedwords[173] := 'LAST';
+ ElevateDB_reservedwords[174] := 'LCASE';
+ ElevateDB_reservedwords[175] := 'LEADING';
+ ElevateDB_reservedwords[176] := 'LEAVE';
+ ElevateDB_reservedwords[177] := 'LEFT';
+ ElevateDB_reservedwords[178] := 'LENGTH';
+ ElevateDB_reservedwords[179] := 'LIKE';
+ ElevateDB_reservedwords[180] := 'LITERAL';
+ ElevateDB_reservedwords[181] := 'LOCK';
+ ElevateDB_reservedwords[182] := 'LOG';
+ ElevateDB_reservedwords[183] := 'LOG10';
+ ElevateDB_reservedwords[184] := 'LOOP';
+ ElevateDB_reservedwords[185] := 'LOWER';
+ ElevateDB_reservedwords[186] := 'LTRIM';
+ ElevateDB_reservedwords[187] := 'MAINTAIN';
+ ElevateDB_reservedwords[188] := 'MAX';
+ ElevateDB_reservedwords[189] := 'MEMORY';
+ ElevateDB_reservedwords[190] := 'MESSAGE';
+ ElevateDB_reservedwords[191] := 'MIGRATE';
+ ElevateDB_reservedwords[192] := 'MIGRATOR';
+ ElevateDB_reservedwords[193] := 'MIN';
+ ElevateDB_reservedwords[194] := 'MINUTE';
+ ElevateDB_reservedwords[195] := 'MOD';
+ ElevateDB_reservedwords[196] := 'MODULE';
+ ElevateDB_reservedwords[197] := 'MONTH';
+ ElevateDB_reservedwords[198] := 'MONTHLY';
+ ElevateDB_reservedwords[199] := 'MOVE';
+ ElevateDB_reservedwords[200] := 'MSECOND';
+ ElevateDB_reservedwords[201] := 'NAME';
+ ElevateDB_reservedwords[202] := 'NEXT';
+ ElevateDB_reservedwords[203] := 'NO';
+ ElevateDB_reservedwords[204] := 'NOJOINOPTIMIZE';
+ ElevateDB_reservedwords[205] := 'NONE';
+ ElevateDB_reservedwords[206] := 'NOT';
+ ElevateDB_reservedwords[207] := 'NULL';
+ ElevateDB_reservedwords[208] := 'NULLABLE';
+ ElevateDB_reservedwords[209] := 'NULLIF';
+ ElevateDB_reservedwords[210] := 'NUMERIC';
+ ElevateDB_reservedwords[211] := 'OBJECT';
+ ElevateDB_reservedwords[212] := 'OCCURS';
+ ElevateDB_reservedwords[213] := 'OF';
+ ElevateDB_reservedwords[214] := 'ON';
+ ElevateDB_reservedwords[215] := 'ONCE';
+ ElevateDB_reservedwords[216] := 'OPEN';
+ ElevateDB_reservedwords[217] := 'OPTIMIZE';
+ ElevateDB_reservedwords[218] := 'OPTION';
+ ElevateDB_reservedwords[219] := 'OR';
+ ElevateDB_reservedwords[220] := 'ORDER';
+ ElevateDB_reservedwords[221] := 'OUT';
+ ElevateDB_reservedwords[222] := 'OUTER';
+ ElevateDB_reservedwords[223] := 'PAGE';
+ ElevateDB_reservedwords[224] := 'PASSWORD';
+ ElevateDB_reservedwords[225] := 'PATH';
+ ElevateDB_reservedwords[226] := 'PI';
+ ElevateDB_reservedwords[227] := 'PM';
+ ElevateDB_reservedwords[228] := 'POS';
+ ElevateDB_reservedwords[229] := 'POSITION';
+ ElevateDB_reservedwords[230] := 'POWER';
+ ElevateDB_reservedwords[231] := 'PRECISION';
+ ElevateDB_reservedwords[232] := 'PREPARE';
+ ElevateDB_reservedwords[233] := 'PRIMARY';
+ ElevateDB_reservedwords[234] := 'PRIOR';
+ ElevateDB_reservedwords[235] := 'PRIVILEGES';
+ ElevateDB_reservedwords[236] := 'PROCEDURE';
+ ElevateDB_reservedwords[237] := 'QUOTE';
+ ElevateDB_reservedwords[238] := 'RADIANS';
+ ElevateDB_reservedwords[239] := 'RAISE';
+ ElevateDB_reservedwords[240] := 'RAND';
+ ElevateDB_reservedwords[241] := 'RANGE';
+ ElevateDB_reservedwords[242] := 'REDEFINE';
+ ElevateDB_reservedwords[243] := 'REFERENCES';
+ ElevateDB_reservedwords[244] := 'RELATIVE';
+ ElevateDB_reservedwords[245] := 'REMOVE';
+ ElevateDB_reservedwords[246] := 'REPAIR';
+ ElevateDB_reservedwords[247] := 'REPEAT';
+ ElevateDB_reservedwords[248] := 'REPLACE';
+ ElevateDB_reservedwords[249] := 'RESTORE';
+ ElevateDB_reservedwords[250] := 'RESTRICT';
+ ElevateDB_reservedwords[251] := 'RESULT';
+ ElevateDB_reservedwords[252] := 'RETURN';
+ ElevateDB_reservedwords[253] := 'RETURNS';
+ ElevateDB_reservedwords[254] := 'REVOKE';
+ ElevateDB_reservedwords[255] := 'RIGHT';
+ ElevateDB_reservedwords[256] := 'ROLE';
+ ElevateDB_reservedwords[257] := 'ROLLBACK';
+ ElevateDB_reservedwords[258] := 'ROUND';
+ ElevateDB_reservedwords[259] := 'ROW';
+ ElevateDB_reservedwords[260] := 'ROWCOUNT';
+ ElevateDB_reservedwords[261] := 'ROWS';
+ ElevateDB_reservedwords[262] := 'ROWSAFFECTED';
+ ElevateDB_reservedwords[263] := 'RTRIM';
+ ElevateDB_reservedwords[264] := 'RUN';
+ ElevateDB_reservedwords[265] := 'RUNSUM';
+ ElevateDB_reservedwords[266] := 'SECOND';
+ ElevateDB_reservedwords[267] := 'SELECT';
+ ElevateDB_reservedwords[268] := 'SENSITIVE';
+ ElevateDB_reservedwords[269] := 'SERVER';
+ ElevateDB_reservedwords[270] := 'SESSION';
+ ElevateDB_reservedwords[271] := 'SET';
+ ElevateDB_reservedwords[272] := 'SIGN';
+ ElevateDB_reservedwords[273] := 'SIN';
+ ElevateDB_reservedwords[274] := 'SIZE';
+ ElevateDB_reservedwords[275] := 'SMALLINT';
+ ElevateDB_reservedwords[276] := 'SQRT';
+ ElevateDB_reservedwords[277] := 'START';
+ ElevateDB_reservedwords[278] := 'STATEMENT';
+ ElevateDB_reservedwords[279] := 'STDDEV';
+ ElevateDB_reservedwords[280] := 'SUBSTR';
+ ElevateDB_reservedwords[281] := 'SUBSTRING';
+ ElevateDB_reservedwords[282] := 'SUM';
+ ElevateDB_reservedwords[283] := 'SUMSQUARE';
+ ElevateDB_reservedwords[284] := 'TABLE';
+ ElevateDB_reservedwords[285] := 'TABLES';
+ ElevateDB_reservedwords[286] := 'TAN';
+ ElevateDB_reservedwords[287] := 'TEMPORARY';
+ ElevateDB_reservedwords[288] := 'TEXT';
+ ElevateDB_reservedwords[289] := 'TEXTOCCURS';
+ ElevateDB_reservedwords[290] := 'TEXTSEARCH';
+ ElevateDB_reservedwords[291] := 'THEN';
+ ElevateDB_reservedwords[292] := 'THIRD';
+ ElevateDB_reservedwords[293] := 'TIME';
+ ElevateDB_reservedwords[294] := 'TIMESTAMP';
+ ElevateDB_reservedwords[295] := 'TO';
+ ElevateDB_reservedwords[296] := 'TOP';
+ ElevateDB_reservedwords[297] := 'TRAILING';
+ ElevateDB_reservedwords[298] := 'TRANSACTION';
+ ElevateDB_reservedwords[299] := 'TRIGGER';
+ ElevateDB_reservedwords[300] := 'TRIM';
+ ElevateDB_reservedwords[301] := 'TRUE';
+ ElevateDB_reservedwords[302] := 'TRUNC';
+ ElevateDB_reservedwords[303] := 'TRUNCATE';
+ ElevateDB_reservedwords[304] := 'TYPE';
+ ElevateDB_reservedwords[305] := 'UCASE';
+ ElevateDB_reservedwords[306] := 'UNENCRYPTED';
+ ElevateDB_reservedwords[307] := 'UNION';
+ ElevateDB_reservedwords[308] := 'UNIQUE';
+ ElevateDB_reservedwords[309] := 'UNPREPARE';
+ ElevateDB_reservedwords[310] := 'UNTIL';
+ ElevateDB_reservedwords[311] := 'UPDATE';
+ ElevateDB_reservedwords[312] := 'UPPER';
+ ElevateDB_reservedwords[313] := 'USE';
+ ElevateDB_reservedwords[314] := 'USER';
+ ElevateDB_reservedwords[315] := 'USING';
+ ElevateDB_reservedwords[316] := 'UTC';
+ ElevateDB_reservedwords[317] := 'VALUES';
+ ElevateDB_reservedwords[318] := 'VARBYTE';
+ ElevateDB_reservedwords[319] := 'VARCHAR';
+ ElevateDB_reservedwords[320] := 'VARYING';
+ ElevateDB_reservedwords[321] := 'VERSION';
+ ElevateDB_reservedwords[322] := 'VIEW';
+ ElevateDB_reservedwords[323] := 'WEEK';
+ ElevateDB_reservedwords[324] := 'WEEKLY';
+ ElevateDB_reservedwords[325] := 'WEEKS';
+ ElevateDB_reservedwords[326] := 'WHEN';
+ ElevateDB_reservedwords[327] := 'WHERE';
+ ElevateDB_reservedwords[328] := 'WHILE';
+ ElevateDB_reservedwords[329] := 'WINDOWS';
+ ElevateDB_reservedwords[330] := 'WITH';
+ ElevateDB_reservedwords[331] := 'WITHOUT';
+ ElevateDB_reservedwords[332] := 'WORD';
+ ElevateDB_reservedwords[333] := 'WORK';
+ ElevateDB_reservedwords[334] := 'YEAR';
+end;
+
+function TDAElevateDBConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result:=inherited IdentifierNeedsQuoting(iIdentifier) or ElevateDB_IdentifierNeedsQuoting(iIdentifier);
+end;
+
+initialization
+ ElevateDB_InitializeReservedWords;
+finalization
+ ElevateDB_reservedwords := nil;
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAEngine.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAEngine.pas
new file mode 100644
index 0000000..4427bf6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAEngine.pas
@@ -0,0 +1,2938 @@
+unit uDAEngine;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+interface
+
+uses
+ Classes, DB, SysUtils,
+ {$IFDEF MSWINDOWS} ActiveX, ComObj,{$ENDIF} // for ISupportErrorInfo, EOleSysError
+ uDAInterfaces, uROClasses, uDARes, uROTypes, uDAMacros, uDAUtils;
+
+type
+ { Misc }
+ TCustomConnectionClass = class of TCustomConnection;
+ TDatasetClass = class of TDataset;
+ TDAEConnection = class;
+ TDAEDriver = class;
+
+ { Exceptions }
+ EDAException = class(EROException);
+ EDADriverException = class(EDAException);
+
+ { TDAConnectionWrapper
+ Internal wrapper class for frameworks whose connections don't inherit from TCustomConnection or require additional
+ supporting components. See IBO and DBISAM drivers for an example. This class provides an implementation for DoConnect
+ and DoDisconnect removing the need to further override them. }
+ TDAConnectionWrapper = class(TCustomConnection)
+ protected
+ procedure DoConnect; override;
+ procedure DoDisconnect; override;
+ end;
+
+ {$IFDEF MSWINDOWS}
+ TDAEngineBaseObject = class(TROInterfacedObject, ISupportErrorInfo)//, IServerExceptionHandler)
+ protected
+ function InterfaceSupportsErrorInfo(const iid: TGUID): HRESULT; stdcall;
+ procedure OnException(const ServerClass: WideString; const ExceptionClass: WideString;
+ const ErrorMessage: WideString; ExceptAddr: Integer; const ErrorIID: WideString;
+ const ProgID: WideString; var Handled: Integer; var Result: HRESULT);
+ public
+ function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult; override;
+ end;
+ {$ELSE}
+ TDAEngineBaseObject = TROInterfacedObject;
+ {$ENDIF}
+
+
+ { TDASQLMacroProcessor }
+ TDASQLMacroProcessor = class(TROMacroParser)
+ private
+ fStoredProcedurePrefix,
+ fDateFormat,
+ fStoredProcParamPrefix,
+ fDateTimeFormat: string;
+ fDoubleQuoteStrings: boolean;
+ function MyUnknownIdentifier(Sender: TObject; const Name, OrgName: string; var Value: string): Boolean;
+ protected
+ // Internal
+ procedure RegisterMacros; virtual;
+
+ // SQL Functions
+ function DateTime(Sender: TObject; const Parameters: array of string): string; virtual; abstract;
+ function Date(Sender: TObject; const Parameters: array of string): string; virtual;
+
+ function AddTime(Sender: TObject; const Parameters: array of string): string; virtual; abstract;
+
+ function FormatDateTime(Sender: TObject; const Parameters: array of string): string; virtual;
+ function FormatDate(Sender: TObject; const Parameters: array of string): string; virtual;
+
+ function Length(Sender: TObject; const Parameters: array of string): string; virtual; abstract;
+ function LowerCase(Sender: TObject; const Parameters: array of string): string; virtual; abstract;
+ function UpperCase(Sender: TObject; const Parameters: array of string): string; virtual; abstract;
+ function TrimLeft(Sender: TObject; const Parameters: array of string): string; virtual; abstract;
+ function TrimRight(Sender: TObject; const Parameters: array of string): string; virtual; abstract;
+ function Copy(Sender: TObject; const Parameters: array of string): string; virtual; abstract;
+ function Nolock(Sender: TObject; const Parameters: array of string): string; virtual;abstract;
+ public
+ constructor Create(const aDateFormat, aDateTimeFormat: string;
+ aDoubleQuoteStrings: boolean;
+ const aStoredProcParamsPrefix: string = '');overload;
+ constructor Create;overload;
+
+ property StoredProcedurePrefix: string read fStoredProcedurePrefix;
+ property DateFormat: string read fDateFormat;
+ property StoredProcParamPrefix: string read fStoredProcParamPrefix;
+ property DateTimeFormat: string read fDateTimeFormat;
+ property DoubleQuoteStrings: boolean read fDoubleQuoteStrings;
+ end;
+
+ IDAHasMacroProcessor = interface(IDAConnection)
+ ['{C18B417F-C698-4BB1-8F57-C3952E1046D1}']
+ function GetMacroProcessor: TDASQLMacroProcessor;
+ end;
+
+ IDANativeDatabaseAccess = interface
+ ['{0AC0565B-9500-4A90-B55D-25CB04568F9B}']
+ procedure ClearFieldDefs;
+ function GetRecordCount: Integer;
+ function GetBOF:Boolean;
+ function GetEOF:Boolean;
+ function GetActive:Boolean;
+ procedure SetActive(const aValue: Boolean);
+ procedure Next;
+ function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant;
+ function GetFieldName(Index: Integer): string;
+ procedure DisableControls;
+ procedure EnableControls;
+ function ControlsDisabled: Boolean;
+ function GetIsEmpty: boolean;
+ procedure FreeBookmark(Bookmark: TBookmark);
+ function GetBookMark: pointer;
+ procedure GotoBookmark(Bookmark: TBookmark);
+ function GetState: TDatasetState;
+ procedure Prepare(const AValue: Boolean);
+ function GetFields(Index: integer): IDANativeField;
+ function FieldCount: Integer;
+ function FindField(const FieldName: string): IDANativeField;
+ function IsTDatasetCompatible: Boolean;
+ property Active: Boolean read GetActive write SetActive;
+ function GetNativeFieldData(Index: Integer; var Data: pointer; var DataSize: cardinal):Boolean;
+ function GetNativeFieldValue(Index: Integer): Variant;
+ function CanFreeNativeFieldData: Boolean;
+ end;
+
+ TDANativeField_Dataset = class(TInterfacedObject, IDANativeField)
+ private
+ fField: TField;
+ protected
+ function GetNativeObject: TObject;
+ function isTFieldCompatible: Boolean;
+ function GetFieldName: string;
+ function GetDataType: TFieldType;
+ function GetSize: integer;
+ function GetDecimalPrecision: Integer;
+ procedure SetDecimalPrecision(Value: integer);
+ function GetDecimalScale: Integer;
+ procedure SetDecimalScale(Value: integer);
+ procedure SetDataType(Value: TFieldType);
+ function GetFieldIndex: integer;
+ function GetValue: Variant;
+ function IsNull: Boolean;
+ public
+ constructor Create(AField: TField);
+ end;
+
+ TDANativeDatabaseAccess_Dataset = class(TInterfacedObject,IDANativeDatabaseAccess)
+ private
+ FDataset: TDataSet;
+ fList: TInterfaceList;
+ protected
+ procedure ClearFieldDefs;
+ function GetRecordCount: Integer;
+ function GetBOF:Boolean;
+ function GetEOF:Boolean;
+ function GetActive:Boolean;
+ procedure SetActive(const aValue: Boolean);
+ procedure Next;
+ function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant;
+ function GetFieldName(Index: Integer): string;
+ procedure DisableControls;
+ procedure EnableControls;
+ function GetIsEmpty: boolean;
+ procedure FreeBookmark(Bookmark: TBookmark);
+ function GetBookMark: pointer;
+ procedure GotoBookmark(Bookmark: TBookmark);
+ function GetState: TDatasetState;
+ function ControlsDisabled: Boolean;
+ procedure Prepare(const AValue: Boolean);
+ function GetFields(Index: integer): IDANativeField;
+ function FieldCount: Integer;
+ function FindField(const FieldName: string): IDANativeField;
+ function IsTDatasetCompatible: Boolean;
+ function GetNativeFieldData(Index: Integer; var Data: pointer; var DataSize: cardinal):Boolean;
+ function CanFreeNativeFieldData: Boolean;
+ function GetNativeFieldValue(Index: Integer): Variant;
+ public
+ Constructor Create(ADataset: TDataSet);
+ destructor Destroy;override;
+ end;
+
+ { 20080408:
+ Dataset-compatible drivers - default mode, i.e. no changes is required.
+
+
+ non-Dataset-compatible drivers:
+
+ you should create objects that supports
+ IDANativeField, IDANativeDatabaseAccess
+
+ xxxQuery:
+ ---------
+ you should override in addition:
+ function CreateNativeDatabaseAccess: IDANativeDatabaseAccess; // point to IDANativeDatabaseAccess
+ function CreateNativeObject(aConnection: TDAEConnection): TObject; // Result - point to your native object
+ function CreateDataset(aConnection: TDAEConnection): TDataset; // you can raise error or return nil
+ you can use
+ property NativeDatabaseAccess: IDANativeDatabaseAccess read fNativeDatabaseAccess; // your object which you return with CreateNativeDatabaseAccess
+ property NativeObject: TObject read GetNativeObject; // your object created with CreateNativeObject
+
+
+ XXXStoredProcedure
+ ------------------
+ you should override in addition:
+ function CreateNativeObject(aConnection: TDAEConnection): TObject; // Result - point to your native object
+ function CreateDataset(aConnection: TDAEConnection): TDataset; // you can raise error or return nil
+ you can use
+ property NativeObject: TObject read GetNativeObject; // your object created with CreateNativeObject
+ }
+
+ { TDAESQLCommand }
+ {$WARN SYMBOL_DEPRECATED OFF}
+ TDAESQLCommand = class(TDAEngineBaseObject, IDASQLCommand, IDAMustSetParams, IDASQLCommandNativeObject)
+ private
+ fConnection: TDAEConnection;
+ fconn: IDAConnection;
+ fDataset: TDataset;
+ FNativeObject: TObject;
+ fParams: TDAParamCollection;
+ fWhere: TDAWhere;
+ fDynamicWhere: TDASQLWhereBuilder;
+ fChanged: boolean;
+ fSQL: string;
+ fName: string;
+ fPrepared: boolean;
+ //fOrderBy : string;
+ fOnAfterExecute: TDAAfterExecuteCommandEvent;
+ fOnBeforeExecute: TDABeforeExecuteCommandEvent;
+ fOnExecuteError: TDAExecuteCommandErrorEvent;
+ FIsPresentDynWhereVariable: Boolean;
+ function UnknownIdentifier(Sender: TObject; const Name, OrgName: string; var Value: string): Boolean;
+ procedure SetDynamicWhereParams;
+ procedure RemoveDynamicWhereParams;
+
+ { non-dataset mode}
+ protected
+ fNativeDatabaseAccess: IDANativeDatabaseAccess;
+ function CreateNativeDatabaseAccess: IDANativeDatabaseAccess; virtual;
+ { non-dataset mode end}
+
+ // Internal
+ procedure OnWhereChange(Sender: TObject);
+ procedure PrepareSQLStatement; virtual;
+ function GenerateDynamicWhereStatement: string;
+ function SQLContainsDynamicWhere: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValuesStd(Params1: TDAParamCollection;Params2: TParams);
+ procedure SetParamValuesStd(Params1: TDAParamCollection;Params2: TParams);
+ procedure ClearParams; virtual;
+ function FindParameter(const AParams: TParams;const AParamName: string): TParam;
+
+ // To be overridden
+ function CreateNativeObject(aConnection: TDAEConnection): TObject; virtual;
+ function CreateDataset(aConnection: TDAEConnection): TDataset; virtual; abstract;
+
+ procedure DoPrepare(Value: boolean); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+ function DoExecute: integer; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+ procedure DoSetSQL(const Value: string); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+ function DoGetSQL: string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}abstract;
+
+ //IDASQLCommandNativeObject
+ function GetNativeObject: TObject; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetNativeFields(Index: integer): IDANativeField;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function NativeFieldCount: Integer;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function NativeFindField(const FieldName: string): IDANativeField;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function IsTDatasetCompatible: Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetNativeFieldData(Index: Integer; var Data: pointer; var DataSize: cardinal):Boolean; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function CanFreeNativeFieldData: Boolean;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDASQLCommand
+ function GetDataset: TDataset; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetPrepared: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetPrepared(Value: boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetParams: TDAParamCollection; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure RefreshParams; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Execute: integer; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetWhere: TDAWhere; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDynamicWhere: TDAWhereBuilder; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetDynamicWhere(const Value: TDAWhereBuilder); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetSQL: string; virtual;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetSQL(const Value: string); virtual;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function ParamByName(const aName: string): TDAParam; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ property NativeObject: TObject read GetNativeObject;
+ property Dataset: TDataset read GetDataset;
+ property Changed: boolean read fChanged write fChanged;
+ property Connection: TDAEConnection read fConnection;
+
+ function GetOnAfterExecute: TDAAfterExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeExecute: TDABeforeExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterExecute(const Value: TDAAfterExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeExecute(const Value: TDABeforeExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnExecuteError: TDAExecuteCommandErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnExecuteError(const Value: TDAExecuteCommandErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function intVCLTypeToDAType(aFieldType: TFieldType; ASize: integer = 0; ADecimalPrecision: integer = 0; aDecimalScale: integer = 0): TDADataType;virtual;
+ procedure SetParamValues(AParams: TDAParamCollection); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+ procedure GetParamValues(AParams: TDAParamCollection); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+ public
+ constructor Create(aConnection: TDAEConnection; const aName: string = ''); virtual;
+ destructor Destroy; override;
+ end;
+
+ { TDAEDataset }
+ TDAEDataset = class(TDAESQLCommand, IDASQLCommand, IDADataset)
+ private
+ fAutoFields: boolean;
+ fFields: TDAFieldCollection;
+ fLogicalName : string;
+ fOnAfterOpen: TDAAfterOpenDatasetEvent;
+ fOnBeforeOpen: TDABeforeOpenDatasetEvent;
+ fOnOpenError: TDAOpenDatasetErrorEvent;
+ FNativeIndex: array of integer;
+ protected
+ property NativeDatabaseAccess: IDANativeDatabaseAccess read fNativeDatabaseAccess;
+ function IsNeedToFixFMTBCDIssue: Boolean; virtual;
+ procedure FixKnownIssues;virtual;
+ procedure FixFMTBCDIssue;
+ // To be overridden
+ function DoGetRecordCount: integer; dynamic;
+ function DoGetActive: boolean; dynamic;
+ procedure DoSetActive(Value: boolean); dynamic;
+ function DoGetBOF: boolean; dynamic;
+ function DoGetEOF: boolean; dynamic;
+
+ procedure DoNext; dynamic;
+
+ function DoLocate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; dynamic;
+ procedure DoPrepare(Value: boolean); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ //IDASQLCommandNativeObject
+ function GetNativeFieldData(Index: Integer; var Data: pointer; var DataSize: cardinal):Boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDADataset
+ function GetRecordCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFields: TDAFieldCollection; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetActive: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetActive(Value: boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetBOF: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetEOF: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldValues(Index: integer): Variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetNames(Index: integer): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetIsEmpty : boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetState : TDatasetState; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Open; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Close; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure EnableControls; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableControls; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function ControlsDisabled: Boolean;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Next; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Refresh; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function FieldByName(const aName: string): TDAField; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function FindField(const aName: string): TDAField; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetBookMark: pointer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GotoBookmark(Bookmark: TBookmark); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure FreeBookmark(Bookmark: TBookmark); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetLogicalName : string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetLogicalName(aName : string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetOnAfterOpen: TDAAfterOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeOpen: TDABeforeOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterOpen(const Value: TDAAfterOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeOpen(const Value: TDABeforeOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnOpenError: TDAOpenDatasetErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnOpenError(const Value: TDAOpenDatasetErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetRowRecIdValue: integer;
+ function GetCurrentRecIdValue: integer;
+ procedure SetCurrentRecIdValue(Value: integer);
+ procedure EnableConstraints; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableConstraints; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ constructor Create(aConnection: TDAEConnection; const aName: string = ''); override;
+ destructor Destroy; override;
+ end;
+ {$WARN SYMBOL_DEPRECATED ON}
+
+ TDAEDatasetClass = class of TDAEDataset;
+
+ {$WARN SYMBOL_DEPRECATED OFF}
+ { TDAEStoredProcedure }
+ TDAEStoredProcedure = class(TDAESQLCommand, IDASQLCommand, IDAStoredProcedure)
+ protected
+ function CreateNativeDatabaseAccess: IDANativeDatabaseAccess; override;
+ procedure RefreshParamsStd(AParams: TParams);
+ // Internal
+ procedure DoPrepare(Value: boolean); override;
+ procedure RefreshParams; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetSQL(const Value: string); override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDAStoredProcedure
+ function GetStoredProcedureName: string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+ procedure SetStoredProcedureName(const Name: string); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+ procedure PrepareSQLStatement; override;
+ public
+ end;
+ {$WARN SYMBOL_DEPRECATED ON}
+ TDAEStoredProcedureClass = class of TDAEStoredProcedure;
+
+ { TDAEConnection }
+ TDAEConnection = class(TDAEngineBaseObject, IDAConnection, IDAConnectionObjectAccess, IDATestableObject, IDAHasMacroProcessor)
+ private
+ fConnectionObject: TCustomConnection;
+ fConnectionString: string;
+ fConnectionManager: IDAConnectionManager;
+ fConnectionDefinition: TDAConnection;
+ fDriver: TDAEDriver;
+ fUserID,
+ fPassword,
+ fName: string;
+ fMacroProcessor: TDASQLMacroProcessor;
+ fOnAfterExecuteCommand: TDAAfterExecuteCommandEvent;
+ fOnAfterOpenDataset: TDAAfterOpenDatasetEvent;
+ fOnBeforeOpenDataset: TDABeforeOpenDatasetEvent;
+ fOnBeforeExecuteCommand: TDABeforeExecuteCommandEvent;
+ fOnExecuteCommandError: TDAExecuteCommandErrorEvent;
+ fOnOpenDatasetError: TDAOpenDatasetErrorEvent;
+ fConnectionPool: IDAConnectionPool;
+ fReleasing: Boolean;
+ fUseMacroProcessor:Boolean;
+
+ function CreateConnectionObject: TCustomConnection;
+
+ protected
+ fConnectionType: string;
+ property ConnectionName: string read fName;
+ property ConnectionManager: IDAConnectionManager read fConnectionManager;
+ property ConnectionDefinition: TDAConnection read fConnectionDefinition;
+
+ function QueryInterface(const IID: TGUID; out Obj): HResult; override; stdcall;
+ function GetConnectionPool: IDAConnectionPool; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetConnectionPool(const Value: IDAConnectionPool); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // To be overridden
+ function CreateCustomConnection: TCustomConnection; virtual; abstract;
+ function CreateMacroProcessor: TDASQLMacroProcessor; virtual;
+
+ function GetDatasetClass: TDAEDatasetClass; virtual;
+ function GetStoredProcedureClass: TDAEStoredProcedureClass; virtual;
+
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); virtual;
+
+ function DoBeginTransaction: integer; virtual; abstract;
+ procedure DoCommitTransaction; virtual; abstract;
+ procedure DoRollbackTransaction; virtual; abstract;
+ function DoGetInTransaction: boolean; virtual; abstract;
+
+ procedure DoGetTableNames(out List: IROStrings); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetViewNames(out List: IROStrings); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetStoredProcedureNames(out List: IROStrings); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetQueryFields(const aSQL: string; aParamsIfNeeded: TDAParamCollection; out Fields: TDAFieldCollection); virtual;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetViewFields(const aViewName: string; out Fields: TDAFieldCollection); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function DoGetLastAutoInc(const GeneratorName: string): integer; virtual;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; virtual;
+
+ // Misc
+ procedure ApplyConnectionString(const aConnectionString: string; aConnectionObject: TCustomConnection);
+
+ procedure AssignCommandEventHandlers(const aCommand: IDASQLCommand);
+ procedure AssignDatasetEventHandlers(const aDataset: IDADataset);
+
+ // IDAConnectionObjectAccess
+ function GetConnectionObject: TObject; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetConnectionProperties(const aPropertyName: string): Variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetConnectionProperties(const aPropertyName: string; const aValue: Variant); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDATestableObject
+ procedure Test; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // IDAConnection
+ function GetConnectionString: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetConnectionString(Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetConnected: boolean; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetConnected(Value: boolean); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetOnAfterExecuteCommand: TDAAfterExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnAfterOpenDataset: TDAAfterOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeExecuteCommand: TDABeforeExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeOpenDataset: TDABeforeOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnExecuteCommandError: TDAExecuteCommandErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnOpenDatasetError: TDAOpenDatasetErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterExecuteCommand(const Value: TDAAfterExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterOpenDataset(const Value: TDAAfterOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeExecuteCommand(const Value: TDABeforeExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeOpenDataset(const Value: TDABeforeOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnExecuteCommandError(const Value: TDAExecuteCommandErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnOpenDatasetError(const Value: TDAOpenDatasetErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Open(const aUserID: string = ''; const aPassword: string = ''); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Close; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // UserID/Password
+ function GetUserID: string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetUserID(const Value: string); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetPassword: string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetPassword(const Value: string); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function BeginTransaction: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CommitTransaction; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure RollbackTransaction; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetInTransaction: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure GetTableNames(out List: IROStrings); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetViewNames(out List: IROStrings); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetStoredProcedureNames(out List: IROStrings); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetTableFields(const aTableName: string; out Fields: TDAFieldCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetQueryFields(const aSQL: string; aParamsIfNeeded: TDAParamCollection; out Fields: TDAFieldCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetViewFields(const aViewName: string; out Fields: TDAFieldCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+
+ function GetSPSelectSyntax(HasArguments: Boolean): string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetQuoteChars: TDAQuoteCharArray; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function IdentifierIsQuoted(const iIdentifier: string): boolean; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function QuoteIdentifierIfNeeded(const iIdentifier: string): string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function QuoteIdentifier(const iIdentifier: string): string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function QuoteFieldNameIfNeeded(const aTableName, aFieldName: string): string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function QuoteFieldName(const aTableName, aFieldName: string): string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function NewCommand(const Text: string; CommandType: TDASQLStatementType; const aCommandName: string = ''): IDASQLCommand; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function NewDataset(const SQL: string; const aDatasetName: string = ''): IDADataset; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetLastAutoInc(const GeneratorName: string = ''): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetLastAutoIncValue(const GeneratorName: string = ''): variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ property UserID: string read GetUserID write SetUserID;
+ property Password: string read GetPassword write SetPassword;
+ property ConnectionObject: TCustomConnection read fConnectionObject write fConnectionObject;
+ function GetMacroProcessor: TDASQLMacroProcessor;
+ function _Release: Integer; override; stdcall;
+ function isAlive: Boolean; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetConnectionType: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ property ConnectionType: string read GetConnectionType;
+ function GetQueryBuilder: TDAQueryBuilder; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetWhereBuilder: TDASQLWhereBuilder; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetUseMacroProcessor: Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetUseMacroProcessor(Value:Boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ constructor Create(aDriver: TDAEDriver; aName: string = ''); virtual;
+ destructor Destroy; override;
+
+ property ConnectionPool: IDAConnectionPool read GetConnectionPool write SetConnectionPool;
+ property Driver: TDAEDriver read fDriver;
+ property MacroProcessor: TDASQLMacroProcessor read GetMacroProcessor;
+ end;
+
+ TDAEConnectionClass = class of TDAEConnection;
+
+ { TDAEDriver }
+ TDAEDriver = class(TComponent, IDADriver, IDADriver30)
+ private
+
+ protected
+ // To be overridden
+ function GetConnectionClass: TDAEConnectionClass; virtual; abstract;
+ procedure CustomizeConnectionObject(aConnection: TDAEConnection); dynamic;
+ procedure DoSetTraceOptions(TraceActive: boolean; TraceFlags: TDATraceOptions; Callback: TDALogTraceEvent); virtual;
+
+ { IDADriver }
+ function GetDriverID: string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+ function GetDescription: string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} abstract;
+ function GetMajVersion: byte; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetMinVersion: byte; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure GetAuxDrivers(out List: IROStrings); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDefaultConnectionType(const AuxDriver: string): string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure SetTraceOptions(TraceActive: boolean; TraceFlags: TDATraceOptions; Callback: TDALogTraceEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function NewConnection(const aName: string = ''; const aConnectionType: string = ''): IDAConnection; overload; {deprecated;} {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function NewConnection(const aConnectionManager: IDAConnectionManager; aConnectionDefinition: TDAConnection): IDAConnection; overload; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Initialize; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Finalize; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAvailableDriverOptionsEx(AuxDriver: string): TDAAvailableDriverOptions; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDefaultCustomParameters: string; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ { IDADriver30 }
+ function GetDriverHelp(aType: TDADriverHelpType): string;
+ public
+ destructor Destroy; override;
+ end;
+
+ TDAEDriverClass = class of TDAEDriver;
+
+ { TDADriverReference }
+ TDADriverReference = class(TComponent)
+ end;
+
+{$IFDEF MSWINDOWS}
+function DAHandleSafeCallException(aObject:TObject; ExceptObject: TObject; ExceptAddr: Pointer): HResult;
+{$ENDIF MSWINDOWS}
+function Engine_GetDatabaseNames(aConnection:TDAEConnection; aMasterDatabase, aGetDatabaseNamesSQL: String): IROStrings;
+function TestIdentifier(const iIdentifier: string; const ReservedWords: array of string): boolean;
+implementation
+
+uses
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF} Variants,{$IFDEF FPC}dbconst,{$ELSE}DBConsts,{$ENDIF}
+ FMTBcd,{$IFNDEF Drivers_CompatibilityMode}{$IFNDEF FPC}SqlTimSt,{$ENDIF}{$ENDIF}
+ TypInfo, uDAHelpers, uROClient, uDASQL92QueryBuilder, uROBinaryHelpers;
+
+function Engine_GetDatabaseNames(aConnection:TDAEConnection; aMasterDatabase, aGetDatabaseNamesSQL: String): IROStrings;
+var
+ connStrParser : TDAConnectionStringParser;
+ conn : IDAConnection;
+ ds : IDAdataset;
+begin
+ Result := NewROStrings;
+ connStrParser := TDAConnectionStringParser.Create((aConnection as IDAConnection).ConnectionString);
+ try
+ connStrParser.Database := aMasterDatabase;
+
+ conn := TDAEConnectionClass(aConnection.ClassType).Create(aConnection.Driver);
+ conn.ConnectionString := connStrParser.BuildString;
+ conn.Open;
+
+ ds := conn.NewDataset(aGetDatabaseNamesSQL);
+ ds.Open;
+
+ while not ds.EOF do begin
+ result.Add(VarToStr(ds.FieldValues[0]));
+ ds.Next;
+ end;
+ finally
+ connStrParser.Free;
+ conn := nil;
+ ds := nil;
+ end;
+end;
+
+{ TDAEDriver }
+
+destructor TDAEDriver.Destroy;
+begin
+ SetTraceOptions(FALSE, [], nil);
+
+ inherited;
+end;
+
+procedure TDAEDriver.Initialize;
+begin
+end;
+
+procedure TDAEDriver.Finalize;
+begin
+
+end;
+
+function TDAEDriver.GetMajVersion: byte;
+begin
+ result := 1
+end;
+
+function TDAEDriver.GetMinVersion: byte;
+begin
+ result := 0
+end;
+
+function TDAEDriver.NewConnection(const aName: string = '';const aConnectionType: string = ''): IDAConnection;
+var
+ conn: TDAEConnection;
+begin
+ conn := GetConnectionClass.Create(Self, aName);
+ conn.FConnectionType := aConnectionType;
+ CustomizeConnectionObject(conn); // In some cases the driver might need to do additional customization
+
+ result := conn;
+end;
+
+function TDAEDriver.NewConnection(const aConnectionManager: IDAConnectionManager; aConnectionDefinition: TDAConnection): IDAConnection;
+var
+ conn: TDAEConnection;
+begin
+ conn := GetConnectionClass.Create(Self, aConnectionDefinition.Name);
+ conn.fConnectionType := aConnectionDefinition.ConnectionType;
+ conn.fConnectionManager := aConnectionManager;
+ conn.fConnectionDefinition := aConnectionDefinition;
+ CustomizeConnectionObject(conn); // In some cases the driver might need to do additional customization
+
+ result := conn;
+end;
+
+function TDAEDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ //result := [doAuxDriver,doServerName,doDatabaseName,doLogin,doCustom];
+ result := [doServerName, doDatabaseName, doLogin];
+end;
+
+function TDAEDriver.GetAvailableDriverOptionsEx(AuxDriver: string): TDAAvailableDriverOptions;
+begin
+ result := GetAvailableDriverOptions;
+end;
+
+function TDAEDriver.GetDefaultConnectionType(const AuxDriver: string): string;
+begin
+ result := '';
+end;
+
+function TDAEDriver.GetDefaultCustomParameters: string;
+begin
+ result := '';
+end;
+
+procedure TDAEDriver.SetTraceOptions(TraceActive: boolean; TraceFlags: TDATraceOptions; Callback: TDALogTraceEvent);
+begin
+ if (csDesigning in ComponentState) then Exit;
+
+ DoSetTraceOptions(TraceActive, TraceFlags, Callback);
+end;
+
+procedure TDAEDriver.CustomizeConnectionObject(aConnection: TDAEConnection);
+begin
+end;
+
+procedure TDAEDriver.DoSetTraceOptions(TraceActive: boolean;
+ TraceFlags: TDATraceOptions; Callback: TDALogTraceEvent);
+begin
+end;
+
+procedure TDAEDriver.GetAuxDrivers(out List: IROStrings);
+begin
+ List := NewROStrings();
+end;
+
+procedure TDAEDriver.GetAuxParams(const AuxDriver: string; out List: IROStrings);
+begin
+ List := NewROStrings();
+end;
+
+function TDAEDriver.GetDriverHelp(aType: TDADriverHelpType): string;
+begin
+ result := LoadHtmlFromResource(hInstance, 'DRIVER_HELP');
+end;
+
+{ TDAEConnection }
+
+constructor TDAEConnection.Create(aDriver: TDAEDriver; aName: string = '');
+begin
+ inherited Create;
+
+ fName := aName;
+ fDriver := aDriver;
+ fConnectionObject := CreateConnectionObject;
+ FUseMacroProcessor := True;
+end;
+
+destructor TDAEConnection.Destroy;
+begin
+ if Assigned(fConnectionObject) then begin
+ try
+ if fConnectionObject.Connected then fConnectionObject.Close;
+ except
+ end;
+ FreeAndNIL(fConnectionObject);
+ end;
+
+ if Assigned(fMacroProcessor) then fMacroProcessor.Free;
+
+ inherited;
+end;
+
+function TDAEConnection.GetConnected: boolean;
+begin
+ result := assigned(fConnectionObject) and fConnectionObject.Connected;
+end;
+
+function TDAEConnection.GetConnectionString: string;
+begin
+ result := fConnectionString;
+end;
+
+procedure TDAEConnection.SetConnected(Value: boolean);
+begin
+ if fConnectionObject <> nil then
+ fConnectionObject.Connected := Value;
+end;
+
+procedure TDAEConnection.SetConnectionString(Value: string);
+begin
+ if (Value = fConnectionString) then Exit;
+
+ ApplyConnectionString(Value, fConnectionObject);
+end;
+
+function TDAEConnection.GetConnectionObject: TObject;
+begin
+ result := fConnectionObject;
+end;
+
+function TDAEConnection.GetConnectionProperties(
+ const aPropertyName: string): Variant;
+begin
+ if assigned(fConnectionObject) then
+ result := GetPropValue(fConnectionObject, aPropertyName, FALSE)
+ else
+ result := Unassigned;
+end;
+
+procedure TDAEConnection.SetConnectionProperties(
+ const aPropertyName: string; const aValue: Variant);
+begin
+ if assigned(fConnectionObject) then
+ SetPropValue(fConnectionObject, aPropertyName, aValue);
+end;
+
+procedure TDAEConnection.Close;
+begin
+ SetConnected(FALSE); // Exceptions are handled there
+end;
+
+procedure TDAEConnection.Open(const aUserID: string = ''; const aPassword: string = '');
+begin
+ if (aUserID <> '') then UserID := aUserID;
+ if (aPassword <> '') then Password := aPassword;
+
+ SetConnected(TRUE); // Exceptions are handled there
+end;
+
+function TDAEConnection.CreateConnectionObject: TCustomConnection;
+begin
+ result := CreateCustomConnection;
+end;
+
+function TDAEConnection.NewDataset(const SQL: string; const aDatasetName: string = ''): IDADataset;
+begin
+ result := GetDatasetClass.Create(Self, aDatasetName);
+ result.SQL := SQL;
+
+ AssignDatasetEventHandlers(result); // Propagates the event handlers to all datasets
+end;
+
+function TDAEConnection.NewCommand(const Text: string; CommandType: TDASQLStatementType; const aCommandName: string = ''): IDASQLCommand;
+var
+ sp: IDAStoredProcedure;
+ ds: IDADataset;
+begin
+ result := nil;
+
+ case CommandType of
+ stStoredProcedure: begin
+ sp := GetStoredProcedureClass.Create(Self, aCommandName);
+ sp.StoredProcedureName := Text;
+
+ result := sp;
+ end;
+ stSQL: begin
+ ds := GetDatasetClass.Create(Self, aCommandName);
+ ds.SQL := Text;
+ result := ds;
+ end;
+ end;
+
+ if Result <> nil then
+ Result.RefreshParams;
+
+ AssignCommandEventHandlers(result); // Propagates the event handlers to all commands
+end;
+
+function TDAEConnection.BeginTransaction: integer;
+begin
+ result := -1;
+
+ DoBeginTransaction;
+end;
+
+procedure TDAEConnection.CommitTransaction;
+begin
+ DoCommitTransaction;
+end;
+
+procedure TDAEConnection.RollbackTransaction;
+begin
+ DoRollbackTransaction;
+end;
+
+procedure TDAEConnection.GetStoredProcedureNames(out List: IROStrings);
+begin
+ DoGetStoredProcedureNames(List);
+end;
+
+procedure TDAEConnection.GetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ DoGetStoredProcedureParams(aStoredProcedureName, Params);
+end;
+
+procedure TDAEConnection.GetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ DoGetForeignKeys(ForeignKeys);
+end;
+
+procedure TDAEConnection.GetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ DoGetTableFields(aTableName, Fields);
+end;
+
+procedure TDAEConnection.GetQueryFields(const aSQL: string; aParamsIfNeeded: TDAParamCollection; out Fields: TDAFieldCollection);
+begin
+ DoGetQueryFields(aSQL, aParamsIfNeeded, Fields);
+end;
+
+procedure TDAEConnection.GetTableNames(out List: IROStrings);
+begin
+ DoGetTableNames(List);
+end;
+
+procedure TDAEConnection.GetViewFields(const aViewName: string;
+ out Fields: TDAFieldCollection);
+begin
+ DoGetViewFields(aViewName, Fields);
+end;
+
+procedure TDAEConnection.GetViewNames(out List: IROStrings);
+begin
+ DoGetViewNames(List);
+end;
+
+function TDAEConnection.GetWhereBuilder: TDASQLWhereBuilder;
+begin
+ Result:= TDASQL92WhereBuilder.Create(Self);
+end;
+
+function TDAEConnection.GetDatasetClass: TDAEDatasetClass;
+begin
+ result := nil;
+end;
+
+function TDAEConnection.GetStoredProcedureClass: TDAEStoredProcedureClass;
+begin
+ result := nil;
+end;
+
+procedure TDAEConnection.DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection);
+var
+ qry: IDADataset;
+begin
+ Fields := TDAFieldCollection.Create(nil);
+ qry := GetDatasetClass.Create(Self);
+ try
+ qry.SQL := 'SELECT * FROM ' + QuoteIdentifierIfNeeded(aTableName) + ' WHERE 1=0';
+ qry.Open;
+ Fields.Assign(qry.Fields);
+ finally
+ qry := nil;
+ end;
+end;
+
+procedure TDAEConnection.DoGetQueryFields(const aSQL: string; aParamsIfNeeded: TDAParamCollection; out Fields: TDAFieldCollection);
+var
+ qry: IDADataset;
+begin
+ Fields := TDAFieldCollection.Create(nil);
+ qry := GetDatasetClass.Create(Self);
+ try
+ qry.SQL := aSQL;
+ if assigned(aParamsIfNeeded) then
+ qry.Params.AssignParamCollection(aParamsIfNeeded);
+ qry.Open;
+ Fields.Assign(qry.Fields);
+ finally
+ qry := nil;
+ end;
+end;
+
+procedure TDAEConnection.DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection);
+var
+ cmd: IDASQLCommand;
+begin
+ //Params := nil;
+ cmd := NewCommand(aStoredProcedureName, stStoredProcedure);
+ cmd.RefreshParams;
+
+ {if (Params = nil) then} Params := TDAParamCollection.Create(nil);
+ Params.AssignParamCollection(cmd.Params);
+end;
+
+procedure TDAEConnection.DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ ForeignKeys := TDADriverForeignKeyCollection.Create(nil);
+end;
+
+function TDAEConnection.GetName: string;
+begin
+ result := fName;
+end;
+
+procedure TDAEConnection.DoGetViewFields(const aViewName: string;
+ out Fields: TDAFieldCollection);
+begin
+ DoGetTableFields(aViewName, Fields);
+end;
+
+function TDAEConnection.GetQuoteChars: TDAQuoteCharArray;
+begin
+ result[0] := '"';
+ result[1] := '"';
+end;
+
+procedure TDAEConnection.DoGetViewNames(out List: IROStrings);
+begin
+ List := NewROStrings; // Changed from NIL.
+end;
+
+procedure TDAEConnection.DoGetStoredProcedureNames(out List: IROStrings);
+begin
+ List := NewROStrings; // Changed from NIL.
+end;
+
+procedure TDAEConnection.DoGetTableNames(out List: IROStrings);
+begin
+ List := NewROStrings; // Changed from NIL.
+end;
+
+function TDAEConnection.GetInTransaction: boolean;
+begin
+ result := DoGetInTransaction;
+end;
+
+function TDAEConnection.GetPassword: string;
+begin
+ result := fPassword;
+end;
+
+function TDAEConnection.GetUserID: string;
+begin
+ result := fUserID;
+end;
+
+procedure TDAEConnection.SetPassword(const Value: string);
+begin
+ fPassword := Value;
+
+ ApplyConnectionString(GetConnectionString, ConnectionObject); // Refreshes it
+end;
+
+procedure TDAEConnection.SetUserID(const Value: string);
+begin
+ fUserID := Value;
+
+ ApplyConnectionString(GetConnectionString, ConnectionObject); // Refreshes it
+end;
+
+function TDAEConnection.GetLastAutoInc(
+ const GeneratorName: string): integer;
+begin
+ result := DoGetLastAutoIncValue(GeneratorName);
+end;
+
+function TDAEConnection.DoGetLastAutoInc(
+ const GeneratorName: string): integer;
+begin
+ result := -1;
+end;
+
+function TDAEConnection.IdentifierIsQuoted(const iIdentifier: string): boolean;
+var
+ lQuoteChars: TDAQuoteCharArray;
+ lLength:integer;
+begin
+ lQuoteChars := GetQuoteChars();
+ lLength := Length(iIdentifier);
+ result := (lLength > 2) and (
+ ((iIdentifier[1] = lQuoteChars[0]) and (iIdentifier[lLength] = lQuoteChars[1])) or
+ ((iIdentifier[1] = '(') and (iIdentifier[lLength] = ')')));
+end;
+
+function TDAEConnection.IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+var
+ i: integer;
+begin
+ result := false;
+ if IdentifierIsQuoted(iIdentifier) then Exit;
+
+ for i := 1 to Length(iIdentifier) do begin
+ if not CharInSet(iIdentifier[i], ['a'..'z', 'A'..'Z', '0'..'9', '_', '.']) then begin
+ result := true;
+ exit;
+ end;
+ end;
+ if (iIdentifier <> '') then begin
+ i := pos('.',iIdentifier);
+ if (i < Length(iIdentifier)) and CharInSet(iIdentifier[i+1], ['0'..'9']) then Result := True;
+ end;
+end;
+
+function TDAEConnection.QuoteIdentifierIfNeeded(const iIdentifier: string): string;
+begin
+ if IdentifierNeedsQuoting(iIdentifier) then
+ result := QuoteIdentifier(iIdentifier)
+ else
+ result := iIdentifier;
+end;
+
+function TDAEConnection.QuoteIdentifier(const iIdentifier: string): string;
+var
+ lQuoteChars: TDAQuoteCharArray;
+begin
+ lQuoteChars := GetQuoteChars();
+ if (Pos('.', iIdentifier)>0) then
+ result := lQuoteChars[0] + StringReplace(iIdentifier, '.', lQuoteChars[1]+'.'+ lQuoteChars[0], [rfReplaceAll]) + lQuoteChars[1]
+ else
+ result := lQuoteChars[0] + iIdentifier + lQuoteChars[1];
+end;
+
+function TDAEConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+{$WARNINGS OFF}
+ result := TDASQLMacroProcessor.Create;
+{$WARNINGS ON}
+end;
+
+procedure TDAEConnection.ApplyConnectionString(
+ const aConnectionString: string; aConnectionObject: TCustomConnection);
+var
+ i: Integer;
+ lParamName: String;
+ lConnStrParser: TDAConnectionStringParser;
+begin
+ FreeAndNIL(fMacroProcessor);
+
+ lConnStrParser := TDAConnectionStringParser.Create(aConnectionString);
+ try
+ fConnectionString := aConnectionString;
+ DoApplyConnectionString(lConnStrParser, aConnectionObject);
+ //with lConnStrParser do
+ if aConnectionObject <> nil then
+ begin
+ for i := 0 to lConnStrParser.AuxParamsCount - 1 do begin
+ lParamName := lConnStrParser.AuxParamNames[i];
+ if Assigned(GetPropInfo(aConnectionObject, lParamName)) then begin
+ SetConnectionProperties(lParamName, lConnStrParser.AuxParams[lParamName]);
+ end;
+ end;
+ end;
+ finally
+ lConnStrParser.Free;
+ end;
+
+ fMacroProcessor := CreateMacroProcessor;
+end;
+
+procedure TDAEConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection);
+begin
+ if (aConnectionObject <> nil) then aConnectionObject.Close;
+end;
+
+function TDAEConnection.GetOnAfterExecuteCommand: TDAAfterExecuteCommandEvent;
+begin
+ result := fOnAfterExecuteCommand
+end;
+
+function TDAEConnection.GetOnAfterOpenDataset: TDAAfterOpenDatasetEvent;
+begin
+ result := fOnAfterOpenDataset
+end;
+
+function TDAEConnection.GetOnBeforeExecuteCommand: TDABeforeExecuteCommandEvent;
+begin
+ result := fOnBeforeExecuteCommand
+end;
+
+function TDAEConnection.GetOnBeforeOpenDataset: TDABeforeOpenDatasetEvent;
+begin
+ result := fOnBeforeOpenDataset
+end;
+
+function TDAEConnection.GetOnExecuteCommandError: TDAExecuteCommandErrorEvent;
+begin
+ result := fOnExecuteCommandError
+end;
+
+function TDAEConnection.GetOnOpenDatasetError: TDAOpenDatasetErrorEvent;
+begin
+ result := fOnOpenDatasetError
+end;
+
+procedure TDAEConnection.SetOnAfterExecuteCommand(
+ const Value: TDAAfterExecuteCommandEvent);
+begin
+ fOnAfterExecuteCommand := Value;
+end;
+
+procedure TDAEConnection.SetOnAfterOpenDataset(
+ const Value: TDAAfterOpenDatasetEvent);
+begin
+ fOnAfterOpenDataset := Value;
+end;
+
+procedure TDAEConnection.SetOnBeforeExecuteCommand(
+ const Value: TDABeforeExecuteCommandEvent);
+begin
+ fOnBeforeExecuteCommand := Value;
+end;
+
+procedure TDAEConnection.SetOnBeforeOpenDataset(
+ const Value: TDABeforeOpenDatasetEvent);
+begin
+ fOnBeforeOpenDataset := Value;
+end;
+
+procedure TDAEConnection.SetOnExecuteCommandError(
+ const Value: TDAExecuteCommandErrorEvent);
+begin
+ fOnExecuteCommandError := Value;
+end;
+
+procedure TDAEConnection.SetOnOpenDatasetError(
+ const Value: TDAOpenDatasetErrorEvent);
+begin
+ fOnOpenDatasetError := Value;
+end;
+
+procedure TDAEConnection.AssignCommandEventHandlers(
+ const aCommand: IDASQLCommand);
+begin
+ if aCommand=NIL then Exit;
+ aCommand.OnBeforeExecute := fOnBeforeExecuteCommand;
+ aCommand.OnAfterExecute := fOnAfterExecuteCommand;
+ aCommand.OnExecuteError := fOnExecuteCommandError;
+end;
+
+procedure TDAEConnection.AssignDatasetEventHandlers(
+ const aDataset: IDADataset);
+begin
+ if aDataset=NIL then Exit;
+ aDataset.OnBeforeOpen := fOnBeforeOpenDataset;
+ aDataset.OnAfterOpen := fOnAfterOpenDataset;
+ aDataset.OnOpenError := fOnOpenDatasetError;
+end;
+
+procedure TDAEConnection.Test;
+begin
+ Open;
+ Close;
+end;
+
+function TDAEConnection.GetSPSelectSyntax(HasArguments: Boolean): string;
+begin
+ Result := 'EXEC {0} {1}';
+end;
+
+function TDAEConnection.GetMacroProcessor: TDASQLMacroProcessor;
+begin
+ if FUseMacroProcessor then
+ result := fMacroProcessor
+ else
+ Result := nil;
+end;
+
+function TDAEConnection._Release: Integer;
+begin
+ Result := InterlockedDecrement(FRefCount);
+ if (Result = 0) and not (fReleasing) then begin
+ fReleasing := True;
+ InterlockedIncrement(fRefCount);
+ if assigned(fConnectionPool) then
+ fConnectionPool.ReleaseConnection(self);
+ Result := InterlockedDecrement(fRefCount);
+ fReleasing := False;
+ end;
+ if Result = 0 then
+ Destroy;
+end;
+
+function TDAEConnection.GetConnectionPool: IDAConnectionPool;
+begin
+ result := fConnectionPool;
+end;
+
+procedure TDAEConnection.SetConnectionPool(const Value: IDAConnectionPool);
+begin
+ fConnectionPool := Value;
+end;
+
+function TDAEConnection.QuoteFieldName(const aTableName,
+ aFieldName: string): string;
+begin
+ Result:= QuoteIdentifier(aFieldName);
+end;
+
+function TDAEConnection.QuoteFieldNameIfNeeded(const aTableName,
+ aFieldName: string): string;
+begin
+ if IdentifierNeedsQuoting(aFieldName) then
+ result := QuoteFieldName(aTableName,aFieldName)
+ else
+ result := aFieldName;
+end;
+
+function TDAEConnection.isAlive: Boolean;
+begin
+ Result:= (ConnectionObject <> nil) and ConnectionObject.Connected;
+end;
+
+function TDAEConnection.GetConnectionType: string;
+begin
+ Result:= FConnectionType;
+end;
+
+function TDAEConnection.GetQueryBuilder: TDAQueryBuilder;
+begin
+ Result:= TDASQL92QueryBuilder.Create;
+ Result.Connection:=Self;
+end;
+
+function TDAEConnection.GetUseMacroProcessor: Boolean;
+begin
+ Result := FUseMacroProcessor;
+end;
+
+procedure TDAEConnection.SetUseMacroProcessor(Value: Boolean);
+begin
+ FUseMacroProcessor := Value;
+end;
+
+function TDAEConnection.QueryInterface(const IID: TGUID; out Obj): HResult;
+begin
+ Result:= E_NOINTERFACE;
+ if IsEqualGUID(IID, IDAHasMacroProcessor) then begin
+ if not FUseMacroProcessor then Exit;
+ end;
+ Result := inherited QueryInterface(IID, Obj)
+end;
+
+function TDAEConnection.DoGetLastAutoIncValue(
+ const GeneratorName: string): Variant;
+begin
+ // for backward compatibility
+ Result := DoGetLastAutoInc(GeneratorName);
+end;
+
+function TDAEConnection.GetLastAutoIncValue(
+ const GeneratorName: string): variant;
+begin
+ Result := DoGetLastAutoIncValue(GeneratorName);
+end;
+
+{ TDAEDataset }
+
+constructor TDAEDataset.Create(aConnection: TDAEConnection; const aName: string = '');
+begin
+ inherited;
+
+ fLogicalName := aName;
+ if (fLogicalName='')
+ then fLogicalName := NewGuidAsString;
+
+ fChanged := true;
+ fFields := TDAFieldCollection.Create(nil);
+ {$WARN SYMBOL_DEPRECATED OFF}
+ GetWhere.Fields := fFields; // So it can find the mappings!
+ {$WARN SYMBOL_DEPRECATED ON}
+end;
+
+destructor TDAEDataset.Destroy;
+begin
+ FreeAndNil(fFields);
+ inherited;
+end;
+
+function TDAEDataset.GetActive: boolean;
+begin
+ result := DoGetActive
+end;
+
+function TDAEDataset.GetBOF: boolean;
+begin
+ result := DoGetBOF
+end;
+
+function TDAEDataset.GetEOF: boolean;
+begin
+ result := DoGetEOF;
+end;
+
+function TDAEDataset.GetFieldCount: integer;
+begin
+ result := fFields.Count;
+end;
+
+function TDAEDataset.GetRecordCount: integer;
+begin
+ result := DoGetRecordCount;
+end;
+
+function TDAEDataset.Locate(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+begin
+ result := DoLocate(KeyFields, KeyValues, Options);
+end;
+
+procedure TDAEDataset.Next;
+begin
+ DoNext;
+end;
+
+procedure TDAEDataset.Open;
+begin
+ SetActive(TRUE); // Handles the exception there
+end;
+
+procedure TDAEDataset.Close;
+begin
+ SetActive(FALSE); // Handles the exception there
+end;
+
+procedure TDAEDataset.SetActive(Value: boolean);
+begin
+ DoSetActive(Value);
+end;
+
+function TDAEDataset.GetFields: TDAFieldCollection;
+begin
+ result := fFields;
+end;
+
+function TDAEDataset.DoGetActive: boolean;
+begin
+ result := FNativeDatabaseAccess.Active;
+end;
+
+function TDAEDataset.DoGetBOF: boolean;
+begin
+ result := FNativeDatabaseAccess.GetBOF;
+end;
+
+function TDAEDataset.DoGetEOF: boolean;
+begin
+ result := FNativeDatabaseAccess.GetEOF;
+end;
+
+function TDAEDataset.DoGetRecordCount: integer;
+begin
+ result := FNativeDatabaseAccess.GetRecordCount;
+end;
+
+function TDAEDataset.DoLocate(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+begin
+ result := FNativeDatabaseAccess.Locate(KeyFields, KeyValues, Options);
+end;
+
+procedure TDAEDataset.DoNext;
+begin
+ FNativeDatabaseAccess.Next;
+end;
+
+procedure TDAEDataset.DoPrepare(Value: boolean);
+begin
+ FNativeDatabaseAccess.Prepare(Value);
+end;
+
+procedure TDAEDataset.DoSetActive(Value: boolean);
+var
+ i: integer;
+ fld: IDANativeField;
+ startTick: Cardinal;
+ s: string;
+begin
+ if (Value = GetActive) then Exit;
+
+ // Opens the dataset
+ if Value then begin
+ // Combines the custom WHERE statement and modifies the inner SQL
+ if fChanged or (fWhere.Changed) then PrepareSQLStatement;
+
+ if Assigned(fConnection.fMacroProcessor) then begin
+ i := fConnection.fMacroProcessor.IndexOfName('Where');
+ s := GenerateDynamicWhereStatement;
+ if i = -1 then
+ fConnection.fMacroProcessor.AddVariable('Where').Value:=s
+ else
+ fConnection.fMacroProcessor.Variable[i].Value:=s;
+
+ SetDynamicWhereParams;
+ SetSQL(fConnection.fMacroProcessor.Eval(GetSQL));
+ end;
+
+
+ // Writes the parameter values
+ if (fParams.Count > 0) then SetParamValues(fParams) else ClearParams;
+
+ startTick := ROGetTickCount;
+ if Assigned(fOnBeforeOpen) then fOnBeforeOpen(Self);
+ // Opens the dataset
+ fAutoFields := (fFields.Count = 0);
+ try
+ FNativeDatabaseAccess.Active := True;
+ FixKnownIssues;
+ except
+ on E:Exception do begin
+ if Assigned(fOnOpenError) then fOnOpenError(Self, DoGetSQL, E);
+ raise;
+ end;
+ end;
+
+ if Assigned(fOnAfterOpen) then fOnAfterOpen(Self, DoGetSQL, ROGetTickCount-startTick);
+
+ GetParamValues(fParams);
+
+ RemoveDynamicWhereParams;
+
+ if fAutoFields and (fFields.Count = 0)then begin
+ for i := 0 to (FNativeDatabaseAccess.FieldCount - 1) do begin
+ fld := FNativeDatabaseAccess.GetFields(i);
+ with fFields.Add(fld.FieldName, intVCLTypeToDAType(fld.DataType,fld.Size,fld.DecimalPrecision,fld.DecimalScale), fld.Size) do begin
+ if DataType = datDecimal then begin
+ case fld.DataType of
+ ftFMTBcd: begin
+ DecimalPrecision:= fld.DecimalPrecision;
+ DecimalScale:= fld.DecimalScale;
+ end;
+ ftBCD: begin
+ DecimalPrecision:= fld.DecimalPrecision;
+ DecimalScale:= fld.DecimalScale;
+ end;
+ else
+ DataType := datFloat;
+ end;
+ end;
+ // Fix ZEOS issue
+ {$IFDEF DA_WideMemoSupport}
+ if (DataType = datWideString) and (Size = MaxInt div 2) then begin
+ DataType:= datWideMemo;
+ Size := 0;
+ end;
+ {$ENDIF}
+ Bind(fld);
+ end;
+ end;
+ end
+ else
+ fFields.Bind(Self);
+ SetLength(FNativeIndex,fFields.Count);
+ for I := 0 to FFields.Count - 1 do begin
+ if fFields[i].BindedNativeField <> nil then
+ FNativeIndex[i] := fFields[i].BindedNativeField.Index
+ else if fFields[i].BindedField <> nil then
+ FNativeIndex[i] := fFields[i].BindedField.Index
+ else
+ FNativeIndex[i] := -1;
+ end;
+ end
+ else begin
+ if fAutoFields then
+ fFields.Clear
+ else
+ fFields.Unbind;
+
+ FNativeDatabaseAccess.Active := False;
+ SetLength(FNativeIndex,0);
+ end;
+end;
+
+{$IFNDEF FPC}
+type
+ PLargeint = ^Largeint;
+ Largeint = Int64;
+{$ENDIF}
+
+function TDAEDataset.GetFieldValues(Index: integer): Variant;
+{$IFNDEF Drivers_CompatibilityMode}
+var
+ data: pointer;
+ Datasize: Cardinal;
+ s: Ansistring;
+{$ENDIF}
+begin
+ if GetFields[Index].ServerCalculated then begin
+ Result := Null;
+ end
+ else begin
+ Index := FNativeIndex[Index];
+ if Index = -1 then
+ Result:= null
+ else begin
+ {$IFDEF Drivers_CompatibilityMode}
+ Result := fNativeDatabaseAccess.GetNativeFieldValue(Index);
+ {$ELSE}
+ {$IFDEF FPC}
+ Data := nil;
+ Datasize := 0;
+ {$ENDIF}
+ if not fNativeDatabaseAccess.GetNativeFieldData(Index, Data, Datasize) then begin
+ Result:= Null;
+ end
+ else begin
+ case fNativeDatabaseAccess.GetFields(Index).DataType of
+ ftString, {$IFDEF DELPHI10UP}ftOraInterval, {$ENDIF}
+ ftFixedChar,
+ ftGuid: Result := AnsiString(PAnsiChar(Data));
+ ftSmallint: Result := PSmallint(Data)^;
+ ftInteger: Result := PInteger(Data)^;
+ ftWord: Result := PWord(Data)^;
+ ftBoolean: Result := PWordBool(data)^;
+ ftFloat,
+ ftCurrency: Result := PDouble(data)^;
+ ftBcd: Result := PCurrency(data)^;
+ ftDate: Result := PInteger(Data)^;
+ ftTime: Result := PInteger(Data)^;
+ ftDateTime: Result := VarFromDateTime(PDateTime(Data)^);
+ ftBytes,
+ ftVarBytes: Result := POleVariant(Data)^;
+ ftAutoInc: Result := PInteger(Data)^;
+ ftBlob..ftTypedBinary, ftOraBlob, ftOraClob{$IFDEF DELPHI10UP}, ftWideMemo{$ENDIF}: begin
+ SetString(s, PAnsiChar(Data), DataSize);
+ Result := s;
+ end;
+ ftCursor: Result := Null;
+ {$IFDEF DA_FixedWideCharSupport}
+ ftFixedWideChar,
+ {$ENDIF}
+ ftWideString: Result := UnicodeString(PUnicodeChar(Data));
+ ftLargeint: Result := PLargeint(Data)^;
+ // objects types
+ ftADT, ftArray, ftReference, ftDataSet:
+ Result := varNull;
+ ftVariant: Result := PVariant(Data)^;
+ ftInterface: Result := IUnknown(Data^);
+ ftIDispatch: Result := IDispatch(Data^);
+ {$IFNDEF FPC}
+ {$IFDEF DELPHI10UP}ftOraTimeStamp,{$ENDIF}
+ ftTimeStamp: Result := VarFromDateTime(SQLTimeStampToDateTime(PSQLTimeStamp(data)^));
+ {$ENDIF FPC}
+ ftFMTBcd: Result := BCDToVariant(PBcd(Data)^);
+ end;
+ end;
+ {$ENDIF}
+ end;
+ end;
+end;
+
+function TDAEDataset.GetNames(Index: integer): string;
+begin
+ result := FNativeDatabaseAccess.GetFieldName(Index);
+end;
+
+procedure TDAEDataset.DisableControls;
+begin
+ FNativeDatabaseAccess.DisableControls;
+end;
+
+procedure TDAEDataset.EnableControls;
+begin
+ FNativeDatabaseAccess.EnableControls;
+end;
+
+function TDAEDataset.FieldByName(const aName: string): TDAField;
+begin
+ result := fFields.FieldByName(aName) as TDAField;
+end;
+
+procedure TDAEDataset.FreeBookmark(Bookmark: TBookmark);
+begin
+ FNativeDatabaseAccess.FreeBookmark(Bookmark);
+end;
+
+function TDAEDataset.GetBookMark: pointer;
+begin
+ result := FNativeDatabaseAccess.GetBookmark;
+end;
+
+procedure TDAEDataset.GotoBookmark(Bookmark: TBookmark);
+begin
+ FNativeDatabaseAccess.GotoBookmark(Bookmark);
+end;
+
+procedure TDAEDataset.Refresh;
+begin
+
+end;
+
+function TDAEDataset.GetIsEmpty: boolean;
+begin
+ result := FNativeDatabaseAccess.GetIsEmpty;
+end;
+
+function TDAEDataset.GetState: TDatasetState;
+begin
+ result := FNativeDatabaseAccess.GetState;
+end;
+
+function TDAEDataset.Lookup(const KeyFields: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ result := FNativeDatabaseAccess.Lookup(KeyFields, KeyValues, ResultFields);
+end;
+
+function TDAEDataset.GetLogicalName: string;
+begin
+ result := fLogicalName;
+end;
+
+function TDAEDataset.FindField(const aName: string): TDAField;
+begin
+ result := fFields.FindField(aName) as TDAField;
+end;
+
+procedure TDAEDataset.SetLogicalName(aName: string);
+begin
+ fLogicalName := aName
+end;
+
+function TDAEDataset.GetOnAfterOpen: TDAAfterOpenDatasetEvent;
+begin
+ result := fOnAfterOpen
+end;
+
+function TDAEDataset.GetOnBeforeOpen: TDABeforeOpenDatasetEvent;
+begin
+ result := fOnBeforeOpen
+end;
+
+procedure TDAEDataset.SetOnAfterOpen(
+ const Value: TDAAfterOpenDatasetEvent);
+begin
+ fOnAfterOpen := Value
+end;
+
+procedure TDAEDataset.SetOnBeforeOpen(
+ const Value: TDABeforeOpenDatasetEvent);
+begin
+ fOnBeforeOpen := Value
+end;
+
+function TDAEDataset.GetOnOpenError: TDAOpenDatasetErrorEvent;
+begin
+ result := fOnOpenError;
+end;
+
+procedure TDAEDataset.SetOnOpenError(
+ const Value: TDAOpenDatasetErrorEvent);
+begin
+ fOnOpenError := Value;
+end;
+
+function TDAEDataset.GetCurrentRecIdValue: integer;
+begin
+ result := -1;
+end;
+
+procedure TDAEDataset.SetCurrentRecIdValue(Value: integer);
+begin
+
+end;
+
+function TDAEDataset.GetRowRecIdValue: integer;
+begin
+ result := -1
+end;
+
+procedure TDAEDataset.DisableConstraints;
+begin
+ // do nothing
+end;
+
+procedure TDAEDataset.EnableConstraints;
+begin
+ // do nothing
+end;
+
+{
+procedure TDAEDataset.CreateFieldDefs;
+var
+ i: integer;
+ fld: TFieldDef;
+ dafld: TDAField;
+ lNeedtoCreateFieldDefs: Boolean;
+ lFMTBCDPresent: Boolean;
+begin
+ lNeedtoCreateFieldDefs:=fDataset.FieldDefs.Count=0;
+ lFMTBCDPresent:=False;
+ // Adds the data fields (non calculated) to the FieldDefs
+ for i := 0 to (fFields.Count - 1) do begin
+ dafld:=fFields[i];
+ if dafld.Calculated or dafld.Lookup then Continue; // Added as fields later
+ if lNeedtoCreateFieldDefs then begin
+ fld := fDataset.FieldDefs.AddFieldDef;
+ fld.Name := dafld.Name;
+ fld.DataType := DATypeToVCLType(dafld.DataType);
+ end
+ else begin
+ fld := TFieldDef(fDataset.FieldDefs.Find(dafld.Name));
+ end;
+
+ // (autoinc)
+ if (dafld.DataType=datLargeAutoInc) then fld.DataType := ftLargeint
+ else if (dafld.DataType=datAutoInc) then fld.DataType := ftInteger;
+
+ if (fld.DataType = ftString) or (fld.DataType = ftWideString) then fld.Size := dafld.Size;
+ if (fld.DataType = ftGuid) then fld.Size := 38;
+ if (fld.DataType = ftFMTBcd) then begin
+ fld.Size:=dafld.DecimalScale;
+ fld.Precision:=dafld.DecimalPrecision;
+ lFMTBCDPresent:= True;
+ end;
+ end;
+ if not lFMTBCDPresent then fDataset.FieldDefs.Clear;
+ // Creates the data fields
+ for i := 0 to (fDataset.FieldDefs.Count - 1) do
+ fDataset.FieldDefs[i].CreateField(fDataset).DataSet := fDataset;
+end;
+}
+function TDAEDataset.IsNeedToFixFMTBCDIssue: Boolean;
+begin
+ Result:= False;
+end;
+
+procedure TDAEDataset.FixFMTBCDIssue;
+{$IFDEF ftFMTBCD_Support}
+var
+ i: integer;
+ lNeedToFix: Boolean;
+ fld: TFieldDef;
+ dafld: TDAField;
+{$ENDIF}
+begin
+{$IFDEF ftFMTBCD_Support}
+// this only for DBX driver => DatasetCompatible
+ if IsTDatasetCompatible then begin
+ lNeedToFix:= False;
+ for i:=0 to fDataset.FieldCount-1 do
+ if (fDataset.Fields[i].DataType = ftFMTBcd) and
+ (TFMTBCDField(fDataset.Fields[i]).Precision=15) and
+ (TFMTBCDField(fDataset.Fields[i]).Size=4) then begin
+ lNeedToFix:=True;
+ Break;
+ end;
+ if not lNeedToFix then Exit;
+ FNativeDatabaseAccess.Active := False;
+ for i := 0 to (fDataset.FieldDefs.Count - 1) do begin
+ fld := fDataset.FieldDefs[i];
+ if (fld.DataType = ftFMTBcd) then begin
+ dafld:= fFields.FindField(fld.Name);
+ if (fld.Precision = 15 ) and (fld.Size=4) then begin
+ if (dafld <> nil) and (dafld.DataType = datDecimal) then begin
+ fld.Precision := dafld.DecimalPrecision;
+ fld.Size := dafld.DecimalScale;
+ end else begin
+ fld.Precision := 24;
+ fld.Size := 8;
+ end;
+ end;
+ end;
+ end;
+ FNativeDatabaseAccess.Active := True;
+ end;
+{$ENDIF}
+end;
+
+procedure TDAEDataset.FixKnownIssues;
+begin
+ if IsNeedToFixFMTBCDIssue then FixFMTBCDIssue;
+end;
+
+function TDAEDataset.ControlsDisabled: Boolean;
+begin
+ Result := FNativeDatabaseAccess.ControlsDisabled;
+end;
+
+function TDAEDataset.GetNativeFieldData(Index: Integer; var Data: pointer;
+ var DataSize: cardinal): Boolean;
+begin
+ if GetFields[Index].ServerCalculated then begin
+ Result := False;
+ Data := nil;
+ DataSize := 0;
+ end
+ else begin
+ Result := inherited GetNativeFieldData(FNativeIndex[Index], Data, DataSize);
+ end;
+end;
+
+{ TDAESQLCommand }
+
+constructor TDAESQLCommand.Create(aConnection: TDAEConnection; const aName: string = '');
+var
+ id: TGUID;
+begin
+ inherited Create;
+
+ fName := aName;
+ if (fName = '') then begin
+ CreateGUID(id);
+ fName := GUIDToString(id);
+ end;
+
+ fWhere := TDAWhere.Create(nil, FALSE);
+ fDynamicWhere:= nil;// aConnection.GetWhereBuilder;
+ fConnection := aConnection;
+ fconn := aConnection; // increasing Refcount
+ fParams := TDAParamCollection.Create(nil);
+ fDataset := CreateDataset(fConnection);
+ FNativeObject := CreateNativeObject(fConnection);
+ FNativeDatabaseAccess := CreateNativeDatabaseAccess;
+end;
+
+destructor TDAESQLCommand.Destroy;
+begin
+ fconn := nil; // decreasing Refcount
+ FNativeDatabaseAccess:=nil;
+ if FNativeObject <> fDataset then FreeAndNil(FNativeObject) else FNativeObject := nil;
+ FreeAndNil(fDataset);
+ FreeAndNil(fParams);
+ FreeAndNil(fWhere);
+ FreeAndNil(fDynamicWhere);
+ inherited;
+end;
+
+{$WARN SYMBOL_DEPRECATED OFF}
+function TDAESQLCommand.GetWhere: TDAWhere;
+begin
+ result := fWhere;
+end;
+{$WARN SYMBOL_DEPRECATED ON}
+
+function TDAESQLCommand.GetParams: TDAParamCollection;
+begin
+ result := fParams;
+end;
+
+function TDAESQLCommand.ParamByName(const aName: string): TDAParam;
+begin
+ result := fParams.ParamByName(aName)
+end;
+
+procedure TDAESQLCommand.RefreshParams;
+var
+ lParams: TParams;
+ i: integer;
+ par: TDAParam;
+begin
+ //dsparams := GetProviderSupport.PSGetParams;
+
+ lParams := TParams.Create;
+ try
+ Params_ParseSQL(lParams, fSQL, True, fConnection.GetQuoteChars);
+
+ fParams.Clear;
+ for i := 0 to (lParams.Count - 1) do begin
+ if fParams.FindParam(lParams[i].Name) <> nil then Continue;
+ par := fParams.Add;
+ par.Name := lParams[i].Name;
+ par.DataType := intVCLTypeToDAType(lParams[i].DataType,lParams[i].Size);
+ par.ParamType := TDAParamType(lParams[i].ParamType);
+ par.Size := lParams[i].Size;
+ end;
+ finally
+ lParams.Free;
+ end;
+end;
+
+procedure TDAESQLCommand.SetPrepared(Value: boolean);
+begin
+ if (fPrepared <> Value) then begin
+ fPrepared := Value;
+ if fPrepared then PrepareSQLStatement();
+ end;
+end;
+
+function TDAESQLCommand.GetPrepared: boolean;
+begin
+ result := fPrepared;
+end;
+
+procedure TDAESQLCommand.OnWhereChange(Sender: TObject);
+begin
+ Changed := true;
+ PrepareSQLStatement();
+end;
+
+function TDAESQLCommand.Execute: integer;
+var
+ startTick: cardinal;
+begin
+ //result := -1;
+ // Combines the custom WHERE statement and modifies the inner SQL
+ if fChanged then PrepareSQLStatement;
+
+ // Writes the parameter values
+ if (fParams.Count > 0) then SetParamValues(fParams) else ClearParams;
+
+ startTick := ROGetTickCount;
+ if Assigned(fOnBeforeExecute) then fOnBeforeExecute(Self);
+
+ try
+ result := DoExecute;
+ except
+ on E:Exception do begin
+ if Assigned(fOnExecuteError) then fOnExecuteError(Self, DoGetSQL, E);
+ raise;
+ end;
+ end;
+ GetParamValues(fParams);
+
+ if Assigned(fOnAfterExecute)
+ then fOnAfterExecute(Self, DoGetSQL, ROGetTickCount-startTick);
+end;
+
+procedure TDAESQLCommand.PrepareSQLStatement;
+var
+ temp, sql, wheretext: string;
+ orderbypos, wherepos: integer;
+ i: integer;
+ s: string;
+begin
+ // Commented out because done above now
+ //if not fChanged then Exit; // Avoids resetting it or repreparing
+
+ sql := fSQL;
+ try
+ fWhere.Changed := False;
+ if (fWhere.Clause = '') then Exit;
+ temp := UpperCase(sql);
+
+ // TODO: Not exactly the best way to do it. Might conflict with a field name that contains WHERE and might
+ // not work if the user writes "ORDER BY"... We'll fix later with a tokenizer or a real parser of some sort
+ orderbypos := Pos('GROUP BY', temp);
+ if (orderbypos = 0)
+ then orderbypos := Pos('ORDER BY', temp);
+ wherepos := Pos('WHERE', temp);
+
+ if (wherepos > 0) then
+ wheretext := ' AND (' + fWhere.Clause + ') '
+ else
+ wheretext := ' WHERE ' + fWhere.Clause + ' ';
+
+ if (orderbypos > 0) then
+ Insert(wheretext, sql, orderbypos) // Adds it before the Order By
+ else
+ Insert(wheretext, sql, Length(sql) + 1); // Adds it at the end since there's no Order By
+
+ finally
+ // Sets the SQL of the wrapped dataset
+ if Assigned(fConnection.fMacroProcessor) then begin
+
+ i := fConnection.fMacroProcessor.IndexOfName('Where');
+ s := GenerateDynamicWhereStatement;
+ if i = -1 then
+ fConnection.fMacroProcessor.AddVariable('Where').Value:=s
+ else
+ fConnection.fMacroProcessor.Variable[i].Value:=s;
+ SetDynamicWhereParams;
+
+
+ sql := fConnection.fMacroProcessor.Eval(sql);
+ end;
+
+ DoSetSQL(sql);
+ DoPrepare(fPrepared);
+
+ Changed := false;
+ end;
+end;
+
+function TDAESQLCommand.GetSQL: string;
+begin
+ result := fSQL
+end;
+
+procedure TDAESQLCommand.SetSQL(const Value: string);
+begin
+ if Value <> fSQL then begin
+ fSQL := Value;
+ fChanged := true;
+ FNativeDatabaseAccess.ClearFieldDefs;
+ PrepareSQLStatement();
+ end;
+end;
+
+function TDAESQLCommand.GetDataset: TDataset;
+begin
+ result := fDataset;
+end;
+
+function TDAESQLCommand.GetName: string;
+begin
+ result := fName;
+end;
+
+function TDAESQLCommand.GetOnAfterExecute: TDAAfterExecuteCommandEvent;
+begin
+ result := fOnAfterExecute
+end;
+
+function TDAESQLCommand.GetOnBeforeExecute: TDABeforeExecuteCommandEvent;
+begin
+ result := fOnBeforeExecute
+end;
+
+procedure TDAESQLCommand.SetOnAfterExecute(
+ const Value: TDAAfterExecuteCommandEvent);
+begin
+ fOnAfterExecute := Value
+end;
+
+procedure TDAESQLCommand.SetOnBeforeExecute(
+ const Value: TDABeforeExecuteCommandEvent);
+begin
+ fOnBeforeExecute := Value
+end;
+
+function TDAESQLCommand.GetOnExecuteError: TDAExecuteCommandErrorEvent;
+begin
+ result := fOnExecuteError;
+end;
+
+procedure TDAESQLCommand.SetOnExecuteError(
+ const Value: TDAExecuteCommandErrorEvent);
+begin
+ fOnExecuteError := Value;
+end;
+
+function TDAESQLCommand.intVCLTypeToDAType(aFieldType: TFieldType; ASize, ADecimalPrecision, aDecimalScale: integer): TDADataType;
+begin
+ Result := VCLTypeToDAType(aFieldType);
+end;
+
+function TDAESQLCommand.GetDynamicWhere: TDAWhereBuilder;
+begin
+ if fDynamicWhere = nil then fDynamicWhere := Connection.GetWhereBuilder;
+ Result:=fDynamicWhere;
+end;
+
+procedure TDAESQLCommand.SetDynamicWhere(const Value: TDAWhereBuilder);
+begin
+ if Value <> nil then
+ GetDynamicWhere.Xml := Value.Xml
+ else if fDynamicWhere <> nil then
+ FDynamicWhere.Clear;
+end;
+
+function TDAESQLCommand.GenerateDynamicWhereStatement: string;
+begin
+ if (fDynamicWhere <> nil) and not fDynamicWhere.IsEmpty then Result := fDynamicWhere.CreateWhereClause;
+ if Result = '' then Result:= ' (1=1)';
+end;
+
+function TDAESQLCommand.SQLContainsDynamicWhere: boolean;
+var
+ mac: IDAHasMacroProcessor;
+ lmp: TDASQLMacroProcessor;
+begin
+ FIsPresentDynWhereVariable:=False;
+ if Supports(fConnection, IDAHasMacroProcessor, mac) and (mac.GetMacroProcessor <> nil) then begin
+ lmp:=TDASQLMacroProcessor(mac.GetMacroProcessor.NewInstance).Create;
+ With lmp do try
+ OnUnknownIdentifier := UnknownIdentifier;
+ Eval(GetSQL);
+ finally
+ Free;
+ end;
+ end;
+ Result:= FIsPresentDynWhereVariable;
+end;
+
+function TDAESQLCommand.UnknownIdentifier(Sender: TObject; const Name,
+ OrgName: string; var Value: string): Boolean;
+begin
+ if SameText(OrgName,'WHERE') then
+ FIsPresentDynWhereVariable:=True;
+ Value := OrgName;
+ Result := True;
+end;
+
+procedure TDAESQLCommand.SetDynamicWhereParams;
+var
+ i: integer;
+ k: TDAParam;
+begin
+ if fDynamicWhere <> nil then
+ For i:=0 to fDynamicWhere.Params.Count-1 do begin
+ k:=Self.GetParams.FindParam(fDynamicWhere.Params[i].Name);
+ if k = nil then k:= Self.GetParams.Add;
+ k.AssignField(fDynamicWhere.Params[i]);
+ end;
+end;
+
+procedure TDAESQLCommand.RemoveDynamicWhereParams;
+var
+ i: integer;
+ k: TDAParam;
+begin
+ if fDynamicWhere <> nil then
+ For i:=0 to fDynamicWhere.Params.Count-1 do begin
+ k := Self.GetParams.FindParam(fDynamicWhere.Params[i].Name);
+ if k <> nil then Self.GetParams.Delete(k.Index);
+ end;
+end;
+
+procedure TDAESQLCommand.SetParamValuesStd(Params1: TDAParamCollection;
+ Params2: TParams);
+var
+ i: integer;
+ par: TDAParam;
+ outpar: TParam;
+ ft: TFieldType;
+ lParIsEmpty: Boolean;
+begin
+ for i := 0 to (Params1.Count - 1) do begin
+ par := Params1[i];
+ outpar := FindParameter(Params2,par.Name);
+ ft := DATypeToVCLType(par.DataType);
+
+ if ft = ftAutoInc then ft := ftInteger;
+
+ case par.ParamType of
+ daptInput: outpar.ParamType := ptInput;
+ daptOutput: outpar.ParamType := ptOutput;
+ daptInputOutput: outpar.ParamType := ptInputOutput;
+ daptResult: outpar.ParamType := ptResult;
+ end;
+
+ lParIsEmpty := VarIsEmpty(par.Value) or VarIsNull(par.Value);
+
+ if par.DataType = datBlob then begin
+ outpar.DataType := ftBlob;
+ if not (par.ParamType in [daptOutput, daptResult]) then begin
+ if lParIsEmpty then
+ outpar.Value := Null
+ else
+ outpar.Value := VariantToAnsiString(par.Value);
+ end;
+ end
+ else begin
+ if (outpar.DataType <> ft) and (ft <> ftUnknown) then outpar.DataType := ft;
+ if not (par.ParamType in [daptOutput, daptResult]) then outpar.Value := par.Value;
+ end;
+
+ if lParIsEmpty and (par.DataType <> datUnknown) then begin
+ if (outpar.DataType <> ft) and (ft <> ftUnknown) then outpar.DataType := ft;
+ end;
+ end;
+end;
+
+procedure TDAESQLCommand.GetParamValuesStd(Params1: TDAParamCollection;
+ Params2: TParams);
+var
+ i: integer;
+ par1: TDAParam;
+begin
+ for i := 0 to Params1.Count-1 do begin
+ par1 := Params1[i];
+ if Par1.ParamType in [daptOutput, daptInputOutput, daptResult] then
+ Par1.Value := FindParameter(Params2,Par1.Name).Value;
+ end;
+end;
+
+function TDAESQLCommand.FindParameter(const AParams: TParams;
+ const AParamName: string): TParam;
+begin
+ Result := AParams.FindParam(AParamName);
+ if Result = nil then
+ Result := AParams.FindParam('@'+AParamName);
+ if Result = nil then begin
+ if AParams.Owner is TDataSet then
+ DatabaseErrorFmt(SParameterNotFound, [AParamName], TComponent(AParams.Owner))
+ else
+ DatabaseErrorFmt(SParameterNotFound, [AParamName])
+ end;
+end;
+
+procedure TDAESQLCommand.ClearParams;
+begin
+// nothing
+end;
+
+
+function TDAESQLCommand.GetNativeObject: TObject;
+begin
+ Result:= FNativeObject;
+end;
+
+function TDAESQLCommand.CreateNativeObject(
+ aConnection: TDAEConnection): TObject;
+begin
+ Result:= fDataset;
+end;
+
+function TDAESQLCommand.CreateNativeDatabaseAccess: IDANativeDatabaseAccess;
+begin
+ Result := TDANativeDatabaseAccess_Dataset.Create(GetDataset);
+end;
+
+function TDAESQLCommand.NativeFieldCount: Integer;
+begin
+ Result := FNativeDatabaseAccess.FieldCount;
+end;
+
+function TDAESQLCommand.NativeFindField(const FieldName: string): IDANativeField;
+begin
+ Result := FNativeDatabaseAccess.FindField(FieldName);
+end;
+
+function TDAESQLCommand.GetNativeFields(Index: integer): IDANativeField;
+begin
+ Result := FNativeDatabaseAccess.GetFields(Index);
+end;
+
+function TDAESQLCommand.IsTDatasetCompatible: Boolean;
+begin
+ Result :=FNativeDatabaseAccess.IsTDatasetCompatible;
+end;
+
+function TDAESQLCommand.GetNativeFieldData(Index: Integer; var Data: pointer; var DataSize: cardinal):Boolean;
+begin
+ Result := FNativeDatabaseAccess.GetNativeFieldData(Index, Data, DataSize);
+end;
+
+function TDAESQLCommand.CanFreeNativeFieldData: Boolean;
+begin
+ Result := FNativeDatabaseAccess.CanFreeNativeFieldData;
+end;
+
+{ TDAEStoredProcedure }
+
+function TDAEStoredProcedure.CreateNativeDatabaseAccess: IDANativeDatabaseAccess;
+begin
+ Result := nil;
+end;
+
+procedure TDAEStoredProcedure.DoPrepare(Value: boolean);
+begin
+ // Stored procs don't need to be prepared
+end;
+
+procedure TDAEStoredProcedure.PrepareSQLStatement;
+begin
+ // Stored procs don't need to be prepared
+end;
+
+procedure TDAEStoredProcedure.RefreshParams;
+begin
+ raise Exception.Create('RefreshParams must be implemented in descendant.');
+end;
+
+procedure TDAEStoredProcedure.RefreshParamsStd(AParams: TParams);
+var
+ par: TDAParam;
+ i: integer;
+ lname:string;
+begin
+ fParams.Clear;
+ for i := 0 to (AParams.Count - 1) do begin
+ if (AParams[i].DataType = ftInterface) and (AParams[I].ParamType in [ptOutput, ptInputOutput, ptResult]) then Continue;
+ par := fParams.Add;
+ lName :=AParams[i].Name;
+ if Pos('@', lname) = 1 then lName:=copy(lName,2, Length(lName)-1);
+ par.Name := lName;
+ par.DataType := intVCLTypeToDAType(AParams[i].DataType,AParams[i].Size);
+ par.ParamType := TDAParamType(AParams[i].ParamType);
+ par.Size := AParams[i].Size;
+ end;
+end;
+
+procedure TDAEStoredProcedure.SetSQL(const Value: string);
+begin
+ // nothing: it's removing usage of IDANativeDatabaseAccess
+end;
+
+{ TDASQLMacroProcessor }
+
+constructor TDASQLMacroProcessor.Create(const aDateFormat, aDateTimeFormat: string;
+ aDoubleQuoteStrings: boolean;
+ const aStoredProcParamsPrefix: string = '');
+begin
+ Create;
+ fDateFormat := aDateFormat;
+ fDateTimeFormat := aDateTimeFormat;
+ fDoubleQuoteStrings := aDoubleQuoteStrings;
+ fStoredProcParamPrefix := aStoredProcParamsPrefix;
+ RegisterMacros;
+end;
+
+function TDASQLMacroProcessor.FormatDate(Sender: TObject;
+ const Parameters: array of string): string;
+var
+ dte: TDateTime;
+begin
+ dte := StrToDate(StringReplace(Parameters[0], '''', '', [rfReplaceAll]));
+
+ if fDoubleQuoteStrings then
+ result := '"' + SysUtils.FormatDateTime(fDateFormat, dte) + '"'
+ else
+ result := '''' + SysUtils.FormatDateTime(fDateFormat, dte) + '''';
+end;
+
+function TDASQLMacroProcessor.FormatDateTime(Sender: TObject;
+ const Parameters: array of string): string;
+var
+ dte: TDateTime;
+begin
+ dte := StrToDateTime(StringReplace(Parameters[0], '''', '', [rfReplaceAll]));
+
+ if fDoubleQuoteStrings then
+ result := '"' + SysUtils.FormatDateTime(fDateTimeFormat, dte) + '"'
+ else
+ result := '''' + SysUtils.FormatDateTime(fDateTimeFormat, dte) + '''';
+end;
+
+procedure TDASQLMacroProcessor.RegisterMacros;
+begin
+ RegisterProc('Date', Date, 0);
+ RegisterProc('DateTime', DateTime, 0);
+ RegisterProc('AddTime', AddTime, 3);
+ RegisterProc('FormatDateTime', FormatDateTime, 1);
+ RegisterProc('FormatDate', FormatDate, 1);
+ RegisterProc('Length', Length, 1);
+ RegisterProc('LowerCase', LowerCase, 1);
+ RegisterProc('UpperCase', UpperCase, 1);
+ RegisterProc('TrimLeft', TrimLeft, 1);
+ RegisterProc('TrimRight', TrimRight, 1);
+ RegisterProc('Copy', Copy, 3);
+ RegisterProc('NoLockHint', NoLock, 0);
+end;
+
+constructor TDASQLMacroProcessor.Create;
+begin
+ inherited Create;
+ OnUnknownIdentifier := MyUnknownIdentifier;
+end;
+
+function TDASQLMacroProcessor.Date(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Self.DateTime(Sender, Parameters);
+end;
+
+function TDASQLMacroProcessor.MyUnknownIdentifier(Sender: TObject;
+ const Name, OrgName: string; var Value: string): Boolean;
+begin
+ Value := OrgName;
+ Result := True;
+end;
+
+{ TDAConnectionWrapper }
+
+procedure TDAConnectionWrapper.DoConnect;
+begin
+ SetConnected(TRUE);
+end;
+
+procedure TDAConnectionWrapper.DoDisconnect;
+begin
+ SetConnected(FALSE);
+end;
+
+{$IFDEF MSWINDOWS}
+{ TDAEngineBaseObject }
+
+function TDAEngineBaseObject.InterfaceSupportsErrorInfo(const iid: TGUID): HRESULT;
+begin
+ if GetInterfaceEntry(iid) <> nil then
+ Result := S_OK
+ else
+ Result := S_FALSE;
+end;
+
+procedure TDAEngineBaseObject.OnException(const ServerClass, ExceptionClass, ErrorMessage: WideString;
+ ExceptAddr: Integer; const ErrorIID, ProgID: WideString;
+ var Handled: Integer; var Result: HRESULT);
+begin
+
+end;
+
+const
+ DA_ERROR_ID : TGUID = '{E479A438-2640-41D2-9DC6-1560C1D08B79}';
+
+function StringToWidestring(const aString: string): WideString;
+var
+ I: Integer;
+begin
+ SetLength(Result, Length(aString));
+ for i := 1 to Length(aString)-1 do
+ Result[i] := WideChar(aString[I]);
+end;
+
+function DAHandleSafeCallException(aObject:TObject; ExceptObject: TObject; ExceptAddr: Pointer): HResult;
+var
+ lClassName: string;
+ E: TObject;
+ CreateError: ICreateErrorInfo;
+ ErrorInfo: IErrorInfo;
+begin
+ {$IFDEF FPC}
+ if ExceptObject <> nil then Result := E_UNEXPECTED else // remove warnings
+ {$ENDIF}
+ Result := E_UNEXPECTED;
+ E := ExceptObject;
+ if Succeeded(CreateErrorInfo(CreateError)) then begin
+ CreateError.SetGUID(DA_ERROR_ID);
+ lClassName := aObject.ClassName;
+ if MainInstance <> HInstance then
+ lClassname := Format('%s in %s',[lClassName,ExtractFileName({$IFDEF FPC}ParamStr(0){$ELSE}GetModuleName(hInstance){$ENDIF})]);
+ CreateError.SetSource(PWideChar(StringToWidestring(E.ClassName+': '+lClassName)));
+ if E is Exception then begin
+ CreateError.SetDescription(PWideChar(WideString(Exception(E).Message)));
+ CreateError.SetHelpContext(Exception(E).HelpContext);
+ if (E is EOleSysError) and (EOleSysError(E).ErrorCode < 0) then
+ Result := EOleSysError(E).ErrorCode;
+ end;
+ if CreateError.QueryInterface(IErrorInfo, ErrorInfo) = S_OK then
+ SetErrorInfo(0, ErrorInfo);
+ end;
+end;
+
+function TDAEngineBaseObject.SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult;
+begin
+ Result := DAHandleSafeCallException(self, ExceptObject, ExceptAddr);
+end;
+
+procedure DASafeCallError(ErrorCode: Integer; ErrorAddr: Pointer);
+var
+ lExceptionClass: ExceptClass;
+ p: Integer;
+ lSource: WideString;
+ ErrorInfo: IErrorInfo;
+ lDescription: WideString;
+ lGuid: TGUID;
+begin
+ if GetErrorInfo(0, ErrorInfo) = S_OK then begin
+ ErrorInfo.GetDescription(lDescription);
+ ErrorInfo.GetGUID(lGuid);
+ if IsEqualGUID(lGuid,DA_ERROR_ID) then begin
+ ErrorInfo.GetSource(lSource);
+ p := Pos(':', lSource);
+ if p > 0 then begin
+ lExceptionClass := GetExceptionClass(copy(lSource,1,p-1));
+ if Assigned(lExceptionClass) then
+ raise lExceptionClass.Create(lDescription);
+ end;
+ end;
+ raise Exception.Create(lDescription) at ErrorAddr;
+ end
+ else begin
+ raise Exception.Create('A "safecall" error occured, but the source object did not provide the proper error information. Sorry we cannot be more helpful at this time.') at ErrorAddr;
+ end;
+end;
+{$ENDIF MSWINDOWS}
+
+{ TDANativeDatabaseAccess_Dataset }
+
+function TDANativeDatabaseAccess_Dataset.CanFreeNativeFieldData: Boolean;
+begin
+ Result := True;
+end;
+
+procedure TDANativeDatabaseAccess_Dataset.ClearFieldDefs;
+begin
+ FDataset.FieldDefs.Clear;
+end;
+
+function TDANativeDatabaseAccess_Dataset.ControlsDisabled: Boolean;
+begin
+ Result := FDataset.ControlsDisabled;
+end;
+
+constructor TDANativeDatabaseAccess_Dataset.Create(ADataset: TDataSet);
+begin
+ inherited Create;
+ if ADataset = nil then DatabaseError('A dataset must be specified.');
+ FDataset := ADataset;
+ FList := TInterfaceList.Create;
+end;
+
+destructor TDANativeDatabaseAccess_Dataset.Destroy;
+begin
+ FList.Free;
+ inherited;
+end;
+
+procedure TDANativeDatabaseAccess_Dataset.DisableControls;
+begin
+ FDataset.DisableControls;
+end;
+
+procedure TDANativeDatabaseAccess_Dataset.EnableControls;
+begin
+ FDataset.EnableControls;
+end;
+
+function TDANativeDatabaseAccess_Dataset.FieldCount: Integer;
+begin
+ Result := FDataset.FieldCount;
+end;
+
+function TDANativeDatabaseAccess_Dataset.FindField(
+ const FieldName: string): IDANativeField;
+begin
+ Result := FList[FDataset.FindField(FieldName).Index] as IDANativeField;
+end;
+
+procedure TDANativeDatabaseAccess_Dataset.FreeBookmark(
+ Bookmark: TBookmark);
+begin
+ FDataset.FreeBookmark(Bookmark);
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetActive: Boolean;
+begin
+ Result := FDataset.Active;
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetBOF: Boolean;
+begin
+ Result := FDataset.Bof;
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetBookMark: pointer;
+begin
+ Result := FDataset.GetBookmark;
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetEOF: Boolean;
+begin
+ Result := FDataset.Eof;
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetFieldName(
+ Index: Integer): string;
+begin
+ result := fDataset.Fields[Index].FieldName;
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetFields(
+ Index: integer): IDANativeField;
+begin
+ Result := FList[Index] as IDANativeField;
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetIsEmpty: boolean;
+begin
+ result := fDataset.IsEmpty;
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetNativeFieldData(Index: Integer;
+ var Data:Pointer; var DataSize: cardinal): Boolean;
+var
+ str: TStream;
+ fld: TField;
+ {$IFNDEF DELPHI10UP}
+ temp: pointer;
+ {$ENDIF DELPHI10UP}
+begin
+ Data := nil;
+ DataSize := 0;
+ fld:= FDataset.Fields[Index];
+ try
+ if fld.IsBlob then begin
+ Str:= FDataset.CreateBlobStream(fld, bmRead);
+ try
+ DataSize := str.Size;
+ GetMem(Data, DataSize);
+ str.Read(Data^,Datasize);
+ finally
+ Str.Free;
+ end;
+ Result := True;
+ end
+ else if fld.DataType in [ftADT, ftArray, ftReference, ftDataSet] then begin
+ // not supported yet
+ Result := False;
+ end
+ else begin
+ DataSize := fld.DataSize;
+ GetMem(Data, DataSize);
+ {$IFNDEF DELPHI10UP}
+ if fld.DataType = ftWideString then FillChar(Data^,DataSize,0);
+ {$ENDIF DELPHI10UP}
+ Result := FDataset.GetFieldData(fld, Data, False);
+ case fld.DataType of
+ ftString,ftFixedChar: DataSize := StrLen(PAnsiChar(Data));
+ {$IFNDEF DELPHI10UP}
+ ftWideString: begin
+ DataSize := Length(PWideString(Data)^);
+ GetMem(temp, (DataSize+1)*SizeOf(WideChar));
+ Move(PWideChar(Data^)^, PWideChar(temp)^, datasize * SizeOf(WideChar));
+ PWideChar(temp)[datasize] := #0;
+ FreeMem(Data);
+ data := temp;
+ datasize := DataSize*SizeOf(WideChar);
+ end;
+ {$ENDIF DELPHI10UP}
+ end;
+ end;
+ except
+ raise;
+ end;
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetNativeFieldValue(
+ Index: Integer): Variant;
+var
+ fld: TField;
+begin
+ fld := FDataset.Fields[Index];
+ if fld.IsNull then
+ Result := Null
+ else
+ case fld.DataType of
+ ftBcd: Result := fld.AsCurrency;
+ {$IFNDEF FPC}
+ ftFMTBcd: Result := DecimalToString(BCDToDecimal(fld.AsBCD),DecimalSeparator);
+ ftWideString: Result := TWideStringField(fld).Value;
+ {$IFDEF DELPHI10UP}ftOraTimeStamp,{$ENDIF}
+ ftTimeStamp: Result := VarFromDateTime(fld.AsDateTime);
+ {$ENDIF FPC}
+ {$IFDEF DELPHI10UP}
+ ftWideMemo: result := TWideMemoField(fld).Value;
+ {$ENDIF DELPHI10UP}
+ else
+ Result := fld.Value;
+ end;
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetRecordCount: Integer;
+begin
+ Result := FDataset.RecordCount;
+end;
+
+function TDANativeDatabaseAccess_Dataset.GetState: TDatasetState;
+begin
+ Result := FDataset.State;
+end;
+
+procedure TDANativeDatabaseAccess_Dataset.GotoBookmark(
+ Bookmark: TBookmark);
+begin
+ FDataset.GotoBookmark(Bookmark);
+end;
+
+function TDANativeDatabaseAccess_Dataset.IsTDatasetCompatible: Boolean;
+begin
+ Result := True;
+end;
+
+function TDANativeDatabaseAccess_Dataset.Locate(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+begin
+ Result := FDataset.Locate(KeyFields, KeyValues, Options);
+end;
+
+function TDANativeDatabaseAccess_Dataset.Lookup(const KeyFields: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ Result := FDataset.Lookup(KeyFields, KeyValues, ResultFields);
+end;
+
+procedure TDANativeDatabaseAccess_Dataset.Next;
+begin
+ FDataset.Next;
+end;
+
+procedure TDANativeDatabaseAccess_Dataset.Prepare(const AValue: Boolean);
+begin
+ SetPropValue(fDataset, 'Prepared', aValue); // Works with ADO and IBX for now
+end;
+
+procedure TDANativeDatabaseAccess_Dataset.SetActive(const aValue: Boolean);
+var
+ i: integer;
+begin
+ fList.Clear;
+ FDataset.Active := aValue;
+ if FDataset.Active then
+ for i:=0 to FDataset.FieldCount-1 do
+ fList.Add(TDANativeField_Dataset.Create(FDataset.Fields[i]));
+end;
+
+{ TDANativeField_Dataset }
+
+constructor TDANativeField_Dataset.Create(AField: TField);
+begin
+ Inherited Create();
+ FField:= AField;
+end;
+
+function TDANativeField_Dataset.GetDataType: TFieldType;
+begin
+ Result := fField.DataType;
+end;
+
+function TDANativeField_Dataset.GetDecimalPrecision: Integer;
+begin
+{$IFDEF ftFMTBCD_Support}
+ if (fField is TFMTBCDField) then
+ Result := TFMTBCDField(fField).Precision
+ else
+{$ENDIF}
+ if (fField is TBCDField) then
+ Result := TBCDField(fField).Precision
+ else
+ Result := 0;
+end;
+
+function TDANativeField_Dataset.GetDecimalScale: Integer;
+begin
+{$IFDEF ftFMTBCD_Support}
+ if (fField is TFMTBCDField) then
+ Result := TFMTBCDField(fField).Size
+ else
+{$ENDIF FPC}
+ if (fField is TBCDField) then
+ Result := TBCDField(fField).Size
+ else
+ Result := 0;
+end;
+
+function TDANativeField_Dataset.GetFieldIndex: integer;
+begin
+ Result := fField.Index;
+end;
+
+function TDANativeField_Dataset.GetFieldName: string;
+begin
+ Result := fField.FieldName;
+end;
+
+function TDANativeField_Dataset.GetNativeObject: TObject;
+begin
+ Result := FField;
+end;
+
+function TDANativeField_Dataset.GetSize: integer;
+begin
+ Result := fField.Size;
+end;
+
+function TDANativeField_Dataset.GetValue: Variant;
+begin
+ Result:= fField.Value;
+end;
+
+function TDANativeField_Dataset.IsNull: Boolean;
+begin
+ Result := fField.IsNull;
+end;
+
+function TDANativeField_Dataset.isTFieldCompatible: Boolean;
+begin
+ Result := True;
+end;
+
+procedure TDANativeField_Dataset.SetDataType(Value: TFieldType);
+begin
+ if fField is TBlobField then
+ TBlobField(fField).BlobType := Value;
+end;
+
+procedure TDANativeField_Dataset.SetDecimalPrecision(Value: integer);
+begin
+{$IFDEF ftFMTBCD_Support}
+ if (fField is TFMTBCDField) then begin
+ if TFMTBCDField(fField).Precision <> Value then
+ TFMTBCDField(fField).Precision := Value
+ end
+ else
+{$ENDIF FPC}
+ if (fField is TBCDField) then begin
+ if TBCDField(fField).Precision <> Value then
+ TBCDField(fField).Precision := Value;
+ end;
+end;
+
+procedure TDANativeField_Dataset.SetDecimalScale(Value: integer);
+begin
+{$IFDEF ftFMTBCD_Support}
+ if (fField is TFMTBCDField) then begin
+ if TFMTBCDField(fField).Size <> Value then
+ TFMTBCDField(fField).Size := Value
+ end
+ else
+{$ENDIF FPC}
+ if (fField is TBCDField) then begin
+ if TBCDField(fField).Size <> Value then
+ TBCDField(fField).Size := Value;
+ end;
+end;
+
+
+function TestIdentifier(const iIdentifier: string; const ReservedWords: array of string): boolean;
+var
+ L,H,I, r: Integer;
+ lIdent : string;
+begin
+ Result := False;
+ lIdent := UpperCase(iIdentifier);
+ l := 0;
+ h := Length(ReservedWords) -1;
+ while l <= h do begin
+ i := (L + H) shr 1;
+ r := CompareStr(lIdent, ReservedWords[i]);
+ if r < 0 then h := i - 1 else
+ if r > 0 then l := i + 1 else begin
+ Result := true;
+ Exit;
+ end;
+ end;
+end;
+
+{$IFDEF MSWINDOWS}
+initialization
+ SafeCallErrorProc := @DASafeCallError;
+ RegisterExceptionClass(EAbort);
+finalization
+ UnregisterExceptionClass(EAbort);
+ SafeCallErrorProc := nil;
+{$ENDIF}
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAExceptions.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAExceptions.pas
new file mode 100644
index 0000000..2484088
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAExceptions.pas
@@ -0,0 +1,34 @@
+unit uDAExceptions;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ uROClasses;
+
+type
+ EDADatasetNotAccessible = class(EROException);
+
+implementation
+
+uses
+ uROCLient;
+
+initialization
+ RegisterExceptionClass(EDADatasetNotAccessible);
+finalization
+ UnregisterExceptionClass(EDADatasetNotAccessible);
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAExpressionEvaluator.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAExpressionEvaluator.pas
new file mode 100644
index 0000000..33fa8e2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAExpressionEvaluator.pas
@@ -0,0 +1,705 @@
+unit uDAExpressionEvaluator;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+uses
+ {$IFDEF MSWINDOWS} Windows, {$ENDIF}
+ SysUtils, Classes, uDAMacros;
+
+type
+ EDAEvaluationException = class(Exception);
+ TDAExpressionEvaluator = class;
+ TDAEEGetValue = procedure (Sender: TDAExpressionEvaluator; const aIdentifier: string; out aValue: Variant) of object;
+ TDAEEFunctionCall = procedure (Sender: TDAExpressionEvaluator; const aIdentifier: string; const Args: array of Variant; out aValue: Variant) of object;
+ TDAEEFunction = class(TObject)
+ private
+ fName: string;
+ fOnCall: TDAEEFunctionCall;
+ fNameHash: Integer;
+ procedure SetName(const Value: string);
+ public
+ property Name: string read fName write SetName;
+ property NameHash: Integer read fNameHash;
+ property OnCall: TDAEEFunctionCall read fOnCall write fOnCall;
+ end;
+
+ TDAEEFunctionList = class(TObject)
+ private
+ fItems: TList;
+ function GetCount: Integer;
+ function GetItem(i: Integer): TDAEEFunction;
+ public
+ constructor Create;
+ destructor Destroy; override;
+
+ property Count: Integer read GetCount;
+ property Items[I: Integer]: TDAEEFunction read GetItem; default;
+
+ function Add(const aName: string): TDAEEFunction;
+ procedure Delete(I: Integer);
+ procedure Clear;
+ end;
+
+ TDAExpressionEvaluator = class(TObject)
+ private
+ fOnUnknownFunctionCall: TDAEEFunctionCall;
+ fOnGetValue: TDAEEGetValue;
+ fFunctionList: TDAEEFunctionList;
+ fParser: TROPascalParser;
+ FUseTrueFalseinVariableName: boolean;
+ FUseWildcardsInEqual: boolean;
+ FStringCaseInsensitive: Boolean;
+ function EvaluateProcCall(const aIdentifier: string; const Args: Variant): Variant;
+ function EvaluateValue(const aIdentifier: string): Variant;
+
+ function Op_In(const V1, V2: Variant): Variant;
+ function Op_Like(const V1, V2: Variant): Variant;
+ function ParseBooleanExpression: Variant;
+ function ParseComparisonExpression: Variant;
+ function ParseFactor: Variant;
+ function ParseSimpleExpression: Variant;
+ function ParseTerm: Variant;
+ function CompareValues(const V1, V2: Variant): boolean;
+ function IsStringType(const V: Variant): Boolean;
+ public
+ constructor Create;
+ destructor Destroy; override;
+
+ property OnGetValue: TDAEEGetValue read fOnGetValue write fOnGetValue;
+ property OnUnknownFunctionCall: TDAEEFunctionCall read fOnUnknownFunctionCall write fOnUnknownFunctionCall;
+ property FunctionList: TDAEEFunctionList read fFunctionList;
+
+ function Evaluate(const aString: string): Variant;
+ property UseTrueFalseinVariableName: boolean read FUseTrueFalseinVariableName write FUseTrueFalseinVariableName;
+ property UseWildcardsInEqual: boolean read FUseWildcardsInEqual write FUseWildcardsInEqual;
+ property StringCaseInsensitive: Boolean read FStringCaseInsensitive write FStringCaseInsensitive;
+ end;
+
+ TDAStdExpressionEvaluator = class(TDAExpressionEvaluator)
+ private
+ procedure Convert(Sender: TDAExpressionEvaluator; const aIdentifier: string; const Args: array of Variant; out aValue: Variant);
+ procedure Len(Sender: TDAExpressionEvaluator; const aIdentifier: string; const Args: array of Variant; out aValue: Variant);
+ procedure IsNull(Sender: TDAExpressionEvaluator; const aIdentifier: string; const Args: array of Variant; out aValue: Variant);
+ procedure IIF(Sender: TDAExpressionEvaluator; const aIdentifier: string; const Args: array of Variant; out aValue: Variant);
+ procedure Trim(Sender: TDAExpressionEvaluator; const aIdentifier: string; const Args: array of Variant; out aValue: Variant);
+ procedure Substring(Sender: TDAExpressionEvaluator; const aIdentifier: string; const Args: array of Variant; out aValue: Variant);
+ public
+ constructor Create;
+ end;
+implementation
+
+uses Variants, uROClasses;
+
+{ TDAExpressionEvaluator }
+
+constructor TDAExpressionEvaluator.Create;
+begin
+ inherited Create;
+ fFunctionList := TDAEEFunctionList.Create;
+ FUseWildcardsInEqual := False;
+ FUseTrueFalseinVariableName := False;
+ FStringCaseInsensitive := False;
+end;
+
+destructor TDAExpressionEvaluator.Destroy;
+begin
+ fFunctionList.Free;
+ inherited Destroy;
+end;
+
+function TDAExpressionEvaluator.Evaluate(const aString: string): Variant;
+begin
+ fParser := TROPascalParser.Create;
+ fParser.OpenBlockEscape := true;
+ try
+ fParser.SetText(aString);
+ Result := ParseBooleanExpression;
+
+ if fParser.CurrtokenId <> CSTI_EOF then
+ raise EDAEvaluationException.Create('End of expression expected');
+ finally
+ fParser.Free;
+ end;
+end;
+
+function TDAExpressionEvaluator.EvaluateProcCall(const aIdentifier: string;
+ const Args: Variant): Variant;
+var
+ s: string;
+ h, i: Integer;
+ lFunction: TDAEEFunction;
+ lRealArgs: array of Variant;
+begin
+ if not VarIsArray(Args) then begin
+ SetLength(lRealArgs, 1);
+ lRealArgs[0] := args;
+ end else begin
+ SetLength(lRealArgs, VarArrayHighBound(Args, 1)+1);
+ for i := 0 to Length(lRealArgs) -1 do begin
+ lRealArgs[i] := Args[i];
+ end;
+ end;
+ s := FastUppercase(aIdentifier);
+ h := MakeHash(s);
+ for i := 0 to fFunctionList.Count -1 do begin
+ lFunction := fFunctionList[i];
+ if (lFunction.NameHash = h) and (lFunction.Name = s) and (assigned(lFunction.OnCall)) then begin
+ lFunction.OnCall(self, aIdentifier, lRealArgs, Result);
+ exit;
+ end;
+ end;
+ if assigned(fOnUnknownFunctionCall) then
+ fOnUnknownFunctionCall(Self, aIdentifier, Args, Result)
+ else
+ raise EDAEvaluationException('Unknown function: '+aIdentifier);
+end;
+
+function TDAExpressionEvaluator.EvaluateValue(const aIdentifier: string): Variant;
+begin
+ if FUseTrueFalseinVariableName then begin
+ if assigned(fOnGetValue) then
+ fOnGetValue(Self, aIdentifier, Result)
+ else
+ raise EDAEvaluationException('Unknown identifier: '+aIdentifier);
+ end
+ else begin
+ if SameText(aIdentifier,'TRUE') then
+ Result:= True
+ else if SameText(aIdentifier,'FALSE') then
+ Result:= False
+ else if assigned(fOnGetValue) then
+ fOnGetValue(Self, aIdentifier, Result)
+ else
+ raise EDAEvaluationException('Unknown identifier: '+aIdentifier);
+ end;
+end;
+
+function TDAExpressionEvaluator.ParseComparisonExpression: Variant;
+
+ function _IsEqual(v1, v2: variant): boolean;
+ var
+ p1, p2: boolean;
+ w1,w2: UnicodeString;
+ begin
+ if FUseWildcardsInEqual and IsStringType(V1) and IsStringType(V2) then begin
+ {$IFDEF UNICODE}
+ w1 := VarToStr(V1);
+ {$ELSE}
+ w1 := VarToWideStr(V1);
+ {$ENDIF}
+ p1 := (Length(w1) > 1) and (pos('*', w1) > 0);
+ {$IFDEF UNICODE}
+ w2 := VarToStr(V2);
+ {$ELSE}
+ w2 := VarToWideStr(V2);
+ {$ENDIF}
+ p2 := (Length(w2) > 1) and (pos('*', w2) > 0);
+ if (p1 and not p2) then
+ Result := Op_Like(v2, v1)
+ else if (p2 and not p1) then
+ Result := Op_Like(v1, v2)
+ else
+ Result := CompareValues(v1, v2);
+ end
+ else
+ Result := CompareValues(v1, v2);
+ end;
+
+var
+ V1, V2: Variant;
+ lTok: TROPasToken;
+begin
+ V1 := ParseSimpleExpression;
+ lTok := fParser.CurrTokenId;
+ while (lTok = CSTII_In) or
+ (lTok = CSTII_Like) or
+ (lTok = CSTI_Greater ) or
+ (lTok = CSTI_GreaterEqual) or
+ (lTok = CSTI_Smaller ) or
+ (lTok = CSTI_SmallerEqual) or
+ (lTok = CSTI_Equal) or
+ (lTok = CSTI_NotEqual) or
+ (lTok = CSTII_IsNull) or
+ (lTok = CSTII_IsNotNull) do
+ begin
+ FParser.Next;
+ if (lTok = CSTII_IsNull) or (lTok = CSTII_IsNotNull) then begin
+ case lTok of
+ CSTII_IsNull: v1 := VarIsNull(v1);
+ CSTII_IsNotNull: v1 := not VarIsNull(v1);
+ end;
+ end
+ else begin
+ V2 := ParseSimpleExpression;
+
+ case lTok of
+ CSTII_In: V1 := Op_In(v1, v2);
+ CSTII_Like: V1 := Op_Like(v1, v2);
+ CSTI_Greater: v1 := v1 > v2;
+ CSTI_GreaterEqual: v1 := (v1 > v2) or CompareValues(v1, v2);
+ CSTI_Smaller: v1 := v1 < v2;
+ CSTI_SmallerEqual: v1 := (v1 < v2) or CompareValues(v1, v2);
+ CSTI_Equal: v1:= _isEqual(v1, v2);
+ //CSTI_notEqual:
+ else
+ v1:= not _isEqual(v1, v2);
+ end;
+ end;
+ lTok := fParser.CurrTokenId;
+ end;
+ Result := V1;
+end;
+
+function TDAExpressionEvaluator.ParseSimpleExpression: Variant;
+var
+ V1, V2: Variant;
+ lTok: TROPasToken;
+begin
+ V1 := ParseTerm;
+ lTok := fParser.CurrTokenId;
+ while (lTok = CSTI_Plus) or
+ (lTok = CSTI_Minus) do
+ begin
+ FParser.Next;
+ V2 := ParseTerm;
+
+ case lTok of
+ CSTI_Minus: V1 := V1 - V2;
+ else v1 := v1 + v2; // CSTI_plus
+ end;
+ lTok := fParser.CurrTokenId;
+ end;
+ Result := V1;
+end;
+
+function ParseDate(s: string): TDateTime;
+begin
+ s := copy(S,2,Length(s)-2);
+ if length(s) = 10 then begin
+ if (s[3] <> '/') or (s[6] <> '/') then raise EDAEvaluationException.Create('Invalid date format');
+ Result := EncodeDate(StrToInt(copy(s, 7, 4)), StrToInt(copy(S, 1, 2)), StrToInt(copy(s, 4, 2)));
+ end else
+ raise EDAEvaluationException.Create('Invalid date format');
+end;
+
+function TDAExpressionEvaluator.ParseFactor: Variant;
+var
+ tmp: TList;
+ pv: PVariant;
+ i: Integer;
+ e: Extended;
+ s: string;
+begin
+ case fParser.CurrTokenId of
+ CSTII_Not: begin
+ FParser.Next;
+ Result := not ParseFactor;
+ end;
+ CSTI_Plus: begin
+ FParser.Next;
+ Result := + ParseFactor;
+ end;
+ CSTI_Minus: begin
+ FParser.Next;
+ Result := - ParseFactor;
+ end;
+ CSTI_OpenRound: begin
+ FParser.Next;
+ Result := ParseBooleanExpression;
+ if fParser.CurrTokenId = CSTI_Comma then begin
+ tmp := TList.Create;
+ New(pv);
+ pv^ := Result;
+ tmp.Add(pv);
+ while FPArser.CurrTokenId = CSTI_Comma do begin
+ FParser.Next;
+ try
+ result := ParseBooleanExpression;
+ New(pv);
+ pv^ := Result;
+ tmp.Add(pv);
+ except
+ for i := 0 to tmp.Count -1 do begin
+ pv := tmp[i];
+ dispose(pv);
+ end;
+ tmp.Free;
+ raise;
+ end;
+ end;
+ Result := VarArrayCreate([0, tmp.Count -1], varVariant);
+ for i := 0 to tmp.Count -1 do begin
+ pv := tmp[i];
+ Result[i] := pv^;
+ dispose(pv);
+ end;
+ tmp.Free;
+ end;
+ if fParser.CurrTokenId <> CSTI_CloseRound then
+ raise EDAEvaluationException.Create('Closing parenthesis expected');
+ FParser.Next;
+ end;
+ CSTI_HexInt, CSTI_Integer: begin
+ Result := StrToInt64(FParser.OriginalToken);
+ FParser.Next;
+ end;
+ CSTI_Real: begin
+ Val(FParser.OriginalToken, e, i); Result := e;
+ FParser.Next;
+ end;
+ CSTI_String: begin
+ Result := StringReplace(FParser.OriginalToken, #39#39, #39, [rfReplaceAll]);
+ Result := Copy(Result, 2, Length(Result) -2);
+ Fparser.Next;
+ end;
+ CSTI_Date: begin
+ Result := ParseDate(FParser.OriginalToken);
+ FParser.Next;
+ end;
+ CSTI_Identifier: begin
+ s := FPArser.OriginalToken;
+ FParser.Next;
+ if FParser.CurrTokenID = CSTI_OpenRound then
+ Result := EvaluateProcCall(s, ParseFactor)
+ else
+ Result := EvaluateValue(s)
+ end;
+ else
+ raise EDAEvaluationException.Create('Syntax error');
+ end;
+end;
+
+function TDAExpressionEvaluator.ParseBooleanExpression: Variant;
+var
+ V1, V2: Variant;
+ lTok: TROPasToken;
+begin
+ V1 := ParseComparisonExpression;
+ lTok := fParser.CurrTokenId;
+ while (lTok = CSTII_and) or
+ (lTok = CSTII_or) or
+ (lTok = CSTII_xor) do
+ begin
+ FParser.Next;
+ V2 := ParseComparisonExpression;
+
+ case lTok of
+ CSTII_or: V1 := V1 or V2;
+ CSTII_xor: V1 := V1 xor V2;
+ else v1 := v1 and v2; // CSTII_and
+ end;
+ lTok := fParser.CurrTokenId;
+ end;
+ Result := V1;
+end;
+
+function TDAExpressionEvaluator.ParseTerm: Variant;
+var
+ V1, V2: Variant;
+ lTok: TROPasToken;
+begin
+ V1 := ParseFactor;
+ lTok := fParser.CurrTokenId;
+ while (lTok = CSTI_multiply) or
+ (lTok = CSTI_divide) or
+ (lTok = CSTI_Modulus) do
+ begin
+ FParser.Next;
+ V2 := ParseFactor;
+
+ case lTok of
+ CSTI_Multiply: V1 := V1 * V2;
+ CSTI_Divide: V1 := V1 / V2;
+ else v1 := v1 mod v2; // CSTI_modulus
+ end;
+ lTok := fParser.CurrTokenId;
+ end;
+ Result := V1;
+end;
+
+function TDAExpressionEvaluator.Op_In(const V1, V2: Variant): Variant;
+var
+ i: Integer;
+begin
+ if VarIsArray(V2) then begin
+ for i := VarArrayLowBound(V2, 1) to VarArrayHighBound(V2, 1) do begin
+ if CompareValues(v2[i], v1) then begin
+ Result := true;
+ exit;
+ end;
+ end;
+ Result := False;
+ end
+ else
+ Result := CompareValues(v1, v2);
+// raise EDAEvaluationException.Create('Array expected for IN expression');
+end;
+
+function WidePos(const iSubString, iString:UnicodeString): Integer; overload;
+var i,j:integer;
+ LenS,LenS1:integer;
+ b: Boolean;
+begin
+ LenS1 := Length(iSubString);
+ LenS := Length(iString);
+
+ i := 1;
+ while i <= LenS-LenS1+1 do begin
+
+ { IsCandidate }
+ b := true;
+ for j := 1 to LenS1 do begin
+ if iString[i+j-1] <> iSubString[j] then begin
+ b := false;
+ break;
+ end;
+ end;
+
+ if b then begin
+ result := i;
+ exit;
+ end;
+
+ inc(i);
+ end;
+ result := 0;
+end;
+
+function TDAExpressionEvaluator.Op_Like(const V1, V2: Variant): Variant;
+var
+ w1, w2: UnicodeString;
+begin
+ {$IFDEF Unicode}
+ w1 := AnsiUppercase(VarToStr(V1));
+ W2 := AnsiUppercase(VarToStr(V2));
+ {$ELSE}
+ w1 := WideUppercase(VarToWideStr(V1));
+ W2 := WideUppercase(VarToWideStr(V2));
+ {$ENDIF}
+ if Length(W2) = 0 then begin Result := False; exit; end;
+
+ if (Length(W2) > 0) and ((W2[1] = '%') or (W2[1] = '*')) then begin
+ if ((W2[Length(W2)] = '%') or (W2[Length(W2)] = '*')) then begin
+ W2 := Copy(W2, 2, Length(W2) -2);
+ Result := WidePos(W2, W1) > 0;
+ end else begin
+ W2 := Copy(W2, 2, Length(W2) -1);
+ Result := Copy(W1, LEngth(W1) - Length(W2)+1, Length(W2)) = W2;
+ end;
+ end else if (Length(W2)> 0) and ((W2[Length(W2)] = '%') or (W2[Length(W2)] = '*')) then begin
+ W2 := copy(W2, 1, Length(W2)-1);
+ result := Copy(W1, 1, Length(W2)) = W2;
+ end else
+ result := w1 = w2;
+end;
+
+function TDAExpressionEvaluator.CompareValues(const V1,
+ V2: Variant): boolean;
+begin
+ if IsStringType(V1) and IsStringType(V2) then begin
+ if (VarType(V1) = VarType(V2)) and (VarType(V2) <> varOleStr) then begin
+ if FStringCaseInsensitive then
+ Result := AnsiSameText(VarToStr(V1), VarToStr(V2))
+ else
+ Result := AnsiSameStr(VarToStr(V1), VarToStr(V2));
+ end
+ else begin
+ Result := ROWideCompare(VarToWideStr(V1), VarToWideStr(V2), FStringCaseInsensitive) = 0;
+ end;
+ end
+ else begin
+ Result := ROVariantsEqual(V1, V2);
+ end;
+end;
+
+function TDAExpressionEvaluator.IsStringType(const V: Variant): Boolean;
+begin
+ case VarType(V) of
+ varOleStr, varUString, varStrArg, varString: Result:=True;
+ else
+ Result := False;
+ end;
+end;
+
+{ TDAEEFunction }
+
+procedure TDAEEFunction.SetName(const Value: string);
+begin
+ fName := FastUppercase(Value);
+ fNameHash := MakeHash(fName);
+end;
+
+{ TDAEEFunctionList }
+
+function TDAEEFunctionList.Add(const aName: string): TDAEEFunction;
+begin
+ result := TDAEEFunction.Create;
+ Result.Name := aName;
+ fItems.Add(Result);
+end;
+
+procedure TDAEEFunctionList.Clear;
+var
+ i: Integer;
+begin
+ for i := fItems.Count -1 downto 0 do begin
+ TDAEEFunction(fItems[i]).Free;
+ end;
+ fItems.Clear;
+end;
+
+constructor TDAEEFunctionList.Create;
+begin
+ inherited Create;
+ fItems := TList.Create;
+end;
+
+procedure TDAEEFunctionList.Delete(I: Integer);
+begin
+ TDAEEFunction(fItems[i]).Free;
+ fItems.Delete(i);
+end;
+
+destructor TDAEEFunctionList.Destroy;
+begin
+ Clear;
+ fItems.Free;
+ inherited Destroy;
+end;
+
+function TDAEEFunctionList.GetCount: Integer;
+begin
+ result := fItems.Count;
+end;
+
+function TDAEEFunctionList.GetItem(i: Integer): TDAEEFunction;
+begin
+ result := TDAEEFunction(fItems[i]);
+end;
+
+{ TDAStdExpressionEvaluator }
+
+procedure TDAStdExpressionEvaluator.Convert(Sender: TDAExpressionEvaluator;
+ const aIdentifier: string; const Args: array of Variant;
+ out aValue: Variant);
+var
+ aType: TVarType;
+ s: string;
+begin
+ if Length(Args) <> 2 then raise EDAEvaluationException.Create('2 arguments expected for "Convert"');
+ s := FastUppercase(args[1]);
+ if (s = 'SYSTEM.BYTE') or (s = 'BYTE') then aType := varByte else
+ if (s = 'SYSTEM.SBYTE') or (s = 'SBYTE') then aType := varShortInt else
+ if (s = 'SYSTEM.INT16') or (s = 'INT16') then aType := varSmallint else
+ if (s = 'SYSTEM.UINT16') or (s = 'UINT16') then aType := varWord else
+ if (s = 'SYSTEM.INT32') or (s = 'INT32') then aType := varInteger else
+ if (s = 'SYSTEM.UINT32') or (s = 'UINT32') then aType := varLongWord else
+ if (s = 'SYSTEM.INT64') or (s = 'INT64') then aType := varInt64 else
+ if (s = 'SYSTEM.UINT64') or (s = 'UINT64') then aType := VarInt64 else
+ if (s = 'SYSTEM.STRING') or (s = 'STRING') then aType := varOleStr else
+ if (s = 'SYSTEM.SINGLE') or (s = 'SINGLE') then aType := varSIngle else
+ if (s = 'SYSTEM.DOUBLE') or (s = 'DOUBLE') then aType := varDouble else
+ if (s = 'SYSTEM.CHAR') or (s = 'CHAR') then aType := varOleStr else
+ if (s = 'SYSTEM.DATETIME') or (s = 'DATETIME') then aType := varDate else
+ raise EDAEvaluationException.Create('Unknown type used for conversion: "'+args[1]+'"');
+ VarCast(aValue, Args[0], aType);
+end;
+
+constructor TDAStdExpressionEvaluator.Create;
+begin
+ inherited Create;
+ FunctionList.Add('Convert').OnCall := Convert;
+ FunctionList.Add('Len').OnCall := Len;
+ FunctionList.Add('IsNull').OnCall := IsNull;
+ FunctionList.Add('IIF').OnCall := IIF;
+ FunctionList.Add('Trim').OnCall := Trim;
+ FunctionList.Add('SubString').OnCall := SubString;
+end;
+
+procedure TDAStdExpressionEvaluator.IIF(Sender: TDAExpressionEvaluator;
+ const aIdentifier: string; const Args: array of Variant;
+ out aValue: Variant);
+begin
+ if Length(Args) <> 3 then raise EDAEvaluationException.Create('3 arguments expected for "IIF"');
+ if Args[0] then
+ aValue := Args[1]
+ else
+ aValue := Args[2];
+end;
+
+procedure TDAStdExpressionEvaluator.IsNull(Sender: TDAExpressionEvaluator;
+ const aIdentifier: string; const Args: array of Variant;
+ out aValue: Variant);
+begin
+ if Length(Args) <> 2 then raise EDAEvaluationException.Create('2 arguments expected for "IsNull"');
+ if VarIsError(Args[0]) or VarIsNull(Args[0]) then
+ aValue := Args[1]
+ else
+ aValue := Args[0];
+end;
+
+procedure TDAStdExpressionEvaluator.Len(Sender: TDAExpressionEvaluator;
+ const aIdentifier: string; const Args: array of Variant;
+ out aValue: Variant);
+begin
+ if Length(Args) <> 1 then raise EDAEvaluationException.Create('1 argument expected for "Len"');
+ aValue := Length(UnicodeString(Args[0]));
+end;
+
+procedure TDAStdExpressionEvaluator.Substring(
+ Sender: TDAExpressionEvaluator; const aIdentifier: string;
+ const Args: array of Variant; out aValue: Variant);
+var
+ w: UnicodeString;
+ s: string;
+begin
+ if Length(Args) <> 3 then raise EDAEvaluationException.Create('3 arguments expected for "Substring"');
+ if VarType(Args[0]) = varOleStr then begin
+ w := Args[0];
+ aValue := Copy(w, Integer(args[1])-1, Integer(Args[2])); // zero based
+ end else begin
+ s := Args[0];
+ aValue := Copy(s, Integer(args[1])-1, Integer(Args[2])); // zero based
+ end;
+end;
+
+procedure TDAStdExpressionEvaluator.Trim(Sender: TDAExpressionEvaluator;
+ const aIdentifier: string; const Args: array of Variant;
+ out aValue: Variant);
+var
+ w: UnicodeString;
+ s: string;
+begin
+ if Length(Args) <> 1 then raise EDAEvaluationException.Create('1 argument expected for "Trim"');
+ if VarType(Args[0]) = varOleStr then begin
+ w := Args[0];
+ while (length(w) > 0) and ((w[1] = #13) or (w[1] = #10) or (w[1] = #9) or (w[1] = #32)) do
+ Delete(w, 1, 1);
+ while (length(w) > 0) and ((w[Length(w)] = #13) or (w[Length(w)] = #10) or (w[Length(w)] = #9) or (w[Length(w)] = #32)) do
+ Delete(w, Length(w), 1);
+ aValue := w;
+ end else begin
+ s := Args[0];
+ while (length(s) > 0) and ((s[1] = #13) or (s[1] = #10) or (s[1] = #9) or (s[1] = #32)) do
+ Delete(s, 1, 1);
+ while (length(s) > 0) and ((s[Length(s)] = #13) or (s[Length(s)] = #10) or (s[Length(s)] = #9) or (s[Length(s)] = #32)) do
+ Delete(s, Length(s), 1);
+ aValue := s;
+ end;
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAHETConnections.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAHETConnections.pas
new file mode 100644
index 0000000..3d16f32
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAHETConnections.pas
@@ -0,0 +1,69 @@
+unit uDAHETConnections;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - 'Rosetta' Library - HIGHLY CONFIDENTIAL
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, SysUtils,
+ uDAInterfaces;
+
+type
+ TDAHETConnection = class(TDAConnection)
+ private
+ fObjectMappings: TStrings;
+ procedure SetObjectMappings(const Value: TStrings);
+ protected
+ function GetConnectionString: string; override;
+ procedure SetConnectionString(const aValue: string); override;
+ public
+ constructor Create(aCollection: TCollection); override;
+ destructor Destroy; override;
+ published
+ property ObjectMappings: TStrings read fObjectMappings write SetObjectMappings;
+ end;
+
+implementation
+
+{ TDAHETConnection }
+
+constructor TDAHETConnection.Create(aCollection: TCollection);
+begin
+ inherited Create (aCollection);
+ fObjectMappings := TStringList.Create();
+end;
+
+destructor TDAHETConnection.Destroy;
+begin
+ FreeAndNil(fObjectMappings);
+ inherited;
+end;
+
+function TDAHETConnection.GetConnectionString: string;
+begin
+ result := 'HET?';
+end;
+
+procedure TDAHETConnection.SetConnectionString(const aValue: string);
+begin
+ { no-op }
+end;
+
+procedure TDAHETConnection.SetObjectMappings(const Value: TStrings);
+begin
+ fObjectMappings.Assign(Value);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAHETDriver.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAHETDriver.pas
new file mode 100644
index 0000000..666c68f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAHETDriver.pas
@@ -0,0 +1,232 @@
+unit uDAHETDriver;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - 'Rosetta' Library - HIGHLY CONFIDENTIAL
+{
+{ compiler: Delphi 6 and up
+{ platform: Win32
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of the Data Abstract
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+// {$R DataAbstract_Rosetta_Glyphs.res}
+
+uses
+ Classes, SysUtils,
+ uDAInterfaces, uDAClasses, uDAEngine, uDARes, uDADriverManager,
+ uDAHETConnections, DB;
+
+type
+ TDAHETDriver = class(TDADriverReference)
+ end;
+
+ TDAEHETDriver = class(TDAEDriver)
+ protected
+ function GetConnectionClass: TDAEConnectionClass; override;
+
+ function GetDriverID: string; override;
+ function GetDescription: string; override;
+ public
+ end;
+
+ TDAEHETConnection = class(TDAEConnection, IDAHETConnection)
+ private
+ fInTransaction: boolean;
+ fActiveConnections: TStringList;
+ function GetConnectionByName(const aConnectionName: string; aOpenConnection: boolean = false): IDAConnection;
+ protected
+ function DoBeginTransaction: Integer; override;
+ procedure DoCommitTransaction; override;
+ procedure DoRollbackTransaction; override;
+ function DoGetInTransaction: Boolean; override;
+
+ function CreateCustomConnection: TCustomConnection; override;
+ function GetConnected: Boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ constructor Create(aDriver: TDAEDriver; aName: string = ''); override;
+ destructor Destroy; override;
+
+ { IDAHETConnection }
+ function GetConnectionForObject(const aObjectName: string; aOpenConnection: boolean = false): IDAConnection;
+
+ end;
+
+ TDAHETConnectionContainer = class
+ private
+ fConnection: IDAConnection;
+ constructor Create(aConnection: IDAConnection);
+ end;
+
+procedure Register;
+function GetDriverObject: IDADriver; stdcall;
+
+implementation
+
+{ TDAEHETDriver }
+
+function TDAEHETDriver.GetConnectionClass: TDAEConnectionClass;
+begin
+ result := TDAEHETConnection;
+end;
+
+function TDAEHETDriver.GetDescription: string;
+begin
+ result := 'Connection for Heterogenous Queries across multiple databases';
+end;
+
+function TDAEHETDriver.GetDriverID: string;
+begin
+ result := 'HET';
+end;
+
+{ TDAEHETConnection }
+
+constructor TDAEHETConnection.Create(aDriver: TDAEDriver; aName: string = '');
+begin
+ inherited;
+ fActiveConnections := TStringList.Create();
+ fActiveConnections.Sorted := true;
+ fActiveConnections.Duplicates := dupError;
+end;
+
+function TDAEHETConnection.CreateCustomConnection: TCustomConnection;
+begin
+ result := nil;
+end;
+
+destructor TDAEHETConnection.Destroy;
+var
+ i: Integer;
+begin
+ for i := 0 to fActiveConnections.Count-1 do
+ fActiveConnections.Objects[i].Free();
+ FreeAndNil(fActiveConnections);
+
+ //ToDo: auto-transacton handling?
+
+ inherited;
+end;
+
+function TDAEHETConnection.DoBeginTransaction: Integer;
+var
+ i: Integer;
+begin
+ if fInTransaction then
+ raise Exception.Create('Already in a transaction');
+
+ for i := 0 to fActiveConnections.Count-1 do
+ (fActiveConnections.Objects[i] as TDAHETConnectionContainer).fConnection.BeginTransaction();
+
+ fInTransaction := true;
+ result := 0;
+end;
+
+procedure TDAEHETConnection.DoCommitTransaction;
+var
+ i: Integer;
+begin
+ inherited;
+
+ try
+ for i := 0 to fActiveConnections.Count-1 do
+ (fActiveConnections.Objects[i] as TDAHETConnectionContainer).fConnection.CommitTransaction();
+ except
+ // ToDo: we need to use a two-phase commit here, to properly handle any single commit failing
+ // to roll back ALL transactons (inclusing those already (tentatively) comitted.
+ DoRollbackTransaction();
+ raise;
+ end;
+
+ fInTransaction := false;
+end;
+
+procedure TDAEHETConnection.DoRollbackTransaction;
+var
+ i: Integer;
+begin
+ inherited;
+
+ for i := 0 to fActiveConnections.Count-1 do
+ (fActiveConnections.Objects[i] as TDAHETConnectionContainer).fConnection.RollbackTransaction();
+
+ fInTransaction := false;
+end;
+
+function TDAEHETConnection.DoGetInTransaction: Boolean;
+begin
+ result := fInTransaction;
+end;
+
+function TDAEHETConnection.GetConnected: Boolean;
+begin
+ result := true;
+end;
+
+function TDAEHETConnection.GetConnectionForObject(const aObjectName: string; aOpenConnection: boolean = false): IDAConnection;
+var
+ lConnectionName: string;
+begin
+ lConnectionName := (ConnectionDefinition as TDAHETConnection).ObjectMappings.Values[aObjectName];
+ if lConnectionName = '' then
+ raise Exception.CreateFmt('HET Connection "%s" does not contain an object mapping for "%s".', [ConnectionName, aObjectName]);
+ result := GetConnectionByName(lConnectionName);
+end;
+
+function TDAEHETConnection.GetConnectionByName(const aConnectionName: string; aOpenConnection: boolean = false): IDAConnection;
+var
+ i: Integer;
+begin
+ if aConnectionName = self.ConnectionName then
+ raise Exception.CreateFmt('Cannot use HET Connection "%s" nested within itself.', [ConnectionName]);
+
+ i := fActiveConnections.IndexOf(aConnectionName);
+ if i >= 0 then begin
+ result := (fActiveConnections.Objects[i] as TDAHETConnectionContainer).fConnection
+ end
+ else begin
+ result := ConnectionManager.NewConnection(aConnectionName, true); //todo: aOpenConnection
+ if fInTransaction then result.BeginTransaction;
+ fActiveConnections.AddObject(aConnectionName, TDAHETConnectionContainer.Create(result));
+ end;
+end;
+
+{ TDAHETConnectionContainer }
+
+constructor TDAHETConnectionContainer.Create(aConnection: IDAConnection);
+begin
+ fConnection := aConnection;
+end;
+
+{ global driver registration }
+
+var
+ _driver: TDAEDriver = nil;
+
+procedure Register;
+begin
+ RegisterComponents(DAPalettePageName, [TDAHETDriver]);
+end;
+
+function GetDriverObject: IDADriver;
+begin
+ if (_driver = nil) then _driver := TDAEHETDriver.Create(nil);
+ result := _driver;
+end;
+
+exports
+ GetDriverObject name func_GetDriverObject;
+
+initialization
+ _driver := nil;
+ RegisterDriverProc(GetDriverObject);
+finalization
+ UnregisterDriverProc(GetDriverObject);
+ FreeAndNIL(_driver);
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAHelpers.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAHelpers.pas
new file mode 100644
index 0000000..fcee4c5
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAHelpers.pas
@@ -0,0 +1,389 @@
+unit uDAHelpers;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF}
+ uDAInterfaces, uDAInterfacesEx, uDAClasses, Classes, uDASupportClasses;
+
+function BuildSelectStatementForTable(iTableName: string; iConnection: IDAConnection; iFields: TDAFieldCollection; lColumnMappings: TDAColumnMappingCollection = nil): string;
+function BuildJoinedSelectStatementForTables(iTableNames: array of string; iConnection: IDAConnection): string;
+function BuildCreateStatementForTable(aDataSet:TDADataSet; const aTableName:string; iConnection: IDAConnectionModelling): string;
+function BuildExecStatementForProcedure(const iProcedureName: string; iConnection: IDAConnection): string;
+
+function QuoteIfNeeded(iTableName: string; iConnection: IDAConnection = nil): string;
+function QuoteFieldNameIfNeeded(iTableName, iFieldName: string; iConnection: IDAConnection): string;
+
+function FindUniqueName(const iBaseName:string; iCollection: TSearcheableCollection):string;
+procedure CreateNewDatasets(aSchema: TDASchema; aConnection: IDAConnection; aTables: TStrings; aCreateComandsToo: boolean=false; aCreateRelationships: boolean=false; aListCreatedDatasets:TList=nil; aShowDataset:boolean=true);
+
+function LoadHtmlFromResource(aInstance: THandle; const aName: string): string;
+
+implementation
+
+uses
+ SysUtils, uROClasses, Contnrs;
+
+function LoadHtmlFromResource(aInstance: THandle; const aName: string): string;
+{$IFDEF MSWINDOWS}
+var
+ lResource,lData: THandle;
+ p:pChar;
+{$ENDIF}
+begin
+ result := '';
+ {$IFDEF MSWINDOWS}
+ lResource := FindResource(aInstance, pChar(aName), pChar(2110));
+ if (lResource > 0) then begin
+ lData := LoadResource(aInstance, lResource);
+ p := LockResource(lData);
+ try
+ if Assigned(p) then begin
+ result := p;
+ UniqueString(result);
+ end;
+ finally
+ UnlockResource(lData)
+ end;
+ end;
+ {$ENDIF}
+end;
+
+function BuildCreateStatementForTable(aDataSet:TDADataSet; const aTableName:string; iConnection: IDAConnectionModelling): string;
+var
+ i: integer;
+ lCurrentLine, lPrimary: string;
+begin
+
+ result := 'CREATE TABLE '+QuoteIfNeeded(aTableName, iConnection)+
+ #13#10'(';
+
+ for i := 0 to (aDataSet.Fields.Count - 1) do begin
+ lCurrentLine := ' '+
+ QuoteIfNeeded(aDataSet.Fields[i].Name, iConnection)+
+ ' '+
+ iConnection.FieldToDeclaration(aDataSet.Fields[i]);
+ if (i < aDataSet.Fields.Count - 1) then lCurrentLine := lCurrentLine + ', ';
+ result := result+#13#10+lCurrentLine;
+ end;
+
+ lPrimary := '';
+ for i := 0 to (aDataSet.Fields.Count - 1) do if aDataSet.Fields[i].InPrimaryKey then begin
+ if lPrimary <> '' then lPrimary := lPrimary+','#13#10;
+ lPrimary := lPrimary+
+ ' '+
+ QuoteIfNeeded(aDataSet.Fields.Fields[i].Name, iConnection);
+ end;
+ if lPrimary <> '' then begin
+ result := result+','#13#10+
+ 'CONSTRAINT '+QuoteIfNeeded('PK_'+aTableName)+' PRIMARY KEY'#13#10+
+ ' ('#13#10+
+ lPrimary+#13#10+
+ ' )'
+ end;
+ result := result+#13#10')';
+
+end;
+
+function BuildSelectStatementForTable(iTableName: string; iConnection: IDAConnection; iFields: TDAFieldCollection; lColumnMappings: TDAColumnMappingCollection = nil): string;
+var
+ lFields: TDAFieldCollection;
+ i: integer;
+ lCurrentLine, lQuery: string;
+
+ function DemapField(aFieldName: string): string;
+ var
+ lColumnMapping: TDAColumnMapping;
+ begin
+ if assigned(lColumnMappings) then begin
+ lColumnMapping := lColumnMappings.FindMappingByDatasetField(aFieldName);
+ if assigned(lColumnMapping) then
+ result := lColumnMapping.TableField;
+ end else begin
+ result := aFieldName;
+ end;
+ end;
+
+begin
+ if iFields = nil then iConnection.GetTableFields(iTableName, lFields) else lFields := iFields;
+
+ if Assigned(lFields) then try
+
+ lCurrentLine := '';
+ lQuery := '';
+ for i := 0 to (lFields.Count - 1) do begin
+ lCurrentLine := lCurrentLine + QuoteFieldNameIfNeeded(iTableName, DemapField(lFields.Fields[i].Name), iConnection);
+ if (i < lFields.Count - 1) then begin
+ lCurrentLine := lCurrentLine + ', ';
+ if Length(lCurrentLine) > 50 then begin
+ lQuery := lQuery + lCurrentLine + #13#10' ';
+ lCurrentLine := '';
+ end;
+ end;
+ end;
+ result := 'SELECT ' +
+ #13#10' ' +
+ lQuery + lCurrentLine +
+ #13#10' FROM'#13#10' ' + QuoteIfNeeded(iTableName, iConnection)+ #13#10' WHERE {Where}';
+ finally
+ if lFields <> iFields then FreeAndNil(lFields);
+ end
+ else begin
+ result := 'SELECT * FROM ' + QuoteIfNeeded(iTableName, iConnection)+ #13#10' WHERE {Where}';
+ end;
+end;
+
+function BuildJoinedSelectStatementForTables(iTableNames: array of string; iConnection: IDAConnection): string;
+var
+ lTableName: string;
+ lFields: TDAFieldCollection;
+ i,j: integer;
+ lCurrentLine, lQuery: string;
+begin
+ Result:='';
+ for i := Low(iTableNames) to High(iTableNames) do begin
+
+ lTableName := QuoteIfNeeded(iTableNames[i], iConnection);
+
+ if result = '' then
+ result := 'SELECT '#13#10
+ else
+ result := result+', '#13#10;
+
+ iConnection.GetTableFields(iTableNames[i], lFields);
+ if Assigned(lFields) then try
+
+ lCurrentLine := ' ';
+ lQuery := '';
+ for j := 0 to (lFields.Count - 1) do begin
+ lCurrentLine := lCurrentLine + lTableName+'.'+QuoteIfNeeded(lFields.Fields[j].Name, iConnection);
+ if (j < lFields.Count - 1) then begin
+ lCurrentLine := lCurrentLine + ', ';
+ if Length(lCurrentLine) > 50 then begin
+ lQuery := lQuery + lCurrentLine + #13#10' ';
+ lCurrentLine := '';
+ end;
+ end;
+ end;
+ result := result + lQuery + lCurrentLine;
+ finally
+ FreeAndNil(lFields);
+ end
+ else begin
+ result := result + QuoteIfNeeded(iTableNames[i], iConnection)+'*';
+ end;
+ end;
+
+ for i := Low(iTableNames) to High(iTableNames) do begin
+ if i = 0 then begin
+ result := result+#13#10' FROM '+QuoteIfNeeded(iTableNames[i], iConnection)
+ end
+ else begin
+ result := result+#13#10' LEFT OUTER JOIN '+QuoteIfNeeded(iTableNames[i], iConnection)+' ON '
+ end;
+ end;
+ result := Result + #13#10' WHERE {Where}';
+
+end;
+
+
+function BuildExecStatementForProcedure(const iProcedureName: string; iConnection: IDAConnection): string;
+var
+ lParams: TDAParamCollection;
+ lName: string;
+ i: integer;
+ lQuery: string;
+begin
+ iConnection.GetStoredProcedureParams(iProcedureName, lParams);
+ try
+ lQuery := '';
+ if lParams <> nil then begin
+ for i := 0 to (lParams.Count - 1) do begin
+ lName := ':' + QuoteIfNeeded(lParams.Params[i].Name, iConnection);
+ if not (lParams.Params[i].ParamType in [daptInput, daptInputOutput]) then continue;
+ if lQuery <> '' then lQuery := lQuery + ', ';
+ lQuery := lQuery + lName;
+ end;
+ end;
+ Result := iConnection.GetSPSelectSyntax(lQuery <> '');
+ if Result = '' then
+ Result := 'EXEC {0} {1}';
+ Result := StringReplace(Result, '{0}', QuoteIfNeeded(iProcedureName, iConnection), []);
+ Result := StringReplace(Result, '{1}', lQuery, [rfReplaceAll]);
+ Result := StringReplace(Result, '{{', '{', [rfReplaceAll]);
+ finally
+ FreeAndNil(lParams);
+ end
+end;
+
+function QuoteFieldNameIfNeeded(iTableName, iFieldName: string; iConnection: IDAConnection): string;
+begin
+ if Assigned(iConnection) then begin
+ result := iConnection.QuoteFieldNameIfNeeded(iTableName,iFieldName);
+ end
+ else if Pos(' ', iFieldName) > 0 then begin
+ result := '"' + iFieldName + '"';
+ if Pos(' ', iTableName) > 0 then Result:= '"' + iTableName + '".'+ result;
+ end
+ else begin
+ result := iFieldName;
+ end;
+end;
+
+
+function QuoteIfNeeded(iTableName: string; iConnection: IDAConnection): string;
+begin
+ if Assigned(iConnection) then begin
+ result := iConnection.QuoteIdentifierIfNeeded(iTableName);
+ end
+ else if Pos(' ', iTableName) > 0 then begin
+ result := '"' + iTableName + '"';
+ end
+ else begin
+ result := iTableName;
+ end;
+end;
+
+function FindUniqueName(const iBaseName:string; iCollection: TSearcheableCollection):string;
+var
+ lIndex:integer;
+begin
+ result := iBaseName;
+ lIndex := 0;
+ while Assigned(iCollection.FindItem(result)) do begin
+ inc(lIndex);
+ result := iBaseName+IntToStr(lIndex);
+ end;
+end;
+
+procedure CreateNewDatasets(aSchema: TDASchema; aConnection: IDAConnection; aTables: TStrings; aCreateComandsToo: boolean=false; aCreateRelationships: boolean=false; aListCreatedDatasets:TList=nil; aShowDataset:boolean=true);
+var
+ i,j: Integer;
+ lKeys: TDADriverForeignKeyCollection;
+ lSourceTableName, lDataTableName : string;
+ lFields: TDAFieldCollection;
+ k, z : integer;
+ lNewDataset, lFKDataset, lPKDataset : TDADataset;
+ lNewDatasets: TObjectList;
+begin
+
+ // keep a listof the new datasets, so we can access them by the k index when
+ // looking for FK matches
+
+ lNewDatasets := TObjectList.Create(false);
+ try
+ for k := 0 to aTables.Count-1 do begin
+ lSourceTableName := aTables[k];
+ lDataTableName := FindUniqueName(TrimAndClean(lSourceTableName), aSchema.Datasets);
+
+ // Creates the Dataset and the fields
+ aConnection.GetTableFields(lSourceTableName, lFields);
+ lNewDataset := aSchema.Datasets.Add;
+ with lNewDataset do begin
+ Name := lDataTableName;
+ Fields.AssignFieldCollection(lFields);
+ end;
+ lNewDatasets.Add(lNewDataSet);
+
+ // Adds the SQL statement
+ with lNewDataset.Statements.Add do begin
+ if aConnection.ConnectionType <> '' then begin
+ Connection := '';
+ ConnectionType := aConnection.ConnectionType;
+ end else
+ Connection := aConnection.Name;
+ //Default := true;
+ TargetTable := lSourceTableName;
+ //SQL := 'SELECT '#13#10' ';
+ for z := 0 to (lNewDataset.Fields.Count-1) do begin
+ //SQL := SQL+newDataset.Fields[z].Name;
+ if (z < lNewDataset.Fields.Count-1) then SQL := SQL+', ';
+
+ // Creates the default mappings
+ with ColumnMappings.Add do begin
+ DatasetField := lNewDataset.Fields[z].Name;
+ TableField := lNewDataset.Fields[z].Name;
+ end;
+ end;
+ //SQL := SQL+#13#10' FROM '+QuoteIfNeeded(tblname);
+ //SQL := BuildSelectStatementForTable(lSourceTableName, aConnection);
+ StatementType := stAutoSQL;
+ end;
+
+ // activate the LAST one
+ {if aShowDataset and (k = aTables.Count-1) then begin
+ pc_MainPages.ActivePage := ts_DatasetAndCommand;
+ pc_DatasetAndCommandTop.ActivePage := ts_Dataset2;
+ pc_DatasetAndCommandBottom.ActivePage := ts_Dataset3;
+ pc_DatasetPages.ActivePage := ts_DatasetStatements;
+ ActiveControl := insp_Dataset;
+ insp_Dataset.FocusedField := SchemaModelerData.DatasetsName;
+ end;}
+
+ // Refreshes the listview
+ //SchemaModelerData.Datasets.Refresh;
+ //SchemaModelerData.Datasets.Index := lNewDataset.Index;
+
+ //if aCreateComandsToo then
+ //DropCommandNewCommandsForDataset();
+
+ end;
+
+ if aCreateRelationships then begin
+
+ aConnection.GetForeignKeys(lKeys);
+ if assigned(lKeys) then try
+ for i := 0 to lKeys.Count - 1 do begin
+ for j := 0 to lNewDatasets.Count-1 do begin
+ lFKDataset := (lNewDatasets[j] as TDADataSet);
+ if lKeys[i].FKTable = lFKDataset.Name then begin
+ for k := 0 to lNewDatasets.Count-1 do begin
+ lPKDataset := (lNewDatasets[k] as TDADataSet);
+ if lKeys[i].PKTable = lPKDataset.Name then begin
+ with aSchema.RelationShips.Add() do begin
+ Name := Format('FK_%s_%s',[lFKDataset.Name, lPKDataset.Name]);
+ MasterDatasetName := lPKDataset.Name;
+ DetailDatasetName := lFKDataset.Name;
+ MasterFields := lKeys[i].PKField;
+ DetailFields := lKeys[i].FKField;
+ end;
+ break; { break for k }
+ end;
+ end; { for k (PKDataset)}
+ break; { break for j }
+ end; { if FK matches }
+ end; { for j (FKDaatSet) }
+ end; { for i (key) }
+
+ finally
+ lKeys.Free();
+ end;
+ end;
+
+ if Assigned(aListCreatedDatasets) then begin
+ for i := 0 to lNewDataSets.Count-1 do begin
+ aListCreatedDatasets.Add(lNewDataSets[i]);
+ end; { for }
+ end;
+
+ finally
+ FreeAndNil(lNewDatasets);
+ end;
+
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAIBInterfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAIBInterfaces.pas
new file mode 100644
index 0000000..a134a1e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAIBInterfaces.pas
@@ -0,0 +1,755 @@
+unit uDAIBInterfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses uROClasses, uDAInterfaces, uDAEngine;
+
+type
+ { IDAInterbaseConnection
+ For identification purposes. Implemented by all IB connections }
+ IDAInterbaseConnection = interface(IDAConnection)
+ ['{CE1B8144-4EA6-4815-ACD2-D5A4B62F2E69}']
+ end;
+
+ { IDAIBTransactionAccess
+ Interbase connections usually refer to a separate transaction object unlike all
+ the rest of data access components. If implemented, this interfaces provides access
+ to the inner transaction object. See implementation of IBX and IBO drivers. }
+ IDAIBTransactionAccess = interface
+ ['{C1BDDDD3-749A-4D25-BD1E-43715B697959}']
+ function GetTransaction: TObject; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Commit; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CommitRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Rollback; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure RollbackRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ property Transaction: TObject read GetTransaction;
+ end;
+
+ { IDAIBConnectionProperties
+ Provides access to common properties of Interbase connections }
+ IDAIBConnectionProperties = interface
+ ['{5F001B6F-4FB6-46B7-BC27-3326C4658F75}']
+ function GetRole: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRole(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetSQLDialect: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetSQLDialect(Value: integer); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetCharset: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetCharset(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Commit; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CommitRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Rollback; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure RollbackRetaining; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ property Role: string read GetRole write SetRole;
+ property SQLDialect: integer read GetSQLDialect write SetSQLDialect;
+
+ property Charset: string read GetCharset write SetCharset;
+ end;
+
+ TDAIBAuxParams = (ibxp_Role, ibxp_Dialect, ibxp_Charset);
+
+ TDAIBDriver = class(TDAEDriver)
+ protected
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ TDAIBConnection = class(TDAEConnection, IDAConnection, IDAUseGenerators, IDAUseGenerators2,
+ IDAFileBasedDatabase, IDAInterbaseConnection,IDACanQueryGeneratorsNames)
+ private
+ protected
+ function GetSQLDialect: integer; virtual; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}abstract;
+ // IDAConnection
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ function GetSPSelectSyntax(HasArguments: Boolean): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+ function DoGetLastAutoInc(const GeneratorName: string): integer; override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ // IDAUseGenerators
+ function GetNextAutoinc(const GeneratorName: string): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAUseGenerators2
+ function GetNextAutoinc2(const GeneratorName: string): variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAFileBasedDatabase
+ function GetFileExtensions: IROStrings;
+ // IDACanQueryGeneratorsNames
+ function GetGeneratorNames: IROStrings;
+ end;
+
+const
+ IBAuxParams: array[TDAIBAuxParams] of string = (
+ 'Role=',
+ 'Dialect=1,2,3',
+ 'Charset=ASCII,BIG_5,CYRL,DOS437,DOS850,DOS852,DOS857,DOS860,DOS861,DOS863, ' +
+ 'DOS865,EUCJ_0208,GB_2312,ISO8859_1,ISO8859_2,KSC_5601,NEXT,NONE, ' +
+ 'OCTETS,SJIS_0208,UNICODE_FSS,WIN1250,WIN1251,WIN1252,WIN1253,WIN1254'
+ );
+const
+ IB_DriverType = 'Interbase';
+
+procedure AddIBAuxParams(const List: IROStrings);
+
+function IB_GetFileExtensions: IROStrings;
+procedure IB_GetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection);
+function IB_GetSPSelectSyntax(HasArguments: Boolean): String;
+function IB_GetNextAutoinc(const GeneratorName: string; Query: IDADataset): Variant;
+function IB_GetLastAutoInc(const GeneratorName: string; Query: IDADataset): Variant;
+function IB_CreateMacroProcessor: TDASQLMacroProcessor;
+Procedure IB_DoGetForeignKeys(Query: IDADataset;ForeignKeys: TDADriverForeignKeyCollection);
+procedure IB_GetObjectNames(Query: IDADataset;AList: IROStrings; AObjectType: TDAObjecttype);
+function IB_IdentifierNeedsQuoting(const iIdentifier: string; ASQLDialect: integer): boolean;
+function IB_GetGeneratorNames(Query: IDADataset):IROStrings;
+
+implementation
+uses
+ SysUtils, uDAMacroProcessors;
+
+var
+ ib_reservedwords: array of string;
+
+procedure AddIBAuxParams(const List: IROStrings);
+var
+ x: TDAIBAuxParams;
+begin
+ for x := Low(TDAIBAuxParams) to High(TDAIBAuxParams) do
+ List.Add(IBAuxParams[x])
+end;
+
+function IB_GetFileExtensions: IROStrings;
+begin
+ result := TROStrings.Create;
+ result.Add('*.fdb;Firebird Database (*.fdb)');
+ result.Add('*.gdb;Interbase Database (*.gdb)');
+ result.Add('*.*;All files (*.*)');
+end;
+
+procedure IB_GetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection);
+const
+ IBSQL_TableInfo =
+ 'select a.rdb$field_name,a.rdb$null_flag, '+ //0,1
+ 'b.rdb$field_precision, b.rdb$field_scale, ' + //2,3
+ 'b.rdb$null_flag, b.rdb$computed_source, c.rdb$type_name, '+ //4,5,6
+ 'b.rdb$field_length, b.rdb$character_length, d.rdb$default_collate_name '+ //7,8,9
+ 'from rdb$relation_fields a '+
+ 'left join RDB$FIELDS b on (a.rdb$field_source = b.rdb$field_name) '+
+ 'left join RDB$TYPES c on (b.rdb$field_type = c.rdb$type and c.rdb$field_name = ''RDB$FIELD_TYPE'') '+
+ 'left join RDB$CHARACTER_SETS d on (d.rdb$character_set_id = b.rdb$character_set_id) '+
+ 'where (a.rdb$relation_name = ''%s'')';
+ IBSQL_PRIMARYKEY =
+ 'select d.rdb$field_name from rdb$relation_constraints c '+
+ 'left join rdb$index_segments d on (c.rdb$index_name = d.rdb$index_name) '+
+ 'where (c.rdb$relation_name = ''%s'') and (c.rdb$constraint_type = ''PRIMARY KEY'')';
+var
+ fld: TDAField;
+ fld6, fld9: string;
+begin
+ Fields := TDAFieldCollection.Create(nil);
+ try
+ // main info
+ Query.SQL := 'SELECT * FROM ' + aTableName;
+ Query.Open;
+ Fields.Assign(Query.Fields);
+
+ // required
+ Query.Close;
+ Query.SQL := Format(IBSQL_TableInfo,[aTableName]);
+ Query.Open;
+ While not Query.Eof do begin
+ fld := Fields.FindField(Trim(Query.Fields[0].AsString));
+ if Fld <> nil then begin
+ if Query.Fields[1].IsNull then
+ Fld.Required:=(Query.Fields[4].AsInteger = 1)
+ else
+ Fld.Required:=(Query.Fields[1].AsInteger = 1);
+ fld6 := TrimRight(Query.Fields[6].AsString);
+ fld9 := TrimRight(Query.Fields[9].AsString);
+ if (fld6 = 'INT64') and not Query.Fields[2].IsNull and not Query.Fields[3].IsNull then
+ fld.DataType := datDecimal;
+ if fld.DataType = datDecimal then begin
+ fld.DecimalPrecision:=Query.Fields[2].AsInteger;
+ fld.DecimalScale:=ABS(Query.Fields[3].AsInteger);
+ end;
+ if (fld6 = 'VARYING') and
+ (fld.DataType = datString) and
+ ((fld9 = 'UTF8') or (fld9 = 'UNICODE_FSS')) then begin
+ fld.DataType := datWideString;
+ fld.Size := Query.Fields[8].AsInteger;
+ end;
+ if (fld6 = 'BLOB') and
+ (fld.DataType = datMemo) and
+ ((fld9 = 'UTF8') or (fld9 = 'UNICODE_FSS')) then begin
+ fld.DataType := datWideMemo;
+ end;
+ if not Query.Fields[5].IsNull then begin
+ fld.ReadOnly:= True;
+ fld.LogChanges:= False;
+ end;
+ end;
+ Query.Next;
+ end;
+
+ // pk
+ Query.Close;
+ Query.SQL:= Format(IBSQL_PRIMARYKEY,[aTableName]);
+ Query.Open;
+ While not Query.Eof do begin
+ fld := Fields.FindField(Trim(Query.Fields[0].AsString));
+ if Fld <> nil then begin
+ fld.InPrimaryKey := True;
+ fld.Required := True;
+ end;
+ Query.Next;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+function IB_GetSPSelectSyntax(HasArguments: Boolean): String;
+begin
+ if HasArguments then
+ Result := 'SELECT * FROM {0}({1})'
+ else
+ Result := 'SELECT * FROM {0}';
+end;
+
+function IB_GetNextAutoinc(const GeneratorName: string; Query: IDADataset): Variant;
+begin
+ try
+ Query.SQL:=Format('SELECT Gen_id(%s,1) FROM RDB$Database', [GeneratorName]);
+ Query.Open;
+ Result := Query.Fields[0].AsInteger;
+ finally
+ Query:=nil;
+ end;
+end;
+
+function IB_GetLastAutoInc(const GeneratorName: string;Query: IDADataset): Variant;
+begin
+ try
+ Query.SQL:=Format('SELECT Gen_id(%s,0) FROM RDB$Database', [GeneratorName]);
+ Query.Open;
+ Result := Query.Fields[0].Value;
+ finally
+ Query:=nil;
+ end;
+end;
+
+
+function IB_CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ result := TDAIBMacroProcessor.Create;
+end;
+
+Procedure IB_DoGetForeignKeys(Query: IDADataset;ForeignKeys: TDADriverForeignKeyCollection);
+var
+ lCurrConstraint: string;
+ lCurrFK: TDADriverForeignKey;
+const
+ sFK_SQL =
+ 'SELECT A.RDB$CONSTRAINT_NAME, A.RDB$RELATION_NAME AS TABLE_NAME, ' +
+ //A.RDB$CONSTRAINT_NAME AS FK_NAME, B.RDB$UPDATE_RULE AS UR, B.RDB$DELETE_RULE AS DR,'+
+ 'C.RDB$RELATION_NAME AS FK_TABLE, D.RDB$FIELD_NAME AS FK_FIELD, ' +
+ 'E.RDB$FIELD_NAME AS ONFIELD ' +
+ 'FROM ' +
+ 'RDB$RELATION_CONSTRAINTS A JOIN RDB$REF_CONSTRAINTS B ON (A.RDB$CONSTRAINT_NAME = B.RDB$CONSTRAINT_NAME) ' +
+ 'JOIN RDB$RELATION_CONSTRAINTS C ON (B.RDB$CONST_NAME_UQ=C.RDB$CONSTRAINT_NAME)' +
+ 'JOIN RDB$INDEX_SEGMENTS D ON (C.RDB$INDEX_NAME=D.RDB$INDEX_NAME) ' +
+ 'JOIN RDB$INDEX_SEGMENTS E ON (A.RDB$INDEX_NAME=E.RDB$INDEX_NAME) AND (D.RDB$FIELD_POSITION = E.RDB$FIELD_POSITION) ' +
+ 'WHERE (A.RDB$CONSTRAINT_TYPE = ''FOREIGN KEY'') ' +
+ 'ORDER BY A.RDB$CONSTRAINT_NAME, A.RDB$RELATION_NAME, D.RDB$FIELD_POSITION, E.RDB$FIELD_POSITION ';
+begin
+ lCurrConstraint := '';
+ lCurrFK := nil;
+ try
+ Query.SQL := sFK_SQL;
+ Query.Open;
+
+ ForeignKeys.Clear;
+ while (not Query.EOF) do begin
+
+ if lCurrConstraint <> Query.Fields[0].AsString then begin
+ lCurrConstraint := Query.Fields[0].AsString;
+
+ lCurrFK := ForeignKeys.Add();
+ with lCurrFK do begin
+ FKField := TrimRight(Query.Fields[4].AsString);
+ PKField := TrimRight(Query.Fields[3].AsString);
+ FKTable := TrimRight(Query.Fields[1].AsString);
+ PKTable := TrimRight(Query.Fields[2].AsString);
+ end;
+ end else begin
+ with lCurrFK do begin
+ FKField := FKField + ';' + TrimRight(Query.Fields[4].AsString);
+ PKField := PKField + ';' + TrimRight(Query.Fields[3].AsString);
+ end;
+ end;
+ Query.Next;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+procedure IB_GetObjectNames(Query: IDADataset;AList: IROStrings; AObjectType: TDAObjecttype);
+begin
+ try
+ case AObjectType of
+ dotTable: Query.SQL := 'Select RDB$RELATION_NAME from RDB$RELATIONS WHERE (RDB$VIEW_BLR is NULL) AND (RDB$SYSTEM_FLAG = 0) ORDER BY 1';
+ dotProcedure: Query.SQL := 'Select RDB$PROCEDURE_NAME from RDB$PROCEDURES ORDER BY 1';
+ dotView: Query.SQL := 'Select RDB$RELATION_NAME from RDB$RELATIONS WHERE (RDB$VIEW_BLR is not NULL) ORDER BY 1';
+ else
+ end;
+ Query.Open;
+ while not Query.EOF do begin
+ AList.Add(Trim(Query.Fields[0].AsString));
+ Query.Next;
+ end;
+ finally
+ Query:=nil;
+ end;
+end;
+
+function IB_IdentifierNeedsQuoting(const iIdentifier: string; ASQLDialect: integer): boolean;
+var
+ i: integer;
+begin
+ Result := True;
+ if (ASQLDialect >= 3) then
+ for i := 1 to Length(iIdentifier) do
+ if not CharInSet(iIdentifier[i], ['A'..'Z', '0'..'9', '_']) then Exit;
+ Result := (pos('.', iIdentifier) > 0) or TestIdentifier(iIdentifier, ib_reservedwords);
+end;
+
+function IB_GetGeneratorNames(Query: IDADataset):IROStrings;
+const
+ sql = 'SELECT RDB$GENERATOR_NAME FROM RDB$GENERATORS WHERE RDB$SYSTEM_FLAG = 0 ORDER BY RDB$GENERATOR_NAME';
+begin
+ Result:= NewROStrings;
+ try
+ Query.SQL := sql;
+ Query.Open;
+ while not Query.EOF do begin
+ Result.Add(Trim(Query.Fields[0].AsString));
+ Query.Next;
+ end;
+ finally
+ Query:=nil;
+ end;
+end;
+
+{ TDAIBConnection }
+
+
+function TDAIBConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ result := IB_CreateMacroProcessor;
+end;
+
+procedure TDAIBConnection.DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ inherited;
+ IB_DoGetForeignKeys(GetDatasetClass.Create(Self),ForeignKeys);
+end;
+
+function TDAIBConnection.DoGetLastAutoInc(const GeneratorName: string): integer;
+begin
+ Result := DoGetLastAutoIncValue(GeneratorName);
+end;
+
+function TDAIBConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+begin
+ Result:= IB_GetLastAutoInc(GeneratorName,GetDatasetClass.Create(Self));
+end;
+
+procedure TDAIBConnection.DoGetStoredProcedureNames(out List: IROStrings);
+begin
+ inherited;
+ IB_GetObjectNames(GetDatasetClass.Create(Self),List,dotProcedure);
+end;
+
+procedure TDAIBConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ IB_GetTableFields(QuoteIdentifierIfNeeded(aTableName),GetDatasetClass.Create(Self),Fields);
+end;
+
+procedure TDAIBConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited;
+ IB_GetObjectNames(GetDatasetClass.Create(Self),List,dotTable);
+end;
+
+procedure TDAIBConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited;
+ IB_GetObjectNames(GetDatasetClass.Create(Self),List,dotView);
+end;
+
+function TDAIBConnection.GetFileExtensions: IROStrings;
+begin
+ Result:= IB_GetFileExtensions;
+end;
+
+function TDAIBConnection.GetGeneratorNames: IROStrings;
+begin
+ Result:= IB_GetGeneratorNames(GetDatasetClass.Create(Self));
+end;
+
+function TDAIBConnection.GetNextAutoinc(const GeneratorName: string): integer;
+begin
+ Result:= GetNextAutoinc2(GeneratorName);
+end;
+
+function TDAIBConnection.GetNextAutoinc2(
+ const GeneratorName: string): variant;
+begin
+ Result:= IB_GetNextAutoinc(GeneratorName,GetDatasetClass.Create(Self));
+end;
+
+function TDAIBConnection.GetSPSelectSyntax(HasArguments: Boolean): string;
+begin
+ Result:= IB_GetSPSelectSyntax(HasArguments);
+end;
+
+function TDAIBConnection.IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+begin
+ result := inherited IdentifierNeedsQuoting(iIdentifier);
+ if not result then result := IB_IdentifierNeedsQuoting(iIdentifier,GetSQLDialect);
+end;
+
+{ TDAIBDriver }
+
+procedure TDAIBDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ AddIBAuxParams(List);
+end;
+
+function TDAIBDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+function TDAIBDriver.GetDefaultConnectionType(const AuxDriver: string): string;
+begin
+ Result:= IB_DriverType;
+end;
+
+procedure ib_InitializeReservedWords;
+begin
+ SetLength(ib_reservedwords, 281);
+ // sorted with TStringList.Sort (bds2007)
+ ib_reservedwords[0] := 'ACTION';
+ ib_reservedwords[1] := 'ACTIVE';
+ ib_reservedwords[2] := 'ADD';
+ ib_reservedwords[3] := 'ADMIN';
+ ib_reservedwords[4] := 'AFTER';
+ ib_reservedwords[5] := 'ALL';
+ ib_reservedwords[6] := 'ALTER';
+ ib_reservedwords[7] := 'AND';
+ ib_reservedwords[8] := 'ANY';
+ ib_reservedwords[9] := 'AS';
+ ib_reservedwords[10] := 'ASC';
+ ib_reservedwords[11] := 'ASCENDING';
+ ib_reservedwords[12] := 'AT';
+ ib_reservedwords[13] := 'AUTO';
+ ib_reservedwords[14] := 'AUTODDL';
+ ib_reservedwords[15] := 'AVG';
+ ib_reservedwords[16] := 'BASE_NAME';
+ ib_reservedwords[17] := 'BASED';
+ ib_reservedwords[18] := 'BASENAME';
+ ib_reservedwords[19] := 'BEFORE';
+ ib_reservedwords[20] := 'BEGIN';
+ ib_reservedwords[21] := 'BETWEEN';
+ ib_reservedwords[22] := 'BLOB';
+ ib_reservedwords[23] := 'BLOBEDIT';
+ ib_reservedwords[24] := 'BUFFER';
+ ib_reservedwords[25] := 'BY';
+ ib_reservedwords[26] := 'CACHE';
+ ib_reservedwords[27] := 'CASCADE';
+ ib_reservedwords[28] := 'CAST';
+ ib_reservedwords[29] := 'CHAR';
+ ib_reservedwords[30] := 'CHAR_LENGTH';
+ ib_reservedwords[31] := 'CHARACTER';
+ ib_reservedwords[32] := 'CHARACTER_LENGTH';
+ ib_reservedwords[33] := 'CHECK';
+ ib_reservedwords[34] := 'CHECK_POINT_LEN';
+ ib_reservedwords[35] := 'CHECK_POINT_LENGTH';
+ ib_reservedwords[36] := 'CLOSE';
+ ib_reservedwords[37] := 'COLLATE';
+ ib_reservedwords[38] := 'COLLATION';
+ ib_reservedwords[39] := 'COLUMN';
+ ib_reservedwords[40] := 'COMMIT';
+ ib_reservedwords[41] := 'COMMITTED';
+ ib_reservedwords[42] := 'COMPILETIME';
+ ib_reservedwords[43] := 'COMPUTED';
+ ib_reservedwords[44] := 'CONDITIONAL';
+ ib_reservedwords[45] := 'CONNECT';
+ ib_reservedwords[46] := 'CONSTRAINT';
+ ib_reservedwords[47] := 'CONTAINING';
+ ib_reservedwords[48] := 'CONTINUE';
+ ib_reservedwords[49] := 'COUNT';
+ ib_reservedwords[50] := 'CREATE';
+ ib_reservedwords[51] := 'CSTRING';
+ ib_reservedwords[52] := 'CURRENT';
+ ib_reservedwords[53] := 'CURRENT_DATE';
+ ib_reservedwords[54] := 'CURRENT_TIME';
+ ib_reservedwords[55] := 'CURRENT_TIMESTAMP';
+ ib_reservedwords[56] := 'CURSOR';
+ ib_reservedwords[57] := 'DATABASE';
+ ib_reservedwords[58] := 'DATE';
+ ib_reservedwords[59] := 'DAY';
+ ib_reservedwords[60] := 'DB_KEY';
+ ib_reservedwords[61] := 'DEBUG';
+ ib_reservedwords[62] := 'DEC';
+ ib_reservedwords[63] := 'DECIMAL';
+ ib_reservedwords[64] := 'DECLARE';
+ ib_reservedwords[65] := 'DEFAULT';
+ ib_reservedwords[66] := 'DELETE';
+ ib_reservedwords[67] := 'DESC';
+ ib_reservedwords[68] := 'DESCENDING';
+ ib_reservedwords[69] := 'DESCRIBE';
+ ib_reservedwords[70] := 'DESCRIPTOR';
+ ib_reservedwords[71] := 'DISCONNECT';
+ ib_reservedwords[72] := 'DISPLAY';
+ ib_reservedwords[73] := 'DISTINCT';
+ ib_reservedwords[74] := 'DO';
+ ib_reservedwords[75] := 'DOMAIN';
+ ib_reservedwords[76] := 'DOUBLE';
+ ib_reservedwords[77] := 'DROP';
+ ib_reservedwords[78] := 'ECHO';
+ ib_reservedwords[79] := 'EDIT';
+ ib_reservedwords[80] := 'ELSE';
+ ib_reservedwords[81] := 'END';
+ ib_reservedwords[82] := 'ENTRY_POINT';
+ ib_reservedwords[83] := 'ESCAPE';
+ ib_reservedwords[84] := 'EVENT';
+ ib_reservedwords[85] := 'EXCEPTION';
+ ib_reservedwords[86] := 'EXECUTE';
+ ib_reservedwords[87] := 'EXISTS';
+ ib_reservedwords[88] := 'EXIT';
+ ib_reservedwords[89] := 'EXTERN';
+ ib_reservedwords[90] := 'EXTERNAL';
+ ib_reservedwords[91] := 'EXTRACT';
+ ib_reservedwords[92] := 'FETCH';
+ ib_reservedwords[93] := 'FILE';
+ ib_reservedwords[94] := 'FILTER';
+ ib_reservedwords[95] := 'FLOAT';
+ ib_reservedwords[96] := 'FOR';
+ ib_reservedwords[97] := 'FOREIGN';
+ ib_reservedwords[98] := 'FOUND';
+ ib_reservedwords[99] := 'FREE_IT';
+ ib_reservedwords[100] := 'FROM';
+ ib_reservedwords[101] := 'FULL';
+ ib_reservedwords[102] := 'FUNCTION';
+ ib_reservedwords[103] := 'GDSCODE';
+ ib_reservedwords[104] := 'GEN_ID';
+ ib_reservedwords[105] := 'GENERATOR';
+ ib_reservedwords[106] := 'GLOBAL';
+ ib_reservedwords[107] := 'GOTO';
+ ib_reservedwords[108] := 'GRANT';
+ ib_reservedwords[109] := 'GROUP';
+ ib_reservedwords[110] := 'GROUP_COMMIT_';
+ ib_reservedwords[111] := 'GROUP_COMMIT_WAIT';
+ ib_reservedwords[112] := 'HAVING';
+ ib_reservedwords[113] := 'HELP';
+ ib_reservedwords[114] := 'HOUR';
+ ib_reservedwords[115] := 'IF';
+ ib_reservedwords[116] := 'IMMEDIATE';
+ ib_reservedwords[117] := 'IN';
+ ib_reservedwords[118] := 'INACTIVE';
+ ib_reservedwords[119] := 'INDEX';
+ ib_reservedwords[120] := 'INDICATOR';
+ ib_reservedwords[121] := 'INIT';
+ ib_reservedwords[122] := 'INNER';
+ ib_reservedwords[123] := 'INPUT';
+ ib_reservedwords[124] := 'INPUT_TYPE';
+ ib_reservedwords[125] := 'INSERT';
+ ib_reservedwords[126] := 'INT';
+ ib_reservedwords[127] := 'INTEGER';
+ ib_reservedwords[128] := 'INTO';
+ ib_reservedwords[129] := 'IS';
+ ib_reservedwords[130] := 'ISOLATION';
+ ib_reservedwords[131] := 'ISQL';
+ ib_reservedwords[132] := 'JOIN';
+ ib_reservedwords[133] := 'KEY';
+ ib_reservedwords[134] := 'LC_MESSAGES';
+ ib_reservedwords[135] := 'LC_TYPE';
+ ib_reservedwords[136] := 'LEFT';
+ ib_reservedwords[137] := 'LENGTH';
+ ib_reservedwords[138] := 'LEV';
+ ib_reservedwords[139] := 'LEVEL';
+ ib_reservedwords[140] := 'LIKE';
+ ib_reservedwords[141] := 'LOG_BUF_SIZE';
+ ib_reservedwords[142] := 'LOG_BUFFER_SIZE';
+ ib_reservedwords[143] := 'LOGFILE';
+ ib_reservedwords[144] := 'LONG';
+ ib_reservedwords[145] := 'MANUAL';
+ ib_reservedwords[146] := 'MAX';
+ ib_reservedwords[147] := 'MAX_SEGMENT';
+ ib_reservedwords[148] := 'MAXIMUM';
+ ib_reservedwords[149] := 'MAXIMUM_SEGMENT';
+ ib_reservedwords[150] := 'MERGE';
+ ib_reservedwords[151] := 'MESSAGE';
+ ib_reservedwords[152] := 'MIN';
+ ib_reservedwords[153] := 'MINIMUM';
+ ib_reservedwords[154] := 'MINUTE';
+ ib_reservedwords[155] := 'MODULE_NAME';
+ ib_reservedwords[156] := 'MONTH';
+ ib_reservedwords[157] := 'NAMES';
+ ib_reservedwords[158] := 'NATIONAL';
+ ib_reservedwords[159] := 'NATURAL';
+ ib_reservedwords[160] := 'NCHAR';
+ ib_reservedwords[161] := 'NO';
+ ib_reservedwords[162] := 'NOAUTO';
+ ib_reservedwords[163] := 'NOT';
+ ib_reservedwords[164] := 'NULL';
+ ib_reservedwords[165] := 'NUM_LOG_BUFFERS';
+ ib_reservedwords[166] := 'NUM_LOG_BUFS';
+ ib_reservedwords[167] := 'NUMERIC';
+ ib_reservedwords[168] := 'OCTET_LENGTH';
+ ib_reservedwords[169] := 'OF';
+ ib_reservedwords[170] := 'ON';
+ ib_reservedwords[171] := 'ONLY';
+ ib_reservedwords[172] := 'OPEN';
+ ib_reservedwords[173] := 'OPTION';
+ ib_reservedwords[174] := 'OR';
+ ib_reservedwords[175] := 'ORDER';
+ ib_reservedwords[176] := 'OUTER';
+ ib_reservedwords[177] := 'OUTPUT';
+ ib_reservedwords[178] := 'OUTPUT_TYPE';
+ ib_reservedwords[179] := 'OVERFLOW';
+ ib_reservedwords[180] := 'PAGE';
+ ib_reservedwords[181] := 'PAGE_SIZE';
+ ib_reservedwords[182] := 'PAGELENGTH';
+ ib_reservedwords[183] := 'PAGES';
+ ib_reservedwords[184] := 'PARAMETER';
+ ib_reservedwords[185] := 'PASSWORD';
+ ib_reservedwords[186] := 'PLAN';
+ ib_reservedwords[187] := 'POSITION';
+ ib_reservedwords[188] := 'POST_EVENT';
+ ib_reservedwords[189] := 'PRECISION';
+ ib_reservedwords[190] := 'PREPARE';
+ ib_reservedwords[191] := 'PRIMARY';
+ ib_reservedwords[192] := 'PRIVILEGES';
+ ib_reservedwords[193] := 'PROCEDURE';
+ ib_reservedwords[194] := 'PROTECTED';
+ ib_reservedwords[195] := 'PUBLIC';
+ ib_reservedwords[196] := 'QUIT';
+ ib_reservedwords[197] := 'RAW_PARTITIONS';
+ ib_reservedwords[198] := 'RDB$DB_KEY';
+ ib_reservedwords[199] := 'READ';
+ ib_reservedwords[200] := 'REAL';
+ ib_reservedwords[201] := 'RECORD_VERSION';
+ ib_reservedwords[202] := 'REFERENCES';
+ ib_reservedwords[203] := 'RELEASE';
+ ib_reservedwords[204] := 'RESERV';
+ ib_reservedwords[205] := 'RESERVING';
+ ib_reservedwords[206] := 'RESTRICT';
+ ib_reservedwords[207] := 'RETAIN';
+ ib_reservedwords[208] := 'RETURN';
+ ib_reservedwords[209] := 'RETURNING_VALUES';
+ ib_reservedwords[210] := 'RETURNS';
+ ib_reservedwords[211] := 'REVOKE';
+ ib_reservedwords[212] := 'RIGHT';
+ ib_reservedwords[213] := 'ROLE';
+ ib_reservedwords[214] := 'ROLLBACK';
+ ib_reservedwords[215] := 'RUNTIME';
+ ib_reservedwords[216] := 'SCHEMA';
+ ib_reservedwords[217] := 'SECOND';
+ ib_reservedwords[218] := 'SEGMENT';
+ ib_reservedwords[219] := 'SELECT';
+ ib_reservedwords[220] := 'SET';
+ ib_reservedwords[221] := 'SHADOW';
+ ib_reservedwords[222] := 'SHARED';
+ ib_reservedwords[223] := 'SHELL';
+ ib_reservedwords[224] := 'SHOW';
+ ib_reservedwords[225] := 'SINGULAR';
+ ib_reservedwords[226] := 'SIZE';
+ ib_reservedwords[227] := 'SMALLINT';
+ ib_reservedwords[228] := 'SNAPSHOT';
+ ib_reservedwords[229] := 'SOME';
+ ib_reservedwords[230] := 'SORT';
+ ib_reservedwords[231] := 'SQLCODE';
+ ib_reservedwords[232] := 'SQLERROR';
+ ib_reservedwords[233] := 'SQLWARNING';
+ ib_reservedwords[234] := 'STABILITY';
+ ib_reservedwords[235] := 'STARTING';
+ ib_reservedwords[236] := 'STARTS';
+ ib_reservedwords[237] := 'STATEMENT';
+ ib_reservedwords[238] := 'STATIC';
+ ib_reservedwords[239] := 'STATISTICS';
+ ib_reservedwords[240] := 'SUB_TYPE';
+ ib_reservedwords[241] := 'SUM';
+ ib_reservedwords[242] := 'SUSPEND';
+ ib_reservedwords[243] := 'TABLE';
+ ib_reservedwords[244] := 'TERMINATOR';
+ ib_reservedwords[245] := 'THEN';
+ ib_reservedwords[246] := 'TIME';
+ ib_reservedwords[247] := 'TIMESTAMP';
+ ib_reservedwords[248] := 'TO';
+ ib_reservedwords[249] := 'TRANSACTION';
+ ib_reservedwords[250] := 'TRANSLATE';
+ ib_reservedwords[251] := 'TRANSLATION';
+ ib_reservedwords[252] := 'TRIGGER';
+ ib_reservedwords[253] := 'TRIM';
+ ib_reservedwords[254] := 'TYPE';
+ ib_reservedwords[255] := 'UNCOMMITTED';
+ ib_reservedwords[256] := 'UNION';
+ ib_reservedwords[257] := 'UNIQUE';
+ ib_reservedwords[258] := 'UPDATE';
+ ib_reservedwords[259] := 'UPPER';
+ ib_reservedwords[260] := 'USER';
+ ib_reservedwords[261] := 'USING';
+ ib_reservedwords[262] := 'VALUE';
+ ib_reservedwords[263] := 'VALUES';
+ ib_reservedwords[264] := 'VARCHAR';
+ ib_reservedwords[265] := 'VARIABLE';
+ ib_reservedwords[266] := 'VARYING';
+ ib_reservedwords[267] := 'VERSION';
+ ib_reservedwords[268] := 'VIEW';
+ ib_reservedwords[269] := 'WAIT';
+ ib_reservedwords[270] := 'WAIT_TIME';
+ ib_reservedwords[271] := 'WEEKDAY';
+ ib_reservedwords[272] := 'WHEN';
+ ib_reservedwords[273] := 'WHENEVER';
+ ib_reservedwords[274] := 'WHERE';
+ ib_reservedwords[275] := 'WHILE';
+ ib_reservedwords[276] := 'WITH';
+ ib_reservedwords[277] := 'WORK';
+ ib_reservedwords[278] := 'WRITE';
+ ib_reservedwords[279] := 'YEAR';
+ ib_reservedwords[280] := 'YEARDAY';
+end;
+
+initialization
+ ib_InitializeReservedWords;
+finalization
+ ib_reservedwords := nil;
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAInterfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAInterfaces.pas
new file mode 100644
index 0000000..1d9685f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAInterfaces.pas
@@ -0,0 +1,7005 @@
+unit uDAInterfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, TypInfo, DB, uROClasses, SysUtils, uDASupportClasses,
+ DataAbstract3_Intf, DataAbstract4_Intf, uROXmlIntf, FMTBcd;
+
+const
+ func_GetDriverObject = 'GetDriverObject';
+ ClientFieldPrefix = '##';
+ old_FieldPrefix = 'OLD_';
+ mapping_Unknown = '';
+
+type
+ {$IFNDEF UNICODE}
+ UnicodeString = WideString;
+ {$ENDIF}
+{$IFDEF DELPHI6}
+ UInt64 = Int64;
+{$ENDIF}
+{$IFDEF DELPHI7}
+ UInt64 = Int64; // otherwise C1118 error
+{$ENDIF}
+
+ TDAObjecttype = (dotTable,dotProcedure, dotView);
+ TDAChangeType = (ctInsert, ctUpdate, ctDelete);
+ TDAChangeTypes = set of TDAChangeType;
+ TDAChangeStatus = (csPending, csResolved, csFailed);
+
+ TDASQLCondition = (cEqual,
+ cDifferent,
+ cMajor,
+ cLess,
+ cMajorOrEqual,
+ cLessOrEqual,
+ cLike,
+ cIn,
+ cContaining,
+ cIsNull,
+ cIsNotNull);
+
+ TDASQLOperator = (opAND,
+ opOR,
+ opNOT);
+
+ TDADefaultOperator = (doNone, doAnd, doOr);
+
+ TDABlobType = (dabtUnknown, dabtBlob, dabtMemo, dabtOraBlob, dabtOraClob, dabtGraphic, dabtTypedBinary, dabtTimestamp);
+
+ TDAJoinType = (jtInner, jtLeftOuter, jtRightOuter, jtFullOuter, jtCross);
+
+ TDARelationshipType = (rtForeignKey, rtMasterDetail);
+
+const
+ StrSQLCondition: array[TDASQLCondition] of string = (
+ '=', '<>', '>', '<', '>=', '<=', 'LIKE', 'IN', 'CONTAINING', 'IS NULL', 'IS NOT NULL');
+
+ StrSQLOperator: array[TDASQLOperator] of string = (
+ 'AND', 'OR', 'NOT');
+
+ BlobTypeMappings : array[TDABlobType] of TFieldType =
+ (ftBlob, ftBlob, ftMemo, ftOraBlob, ftOraClob, ftGraphic,ftTypedBinary, ftBlob);
+
+type
+ { Forwards }
+ IDADriver = interface;
+ IDAStoredProcedure = interface;
+ IDADataset = interface;
+ IDAConnection = interface;
+ IDASQLCommand = interface;
+ IDADataDictionary = interface;
+ IDATestableObject = interface;
+ IDAConnectionPool = interface;
+ IDAConnectionManager = interface;
+
+ TDACustomField = class;
+ TDADataset = class;
+
+ { Driver access }
+ TDAGetDriverObject = function: IDADriver; stdcall;
+
+ //TDriverErrorEvent = procedure(anErrorCode : integer; const anErrorMessage : string) of object;
+
+ EDADriverLoadException = class(Exception)
+ private
+ fErrorCode: integer;
+
+ public
+ constructor Create(anErrorCode: integer; const anErrorMessage: string);
+
+ property ErrorCode: integer read fErrorCode;
+ end;
+ EDADriverLoadExceptionClass = class of EDADriverLoadException;
+ TDADataAbstractException = EDADriverLoadException;
+ TDADataAbstractExceptionClass = class of TDADataAbstractException;
+
+ { Misc. types }
+ TDASQLStatementType = (stSQL, stStoredProcedure, stAutoSQL);
+
+ TDACommandType = (cmdInsert, cmdDelete, cmdUpdate);
+ TDACommandTypes = set of TDACommandType;
+
+ TDAPersistFormat = (pfBinary, pfXML);
+
+ TDAParamType = (daptUnknown, daptInput, daptOutput, daptInputOutput, daptResult);
+
+ TDADataType = (datUnknown,
+ datString,
+ datDateTime,
+ datFloat,
+ datCurrency,
+ datAutoInc,
+ datInteger,
+ datLargeInt,
+ datBoolean,
+ datMemo,
+ datBlob,
+ datWideString,
+ datWideMemo,
+ datLargeAutoInc,
+ datByte,
+ datShortInt,
+ datWord,
+ datSmallInt,
+ datCardinal,
+ datLargeUInt,
+ datGuid,
+ datXml,
+ datDecimal,
+ datSingleFloat);
+
+ { Forwards }
+ TDASQLCommand = class;
+ TDAStatementCollection = class;
+ TDASQLCommandCollection = class;
+ TDAParamCollection = class;
+ TDAJoinConditionCollection = class;
+ TDAUnionSourceTableCollection = class;
+
+ { TDAColumnMapping }
+ TDAColumnMapping = class(TInterfacedCollectionItem)
+ private
+ fDatasetField: string;
+ fTableField: string;
+ fSQLOrigin: string;
+ function GetSQLOrigin: string;
+ function StoreSQLOrigin: Boolean;
+ procedure SetDatasetField(const Value: string);
+ procedure SetSQLOrigin(const Value: string);
+ procedure SetTableField(const Value: string);
+
+ public
+ procedure Assign(aSource: TPersistent); override;
+ procedure AssignFieldMapping(aSource: TPersistent);
+
+ published
+ property DatasetField: string read fDatasetField write SetDatasetField;
+ property TableField: string read fTableField write SetTableField;
+ property SQLOrigin: string read GetSQLOrigin write SetSQLOrigin stored StoreSQLOrigin;
+ end;
+
+ { TDAColumnMappingCollection }
+ TDAColumnMappingCollection = class(TSearcheableCollection)
+ private
+ function GetColumnMappings(Index: integer): TDAColumnMapping;
+ procedure SetColumnMappings(Index: integer;
+ const Value: TDAColumnMapping);
+
+ protected
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+
+ public
+ constructor Create(aOwner: TPersistent);
+
+ procedure AssignColumnMapping(aSource: TPersistent);
+
+ function Add: TDAColumnMapping; reintroduce;
+ function FindMappingByDatasetField(const aDatasetField: string): TDAColumnMapping;
+ function MappingByDatasetField(const aDatasetField: string): TDAColumnMapping;
+ function MappingByTableField(const aTableField: string): TDAColumnMapping;
+
+ property ColumnMappings[Index: integer]: TDAColumnMapping read GetColumnMappings write SetColumnMappings; default;
+ end;
+
+ { TDAStatement }
+ TDAStatement = class(TCollectionItem)
+ private
+ fSQL: string;
+ fStatementType: TDASQLStatementType;
+ fConnection: string;
+ fColumnMappings: TDAColumnMappingCollection;
+ fTargetTable: string;
+ fName: string;
+ fConnectionType: string;
+ fDefault: boolean;
+
+ procedure SetColumnMappings(const Value: TDAColumnMappingCollection);
+ function GetStatementCollection: TDAStatementCollection;
+ procedure SetSQL(const Value: string);
+ function GetNeedsParams: boolean;
+ function StoreSQL: Boolean;
+
+ protected
+ function GetDisplayName: string; override;
+
+ public
+ constructor Create(Collection: TCollection); override;
+ destructor Destroy; override;
+
+ procedure Assign(aSource: TPersistent); override;
+
+ property StatementCollection: TDAStatementCollection read GetStatementCollection;
+ property NeedsParams: boolean read GetNeedsParams;
+ published
+ property Connection: string read fConnection write fConnection;
+ property ConnectionType: string read fConnectionType write fConnectionType;
+ property Default: boolean read fDefault write fDefault default false;
+ property TargetTable: string read fTargetTable write fTargetTable;
+ property Name: string read fName write fName;
+ property SQL: string read fSQL write SetSQL stored StoreSQL;
+ property StatementType: TDASQLStatementType read fStatementType write fStatementType;
+ property ColumnMappings: TDAColumnMappingCollection read fColumnMappings write SetColumnMappings;
+ end;
+
+ { TDAStatementCollection }
+ TDAStatementCollection = class(TSearcheableCollection)
+ private
+ fSQLCommand: TDASQLCommand;
+
+ function GetStatements(Index: integer): TDAStatement;
+ procedure SetStatements(Index: integer; const Value: TDAStatement);
+
+ protected
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+
+ public
+ constructor Create(aOwner: TPersistent; aSQLCommand: TDASQLCommand);
+
+ function Add: TDAStatement; reintroduce;
+ function FindItem(const aName: string; const aStatementName: string=''; const aConnectionType: string = ''; aReturnDefault: Boolean = false): TDAStatement; reintroduce;
+
+ function StatementByName(const aName: string): TDAStatement;
+
+ property SQLCommand: TDASQLCommand read fSQLCommand;
+ property Statements[Index: integer]: TDAStatement read GetStatements write SetStatements; default;
+ end;
+
+ { TDAUpdateRule }
+ TDAUpdateFailureBehavior = (fbRaiseException, fbLogAndContinue, fbIgnoreAndContinue);
+
+ TDAUpdateRule = class(TCollectionItem)
+ private
+ fDatasetName: string;
+ fName: string;
+ fFailureBehavior: TDAUpdateFailureBehavior;
+ fDoInsert: boolean;
+ fDoUpdate: boolean;
+ fDoDelete: boolean;
+ function GetChangeTypes: TDAChangeTypes;
+
+ protected
+ function GetDisplayName : string; override;
+
+ public
+ constructor Create(aCollection : TCollection); override;
+
+ procedure Assign(aSource: TPersistent); override;
+
+ property ChangeTypes: TDAChangeTypes read GetChangeTypes;
+
+ published
+ property Name : string read fName write fName;
+ property DoUpdate : boolean read fDoUpdate write fDoUpdate default True;
+ property DoInsert : boolean read fDoInsert write fDoInsert default True;
+ property DoDelete : boolean read fDoDelete write fDoDelete default True;
+ property DatasetName : string read fDatasetName write fDatasetName;
+
+ property FailureBehavior : TDAUpdateFailureBehavior read fFailureBehavior write fFailureBehavior;
+ end;
+
+ { TDAUpdateRuleCollection }
+ TDAUpdateRuleCollection = class(TSearcheableCollection)
+ private
+ function GetUpdateRules(Index: integer): TDAUpdateRule;
+ protected
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner : TComponent);
+
+ function Add: TDAUpdateRule; reintroduce;
+ function UpdateRuleByName(const aName : string) : TDAUpdateRule;
+
+ property UpdateRules[Index : integer] : TDAUpdateRule read GetUpdateRules; default;
+ end;
+
+ { TDABaseField }
+ TDABaseField = class(TInterfacedCollectionItem)
+ private
+ fDictionaryEntry: string;
+ fSize: integer;
+ fDescription,
+ fName: string;
+ fDataType: TDADataType;
+ fValue: Variant;
+ fBlobType: TDABlobType;
+ fGeneratorName : string;
+ FDecimalPrecision: Integer;
+ FDecimalScale: Integer;
+ FTag: integer;
+ //procedure FixSize;
+ procedure UpdateValueType;
+
+ protected
+ function MergeDatadictionaries: Boolean;
+ function GetBlobSize: Integer; virtual;
+ function GetName: string; virtual;
+ procedure SetName(const Value: string); virtual;
+ function GetDataType: TDADataType;
+ procedure SetDataType(aValue: TDADataType);
+ function GetSize: integer;
+ procedure SetSize(Value: integer);
+ function GetValue: Variant; virtual;
+ procedure SetValue(const aValue: Variant); virtual;
+ function GetDescription: string;
+ procedure SetDescription(const Value: string);
+ function StoreBlobType : boolean;
+ function GetBlobType: TDABlobType;
+ procedure SetBlobType(const Value: TDABlobType); virtual;
+ function GetGeneratorName: string;
+ procedure SetGeneratorName(const aValue: string);
+
+ function GetAsBoolean: boolean; virtual;
+ function GetAsCurrency: currency; virtual;
+ function GetAsDateTime: TDateTime; virtual;
+ function GetAsFloat: double; virtual;
+ function GetAsInteger: integer; virtual;
+ function GetAsString: string; virtual;
+ function GetAsVariant: variant; virtual;
+ function GetAsLargeInt: int64; virtual;
+ function GetAsWideString: Unicodestring; virtual;
+ function GetAsByte: Byte; virtual;
+ function GetAsCardinal: Cardinal; virtual;
+ function GetAsDecimal: TBcd; virtual;
+ function GetAsGuid: TGUID; virtual;
+ function GetAsLargeUInt: UInt64; virtual;
+ function GetAsShortInt: ShortInt; virtual;
+ function GetAsSingle: Single; virtual;
+ function GetAsSmallInt: SmallInt; virtual;
+ function GetAsWord: Word; virtual;
+ function GetAsXml: IXMLNode; virtual;
+ function GetAsAnsiString: Ansistring; virtual;
+ procedure SetAsAnsiString(const aValue: Ansistring); virtual;
+ procedure SetAsByte(const Value: Byte); virtual;
+ procedure SetAsCardinal(const Value: Cardinal); virtual;
+ procedure SetAsDecimal(const Value: TBcd); virtual;
+ procedure SetAsGuid(const Value: TGUID); virtual;
+ procedure SetAsLargeUInt(const Value: UInt64); virtual;
+ procedure SetAsShortInt(const Value: ShortInt); virtual;
+ procedure SetAsSingle(const Value: Single); virtual;
+ procedure SetAsSmallInt(const Value: SmallInt); virtual;
+ procedure SetAsWord(const Value: Word); virtual;
+ procedure SetAsXml(const Value: IXMLNode); virtual;
+ procedure SetAsBoolean(const aValue: boolean); virtual;
+ procedure SetAsCurrency(const aValue: currency); virtual;
+ procedure SetAsDateTime(const aValue: TDateTime); virtual;
+ procedure SetAsString(const aValue: string); virtual;
+ procedure SetAsVariant(const aValue: variant); virtual;
+ procedure SetAsFloat(const aValue: double); virtual;
+ procedure SetAsInteger(const aValue: integer); virtual;
+ procedure SetAsLargeInt(const aValue: Int64); virtual;
+ procedure SetAsWideString(const aValue: Unicodestring); virtual;
+ function GetIsNull: boolean; virtual;
+
+ function StoreDataType: Boolean;
+ function StoreDescription: Boolean;
+ function StoreGeneratorName: Boolean;
+ function StoreSize: Boolean;
+ function StoreDecimalPrecision: Boolean;
+ function StoreDecimalScale: Boolean;
+
+ function GetDictionaryEntry: string;
+ procedure SetDictionaryEntry(const Value: string);
+ function FindDictionaryField: TDACustomField;
+ function GetDictionaryField: TDACustomField;
+
+ // Internal
+ function GetDisplayName: string; override;
+ procedure SetDisplayName(const Value: string); override;
+ function GetDecimalPrecision: Integer; virtual;
+ procedure SetDecimalPrecision(const Value: Integer);virtual;
+ function GetDecimalScale: Integer;virtual;
+ procedure SetDecimalScale(const Value: Integer);virtual;
+ function IsCompatibleV4: boolean; virtual;
+ public
+ property Value: Variant read GetValue write SetValue;
+
+ procedure Assign(Source: TPersistent); override;
+ procedure AssignField(Source: TDABaseField); virtual;
+
+ function HasValidDictionaryField: Boolean;
+
+ procedure Clear;
+
+ function GetNamePath: string; override;
+
+ property AsBoolean: boolean read GetAsBoolean write SetAsBoolean;
+ property AsCurrency: currency read GetAsCurrency write SetAsCurrency;
+ property AsDateTime: TDateTime read GetAsDateTime write SetAsDateTime; //null->0
+ property AsFloat: double read GetAsFloat write SetAsFloat; //null->0
+ property AsInteger: integer read GetAsInteger write SetAsInteger; //null->0
+ property AsString: string read GetAsString write SetAsString; //null->''
+ property AsAnsiString: Ansistring read GetAsAnsiString write SetAsAnsiString; //null->''
+ property AsVariant: variant read GetAsVariant write SetAsVariant;
+ property AsLargeInt: Int64 read GetAsLargeInt write SetAsLargeInt;
+ property AsWideString: UnicodeString read GetAsWideString write SetAsWideString;
+ property BlobSize: Integer read GetBlobSize;
+ property IsNull: boolean read GetIsNull;
+ property AsByte: Byte read GetAsByte write SetAsByte;
+ property AsShortInt: ShortInt read GetAsShortInt write SetAsShortInt;
+ property AsWord: Word read GetAsWord write SetAsWord;
+ property AsSmallInt: SmallInt read GetAsSmallInt write SetAsSmallInt;
+ property AsCardinal: Cardinal read GetAsCardinal write SetAsCardinal;
+ property AsLargeUInt: UInt64 read GetAsLargeUInt write SetAsLargeUInt;
+ property AsGuid: TGUID read GetAsGuid write SetAsGuid;
+ property AsDecimal: TBcd read GetAsDecimal write SetAsDecimal;
+ property AsXml: IXMLNode read GetAsXml write SetAsXml;
+ property AsSingle: Single read GetAsSingle write SetAsSingle;
+
+ property DictionaryEntry: string read GetDictionaryEntry write SetDictionaryEntry;
+ property Tag: integer read FTag write FTag;
+ published
+ property Name: string read GetName write SetName;
+ property DataType: TDADataType read GetDataType write SetDataType default datUnknown;
+ property Size: integer read GetSize write SetSize default 0;
+ property Description: string read GetDescription write SetDescription;
+ property BlobType: TDABlobType read GetBlobType write SetBlobType default dabtUnknown;
+ property GeneratorName : string read GetGeneratorName write SetGeneratorName;
+ property DecimalPrecision: Integer read GetDecimalPrecision write SetDecimalPrecision stored StoreDecimalPrecision;
+ property DecimalScale: Integer read GetDecimalScale write SetDecimalScale stored StoreDecimalScale;
+ end;
+
+ { TDACustomField }
+ TDAFieldNotifyEvent = procedure(Sender: TDACustomField) of object;
+ TDAFieldGetTextEvent = procedure(Sender: TDACustomField; var Text: string; DisplayText: boolean) of object;
+ TDAFieldSetTextEvent = procedure(Sender: TDACustomField; const Text: string) of object;
+
+ TDACustomFieldCollection = class;
+
+ IDANativeField = interface;
+ IDASQLCommandNativeObject = interface;
+
+ TDACustomField = class(TDABaseField)
+ private
+ fField: TField;
+ fTableField: string;
+ fCustomAttributes: TStringList;
+
+ fRequired: boolean;
+ fInPrimaryKey: boolean;
+ fRegExpression: string;
+ fDefaultValue: string;
+ fDisplayWidth: integer;
+ fDisplayLabel: string;
+ fReadOnly: boolean;
+ fVisible: boolean;
+ fEditMask: string;
+ fLogChanges: boolean;
+ fCalculated: boolean;
+ fOnChange: TDAFieldNotifyEvent;
+ fOnValidate: TDAFieldNotifyEvent;
+ fDisplayFormat: string;
+ fBusinessClassID: string;
+ fAlignment : TAlignment;
+ fEditFormat : string;
+ fLookupCache: boolean;
+ fLookupKeyFields: string;
+ fLookupResultField: string;
+ fKeyFields: string;
+ fLookupSource: TDataSource;
+ fLookup: boolean;
+ fServerAutoRefresh: boolean;
+ fSQLOrigin: string;
+ fServerCalculated: Boolean;
+ fExpression: string;
+ FNativeField: IDANativeField;
+
+ function GetDisplayLabel: string;
+
+ function StoreDisplayLabel: Boolean;
+
+ function StoreProperties : boolean;
+
+ function GetDefaultValue: string;
+ function GetDisplayWidth: integer;
+ function GetEditMask: string;
+ function GetReadOnly: boolean;
+ function GetVisible: boolean;
+ //procedure SetBusinessRulesID(const Value: string);
+ //function GetBusinessRulesID: string;
+ function GetDisplayFormat: string;
+ function GetAlignment: TAlignment;
+ function GetEditFormat: string;
+ procedure SetAlignment(const Value: TAlignment);
+ procedure SetEditFormat(const Value: string);
+
+ procedure SetKeyFields(const Value: string);
+ procedure SetLookupCache(const Value: boolean);
+ procedure SetLookupKeyFields(const Value: string);
+ procedure SetLookupResultField(const Value: string);
+ procedure SetLookupSource(const Value: TDataSource);
+ procedure SetCalculated(const Value: boolean);
+ procedure SetLookup(const Value: boolean);
+ function GetFieldCollection: TDACustomFieldCollection;
+ {function GetNotNull: boolean;
+ procedure SetNotNull(const Value: boolean);}
+ function GetServerAutoRefresh: boolean;
+ procedure SetServerAutoRefresh(const Value: boolean);
+ function GetLogChanges: boolean;
+ function GetOldValue: Variant;
+ function GetSQLOrigin: string;
+ function GetBusinessClassID: string;
+ procedure SetBusinessClassID(const Value: string);
+ procedure SetServerCalculated(const Value: Boolean);
+ procedure SetExpression(const Value: string);
+ function StoredServerCalculated: Boolean;
+ function StoredExpression: Boolean;
+
+ protected
+ function GetOwner: TPersistent; override;
+
+ procedure SetName(const Value: string); override;
+
+ function GetInPrimaryKey: boolean;
+ function GetRegExpression: string;
+ function GetRequired: boolean;
+ procedure SetInPrimaryKey(const Value: boolean);
+ procedure SetRegExpression(const Value: string);
+ function GetBlobSize: Integer; override;
+ function GetValue: Variant; override;
+ procedure SetValue(const Value: Variant); override;
+ function GetTableField: string;
+ procedure SetTableField(const Value: string);
+ function GetCustomAttributes: TStrings;
+ procedure SetCustomAttributes(const Value: TStrings);
+ procedure SetDisplayFormat(const Value: string);
+ procedure SetBlobType(const Value: TDABlobType); override;
+
+ procedure SetRequired(const aValue: boolean);
+ procedure SetDisplayLabel(const aValue: string);
+ procedure SetVisible(const aValue: boolean);
+ procedure SetDisplayWidth(const aValue: integer);
+ procedure SetEditMask(const aValue: string);
+ procedure SetReadOnly(const aValue: boolean);
+
+ // Event hooks
+ procedure InternalOnChange(Sender: TField);
+ procedure InternalOnValidate(Sender: TField);
+
+ function GetAsBoolean: boolean; override;
+ function GetAsCurrency: currency; override;
+ function GetAsDateTime: TDateTime; override;
+ function GetAsFloat: double; override;
+ function GetAsInteger: integer; override;
+ function GetAsString: string; override;
+ function GetAsVariant: variant; override;
+ function GetAsLargeInt: int64; override;
+ function GetAsWideString: Unicodestring; override;
+ function GetAsByte: Byte; override;
+ function GetAsCardinal: Cardinal; override;
+ function GetAsDecimal: TBcd; override;
+ function GetAsGuid: TGUID; override;
+ function GetAsLargeUInt: UInt64; override;
+ function GetAsShortInt: ShortInt; override;
+ function GetAsSingle: Single; override;
+ function GetAsSmallInt: SmallInt; override;
+ function GetAsWord: Word; override;
+ function GetAsXml: IXMLNode; override;
+ procedure SetAsByte(const Value: Byte); override;
+ procedure SetAsCardinal(const Value: Cardinal); override;
+ procedure SetAsDecimal(const Value: TBcd); override;
+ procedure SetAsGuid(const Value: TGUID); override;
+ procedure SetAsLargeUInt(const Value: UInt64); override;
+ procedure SetAsShortInt(const Value: ShortInt); override;
+ procedure SetAsSingle(const Value: Single); override;
+ procedure SetAsSmallInt(const Value: SmallInt); override;
+ procedure SetAsWord(const Value: Word); override;
+ procedure SetAsXml(const Value: IXMLNode); override;
+ procedure SetAsBoolean(const aValue: boolean); override;
+ procedure SetAsCurrency(const aValue: currency); override;
+ procedure SetAsDateTime(const aValue: TDateTime); override;
+ procedure SetAsString(const aValue: string); override;
+ procedure SetAsVariant(const aValue: variant); override;
+ procedure SetAsFloat(const aValue: double); override;
+ procedure SetAsInteger(const aValue: integer); override;
+ procedure SetAsLargeInt(const aValue: Int64); override;
+ procedure SetAsWideString(const aValue: Unicodestring); override;
+ function GetAsAnsiString: Ansistring; override;
+ procedure SetAsAnsiString(const aValue: Ansistring); override;
+ function GetIsNull: boolean; override;
+ function GetDecimalPrecision: Integer; override;
+ procedure SetDecimalPrecision(const Value: Integer);override;
+ function GetDecimalScale: Integer;override;
+ procedure SetDecimalScale(const Value: Integer);override;
+ function IsCompatibleV4: boolean; override;
+ public
+ constructor Create(Collection: TCollection); override;
+ destructor Destroy; override;
+
+ function GetNamePath: string; override;
+
+ procedure Bind(aField: TField); overload;
+ procedure Bind(aField: IDANativeField); overload;
+ procedure Unbind;
+
+ procedure SaveToStream(const aStream: IROStream); overload;
+ procedure LoadFromStream(const aStream: IROStream); overload;
+ procedure SaveToStream(const aStream: TStream); overload;
+ procedure LoadFromStream(const aStream: TStream); overload;
+ procedure SaveToFile(const aFileName: string);
+ procedure LoadFromFile(const aFileName: string);
+
+ property FieldCollection : TDACustomFieldCollection read GetFieldCollection;
+
+ procedure FocusControl;
+
+ property TableField: string read GetTableField write SetTableField;
+ property SQLOrigin: string read GetSQLOrigin write fSQLOrigin;
+
+ procedure Assign(Source: TPersistent); override;
+ procedure AssignField(Source: TDABaseField); override;
+
+ property OldValue : Variant read GetOldValue;
+ property BindedField: TField read FField;
+ Property BindedNativeField: IDANativeField read FNativeField;
+ public
+ property OnChange: TDAFieldNotifyEvent read fOnChange write fOnChange;
+ property OnValidate: TDAFieldNotifyEvent read fOnValidate write fOnValidate;
+
+ property InPrimaryKey: boolean read GetInPrimaryKey write SetInPrimaryKey default False;
+
+ property Calculated: boolean read fCalculated write SetCalculated default False;
+ property Expression: string read fExpression write SetExpression stored StoredExpression;
+ property ServerCalculated: Boolean read fServerCalculated write SetServerCalculated stored StoredServerCalculated default False;
+ property Lookup : boolean read fLookup write SetLookup default False;
+
+ property LookupSource : TDataSource read fLookupSource write SetLookupSource;
+ property LookupKeyFields : string read fLookupKeyFields write SetLookupKeyFields;
+ property LookupResultField : string read fLookupResultField write SetLookupResultField;
+ property KeyFields : string read fKeyFields write SetKeyFields;
+ property LookupCache : boolean read fLookupCache write SetLookupCache default False;
+
+ published
+
+ property LogChanges: boolean read GetLogChanges write fLogChanges stored StoreProperties default true;
+
+ property RegExpression: string read GetRegExpression write SetRegExpression stored StoreProperties;
+ property DefaultValue: string read GetDefaultValue write fDefaultValue stored StoreProperties;
+ property Required: boolean read GetRequired write SetRequired stored StoreProperties default FALSE;
+ property DisplayWidth: integer read GetDisplayWidth write SetDisplayWidth stored StoreProperties default 0;
+ property DisplayLabel: string read GetDisplayLabel write SetDisplayLabel stored StoreDisplayLabel;
+ property EditMask: string read GetEditMask write SetEditMask stored StoreProperties;
+ property Visible: boolean read GetVisible write SetVisible stored StoreProperties default TRUE;
+ property ReadOnly: boolean read GetReadOnly write SetReadOnly stored StoreProperties default FALSE;
+ property CustomAttributes: TStrings read GetCustomAttributes write SetCustomAttributes stored StoreProperties;
+ property DisplayFormat: string read GetDisplayFormat write SetDisplayFormat stored StoreProperties;
+ //property BusinessRulesID : string read GetBusinessRulesID write SetBusinessRulesID stored StoreProperties;
+ property BusinessClassID : string read GetBusinessClassID write SetBusinessClassID stored StoreProperties;
+ property EditFormat : string read GetEditFormat write SetEditFormat stored StoreProperties;
+ property Alignment : TAlignment read GetAlignment write SetAlignment stored StoreProperties default taLeftJustify;
+ property ServerAutoRefresh : boolean read GetServerAutoRefresh write SetServerAutoRefresh default FALSE;
+ end;
+
+ TDAField = class(TDACustomField)
+ protected
+ function GetDisplayName: string; override;
+ published
+ property DictionaryEntry;
+
+ property InPrimaryKey;
+ property Calculated;
+ property Expression;
+ property ServerCalculated;
+
+ property OnChange;
+ property OnValidate;
+
+ property Lookup;
+
+ property LookupSource;
+ property LookupKeyFields;
+ property LookupResultField;
+ property KeyFields;
+ property LookupCache;
+ end;
+
+ TDADataDictionaryField = class(TDACustomField)
+ end;
+
+ TDAFieldClass = class of TDACustomField;
+
+ { TDACustomFieldCollection }
+ TDACustomFieldCollection = class(TSearcheableInterfacedCollection)
+ private
+ fDataDictionary: IDADataDictionary;
+ fFieldEventsDisabled: boolean;
+ fFieldBeforeUpdate,
+ fFieldAfterUpdate: TDAFieldNotifyEvent;
+ fIsCompatibleV4: boolean;
+ function GetFields(Index: integer): TDACustomField;
+ procedure SetFields(Index: integer; const Value: TDACustomField);
+ protected
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner: TPersistent; aFieldClass: TDAFieldClass);
+
+ procedure Bind(aDataset: TDataset);overload;
+ procedure Bind(aNativeObject: IDASQLCommandNativeObject);overload;
+ procedure Unbind;
+
+ property FieldEventsDisabled:boolean read fFieldEventsDisabled write fFieldEventsDisabled default false;
+
+ function Add: TDAField; reintroduce; overload;
+ function Add(const aName: string; aType: TDADataType; aSize: integer = 0): TDACustomField; overload;
+
+ procedure Assign(Source: TPersistent); override;
+ procedure AssignFieldCollection(Source: TDACustomFieldCollection);
+
+ function FieldByName(const aName: string): TDACustomField;
+ function FindField(const aName: string): TDACustomField;
+
+ property DataDictionary: IDADataDictionary read fDataDictionary write fDataDictionary;
+
+ property Fields[Index: integer]: TDACustomField read GetFields write SetFields; default;
+
+ property OnFieldBeforeUpdate: TDAFieldNotifyEvent read fFieldBeforeUpdate write fFieldBeforeUpdate;
+ property OnFieldAfterUpdate: TDAFieldNotifyEvent read fFieldAfterUpdate write fFieldAfterUpdate;
+ property IsCompatibleV4: boolean read fIsCompatibleV4 write fIsCompatibleV4;
+ end;
+
+ TDAFieldCollection = class(TDACustomFieldCollection)
+ private
+ function GetFields(Index: integer): TDAField;
+ procedure SetFields(Index: integer; const Value: TDAField);
+ public
+ constructor Create(aOwner: TPersistent);
+
+ function FieldByName(const aName: string): TDAField; reintroduce;
+ function FindField(const aName: string): TDAField;
+ property Fields[Index: integer]: TDAField read GetFields write SetFields; default;
+ end;
+
+ TDADriverForeignKey = class(TInterfacedCollectionItem)
+ private
+ fValues:array[0..3] of string;
+ fName: string;
+ function GetValue(const Index: Integer): string;
+ procedure SetValue(const Index: Integer; const Value: string);
+ published
+ property Name: string read fName write fName;
+ property FKTable: string index 0 read GetValue write SetValue;
+ property PKTable: string index 1 read GetValue write SetValue;
+ property FKField: string index 2 read GetValue write SetValue;
+ property PKField: string index 3 read GetValue write SetValue;
+ end;
+
+ TDADriverForeignKeyCollection = class(TInterfacedCollection)
+ private
+ function GetForeignKeys(Index: integer): TDADriverForeignKey;
+ procedure SetForeignKeys(Index: integer; const Value: TDADriverForeignKey);
+ public
+ constructor Create(aOwner: TPersistent);
+ function Add: TDADriverForeignKey; reintroduce; overload;
+
+ //procedure Assign(Source: TPersistent); override;
+ //procedure AssignFieldCollection(Source: TDACustomFieldCollection);
+
+ property ForeignKeys[Index: integer]: TDADriverForeignKey read GetForeignKeys write SetForeignKeys; default;
+ end;
+
+ TDADataDictionaryFieldCollection = class(TDACustomFieldCollection)
+ end;
+
+ { TDAParam }
+ TDAParam = class(TDABaseField)
+ private
+ fParamType: TDAParamType;
+
+ function GetParamType: TDAParamType;
+ procedure SetParamType(Value: TDAParamType);
+ protected
+ procedure SetValue(const aValue: Variant); override;
+ public
+ procedure SaveToStream(const aStream: IROStream);
+ procedure LoadFromStream(const aStream: IROStream);
+ procedure SaveToFile(const aFileName: string);
+ procedure LoadFromFile(const aFileName: string);
+ procedure AssignField(Source: TDABaseField); override;
+ procedure AssignParam(Source: TDAParam); virtual;
+
+ published
+ property Value stored true;
+ property AsString stored false;
+ property ParamType: TDAParamType read GetParamType write SetParamType default daptUnknown;
+ end;
+
+ { TDAParamCollection }
+ TDAParamCollection = class(TSearcheableInterfacedCollection) // They are used also by the driver commands/datasets
+ private
+ function GetParams(Index: integer): TDAParam;
+ procedure SetParams(Index: integer; const Value: TDAParam);
+ function GetHasInputParams: boolean;
+
+ protected
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner: TPersistent);
+
+ procedure WriteValues(OutputParams: TParams);
+ procedure ReadValues(InputParams: TParams);
+
+ function Add: TDAParam; reintroduce;
+
+ function ParamByName(const aName: string): TDAParam;
+ function FindParam(const aParamName: string): TDAParam;
+
+ procedure Assign(Source: TPersistent); override;
+ procedure AssignParamCollection(Source: TDAParamCollection);
+
+ property Params[Index: integer]: TDAParam read GetParams write SetParams; default;
+ property HasInputParams:boolean read GetHasInputParams;
+ end;
+
+ { TDASQLCommand }
+ TDASQLCommand = class(TCollectionItem)
+ private
+ fName: string;
+ fDescription: string;
+ fStatements: TDAStatementCollection;
+ fParams: TDAParamCollection;
+ fCustomAttributes: TStrings;
+ fIsPublic: Boolean;
+ FDynamicWhereXML: UnicodeString;
+
+ procedure SetName(const Value: string);
+ procedure SetCustomAttributes(const Value: TStrings);
+ procedure SetDynamicWhereXML(const Value: UnicodeString);
+
+ protected
+ function GetDisplayName: string; override;
+ procedure SetDisplayName(const Value: string); override;
+ function GetParams: TDAParamCollection; virtual;
+ procedure SetParams(const Value: TDAParamCollection); virtual;
+ function GetStatements(): TDAStatementCollection; virtual;
+ procedure SetStatements(const Value: TDAStatementCollection); virtual;
+ function GetSQLCommandCollection: TDASQLCommandCollection; virtual;
+ public
+ constructor Create(Collection: TCollection); override;
+ destructor Destroy; override;
+
+ function ParamByName(const aName: string): TDAParam;
+
+ procedure Assign(aSource: TPersistent); override;
+
+ property SQLCommandCollection: TDASQLCommandCollection read GetSQLCommandCollection;
+
+ published
+ property IsPublic: Boolean read fIsPublic write fIsPublic default True;
+ property Params: TDAParamCollection read GetParams write SetParams;
+ property Statements: TDAStatementCollection read GetStatements write SetStatements;
+ property Name: string read fName write SetName;
+ property Description: string read fDescription write fDescription;
+ property CustomAttributes: TStrings read fCustomAttributes write SetCustomAttributes;
+ property DynamicWhereXML : UnicodeString read FDynamicWhereXML write SetDynamicWhereXML;
+ end;
+
+ TDASQLCommandClass = class of TDASQLCommand;
+
+ { TDASQLCommandCollection }
+ TDASQLCommandCollection = class(TSearcheableCollection)
+ private
+ function GetSQLCommands(Index: integer): TDASQLCommand;
+ procedure SetSQLCommands(Index: integer; const Value: TDASQLCommand);
+
+ protected
+ function GetItemClass: TDASQLCommandClass; virtual;
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner: TComponent);
+
+ function Add: TDASQLCommand; reintroduce;
+
+ function SQLCommandByName(const aName: string): TDASQLCommand;
+
+ property SQLCommands[Index: integer]: TDASQLCommand read GetSQLCommands write SetSQLCommands; default;
+ end;
+
+ TROSEScriptLanguage = (rslPascalScript);
+
+ TDABusinessRuleScript = class(TPersistent)
+ private
+ fScriptLanguage: TROSEScriptLanguage;
+ fScript: string;
+ fDescription: string;
+ published
+ property Script: string read fScript write fScript;
+ property ScriptLanguage: TROSEScriptLanguage read fScriptLanguage write fScriptLanguage default rslPascalScript;
+ property Description: string read fDescription write fDescription;
+ end;
+
+ TDAClientBusinessRuleScript = class(TDABusinessRuleScript)
+ private
+ fRunOnClientAndServer: boolean;
+ fCompileOnServer: boolean;
+ published
+ constructor Create();
+ property CompileOnServer: boolean read fCompileOnServer write fCompileOnServer default true;
+ property RunOnClientAndServer: boolean read fRunOnClientAndServer write fRunOnClientAndServer default true;
+ end;
+
+ { TDADatasetRelationship }
+ TDADatasetRelationship = class(TCollectionItem)
+ private
+ fDetailFields: string;
+ fMasterFields: string;
+ fDetailDatasetName: string;
+ fMasterDatasetName: string;
+ fName: string;
+ fDescription: string;
+ fRelationshipType: TDARelationshipType;
+ protected
+ function GetDisplayName : string; override;
+ public
+ constructor Create(Collection: TCollection); override;
+ published
+ procedure Assign(Source : TPersistent); override;
+
+ property Name : string read fName write fName;
+ property MasterDatasetName : string read fMasterDatasetName write fMasterDatasetName;
+ property MasterFields : string read fMasterFields write fMasterFields;
+ property DetailDatasetName : string read fDetailDatasetName write fDetailDatasetName;
+ property DetailFields : string read fDetailFields write fDetailFields;
+ property Description: string read fDescription write fDescription;
+ property RelationshipType: TDARelationshipType read fRelationshipType write fRelationshipType;
+ end;
+
+ { TDADatasetRelationshipList }
+ TDADatasetRelationshipList = class(TList)
+ private
+ function GetItems(Index: integer): TDADatasetRelationship;
+ protected
+ public
+ function Add(aRelationship : TDADatasetRelationship) : integer; reintroduce;
+
+ property Items[Index : integer] : TDADatasetRelationship read GetItems; default;
+ end;
+
+ { TDADatasetRelationshipCollection }
+ TDADatasetRelationshipCollection = class(TSearcheableCollection)
+ private
+ function GetRelationShips(Index: integer): TDADatasetRelationship;
+ protected
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner : TComponent);
+ procedure GetDetails(const aMasterDatasetName: string; aList: TDADatasetRelationshipList);
+
+ function Add: TDADatasetRelationship; overload;
+ function RelationshipExists(const aMasterDatasetName, aDetailDatasetName, aMasterFields, aDetailFields: string): Boolean;
+ function RelationShipByName(const aName : string) : TDADatasetRelationship;
+
+ property RelationShips[Index : integer] : TDADatasetRelationship read GetRelationShips; default;
+ end;
+
+ { TDADataset }
+ TDADataset = class(TDASQLCommand)
+ private
+ fFields: TDAFieldCollection;
+ fBusinessClassID: string;
+ fBusinessRulesServer: TDABusinessRuleScript;
+ fBusinessRulesClient: TDAClientBusinessRuleScript;
+ fReadOnly: Boolean;
+
+ procedure SetFields(const Value: TDAFieldCollection);
+ procedure SetBusinessRulesClient(const Value: TDAClientBusinessRuleScript);
+ procedure SetBusinessRulesServer(const Value: TDABusinessRuleScript);
+
+ protected
+ public
+ constructor Create(Collection: TCollection); override;
+ destructor Destroy; override;
+
+ procedure Assign(aSource: TPersistent); override;
+
+ function FieldByName(const aName: string): TDAField;
+ function FindField(const aName: string): TDAField;
+ published
+ property Fields: TDAFieldCollection read fFields write SetFields;
+ property BusinessClassID : string read fBusinessClassID write fBusinessClassID;
+ property ReadOnly: Boolean read fReadOnly write fReadOnly default False;
+
+ property BusinessRulesClient: TDAClientBusinessRuleScript read fBusinessRulesClient write SetBusinessRulesClient;
+ property BusinessRulesServer: TDABusinessRuleScript read fBusinessRulesServer write SetBusinessRulesServer;
+ end;
+
+ { TDADatasetCollection }
+ TDADatasetCollection = class(TDASQLCommandCollection)
+ private
+ function GetDatasets(Index: integer): TDADataset;
+ procedure SetDatasets(Index: integer; const Value: TDADataset);
+ protected
+ function GetItemClass: TDASQLCommandClass; override;
+
+ public
+ function Add: TDADataset; reintroduce;
+
+ function DatasetByName(const aName: string): TDADataset;
+ function FindDatasetByName(const aName: string): TDADataset;
+
+ property Datasets[Index: integer]: TDADataset read GetDatasets write SetDatasets; default;
+ end;
+
+ { TDAJoinSourceTable }
+ TDAJoinSourceTable = class(TCollectionItem)
+ private
+ fName: String;
+ fJoinType: TDAJoinType;
+ fJoinConditions: TDAJoinConditionCollection;
+ protected
+ function GetDisplayName : string; override;
+ procedure SetName(const Value: string);
+ public
+ constructor Create(Collection: TCollection); override;
+ destructor Destroy; override;
+ procedure Assign(aSource: TPersistent); override;
+ published
+ property Name: string read fName write SetName;
+ property JoinType: TDAJoinType read fJoinType write fJoinType;
+ property JoinConditions: TDAJoinConditionCollection read fJoinConditions;
+ end;
+
+ { TDAJoinSourceTableCollection }
+ TDAJoinSourceTableCollection = class(TSearcheableCollection)
+ private
+ function GetJoinSourceTables(Index: integer): TDAJoinSourceTable;
+ procedure SetJoinSourceTables(Index: integer; const Value: TDAJoinSourceTable);
+ protected
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner: TPersistent);
+ function Add: TDAJoinSourceTable; reintroduce;
+ function JoinSourceTableByName(const aName: string): TDAJoinSourceTable;
+ property JoinSourceTables[Index:Integer]: TDAJoinSourceTable read GetJoinSourceTables write SetJoinSourceTables;
+ end;
+
+ { TDAJoinCondition }
+ TDAJoinCondition = class(TCollectionItem)
+ private
+ fFromTableName: String;
+ fFromFieldName: String;
+ fToTableName: String;
+ fToFieldName: String;
+ published
+ property FromTableName: String read fFromTableName write fFromTableName;
+ property FromFieldName: String read fFromFieldName write fFromFieldName;
+ property ToTableName: String read fToTableName write fToTableName;
+ property ToFieldName: String read fToFieldName write fToFieldName;
+ end;
+
+ { TDAJoinConditionCollection }
+ TDAJoinConditionCollection = class(TOwnedCollection)
+ private
+ public
+ constructor Create(aOwner: TPersistent);
+ function Add: TDAJoinCondition; reintroduce;
+ end;
+
+
+ { TDAJoinDataTable }
+ TDAJoinDataTable = class(TDADataset)
+ private
+ fMasterTable: String;
+ fJoinSourceTables: TDAJoinSourceTableCollection;
+ procedure SetJoinSourceTables(const Value: TDAJoinSourceTableCollection);
+ protected
+ function GetParams: TDAParamCollection; override;
+ procedure SetParams(const Value: TDAParamCollection); override;
+ function GetStatements(): TDAStatementCollection; override;
+ procedure SetStatements(const Value: TDAStatementCollection); override;
+ function GetSQLCommandCollection: TDASQLCommandCollection; override;
+ public
+ constructor Create(Collection: TCollection); override;
+ destructor Destroy; override;
+ procedure Assign(aSource: TPersistent); override;
+ property Params;
+ property Statements;
+ published
+ property JoinSourceTables: TDAJoinSourceTableCollection read fJoinSourceTables write SetJoinSourceTables;
+ property MasterTable: String read fMasterTable write fMasterTable;
+ end;
+
+ TDAJoinDataTableClass = class of TDAJoinDataTable;
+
+ { TDAJoinedTableCollection }
+ TDAJoinDataTableCollection = class(TSearcheableCollection)
+ private
+ function GetJoinDataTables(Index: integer): TDAJoinDataTable;
+ procedure SetJoinDataTables(Index: integer; const Value: TDAJoinDataTable);
+ protected
+ //function GetItemClass: TDAJoinedTableClass; override;
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner : TComponent);
+ function Add: TDAJoinDataTable; reintroduce;
+ function JoinTableByName(const aName: string): TDAJoinDataTable;
+ function FindJoinTableByName(const aName: string): TDAJoinDataTable;
+ property JoinTables[Index: integer]: TDAJoinDataTable read GetJoinDataTables write SetJoinDataTables; default;
+ end;
+
+ {TDAUnionSourceTable}
+ TDAUnionSourceTable = class(TCollectionItem)
+ private
+ fName: string;
+ fColumnMappings: TDAColumnMappingCollection;
+ fReadOnly: Boolean;
+ procedure SetColumnMappings(const Value: TDAColumnMappingCollection);
+ public
+ constructor Create(Collection: TCollection); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ published
+ property Name: string read fName write fName;
+ property ColumnMappings: TDAColumnMappingCollection read fColumnMappings write SetColumnMappings;
+ property IsReadOnly: Boolean read fReadOnly write fReadOnly;
+ end;
+
+ {TDAUnionSourceTableCollection}
+ TDAUnionSourceTableCollection = class(TSearcheableCollection)
+ private
+ function GetUnionSourceTables(Index: integer): TDAUnionSourceTable;
+ protected
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner : TPersistent);
+
+ function Add: TDAUnionSourceTable; reintroduce;
+ function UnionSourceTableByName(const aName : string) : TDAUnionSourceTable;
+
+ property UnionSourceTables[Index : integer] : TDAUnionSourceTable read GetUnionSourceTables; default;
+ end;
+
+ {TDAUnionDataTable}
+ TDAUnionDataTable = class(TDADataset)
+ private
+ fDefaultSourceTable: string;
+ fSourceTables: TDAUnionSourceTableCollection;
+ procedure SetSourceTables(Value: TDAUnionSourceTableCollection);
+ protected
+ public
+ constructor Create(Collection: TCollection); override;
+ destructor Destroy; override;
+ property Params;
+ property Statements;
+ published
+ property SourceTables: TDAUnionSourceTableCollection read fSourceTables write SetSourceTables;
+ property DefaultSourceTable: String read fDefaultSourceTable write fDefaultSourceTable;
+ end;
+
+ { TDAUnionDataTableCollection }
+ TDAUnionDataTableCollection = class(TSearcheableCollection)
+ private
+ function GetUnionDataTables(Index: integer): TDAUnionDataTable;
+ procedure SetUnionDataTables(Index: integer; const Value: TDAUnionDataTable);
+ protected
+ //function GetItemClass: TDAJoinedTableClass; override;
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner : TComponent);
+ function Add: TDAUnionDataTable; reintroduce;
+ function UnionDataTableByName(const aName: string): TDAUnionDataTable;
+ function FindUnionDataTableByName(const aName: string): TDAUnionDataTable;
+ property UnionDataTables[Index: integer]: TDAUnionDataTable read GetUnionDataTables write SetUnionDataTables; default;
+ end;
+
+ { TDAConnection }
+ TDAConnection = class(TCollectionItem)
+ private
+ fDescription: string;
+ fConnectionString: string;
+ fConnectionType: string;
+ fName: string;
+ fDefault: boolean;
+ fTag: integer;
+ procedure SetDefault(const Value: boolean);
+ procedure SetName(const Value: string);
+
+ protected
+ function GetDisplayName: string; override;
+ procedure SetDisplayName(const Value: string); override;
+
+ function GetConnectionString: string; virtual;
+ procedure SetConnectionString(const aValue: string); virtual;
+
+ public
+ procedure Assign(aSource: TPersistent); override;
+
+ published
+ property Name: string read fName write SetName;
+ property ConnectionString: string read GetConnectionString write SetConnectionString;
+ property Description: string read fDescription write fDescription;
+ property ConnectionType: string read fConnectionType write fConnectionType;
+ property Default: boolean read fDefault write SetDefault default False;
+ property Tag: integer read fTag write fTag default 0;
+ end;
+
+ { TDAConnectionCollection }
+ TDAConnectionCollection = class(TSearcheableCollection)
+ private
+ function GetConnections(Index: integer): TDAConnection;
+ procedure SetConnections(Index: integer; const Value: TDAConnection);
+ procedure ClearDefaults(iExceptFor: TDAConnection);
+ protected
+ function ItemName: string; override;
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; override;
+ function GetItemName(anItem: TCollectionItem): string; override;
+ public
+ constructor Create(aOwner: TPersistent);
+
+ function Add: TDAConnection; reintroduce;
+ function ConnectionByName(const aName: string): TDAConnection;
+ function FindConnection(const aName: string; const aType: string): TDAConnection;
+
+ function GetDefaultConnection : TDAConnection;
+
+ property Connections[Index: integer]: TDAConnection read GetConnections write SetConnections; default;
+ property OnItemRenamed;
+ property OnItemRemoved;
+ end;
+
+ EDADriverAlreadyLoaded = class(EDADriverLoadException);
+ EDASchemaModelerOnly = class(EDADriverLoadException);
+
+ IDADataDictionary = interface
+ ['{34078D79-6310-494C-BA92-0FC187B275BE}']
+ procedure SetFields(const Value: TDADataDictionaryFieldCollection);
+ function GetFields: TDADataDictionaryFieldCollection;
+ property Fields: TDADataDictionaryFieldCollection read GetFields write SetFields;
+ end;
+
+ IDAHasDataDictionary = interface
+ ['{A25ADACE-BBD7-4A04-84A9-B9B699389E3D}']
+ function GetDataDictionary: IDADataDictionary;
+ property DataDictionary: IDADataDictionary read GetDataDictionary;
+ end;
+ { IDADriverManager
+ Provides access to all the functionality needed to load, unload and verify drivers.
+ Access to this interface is obtained using a TDADriverManager component.
+ There can only be one driver manager loaded at any give time in one application. }
+ IDADriverManager = interface
+ ['{5B6B8C91-F91A-4A25-8B6F-CF7959275682}']
+ // Properties readers/writers
+ function GetDrivers(Index: integer): IDADriver;
+ function GetDriverCount: integer;
+
+ // Methods
+ procedure LoadDriver(const aFileName: string);
+ procedure UnloadDriver(anIndex: integer);
+
+ procedure LoadDrivers;overload;
+ procedure LoadDrivers(const aDriverList: IROStrings; aIgnoreDuplicates: boolean = false; aIgnoreErrors: boolean = false);overload;
+ procedure UnloadAllDrivers;
+
+ function ListDrivers(const aDirectory: string; out FileNames: IROStrings): integer;
+
+ function FindDriver(const aDriverID: string; out Driver: IDADriver): boolean;
+ function DriverByDriverID(const aDriverID: string): IDADriver;
+
+ // Properties
+ property Drivers[Index: integer]: IDADriver read GetDrivers; default;
+ property DriverCount: integer read GetDriverCount;
+ end;
+
+ TDAAvailableDriverOption = (doAuxDriver, doServerName, doDatabaseName, doLogin, doCustom);
+ TDAAvailableDriverOptions = set of TDAAvailableDriverOption;
+
+ TDADriverHelpType = (dhConnectionWizard);
+
+ { IDADriver
+ An object implementing this interface is returned by the Data Abstract drivers. You get a reference to
+ it by calling the DLL's exported function GetDriverObject. If the DLL doesn't support this method, it is
+ not a Data Abstract driver. Once you retrieve a reference to this object you can query it for additional
+ interfaces such as IDAConnectionPool and obtain access to additional functionality. Not all drivers implement
+ the same number of interfaces. }
+
+ TDATraceSource = (tsUnknown, tsConnection, tsDataset, tsCommand);
+ TDATraceOption = (toPrepare,
+ toExecute,
+ toFetch,
+ toError,
+ toStmt,
+ toConnect,
+ toTransact,
+ toBlob,
+ toService,
+ toMisc,
+ toParams);
+ TDATraceOptions = set of TDATraceOption;
+
+ TDALogTraceEvent = procedure(Sender: TObject; const Text: string; Tag: integer) of object;
+
+ IDADriver = interface
+ ['{1829ABED-299B-4698-9803-DBABCF5443FA}']
+ // Properties readers/writers
+ function GetDriverID: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDescription: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetMajVersion: byte; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetMinVersion: byte; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Methods
+ procedure Initialize; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Finalize; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function NewConnection(const aName: string = '';const aConnectionType: string = ''): IDAConnection; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} overload; {deprecated;}
+ function NewConnection(const aConnectionManager: IDAConnectionManager; aConnectionDefinition: TDAConnection): IDAConnection; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} overload;
+
+ procedure SetTraceOptions(TraceActive: boolean; TraceOptions: TDATraceOptions; Callback: TDALogTraceEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAvailableDriverOptionsEx(AuxDriver: string): TDAAvailableDriverOptions; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDefaultCustomParameters: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Properties
+ property DriverID: string read GetDriverID;
+ property Description: string read GetDescription;
+ property MajVersion: byte read GetMajVersion;
+ property MinVersion: byte read GetMinVersion;
+
+ procedure GetAuxDrivers(out List: IROStrings); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDefaultConnectionType(const AuxDriver: string): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ IDADriver30 = interface(IDADriver)
+ ['{F14A6526-CE1F-4A6B-BC4D-3892BA712FE2}']
+ function GetDriverHelp(aType: TDADriverHelpType): string;
+ end;
+
+ IDADriver40 = interface(IDADriver30)
+ ['{82903957-974A-4E1F-B91C-C07F608A96A9}']
+ function GetProviderDefaultCustomParameters(Provider: string): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ IDACanQueryDatabaseNames = interface
+ ['{67870220-37E2-4510-BD6A-627EADED75ED}']
+ function GetDatabaseNames: IROStrings;
+ end;
+
+ IDAFileBasedDatabase = interface
+ ['{C37EA8EE-9AC7-44F3-863C-EFB1581D4D57}']
+ function GetFileExtensions: IROStrings;
+ end;
+
+ IDADirectoryBasedDatabase = interface
+ ['{40C102F0-B86E-4CD6-AB3D-4B0903723A5D}']
+ end;
+
+ { IDAConnectionObjectAccess
+ Provides access to the internal connection component and facilitates access to its
+ properties in form of a collection of properties. This interface is useful when you want
+ to complete control of the internal object. In order to use this interface you need
+ to use ShareMem or FastShareMem. }
+ IDAConnectionObjectAccess = interface
+ ['{FF8F2319-4EAE-4A2B-8713-A6E6B3F5E48A}']
+ // Properties readers/writers
+ function GetConnectionObject: TObject; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetConnectionProperties(const aPropertyName: string): Variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetConnectionProperties(const aPropertyName: string; const aValue: Variant); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Properties
+ property ConnectionObject: TObject read GetConnectionObject;
+ property ConnectionProperties[const aPropertyName: string]: Variant read GetConnectionProperties write SetConnectionProperties;
+ end;
+
+ TDAQuoteCharArray = array[0..1] of char;
+
+ TDABeforeOpenDatasetEvent = procedure(const Sender: IDADataset) of object;
+ TDAAfterOpenDatasetEvent = procedure(const Sender: IDADataset; ActualSQL: string; ElapsedMilliseconds: Cardinal) of object;
+ TDAOpenDatasetErrorEvent = procedure(const Sender: IDADataset; ActualSQL: string; Error: Exception) of object;
+
+ TDABeforeExecuteCommandEvent = procedure(const Sender: IDASQLCommand) of object;
+ TDAAfterExecuteCommandEvent = procedure(const Sender: IDASQLCommand; ActualSQL: string; ElapsedMilliseconds: Cardinal) of object;
+ TDAExecuteCommandErrorEvent = procedure(const Sender: IDASQLCommand; ActualSQL: string; Error: Exception) of object;
+
+ { TDAWhereBuilder }
+
+ TDAWhereBuilder = class;
+ TDAWhereExpression = class(TObject)
+ private
+ public
+ class function ParseExpression(xr: IXmlNode): TDAWhereExpression;
+
+ procedure ReadFromXml(xr: IXmlNode); virtual; abstract;
+ procedure WriteToXml(sw: IXmlNode); virtual; abstract;
+ procedure Validate; virtual;
+ end;
+
+ TDABinaryOperator = (dboAnd, dboOr, dboXor, dboLess, dboLessOrEqual, dboGreater,
+ dboGreaterOrEqual, dboNotEqual, dboEqual, dboLike, dboIn, dboAddition, dboSubtraction,
+ dboMultiply, dboDivide, dboNotIn);
+ TDAUnaryOperator = (duoNot, duoMinus);
+
+ TDAWhereBuilder = class
+ private
+ fExpression: TDAWhereExpression;
+ FColumnMapping: TDAColumnMappingCollection;// for TDAESQLCommand
+ fParams: TDAParamCollection;
+ function getXml: UnicodeString;
+ procedure setXml(const aValue: UnicodeString);
+ procedure SetColumnMapping(const Value: TDAColumnMappingCollection);
+ procedure SetParams(const Value: TDAParamCollection);
+ procedure RemoveEmptyNodes(const ANode:IXMLNode);
+ protected
+ function ReadFromXml(xr: IXmlNode): TDAWhereExpression; virtual;
+ procedure WriteToXml(sw: IXmlNode; const aExpression: TDAWhereExpression); virtual;
+ public
+ constructor Create;
+
+ destructor Destroy; override;
+
+ property Expression: TDAWhereExpression read fExpression write FExpression;
+
+ property Xml: UnicodeString read GetXml write SetXml;
+ function NewBinaryExpression(aLeft, aRight: TDAWhereExpression; anOp: TDABinaryOperator): TDAWhereExpression;overload;
+ function NewBinaryExpression(const aTableName,aFieldName: string; anOp: TDABinaryOperator; const aValue: variant; aType: TDADataType): TDAWhereExpression; overload;
+ function NewUnaryExpression(anExpression: TDAWhereExpression; anOp: TDAUnaryOperator): TDAWhereExpression;
+ function NewConstant(const aValue: Variant; aType: TDADataType): TDAWhereExpression;
+ function NewList(const aValues: array of TDAWhereExpression): TDAWhereExpression;
+ function NewParameter(const aParameterName: string): TDAWhereExpression;
+ function NewField(const aTableName,aFieldName: string): TDAWhereExpression;
+ function NewNull: TDAWhereExpression;
+ function NewIsNotNull: TDAWhereExpression; overload;
+ function NewIsNotNull(const aTableName,aFieldName: string): TDAWhereExpression; overload;
+ function NewMacro(const aName: string): TDAWhereExpression; overload;
+ function NewMacro(const aName: string; const aValues: array of TDAWhereExpression): TDAWhereExpression; overload;
+ procedure Clear;
+ function IsEmpty:Boolean;
+ property ColumnMapping: TDAColumnMappingCollection read FColumnMapping write SetColumnMapping;
+ property Params: TDAParamCollection read fParams write SetParams;
+ function ExpressionToXmlNode(const aExpression: TDAWhereExpression): IXMLNode;
+ function XMLToExpression(const aXML: UnicodeString):TDAWhereExpression;
+ end;
+
+ TDASimpleQueryBuilder = class;
+ TDASQLWhereBuilder = class(TDAWhereBuilder)
+ private
+ FId: Integer;
+ FConnection: IDAConnection;
+ FQueryBuilder: TDASimpleQueryBuilder;
+ function GenerateParamName: String;
+ function GenerateParameter(const aParameterName: string):string;
+ function GetMappingTableField(const aDataSetField: string): string;
+ protected
+ function GenerateFieldName(aTablename, aFieldName: string):string; virtual;
+ function ProcessExpression(AExpression: TDAWhereExpression): string;
+ function ProcessBinaryExpression(AExpression: TDAWhereExpression): string; virtual; abstract;
+ function ProcessUnaryExpression(AExpression: TDAWhereExpression): string; virtual; abstract;
+ function ProcessConstantExpression(AExpression: TDAWhereExpression): string; virtual;
+ function ProcessListExpression(AExpression: TDAWhereExpression): string; virtual;
+ function ProcessParameterExpression(AExpression: TDAWhereExpression): string; virtual;
+ function ProcessFieldExpression(AExpression: TDAWhereExpression): string; virtual;
+ function ProcessNullExpression(AExpression: TDAWhereExpression): string; virtual; abstract;
+ function ProcessMacroExpression(AExpression: TDAWhereExpression): string; virtual;
+ public
+ constructor Create(AConnection: IDAConnection); overload;
+ constructor Create(AQueryBuilder: TDASimpleQueryBuilder); overload;
+ function CreateWhereClause: string;
+ property Connection: IDAConnection read FConnection;
+ property QueryBuilder: TDASimpleQueryBuilder read FQueryBuilder;
+ end;
+
+ { TDASimpleQueryBuilder }
+
+ TDATableFieldCollectionItem = class(TCollectionItem)
+ private
+ FFieldName: string;
+ FTableName: string;
+ public
+ procedure Assign(Source: TPersistent); override;
+ property TableName: string read FTableName write FTableName;
+ property FieldName: string read FFieldName write FFieldName;
+ end;
+
+ TDASelectItem = TDATableFieldCollectionItem;
+ TDASelectCollection = TCollection;
+
+ TDAGroupByItem = TDATableFieldCollectionItem;
+ TDAGroupByCollection = TCollection;
+
+ TDAOrderByItem = TDATableFieldCollectionItem;
+ TDAOrderByCollection = TCollection;
+
+ TDAQueryBuilderOption = (qboSelectDistinct, qboGenerateSimpleSelect, qboGenerateDynamicWhereStatement);
+ TDAQueryBuilderOptions = set of TDAQueryBuilderOption;
+
+ TDASimpleQueryBuilder = class(TCollectionItem)
+ private
+ // IDAConnection
+ FMainTable: TDAJoinDataTable;
+ FSelectCollection: TDASelectCollection;
+ FGroupByCollection: TDAGroupByCollection;
+ FWhere: TDASQLWhereBuilder;
+ FOptions: TDAQueryBuilderOptions;
+ FConnection: IDAConnection;
+ FColumnMapping: TDAColumnMappingCollection;
+ procedure SetColumnMapping(const Value: TDAColumnMappingCollection);
+ function GetWhereBuilder: TDASQLWhereBuilder;
+ protected
+ function GetMappingTableField(const aDataSetField: string): string;
+ procedure Validate; virtual;
+ function CreateWhereBuilder: TDASQLWhereBuilder; virtual; abstract;
+ function CreateSelectClause: string; virtual;
+ function CreateTableClause: string; virtual;abstract;
+ function CreateGroupByClause: string; virtual;
+ function GenerateFieldName(aTablename, aFieldName: string; aProcessMapping: Boolean = True):string; virtual;
+ function QuoteFieldNameIfNeeded(const aTableName, aFieldName: string): string; virtual;
+ function QuoteIdentifierIfNeeded(const iIdentifier: string): string; virtual;
+ function QuoteIdentifier(const iIdentifier: string): string; virtual;
+ function IdentifierNeedsQuoting(const iIdentifier: string):boolean;virtual;
+ public
+ constructor Create(Collection: TCollection); override;
+ destructor Destroy; override;
+ function GenerateSelectSQL: string; virtual;
+ function CreateWhereClause: string; virtual;
+ procedure Assign(Source: TPersistent); override;
+ procedure Clear; virtual;
+ procedure AddSelect(ATable, AField: string);
+ procedure AddGroupBy(ATable, AField: string);
+ procedure AddJoin(AJoinTable, AJoinFieldName, AJoinToTableName, AJoinToFieldName: string; AJoinType: TDAJoinType = jtInner); overload;
+ procedure AddJoin(AJoinTable: string; AJoinFieldNames: array of string; AJoinToTableName: string; AJoinToFieldNames: array of string; AJoinType: TDAJoinType = jtInner); overload;
+ procedure AddCrossJoin(ATable: string);
+ property Select: TDASelectCollection read FSelectCollection;
+ property MainTable: TDAJoinDataTable read FMainTable;
+ property Where: TDASQLWhereBuilder read GetWhereBuilder;
+ property GroupBy: TDAGroupByCollection read FGroupByCollection;
+ property Options: TDAQueryBuilderOptions read FOptions write FOptions;
+ property Connection: IDAConnection read FConnection write FConnection;
+ property ColumnMapping: TDAColumnMappingCollection read FColumnMapping write SetColumnMapping;
+ end;
+
+ TDAUnionCollections = TCollection;
+
+ TDAQueryBuilder = class(TDASimpleQueryBuilder)
+ private
+ FOrderByCollection: TDAOrderByCollection;
+ FUnionCollections: TDAUnionCollections;
+ protected
+ function CreateOrderByClause: string; virtual;
+ function CreateUnionClause(const AUnion: TDASimpleQueryBuilder): string; virtual;
+ public
+ constructor Create(Collection: TCollection); overload;override;
+ constructor Create; reintroduce;overload;virtual;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure Clear; override;
+ procedure AddOrderBy(ATable, AField: string);
+ function AddUnion:TDASimpleQueryBuilder;
+ function GenerateSelectSQL: string; override;
+ property OrderBy: TDAOrderByCollection read FOrderByCollection;
+ property Unions: TDAUnionCollections read FUnionCollections;
+ end;
+
+
+ IDABaseConnection = interface
+ ['{B96CFC5B-CE8A-4B6F-994E-2A82509B0F18}']
+ end;
+
+ { IDAConnection
+ Provides access to a connection object in a database and vendor independent manner.
+ Objects implementing IDAConnection are returned by the driver.
+ Each connection object might also implement additional interfaces that are specific to the
+ underlying database or the data-access framework. These additional interfaces are defined in
+ separate units. To find out what interfaces a connection implements you can check the source code
+ of the relative uDAxxxDriver.pas unit. }
+ IDAConnection = interface(IDABaseConnection)
+ ['{6D9C806F-65A5-43B3-8F07-4ED782A13A0A}']
+ // Properties readers/writers
+ function GetConnectionPool: IDAConnectionPool; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetConnectionPool(const Value: IDAConnectionPool); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetConnectionString: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetConnectionString(Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetConnected: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetConnected(Value: boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnAfterExecuteCommand: TDAAfterExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnAfterOpenDataset: TDAAfterOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeExecuteCommand: TDABeforeExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeOpenDataset: TDABeforeOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnExecuteCommandError: TDAExecuteCommandErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnOpenDatasetError: TDAOpenDatasetErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterExecuteCommand(const Value: TDAAfterExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterOpenDataset(const Value: TDAAfterOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeExecuteCommand(const Value: TDABeforeExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeOpenDataset(const Value: TDABeforeOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnExecuteCommandError(const Value: TDAExecuteCommandErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnOpenDatasetError(const Value: TDAOpenDatasetErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetConnectionType: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Transaction support
+ function BeginTransaction: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CommitTransaction; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure RollbackTransaction; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetInTransaction: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // UserID/Password
+ function GetUserID: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetUserID(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetPassword: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetPassword(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Connection
+ procedure Open(const aUserID: string = ''; const aPassword: string = ''); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Close; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Metadata
+ procedure GetTableNames(out List: IROStrings); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetViewNames(out List: IROStrings); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetStoredProcedureNames(out List: IROStrings); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetTableFields(const aTableName: string; out Fields: TDAFieldCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetQueryFields(const aSQL: string; aParamsIfNeeded: TDAParamCollection; out Fields: TDAFieldCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetViewFields(const aViewName: string; out Fields: TDAFieldCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetQuoteChars: TDAQuoteCharArray; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function QuoteIdentifierIfNeeded(const iIdentifier: string): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function QuoteIdentifier(const iIdentifier: string): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function QuoteFieldNameIfNeeded(const aTableName, aFieldName: string): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function QuoteFieldName(const aTableName, aFieldName: string): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetSPSelectSyntax(HasArguments: Boolean): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Commands and datasets
+ function NewCommand(const Text: string; CommandType: TDASQLStatementType; const aCommandName: string = ''): IDASQLCommand; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function NewDataset(const SQL: string; const aDatasetName: string = ''): IDADataset; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetLastAutoInc(const GeneratorName: string = ''): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetLastAutoIncValue(const GeneratorName: string = ''): variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function isAlive: Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // Properties
+ property ConnectionString: string read GetConnectionString write SetConnectionString;
+ property Connected: boolean read GetConnected write SetConnected;
+ property Name: string read GetName;
+ property InTransaction: boolean read GetInTransaction;
+ property UserID: string read GetUserID write SetUserID;
+ property Password: string read GetPassword write SetPassword;
+ property ConnectionPool: IDAConnectionPool read GetConnectionPool write SetConnectionPool;
+ property ConnectionType: string read GetConnectionType;
+
+ property OnBeforeOpenDataset: TDABeforeOpenDatasetEvent read GetOnBeforeOpenDataset write SetOnBeforeOpenDataset;
+ property OnAfterOpenDataset: TDAAfterOpenDatasetEvent read GetOnAfterOpenDataset write SetOnAfterOpenDataset;
+ property OnOpenDatasetError: TDAOpenDatasetErrorEvent read GetOnOpenDatasetError write SetOnOpenDatasetError;
+ property OnBeforeExecuteCommand: TDABeforeExecuteCommandEvent read GetOnBeforeExecuteCommand write SetOnBeforeExecuteCommand;
+ property OnAfterExecuteCommand: TDAAfterExecuteCommandEvent read GetOnAfterExecuteCommand write SetOnAfterExecuteCommand;
+ property OnExecuteCommandError: TDAExecuteCommandErrorEvent read GetOnExecuteCommandError write SetOnExecuteCommandError;
+ // QueryBuilder
+ function GetQueryBuilder: TDAQueryBuilder; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetWhereBuilder: TDASQLWhereBuilder; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetUseMacroProcessor: Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetUseMacroProcessor(Value:Boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ property UseMacroProcessor: Boolean read GetUseMacroProcessor write SetUseMacroProcessor;
+ end;
+
+ IDAHETConnection = interface(IDABaseConnection)
+ ['{9471FB7A-F5C6-4420-A2E6-F2DD7C6535A7}']
+ function GetConnectionForObject(const aObjectName: string; aOpenConnection: boolean = false): IDAConnection;
+ end;
+
+ { IDATestableObject }
+ IDATestableObject = interface
+ ['{DC2C3CD1-9031-4B0A-97B9-563580611C25}']
+ procedure Test; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ { IDAUseGenerators }
+ IDAUseGenerators = interface
+ ['{7963D550-361E-486A-AAD6-EFD12896F719}']
+ function GetNextAutoinc(const GeneratorName: string): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ { IDAUseGenerators }
+ IDAUseGenerators2 = interface
+ ['{58CC6F21-9159-4C6A-91F7-1E331AABA940}']
+ function GetNextAutoinc2(const GeneratorName: string): variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+
+ IDACanQueryGeneratorsNames = interface
+ ['{E7C4A441-16B2-42BA-92DD-BD0F3EC39250}']
+ function GetGeneratorNames: IROStrings;
+ end;
+
+ { IDAConnectionManager }
+ IDAConnectionManager = interface
+ ['{C2C2B1DB-7D0A-4772-8DDF-5E5150A84827}']
+ function GetDefaultConnectionName: string;
+ function NewConnection(const aConnectionName: string;
+ OpenConnection: boolean = TRUE;
+ const UserID: string = '';
+ const Password: string = ''): IDAConnection;
+
+ procedure Clear;
+ end;
+ IDAConnectionPool = interface
+ ['{6E132C7B-A6AD-4ECB-B901-80000AC4B912}']
+ procedure ReleaseConnection(const Conn: IDAConnection);
+ end;
+
+ { IDASchema }
+ IDASchema = interface
+ ['{19C63BF1-9CAA-43B7-B49C-E3FE82F5A02E}']
+ function GetDatasetText(const aConnection: IDAConnection; const aName: string): string;
+ function GetCommandText(const aConnection: IDAConnection; const aName: string): string;
+
+ function NewDataset(const aConnection: IDAConnection; const aName: string;
+ aStatementName: string='';
+ OpenIt: boolean = false): IDADataset; overload;
+ function NewDataset(const aConnection: IDAConnection; const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ OpenIt: boolean = TRUE;
+ aStatementName: string=''): IDADataset; overload;
+ function NewDataset(const aConnection: IDAConnection; const aName: string;
+ aDynSelectFields: array of string;
+ aWhereClause: WideString;
+ aStatementName: string='';
+ OpenIt: boolean = false;
+ AlwaysGenerateDynamicWhereStatement: Boolean=False): IDADataset; overload;
+ function NewDataset(const aConnection: IDAConnection; const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ aDynSelectFields: array of string;
+ aWhereClause: WideString;
+ OpenIt: boolean = TRUE;
+ aStatementName: string=''): IDADataset; overload;
+
+ function NewCommand(const aConnection: IDAConnection; const aName: string;
+ aStatementName: string=''): IDASQLCommand; overload;
+ function NewCommand(const aConnection: IDAConnection; const aName: string;
+ const ParamNames: array of string;
+ const ParamValues: array of Variant;
+ ExecuteIt: boolean = TRUE;
+ aStatementName: string=''): IDASQLCommand; overload;
+
+ procedure Clear;
+ function MergeDataDictionaries: Boolean;
+ end;
+
+ { TDAWhere
+ Represents an abstraction of the WHERE condition of a SQL statement in an IDADataset. }
+ TDAWhere = class
+ private
+ fFields: TDAFieldCollection;
+ fClause: string;
+ fOnChange: TNotifyEvent;
+ fChanged,
+ fClientFields: boolean;
+ fLastWasCondition: Boolean;
+ fDefaultOperator: TDADefaultOperator;
+
+ function GetEmpty: boolean;
+ function GetNotEmpty: boolean;
+ function GetProperName(aField: TDACustomField) : string;
+
+ protected
+ public
+ constructor Create(const aFields: TDAFieldCollection; aClientFields : boolean);
+
+ procedure Clear;
+
+ procedure AddOperator(aOperator: TDASQLOperator);
+ function AddCondition(const FieldName: string;
+ Condition: TDASQLCondition;
+ const Value: Variant;
+ SkipIfEmptyValue: boolean = TRUE): boolean;overload;
+ function AddCondition(const FieldName: string;
+ Condition: TDASQLCondition): boolean;overload;
+ procedure AddValueGroup(const FieldName: string;
+ const Values: array of Variant);
+ procedure AddSpaces(Count: integer = 1);
+ procedure AddText(const someText: string; MapClientFields : boolean = TRUE);
+
+ procedure OpenBraket; deprecated;
+ procedure CloseBraket; deprecated;
+ procedure OpenBracket;
+ procedure CloseBracket;
+
+ function AddConditions(const FieldNames : array of string;
+ const Conditions : array of TDASQLCondition;
+ const Values: array of Variant;
+ const Operator: TDASQLOperator) : integer;
+
+ property OnChange: TNotifyEvent read fOnChange write fOnChange;
+
+ property Clause: string read fClause;
+ property Fields: TDAFieldCollection read fFields write fFields;
+ property Empty : boolean read GetEmpty;
+ property NotEmpty : boolean read GetNotEmpty;
+
+ property ClientFields : boolean read fClientFields;
+ property DefaultOperator: TDADefaultOperator read fDefaultOperator write fDefaultOperator;
+ property LastWasCondition: Boolean read fLastWasCondition write fLastWasCondition;
+ property Changed: Boolean read fChanged write fChanged;
+ end;
+
+ IDANativeField = interface
+ ['{2F8C9C7B-EBEA-4BD1-A486-3106DC26F67A}']
+ function GetNativeObject: TObject;
+ function isTFieldCompatible: Boolean;
+ function GetFieldName: string;
+ function GetDataType: TFieldType;
+ function GetSize: integer;
+ function GetDecimalPrecision: Integer;
+ procedure SetDecimalPrecision(Value: integer);
+ function GetDecimalScale: Integer;
+ procedure SetDecimalScale(Value: integer);
+ procedure SetDataType(Value: TFieldType);
+ function GetFieldIndex: integer;
+ function GetValue: Variant;
+ function IsNull: Boolean;
+
+ property DecimalPrecision: Integer read GetDecimalPrecision write SetDecimalPrecision;
+ property DecimalScale: Integer read GetDecimalScale write SetDecimalScale;
+ property Size: Integer read GetSize;
+ property DataType: TFieldType read GetDataType write SetDataType;
+ property FieldName: string read GetFieldName;
+ property Index: integer read GetFieldIndex;
+ property Value: Variant read GetValue;
+ end;
+
+
+ IDASQLCommandNativeObject = interface
+ ['{990F8327-C1F2-447C-A2D0-C712ACAA11CF}']
+ function GetNativeObject: TObject; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function IsTDatasetCompatible: Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetNativeFields(Index: integer): IDANativeField;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function NativeFieldCount: Integer;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function NativeFindField(const FieldName: string): IDANativeField;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetNativeFieldData(Index: Integer; var Data: pointer; var DataSize: cardinal):Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function CanFreeNativeFieldData: Boolean;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ property NativeFields[Index: Integer]: IDANativeField read GetNativeFields;
+ property NativeObject: TObject read GetNativeObject;
+ end;
+
+ { IDASQLCommand
+ Base interface for SQL commands. It defines the common functionality shared by queries and stored procedures
+ that is providing access to a parameter list and being able to execute a statement which affects a certain
+ number of records. }
+ {$WARN SYMBOL_DEPRECATED OFF}
+ IDASQLCommand = interface
+ ['{F57D2647-2DDE-4F69-86C5-CFACD6AC601F}']
+ // Properties readers/writers
+ function GetParams: TDAParamCollection; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetPrepared: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetPrepared(Value: boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetWhere: TDAWhere; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF} deprecated;
+ function GetDynamicWhere: TDAWhereBuilder; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetDynamicWhere(const Value: TDAWhereBuilder); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function SQLContainsDynamicWhere:boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetSQL: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetSQL(const Value: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetDataset: TDataset; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnAfterExecute: TDAAfterExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeExecute: TDABeforeExecuteCommandEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterExecute(const Value: TDAAfterExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeExecute(const Value: TDABeforeExecuteCommandEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnExecuteError: TDAExecuteCommandErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnExecuteError(const Value: TDAExecuteCommandErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Methods
+ procedure RefreshParams; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Execute: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function ParamByName(const aName: string): TDAParam; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Properties
+ property Name: string read GetName;
+ property Dataset: TDataSet read GetDataset;
+ property SQL: string read GetSQL write SetSQL;
+ property Params: TDAParamCollection read GetParams;
+ property Prepared: boolean read GetPrepared write SetPrepared;
+ {$WARN SYMBOL_DEPRECATED OFF}
+ property Where: TDAWhere read GetWhere;
+ {$WARN SYMBOL_DEPRECATED ON}
+ property DynamicWhere: TDAWhereBuilder read GetDynamicWhere write SetDynamicWhere;
+
+ property OnBeforeExecute: TDABeforeExecuteCommandEvent read GetOnBeforeExecute write SetOnBeforeExecute;
+ property OnAfterExecute: TDAAfterExecuteCommandEvent read GetOnAfterExecute write SetOnAfterExecute;
+ property OnExecuteError: TDAExecuteCommandErrorEvent read GetOnExecuteError write SetOnExecuteError;
+ end;
+ {$WARN SYMBOL_DEPRECATED ON}
+ { IDAMustSetParams
+ Implemented only by few SQL commands when we need to call PSSetParams after the parameter values
+ are written. For internal use only. See TDAEDataset.DoSetActive }
+ IDAMustSetParams = interface
+ ['{575A8055-0200-44F1-AC5A-EF8604CBB489}']
+ procedure SetParamValues(Params: TDAParamCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetParamValues(Params: TDAParamCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ { IDADataset
+ Provides access to a row set generated from a SQL select or a call to a stored procedure which
+ returns rows. IDADataset objects are created using the method IDAConnection.NewDataset.
+ Objects implementing this interface are equivalent to TDataset and in most cases simply wrap one. }
+ IDADataset = interface(IDASQLCommand)
+ ['{8A3E5056-A8B9-4455-B82C-67E48CC39EA5}']
+ // Properties readers/writers
+ function GetRecordCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldCount: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFields: TDAFieldCollection; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetActive: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetActive(Value: boolean); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetEOF: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetFieldValues(Index: integer): Variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetNames(Index: integer): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetIsEmpty : boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetLogicalName : string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetLogicalName(aName : string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetOnAfterOpen: TDAAfterOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnBeforeOpen: TDABeforeOpenDatasetEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnAfterOpen(const Value: TDAAfterOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnBeforeOpen(const Value: TDABeforeOpenDatasetEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetOnOpenError: TDAOpenDatasetErrorEvent; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetOnOpenError(const Value: TDAOpenDatasetErrorEvent); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Methods
+ procedure Open; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Close; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure EnableControls; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableControls; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function ControlsDisabled: Boolean;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+
+ procedure Next; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function FieldByName(const aName: string): TDAField; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function FindField(const aName: string): TDAField; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function GetCurrentRecIdValue: integer;
+ procedure SetCurrentRecIdValue(Value: integer);
+
+ function GetRowRecIDValue: integer;
+
+ procedure EnableConstraints; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableConstraints; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ property RowRecIdValue: integer read GetRowRecIdValue;
+ property CurrentRecIdValue: integer read GetCurrentRecIdValue write SetCurrentRecIdValue;
+ // Properties
+ property IsEmpty : boolean read GetIsEmpty;
+(* property BOF: boolean read GetBOF;*)
+ property EOF: boolean read GetEOF;
+ property RecordCount: integer read GetRecordCount;
+ property Fields: TDAFieldCollection read GetFields;
+ property Active: boolean read GetActive write SetActive;
+ property FieldCount: integer read GetFieldCount;
+ property FieldValues[Index: integer]: Variant read GetFieldValues;
+ property Names[Index: integer]: string read GetNames;
+ property LogicalName : string read GetLogicalName write SetLogicalName;
+
+ property OnBeforeOpen: TDABeforeOpenDatasetEvent read GetOnBeforeOpen write SetOnBeforeOpen;
+ property OnAfterOpen: TDAAfterOpenDatasetEvent read GetOnAfterOpen write SetOnAfterOpen;
+ property OnOpenError: TDAOpenDatasetErrorEvent read GetOnOpenError write SetOnOpenError;
+
+ end;
+
+ IDADatasetEx = interface(IDADataset)
+ ['{BB588B03-620E-43AD-B77E-EFD35F303112}']
+ function GetBOF: boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Refresh; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetBookMark: TBookmark; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GotoBookmark(Bookmark: TBookmark); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure FreeBookmark(Bookmark: TBookmark); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function BookmarkValid(Bookmark: TBookmark): Boolean; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetState : TDatasetState; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ property State : TDatasetState read GetState;
+ end;
+
+ { IDAEditableDataset }
+ IDAEditableDataset = interface(IDADatasetEx)
+ ['{D3E2147F-65B3-4D9D-8614-7270011FA7D5}']
+ procedure Edit; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Insert; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Post; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Cancel; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Append; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Delete; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure Prior; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure First; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure Last; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure AddRecord(const FieldNames : array of string; const FieldValues : array of Variant); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ procedure EnableEventHandlers; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableEventHandlers; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ { IDAStoredProcedure
+ Provides access to stored database procedures.
+ IDAStoredProcedure objects are created using the method IDAConnection.NewStoredProcedure.}
+ IDAStoredProcedure = interface(IDASQLCommand)
+ ['{6D9C806F-65A5-43B3-8F07-4ED782A13A0A}']
+ // Properties readers/writers
+ function GetStoredProcedureName: string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetStoredProcedureName(const Name: string); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Methods
+ function Execute: integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+
+ // Properties
+ property StoredProcedureName: string read GetStoredProcedureName write SetStoredProcedureName;
+ end;
+
+ { IDADatasetPersist }
+ IDADatasetPersist = interface
+ ['{D6F850CD-9204-4953-A54F-1E622AA993B6}']
+ function Persist(const aQuery: IDADataset; MaxRecords: integer; out Data: IROStream): integer;
+ end;
+
+ { IDADatasetResolver }
+ IDADatasetResolver = interface
+ ['{D6F850CD-9204-4953-A54F-1E622AA993B6}']
+ procedure Resolve(const Data: IROStream; const aQuery: IDADataset; MaxErrors: integer);
+ end;
+
+ { IDALoginInfoAware }
+ IDALoginInfoAware = interface
+ ['{755615F0-4208-459A-B1C4-97EA5A3DB346}']
+ function GetLoginInfo : TDALoginInfo;
+ procedure SetLoginInfo(aValue : TDALoginInfo);
+
+ property LoginInfo : TDALoginInfo read GetLoginInfo write SetLoginInfo;
+ end;
+
+ { TDALoginInfoAware }
+ TDALoginInfoAware = class(TInterfacedObject, IDALoginInfoAware)
+ private
+ fLoginInfo : TDALoginInfo;
+
+ protected
+ { IDALoginInfoAware }
+ function GetLoginInfo : TDALoginInfo;
+ procedure SetLoginInfo(aValue : TDALoginInfo);
+
+ { IInterface }
+ function _AddRef: Integer; stdcall;
+ function _Release: Integer; stdcall;
+
+ end;
+
+ // not used yet
+ { IDASimpleClonedCursorsSupport }
+ IDASimpleClonedCursorsSupport = interface
+ ['{39D05665-5B13-4EC3-B31E-D39CBEA52AC6}']
+ function GetSimpleCloneSource : TObject;
+ end;
+
+ IDAMemDatasetBatchAdding = interface
+ ['{73A4A297-2938-46EB-8D0C-2F8FB58046E2}']
+ function AllocRecordBuffer: PAnsiChar;
+ procedure FreeRecordBuffer(var Buffer: PAnsiChar);
+ function GetFieldNativeBuffer(Buffer: PAnsiChar; Field: TField): Pointer;
+ function MakeBlobFromString(Blob:AnsiString): pointer;
+ procedure SetNullMask(Buffer: PAnsiChar; Field: TField; const Value: boolean);
+ procedure SetAnsiString(NativeBuf: Pointer; Field: TField; const Value: Ansistring);
+ procedure SetWideString(NativeBuf: Pointer; Field: TField; const Value: Unicodestring);
+ procedure AddRecordsfromList(AList: TList; AppendMode: Boolean);
+ function GetFieldNo(AField: TField): integer;
+ end;
+
+ { TDADataSource }
+ TDABaseDataSource = class(TDataSource)
+ end;
+
+const
+ DADataTypeNames: array[Low(TDADataType)..High(TDADataType)] of string = ('Unknown',
+ 'String',
+ 'DateTime',
+ 'Float',
+ 'Currency',
+ 'AutoInc',
+ 'Integer',
+ 'LargeInt',
+ 'Boolean',
+ 'Memo',
+ 'Blob',
+ 'WideString',
+ 'WideMemo',
+ 'LargeAutoInc',
+ 'Byte',
+ 'ShortInt',
+ 'Word',
+ 'SmallInt',
+ 'Cardinal',
+ 'LargeUInt',
+ 'Guid',
+ 'Xml',
+ 'Decimal',
+ 'SingleFloat');
+ DADataTypesMappings: array[TDADataType] of TFieldType = (
+ ftUnknown, ftString, ftDateTime, ftFloat, ftBCD, ftAutoInc, ftInteger,
+ ftLargeInt, ftBoolean, ftMemo, ftBlob, ftWideString,
+ {$IFNDEF DA_WideMemoSupport}ftBlob{$ELSE}ftWideMemo{$ENDIF DA_WideMemoSupport},
+ ftLargeInt, ftSmallint, ftSmallint, ftWord, ftSmallint, ftInteger, ftLargeint,
+ ftGuid, {$IFNDEF DA_WideMemoSupport}ftBlob{$ELSE}ftWideMemo{$ENDIF DA_WideMemoSupport}, ftFMTBcd, ftFloat);
+
+function VCLTypeToDAType(aFieldType: TFieldType): TDADataType;
+function DATypeToVCLType(aDAType: TDADataType): TFieldType;
+
+{ Cross-platform GetTickCount }
+function ROGetTickCount: Cardinal;
+
+{ Variant converters }
+function GetVarBoolean(const Value: Variant): boolean;
+function GetVarCurrency(const Value: Variant): currency;
+function GetVarDateTime(const Value: Variant): TDateTime;
+function GetVarFloat(const Value: Variant): double;
+function GetVarInteger(const Value: Variant): integer;
+function GetVarString(const Value: Variant): string;
+function GetVarAnsiString(const Value: Variant): Ansistring;
+function GetVarInt64(const Value: Variant): Int64;
+function GetVarWideString(const Value: Variant): UnicodeString;
+function GetVarByte(const Value: Variant): Byte;
+function GetVarShortInt(const Value: Variant): ShortInt;
+function GetVarWord(const Value: Variant): Word;
+function GetVarSmallInt(const Value: Variant): SmallInt;
+function GetVarCardinal(const Value: Variant): Cardinal;
+function GetVarLargeUInt(const Value: Variant): UInt64;
+function GetVarGuid(const Value: Variant): TGuid;
+function GetVarXml(const Value: Variant): IXMLNode;
+function GetVarDecimal(const Value: Variant): TBCD;
+function GetVarSingleFloat(const Value: Variant): Single;
+function TestDefaultValue(const DefaultValue: string; DataType: TDADataType): Boolean;
+
+{ Misc }
+function NewDatasetParam(anArray : TDADatasetParamArray; Name : string; Value : Variant) : TDADatasetParam;
+function NewDatasetRequestInfo(anArray : TDADatasetRequestInfoArray;
+ DatasetName : string;
+ ParamNames : array of string;
+ ParamValues : array of variant;
+ IncludeSchema : boolean = FALSE;
+ MaxRecords : integer = -1) : TDADatasetRequestInfo;
+
+procedure Params_ParseSQL(aParams: TParams; aSQL: String; DoCreate: Boolean; aQuoteChar: TDAQuoteCharArray; aUseDefaultChars: Boolean = False);
+procedure BlobVariantToBinary(const iVariant:Variant; iBinary:TStream);
+function BinaryToBlobVariant(iBinary:TStream): Variant;
+
+implementation
+
+uses
+ {$IFDEF DataAbstract_Trial}
+ Forms, Dialogs, //Windows,
+ {$ENDIF DataAbstract_Trial}
+ Variants,
+ uDARes, uROBinaryHelpers, {uDAClasses, uDADataTable,} uDAWhere
+ {$IFDEF MSWINDOWS}
+ ,Windows
+ {$ENDIF};
+
+{ Cross-platform GetTickCount }
+{$IFNDEF MSWINDOWS}
+// This has been grabbed from IdGlobal.pas. Needs to be tested under Kylix just in case
+function ROGetTickCount: Cardinal;
+var
+ Stamp: TTimeStamp;
+begin
+ Stamp := DateTimeToTimeStamp(Now);
+ Result := Stamp.Time;
+end;
+{$ENDIF}
+
+{$IFDEF MSWINDOWS}
+function ROGetTickCount: Cardinal;
+begin
+ result := Windows.GetTickCount;
+end;
+{$ENDIF}
+
+procedure BlobVariantToBinary(const iVariant:Variant; iBinary:TStream);
+var
+ str: AnsiString;
+ p: pointer;
+begin
+ if VarIsEmpty(iVariant) or VarIsNull(iVariant) then begin
+ // nothing, we accept "empty" blobs
+ end
+ else if VarType(iVariant) = varString then begin
+ str := VarToAnsiStr(iVariant);
+ iBinary.Write(pointer(str)^,Length(str));
+ end
+ else if VarIsArray(iVariant) and (VarArrayDimCount(iVariant) = 1) then begin
+ p := VarArrayLock(iVariant);
+ try
+ iBinary.Write(p^,VarArrayHighBound(iVariant,1)-VarArrayLowBound(iVariant,1)+1);
+ finally
+ VarArrayUnlock(iVariant);
+ end;
+ end
+ else begin
+ raise EConvertError.CreateFmt('Can''t convert %d to blob',[VarTypeAsText(VarType(iVariant))]);
+ end;
+end;
+
+function BinaryToBlobVariant(iBinary:TStream): Variant;
+var
+ i: int64;
+ p:pointer;
+begin
+ i := iBinary.Position;
+ try
+ iBinary.Position := 0;
+ Result:= VarArrayCreate([0,iBinary.Size-1],varByte);
+ p := VarArrayLock(Result);
+ try
+ iBinary.Read(p^,iBinary.Size);
+ finally
+ VarArrayUnlock(Result);
+ end;
+ finally
+ iBinary.Position := i;
+ end;
+end;
+{ Variant converters }
+
+function TestForNull(const Value: Variant): boolean;
+begin
+ Result := VarIsEmpty(Value) or VarIsnull(Value);
+end;
+
+function GetVarBoolean(const Value: Variant): boolean;
+begin
+ if TestForNull(Value) then
+ result := FALSE
+ else
+ result := Value;
+end;
+
+function GetVarCurrency(const Value: Variant): currency;
+begin
+ if TestForNull(Value) then
+ result := 0
+ else
+ result := Value;
+end;
+
+function GetVarDateTime(const Value: Variant): TDateTime;
+begin
+ if TestForNull(Value) then
+ result := 0
+ else
+ result := Value;
+end;
+
+function GetVarFloat(const Value: Variant): double;
+begin
+ if TestForNull(Value) then
+ result := 0
+ else
+ result := Value;
+end;
+
+function GetVarInteger(const Value: Variant): integer;
+begin
+ if TestForNull(Value) then
+ result := 0
+ else
+ result := Value;
+end;
+
+function GetVarString(const Value: Variant): string;
+begin
+ if TestForNull(Value) then
+ Result := ''
+ else
+ Result := VarToStr(Value);
+end;
+
+function GetVarAnsiString(const Value: Variant): Ansistring;
+begin
+ if TestForNull(Value) then
+ Result := ''
+ else
+ Result := VarToAnsiStr(Value);
+end;
+
+function GetVarInt64(const Value: Variant): Int64;
+begin
+ if TestForNull(Value) then
+ result := 0
+ else
+ result := Value;
+end;
+
+function GetVarWideString(const Value: Variant): UnicodeString;
+begin
+ if TestForNull(Value) then
+ Result := ''
+ else
+ {$IFDEF UNICODE}
+ Result := VarToStr(Value);
+ {$ELSE}
+ Result := VarToWideStr(Value);
+ {$ENDIF}
+end;
+
+function GetVarByte(const Value: Variant): Byte;
+begin
+ if TestForNull(Value) then
+ Result := 0
+ else
+ Result := Value;
+end;
+
+function GetVarShortInt(const Value: Variant): ShortInt;
+begin
+ if TestForNull(Value) then
+ Result := 0
+ else
+ Result := Value;
+end;
+
+function GetVarWord(const Value: Variant): Word;
+begin
+ if TestForNull(Value) then
+ Result := 0
+ else
+ Result := Value;
+end;
+
+function GetVarSmallInt(const Value: Variant): SmallInt;
+begin
+ if TestForNull(Value) then
+ Result := 0
+ else
+ Result := Value;
+end;
+
+function GetVarCardinal(const Value: Variant): Cardinal;
+begin
+ if TestForNull(Value) then
+ Result := 0
+ else
+ Result := Value;
+end;
+
+function GetVarLargeUInt(const Value: Variant): UInt64;
+var
+ i: Int64;
+begin
+ if TestForNull(Value) then
+ Result := 0
+ else begin
+ i := Value;
+ Result := UInt64(i);
+ end;
+end;
+
+function GetVarGuid(const Value: Variant): TGuid;
+begin
+ if TestForNull(Value) then
+ FillChar(Result, sizeof(Result), 0)
+ else
+ Result := StringToGuid(Value);
+end;
+
+function GetVarXml(const Value: Variant): IXMLNode;
+var
+ lDoc: IXMLDocument;
+begin
+ if TestForNull(Value) then
+ Result := nil
+ else begin
+ lDoc := NewROXmlDocument;
+ lDoc.New;
+ lDoc.XML := Value;
+ Result := lDoc.DocumentNode;
+ end;
+end;
+
+function GetVarDecimal(const Value: Variant): TBCD;
+begin
+ if TestForNull(Value) then
+ Result := NullBcd
+ else
+ Result := VariantToBCD(Value);
+end;
+
+function GetVarSingleFloat(const Value: Variant): Single;
+begin
+ if TestForNull(Value) then
+ Result := 0
+ else
+ Result := Value;
+end;
+
+
+function TestDefaultValue(const DefaultValue: string; DataType: TDADataType): Boolean;
+var
+ aDecimal: TDecimal;
+begin
+ try
+ case DataType of
+ datString: ;
+ datDateTime: VarAsType(DefaultValue, varDate);
+ datFloat: VarAsType(DefaultValue, varDouble);
+ datDecimal: if not VarByteArrayToDecimal(DefaultValue,aDecimal) then VarAsType(DefaultValue, VarFMTBcd);
+ datCurrency: VarAsType(DefaultValue, varCurrency);
+ datAutoInc,
+ datInteger: VarAsType(DefaultValue, varInteger);
+ datLargeAutoInc,
+ datLargeInt: VarAsType(DefaultValue, varInt64);
+ datBoolean: VarAsType(DefaultValue, varBoolean);
+ datMemo: VarAsType(DefaultValue, varString);
+ datBlob: begin Result := False; exit; end;
+ datWideString: VarAsType(DefaultValue, varOleStr);
+ {$IFDEF DA_WideMemoSupport}
+ datXml,
+ datWideMemo: VarAsType(DefaultValue, varOleStr);
+ {$ENDIF}
+ else
+ begin
+ result := false;
+ exit;
+ end;
+ end;
+ result := true;
+ except
+ result := false;
+ end;
+end;
+
+{ EDADriverLoadException }
+
+constructor EDADriverLoadException.Create(anErrorCode: integer;
+ const anErrorMessage: string);
+begin
+ inherited Create(anErrorMessage);
+
+ fErrorCode := anErrorCode;
+end;
+
+function VCLTypeToDAType(aFieldType: TFieldType): TDADataType;
+begin
+ result := datUnknown;
+ case aFieldType of
+ ftUnknown: result := datUnknown;
+
+ ftAutoInc: result := datAutoInc;
+
+ ftGuid: Result:= datGuid;
+
+ ftFixedChar,
+ ftString: result := datString;
+
+ ftLargeint: result := datLargeInt;
+
+ ftSmallint: Result := datSmallInt;
+ {$IFDEF Delphi2009UP}
+ ftLongWord: Result := datCardinal;
+ ftShortint: Result := datShortInt;
+ ftByte: Result := datByte;
+ ftExtended: Result := datDecimal;
+ {$ENDIF}
+ ftWord: Result:= datWord;
+ ftInteger: result := datInteger;
+
+ ftCurrency: result := datFloat;
+ ftFloat: result := datFloat;
+ ftBCD: Result := datCurrency;
+ ftFMTBcd: Result := datDecimal;
+
+
+ ftTimeStamp,
+ ftDate,
+ ftTime,
+ ftDateTime: result := datDateTime;
+
+ ftMemo,
+ ftFmtMemo: result := datMemo;
+
+ ftBytes, ftTypedBinary,
+ ftVarBytes,
+ ftBlob,
+ ftGraphic,
+ ftOraBlob,
+ ftOraClob: result := datBlob;
+
+ ftBoolean: result := datBoolean;
+ {$IFDEF DA_FixedWideCharSupport}
+ ftFixedWideChar,
+ {$ENDIF DA_FixedWideCharSupport}
+ ftWideString: Result := datWideString;
+ {$IFDEF DA_WideMemoSupport}
+ ftWideMemo: Result:= datWideMemo;
+ {$ENDIF DA_WideMemoSupport}
+ else
+ RaiseError(err_FieldTypeNotSupported, [GetEnumName(TypeInfo(TFieldType), Ord(aFieldType)), Ord(aFieldType)]);
+ end;
+end;
+
+function DATypeToVCLType(aDAType: TDADataType): TFieldType;
+begin
+ result := DADataTypesMappings[aDAType];
+end;
+
+{ Misc }
+function NewDatasetParam(anArray : TDADatasetParamArray; Name : string; Value : Variant) : TDADatasetParam;
+begin
+ result := anArray.Add;
+ result.Name := UTF8Encode(Name);
+ result.Value := Value;
+end;
+
+function NewDatasetRequestInfo(anArray : TDADatasetRequestInfoArray;
+ DatasetName : string;
+ ParamNames : array of string;
+ ParamValues : array of variant;
+ IncludeSchema : boolean = FALSE;
+ MaxRecords : integer = -1) : TDADatasetRequestInfo;
+var i : integer;
+begin
+ if (Length(ParamNames)<>Length(ParamValues))
+ then raise EROUserError.Create('ParamNames and ParamValues arrays don''t contain the same number of items');
+
+ result := anArray.Add;
+
+ result.DatasetName := UTF8Encode(DatasetName);
+ result.MaxRecords := MaxRecords;
+ result.IncludeSchema := IncludeSchema;
+
+ if (Length(ParamNames)>0) then begin
+ result.Params := TDADatasetParamArray.Create;
+ for i := 0 to (Length(ParamNames)-1) do
+ NewDatasetParam(result.Params, ParamNames[i], ParamValues[i]);
+ end
+ else result.Params := NIL;
+end;
+
+{ TDAStatementCollection }
+
+function TDAStatementCollection.Add: TDAStatement;
+begin
+ result := TDAStatement(inherited Add);
+end;
+
+function TDAStatementCollection.FindItem(const aName: string; const aStatementName: string=''; const aConnectionType: string = ''; aReturnDefault: Boolean = false): TDAStatement;
+var
+ i: integer;
+ lDef, lStatement:TDAStatement;
+begin
+ result := nil;
+ lDef := nil;
+ for i := 0 to (Count - 1) do begin
+ lStatement := Items[i] as TDAStatement;
+ if lStatement.Default then lDef := lStatement;
+ if
+ ((aConnectionType <> '') and (SameText(lStatement.ConnectionType, aConnectionType))) or
+ SameText(lStatement.Connection, aName) and
+ ((aStatementName = '') or SameText(lStatement.Name, aStatementName)) then begin
+ result := lStatement;
+ exit;
+ end;
+ end;
+ if aReturnDefault then result := lDef;
+end;
+
+constructor TDAStatementCollection.Create(aOwner: TPersistent; aSQLCommand: TDASQLCommand);
+begin
+ inherited Create(aOwner, TDAStatement);
+ FAllowEmptyName := True;
+ fSQLCommand := aSQLCommand;
+end;
+
+function TDAStatementCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result := TDAStatement(anItem).Connection;
+end;
+
+function TDAStatementCollection.GetStatements(
+ Index: integer): TDAStatement;
+begin
+ result := TDAStatement(inherited Items[Index])
+end;
+
+function TDAStatementCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDAStatement(anItem).Connection := aName;
+end;
+
+procedure TDAStatementCollection.SetStatements(Index: integer;
+ const Value: TDAStatement);
+begin
+ Statements[Index].Assign(Value);
+end;
+
+function TDAStatementCollection.StatementByName(
+ const aName: string): TDAStatement;
+begin
+ result := TDAStatement(inherited ItemByName(aName));
+end;
+
+{ TDABaseField }
+
+procedure TDABaseField.Assign(Source: TPersistent);
+begin
+ if (Source is TDABaseField) then begin
+ AssignField(TDABaseField(Source));
+ end
+ else begin
+ inherited;
+ end;
+end;
+
+procedure TDABaseField.AssignField(Source: TDABaseField);
+begin
+ fSize := Source.fSize;
+ fDescription := Source.fDescription;
+ fName := Source.fName;
+ fDataType := Source.fDataType;
+ fValue := Source.fValue;
+ fBlobType := Source.fBlobType;
+ fGeneratorName := Source.GeneratorName;
+ FDecimalPrecision := Source.FDecimalPrecision;
+ FDecimalScale := Source.FDecimalScale;
+ FTag := Source.FTag;
+end;
+
+{procedure TDABaseField.FixSize;
+begin
+ if (fDataType <> datString) then fSize := 0;
+end;}
+
+procedure TDABaseField.UpdateValueType;
+
+ function ConvertValueAccordingToDataType(aValue: Variant; aDataType: TDADataType): Variant;
+ begin
+ case aDataType of
+ datString: result := VarAsType(aValue, varString);
+ datDateTime: result := VarAsType(aValue, varDate);
+ datFloat: result := VarAsType(aValue, varDouble);
+ datCurrency: result := VarAsType(aValue, varCurrency);
+ datAutoInc: result := VarAsType(aValue, varInteger);
+ datInteger: result := VarAsType(aValue, varInteger);
+ datLargeInt: result := VarAsType(aValue, varInt64);
+ datBoolean: result := VarAsType(aValue, varBoolean);
+ datMemo: result := VarAsType(aValue, varString);
+// datBlob: result := VarAsType(aValue, varByte);
+ datWideString: result := VarAsType(aValue, varOleStr);
+ {$IFDEF DA_WideMemoSupport}
+ datXml,
+ datWideMemo: result := VarAsType(aValue, varOleStr);
+ {$ENDIF}
+ datLargeAutoInc: result := VarAsType(aValue, varInt64);
+ datByte: result := VarAsType(aValue, varByte);
+ datShortInt: result := VarAsType(aValue, varShortInt);
+ datWord: result := VarAsType(aValue, varWord);
+ datSmallInt: result := VarAsType(aValue, varSmallint);
+ datCardinal: result := VarAsType(aValue, varLongWord);
+ datLargeUInt: result := VarAsType(aValue, varInt64);
+ datGuid: result := VarAsType(aValue, varString);
+ datDecimal: result := VarAsType(aValue, VarFMTBcd);
+ datSingleFloat: result := VarAsType(aValue, varSingle);
+ end;
+ end;
+
+var
+ lValue: Variant;
+begin
+ try
+ lValue := ConvertValueAccordingToDataType(fValue, fDataType);
+ if VarSameValue(fValue, lValue) then
+ fValue := lValue
+ else
+ fValue := ConvertValueAccordingToDataType(Unassigned, fDataType);
+ except
+ fValue := ConvertValueAccordingToDataType(Unassigned, fDataType);
+ end;
+end;
+
+function TDABaseField.GetDataType: TDADataType;
+begin
+ if not HasValidDictionaryField then begin
+ result := fDataType
+ end
+ else begin
+ result := GetDictionaryField().DataType;
+ end;
+end;
+
+function TDABaseField.GetDescription: string;
+begin
+ if not HasValidDictionaryField then begin
+ result := fDescription;
+ end
+ else begin
+ result := GetDictionaryField().Description;
+ end;
+end;
+
+function TDABaseField.GetName: string;
+begin
+ result := fName
+end;
+
+function TDABaseField.GetSize: integer;
+begin
+ if (DataType <> datString) and (DataType <> datWideString) then begin
+ result := 0;
+ end
+ else begin
+ if not HasValidDictionaryField then begin
+ result := fSize
+ end
+ else begin
+ result := GetDictionaryField().Size;
+ end;
+ end;
+end;
+
+function TDABaseField.GetValue: Variant;
+begin
+ //exists problem with uninitialized variant in Win 2000
+ result := Null;
+ //
+ result := fValue;
+end;
+
+procedure TDABaseField.SetDataType(aValue: TDADataType);
+begin
+ if fDataType <> aValue then begin
+ fDataType := aValue;
+ if not (VarIsNull(Value) or VarIsEmpty(Value)) then
+ UpdateValueType;
+
+ //FixSize();
+ end;
+end;
+
+procedure TDABaseField.SetDescription(const Value: string);
+begin
+ fDescription := Value;
+end;
+
+procedure TDABaseField.SetName(const Value: string);
+var
+ lOldName: string;
+begin
+ lOldName := fName;
+ fName := Value;
+ if lOldName <> '' then
+ (Collection as TSearcheableCollection).TriggerOnItemRenamed(lOldName, fName);
+end;
+
+procedure TDABaseField.SetSize(Value: integer);
+begin
+ fSize := Value;
+ //FixSize();
+end;
+
+procedure TDABaseField.SetValue(const aValue: Variant);
+begin
+ fValue := aValue
+end;
+
+function TDABaseField.GetAsBoolean: boolean;
+begin
+ result := GetVarBoolean(Value);
+ //if VarIsNull(Value) then result := FALSE else result := Value;
+end;
+
+function TDABaseField.GetAsCurrency: currency;
+begin
+ result := GetVarCurrency(Value);
+ //if VarIsNull(Value) then result := 0 else result := Value;
+end;
+
+function TDABaseField.GetAsDateTime: TDateTime;
+begin
+ result := GetVarDateTime(Value);
+ //if VarIsNull(Value) then result := 0 else result := Value;
+end;
+
+function TDABaseField.GetAsFloat: double;
+begin
+ result := GetVarFloat(Value);
+ //if VarIsNull(Value) then result := 0 else result := Value;
+end;
+
+function TDABaseField.GetAsInteger: integer;
+begin
+ result := GetVarInteger(Value);
+ //if VarIsNull(Value) then result := 0 else result := Value;
+end;
+
+function TDABaseField.GetAsString: string;
+begin
+ result := GetVarString(Value);
+ //if VarIsNull(Value) then result := '' else result := Value;
+end;
+
+function TDABaseField.GetAsAnsiString: Ansistring;
+begin
+ Result := GetVarAnsiString(Value);
+end;
+
+procedure TDABaseField.SetAsAnsiString(const aValue: Ansistring);
+begin
+ // according _VarFromLStr we can do this
+ Value := aValue;
+end;
+
+function TDABaseField.GetAsVariant: variant;
+begin
+ result := Value
+end;
+
+procedure TDABaseField.SetAsBoolean(const aValue: boolean);
+begin
+ Value := aValue;
+end;
+
+procedure TDABaseField.SetAsCurrency(const aValue: currency);
+begin
+ Value := aValue;
+end;
+
+procedure TDABaseField.SetAsDateTime(const aValue: TDateTime);
+begin
+ Value := aValue;
+end;
+
+procedure TDABaseField.SetAsFloat(const aValue: double);
+begin
+ Value := aValue;
+end;
+
+procedure TDABaseField.SetAsString(const aValue: string);
+begin
+ Value := aValue;
+end;
+
+procedure TDABaseField.SetAsVariant(const aValue: variant);
+begin
+ Value := aValue;
+end;
+
+procedure TDABaseField.SetAsInteger(const aValue: integer);
+begin
+ Value := aValue;
+end;
+
+function TDABaseField.GetDisplayName: string;
+begin
+ //result := Format('%s %-20s [%s, %d]', [GetName, '', GetEnumName(TypeInfo(TDADataType), Ord(DataType)), Size]);
+ result := GetName;
+end;
+
+function TDABaseField.GetNamePath: string;
+begin
+ if (Collection <> nil) then
+ result := Collection.GetNamePath + Name
+ else
+ result := inherited GetNamePath;
+
+ result := inherited GetNamePath;
+end;
+
+function TDABaseField.GetDictionaryEntry: string;
+begin
+ result := fDictionaryEntry
+end;
+
+procedure TDABaseField.SetDictionaryEntry(const Value: string);
+begin
+ fDictionaryEntry := Value
+end;
+
+function TDABaseField.FindDictionaryField: TDACustomField;
+var
+ lOwner: TObject;
+ lHasDict: IDAHasDataDictionary;
+ lDictionary: IDADataDictionary;
+begin
+ result := nil;
+ if DictionaryEntry = '' then exit;
+
+ lDictionary := TDACustomFieldCollection(Collection).DataDictionary;
+
+ { No Dictionary assigned? then try getting dictionary from owning Schema }
+ if not Assigned(lDictionary) then begin
+ lOwner := TDACustomFieldCollection(Collection).Owner;
+ if not (lOwner is TDADataSet) then exit;
+
+ lOwner := TDADatasetCollection(TDADataSet(lOwner).Collection).Owner;
+// if not (lOwner is TDASchema) then exit;
+
+// lDictionary := TDASchema(lOwner).DataDictionary;
+ if Supports(lOwner, IDAHasDataDictionary, lHasDict) then
+ lDictionary := lHasDict.DataDictionary;
+ end;
+
+ if Assigned(lDictionary) then
+ result := lDictionary.Fields.FindField(DictionaryEntry);
+end;
+
+function TDABaseField.GetDictionaryField: TDACustomField;
+begin
+ result := FindDictionaryField();
+ if not Assigned(result) then
+ RaiseError('Dictionary entry %s not found for field %s', [DictionaryEntry, Name])
+end;
+
+function TDABaseField.HasValidDictionaryField: Boolean;
+begin
+ result := (DictionaryEntry <> '') and
+ Assigned(FindDictionaryField());
+end;
+
+function TDABaseField.IsCompatibleV4: boolean;
+begin
+ Result:=False;
+end;
+
+function TDABaseField.StoreDataType: Boolean;
+begin
+ result := MergeDatadictionaries or not HasValidDictionaryField();
+end;
+
+
+function TDABaseField.StoreDecimalPrecision: Boolean;
+begin
+ Result:= (MergeDatadictionaries or (FDecimalPrecision <>0)) and not IsCompatibleV4;
+end;
+
+function TDABaseField.StoreDecimalScale: Boolean;
+begin
+ Result:= (MergeDatadictionaries or (FDecimalScale <>0)) and not IsCompatibleV4;
+end;
+
+function TDABaseField.StoreGeneratorName: Boolean;
+begin
+ result := MergeDatadictionaries or not HasValidDictionaryField();
+end;
+
+function TDABaseField.StoreDescription: Boolean;
+begin
+ result := MergeDatadictionaries or not HasValidDictionaryField();
+end;
+
+function TDABaseField.StoreSize: Boolean;
+begin
+ result := MergeDatadictionaries or (((DataType = datString) or (DataType = datWideString)) and (not HasValidDictionaryField()));
+end;
+
+function TDABaseField.GetBlobType: TDABlobType;
+begin
+ if HasValidDictionaryField
+ then result := GetDictionaryField().BlobType
+ else result := fBlobType
+end;
+
+function TDABaseField.GetGeneratorName: string;
+begin
+ if not HasValidDictionaryField then begin
+ result := fGeneratorName
+ end
+ else begin
+ result := GetDictionaryField().GeneratorName;
+ end;
+
+end;
+
+
+procedure TDABaseField.SetBlobType(const Value: TDABlobType);
+begin
+ fBlobType := Value;
+end;
+
+function TDABaseField.StoreBlobType: boolean;
+begin
+ result := HasValidDictionaryField;
+end;
+
+procedure TDABaseField.Clear;
+begin
+ Value := Null;
+end;
+
+procedure TDABaseField.SetGeneratorName(const aValue: string);
+begin
+ fGeneratorName := aValue
+end;
+
+procedure TDABaseField.SetDisplayName(const Value: string);
+begin
+ inherited;
+ fName := Value;
+end;
+
+function TDABaseField.GetAsLargeInt: int64;
+begin
+ Result := GetVarInt64(Value);
+end;
+
+procedure TDABaseField.SetAsLargeInt(const aValue: Int64);
+begin
+ Value := aValue;
+end;
+
+function TDABaseField.GetAsWideString: Unicodestring;
+begin
+ Result := GetVarWideString(Value);
+end;
+
+procedure TDABaseField.SetAsWideString(const aValue: Unicodestring);
+begin
+ Value := aValue;
+end;
+
+function TDABaseField.GetIsNull: boolean;
+begin
+ result := VarIsNull(Value);
+end;
+
+
+function TDABaseField.GetBlobSize: Integer;
+var
+ v: Variant;
+begin
+ v := GetValue;
+ if VarIsArray(v) then result := VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1) + 1
+ else if VarIsStr(v) then result := Length(v) else
+ Result := 0;
+end;
+
+function TDABaseField.GetAsByte: Byte;
+begin
+ result := GetVarByte(Value);
+end;
+
+function TDABaseField.GetAsCardinal: Cardinal;
+begin
+ result := GetVarCardinal(Value);
+end;
+
+function TDABaseField.GetAsDecimal: TBcd;
+begin
+ result := GetVarDecimal(Value);
+end;
+
+function TDABaseField.GetAsGuid: TGUID;
+begin
+ result := GetVarGuid(Value);
+end;
+
+function TDABaseField.GetAsLargeUInt: UInt64;
+begin
+ Result := GetVarLargeUInt(Value);
+end;
+
+function TDABaseField.GetAsShortInt: ShortInt;
+begin
+ result := GetVarShortInt(Value);
+end;
+
+function TDABaseField.GetAsSingle: Single;
+begin
+ result := GetVarSingleFloat(Value);
+end;
+
+function TDABaseField.GetAsSmallInt: SmallInt;
+begin
+ result := GetVarSmallInt(Value);
+end;
+
+function TDABaseField.GetAsWord: Word;
+begin
+ result := GetVarWord(Value);
+end;
+
+function TDABaseField.GetAsXml: IXMLNode;
+begin
+ result := GetVarXml(Value);
+end;
+
+procedure TDABaseField.SetAsByte(const Value: Byte);
+begin
+ self.Value := Value;
+end;
+
+procedure TDABaseField.SetAsCardinal(const Value: Cardinal);
+begin
+ self.Value := Value;
+end;
+
+procedure TDABaseField.SetAsDecimal(const Value: TBcd);
+begin
+ self.Value := BCDToVariant(Value);
+end;
+
+procedure TDABaseField.SetAsGuid(const Value: TGUID);
+begin
+ self.Value := GuidToString(Value);
+end;
+
+procedure TDABaseField.SetAsLargeUInt(const Value: UInt64);
+begin
+ self.Value := Value;
+end;
+
+procedure TDABaseField.SetAsShortInt(const Value: ShortInt);
+begin
+ self.Value := Value;
+end;
+
+procedure TDABaseField.SetAsSingle(const Value: Single);
+begin
+ self.Value := Value;
+end;
+
+procedure TDABaseField.SetAsSmallInt(const Value: SmallInt);
+begin
+ self.Value := Value;
+end;
+
+procedure TDABaseField.SetAsWord(const Value: Word);
+begin
+ self.Value := Value;
+end;
+
+procedure TDABaseField.SetAsXml(const Value: IXMLNode);
+begin
+ if Value = nil then
+ Self.Value := null
+ else
+ self.Value := Value.XML;
+end;
+
+procedure TDABaseField.SetDecimalPrecision(const Value: Integer);
+begin
+ FDecimalPrecision := Value;
+end;
+
+function TDABaseField.GetDecimalPrecision: Integer;
+begin
+ if not HasValidDictionaryField then begin
+ result := FDecimalPrecision
+ end
+ else begin
+ result := GetDictionaryField().DecimalPrecision;
+ end;
+end;
+
+function TDABaseField.GetDecimalScale: Integer;
+begin
+ if not HasValidDictionaryField then begin
+ result := FDecimalScale
+ end
+ else begin
+ result := GetDictionaryField().DecimalScale;
+ end;
+end;
+
+procedure TDABaseField.SetDecimalScale(const Value: Integer);
+begin
+ FDecimalScale := Value;
+end;
+
+function TDABaseField.MergeDatadictionaries: Boolean;
+var
+ lOwner: TObject;
+ lSchema: IDASchema;
+begin
+ result := false;
+ if DictionaryEntry = '' then exit;
+
+ lOwner := TDACustomFieldCollection(Collection).Owner;
+ if not (lOwner is TDADataSet) then exit;
+
+ lOwner := TDADatasetCollection(TDADataSet(lOwner).Collection).Owner;
+
+ if Supports(lOwner, IDASchema, lSchema) then
+ result := lSchema.MergeDataDictionaries;
+end;
+
+{ TDACustomField }
+
+constructor TDACustomField.Create(Collection: TCollection);
+begin
+ inherited;
+
+ fServerAutoRefresh := FALSE;
+ fCustomAttributes := TStringList.Create;
+ fVisible := TRUE;
+ fLogChanges := TRUE;
+end;
+
+destructor TDACustomField.Destroy;
+begin
+ fCustomAttributes.Free;
+ inherited;
+end;
+
+function TDACustomField.GetInPrimaryKey: boolean;
+begin
+ result := fInPrimaryKey
+end;
+
+function TDACustomField.GetRegExpression: string;
+begin
+ if not HasValidDictionaryField
+ then result := fRegExpression
+ else result := GetDictionaryField().RegExpression;
+end;
+
+function TDACustomField.GetDefaultValue: string;
+begin
+ if not HasValidDictionaryField
+ then result := fDefaultValue
+ else result := GetDictionaryField().DefaultValue;
+end;
+
+function TDACustomField.GetRequired: boolean;
+begin
+ if not HasValidDictionaryField
+ then result := fRequired
+ else result := GetDictionaryField().Required;
+end;
+
+function TDACustomField.GetDisplayLabel: string;
+begin
+ if not HasValidDictionaryField
+ then result := fDisplayLabel
+ else result := GetDictionaryField().DisplayLabel;
+
+ if (result='') then result := Name;
+end;
+
+function TDACustomField.GetDisplayWidth: integer;
+begin
+ if not HasValidDictionaryField
+ then result := fDisplayWidth
+ else result := GetDictionaryField().DisplayWidth;
+end;
+
+function TDACustomField.GetEditMask: string;
+begin
+ if not HasValidDictionaryField
+ then result := fEditMask
+ else result := GetDictionaryField().EditMask;
+end;
+
+function TDACustomField.GetReadOnly: boolean;
+begin
+ if not HasValidDictionaryField
+ then result := fReadOnly
+ else result := GetDictionaryField().ReadOnly;
+end;
+
+function TDACustomField.GetVisible: boolean;
+begin
+ if not HasValidDictionaryField
+ then result := fVisible
+ else result := GetDictionaryField().Visible;
+end;
+
+function TDACustomField.GetDisplayFormat: string;
+begin
+ if not HasValidDictionaryField
+ then result := fDisplayFormat
+ else result := GetDictionaryField().DisplayFormat;
+end;
+
+function TDACustomField.GetAlignment: TAlignment;
+begin
+ if not HasValidDictionaryField
+ then result := fAlignment
+ else result := GetDictionaryField().Alignment;
+end;
+
+function TDACustomField.GetEditFormat: string;
+begin
+ if not HasValidDictionaryField
+ then result := fEditFormat
+ else result := GetDictionaryField().EditFormat;
+end;
+
+procedure TDACustomField.SetInPrimaryKey(const Value: boolean);
+begin
+ fInPrimaryKey := Value
+end;
+
+procedure TDACustomField.SetRegExpression(const Value: string);
+begin
+ fRegExpression := Value
+end;
+
+procedure TDACustomField.LoadFromFile(const aFileName: string);
+begin
+ if (fField<>nil) then begin
+ if (fField is TBlobField) then TBlobField(fField).LoadFromFile(aFileName)
+ end
+ else RaiseError(err_FieldIsNotBound);
+end;
+
+procedure TDACustomField.SaveToFile(const aFileName: string);
+begin
+ if (fField<>nil) then begin
+ if (fField is TBlobField) then TBlobField(fField).SaveToFile(aFileName)
+ end
+ else RaiseError(err_FieldIsNotBound);
+end;
+
+procedure TDACustomField.LoadFromStream(const aStream: IROStream);
+begin
+ LoadFromStream(aStream.Stream);
+end;
+
+procedure TDACustomField.SaveToStream(const aStream: IROStream);
+begin
+ SaveToStream(aStream.Stream);
+end;
+
+function TDACustomField.GetValue: Variant;
+{$IFNDEF DA_WideMemoSupport}{$IFNDEF DELPHI2006UP}
+var
+ s: Ansistring;
+ ws: UnicodeString;
+{$ENDIF}{$ENDIF}
+begin
+ //exists problem with uninitialized variant in Win 2000
+ result := Null;
+ //
+ if Assigned(fField) then begin
+ if fField.IsNull then Result := Null else
+ {$IFNDEF FPC}
+ if fField is TWideStringField then result := TWideStringField(fField).Value else
+ if fField is TSQLTimeStampField then result := VarFromDateTime(TSQLTimeStampField(fField).AsDateTime) else
+ {$ENDIF}
+ {$IFDEF ftFMTBCD_Support}
+ if fField is TFMTBCDField then result := DecimalToString(BCDToDecimal(TFMTBCDField(fField).AsBCD),DecimalSeparator) else
+ {$ENDIF}
+ {$IFDEF DA_WideMemoSupport}
+ if fField is TWideMemoField then result := TWideMemoField(fField).Value else
+ {$ELSE}
+ if DataType = datXml then begin
+ if (fField is TBlobField) then begin
+ {$IFDEF DELPHI2006UP}
+ Result := TBlobField(fField).AsWideString;
+ {$ELSE}
+ s := TBlobField(fField).Value;
+ SetLength(ws, Length(s) div SizeOf(WideChar));
+ Move(pointer(s)^, pointer(ws)^, Length(ws)*SizeOf(WideChar));
+ Result := ws;
+ {$ENDIF}
+ end
+ end else
+ {$ENDIF DA_WideMemoSupport}
+ if DataType = datCardinal then Result := GetAsCardinal else
+ result := fField.Value;
+ end
+ else result := Null;
+end;
+
+procedure TDACustomField.SetValue(const Value: Variant);
+var
+ aDecimal: TDecimal;
+ {$IFNDEF DA_WideMemoSupport}{$IFNDEF DELPHI2006UP}
+ s: Ansistring;
+ ws: UnicodeString;
+ {$ENDIF}{$ENDIF}
+begin
+ if Assigned(fField) then begin
+ {$IFNDEF FPC}
+ if (fField is TWideStringField) and not VarIsNull( Value ) then begin
+ TWideStringField(fField).Value := Value;
+ end
+ else
+ {$ENDIF}
+ {$IFDEF DA_WideMemoSupport}
+ if (fField is TWideMemoField) and not VarIsNull( Value ) then begin
+ fField.AsWideString := Value;
+ end
+ else
+ {$ELSE}
+ if DataType = datXml then begin
+ if (fField is TBlobField) and not VarIsNull(Value) then begin
+ {$IFDEF DELPHI2006UP}
+ TBlobField(fField).AsWideString := Value;
+ {$ELSE}
+ ws := Value;
+ SetLength(s, Length(ws)*SizeOf(WideChar));
+ Move(pointer(ws)^,pointer(s)^,Length(s));
+ TBlobField(fField).AsString := s;
+ {$ENDIF}
+ end
+ else
+ fField.Value := Value // old behavior
+ end
+ else
+ {$ENDIF DA_WideMemoSupport}
+ if (fField is TLargeintField) and not VarIsNull( Value ) then begin
+ TLargeintField(fField).Value := Value;
+ end
+ else if DataType = datDecimal then begin
+ if VarByteArrayToDecimal(Value,aDecimal) then
+ SetAsDecimal(DecimalToBCD(aDecimal))
+ else
+ SetAsDecimal(VariantToBCD(Value))
+ end
+ else if DataType = datCardinal then begin
+ SetAsCardinal(Value)
+ end
+ else
+ fField.Value := Value
+ end
+ else begin
+ RaiseError(err_FieldIsNotBound);
+ end;
+end;
+
+procedure TDACustomField.Bind(aField: TField);
+begin
+ FNativeField:= nil;
+ fField := aField;
+
+ if Assigned(fField) then begin
+ fField.DisplayLabel := DisplayLabel;
+ fField.DisplayWidth := DisplayWidth;
+ {$IFNDEF FPC}
+ fField.EditMask := EditMask;
+ {$ENDIF FPC}
+ fField.ReadOnly := ReadOnly;
+ fField.Required := Required;
+ fField.Visible := Visible;
+ fField.Alignment := Alignment;
+
+ if (fField is TNumericField) then begin
+ TNumericField(fField).DisplayFormat := DisplayFormat;
+ TNumericField(fField).EditFormat := EditFormat;
+ end
+
+ else if (fField is TDateTimeField) then begin
+ TDateTimeField(fField).DisplayFormat := DisplayFormat
+ end
+{$IFDEF ftFMTBCD_Support}
+ else if (fField is TFMTBCDField) then begin
+ TFMTBCDField(fField).Precision := DecimalPrecision;
+ TFMTBCDField(fField).Size := DecimalScale;
+ end
+{$ENDIF}
+ else if (fField is TBCDField) then begin
+ TBCDField(fField).Precision := DecimalPrecision;
+ TBCDField(fField).Size := DecimalScale;
+ end
+ else if (fField is TBlobField) then begin
+{$IFDEF DA_WideMemoSupport}
+ if TBlobField(fField).BlobType <> ftWideMemo then
+{$ENDIF DA_WideMemoSupport}
+ if Datatype = datMemo then
+ TBlobField(fField).BlobType := ftMemo
+ else
+ TBlobField(fField).BlobType := BlobTypeMappings[BlobType];
+ end;
+
+ fField.OnValidate := InternalOnValidate;
+ fField.OnChange := InternalOnChange;
+
+ {fField.Lookup := Lookup;
+ if (LookupSource<>NIL) then
+ with TDADataSource(LookupSource) do
+ if Assigned(DataTable)
+ then fField.LookupDataSet := DataTable.Dataset;
+
+ fField.LookupKeyFields := LookupKeyFields;
+ fField.LookupCache := LookupCache;
+ fField.LookupResultField := LookupResultField;
+ fField.KeyFields := KeyFields;}
+ end;
+end;
+
+procedure TDACustomField.Unbind;
+begin
+ if (fField=NIL) then Exit;
+
+ fField.OnChange := nil;
+ fField.OnSetText := nil;
+ fField.OnGetText := nil;
+ fField.OnValidate := nil;
+
+ fField := nil;
+end;
+
+function TDACustomField.GetTableField: string;
+begin
+ result := fTableField
+end;
+
+procedure TDACustomField.SetTableField(const Value: string);
+begin
+ fTableField := Value;
+end;
+
+procedure TDACustomField.SetName(const Value: string);
+var
+ updatesc: boolean;
+begin
+ updatesc := (fTableField = '') or (fTableField = Name);
+
+ inherited;
+
+ if updatesc then fTableField := Value;
+end;
+
+function TDACustomField.GetCustomAttributes: TStrings;
+begin
+ if not HasValidDictionaryField then
+ result := fCustomAttributes
+ else
+ result := GetDictionaryField().fCustomAttributes;
+end;
+
+procedure TDACustomField.SetCustomAttributes(const Value: TStrings);
+begin
+ fCustomAttributes.Assign(Value);
+end;
+
+procedure TDACustomField.Assign(Source: TPersistent);
+begin
+ if (Source is TDACustomField) then begin
+ AssignField(TDACustomField(Source));
+ end
+ else begin
+ inherited;
+ end;
+end;
+
+procedure TDACustomField.AssignField(Source: TDABaseField);
+var
+ lSource: TDACustomField;
+begin
+ inherited;
+ lSource := TDACustomField(Source);
+
+ fField := nil; { Assigned DAField will always be unbound }
+ fTableField := lSource.fTableField;
+ fRequired := lSource.fRequired;
+ fInPrimaryKey := lSource.fInPrimaryKey;
+ fRegExpression := lSource.fRegExpression;
+ fDefaultValue := lSource.fDefaultValue;
+ fDictionaryEntry := lSource.fDictionaryEntry;
+ fDisplayWidth := lSource.fDisplayWidth;
+ fDisplayLabel := lSource.fDisplayLabel;
+ fDisplayFormat := lSource.DisplayFormat;
+
+ fReadOnly := lSource.fReadOnly;
+ fVisible := lSource.fVisible;
+ fEditMask := lSource.fEditMask;
+ fLogChanges := lSource.fLogChanges;
+ fCalculated := lSource.fCalculated;
+ fServerCalculated := lSource.fServerCalculated;
+
+ fEditFormat := lSource.EditFormat;
+ fAlignment := lSource.Alignment;
+
+ fOnChange := lSource.OnChange;
+ {fOnGetText := lSource.OnGetText;
+ fOnSetText := lSource.OnSetText;}
+ fOnValidate := lSource.OnValidate;
+
+ fLookupCache := lSource.LookupCache;
+ fLookupKeyFields := lSource.LookupKeyFields;
+ fLookupResultField := lSource.LookupResultField;
+ fKeyFields := lSource.KeyFields;
+ fLookupSource := lSource.LookupSource;
+ fLookup := lSource.Lookup;
+
+ //fCustomAttributes.Assign(lSource.fCustomAttributes);
+ fCustomAttributes.Text := lSource.fCustomAttributes.Text;
+
+ fServerAutoRefresh := lSource.ServerAutoRefresh;
+ fGeneratorName := lSource.GeneratorName;
+
+ fBusinessClassID := lSource.BusinessClassID;
+end;
+
+procedure TDACustomField.InternalOnChange(Sender: TField);
+begin
+ if not (Collection as TDACustomFieldCollection).FieldEventsDisabled then
+ begin
+ if assigned(TDACustomFieldCollection(Collection).OnFieldAfterUpdate) then
+ TDACustomFieldCollection(Collection).OnFieldAfterUpdate(Self);
+ if Assigned(fOnChange) then
+ fOnChange(Self);
+ end;
+end;
+
+procedure TDACustomField.InternalOnValidate(Sender: TField);
+begin
+ if not (Collection as TDACustomFieldCollection).FieldEventsDisabled then
+ begin
+ if assigned(TDACustomFieldCollection(Collection).OnFieldBeforeUpdate) then
+ TDACustomFieldCollection(Collection).OnFieldBeforeUpdate(Self);
+ if Assigned(fOnValidate) then
+ fOnValidate(Self);
+ end;
+end;
+
+function TDACustomField.IsCompatibleV4: boolean;
+begin
+ if Assigned(FieldCollection) then
+ Result := FieldCollection.IsCompatibleV4
+ else
+ Result := inherited IsCompatibleV4;
+end;
+
+procedure TDACustomField.SetDisplayLabel(const aValue: string);
+begin
+ fDisplayLabel := aValue;
+ if Assigned(fField) then fField.DisplayLabel := aValue;
+end;
+
+procedure TDACustomField.SetRequired(const aValue: boolean);
+begin
+ fRequired := aValue;
+ if Assigned(fField) then fField.Required := aValue;
+end;
+
+procedure TDACustomField.SetVisible(const aValue: boolean);
+begin
+ fVisible := aValue;
+ if Assigned(fField) then fField.Visible := aValue;
+end;
+
+procedure TDACustomField.SetDisplayWidth(const aValue: integer);
+begin
+ fDisplayWidth := aValue;
+ if Assigned(fField) then fField.DisplayWidth := aValue;
+end;
+
+procedure TDACustomField.SetEditMask(const aValue: string);
+begin
+ fEditMask := aValue;
+ {$IFNDEF FPC}
+ if Assigned(fField) then fField.EditMask := aValue;
+ {$ENDIF}
+end;
+
+procedure TDACustomField.SetReadOnly(const aValue: boolean);
+begin
+ fReadOnly := aValue;
+ if Assigned(fField) then fField.ReadOnly := aValue;
+end;
+
+procedure TDACustomField.SetDisplayFormat(const Value: string);
+begin
+ fDisplayFormat := Value;
+ if Assigned(fField) then begin
+ if (fField is TNumericField) then
+ TNumericField(fField).DisplayFormat := Value
+ else if (fField is TDateTimeField) then
+ TDateTimeField(fField).DisplayFormat := Value;
+ end;
+end;
+
+
+function TDACustomField.StoredExpression: Boolean;
+begin
+ Result:= not IsCompatibleV4;
+end;
+
+function TDACustomField.StoreDisplayLabel: Boolean;
+begin
+ result := MergeDatadictionaries or (not HasValidDictionaryField()) and (fDisplayLabel <> '') and (fDisplayLabel <> Name);
+end;
+
+
+function TDACustomField.StoredServerCalculated: Boolean;
+begin
+ Result:= not IsCompatibleV4;
+end;
+
+function TDAField.GetDisplayName: string;
+begin
+ result := Format('%s [%s, %d', [fName, GetEnumName(TypeInfo(TDADataType), Ord(DataType)), Size]);
+
+ if Required then
+ result := result+', REQUIRED';
+
+ result := result+']'
+end;
+
+function TDACustomField.GetOwner: TPersistent;
+begin
+ result := Collection;
+end;
+
+function TDACustomField.GetNamePath: string;
+begin
+ if (Collection <> nil) and (Collection.Owner <> nil) and (Collection.Owner is TComponent) then
+ result := TComponent(Collection.Owner).Name + '.' + FName
+ else
+ result := FName;
+end;
+
+procedure TDACustomField.SetAlignment(const Value: TAlignment);
+begin
+ fAlignment := Value;
+ if Assigned(fField) then fField.Alignment := Value;
+end;
+
+procedure TDACustomField.SetEditFormat(const Value: string);
+begin
+ fEditFormat := Value;
+
+ if Assigned(fField) then begin
+ if (fField is TNumericField) then TNumericField(fField).EditFormat := Value
+ end;
+end;
+
+procedure TDACustomField.SetKeyFields(const Value: string);
+begin
+ fKeyFields := Value;
+ if Assigned(fField)
+ then fField.KeyFields := Value;
+end;
+
+procedure TDACustomField.SetLookupCache(const Value: boolean);
+begin
+ fLookupCache := Value;
+ if Assigned(fField)
+ then fField.LookupCache := Value;
+end;
+
+procedure TDACustomField.SetLookupKeyFields(const Value: string);
+begin
+ fLookupKeyFields := Value;
+ if Assigned(fField)
+ then fField.LookupKeyFields := Value;
+end;
+
+procedure TDACustomField.SetLookupResultField(const Value: string);
+begin
+ fLookupResultField := Value;
+ if Assigned(fField)
+ then fField.LookupResultField := Value;
+end;
+
+type
+ THackField = class(TField)
+ end;
+
+procedure TDACustomField.SetLookupSource(const Value: TDataSource);
+begin
+ if Assigned(Value) and not (Value is TDABaseDataSource) then raise Exception.Create('LookupSource must be a TDADataSource');
+
+ fLookupSource := Value;
+ if Assigned(fField) then
+ if Assigned(Value)
+ then fField.LookupDataSet := Value.DataSet
+ else THackField(fField).Notification(fField.LookupDataSet,opRemove);
+end;
+
+procedure TDACustomField.SetCalculated(const Value: boolean);
+begin
+ fCalculated := Value;
+ if Value then begin
+ fLookup := FALSE;
+ fServerCalculated := false;
+ end;
+end;
+
+procedure TDACustomField.SetLookup(const Value: boolean);
+begin
+ fLookup := Value;
+ if Value then begin
+ fCalculated := FALSE;
+ end;
+end;
+
+function TDACustomField.GetFieldCollection: TDACustomFieldCollection;
+begin
+ result := TDACustomFieldCollection(Collection);
+end;
+
+procedure TDACustomField.SetBlobType(const Value: TDABlobType);
+begin
+ inherited;
+
+ if Assigned(fField) and (fField is TBlobField)
+ then TBlobField(fField).BlobType := BlobTypeMappings[Value];
+end;
+
+function TDACustomField.GetServerAutoRefresh: boolean;
+begin
+ result := fServerAutoRefresh
+end;
+
+procedure TDACustomField.SetServerAutoRefresh(const Value: boolean);
+begin
+ fServerAutoRefresh := Value;
+end;
+
+function TDACustomField.GetLogChanges: boolean;
+begin
+ if not HasValidDictionaryField
+ then result := fLogChanges
+ else result := GetDictionaryField().fLogChanges;
+ result := Result and not (fCalculated or fLookup)
+end;
+
+function TDACustomField.StoreProperties: boolean;
+begin
+ result := MergeDatadictionaries or not HasValidDictionaryField();
+end;
+
+function TDACustomField.GetOldValue: Variant;
+begin
+ if Assigned(fField)
+ then result := fField.OldValue
+ else result := Unassigned;
+end;
+
+function TDACustomField.GetSQLOrigin: string;
+begin
+ if fSQLOrigin=''
+ then result := TableField
+ else result := fSQLOrigin;
+end;
+
+procedure TDACustomField.FocusControl;
+begin
+ if Assigned(fField)
+ then fField.FocusControl;
+end;
+
+{procedure TDACustomField.SetBusinessRulesID(const Value: string);
+begin
+ BusinessClassID := Value;
+end;
+
+function TDACustomField.GetBusinessRulesID: string;
+begin
+ result := BusinessClassID;
+end;}
+
+function TDACustomField.GetBusinessClassID: string;
+begin
+ if not HasValidDictionaryField
+ then result := fBusinessClassID
+ else result := GetDictionaryField().BusinessClassID;
+end;
+
+procedure TDACustomField.SetBusinessClassID(const Value: string);
+begin
+ fBusinessClassID := Value;
+end;
+
+procedure TDACustomField.LoadFromStream(const aStream: TStream);
+begin
+ if (fField<>nil) then begin
+ if (fField is TBlobField) then TBlobField(fField).LoadFromStream(aStream)
+ end
+ else RaiseError(err_FieldIsNotBound);
+end;
+
+procedure TDACustomField.SaveToStream(const aStream: TStream);
+begin
+ if (fField<>nil) then begin
+ if (fField is TBlobField) then TBlobField(fField).SaveToStream(aStream)
+ end
+ else RaiseError(err_FieldIsNotBound);
+end;
+
+function TDACustomField.GetBlobSize: Integer;
+begin
+ if fField is TBlobField then
+ result := TBlobField(fField).BlobSize
+ else
+ Result := 0;
+end;
+
+procedure TDACustomField.SetServerCalculated(const Value: Boolean);
+begin
+ fServerCalculated := Value;
+ if Value then begin
+ Readonly := True;
+ LogChanges := False;
+ Calculated := False;
+ InPrimaryKey := False;
+ end;
+end;
+
+procedure TDACustomField.SetExpression(const Value: string);
+begin
+ fExpression := Value;
+ if value <> '' then
+ Calculated := true; // will unset lookup & server calculated
+end;
+
+
+function TDACustomField.GetAsAnsiString: Ansistring;
+begin
+ if Assigned(fField) then
+ {$IFDEF DELPHI12UP}
+ {$IFNDEF DELPHI2009_USE_AsAnsiString_for_TStringField}
+ if fField.DataType = ftString then
+ Result := VarToAnsiStr(fField.Value)
+ else
+ {$ENDIF}
+ Result := fField.AsAnsiString
+ {$ELSE}
+ Result := fField.AsString
+ {$ENDIF}
+ else
+ Result := inherited GetAsAnsiString;
+end;
+
+function TDACustomField.GetAsBoolean: boolean;
+begin
+ if Assigned(fField) then begin
+ if fField is TNumericField then
+ Result:= fField.AsInteger <> 0
+ else
+ Result:= fField.AsBoolean;
+ end
+ else if Assigned(FNativeField) then begin
+ Result := GetVarBoolean(FNativeField.Value);
+ end
+ else begin
+ Result:= inherited GetAsBoolean;
+ end;
+end;
+
+function TDACustomField.GetAsCurrency: currency;
+begin
+ if Assigned(fField) then
+ Result:= fField.AsCurrency
+ else if Assigned(FNativeField) then
+ Result := GetVarCurrency(FNativeField.Value)
+ else
+ Result:= inherited GetAsCurrency;
+end;
+
+function TDACustomField.GetAsDateTime: TDateTime;
+begin
+ if Assigned(fField) then
+ Result:= fField.AsDateTime
+ else if Assigned(FNativeField) then
+ Result := GetVarDateTime(FNativeField.Value)
+ else
+ Result:= inherited GetAsDateTime;
+end;
+
+function TDACustomField.GetAsFloat: double;
+begin
+ if Assigned(fField) then
+ Result:= fField.AsFloat
+ else if Assigned(FNativeField) then
+ Result := GetVarFloat(FNativeField.Value)
+ else
+ Result:= inherited GetAsFloat;
+end;
+
+function TDACustomField.GetAsInteger: integer;
+begin
+ if Assigned(fField) then
+ Result:= fField.AsInteger
+ else if Assigned(FNativeField) then
+ Result := GetVarInteger(FNativeField.Value)
+ else
+ Result:= inherited GetAsInteger;
+end;
+
+function TDACustomField.GetAsLargeInt: int64;
+begin
+ if Assigned(fField) and (fField.DataType = ftLargeInt) then
+ Result:= TLargeintField(fField).AsLargeint
+ else if Assigned(FNativeField) then
+ Result := GetVarInt64(FNativeField.Value)
+ else
+ result:= inherited GetAsLargeInt;
+end;
+
+function TDACustomField.GetAsString: string;
+begin
+ if Assigned(fField) then
+ Result:= fField.AsString
+ else if Assigned(FNativeField) then
+ Result := GetVarString(FNativeField.Value)
+ else
+ Result:= inherited GetAsString;
+end;
+
+function TDACustomField.GetAsVariant: variant;
+begin
+ if Assigned(fField) then
+ Result:= fField.AsVariant
+ else if Assigned(FNativeField) then
+ Result := FNativeField.Value
+ else
+ Result:= inherited GetAsVariant;
+end;
+
+function TDACustomField.GetAsWideString: Unicodestring;
+begin
+ if Assigned(fField) and (fField.DataType = ftWideString) then begin
+ if GetIsNull then
+ Result:=''
+ else
+ {$IFNDEF FPC}
+ Result := TWideStringField(fField).Value;
+ {$ELSE}
+ REsult:= inherited GetAsWideString;
+ {$ENDIF}
+ end
+ {$IFDEF DA_WideMemoSupport}
+ else if Assigned(fField) and (fField.DataType = ftWideMemo) then
+ Result := TWideMemoField(fField).Value
+ {$ENDIF DA_WideMemoSupport}
+ else if Assigned(FNativeField) then
+ Result := GetVarWideString(FNativeField.Value)
+ else
+ Result := inherited GetAsWideString;
+end;
+
+function TDACustomField.GetIsNull: boolean;
+begin
+ if Assigned(fField) then
+ Result:= fField.IsNull
+ else if Assigned(FNativeField) then
+ Result:= FNativeField.IsNull
+ else
+ Result:= inherited GetIsNull;
+end;
+
+procedure TDACustomField.SetAsAnsiString(const aValue: Ansistring);
+begin
+ if Assigned(fField) then
+ {$IFDEF DELPHI12UP}
+ fField.AsAnsiString := aValue
+ {$ELSE}
+ fField.AsString := aValue
+ {$ENDIF}
+ else
+ inherited SetAsAnsiString(aValue);
+end;
+
+procedure TDACustomField.SetAsBoolean(const aValue: boolean);
+begin
+ if Assigned(fField) then begin
+ if fField is TNumericField then
+ fField.AsInteger := Ord(aValue)
+ else
+ fField.AsBoolean := aValue;
+ end
+ else begin
+ inherited SetAsBoolean(aValue);
+ end;
+end;
+
+procedure TDACustomField.SetAsCurrency(const aValue: currency);
+begin
+ if Assigned(fField) then
+ fField.AsCurrency := aValue
+ else
+ inherited SetAsCurrency(aValue);
+end;
+
+procedure TDACustomField.SetAsDateTime(const aValue: TDateTime);
+begin
+ if Assigned(fField) then
+ fField.AsDateTime := aValue
+ else
+ inherited SetAsDateTime(aValue);
+end;
+
+procedure TDACustomField.SetAsFloat(const aValue: double);
+begin
+ if Assigned(fField) then
+ fField.AsFloat := aValue
+ else
+ inherited SetAsFloat(aValue);
+end;
+
+procedure TDACustomField.SetAsInteger(const aValue: integer);
+begin
+ if Assigned(fField) then
+ fField.AsInteger := aValue
+ else
+ inherited SetAsInteger(aValue);
+end;
+
+procedure TDACustomField.SetAsLargeInt(const aValue: Int64);
+begin
+ if Assigned(fField) and (fField.DataType = ftLargeInt) then
+ TLargeintField(fField).AsLargeInt := aValue
+ else
+ inherited SetAsLargeInt(aValue);
+end;
+
+procedure TDACustomField.SetAsString(const aValue: string);
+begin
+ if Assigned(fField) then
+ fField.AsString := aValue
+ else
+ inherited SetAsString(aValue);
+end;
+
+procedure TDACustomField.SetAsVariant(const aValue: variant);
+begin
+ if Assigned(fField) then
+ fField.AsVariant := aValue
+ else
+ inherited SetAsVariant(aValue);
+end;
+
+procedure TDACustomField.SetAsWideString(const aValue: Unicodestring);
+begin
+{$IFNDEF FPC}
+ if (fField<>nil) and (fField.DataType = ftWideString) then TWideStringField(fField).Value := aValue else
+{$ENDIF}
+{$IFDEF DA_WideMemoSupport}
+ if (fField<>nil) and (fField.DataType = ftWideMemo) then TWideMemoField(fField).Value := aValue else
+{$ENDIF}
+ inherited SetAsWideString(aValue);
+end;
+
+function TDACustomField.GetAsByte: Byte;
+begin
+ Result := GetAsSmallInt;
+end;
+
+function TDACustomField.GetAsCardinal: Cardinal;
+begin
+ Result := GetAsInteger;
+end;
+
+function TDACustomField.GetAsDecimal: TBcd;
+begin
+{$IFDEF ftFMTBCD_Support}
+ if Assigned(fField) and (fField.DataType = ftFmtBcd) then
+ result := TFMTBCDField(fField).AsBCD
+ else
+{$ENDIF}
+ if Assigned(fField) and (fField.DataType = ftBcd) then
+ {$IFNDEF FPC}
+ result := TBCDField(fField).AsBCD
+ {$ELSE}
+ Result := CurrToBCD(TBCDField(fField).Value)
+ {$ENDIF}
+ else if Assigned(FNativeField) then
+ Result := GetVarDecimal(FNativeField.Value)
+ else
+ result := inherited GetAsDecimal;
+end;
+
+function TDACustomField.GetAsGuid: TGUID;
+begin
+{$IFNDEF FPC}
+ if Assigned(fField) and (fField.DataType = ftGuid) then
+ result := TGuidField(fField).AsGuid
+ else
+{$ENDIF}
+ if Assigned(FNativeField) then
+ Result := GetVarGuid(GetAsString)
+ else
+ result := inherited GetAsGuid;
+end;
+
+function TDACustomField.GetAsLargeUInt: UInt64;
+begin
+ if Assigned(FNativeField) then
+ Result := GetVarLargeUInt(FNativeField.Value)
+ else
+ result := inherited GetAsLargeUInt;
+end;
+
+function TDACustomField.GetAsShortInt: ShortInt;
+begin
+ if Assigned(FNativeField) then
+ Result := GetVarShortInt(FNativeField.Value)
+ else
+ Result := GetAsSmallInt;
+end;
+
+function TDACustomField.GetAsSingle: Single;
+begin
+ if Assigned(fField) then
+ result := fField.AsFloat
+ else if Assigned(FNativeField) then
+ Result := GetVarSingleFloat(FNativeField.Value)
+ else
+ Result := inherited GetAsSingle;
+end;
+
+function TDACustomField.GetAsSmallInt: SmallInt;
+begin
+ if Assigned(fField) and (fField.DataType = ftSmallint) then
+ result := TSmallintField(fField).Value
+ else if Assigned(FNativeField) then
+ Result := GetVarSmallInt(FNativeField.Value)
+ else
+ result := inherited GetAsSmallInt;
+end;
+
+function TDACustomField.GetAsWord: Word;
+begin
+ if Assigned(fField) and (fField.DataType = ftWord) then
+ result := TWordField(fField).AsInteger
+ else if Assigned(FNativeField) then
+ Result := GetVarWord(FNativeField.Value)
+ else
+ result := inherited GetAsWord;
+end;
+
+function TDACustomField.GetAsXml: IXMLNode;
+var
+ s: string;
+ lDoc: IXMLDocument;
+begin
+ s := GetAsWideString;
+ if s = '' then result := nil else begin
+ lDoc := NewROXmlDocument;
+ lDoc.New;
+ lDoc.XML := s;
+ Result := lDoc.DocumentNode;
+ end;
+end;
+
+procedure TDACustomField.SetAsByte(const Value: Byte);
+begin
+ SetAsSmallInt(Value);
+end;
+
+procedure TDACustomField.SetAsCardinal(const Value: Cardinal);
+begin
+ SetAsInteger(Value);
+end;
+
+procedure TDACustomField.SetAsDecimal(const Value: TBcd);
+{$IFDEF FPC}
+var
+ lCur: Currency;
+{$ENDIF}
+begin
+{$IFDEF ftFMTBCD_Support}
+ if (fField<>nil) and (fField.DataType = ftFMTBcd) then
+ TFMTBCDField(fField).AsBCD := Value
+ else
+{$ENDIF}
+ if (fField<>nil) and (fField.DataType = ftBcd) then begin
+ {$IFNDEF FPC}
+ TBCDField(fField).AsBCD := Value
+ {$ELSE}
+ lCur := 0;
+ if BCDToCurr(Value, lCur) then
+ TBCDField(fField).Value := lCur
+ else
+ TBCDField(fField).AsFloat := BCDToDouble(Value)
+ {$ENDIF}
+ end
+ else
+ inherited SetAsDecimal(Value);
+end;
+
+procedure TDACustomField.SetAsGuid(const Value: TGUID);
+begin
+{$IFNDEF FPC}
+ if (fField<>nil) and (fField.DataType = ftGuid) then
+ TGuidField(fField).AsGuid := Value
+ else
+{$ENDIF}
+ inherited SetAsGuid(Value);
+end;
+
+procedure TDACustomField.SetAsLargeUInt(const Value: UInt64);
+begin
+ if Assigned(fField) then
+ fField.Value := Value
+ else
+ inherited SetAsLargeUInt(Value);
+end;
+
+procedure TDACustomField.SetAsShortInt(const Value: ShortInt);
+begin
+ SetAsSmallInt(Value);
+end;
+
+procedure TDACustomField.SetAsSingle(const Value: Single);
+begin
+ if Assigned(fField) then
+ SetAsFloat(Value)
+ else
+ inherited SetAsSingle(Value);
+end;
+
+procedure TDACustomField.SetAsSmallInt(const Value: SmallInt);
+begin
+ if Assigned(fField) and (fField.DataType = ftSmallint) then
+ TSmallintField(fField).Value := Value
+ else
+ inherited SetAsSmallInt(Value);
+end;
+
+procedure TDACustomField.SetAsWord(const Value: Word);
+begin
+ if Assigned(fField) and (fField.DataType = ftWord) then
+ TWordField(fField).AsInteger := Value
+ else
+ inherited SetAsWord(Value);
+end;
+
+procedure TDACustomField.SetAsXml(const Value: IXMLNode);
+begin
+ if (Value = nil) then
+ AsVariant := Null
+ else begin
+ SetAsWideString(Value.Xml);
+ end;
+end;
+
+procedure TDACustomField.SetDecimalPrecision(const Value: Integer);
+begin
+ inherited;
+ if Assigned(fField) then begin
+{$IFDEF ftFMTBCD_Support}
+ if fField is TFMTBCDField then TFMTBCDField(fField).Precision:=Value
+ else
+{$ENDIF}
+ if fField is TBCDField then TBCDField(fField).Precision:=Value;
+ end;
+end;
+
+function TDACustomField.GetDecimalPrecision: Integer;
+begin
+ Result:=inherited GetDecimalPrecision;
+ if Assigned(fField) then begin
+{$IFDEF ftFMTBCD_Support}
+ if fField is TFMTBCDField then Result := TFMTBCDField(fField).Precision
+ else
+{$ENDIF}
+ if fField is TBCDField then Result := TBCDField(fField).Precision;
+ end;
+end;
+
+function TDACustomField.GetDecimalScale: Integer;
+begin
+ Result:=inherited GetDecimalScale;
+ if Assigned(fField) then begin
+{$IFDEF ftFMTBCD_Support}
+ if fField is TFMTBCDField then Result := TFMTBCDField(fField).Size
+ else
+{$ENDIF}
+ if fField is TBCDField then Result := TBCDField(fField).Size;
+ end;
+end;
+
+procedure TDACustomField.SetDecimalScale(const Value: Integer);
+begin
+ inherited;
+ if Assigned(fField) then begin
+{$IFDEF ftFMTBCD_Support}
+ if fField is TFMTBCDField then TFMTBCDField(fField).Size:=Value
+ else
+{$ENDIF}
+ if fField is TBCDField then TBCDField(fField).Size:=Value;
+ end;
+end;
+
+procedure TDACustomField.Bind(aField: IDANativeField);
+begin
+ {$IFDEF Drivers_CompatibilityMode}
+ if aField.isTFieldCompatible then
+ Self.Bind(TField(aField.GetNativeObject))
+ else
+ {$ENDIF}
+ begin
+ if Assigned(aField) then begin
+ {$IFNDEF Drivers_CompatibilityMode}
+ if aField.isTFieldCompatible then fField := TField(aField.GetNativeObject);
+ {$ENDIF}
+ if DataType in [datFloat, datCurrency, datAutoInc, datInteger, datLargeInt,
+ datShortInt, datWord, datSmallInt, datCardinal, datLargeUInt,
+ datDecimal, datSingleFloat, datLargeAutoInc] then begin
+ aField.DecimalPrecision := DecimalPrecision;
+ aField.DecimalScale := DecimalScale;
+ end;
+ if DataType in [datBlob,datMemo,datWideMemo, datXml] then
+ {$IFDEF DA_WideMemoSupport}
+ if aField.DataType <> ftWideMemo then
+ {$ENDIF}
+ if BlobType <> dabtUnknown then
+ aField.DataType := BlobTypeMappings[BlobType];
+ end;
+ end;
+ fNativeField := aField;
+end;
+
+{ TDACustomFieldCollection }
+
+constructor TDACustomFieldCollection.Create(aOwner: TPersistent; aFieldClass: TDAFieldClass);
+begin
+ inherited Create(aOwner, aFieldClass);
+end;
+
+function TDACustomFieldCollection.Add: TDAField;
+begin
+ result := TDAField(inherited Add);
+end;
+
+function TDACustomFieldCollection.Add(const aName: string; aType: TDADataType; aSize: integer): TDACustomField;
+begin
+ result := Add;
+ result.Name := aName;
+ result.DataType := aType;
+ result.Size := aSize;
+end;
+
+procedure TDACustomFieldCollection.Bind(aDataset: TDataset);
+var
+ i: integer;
+ lDAField: TDACustomField;
+ lField: TField;
+begin
+ Check(aDataset = nil, err_InvalidDataset);
+ try
+ for i := 0 to (Count - 1) do begin
+ lDAField := Fields[i];
+ lField := aDataset.FindField(lDAField.SQLOrigin);
+ if (not Assigned(lField)) and (not lDAField.Calculated) and not (lDAField.ServerCalculated) and not (lDAField.Lookup) then
+ RaiseError(err_CannotFindField, [lDAField.SQLOrigin])
+ else
+ lDAField.Bind(lField);
+ end;
+ except
+ Unbind;
+ raise;
+ end;
+end;
+
+procedure TDACustomFieldCollection.Assign(Source: TPersistent);
+begin
+ if (Source is TDACustomFieldCollection) then begin
+ AssignFieldCollection(TDACustomFieldCollection(Source));
+ end
+ else
+ inherited;
+end;
+
+procedure TDACustomFieldCollection.AssignFieldCollection(Source: TDACustomFieldCollection);
+var
+ i: integer;
+ src: TDACustomFieldCollection;
+ fld: TDAField;
+begin
+ src := TDACustomFieldCollection(Source);
+
+ Clear;
+
+ if not Assigned(Source) then Exit;
+
+ for i := 0 to (src.Count - 1) do begin
+ fld := Add;
+ fld.AssignField(src[i]);
+ end;
+end;
+
+function TDACustomFieldCollection.FieldByName(const aName: string): TDACustomField;
+begin
+ result := TDACustomField(inherited ItemByName(aName))
+end;
+
+function TDACustomFieldCollection.FindField(const aName: string): TDACustomField;
+begin
+ result := TDACustomField(inherited FindItem(aName))
+end;
+
+function TDACustomFieldCollection.GetFields(Index: integer): TDACustomField;
+begin
+ result := TDACustomField(inherited Items[Index])
+end;
+
+procedure TDACustomFieldCollection.SetFields(Index: integer; const Value: TDACustomField);
+begin
+ Fields[Index].Assign(Value);
+end;
+
+procedure TDACustomFieldCollection.Unbind;
+var
+ i: integer;
+begin
+ for i := 0 to (Count - 1) do
+ Fields[i].Unbind;
+end;
+
+function TDACustomFieldCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result:= TDACustomField(anItem).Name;
+end;
+
+function TDACustomFieldCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDACustomField(anItem).Name := aName;
+end;
+
+procedure TDACustomFieldCollection.Bind(
+ aNativeObject: IDASQLCommandNativeObject);
+var
+ i: integer;
+ lDAField: TDACustomField;
+ lField: IDANativeField;
+begin
+{$IFDEF Drivers_CompatibilityMode}
+ if (aNativeObject <> nil) and aNativeObject.IsTDatasetCompatible then
+ Bind(TDataset(aNativeObject.NativeObject))
+ else
+{$ENDIF}
+ try
+ for i := 0 to (Count - 1) do begin
+ lDAField := Fields[i];
+ lField := aNativeObject.NativeFindField(lDAField.SQLOrigin);
+ if (not Assigned(lField)) and (not lDAField.Calculated) and not (lDAField.ServerCalculated) and not (lDAField.Lookup) then
+ RaiseError(err_CannotFindField, [lDAField.SQLOrigin])
+ else if Assigned(lField) then
+ lDAField.Bind(lField);
+ end;
+ except
+ Unbind;
+ raise;
+ end;
+end;
+
+{ TDAFieldCollection }
+
+constructor TDAFieldCollection.Create(aOwner: TPersistent);
+begin
+ inherited Create(aOwner, TDAField);
+end;
+
+function TDAFieldCollection.FieldByName(const aName: string): TDAField;
+begin
+ result := TDAField(inherited ItemByName(aName))
+end;
+
+function TDAFieldCollection.FindField(const aName: string): TDAField;
+begin
+ result := TDAField(inherited FindItem(aName))
+end;
+
+function TDAFieldCollection.GetFields(Index: integer): TDAField;
+begin
+ result := TDAField(inherited Items[Index])
+end;
+
+procedure TDAFieldCollection.SetFields(Index: integer; const Value: TDAField);
+begin
+ Fields[Index].Assign(Value);
+end;
+
+{ TDAParam }
+
+function TDAParam.GetParamType: TDAParamType;
+begin
+ result := fParamType;
+end;
+
+procedure TDAParam.LoadFromFile(const aFileName: string);
+begin
+ LoadFromStream(NewROStream(TFileStream.Create(aFileName, fmOpenRead), TRUE));
+end;
+
+procedure TDAParam.SaveToFile(const aFileName: string);
+begin
+ SaveToStream(NewROStream(TFileStream.Create(aFileName, fmCreate), TRUE));
+end;
+
+procedure TDAParam.LoadFromStream(const aStream: IROStream);
+begin
+ Value := VariantBinaryFromRawBinary(aStream.Stream);
+end;
+
+procedure TDAParam.SaveToStream(const aStream: IROStream);
+begin
+ VariantBinaryToRawBinary(Value, aStream.Stream);
+end;
+
+procedure TDAParam.SetParamType(Value: TDAParamType);
+begin
+ fParamType := Value;
+end;
+
+procedure TDAParam.AssignField(Source: TDABaseField);
+begin
+ inherited;
+ if Source is TDAParam then
+ ParamType := TDAParam(Source).ParamType;
+end;
+
+procedure TDAParam.SetValue(const aValue: Variant);
+var
+ d: TDecimal;
+begin
+ if (DataType = datDecimal) and VarByteArrayToDecimal(aValue,d) then
+ asString := DecimalToString(d,DecimalSeparator)
+ else
+ inherited SetValue(aValue);
+end;
+
+procedure TDAParam.AssignParam(Source: TDAParam);
+begin
+ inherited AssignField(Source);
+ ParamType := Source.ParamType;
+end;
+
+{ TDAParamCollection }
+
+function TDAParamCollection.Add: TDAParam;
+begin
+ result := TDAParam(inherited Add)
+end;
+
+constructor TDAParamCollection.Create(aOwner: TPersistent);
+begin
+ inherited Create(aOwner, TDAParam);
+end;
+
+function TDAParamCollection.FindParam(
+ const aParamName: string): TDAParam;
+begin
+ result := TDAParam(inherited FindItem(aParamName));
+end;
+
+function TDAParamCollection.GetParams(Index: integer): TDAParam;
+begin
+ result := TDAParam(inherited Items[Index])
+end;
+
+function TDAParamCollection.ParamByName(const aName: string): TDAParam;
+begin
+ result := TDAParam(inherited ItembyName(aName))
+end;
+
+procedure TDAParamCollection.ReadValues(InputParams: TParams);
+var
+ i: integer;
+ par: TDAParam;
+begin
+ for i := 0 to (Count - 1) do begin
+ par := Params[i];
+ par.Value := InputParams.ParamByName(par.Name).Value;
+ end;
+end;
+
+procedure TDAParamCollection.SetParams(Index: integer; const Value: TDAParam);
+begin
+ Params[Index].Assign(Value);
+end;
+
+procedure TDAParamCollection.WriteValues(OutputParams: TParams);
+var
+ i: integer;
+ par: TDAParam;
+ outpar: TParam;
+begin
+ for i := 0 to (Count - 1) do begin
+ par := Params[i];
+ outpar := OutputParams.ParamByName(par.Name);
+ if par.DataType = datBlob then begin
+ outpar.DataType := ftBlob;
+ outpar.Value := VariantToAnsiString(par.Value);
+ { ToDo: make sure this is valid for ALL Data Drivers, only tested with IBX so far. mh. }
+ end
+ else begin
+ outpar.Value := par.Value;
+ end;
+ //outpar.Size := par.Size; // Seems to fix an ADO problem with size of parameters with SDAC
+ end;
+end;
+
+procedure TDAParamCollection.Assign(Source: TPersistent);
+begin
+ if (Source is TDAParamCollection) then begin
+ AssignParamCollection(TDAParamCollection(Source))
+ end
+ else
+ inherited;
+end;
+
+procedure TDAParamCollection.AssignParamCollection(Source: TDAParamCollection);
+var
+ i: integer;
+begin
+ Clear;
+ for i := 0 to (Source.Count - 1) do
+ Add.AssignParam(Source[i]);
+end;
+
+function TDAParamCollection.GetHasInputParams: boolean;
+var
+ i: Integer;
+begin
+ result := false;
+ for i := 0 to Count-1 do begin
+ if Params[i].ParamType in [daptUnknown, daptInput, daptInputOutput] then begin
+ result := true;
+ exit;
+ end;
+ end; { for }
+end;
+
+function TDAParamCollection.GetItemName(anItem: TCollectionItem): string;
+begin
+ Result := TDAParam(anItem).Name;
+end;
+
+function TDAParamCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDAParam(anItem).Name := aName;
+end;
+
+{ TDASQLCommand }
+
+procedure TDASQLCommand.Assign(aSource: TPersistent);
+var
+ lSource: TDASQLCommand;
+begin
+ if (aSource is TDASQLCommand) then begin
+ lSource := TDASQLCommand(aSource);
+ fName := lSource.fName;
+ fDescription := lSource.fDescription;
+ fStatements.Assign(lSource.fStatements);
+ fParams.Assign(lSource.fParams);
+ fCustomAttributes.Assign(lSource.CustomAttributes);
+ FDynamicWhereXML := lSource.FDynamicWhereXML;
+ end
+ else begin
+ inherited;
+ end;
+end;
+
+constructor TDASQLCommand.Create(Collection: TCollection);
+begin
+ inherited;
+ fIsPublic := true;
+ fStatements := TDAStatementCollection.Create(nil, Self);
+ fParams := TDAParamCollection.Create(nil);
+ fCustomAttributes := TStringList.Create;
+end;
+
+destructor TDASQLCommand.Destroy;
+begin
+ fCustomAttributes.Free;
+ fStatements.Free;
+ fParams.Free;
+
+ inherited;
+end;
+
+function TDASQLCommand.GetDisplayName: string;
+begin
+ result := Name;
+end;
+
+function TDASQLCommand.GetParams: TDAParamCollection;
+begin
+ result := fParams;
+end;
+
+function TDASQLCommand.GetSQLCommandCollection: TDASQLCommandCollection;
+begin
+ result := TDASQLCommandCollection(Collection);
+end;
+
+function TDASQLCommand.ParamByName(const aName: string): TDAParam;
+begin
+ result := fParams.ParamByName(aName)
+end;
+
+procedure TDASQLCommand.SetCustomAttributes(const Value: TStrings);
+begin
+ fCustomAttributes.Assign(Value);
+end;
+
+procedure TDASQLCommand.SetDisplayName(const Value: string);
+begin
+ inherited;
+ SetName(Value);
+end;
+
+procedure TDASQLCommand.SetName(const Value: string);
+var
+ lOldName: string;
+begin
+ lOldName := fName;
+ fName := Value;
+ if lOldName <> '' then
+ (Collection as TSearcheableCollection).TriggerOnItemRenamed(lOldName, fName);
+end;
+
+procedure TDASQLCommand.SetParams(const Value: TDAParamCollection);
+begin
+ fParams.Assign(Value);
+end;
+
+procedure TDASQLCommand.SetStatements(const Value: TDAStatementCollection);
+begin
+ fStatements.Assign(Value);
+end;
+
+function TDASQLCommand.GetStatements(): TDAStatementCollection;
+begin
+ result := fStatements;
+end;
+
+
+procedure TDASQLCommand.SetDynamicWhereXML(const Value: UnicodeString);
+begin
+ FDynamicWhereXML := Value;
+end;
+
+{ TDADataset }
+
+procedure TDADataset.Assign(aSource: TPersistent);
+var
+ lSource: TDADataset;
+begin
+ if (aSource is TDADataset) then begin
+ inherited; { Need to work the TDASQLCommand, too}
+ lSource := TDADataset(aSource);
+ fFields.Assign(lSource.Fields);
+ end
+ else begin
+ inherited;
+ end;
+end;
+
+constructor TDADataset.Create(Collection: TCollection);
+begin
+ inherited;
+ fFields := TDAFieldCollection.Create(self);
+ fBusinessRulesServer := TDABusinessRuleScript.Create();
+ fBusinessRulesClient := TDAClientBusinessRuleScript.Create();
+end;
+
+destructor TDADataset.Destroy;
+begin
+ FreeAndNil(fFields);
+ FreeAndNil(fBusinessRulesServer);
+ FreeAndNil(fBusinessRulesClient);
+ inherited;
+end;
+
+function TDADataset.FieldByName(const aName: string): TDAField;
+begin
+ result := Fields.FieldByName(aName)
+end;
+
+function TDADataset.FindField(const aName: string): TDAField;
+begin
+ result := Fields.FindField(aName)
+end;
+
+procedure TDADataset.SetBusinessRulesClient(const Value: TDAClientBusinessRuleScript);
+begin
+ fBusinessRulesClient.Assign(Value);
+end;
+
+procedure TDADataset.SetBusinessRulesServer(const Value: TDABusinessRuleScript);
+begin
+ fBusinessRulesServer.Assign(Value);
+end;
+
+procedure TDADataset.SetFields(const Value: TDAFieldCollection);
+begin
+ fFields.Assign(Value);
+end;
+
+{ TDASQLCommandCollection }
+
+function TDASQLCommandCollection.Add: TDASQLCommand;
+begin
+ result := TDASQLCommand(inherited Add)
+end;
+
+constructor TDASQLCommandCollection.Create(aOwner: TComponent);
+begin
+ inherited Create(aOwner, GetItemClass);
+end;
+
+function TDASQLCommandCollection.GetItemClass: TDASQLCommandClass;
+begin
+ result := TDASQLCommand;
+end;
+
+function TDASQLCommandCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result := TDASQLCommand(anItem).Name;
+end;
+
+function TDASQLCommandCollection.GetSQLCommands(
+ Index: integer): TDASQLCommand;
+begin
+ result := TDASQLCommand(inherited Items[Index]);
+end;
+
+function TDASQLCommandCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDASQLCommand(anItem).Name := aName;
+end;
+
+procedure TDASQLCommandCollection.SetSQLCommands(Index: integer;
+ const Value: TDASQLCommand);
+begin
+ SQLCommands[Index].Assign(Value);
+end;
+
+function TDASQLCommandCollection.SQLCommandByName(
+ const aName: string): TDASQLCommand;
+begin
+ result := TDASQLCommand(inherited ItemByName(aName));
+end;
+
+{ TDADatasetCollection }
+
+function TDADatasetCollection.Add: TDADataset;
+begin
+ result := TDADataset(inherited Add);
+end;
+
+function TDADatasetCollection.DatasetByName(const aName: string): TDADataset;
+begin
+ result := TDADataset(inherited ItemByName(aName));
+end;
+
+function TDADatasetCollection.FindDatasetByName(const aName: string): TDADataset;
+begin
+ result := TDADataset(inherited FindItem(aName));
+end;
+
+function TDADatasetCollection.GetDatasets(Index: integer): TDADataset;
+begin
+ result := TDADataset(inherited Items[Index]);
+end;
+
+function TDADatasetCollection.GetItemClass: TDASQLCommandClass;
+begin
+ result := TDADataset;
+end;
+
+procedure TDADatasetCollection.SetDatasets(Index: integer;
+ const Value: TDADataset);
+begin
+ Datasets[Index].Assign(Value);
+end;
+
+{ TDAConnectionCollection }
+
+function TDAConnectionCollection.Add: TDAConnection;
+begin
+ result := TDAConnection(inherited Add);
+end;
+
+procedure TDAConnectionCollection.ClearDefaults(iExceptFor: TDAConnection);
+var
+ i: integer;
+begin
+ for i := 0 to Count - 1 do begin
+ if (Connections[i] <> iExceptFor) then Connections[i].Default := false;
+ end;
+end;
+
+function TDAConnectionCollection.ConnectionByName(
+ const aName: string): TDAConnection;
+begin
+ result := TDAConnection(inherited ItemByName(aName));
+end;
+
+constructor TDAConnectionCollection.Create(aOwner: TPersistent);
+begin
+ inherited Create(aOwner, TDAConnection);
+end;
+
+function TDAConnectionCollection.FindConnection(const aName,
+ aType: string): TDAConnection;
+var
+ i: Integer;
+begin
+ if aName <> '' then begin
+ for i := 0 to Count -1 do begin
+ if GetConnections(i).Name = aName then begin
+ Result := GetConnections(i);
+ exit;
+ end;
+ end;
+ end;
+ if aType <> '' then begin
+ for i := 0 to Count -1 do begin
+ if GetConnections(i).ConnectionType = aType then begin
+ Result := GetConnections(i);
+ exit;
+ end;
+ end;
+ end;
+ result := nil;
+end;
+
+function TDAConnectionCollection.GetConnections(
+ Index: integer): TDAConnection;
+begin
+ result := TDAConnection(inherited Items[Index]);
+end;
+
+function TDAConnectionCollection.GetDefaultConnection: TDAConnection;
+begin
+ result := inherited GetDefaultItem as TDAConnection;
+end;
+
+function TDAConnectionCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result := TDAConnection(anItem).Name;
+end;
+
+function TDAConnectionCollection.ItemName: string;
+begin
+ result := 'connection';
+end;
+
+procedure TDAConnectionCollection.SetConnections(Index: integer;
+ const Value: TDAConnection);
+begin
+ Connections[Index].Assign(Value);
+end;
+
+function TDAConnectionCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDAConnection(anItem).Name := aName;
+end;
+
+{ TDAConnection }
+
+procedure TDAConnection.Assign(aSource: TPersistent);
+var
+ lSource: TDAConnection;
+begin
+ if (aSource is TDAConnection) then begin
+ lSource := TDAConnection(aSource);
+ fDescription := lSource.fDescription;
+ ConnectionString := lSource.ConnectionString;
+ ConnectionType := lSource.ConnectionType;
+ fName := '_____' + lSource.fName;
+ fDefault := false;
+ end
+ else begin
+ inherited;
+ end;
+end;
+
+function TDAConnection.GetConnectionString: string;
+begin
+ result := fConnectionString;
+end;
+
+function TDAConnection.GetDisplayName: string;
+begin
+ if (Trim(Name) = '') then
+ result := ''
+ else
+ result := Name;
+
+ //if Default then result := result+' - [Default]';
+end;
+
+procedure TDAConnection.SetConnectionString(const aValue: string);
+begin
+ if fConnectionString <> aValue then
+ fConnectionString := aValue;
+end;
+
+procedure TDAConnection.SetDefault(const Value: boolean);
+begin
+ if (fDefault <> Value) then begin
+ fDefault := Value;
+ if Default then begin
+ (Collection as TDAConnectionCollection).ClearDefaults(self);
+ end;
+ end;
+end;
+
+procedure TDAConnection.SetDisplayName(const Value: string);
+begin
+ inherited;
+ SetName(Value);
+end;
+
+procedure TDAConnection.SetName(const Value: string);
+var
+ lOldName: string;
+begin
+ if (Value <> fName) then begin
+ lOldName := fName;
+ fName := Value;
+ if lOldName <> '' then
+ (Collection as TDAConnectionCollection).TriggerOnItemRenamed(lOldName, fName);
+ end;
+end;
+
+{ TDAStatement }
+
+procedure TDAStatement.Assign(aSource: TPersistent);
+var
+ lSource: TDAStatement;
+begin
+ if (aSource is TDAStatement) then begin
+ lSource := TDAStatement(aSource);
+ fSQL := lSource.fSQL;
+ fStatementType := lSource.fStatementType;
+ fConnection := lSource.fConnection;
+ fConnectionType := lSource.fConnectionType;
+ fColumnMappings.Assign(lSource.fColumnMappings);
+ fTargetTable := lSource.fTargetTable;
+ fDefault := lSource.fDefault;
+ end
+ else begin
+ inherited;
+ end;
+end;
+
+constructor TDAStatement.Create(Collection: TCollection);
+begin
+ inherited;
+ fColumnMappings := TDAColumnMappingCollection.Create(Self);
+end;
+
+destructor TDAStatement.Destroy;
+begin
+ fColumnMappings.Free;
+
+ inherited;
+end;
+
+function TDAStatement.GetDisplayName: string;
+begin
+ if Connection <> '' then
+ result := Connection
+ else
+ if ConnectionType <> '' then
+ result := '[' + ConnectionType + ']'
+ else
+ if Name <> '' then
+ result := Name
+ else
+ result := '';
+end;
+
+function TDAStatement.GetNeedsParams: boolean;
+const
+ arr: TDAQuoteCharArray = ('"','"');
+var
+ lParams: TParams;
+begin
+ lParams := TParams.Create;
+ try
+ Params_ParseSQL(lParams,SQL, True, arr, True);
+ result := (lParams.Count > 0);
+ finally
+ lParams.Free;
+ end;
+end;
+
+function TDAStatement.GetStatementCollection: TDAStatementCollection;
+begin
+ result := TDAStatementCollection(Collection);
+end;
+
+procedure TDAStatement.SetColumnMappings(
+ const Value: TDAColumnMappingCollection);
+begin
+ fColumnMappings.Assign(Value);
+end;
+
+procedure TDAStatement.SetSQL(const Value: string);
+begin
+ fSQL := Value;
+end;
+
+function TDAStatement.StoreSQL: Boolean;
+begin
+ Result := fStatementType <> stAutoSQL;
+end;
+
+{ TDAColumnMappingCollection }
+
+function TDAColumnMappingCollection.Add: TDAColumnMapping;
+begin
+ result := TDAColumnMapping(inherited Add);
+end;
+
+procedure TDAColumnMappingCollection.AssignColumnMapping(aSource: TPersistent);
+var
+ i: Integer;
+begin
+ Clear;
+ for i := 0 to TDAColumnMappingCollection(aSource).Count -1 do begin
+ Add.AssignFieldMapping(TDAColumnMappingCollection(aSource)[i]);
+ end;
+end;
+
+constructor TDAColumnMappingCollection.Create(aOwner: TPersistent);
+begin
+ inherited Create(aOwner, TDAColumnMapping);
+end;
+
+function TDAColumnMappingCollection.FindMappingByDatasetField(
+ const aDatasetField: string): TDAColumnMapping;
+var
+ i: integer;
+begin
+ result := nil;
+
+ for i := 0 to (Count - 1) do
+ if SameText(ColumnMappings[i].DatasetField, aDatasetField) then begin
+ result := ColumnMappings[i];
+ Exit;
+ end;
+end;
+
+function TDAColumnMappingCollection.GetColumnMappings(
+ Index: integer): TDAColumnMapping;
+begin
+ result := TDAColumnMapping(inherited Items[Index])
+end;
+
+function TDAColumnMappingCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ result := TDAColumnMapping(anItem).DatasetField;
+end;
+
+function TDAColumnMappingCollection.MappingByDatasetField(
+ const aDatasetField: string): TDAColumnMapping;
+begin
+ result := TDAColumnMapping(inherited ItemByName(aDatasetField))
+end;
+
+function TDAColumnMappingCollection.MappingByTableField(
+ const aTableField: string): TDAColumnMapping;
+var
+ i: integer;
+begin
+ result := nil;
+
+ for i := 0 to (Count - 1) do
+ if SameText(ColumnMappings[i].TableField, aTableField) then begin
+ result := ColumnMappings[i];
+ Exit;
+ end;
+
+ RaiseError('Cannot find mapping for table field %s', [aTableField]);
+end;
+
+procedure TDAColumnMappingCollection.SetColumnMappings(Index: integer;
+ const Value: TDAColumnMapping);
+begin
+ TDAColumnMapping(inherited Items[Index]).AssignTo(Value);
+end;
+
+function TDAColumnMappingCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDAColumnMapping(anItem).DatasetField := aName;
+end;
+
+{ TDAWhere }
+
+function TDAWhere.GetProperName(aField: TDACustomField) : string;
+begin
+ if fClientFields
+ then result := ClientFieldPrefix+aField.Name
+ else result := aField.TableField
+end;
+
+function TDAWhere.AddCondition(const FieldName: string;
+ Condition: TDASQLCondition; const Value: Variant; SkipIfEmptyValue: boolean = TRUE): boolean;
+var
+ isstr, isnull, isfloat, isCurr: boolean;
+ fld: TDACustomField;
+ fieldnametouse : string;
+ str: string;
+ oldDecimalSeparator: Char;
+begin
+ result := FALSE;
+
+ fld := fFields.FindField(FieldName);
+
+ isnull := VarIsNull(Value) or (VarIsType(Value, [varString, varOleStr, varUString]) and (Value = ''))
+ or (VarIsType(Value, [varDate]) and (Value = 0));
+ if isnull and SkipIfEmptyValue and not (Condition in [cIsNull,cIsNotNull]) then Exit;
+ if fLastWasCondition then
+ begin
+ case fDefaultOperator of
+ doAnd: AddOperator(opAND);
+ doOr: AddOperator(opOR);
+ end;
+ end;
+ fLastWasCondition := True;
+
+ if fld <> nil then
+ fieldnametouse := GetProperName(fld) // Changed by AleF: WHERE clauses cannot work with field aliases like "FieldA as XYZ"
+ else
+ fieldnametouse := FieldName;
+
+ fClause := fClause + '(' + fieldnametouse + ' ' + StrSQLCondition[Condition] + ' ';
+
+ isstr := (fld <> nil) and (fld.DataType in [datWideString, datWideMemo, datString, datDateTime, datMemo]);
+ isfloat := (fld <> nil) and (fld.DataType in [datFloat, datSingleFloat]);
+ isCurr :=(fld <> nil) and (fld.DataType in [datCurrency, datDecimal]);
+
+ case Condition of
+ cIsNull, cIsNotNull:begin
+ fClause := TrimRight(fClause) + ')';
+ end;
+ else begin
+ if isstr then begin
+ str := VarToStr(Value);
+ if Condition = cIn then
+ fClause := fClause + '(' + str + '))'
+ else
+ fClause := fClause + '''' + str + ''')'
+ end
+ else begin
+ if isfloat or isCurr then begin
+ oldDecimalSeparator := DecimalSeparator;
+ DecimalSeparator := '.';
+ try
+ if isfloat then str:= FloatToStr(Value)
+ else str:=CurrToStrF(Value,ffGeneral,4);
+ finally
+ DecimalSeparator := oldDecimalSeparator;
+ end;
+ end
+ else
+ str := VarToStr(Value);
+ if Condition = cIn then
+ fClause := fClause + '(' + str + '))'
+ else
+ fClause := fClause + str + ')';
+ end;
+ end;
+ end;
+ result := TRUE;
+ Changed := True;
+
+ if Assigned(OnChange) then OnChange(Self);
+end;
+
+procedure TDAWhere.AddValueGroup(const FieldName: string;
+ const Values: array of Variant);
+var
+ fld: TDAField;
+ isstr: boolean;
+ cnt, i: integer;
+ fieldnametouse : string;
+begin
+ fld := fFields.FieldByName(FieldName);
+
+ if fLastWasCondition then
+ begin
+ case fDefaultOperator of
+ doAnd: AddOperator(opAND);
+ doOr: AddOperator(opOR);
+ end;
+ end;
+ fLastWasCondition := True;
+
+ fieldnametouse := GetProperName(fld); // Changed by AleF: WHERE clauses cannot work with field aliases like "FieldA as XYZ"
+
+ if (Length(Values) > 0) then begin
+ isstr := (fld.DataType in [datWideString, datWideMemo, datString, datDateTime, datMemo]);
+
+ fClause := fClause + '(' + fieldnametouse + ' ' + StrSQLCondition[cIn] + ' (';
+
+ cnt := High(Values);
+ for i := 0 to cnt do begin
+ if isstr then
+ fClause := fClause + '''' + VarToStr(Values[i]) + ''''
+ else
+ fClause := fClause + VarToStr(Values[i]) + '';
+
+ if (i < cnt) then fClause := fClause + ', ';
+ end;
+ fClause := fClause + '))';
+ end;
+ Changed := True;
+ if Assigned(OnChange) then OnChange(Self);
+end;
+
+constructor TDAWhere.Create(const aFields: TDAFieldCollection; aClientFields : boolean);
+begin
+ inherited Create;
+ fDefaultOperator := doAnd;
+ fFields := aFields;
+ fClientFields := aClientFields;
+end;
+
+{$WARN SYMBOL_DEPRECATED OFF} // Delphi warns you about implementing a method that's deprecated in the interface.
+
+procedure TDAWhere.OpenBraket;
+begin
+ OpenBracket();
+end;
+
+procedure TDAWhere.CloseBraket;
+begin
+ CloseBracket();
+end;
+
+{$WARN SYMBOL_DEPRECATED ON}
+
+procedure TDAWhere.OpenBracket;
+begin
+ fClause := fClause + '(';
+ Changed := True;
+ if Assigned(OnChange) then OnChange(Self);
+end;
+
+procedure TDAWhere.CloseBracket;
+begin
+ fClause := fClause + ')';
+ Changed := True;
+ if Assigned(OnChange) then OnChange(Self);
+end;
+
+procedure TDAWhere.AddOperator(aOperator: TDASQLOperator);
+begin
+ fClause := fClause + ' ' + StrSQLOperator[aOperator] + ' ';
+ Changed := True;
+ fLastWasCondition := False;
+ if Assigned(OnChange) then OnChange(Self);
+end;
+
+procedure TDAWhere.Clear;
+begin
+ fClause := '';
+ fLastWasCondition := false;
+ Changed := True;
+ if Assigned(OnChange) then OnChange(Self);
+end;
+
+procedure TDAWhere.AddText(const someText: string; MapClientFields : boolean = TRUE);
+var s : string;
+ i : integer;
+begin
+ s := someText;
+
+ if MapClientFields then begin
+ for i := 0 to (Fields.Count-1) do
+ s := StringReplace(s, ClientFieldPrefix+Fields[i].Name, Fields[i].TableField, [rfReplaceAll, rfIgnoreCase]);
+ end;
+
+ fClause := fClause + s;
+
+ Changed := True;
+ if Assigned(OnChange) then OnChange(Self);
+end;
+
+procedure TDAWhere.AddSpaces(Count: integer = 1);
+var
+ i: integer;
+begin
+ for i := 1 to Count do
+ fClause := fClause + ' ';
+
+ Changed := True;
+ if Assigned(OnChange) then OnChange(Self);
+end;
+
+function TDAWhere.GetEmpty: boolean;
+begin
+ result := Trim(fClause)=''
+end;
+
+function TDAWhere.GetNotEmpty: boolean;
+begin
+ result := not Empty
+end;
+
+function TDAWhere.AddConditions(const FieldNames: array of string;
+ const Conditions: array of TDASQLCondition;
+ const Values: array of Variant;
+ const Operator: TDASQLOperator): integer;
+var i : integer;
+ isnull : boolean;
+ // oldclause : string;
+ oldonchange : TNotifyEvent;
+begin
+ result := 0;
+// oldclause := fClause;
+ oldonchange := OnChange;
+ OnChange := NIL;
+ try
+ for i := 0 to Length(FieldNames)-1 do begin
+ isnull := VarIsNull(Values[i]) or (VarIsType(Values[i], [varString, varOleStr, varUString]) and (Values[i] = ''));
+ if isnull and not (Conditions[i] in [cIsNull,cIsNotNull]) then Continue;
+
+ if NotEmpty then AddOperator(Operator);
+ AddCondition(FieldNames[i], Conditions[i], Values[i], TRUE);
+ Inc(result);
+ end;
+ finally
+ // This is to avoid OnChange fireing for each condition in the loop above
+ OnChange := oldonchange;
+ Changed := True;
+ if Assigned(OnChange) then OnChange(Self);
+ end;
+end;
+
+function TDAWhere.AddCondition(const FieldName: string;
+ Condition: TDASQLCondition): boolean;
+begin
+ Result:=AddCondition(FieldName,Condition,0);
+end;
+
+{ TDAColumnMapping }
+
+procedure TDAColumnMapping.Assign(aSource: TPersistent);
+var
+ lSource: TDAColumnMapping;
+begin
+ if (aSource is TDAColumnMapping) then begin
+ lSource := TDAColumnMapping(aSource);
+ fDatasetField := lSource.fDatasetField;
+ fTableField := lSource.fTableField;
+ end
+ else begin
+ inherited;
+ end;
+end;
+
+procedure TDAColumnMapping.AssignFieldMapping(aSource: TPersistent);
+var
+ lSource: TDAColumnMapping;
+begin
+ lSource := TDAColumnMapping(aSource);
+ fDatasetField := lSource.fDatasetField;
+ fTableField := lSource.fTableField;
+ fSQLOrigin := lSource.fSQLOrigin;
+end;
+
+function TDAColumnMapping.GetSQLOrigin: string;
+begin
+ if (fSQLOrigin='')
+ then result := TableField
+ else result := fSQLOrigin
+end;
+
+procedure TDAColumnMapping.SetDatasetField(const Value: string);
+begin
+ fDatasetField := Trim(Value);
+end;
+
+procedure TDAColumnMapping.SetSQLOrigin(const Value: string);
+begin
+ fSQLOrigin:= Trim(Value)
+end;
+
+procedure TDAColumnMapping.SetTableField(const Value: string);
+begin
+ fTableField := Trim(Value);
+end;
+
+function TDAColumnMapping.StoreSQLOrigin: Boolean;
+begin
+ result := (fSQLOrigin <> fTableField) and (Trim(fSQLOrigin)<>'')
+end;
+
+{ TDAClientBusinessRuleScript }
+
+constructor TDAClientBusinessRuleScript.Create;
+begin
+ inherited;
+ fRunOnClientAndServer := true;
+ fCompileOnServer := true;
+end;
+
+{ TDADriverForeignKey }
+
+function TDADriverForeignKey.GetValue(const Index: Integer): string;
+begin
+ result := fValues[Index];
+end;
+
+procedure TDADriverForeignKey.SetValue(const Index: Integer; const Value: string);
+begin
+ fValues[Index] := Value;
+end;
+
+{ TDADriverForeignKeyCollection }
+
+constructor TDADriverForeignKeyCollection.Create(aOwner: TPersistent);
+begin
+ inherited Create(aOwner, TDADriverForeignKey);
+end;
+
+function TDADriverForeignKeyCollection.Add: TDADriverForeignKey;
+begin
+ result := TDADriverForeignKey(inherited Add());
+end;
+
+function TDADriverForeignKeyCollection.GetForeignKeys(Index: integer): TDADriverForeignKey;
+begin
+ result := TDADriverForeignKey(inherited Items[Index]);
+end;
+
+procedure TDADriverForeignKeyCollection.SetForeignKeys(Index: integer; const Value: TDADriverForeignKey);
+begin
+ inherited Items[Index].Assign(Value);
+end;
+
+{ TDAUpdateRuleCollection }
+
+function TDAUpdateRuleCollection.Add: TDAUpdateRule;
+begin
+ result := inherited Add() as TDAUpdateRule;
+end;
+
+constructor TDAUpdateRuleCollection.Create(aOwner : TComponent);
+begin
+ inherited Create(aOwner, TDAUpdateRule);
+end;
+
+function TDAUpdateRuleCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result := TDAUpdateRule(anItem).Name;
+end;
+
+function TDAUpdateRuleCollection.GetUpdateRules(
+ Index: integer): TDAUpdateRule;
+begin
+ result := TDAUpdateRule(inherited Items[Index]);
+end;
+
+function TDAUpdateRuleCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDAUpdateRule(anItem).Name := aName;
+end;
+
+function TDAUpdateRuleCollection.UpdateRuleByName(
+ const aName: string): TDAUpdateRule;
+begin
+ result := ItemByName(aName) as TDAUpdateRule;
+end;
+
+{ TDAUpdateRule }
+
+procedure TDAUpdateRule.Assign(aSource: TPersistent);
+var
+ lSource: TDAUpdateRule;
+begin
+ lSource := aSource as TDAUpdateRule;
+ fDatasetName := lSource.fDatasetName;
+ fName := lSource.fName;
+ fDoUpdate := lSource.fDoUpdate;
+ fDoInsert := lSource.fDoInsert;
+ fDoDelete := lSource.fDoDelete;
+ fFailureBehavior := lSource.fFailureBehavior;
+end;
+
+constructor TDAUpdateRule.Create(aCollection: TCollection);
+begin
+ inherited;
+
+ fDoUpdate := true;
+ fDoInsert := true;
+ fDoDelete := true;
+ fFailureBehavior := fbRaiseException;
+end;
+
+function TDAUpdateRule.GetChangeTypes: TDAChangeTypes;
+begin
+ result := [];
+ if DoUpdate then Include(result,ctUpdate);
+ if DoInsert then Include(result,ctInsert);
+ if DoDelete then Include(result,ctDelete);
+end;
+
+function TDAUpdateRule.GetDisplayName: string;
+begin
+ result := Name;
+ if (result='') then result := '';
+end;
+
+{ TDADatasetRelationshipCollection }
+
+function TDADatasetRelationshipCollection.Add: TDADatasetRelationship;
+begin
+ result := inherited Add() as TDADatasetRelationship;
+end;
+
+constructor TDADatasetRelationshipCollection.Create(aOwner: TComponent);
+begin
+ inherited Create(aOwner, TDADatasetRelationship);
+end;
+
+procedure TDADatasetRelationshipCollection.GetDetails(const aMasterDatasetName: string; aList: TDADatasetRelationshipList);
+var i : integer;
+begin
+ aList.Clear;
+ for i := 0 to (Count-1) do begin
+ if SameText(aMasterDatasetName, RelationShips[i].MasterDatasetName) then begin
+ aList.Add(RelationShips[i]);
+ end;
+ end;
+end;
+
+function TDADatasetRelationshipCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result := TDADatasetRelationship(anItem).Name;
+end;
+
+function TDADatasetRelationshipCollection.GetRelationShips(
+ Index: integer): TDADatasetRelationship;
+begin
+ result := TDADatasetRelationship(inherited Items[Index]);
+end;
+
+function TDADatasetRelationshipCollection.RelationShipByName(
+ const aName: string): TDADatasetRelationship;
+begin
+ result := ItemByName(aName) as TDADatasetRelationship;
+end;
+
+function TDADatasetRelationshipCollection.RelationshipExists(
+ const aMasterDatasetName, aDetailDatasetName, aMasterFields,
+ aDetailFields: string): Boolean;
+var
+ i: integer;
+begin
+ result := false;
+ for i := 0 to Count - 1 do
+ with RelationShips[i] do
+ if (MasterDatasetName = aMasterDatasetName) and (DetailDatasetName = aDetailDatasetName)
+ and (MasterFields = aMasterFields) and (DetailFields = aDetailFields) then begin
+ result := true;
+ exit;
+ end;
+end;
+
+function TDADatasetRelationshipCollection.SetItemName(
+ anItem: TCollectionItem; const aName: string): string;
+begin
+ TDADatasetRelationship(anItem).Name := aName;
+end;
+
+{ TDADatasetRelationship }
+
+procedure TDADatasetRelationship.Assign(Source: TPersistent);
+var src : TDADatasetRelationship;
+begin
+ if (Source is TDADatasetRelationship) then begin
+ src := TDADatasetRelationship(Source);
+
+ Name := src.Name;
+ MasterDatasetName := src.MasterDatasetName;
+ MasterFields := src.MasterFields;
+ DetailDatasetName := src.DetailDatasetName;
+ DetailFields := src.DetailFields;
+ end
+ else inherited;
+end;
+
+function TDADatasetRelationship.GetDisplayName: string;
+begin
+ result := Format('%s: %s (%s) --> %s (%s)', [fName, fDetailDatasetName, fDetailFields, fMasterDatasetName, fMasterFields]);
+end;
+
+{ TDADatasetRelationshipList }
+
+function TDADatasetRelationshipList.Add(
+ aRelationship: TDADatasetRelationship): integer;
+begin
+ result := inherited Add(aRelationship)
+end;
+
+function TDADatasetRelationshipList.GetItems(
+ Index: integer): TDADatasetRelationship;
+begin
+ result := TDADatasetRelationship(inherited Items[Index]);
+end;
+
+{ TDALoginInfoAware }
+
+function TDALoginInfoAware._AddRef: Integer;
+begin
+ result := -1;
+end;
+
+function TDALoginInfoAware._Release: Integer;
+begin
+ result := -1;
+end;
+
+function TDALoginInfoAware.GetLoginInfo: TDALoginInfo;
+begin
+ result := fLoginInfo
+end;
+
+procedure TDALoginInfoAware.SetLoginInfo(aValue: TDALoginInfo);
+begin
+ fLoginInfo := aValue;
+end;
+
+{ TDAJoinDataTableCollection }
+
+constructor TDAJoinDataTableCollection.Create(aOwner : TComponent);
+begin
+ inherited Create(aOwner, TDAJoinDataTable);
+end;
+
+function TDAJoinDataTableCollection.GetJoinDataTables(Index: integer): TDAJoinDataTable;
+begin
+ result := TDAJoinDataTable(inherited Items[Index]);
+end;
+
+procedure TDAJoinDataTableCollection.SetJoinDataTables(Index: integer; const Value: TDAJoinDataTable);
+begin
+ JoinTables[Index].Assign(Value);
+end;
+
+{
+function TDAJoinedTableCollection.GetItemClass: TDASQLCommandClass;
+begin
+ result := TDAJoinedTable;
+end;
+}
+
+function TDAJoinDataTableCollection.Add: TDAJoinDataTable;
+begin
+ result := TDAJoinDataTable(inherited Add);
+end;
+
+function TDAJoinDataTableCollection.JoinTableByName(const aName: string): TDAJoinDataTable;
+begin
+ result := TDAJoinDataTable(inherited ItemByName(aName));
+end;
+
+function TDAJoinDataTableCollection.FindJoinTableByName(const aName: string): TDAJoinDataTable;
+begin
+ result := TDAJoinDataTable(inherited FindItem(aName));
+end;
+
+function TDAJoinDataTableCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result := TDAJoinDataTable(anItem).Name;
+end;
+
+function TDAJoinDataTableCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDAJoinDataTable(anItem).Name := aName;
+end;
+
+{ TDAJoinSourceTableCollection }
+
+function TDAJoinSourceTableCollection.GetJoinSourceTables(Index: integer): TDAJoinSourceTable;
+begin
+ result := TDAJoinSourceTable(inherited Items[Index])
+end;
+
+procedure TDAJoinSourceTableCollection.SetJoinSourceTables(Index: integer; const Value: TDAJoinSourceTable);
+begin
+ TDAJoinSourceTable(inherited Items[Index]).AssignTo(Value);
+end;
+
+constructor TDAJoinSourceTableCollection.Create(aOwner: TPersistent);
+begin
+ inherited Create(aOwner, TDAJoinSourceTable);
+end;
+
+function TDAJoinSourceTableCollection.Add: TDAJoinSourceTable;
+begin
+ result := TDAJoinSourceTable(inherited Add);
+end;
+
+function TDAJoinSourceTableCollection.JoinSourceTableByName(const aName: string): TDAJoinSourceTable;
+begin
+ result := TDAJoinSourceTable(inherited ItemByName(aName));
+end;
+{
+function TDAJoinedTableItemCollection.GetItemClass: TDAJoinedTableItem;
+begin
+ result := TDAJoinedTableItem;
+end;
+}
+
+function TDAJoinSourceTableCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result := TDAJoinSourceTable(anItem).Name;
+end;
+
+function TDAJoinSourceTableCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDAJoinSourceTable(anItem).Name := aName;
+end;
+
+{ TDAJoinDataTable }
+constructor TDAJoinDataTable.Create(Collection: TCollection);
+begin
+ inherited;
+ fJoinSourceTables := TDAJoinSourceTableCollection.Create(self);
+end;
+
+destructor TDAJoinDataTable.Destroy;
+begin
+ FreeAndNil(fJoinSourceTables);
+ inherited;
+end;
+
+procedure TDAJoinDataTable.Assign(aSource: TPersistent);
+var
+ lSource: TDAJoinDataTable;
+begin
+ if (aSource is TDAJoinDataTable) then begin
+ inherited; { Need to work the TDASQLCommand, too}
+ lSource := TDAJoinDataTable(aSource);
+ fJoinSourceTables.Assign(lSource.fJoinSourceTables);
+ fMasterTable:= lSource.fMasterTable;
+ end
+ else begin
+ inherited;
+ end;
+end;
+
+procedure TDAJoinDataTable.SetJoinSourceTables(const Value: TDAJoinSourceTableCollection);
+begin
+ fJoinSourceTables.Assign(Value);
+end;
+
+function TDAJoinDataTable.GetParams: TDAParamCollection;
+begin
+ result := nil;
+end;
+
+procedure TDAJoinDataTable.SetParams(const Value: TDAParamCollection);
+begin
+ // Do Nothing
+end;
+
+function TDAJoinDataTable.GetStatements(): TDAStatementCollection;
+begin
+ result := nil;
+end;
+
+procedure TDAJoinDataTable.SetStatements(const Value: TDAStatementCollection);
+begin
+ // Do Nothing
+end;
+
+function TDAJoinDataTable.GetSQLCommandCollection: TDASQLCommandCollection;
+begin
+ result := nil;
+end;
+
+
+{ TDAJoinSourceTable }
+constructor TDAJoinSourceTable.Create(Collection: TCollection);
+begin
+ inherited;
+ fJoinConditions := TDAJoinConditionCollection.Create(Self);
+end;
+
+destructor TDAJoinSourceTable.Destroy;
+begin
+ FreeAndNil(fJoinConditions);
+ inherited;
+end;
+
+function TDAJoinSourceTable.GetDisplayName: string;
+begin
+ if (Trim(Name) = '') then
+ result := ''
+ else
+ result := Name;
+end;
+
+procedure TDAJoinSourceTable.SetName(const Value: string);
+var
+ lOldName: string;
+begin
+ lOldName := fName;
+ fName := Value;
+ if lOldName <> '' then
+ (Collection as TSearcheableCollection).TriggerOnItemRenamed(lOldName, fName);
+end;
+
+procedure TDAJoinSourceTable.Assign(aSource: TPersistent);
+var
+ lSource: TDAJoinSourceTable;
+begin
+ if (aSource is TDAJoinSourceTable) then begin
+ lSource := TDAJoinSourceTable(aSource);
+ fName:= lSource.fName;
+ fJoinType:= lSource.fJoinType;
+ fJoinConditions.Assign(lSource.fJoinConditions);
+ end
+ else begin
+ inherited;
+ end;
+end;
+
+{ TDAJoinConditionCollection }
+constructor TDAJoinConditionCollection.Create(aOwner: TPersistent);
+begin
+ inherited Create(aOwner, TDAJoinCondition);
+end;
+
+function TDAJoinConditionCollection.Add: TDAJoinCondition;
+begin
+ result := TDAJoinCondition(inherited Add);
+end;
+
+constructor TDADatasetRelationship.Create(Collection: TCollection);
+begin
+ inherited Create(Collection);
+ fRelationshipType := rtForeignKey;
+end;
+
+{ TDATableFieldCollectionItem }
+
+procedure TDATableFieldCollectionItem.Assign(Source: TPersistent);
+begin
+ inherited;
+ if Source is TDATableFieldCollectionItem then begin
+ self.FFieldName := TDATableFieldCollectionItem(Source).FieldName;
+ self.FTableName := TDATableFieldCollectionItem(Source).TableName;
+ end;
+end;
+
+
+{ TDASimpleQueryBuilder }
+
+procedure TDASimpleQueryBuilder.AddCrossJoin(ATable: string);
+begin
+ with FMainTable.JoinSourceTables.Add do begin
+ JoinType := jtCross;
+ Name := ATable;
+ end;
+end;
+
+procedure TDASimpleQueryBuilder.AddGroupBy(ATable, AField: string);
+begin
+ with TDAGroupByItem(FGroupByCollection.Add) do begin
+ TableName := aTable;
+ FieldName := AField;
+ end;
+end;
+
+procedure TDASimpleQueryBuilder.AddJoin(AJoinTable, AJoinFieldName,
+ AJoinToTableName, AJoinToFieldName: string; AJoinType: TDAJoinType);
+begin
+ with FMainTable.JoinSourceTables.Add do begin
+ JoinType := AJoinType;
+ Name := AJoinTable;
+ with JoinConditions.Add do begin
+ FromTableName := AJoinTable;
+ FromFieldName := AJoinFieldName;
+ ToTableName := AJoinToTableName;
+ ToFieldName := AJoinToFieldName;
+ end;
+ end;
+end;
+
+procedure TDASimpleQueryBuilder.AddJoin(AJoinTable: string;
+ AJoinFieldNames: array of string; AJoinToTableName: string;
+ AJoinToFieldNames: array of string; AJoinType: TDAJoinType);
+var
+ i: integer;
+begin
+ if High(AJoinToFieldNames) <> High(AJoinFieldNames) then raise Exception.Create('Can''t create join: AJoinFieldNames and AJoinToFieldNames should contain equal members count');
+ with FMainTable.JoinSourceTables.Add do begin
+ JoinType := AJoinType;
+ Name := AJoinTable;
+ For i:=0 to High(AJoinToFieldNames) do
+ with JoinConditions.Add do begin
+ FromTableName := AJoinTable;
+ FromFieldName := AJoinFieldNames[i];
+ ToTableName := AJoinToTableName;
+ ToFieldName := AJoinToFieldNames[i];
+ end;
+ end;
+end;
+
+procedure TDASimpleQueryBuilder.AddSelect(ATable, AField: string);
+begin
+ with TDASelectItem(FSelectCollection.Add) do begin
+ TableName := aTable;
+ FieldName := AField;
+ end;
+end;
+
+procedure TDASimpleQueryBuilder.Assign(Source: TPersistent);
+begin
+ inherited;
+ if Source is TDASimpleQueryBuilder then begin
+ FMainTable.Assign(TDASimpleQueryBuilder(Source).MainTable);
+ FSelectCollection.Assign(TDASimpleQueryBuilder(Source).Select);
+ FGroupByCollection.Assign(TDASimpleQueryBuilder(Source).GroupBy);
+ FOptions:=TDASimpleQueryBuilder(Source).FOptions;
+ FConnection:=TDASimpleQueryBuilder(Source).Connection;
+ if (TDASimpleQueryBuilder(Source).FWhere <> nil) or (FWhere <> nil) then
+ Where.Xml:=TDASimpleQueryBuilder(Source).Where.Xml;
+ end;
+end;
+
+procedure TDASimpleQueryBuilder.Clear;
+begin
+ FMainTable.MasterTable := '';
+ FMainTable.JoinSourceTables.Clear;
+ FSelectCollection.Clear;
+ if FWhere <> nil then FWhere.Clear;
+ FGroupByCollection.Clear;
+end;
+
+constructor TDASimpleQueryBuilder.Create(Collection: TCollection);
+begin
+ inherited;
+ FSelectCollection := TDASelectCollection.Create(TDASelectItem);
+ FMainTable := TDAJoinDataTable.Create(nil);
+ FGroupByCollection := TDAGroupByCollection.Create(TDAGroupByItem);
+ FColumnMapping := TDAColumnMappingCollection.Create(Self);
+ FWhere := nil;
+ FOptions := [];
+ Clear;
+end;
+
+function TDASimpleQueryBuilder.CreateGroupByClause: string;
+var
+ i: integer;
+begin
+ Result := '';
+ for i := 0 to GroupBy.Count - 1 do begin
+ if i <> 0 then Result := Result + ', ';
+ with TDAGroupByItem(GroupBy.Items[i]) do
+ Result := Result + GenerateFieldName(TableName, FieldName);
+ end;
+end;
+
+function TDASimpleQueryBuilder.CreateSelectClause: string;
+var
+ i,j: integer;
+ lflds: TDAFieldCollection;
+ lquotedtablename: string;
+begin
+ Result := '';
+ if Select.Count = 0 then begin
+ if not (qboGenerateSimpleSelect in FOptions) and Assigned(FConnection) then begin
+ FConnection.GetTableFields(MainTable.MasterTable, lflds);
+ if Assigned(lflds) then try
+ if MainTable.JoinSourceTables.Count =0 then
+ lquotedtablename := ''
+ else
+ lquotedtablename:=QuoteIdentifierIfNeeded(MainTable.MasterTable)+'.';
+ For i:= 0 to lflds.Count -1 do
+ Result := Result + lquotedtablename+QuoteFieldNameIfNeeded(MainTable.MasterTable, lflds.Fields[i].Name)+', '
+ finally
+ lFlds.Free;
+ end;
+ For j:= 0 to MainTable.JoinSourceTables.Count - 1 do
+ with TDAJoinSourceTable(MainTable.JoinSourceTables.Items[j]) do begin
+ lquotedtablename:=QuoteIdentifierIfNeeded(Name)+'.';
+ FConnection.GetTableFields(name, lflds);
+ if Assigned(lflds) then try
+ For i:= 0 to lflds.Count -1 do
+ Result := Result + lquotedtablename+QuoteFieldNameIfNeeded(Name, lflds.Fields[i].Name)+', '
+ finally
+ lFlds.Free;
+ end;
+ end;
+ end;
+ end else begin
+ for i := 0 to Select.Count - 1 do begin
+ with TDASelectItem(Select.Items[i]) do
+ Result := Result + GenerateFieldName(TableName, FieldName)+', ';
+ end;
+ end;
+ if Length(Result) > 2 then SetLength(Result, Length(Result)-2);
+ if Result = '' then Result:='*';
+end;
+
+function TDASimpleQueryBuilder.CreateWhereClause: string;
+begin
+ if FWhere = nil then
+ Result := ''
+ else
+ Result := FWhere.CreateWhereClause;
+end;
+
+destructor TDASimpleQueryBuilder.Destroy;
+begin
+ FColumnMapping.Free;
+ FWhere.Free;
+ FGroupByCollection.Free;
+ FSelectCollection.Free;
+ FMainTable.Free;
+ inherited;
+end;
+
+function TDASimpleQueryBuilder.GenerateFieldName(aTablename,
+ aFieldName: string; aProcessMapping: Boolean): string;
+begin
+ if aProcessMapping then aFieldName:= GetMappingTableField(aFieldName);
+ if aTableName <> '' then
+ Result := QuoteIdentifierIfNeeded(aTableName) + '.' + QuoteFieldNameIfNeeded(aTableName, aFieldName)
+ else
+ Result := QuoteFieldNameIfNeeded(aTableName, aFieldName);
+end;
+
+function TDASimpleQueryBuilder.GenerateSelectSQL: string;
+const
+ c_Indent = ' ';
+ c_Lenght = 47;
+
+ function CompactString(AStr: String): string;
+ var
+ p,p1: Pchar;
+ s: string;
+ begin
+ Result:='';
+ p:=Pchar(AStr);
+ repeat
+ p1:=p;
+ repeat
+ p1:=StrPos(p1, ',');
+ if p1 <> nil then inc(p1);
+ until (p1 = nil) or (p1-p > c_lenght);
+ if p1 = nil then begin
+ s:=p;
+ end else begin
+ inc(p1);
+ SetString(s,p, p1-p);
+ end;
+ p:=p1;
+ Result:=Result+#13#10 +c_Indent+ s;
+ until p = nil;
+ end;
+
+var
+ lSelect, lTable, lWhere, lGroupBy: string;
+begin
+ Validate;
+ lSelect := CompactString(CreateSelectClause);
+ lTable := CreateTableClause;
+ lWhere := CreateWhereClause;
+ lGroupBy := CreateGroupByClause;
+ Result := 'SELECT';
+ if (qboSelectDistinct in Options) then Result := Result + ' DISTINCT';
+ Result := Result+lSelect + #13#10 +
+ 'FROM' + #13#10 + c_Indent + lTable;
+ if (qboGenerateDynamicWhereStatement in Options) then begin
+ if (lWhere = '') then lWhere := '{WHERE}' else lWhere := lWhere + ' AND {WHERE}';
+ end;
+ if lWhere <> '' then Result := Result + #13#10 + 'WHERE' + #13#10 + c_Indent + lWhere;
+ if lGroupBy <> '' then Result := Result + #13#10 + 'GROUP BY' + #13#10 + c_Indent + lGroupBy;
+end;
+
+function TDASimpleQueryBuilder.GetMappingTableField(
+ const aDataSetField: string): string;
+var
+ lColumnMapping: TDAColumnMapping;
+begin
+ lColumnMapping := FColumnMapping.FindMappingByDatasetField(aDataSetField);
+ if Assigned(lColumnMapping) then
+ Result := lColumnMapping.TableField
+ else
+ Result := aDataSetField;
+end;
+
+function TDASimpleQueryBuilder.GetWhereBuilder: TDASQLWhereBuilder;
+begin
+ if FWhere = nil then FWhere := CreateWhereBuilder;
+ Result:= FWhere;
+end;
+
+function TDASimpleQueryBuilder.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+var
+ i: integer;
+begin
+ if Assigned(Connection) then
+ Result := Connection.IdentifierNeedsQuoting(iIdentifier)
+ else begin
+ Result := False;
+ for i := 1 to Length(iIdentifier) do begin
+ Result := not CharInSet(iIdentifier[i], ['a'..'z', 'A'..'Z', '0'..'9', '_', '.']);
+ if Result then Break;
+ end;
+ end;
+end;
+
+function TDASimpleQueryBuilder.QuoteFieldNameIfNeeded(const aTableName,
+ aFieldName: string): string;
+begin
+ if Assigned(Connection) then
+ Result := Connection.QuoteFieldNameIfNeeded(aTableName, aFieldName)
+ else
+ Result := {aTableName + '.' +} QuoteIdentifierIfNeeded(aFieldName);
+end;
+
+function TDASimpleQueryBuilder.QuoteIdentifier(
+ const iIdentifier: string): string;
+begin
+ if Assigned(Connection) then
+ Result := Connection.QuoteIdentifier(iIdentifier)
+ else
+ Result := '''' + iIdentifier + '''';
+end;
+
+function TDASimpleQueryBuilder.QuoteIdentifierIfNeeded(
+ const iIdentifier: string): string;
+begin
+ if Assigned(Connection) then
+ Result := Connection.QuoteIdentifierIfNeeded(iIdentifier)
+ else if IdentifierNeedsQuoting(iIdentifier) then
+ Result := QuoteIdentifier(iIdentifier)
+ else
+ Result := iIdentifier;
+end;
+
+procedure TDASimpleQueryBuilder.SetColumnMapping(
+ const Value: TDAColumnMappingCollection);
+begin
+ FColumnMapping.AssignColumnMapping(Value);
+end;
+
+procedure TDASimpleQueryBuilder.Validate;
+begin
+ if FMainTable.MasterTable = '' then raise Exception.Create('Please specify MainTable.MasterTable');
+end;
+
+{ TDAWhereBuilder }
+
+const
+ c_DAWhereBuilderLocalName = 'query';
+ c_DAWhereBuilderNamespaceURI = 'http://www.remobjects.com/schemas/dataabstract/queries/5.0';
+ c_DAWhereBuilderwhere = 'where';
+procedure TDAWhereBuilder.Clear;
+begin
+ FreeAndNil(FExpression);
+ FColumnMapping.Clear;
+ fParams.Clear;
+end;
+
+constructor TDAWhereBuilder.Create;
+begin
+ inherited Create;
+ FColumnMapping := TDAColumnMappingCollection.Create(nil);
+ fParams := TDAParamCollection.Create(nil);
+end;
+
+destructor TDAWhereBuilder.Destroy;
+begin
+ Clear;
+ fParams.Free;
+ FColumnMapping.Free;
+ inherited Destroy;
+end;
+
+function TDAWhereBuilder.ExpressionToXmlNode(
+ const aExpression: TDAWhereExpression): IXMLNode;
+var
+ doc: IXMLDocument;
+ el: IXMLNode;
+begin
+ doc := NewROXmlDocument;
+ doc.New(c_DAWhereBuilderLocalName);
+ el := doc.DocumentNode;
+ el.AddAttribute('xmlns', c_DAWhereBuilderNamespaceURI);
+ el.AddAttribute('version', '5.0');
+ WriteToXml(el,aExpression);
+ result := doc.DocumentNode;
+end;
+
+function TDAWhereBuilder.getXml: UnicodeString;
+begin
+ Result:= ExpressionToXmlNode(fExpression).Document.XML;
+end;
+
+function TDAWhereBuilder.IsEmpty: Boolean;
+begin
+ Result:= fExpression = nil;
+end;
+
+function TDAWhereBuilder.NewBinaryExpression(aLeft,
+ aRight: TDAWhereExpression; anOp: TDABinaryOperator): TDAWhereExpression;
+begin
+ Result := TDABinaryExpression.Create(aLeft, aRight, anOp);
+end;
+
+function TDAWhereBuilder.NewBinaryExpression(const aTableName,
+ aFieldName: string; anOp: TDABinaryOperator; const aValue: variant;
+ aType: TDADataType): TDAWhereExpression;
+begin
+ Result := NewBinaryExpression(
+ NewField(aTableName,aFieldName),
+ NewConstant(aValue,aType),
+ anOp
+ );
+end;
+
+function TDAWhereBuilder.NewConstant(const aValue: Variant;
+ aType: TDADataType): TDAWhereExpression;
+begin
+ Result := TDAConstantExpression.Create(aValue, aType);
+end;
+
+function TDAWhereBuilder.NewField(
+ const aTableName,aFieldName: string): TDAWhereExpression;
+begin
+ Result := TDAFieldExpression.Create(aTableName,aFieldName);
+end;
+
+function TDAWhereBuilder.NewIsNotNull: TDAWhereExpression;
+begin
+ Result := NewUnaryExpression(NewNull,duoNot);
+end;
+
+function TDAWhereBuilder.NewIsNotNull(const aTableName,
+ aFieldName: string): TDAWhereExpression;
+begin
+ Result := NewBinaryExpression(
+ NewField(aTableName,aFieldName),
+ NewIsNotNull,
+ dboEqual);
+end;
+
+function TDAWhereBuilder.NewList(
+ const aValues: array of TDAWhereExpression): TDAWhereExpression;
+begin
+ result := TDAListExpression.Create(aValues);
+end;
+
+function TDAWhereBuilder.NewMacro(const aName: string;
+ const aValues: array of TDAWhereExpression): TDAWhereExpression;
+begin
+ Result := TDAMacroExpression.Create(aName, aValues);
+end;
+
+function TDAWhereBuilder.NewMacro(const aName: string): TDAWhereExpression;
+begin
+ Result := TDAMacroExpression.Create(aName);
+end;
+
+function TDAWhereBuilder.NewNull: TDAWhereExpression;
+begin
+ Result := TDANullExpression.Create;
+end;
+
+function TDAWhereBuilder.NewParameter(
+ const aParameterName: string): TDAWhereExpression;
+begin
+ Result := TDAParameterExpression.Create(aParameterName);
+end;
+
+function TDAWhereBuilder.NewUnaryExpression(
+ anExpression: TDAWhereExpression;
+ anOp: TDAUnaryOperator): TDAWhereExpression;
+begin
+ Result := TDAUnaryExpression.Create(anExpression, anOp);
+end;
+
+function TDAWhereBuilder.ReadFromXml(xr: IXmlNode): TDAWhereExpression;
+begin
+ xr := SelectNodeLocal(xr, c_DAWhereBuilderwhere);
+ if (xr = nil) then raise Exception.Create('"'+c_DAWhereBuilderwhere+'" tag expected');
+ if xr.ChildrenCount > 0 then
+ Result := TDAWhereExpression.ParseExpression(xr.FirstChild)
+ else
+ Result := nil;
+end;
+
+procedure TDAWhereBuilder.RemoveEmptyNodes(const ANode: IXMLNode);
+var
+ i: integer;
+ lNode: IXMLNode;
+begin
+ i:=0;
+ while i < ANode.ChildrenCount do begin
+ lNode := ANode.Children[i];
+ if (lNode.Name = '#text') and (lNode.LocalName = '') and (lNode.Value = ' ') then
+ ANode.Delete(i)
+ else begin
+ RemoveEmptyNodes(lNode);
+ inc(i);
+ end;
+ end;
+end;
+
+procedure TDAWhereBuilder.SetColumnMapping(
+ const Value: TDAColumnMappingCollection);
+begin
+ FColumnMapping.AssignColumnMapping(Value);
+end;
+
+procedure TDAWhereBuilder.SetParams(const Value: TDAParamCollection);
+begin
+ fParams.AssignParamCollection(Value);
+end;
+
+procedure TDAWhereBuilder.setXml(const aValue: UnicodeString);
+begin
+ Clear;
+ fExpression:=XMLToExpression(aValue);
+end;
+
+procedure TDAWhereBuilder.WriteToXml(sw: IXmlNode; const aExpression: TDAWhereExpression);
+begin
+ sw := sw.Add(c_DAWhereBuilderwhere);
+ if aExpression <> nil then
+ aExpression.WriteToXml(sw);
+end;
+
+function TDAWhereBuilder.XMLToExpression(
+ const aXML: UnicodeString): TDAWhereExpression;
+var
+ doc: IXMLDocument;
+ el: IXMLNode;
+begin
+ doc := NewROXmlDocument;
+ doc.New();
+ doc.XML := aXML;
+ el := doc.DocumentNode;
+ if (el.LocalName <> c_DAWhereBuilderLocalName) or (el.NamespaceURI <> c_DAWhereBuilderNamespaceURI) then raise Exception.Create('Not a DataAbstract query xml');
+ RemoveEmptyNodes(el);
+ Result:= ReadFromXml(el);
+end;
+
+{ TDAWhereExpression }
+
+class function TDAWhereExpression.ParseExpression(xr: IXmlNode): TDAWhereExpression;
+begin
+ Result := CreateWhereExpression(xr.LocalName);
+ Result.ReadFromXml(xr);
+end;
+
+procedure TDAWhereExpression.Validate;
+begin
+// nothing
+end;
+
+{ TDAUnionDataTable }
+constructor TDAUnionDataTable.Create(Collection: TCollection);
+begin
+ inherited;
+ fSourceTables := TDAUnionSourceTableCollection.Create(Self);
+end;
+
+destructor TDAUnionDataTable.Destroy;
+begin
+ FreeAndNil(fSourceTables);
+ inherited;
+end;
+
+procedure TDAUnionDataTable.SetSourceTables(Value: TDAUnionSourceTableCollection);
+begin
+ fSourceTables.Assign(Value);
+end;
+
+{ TDAUnionSourceTableCollection }
+function TDAUnionSourceTableCollection.Add: TDAUnionSourceTable;
+begin
+ result := inherited Add() as TDAUnionSourceTable;
+end;
+
+constructor TDAUnionSourceTableCollection.Create(aOwner : TPersistent);
+begin
+ inherited Create(aOwner, TDAUnionSourceTable);
+end;
+
+function TDAUnionSourceTableCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result := TDAUnionSourceTable(anItem).Name;
+end;
+
+function TDAUnionSourceTableCollection.GetUnionSourceTables(
+ Index: integer): TDAUnionSourceTable;
+begin
+ result := TDAUnionSourceTable(inherited Items[Index]);
+end;
+
+function TDAUnionSourceTableCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDAUnionSourceTable(anItem).Name := aName;
+end;
+
+function TDAUnionSourceTableCollection.UnionSourceTableByName(
+ const aName: string): TDAUnionSourceTable;
+begin
+ result := ItemByName(aName) as TDAUnionSourceTable
+end;
+
+{ TDAUnionSourceTable }
+procedure TDAUnionSourceTable.Assign(Source: TPersistent);
+begin
+ if Source is TDAUnionSourceTable then begin
+ Name := TDAUnionSourceTable(Source).Name;
+ IsReadonly := TDAUnionSourceTable(Source).IsReadOnly;
+ ColumnMappings.Assign(TDAUnionSourceTable(Source).ColumnMappings);
+ end;
+end;
+
+constructor TDAUnionSourceTable.Create(Collection: TCollection);
+begin
+ inherited;
+ fColumnMappings := TDAColumnMappingCollection.Create(Self);
+end;
+
+destructor TDAUnionSourceTable.Destroy;
+begin
+ FreeAndNil(fColumnMappings);
+ inherited;
+end;
+
+procedure TDAUnionSourceTable.SetColumnMappings(const Value: TDAColumnMappingCollection);
+begin
+ fColumnMappings.Assign(Value);
+end;
+
+{ TDAUnionDataTableCollection }
+constructor TDAUnionDataTableCollection.Create(aOwner : TComponent);
+begin
+ inherited Create(aOwner, TDAUnionDataTable);
+end;
+
+function TDAUnionDataTableCollection.GetUnionDataTables(Index: integer): TDAUnionDataTable;
+begin
+ result := TDAUnionDataTable(inherited Items[Index]);
+end;
+
+procedure TDAUnionDataTableCollection.SetUnionDataTables(Index: integer; const Value: TDAUnionDataTable);
+begin
+ UnionDataTables[Index].Assign(Value);
+end;
+
+function TDAUnionDataTableCollection.Add: TDAUnionDataTable;
+begin
+ result := TDAUnionDataTable(inherited Add);
+end;
+
+function TDAUnionDataTableCollection.UnionDataTableByName(const aName: string): TDAUnionDataTable;
+begin
+ result := TDAUnionDataTable(inherited ItemByName(aName));
+end;
+
+function TDAUnionDataTableCollection.FindUnionDataTableByName(const aName: string): TDAUnionDataTable;
+begin
+ result := TDAUnionDataTable(inherited FindItem(aName));
+end;
+
+
+
+function TDAUnionDataTableCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ Result := TDAUnionDataTable(anItem).Name;
+end;
+
+function TDAUnionDataTableCollection.SetItemName(anItem: TCollectionItem;
+ const aName: string): string;
+begin
+ TDAUnionDataTable(anItem).Name := aName;
+end;
+
+{ TDASQLWhereBuilder }
+
+constructor TDASQLWhereBuilder.Create(AConnection: IDAConnection);
+begin
+ inherited Create;
+ FConnection:= AConnection;
+end;
+
+constructor TDASQLWhereBuilder.Create(AQueryBuilder: TDASimpleQueryBuilder);
+begin
+ inherited Create;
+ FQueryBuilder:= AQueryBuilder;
+end;
+
+function TDASQLWhereBuilder.CreateWhereClause: string;
+begin
+ FId:=0;
+ Params.Clear;
+ Result := '';
+ if Expression <> nil then begin
+ Expression.Validate;
+ Result:= ProcessExpression(Expression);
+ end;
+end;
+
+
+function TDASQLWhereBuilder.GenerateFieldName(aTablename,
+ aFieldName: string): string;
+begin
+ aFieldName:= GetMappingTableField(aFieldName);
+ if FQueryBuilder <> nil then
+ Result := FQueryBuilder.GenerateFieldName(aTablename,aFieldName,False)
+ else
+ if FConnection <> nil then begin
+ if aTableName <> '' then
+ Result := FConnection.QuoteIdentifierIfNeeded(aTableName) + '.' + FConnection.QuoteFieldNameIfNeeded(aTableName, aFieldName)
+ else
+ Result := FConnection.QuoteFieldNameIfNeeded(aTableName, aFieldName);
+ end
+ else
+ Result:= aFieldName;
+end;
+
+function TDASQLWhereBuilder.GenerateParameter(
+ const aParameterName: string): string;
+begin
+ Result:= ':'+aParameterName;
+end;
+
+function TDASQLWhereBuilder.GenerateParamName: String;
+begin
+ fId := fId + 1;
+ result := Format('P%d', [fId]);
+end;
+
+function TDASQLWhereBuilder.GetMappingTableField(
+ const aDataSetField: string): string;
+var
+ lColumnMapping: TDAColumnMapping;
+begin
+ lColumnMapping := FColumnMapping.FindMappingByDatasetField(aDataSetField);
+ if Assigned(lColumnMapping) then
+ Result := lColumnMapping.TableField
+ else
+ Result := aDataSetField;
+end;
+
+function TDASQLWhereBuilder.ProcessConstantExpression(
+ AExpression: TDAWhereExpression): string;
+const
+ const_prefix = 'DACONST_';
+begin
+ With Params.Add do begin
+ ParamType := daptInput;
+ Value := TDAConstantExpression(AExpression).Value;
+ DataType := TDAConstantExpression(AExpression).aType;
+ Name := GenerateParamName();
+ Result:= GenerateParameter(Name);
+ end;
+end;
+
+function TDASQLWhereBuilder.ProcessExpression(
+ AExpression: TDAWhereExpression): string;
+begin
+ Result := '';
+ if AExpression = nil then Exit;
+ if AExpression is TDABinaryExpression then Result := ProcessBinaryExpression(TDABinaryExpression(AExpression))
+ else if AExpression is TDAUnaryExpression then Result := ProcessUnaryExpression(TDAUnaryExpression(AExpression))
+ else if AExpression is TDAConstantExpression then Result := ProcessConstantExpression(TDAConstantExpression(AExpression))
+ else if AExpression is TDAListExpression then Result := ProcessListExpression(TDAListExpression(AExpression))
+ else if AExpression is TDAParameterExpression then Result := ProcessParameterExpression(TDAParameterExpression(AExpression))
+ else if AExpression is TDAFieldExpression then Result := ProcessFieldExpression(TDAFieldExpression(AExpression))
+ else if AExpression is TDANullExpression then Result := ProcessNullExpression(TDANullExpression(AExpression))
+ else if AExpression is TDAMacroExpression then Result := ProcessMacroExpression(TDAMacroExpression(AExpression))
+ else ;
+end;
+
+function TDASQLWhereBuilder.ProcessFieldExpression(
+ AExpression: TDAWhereExpression): string;
+begin
+ with TDAFieldExpression(AExpression) do
+ Result:= GenerateFieldName(TableName, FieldName);
+end;
+
+function TDASQLWhereBuilder.ProcessListExpression(
+ AExpression: TDAWhereExpression): string;
+var
+ i: integer;
+begin
+ Result := '';
+ with TDAListExpression(AExpression) do
+ for i := 0 to Count - 1 do begin
+ if i > 0 then Result := Result + ', ';
+ Result := Result + ProcessExpression(Item[i]);
+ end;
+end;
+
+function TDASQLWhereBuilder.ProcessMacroExpression(
+ AExpression: TDAWhereExpression): string;
+var
+ s1: string;
+ i: integer;
+begin
+ with TDAMacroExpression(AExpression) do begin
+ Result := '{' + Name;
+ s1 := '}';
+ if Count > 0 then begin
+ Result := Result + '(';
+ for i := 0 to Count - 1 do begin
+ if i > 0 then Result := Result + ', ';
+ Result := Result + ProcessExpression(Item[i]);
+ end;
+ Result := Result + ')';
+ end;
+ end;
+ Result := Result + s1;
+end;
+
+function TDASQLWhereBuilder.ProcessParameterExpression(
+ AExpression: TDAWhereExpression): string;
+begin
+ with TDAParameterExpression(AExpression) do
+ Result := GenerateParameter(ParameterName);
+end;
+
+procedure Params_ParseSQL(aParams: TParams; aSQL: String; DoCreate: Boolean; aQuoteChar: TDAQuoteCharArray; aUseDefaultChars: Boolean = False);
+const
+ c_defaultchars = ['[',']','"','`',''''];
+var
+ lSQL: string;
+ i: integer;
+ lName: string;
+ lLen: integer;
+begin
+ { Bug in ParseSQL modified passed in string; use UniqueString to prevent corrupting the original! }
+ lSQL := aSQL;
+ UniqueString(lSQL);
+ aParams.ParseSQL(lSQL, DoCreate);
+ for i:=0 to aParams.Count -1 do begin
+ lName := aParams[i].Name;
+ lLen := Length(lName);
+ // it fixes problem when used non-standard quotes like [ and ]
+ if (lLen > 2) and (
+ (not aUseDefaultChars and (lName[1] = aQuoteChar[0]) and (lName[lLen] = aQuoteChar[1])) or
+ (aUseDefaultChars and CharInSet(lName[1], c_defaultchars) and CharInSet(lName[lLen], c_defaultchars))) then begin
+ lName := Copy(lName,2, lLen -2 );
+ aParams[i].Name:= lName;
+ end
+ // bug in BDS2006, when TParams.ParseSQL parses "ORDERS" as ORDERS"
+ {$IFDEF BDS4}
+ else if (lLen > 1) and (
+ (aUseDefaultChars and (lName[lLen] in c_defaultchars)) or (not aUseDefaultChars and (lName[lLen] = aQuoteChar[1]))) then begin
+ SetLength(lName, lLen - 1);
+ aParams[i].Name:= lName;
+ end
+ {$ENDIF}
+ ;
+ end;
+end;
+
+{ TDAQueryBuilder }
+
+procedure TDAQueryBuilder.AddOrderBy(ATable, AField: string);
+begin
+ with TDAOrderByItem(FOrderByCollection.Add) do begin
+ TableName := aTable;
+ FieldName := AField;
+ end;
+end;
+
+function TDAQueryBuilder.AddUnion: TDASimpleQueryBuilder;
+begin
+ if Connection <> nil then
+ Result := Connection.GetQueryBuilder.Create(FUnionCollections)
+ else
+ Result := TDAQueryBuilder(NewInstance).Create(FUnionCollections);
+end;
+
+
+procedure TDAQueryBuilder.Assign(Source: TPersistent);
+begin
+ inherited;
+ if Source is TDASimpleQueryBuilder then begin
+ FOrderByCollection.Assign(TDAQueryBuilder(Source).OrderBy);
+ end;
+end;
+
+procedure TDAQueryBuilder.Clear;
+begin
+ inherited;
+ FOrderByCollection.Clear;
+ FUnionCollections.Clear;
+end;
+
+
+constructor TDAQueryBuilder.Create;
+begin
+ Create(nil);
+end;
+
+constructor TDAQueryBuilder.Create(Collection: TCollection);
+begin
+ FOrderByCollection := TDAOrderByCollection.Create(TDAOrderByItem);
+ FUnionCollections := TDAUnionCollections.Create(TDASimpleQueryBuilder);
+ inherited;
+end;
+
+function TDAQueryBuilder.CreateOrderByClause: string;
+var
+ i: integer;
+begin
+ Result := '';
+ for i := 0 to OrderBy.Count - 1 do begin
+ if i <> 0 then Result := Result + ', ';
+ with TDAOrderByItem(OrderBy.Items[i]) do
+ Result := Result + GenerateFieldName(TableName, FieldName);
+ end;
+end;
+
+function TDAQueryBuilder.CreateUnionClause(const AUnion: TDASimpleQueryBuilder): string;
+begin
+ AUnion.Connection := Self.Connection;
+ Result := AUnion.GenerateSelectSQL;
+end;
+
+destructor TDAQueryBuilder.Destroy;
+begin
+ FOrderByCollection.Free;
+ FUnionCollections.Free;
+ inherited;
+end;
+
+function TDAQueryBuilder.GenerateSelectSQL: string;
+const
+ c_Indent = ' ';
+var
+ i: integer;
+ lUnion, lOrderBy: string;
+begin
+ Result := inherited GenerateSelectSQL;
+ lOrderBy := CreateOrderByClause;
+ for I := 0 to FUnionCollections.Count - 1 do begin
+ lUnion := CreateUnionClause(TDASimpleQueryBuilder(FUnionCollections.Items[i]));
+ if lUnion <> '' then
+ Result := Result + #13#10 + 'UNION' + #13#10 + lUnion;
+ end;
+ if lOrderBy <> '' then Result := Result + #13#10 + 'ORDER BY' + #13#10 + c_Indent + lOrderBy;
+end;
+
+{$IFDEF DataAbstract_Trial}
+{$INCLUDE DataAbstract_Trial.inc}
+{$ENDIF DataAbstract_Trial}
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAInterfacesEx.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAInterfacesEx.pas
new file mode 100644
index 0000000..d9ba34b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAInterfacesEx.pas
@@ -0,0 +1,37 @@
+unit uDAInterfacesEx;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ uDAInterfaces;
+
+type
+ IDAConnectionMetaData = interface(IDAConnection)
+ ['{ACDD5335-B7CB-4E0F-8241-4A323D4731F1}']
+ end;
+
+ IDAConnectionModelling = interface(IDAConnection)
+ ['{ACDD5335-B7CB-4E0F-8241-4A323D4731F1}']
+
+ function FieldToDeclaration(aField: TDAField): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function BuildCreateTableSQL(aDataSet: TDADataSet; const aOverrideName: string = ''): string; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CreateTable(aDataSet: TDADataSet; const aOverrideName: string = ''); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+implementation
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAJSONDataStreamer.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAJSONDataStreamer.pas
new file mode 100644
index 0000000..d181668
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAJSONDataStreamer.pas
@@ -0,0 +1,1189 @@
+unit uDAJSONDataStreamer;
+
+{$I DataAbstract.inc}
+
+interface
+uses
+ SysUtils, Classes,
+ uROTypes, uROXMLIntf,
+ uDAInterfaces, uDADelta,
+ uDADataStreamer,uROJSONParser;
+
+const
+ // Data stream node names
+ pn_Datasets = 'datasets';
+ pn_Dataset_Name = 'name';
+ pn_Dataset_Schema = 'schema';
+ pn_Dataset_Schema_Fields = 'fields';
+ pn_Dataset_Schema_Params = 'params';
+ pn_Dataset_Data = 'data';
+ pn_Dataset_Data_Rows = 'rows';
+ pn_Dataset_Data_Fields = 'fields';
+ pn_Dataset_Data_Fields_name = 'name';
+
+ pn_Deltas = 'deltas';
+ pn_Delta_Name = 'name';
+ pn_Delta_LoggedFields = 'loggedfields';
+ pn_Delta_LoggedFields_Name = 'name';
+ pn_Delta_LoggedFields_Type = 'type';
+ pn_Delta_KeyFields = 'keyfields';
+ pn_Delta_Data = 'data';
+ pn_Delta_Data_RecID = 'recid';
+ pn_Delta_Data_Changetype = 'changetype';
+ pn_Delta_Data_Status = 'status';
+ pn_Delta_Data_Message = 'message';
+ pn_Delta_Data_Old = 'old';
+ pn_Delta_Data_New = 'new';
+
+type
+ TDASmallFieldInfo = record
+ Name: String;
+ end;
+
+ TDADataForAppendBin2 = class(TDADataForAppend)
+ public
+ FieldsInfo: array of TDASmallFieldInfo;
+ end;
+
+ TDAJSONDataStreamer = class(TDADataStreamer)
+ private
+ FParser: TROJSONValue;
+ FDatasets, FDeltas : TROJSONArray;
+ function GetDatasetObject(const ADatasetName: JSON_String; const ACreate: Boolean):TROJSONObject;
+ function GetDeltaObject(const ADeltaName: JSON_String; const ACreate: Boolean):TROJSONObject;
+ function GetDatasetObjectByPropName(const ADatasetName, AObjectName: JSON_String; const ACreate: Boolean):TROJSONObject;
+ function GetDataArraysByPropName(const ADatasetName, AObjectName: JSON_String; const ACreate: Boolean):TROJSONArray;
+ procedure ClearParser;
+ procedure WriteSchema(Const ASchemaObject: TROJSONObject; const Fields: TDAFieldCollection; const Params: TDAParamCollection; aFieldsIndex: array of integer); overload;
+ procedure ReadSchema(Const ASchemaObject: TROJSONObject; const Destination: IDADataset);
+ procedure WriteField(const AFieldObject: TROJSONObject; const AField: TDAField);
+ procedure WriteParam(const AParamObject: TROJSONObject; const AParam: TDAParam);
+ procedure ReadParam(const AParamObject: TROJSONObject; const AParam: TDAParam);
+ procedure ReadField(const AFieldObject: TROJSONObject; const AField: TDAField);
+ protected
+ procedure InternalDoWriteDataset(const Source: IDADataset; var k: integer; const Maxrecords: integer; ARealFields: array of integer;aDataIndex: Integer; info: array of TDASmallFieldInfo);
+ procedure InternalDoReadDataset(const ARowsArray: TROJSONArray; const Destination: IDAEditableDataset; ARealFields: array of integer;AppendMode: Boolean);
+
+ function DoCreateStream: TStream; override;
+ procedure DoInitialize(Mode: TDAAdapterInitialization); override;
+ procedure DoFinalize; override;
+
+ function DoWriteDataset(const Source: IDADataset; Options: TDAWriteOptions; MaxRows: integer; ADynFieldNames: array of string): integer; override;
+
+ function DoBeginWriteDataset( const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend; override;
+ function DoWriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aDataIndex: Integer = -1): Integer; override;
+ function DoEndWriteDataset(aDataForAppend: TDADataForAppend): Integer; override;
+
+
+ procedure DoReadDataset(const DatasetName: string; const Destination: IDADataset; ApplySchema: boolean; AppendMode: Boolean); override;
+ procedure DoReadDelta(const DeltaName: string; const Destination: IDADelta); override;
+ procedure DoWriteDelta(const Source: IDADelta); override;
+ public
+ function GetTargetDataType: TRODataType; override;
+ published
+ end;
+
+implementation
+
+uses
+ Variants,
+ uROClasses,
+ uDAClasses,uDAEngine,uROBinaryHelpers, uROJSONMessage, uROCompression;
+
+const
+ TAlignmentStrings: array[Low(TAlignment)..High(TAlignment)] of Json_String =
+ ('taLeftJustify', 'taRightJustify', 'taCenter');
+ TDABlobTypeStrings: array[Low(TDABlobType)..High(TDABlobType)] of Json_String =
+ ('dabtUnknown', 'dabtBlob', 'dabtMemo', 'dabtOraBlob',
+ 'dabtOraClob', 'dabtGraphic', 'dabtTypedBinary', 'dabtTimestamp');
+ TDADataTypeStrings: array[Low(TDADataType)..High(TDADataType)] of Json_String =
+ ('datUnknown', 'datString', 'datDateTime', 'datFloat',
+ 'datCurrency', 'datAutoInc', 'datInteger', 'datLargeInt',
+ 'datBoolean', 'datMemo', 'datBlob', 'datWideString',
+ 'datWideMemo', 'datLargeAutoInc', 'datByte', 'datShortInt',
+ 'datWord', 'datSmallInt', 'datCardinal', 'datLargeUInt',
+ 'datGuid', 'datXml', 'datDecimal', 'datSingleFloat');
+ TDAParamTypeStrings:array[Low(TDAParamType)..High(TDAParamType)] of Json_String =
+ ('daptUnknown', 'daptInput', 'daptOutput', 'daptInputOutput',
+ 'daptResult');
+ TDAChangeTypeStrings: array[Low(TDAChangeType)..High(TDAChangeType)] of Json_String =
+ ('insert', 'update', 'delete');
+ TDAChangeStatusStrings: array[Low(TDAChangeStatus)..High(TDAChangeStatus)] of Json_String =
+ ('pending', 'resolved', 'failed');
+
+function TDAChangeStatusStringsToTDAChangeStatus(aValue: JSON_String): TDAChangeStatus;
+begin
+ for Result := Low(TDAChangeStatus) to High(TDAChangeStatus) do
+ if TDAChangeStatusStrings[Result] = aValue then Exit;
+ raise Exception.Create('Unknown TDAChangeStatus value: '''+aValue+'''');
+end;
+
+function TDAChangeTypeStringsToTDAChangeType(aValue: JSON_String): TDAChangeType;
+begin
+ for Result := Low(TDAChangeType) to High(TDAChangeType) do
+ if TDAChangeTypeStrings[Result] = aValue then Exit;
+ raise Exception.Create('Unknown TDAChangeType value: '''+aValue+'''');
+end;
+
+function TAlignmentStringsToTAlignment(aValue: Json_String): TAlignment;
+begin
+ for Result := Low(TAlignment) to High(TAlignment) do
+ if TAlignmentStrings[Result] = aValue then Exit;
+ raise Exception.Create('Unknown TAlignment value: '''+aValue+'''');
+end;
+
+function TDABlobTypeStringsToTDABlobType(aValue: Json_String): TDABlobType;
+begin
+ for Result := Low(TDABlobType) to High(TDABlobType) do
+ if TDABlobTypeStrings[Result] = aValue then Exit;
+ raise Exception.Create('Unknown TDABlobType value: '''+aValue+'''');
+end;
+
+function TDADataTypeStringsToTDADataType(aValue: Json_String): TDADataType;
+begin
+ for Result := Low(TDADataType) to High(TDADataType) do
+ if TDADataTypeStrings[Result] = aValue then Exit;
+ raise Exception.Create('Unknown TDADataType value: '''+aValue+'''');
+end;
+
+function TDAParamTypeStringsToTDAParamType(aValue: Json_String): TDAParamType;
+begin
+ for Result := Low(TDAParamType) to High(TDAParamType) do
+ if TDAParamTypeStrings[Result] = aValue then Exit;
+ raise Exception.Create('Unknown TDAParamType value: '''+aValue+'''');
+end;
+
+function EncodeBlob(val: Variant): variant;
+var
+ arrLen: integer;
+ arr: PByteArray;
+ msIn, msOut: TROBinaryMemoryStream;
+begin
+ if VarIsArray(val) then begin
+ arrLen := VarArrayHighBound(val, 1) - VarArrayLowBound(val, 1) + 1;
+ msIn := TROBinaryMemoryStream.Create;
+ msOut := TROBinaryMemoryStream.Create;
+ arr := VarArrayLock(val);
+ try
+ msIn.Write(arr^, arrLen);
+ msIn.Position := 0;
+ EncodeStream(msIn, msOut);
+ Result := msOut.ToString;
+ finally
+ msIn.Free;
+ msOut.Free;
+ VarArrayUnlock(val);
+ end;
+ end
+ else if VarIsNull(val) then begin
+ Result := 'null';
+ end
+ else begin
+ Result := val;
+ end;
+end;
+
+function DecodeBlob(val: AnsiString): Variant;
+var
+ msIn, msOut: TROBinaryMemoryStream;
+ arr: PByteArray;
+begin
+ Result := Null;
+ if ROAnsiCompare(val, 'null', false) <> 0 then begin
+ msIn := TROBinaryMemoryStream.Create(val);
+ msOut := TROBinaryMemoryStream.Create;
+ arr := nil;
+ try
+ msIn.Position := 0;
+ DecodeStream(msIn, msOut);
+ Result := VarArrayCreate([0, msOut.Size - 1], varByte);
+ arr := VarArrayLock(Result);
+ msOut.Position := 0;
+ msOut.Read(arr^, msOut.Size);
+ finally
+ if Assigned(arr) then VarArrayUnlock(Result);
+ msIn.Free;
+ msOut.Free;
+ end;
+ end;
+end;
+
+function EncodeDecimal(val: Variant): string;
+begin
+ Result := VarAsType(val, varString);
+ ReplaceChar(Result, [',', '.'], '.');
+end;
+
+{ TDAJSONDataStreamer }
+
+procedure TDAJSONDataStreamer.ClearParser;
+begin
+ FDatasets := nil;
+ FDeltas := nil;
+ if FParser <> nil then FreeAndNil(FParser);
+end;
+
+function TDAJSONDataStreamer.GetDatasetObjectByPropName(const ADatasetName, AObjectName: JSON_String; const ACreate: Boolean):TROJSONObject;
+var
+ lProp: TROJSONProperty;
+ lDataset: TROJSONObject;
+begin
+ Result := nil;
+ lDataset := GetDatasetObject(ADatasetName,ACreate);
+ lProp := lDataset.FindItem(AObjectName);
+ if (lProp = nil) then begin
+ if ACreate then
+ lProp := lDataset.AddObjectProperty(AObjectName)
+ else
+ Exit;
+ end;
+ Result := lProp.ASObject;
+end;
+
+function TDAJSONDataStreamer.DoBeginWriteDataset(const Source: IDADataset;
+ const Schema: TDADataset; Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend;
+var
+ k, i, Realfldcnt: integer;
+ fld: TDAField;
+ wrtschema: boolean;
+ info: array of TDASmallFieldInfo;
+ RealFields: array of integer;
+ lfields: array of integer;
+ lDataForAppend : TDADataForAppendBin2;
+ lSchemaFields: TDAFieldCollection;
+ lSchemaParams: TDAParamCollection;
+ lLogicalName: String;
+ lRealSchemaArray: TROJSONArray;
+ lobj: TROJSONObject;
+begin
+ lDataForAppend := TDADataForAppendBin2.Create();
+ result := lDataForAppend;
+
+ if Assigned(Schema) then begin
+ lDataForAppend.TableSchema := Schema;
+ if Schema is TDAUnionDataTable then begin
+ fld := Schema.FindField(def_SourceTableFieldName);
+ if not Assigned(fld) then begin
+ fld := Schema.Fields.Add();
+ fld.Name := def_SourceTableFieldName;
+ fld.DataType := datInteger;
+ fld.InPrimaryKey := true;
+ fld.ServerAutoRefresh := true;
+ end;
+ end;
+ lSchemaFields := Schema.Fields;
+ lSchemaParams := Schema.Params;
+ lLogicalName := Schema.Name;
+ end else begin
+ if Assigned(Source) then begin
+ lSchemaFields := Source.Fields;
+ lSchemaParams := Source.Params;
+ lLogicalName := Source.LogicalName;
+ end else begin
+ raise EDAException.Create('Schema or source should be assigned.');
+ end;
+ end;
+
+ if Length(ADynFieldNames) > 0 then begin
+ SetLength(lfields, Length(ADynFieldNames));
+ For i:=0 to High(ADynFieldNames) do begin
+ fld := lSchemaFields.FindField(ADynFieldNames[i]);
+ if fld <> nil then
+ lfields[i]:= i
+ else
+ lfields[i]:= -1; // TODO: shoudln't this raise an exception "field not found", or the like?
+ end;
+ end else begin
+ SetLength(lfields, lSchemaFields.Count);
+ For i:=0 to lSchemaFields.Count-1 do
+ lfields[i]:=i;
+ end;
+
+ // This information will be used later to complete the stream (see DoInitialize)
+ AddingDataset(lLogicalName);
+
+ // Writes a boolean flag that indicates if the schema is being written
+ wrtschema := (woSchema in Options) or (Length(ADynFieldNames)>0);
+ if wrtschema then
+ WriteSchema(GetDatasetObjectByPropName(lLogicalName,pn_Dataset_Schema,True), lSchemaFields, lSchemaParams, lfields);
+
+ // Writes the row count
+ if not (woRows in Options) then Exit;
+
+ // write datatypes+offsets
+ SetLength(info, lSchemaFields.Count);
+ SetLength(RealFields, lSchemaFields.Count);
+ Realfldcnt := 0;
+
+ lRealSchemaArray := GetDataArraysByPropName(Source.LogicalName,pn_Dataset_Data_Fields,True);
+ for i := 0 to High(lfields) do begin
+ if lSchemaFields[lfields[i]].Calculated or lSchemaFields[lfields[i]].Lookup then Continue;
+ RealFields[Realfldcnt] := lfields[i];
+ info[Realfldcnt].Name := lSchemaFields[lfields[i]].Name;
+ lobj:=lRealSchemaArray.AddObject.AsObject;
+ lObj.AddStringProperty(pn_Dataset_Data_Fields_name,info[Realfldcnt].Name);
+ inc(Realfldcnt);
+ end;
+ SetLength(info, Realfldcnt);
+ SetLength(RealFields, Realfldcnt);
+
+ // prepare DataForAppend structure...
+ SetLength(lDataForAppend.RealFields, Realfldcnt);
+ SetLength(lDataForAppend.FieldsInfo, Realfldcnt);
+ for i := Low(RealFields) to High(RealFields) do begin
+ lDataForAppend.RealFields[i] := RealFields[i];
+ lDataForAppend.FieldsInfo[i].Name := info[i].Name;
+ end;
+
+ lDataForAppend.MaxRowCount := MaxRows;
+ k := 0;
+ lDataForAppend.RecordCount := k;
+ result := lDataForAppend;
+end;
+
+function TDAJSONDataStreamer.DoCreateStream: TStream;
+begin
+ // outdated, for backward capability
+ result := nil;
+end;
+
+function TDAJSONDataStreamer.DoEndWriteDataset(
+ aDataForAppend: TDADataForAppend): Integer;
+begin
+ Result:= aDataForAppend.RecordCount;
+ aDataForAppend.Free;
+end;
+
+procedure TDAJSONDataStreamer.DoFinalize;
+begin
+ if (AdapterInitialization in AdapterWriteModes) then begin
+ if (FDatasets <> nil) and (FDatasets.Count = 0) then
+ FParser.AsObject.FindItem(pn_Datasets).Free;
+ if (FDeltas <> nil) and (FDeltas.Count = 0) then
+ FParser.AsObject.FindItem(pn_Deltas).Free;
+ FParser.SaveToStream(Data);
+ end;
+ ClearParser;
+end;
+
+procedure TDAJSONDataStreamer.DoInitialize(Mode: TDAAdapterInitialization);
+var
+ i : integer;
+ lobj: TROJSONObject;
+ lprop: TROJSONProperty;
+begin
+ ClearParser;
+ if (Mode in AdapterReadModes) then begin
+
+ FParser := JSON_ParseStream(Data);
+
+ if (FParser.ValueType = jdtObject) and (FParser.AsObject <> nil) then begin
+ lprop := FParser.AsObject.FindItem(pn_Datasets);
+ if lProp <> nil then begin
+ FDatasets := lProp.ASArray;
+ if (FDatasets <> nil) then
+ for i := 0 to (FDatasets.Count-1) do begin
+ lobj:=FDatasets.Items[i].AsObject;
+ if (lobj <> nil) then begin
+ lprop:=lobj.FindItem(pn_Dataset_Name);
+ AddingDataset(lprop.AsString);
+ end;
+ end;
+ end;
+ lProp := FParser.AsObject.FindItem(pn_Deltas);
+ if lProp <> nil then begin
+ FDeltas := lProp.ASArray;
+ if (FDeltas <> nil) then
+ for i := 0 to (FDeltas.Count-1) do begin
+ lobj:=FDeltas.Items[i].AsObject;
+ if (lobj <> nil) then begin
+ lprop:=lobj.FindItem(pn_Delta_Name);
+ AddingDelta(lprop.AsString);
+ end;
+ end;
+ end;
+ end;
+ end
+ else if (Mode in AdapterWriteModes) then begin
+ FParser := TROJSONValue.Create(nil);
+ FParser.AsObject:= TROJSONObject.Create;
+ FDatasets := FParser.AsObject.AddArrayProperty(pn_Datasets).ASArray;
+ FDeltas := FParser.AsObject.AddArrayProperty(pn_Deltas).ASArray;
+ end;
+end;
+
+procedure TDAJSONDataStreamer.DoReadDataset(const DatasetName: string;
+ const Destination: IDADataset; ApplySchema: boolean; AppendMode: Boolean);
+
+var
+ editable: IDAEditableDataset;
+ i, k: integer;
+ readonlyfields: array of boolean;
+ //
+ Realfldcount: integer;
+ info: array of TDASmallFieldInfo;
+ RealFields: array of integer;
+ lErrorMessage: String;
+ lErrorMesCnt: integer;
+ lFldList: TStringList;
+ lObject: TROJSONObject;
+ lArray: TROJSONArray;
+begin
+ if Destination.Active and ApplySchema then raise Exception.Create('Cannot apply a schema if the destination is active');
+
+ lErrorMessage := '';
+ lErrorMesCnt := 0;
+
+ editable := Destination as IDAEditableDataset;
+
+ Destination.DisableControls;
+ try
+ editable.DisableEventHandlers;
+ try
+ if ApplySchema then begin
+ // Checks to see if the schema is present
+ lObject:= GetDatasetObjectByPropName(DatasetName,pn_Dataset_Schema, False);
+ if (lObject <> nil) and ApplySchema then ReadSchema(lObject, Destination);
+ Exit;
+ end
+ else begin
+ lObject:= GetDatasetObjectByPropName(DatasetName,pn_Dataset_Data,False);
+ if (lObject = nil) then Exit; // Only schema is present!
+
+ if not Destination.Active then Destination.Open;
+ with editable do try
+ // if table is empty then process in standard mode
+ AppendMode := AppendMode and not (EOF and GetBOF);
+
+ // Temporarily sets all fields as writable
+ Destination.DisableConstraints;
+ lArray := lObject.ItemByName(pn_Dataset_Data_Fields).ASArray;
+
+ Realfldcount := lArray.Count;
+ SetLength(info, Realfldcount);
+ SetLength(RealFields, Realfldcount);
+ //Data.Read(pointer(info)^, Sizeof(TDASmallFieldInfo) * Realfldcount);
+ lFldList:=TStringList.Create;
+ try
+ lFldList.Sorted:=False;
+ lFldList.Duplicates:=dupIgnore;
+ For i:= 0 to Fields.Count-1 do
+ lFldList.AddObject(Fields[i].Name,Pointer(Fields[i].Index));
+ lFldList.Sorted:=True;
+
+ for i := 0 to Realfldcount - 1 do begin
+ info[i].Name := lArray[i].AsObject.GetStringValueByName(pn_Dataset_Data_Fields_name);
+ k:=lFldList.IndexOf(info[i].Name);
+ if k = -1 then begin
+ inc(lErrorMesCnt);
+ if lErrorMesCnt > 5 then begin
+ lErrorMessage := lErrorMessage + '' + sLineBreak;
+ break;
+ end
+ else begin
+ lErrorMessage := lErrorMessage + Format('The %s field isn''t found.' + sLineBreak,[info[i].Name])
+ end;
+ end
+ else begin
+ RealFields[i]:= Integer(lFldList.Objects[k]);
+ end;
+ end;
+ finally
+ lFldList.Free;
+ end;
+ if (Length(lErrorMessage) > 0) then begin
+ lErrorMessage := 'Format of the data in the stream doesn''t match the destination table format.'+ #13#10 + #13#10 + lErrorMessage;
+ raise EDAException.Create(lErrorMessage);
+ end;
+
+ k := 0;
+ SetLength(readonlyfields, Fields.Count);
+ for i := 0 to (Fields.Count - 1) do begin
+ readonlyfields[i] := Fields[i].ReadOnly;
+ Fields[i].ReadOnly := FALSE;
+ if Fields[i].Calculated or Fields[i].Lookup then Continue;
+ //RealFields[k] := i;
+ if (k >= Realfldcount) then lErrorMessage := lErrorMessage + 'Fields count mismatch' + sLineBreak;
+ inc(k);
+ end;
+ try
+ if (k <> Realfldcount) then lErrorMessage := lErrorMessage + Format('Fields count mismatch: %d expected but %d found in the stream', [k, Realfldcount]) + sLineBreak;
+ if (Length(lErrorMessage) > 0) then begin
+ lErrorMessage := 'Format of the data in the stream doesn''t match the destination table format.'+ sLineBreak + sLineBreak + lErrorMessage;
+ raise EDAException.Create(lErrorMessage);
+ end;
+ // Inserts the records
+ try
+ lArray := lObject.ItemByName(pn_Dataset_Data_Rows).ASArray;
+ if lArray.Count > 0 then
+ InternalDoReadDataset( lArray, editable,RealFields,AppendMode);
+ except
+ raise;
+ end;
+ finally
+ // Restores the read-only property
+ for i := 0 to (Fields.Count - 1) do
+ Fields[i].ReadOnly := readonlyfields[i];
+ end;
+ finally
+ Destination.EnableConstraints;
+ end;
+ end;
+ finally
+ editable.EnableEventHandlers;
+ end;
+ finally
+ Destination.EnableControls;
+ end;
+end;
+
+procedure TDAJSONDataStreamer.DoReadDelta(const DeltaName: string;
+ const Destination: IDADelta);
+var
+ msg: JSON_String;
+ recid, i, x: integer;
+ change: TDADeltaChange;
+ changetype: TDAChangeType;
+ status: TDAChangeStatus;
+
+ lDeltaObject: TROJSONObject;
+ lArray: TROJSONArray;
+ lArray2: TROJSONArray;
+ lObject: TROJSONObject;
+ lProgress: Boolean;
+ lTotal: Integer;
+ lOffset: Integer;
+begin
+ lDeltaObject:=GetDeltaObject(DeltaName,False);
+
+ // names and types
+ Destination.ClearFieldNames;
+ lArray := lDeltaObject.ItemByName(pn_Delta_LoggedFields).ASArray;
+ for i := 0 to lArray.Count-1 do begin
+ lObject:=lArray[i].AsObject;
+ Destination.AddFieldName(lObject.GetStringValueByName(pn_Delta_LoggedFields_Name), TDADataTypeStringsToTDADataType(lObject.GetStringValueByName(pn_Delta_LoggedFields_Type)));
+// Destination.AddFieldName(lObject.GetStringValueByName(pn_Delta_LoggedFields_Name));
+// Destination.LoggedFieldTypes[Destination.LoggedFieldCount - 1] := TDADataTypeStringsToTDADataType(lObject.GetStringValueByName(pn_Delta_LoggedFields_Type));
+ end;
+
+ // Key fields
+ Destination.ClearKeyFieldNames;
+ lArray := lDeltaObject.ItemByName(pn_Delta_KeyFields).ASArray;
+ for i := 0 to lArray.Count-1 do
+ Destination.AddKeyFieldName(lArray[i].AsString);
+
+
+
+ lArray:=lDeltaObject.ItemByName(pn_Delta_Data).ASArray;
+ lProgress := Assigned(OnReadDeltaProgress);
+ lTotal := lArray.Count;
+ for i := 0 to lArray.Count-1 do begin
+ lObject:= lArray[i].AsObject;
+ recid := lObject.GetNumberValueByName(pn_Delta_Data_RecID);
+ changetype := TDAChangeTypeStringsToTDAChangeType(lObject.GetStringValueByName(pn_Delta_Data_Changetype));
+ status := TDAChangeStatusStringsToTDAChangeStatus(lObject.GetStringValueByName(pn_Delta_Data_Status));
+ msg := lObject.GetStringValueByName(pn_Delta_Data_Message);
+ change := Destination.Add(recid, changetype, status, msg);
+
+
+ lArray2:=lObject.ItemByName(pn_Delta_Data_Old).ASArray;
+ for x := 0 to (Destination.LoggedFieldCount - 1) do
+ if lArray2[x].ValueType <> jdtNull then
+ case Destination.LoggedFieldTypes[x] of
+ datDateTime: change.OldValues[x] := SOAPDateTimeToDateTime(lArray2[x].AsString, lOffset);
+ datBlob: change.OldValues[x] := DecodeBlob({$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(lArray2[x].AsString));
+ else change.OldValues[x] := lArray2[x].VarValue;
+ end
+ else change.OldValues[x] := lArray2[x].VarValue;
+
+
+ lArray2:=lObject.ItemByName(pn_Delta_Data_New).ASArray;
+ for x := 0 to (Destination.LoggedFieldCount - 1) do
+ if lArray2[x].ValueType <> jdtNull then
+ case Destination.LoggedFieldTypes[x] of
+ datDateTime: change.NewValues[x] := SOAPDateTimeToDateTime(lArray2[x].AsString, lOffset);
+ datBlob: change.NewValues[x] := DecodeBlob({$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(lArray2[x].AsString));
+ else change.NewValues[x] := lArray2[x].VarValue;
+ end
+ else change.NewValues[x] := lArray2[x].VarValue;
+
+ if lProgress then OnReadDeltaProgress(Self, Destination, i, lTotal);
+ end;
+end;
+
+function TDAJSONDataStreamer.DoWriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): integer;
+var
+ lDataForAppend: TDADataForAppend;
+begin
+ lDataForAppend := DoBeginWriteDataset(Source, {schema}nil, Options, MaxRows, ADynFieldNames);
+ if woRows in Options then begin
+ DoWriteDatasetData(Source, lDataForAppend);
+ result := DoEndWriteDataset(lDataForAppend);
+ end
+ else begin
+ lDataForAppend.Free;
+ result := -1;
+ end;
+end;
+
+function TDAJSONDataStreamer.DoWriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aDataIndex: Integer = -1): Integer;
+var
+ max, k, i, Realfldcnt: integer;
+ info: array of TDASmallFieldInfo;
+ RealFields: array of integer;
+ lDataForAppend: TDADataForAppendBin2;
+ lMapToFieldName: String;
+ lColumnMappings: TDAColumnMappingCollection;
+ lColumnMapping: TDAColumnMapping;
+begin
+ lDataForAppend := aDataForAppend as TDADataForAppendBin2;
+ Realfldcnt := Length(lDataForAppend.RealFields);
+ SetLength(info, Realfldcnt);
+ SetLength(RealFields, Realfldcnt);
+ for i := 0 to Realfldcnt - 1 do begin
+ info[i].Name := lDataForAppend.FieldsInfo[i].Name;
+ RealFields[i] := lDataForAppend.RealFields[i];
+ end;
+ max := lDataForAppend.MaxRowCount;
+ k := lDataForAppend.RecordCount;
+
+ // Mapping fields of Source table to the streamed dataset
+ if Assigned(lDataForAppend.TableSchema) and (lDataForAppend.TableSchema is TDAUnionDataTable) then begin
+ lColumnMappings := TDAUnionSourceTable(TDAUnionDataTable(lDataForAppend.TableSchema).SourceTables.ItemByName(Source.Name)).ColumnMappings;
+ for i := 0 to Realfldcnt - 1 do begin
+ if info[i].Name = def_SourceTableFieldName then begin
+ RealFields[i] := -10;
+ continue;
+ end;
+ lMapToFieldName := info[i].Name;
+ if Assigned(lColumnMappings) then begin
+ lColumnMapping := lColumnMappings.MappingByDatasetField(info[i].Name);
+ if Assigned(lColumnMapping) and (lColumnMapping.TableField <> '') then
+ lMapToFieldName := lColumnMapping.TableField;
+ end;
+ RealFields[i] := Source.FieldByName(lMapToFieldName).Index;
+ end;
+ end;
+
+ with Source do try
+ DisableControls;
+
+ if not Source.Active then Source.Open;
+ try
+ InternalDoWriteDataset(Source,k, max, RealFields, aDataIndex, info)
+ except
+ raise;
+ end;
+
+ lDataForAppend.RecordCount := k;
+ finally
+ EnableControls;
+ result := k;
+ end;
+end;
+
+procedure TDAJSONDataStreamer.DoWriteDelta(const Source: IDADelta);
+var
+ i, x: integer;
+ lDeltaObject: TROJSONObject;
+ lArray: TROJSONArray;
+ lArray2: TROJSONArray;
+ lObject: TROJSONObject;
+ lchange: TDADeltaChange;
+ lProgress: Boolean;
+ lTotal: integer;
+begin
+
+ // This information will be used later to complete the stream (see DoInitialize)
+ AddingDelta(Source.LogicalName);
+ Source.RemoveUnchangedChanges;
+ lDeltaObject:=GetDeltaObject(Source.LogicalName,True);
+
+ lArray:=lDeltaObject.AddArrayProperty(pn_Delta_LoggedFields).ASArray;
+ // field names and their types
+ for i := 0 to (Source.LoggedFieldCount - 1) do begin
+ lObject:=lArray.AddObject.AsObject;
+ lObject.AddStringProperty(pn_Delta_LoggedFields_Name, Source.LoggedFieldNames[i]);
+ lObject.AddStringProperty(pn_Delta_LoggedFields_Type, TDADataTypeStrings[Source.LoggedFieldTypes[i]]);
+ end;
+
+ lArray:=lDeltaObject.AddArrayProperty(pn_Delta_KeyFields).ASArray;
+ // Key fields
+ for i := 0 to (Source.KeyFieldCount - 1) do
+ lArray.AddStringValue(Source.KeyFieldNames[i]);
+
+ lArray := lDeltaObject.AddArrayProperty(pn_Delta_Data).ASArray;
+ if (Source.Count = 0) then Exit;
+ lProgress := Assigned(OnWriteDeltaProgress);
+ lTotal := Source.Count;
+
+ for i := 0 to (Source.Count - 1) do begin
+ lObject:=lArray.AddObject.AsObject;
+ lchange :=Source.Changes[i];
+ lObject.AddNumberProperty(pn_Delta_Data_RecID,lchange.RecID);
+ lObject.AddStringProperty(pn_Delta_Data_Changetype,TDAChangeTypeStrings[lchange.ChangeType]);
+ lObject.AddStringProperty(pn_Delta_Data_Status,TDAChangeStatusStrings[lchange.Status]);
+ lObject.AddStringProperty(pn_Delta_Data_Message,lchange.Message);
+
+ // old
+ lArray2:=lObject.AddArrayProperty(pn_Delta_Data_Old).ASArray;
+ for x := 0 to (Source.LoggedFieldCount - 1) do
+ if not VarIsNull(Source.Changes[i].OldValues[x]) then
+ case Source.LoggedFieldTypes[x] of
+ datDateTime: lArray2.AddStringValue(DateTimeToSOAPDateTime(Source.Changes[i].OldValues[x]));
+ datBlob: lArray2.AddStringValue(VarToWideStr(EncodeBlob(Source.Changes[i].OldValues[x])));
+ datDecimal: lArray2.AddStringValue(EncodeDecimal(Source.Changes[i].OldValues[x]));
+ else lArray2.AddVariantValue(Source.Changes[i].OldValues[x]);
+ end
+ else lArray2.AddVariantValue(Source.Changes[i].OldValues[x]);
+
+ // new
+ lArray2:=lObject.AddArrayProperty(pn_Delta_Data_New).ASArray;
+ for x := 0 to (Source.LoggedFieldCount - 1) do
+ if not VarIsNull(Source.Changes[i].NewValues[x]) then
+ case Source.LoggedFieldTypes[x] of
+ datDateTime: lArray2.AddStringValue(DateTimeToSOAPDateTime(Source.Changes[i].NewValues[x]));
+ datBlob: lArray2.AddStringValue(VarToWideStr(EncodeBlob(Source.Changes[i].NewValues[x])));
+ datDecimal: lArray2.AddStringValue(EncodeDecimal(Source.Changes[i].NewValues[x]));
+ else lArray2.AddVariantValue(Source.Changes[i].NewValues[x]);
+ end
+ else lArray2.AddVariantValue(Source.Changes[i].NewValues[x]);
+
+ if lProgress then OnWriteDeltaProgress(Self, Source, i+1, lTotal);
+ end;
+end;
+
+procedure TDAJSONDataStreamer.ReadField(const AFieldObject: TROJSONObject;
+ const AField: TDAField);
+var
+ lProp: TROJSONProperty;
+begin
+ lProp := AFieldObject.FindItem('Alignment');
+ if lProp <> nil then AField.Alignment := TAlignmentStringsToTAlignment(lProp.AsString);
+ lProp := AFieldObject.FindItem('BlobType');
+ if lProp <> nil then AField.BlobType := TDABlobTypeStringsToTDABlobType(lProp.AsString);
+ lProp := AFieldObject.FindItem('BusinessClassID');
+ if lProp <> nil then AField.BusinessClassID := lProp.AsString;
+ lProp := AFieldObject.FindItem('Calculated');
+ if lProp <> nil then AField.Calculated := lProp.AsBoolean;
+ lProp := AFieldObject.FindItem('CustomAttributes');
+ if lProp <> nil then AField.CustomAttributes.Text := lProp.AsString;
+ lProp := AFieldObject.FindItem('DataType');
+ if lProp <> nil then AField.DataType := TDADataTypeStringsToTDADataType(lProp.AsString);
+ lProp := AFieldObject.FindItem('DecimalPrecision');
+ if lProp <> nil then AField.DecimalPrecision := lProp.AsNumber;
+ lProp := AFieldObject.FindItem('DecimalScale');
+ if lProp <> nil then AField.DecimalScale := lProp.AsNumber;
+ lProp := AFieldObject.FindItem('DefaultValue');
+ if lProp <> nil then AField.DefaultValue := lProp.AsString;
+ lProp := AFieldObject.FindItem('Description');
+ if lProp <> nil then AField.Description := lProp.AsString;
+ lProp := AFieldObject.FindItem('DictionaryEntry');
+ if lProp <> nil then AField.DictionaryEntry := lProp.AsString;
+ lProp := AFieldObject.FindItem('DisplayFormat');
+ if lProp <> nil then AField.DisplayFormat := lProp.AsString;
+ lProp := AFieldObject.FindItem('DisplayLabel');
+ if lProp <> nil then AField.DisplayLabel := lProp.AsString;
+ lProp := AFieldObject.FindItem('DisplayWidth');
+ if lProp <> nil then AField.DisplayWidth := lProp.AsNumber;
+ lProp := AFieldObject.FindItem('EditFormat');
+ if lProp <> nil then AField.EditFormat := lProp.AsString;
+ lProp := AFieldObject.FindItem('EditMask');
+ if lProp <> nil then AField.EditMask := lProp.AsString;
+ lProp := AFieldObject.FindItem('Expression');
+ if lProp <> nil then AField.Expression := lProp.AsString;
+ lProp := AFieldObject.FindItem('GeneratorName');
+ if lProp <> nil then AField.GeneratorName := lProp.AsString;
+ lProp := AFieldObject.FindItem('InPrimaryKey');
+ if lProp <> nil then AField.InPrimaryKey := lProp.AsBoolean;
+ lProp := AFieldObject.FindItem('KeyFields');
+ if lProp <> nil then AField.KeyFields := lProp.AsString;
+ lProp := AFieldObject.FindItem('LogChanges');
+ if lProp <> nil then AField.LogChanges := lProp.AsBoolean;
+ lProp := AFieldObject.FindItem('Lookup');
+ if lProp <> nil then AField.Lookup := lProp.AsBoolean;
+ lProp := AFieldObject.FindItem('LookupCache');
+ if lProp <> nil then AField.LookupCache := lProp.AsBoolean;
+ lProp := AFieldObject.FindItem('LookupKeyFields');
+ if lProp <> nil then AField.LookupKeyFields := lProp.AsString;
+ lProp := AFieldObject.FindItem('LookupResultField');
+ if lProp <> nil then AField.LookupResultField := lProp.AsString;
+// lProp := AFieldObject.FindItem('LookupSource');
+// if lProp <> nil then AField.LookupSource := nil;
+ lProp := AFieldObject.FindItem('Name');
+ if lProp <> nil then AField.Name := lProp.AsString;
+ lProp := AFieldObject.FindItem('ReadOnly');
+ if lProp <> nil then AField.ReadOnly := lProp.AsBoolean;
+ lProp := AFieldObject.FindItem('RegExpression');
+ if lProp <> nil then AField.RegExpression := lProp.AsString;
+ lProp := AFieldObject.FindItem('Required');
+ if lProp <> nil then AField.Required := lProp.AsBoolean;
+ lProp := AFieldObject.FindItem('ServerAutoRefresh');
+ if lProp <> nil then AField.ServerAutoRefresh := lProp.AsBoolean;
+ lProp := AFieldObject.FindItem('ServerCalculated');
+ if lProp <> nil then AField.ServerCalculated := lProp.AsBoolean;
+ lProp := AFieldObject.FindItem('Size');
+ if lProp <> nil then AField.Size := lProp.AsNumber;
+ lProp := AFieldObject.FindItem('Visible');
+ if lProp <> nil then AField.Visible := lProp.AsBoolean;
+end;
+
+procedure TDAJSONDataStreamer.ReadParam(const AParamObject: TROJSONObject;
+ const AParam: TDAParam);
+var
+ lProp: TROJSONProperty;
+begin
+ lProp := AParamObject.FindItem('AsWideString');
+ if lProp <> nil then AParam.AsWideString := lProp.AsString;
+ lProp := AParamObject.FindItem('BlobType');
+ if lProp <> nil then AParam.BlobType := TDABlobTypeStringsToTDABlobType(lProp.AsString);
+ lProp := AParamObject.FindItem('DataType');
+ if lProp <> nil then AParam.DataType := TDADataTypeStringsToTDADataType(lProp.AsString);
+ lProp := AParamObject.FindItem('DecimalPrecision');
+ if lProp <> nil then AParam.DecimalPrecision := lProp.AsNumber;
+ lProp := AParamObject.FindItem('DecimalScale');
+ if lProp <> nil then AParam.DecimalScale := lProp.AsNumber;
+ lProp := AParamObject.FindItem('Description');
+ if lProp <> nil then AParam.Description := lProp.AsString;
+ lProp := AParamObject.FindItem('GeneratorName');
+ if lProp <> nil then AParam.GeneratorName := lProp.AsString;
+ lProp := AParamObject.FindItem('Name');
+ if lProp <> nil then AParam.Name := lProp.AsString;
+ lProp := AParamObject.FindItem('ParamType');
+ if lProp <> nil then AParam.ParamType := TDAParamTypeStringsToTDAParamType(lProp.AsString);
+ lProp := AParamObject.FindItem('Size');
+ if lProp <> nil then AParam.Size := lProp.AsNumber;
+ lProp := AParamObject.FindItem('Value');
+ if lProp <> nil then begin
+ case lProp.ValueType of
+ jdtString: AParam.Value := lProp.AsString;
+ jdtNumber: AParam.Value := lProp.AsNumber;
+ jdtBoolean: AParam.Value := lProp.AsBoolean;
+ else
+ AParam.Value := Null;
+ end;
+ end;
+end;
+
+procedure TDAJSONDataStreamer.ReadSchema(
+ const ASchemaObject: TROJSONObject; const Destination: IDADataset);
+var
+ i: integer;
+ lFields, lParams : TROJSONArray;
+begin
+ Destination.Fields.Clear;
+ lFields:= ASchemaObject.GetArrayItemByName(pn_Dataset_Schema_Fields,False);
+ if lFields <> nil then
+ for i := 0 to lFields.Count-1 do
+ ReadField(lFields.Items[i].AsObject,Destination.Fields.Add);
+
+ Destination.Params.Clear;
+ lParams:= ASchemaObject.GetArrayItemByName(pn_Dataset_Schema_Params,False);
+ if lParams <> nil then
+ for i := 0 to lParams.Count - 1 do
+ ReadParam(lParams.Items[i].AsObject, Destination.Params.Add);
+end;
+
+procedure TDAJSONDataStreamer.WriteField(const AFieldObject: TROJSONObject;
+ const AField: TDAField);
+begin
+ //same as in bin2
+ AFieldObject.AddStringProperty('Alignment', TAlignmentStrings[AField.Alignment]);
+ AFieldObject.AddStringProperty('BlobType', TDABlobTypeStrings[AField.BlobType]);
+ AFieldObject.AddStringProperty('BusinessClassID', AField.BusinessClassID);
+ AFieldObject.AddBooleanProperty('Calculated', AField.Calculated);
+ AFieldObject.AddStringProperty('CustomAttributes', AField.CustomAttributes.Text);
+ AFieldObject.AddStringProperty('DataType', TDADataTypeStrings[AField.DataType]);
+ AFieldObject.AddNumberProperty('DecimalPrecision', AField.DecimalPrecision);
+ AFieldObject.AddNumberProperty('DecimalScale', AField.DecimalScale);
+ AFieldObject.AddStringProperty('DefaultValue', AField.DefaultValue);
+ AFieldObject.AddStringProperty('Description', AField.Description);
+ AFieldObject.AddStringProperty('DictionaryEntry', AField.DictionaryEntry);
+ AFieldObject.AddStringProperty('DisplayFormat', AField.DisplayFormat);
+ AFieldObject.AddStringProperty('DisplayLabel', AField.DisplayLabel);
+ AFieldObject.AddNumberProperty('DisplayWidth', AField.DisplayWidth);
+ AFieldObject.AddStringProperty('EditFormat', AField.EditFormat);
+ AFieldObject.AddStringProperty('EditMask', AField.EditMask);
+ AFieldObject.AddStringProperty('Expression', AField.Expression);
+ AFieldObject.AddStringProperty('GeneratorName', AField.GeneratorName);
+ AFieldObject.AddBooleanProperty('InPrimaryKey', AField.InPrimaryKey);
+ AFieldObject.AddStringProperty('KeyFields', AField.KeyFields);
+ AFieldObject.AddBooleanProperty('LogChanges',AField.LogChanges);
+ AFieldObject.AddBooleanProperty('Lookup', AField.Lookup);
+ AFieldObject.AddBooleanProperty('LookupCache',AField.LookupCache);
+ AFieldObject.AddStringProperty('LookupKeyFields', AField.LookupKeyFields);
+ AFieldObject.AddStringProperty('LookupResultField', AField.LookupResultField);
+ AFieldObject.AddStringProperty('LookupSource','');
+ AFieldObject.AddStringProperty('Name',AField.Name);
+ AFieldObject.AddBooleanProperty('ReadOnly', AField.ReadOnly);
+ AFieldObject.AddStringProperty('RegExpression', AField.RegExpression);
+ AFieldObject.AddBooleanProperty('Required', AField.Required);
+ AFieldObject.AddBooleanProperty('ServerAutoRefresh', AField.ServerAutoRefresh);
+ AFieldObject.AddBooleanProperty('ServerCalculated', AField.ServerCalculated);
+ AFieldObject.AddNumberProperty('Size', AField.Size);
+ AFieldObject.AddBooleanProperty('Visible', AField.Visible);
+end;
+
+procedure TDAJSONDataStreamer.WriteParam(const AParamObject: TROJSONObject;
+ const AParam: TDAParam);
+begin
+ //same as in bin2
+ AParamObject.AddStringProperty('AsWideString', AParam.AsWideString);
+ AParamObject.AddStringProperty('BlobType', TDABlobTypeStrings[AParam.BlobType]);
+ AParamObject.AddStringProperty('DataType', TDADataTypeStrings[AParam.DataType]);
+ AParamObject.AddNumberProperty('DecimalPrecision', AParam.DecimalPrecision);
+ AParamObject.AddNumberProperty('DecimalScale', AParam.DecimalScale);
+ AParamObject.AddStringProperty('Description', AParam.Description);
+ AParamObject.AddStringProperty('GeneratorName', AParam.GeneratorName);
+ AParamObject.AddStringProperty('Name',AParam.Name);
+ AParamObject.AddStringProperty('ParamType', TDAParamTypeStrings[AParam.ParamType]);
+ AParamObject.AddNumberProperty('Size', AParam.Size);
+
+
+ if VarIsStr(AParam.Value) then AParamObject.AddStringProperty('Value', AParam.Value)
+ else if TVarData(AParam.Value).VType = varBoolean then AParamObject.AddBooleanProperty('Value', AParam.Value)
+ else if VarIsNumeric(AParam.Value) then AParamObject.AddNumberProperty('Value', AParam.Value)
+ else AParamObject.AddNullProperty('Value');
+end;
+
+procedure TDAJSONDataStreamer.WriteSchema(const ASchemaObject: TROJSONObject;
+ const Fields: TDAFieldCollection; const Params: TDAParamCollection;
+ aFieldsIndex: array of integer);
+var
+ i: integer;
+ lFields, lParams : TROJSONArray;
+begin
+ if Length(aFieldsIndex) >0 then begin
+ lFields := ASchemaObject.AddArrayProperty(pn_Dataset_Schema_Fields).ASArray;
+ for i := 0 to High(aFieldsIndex) do
+ WriteField(lFields.AddObject.AsObject, Fields[aFieldsIndex[i]]);
+ end;
+
+ if Params.Count >0 then begin
+ lParams := ASchemaObject.AddArrayProperty(pn_Dataset_Schema_Params).ASArray;
+ for i := 0 to Params.Count - 1 do
+ WriteParam(lParams.AddObject.AsObject,Params[i]);
+ end;
+end;
+
+function TDAJSONDataStreamer.GetDatasetObject(const ADatasetName: JSON_String;
+ const ACreate: Boolean): TROJSONObject;
+begin
+ Result := FDatasets.FindObjectByStringValue(pn_Dataset_Name, ADatasetName);
+ if (Result = nil) then begin
+ if ACreate then begin
+ Result := FDatasets.AddObject.AsObject;
+ Result.AddStringProperty(pn_Dataset_Name,ADatasetName);
+ end
+ else begin
+ raise EDAException.Create('Cannot find dataset '+ADatasetName);
+ end;
+ end;
+end;
+
+procedure TDAJSONDataStreamer.InternalDoReadDataset(
+ const ARowsArray: TROJSONArray; const Destination: IDAEditableDataset;
+ ARealFields: array of integer;AppendMode: Boolean);
+
+var
+ lPK: string; //for append mode
+ lPKValues: array of variant; //for append mode
+ lOnePK:Boolean; //for append mode
+
+ function Dataset_Locate(): boolean;
+ begin
+ if lOnePK then
+ Result:= Destination.Locate(lPK,lPKValues[0],[])
+ else
+ Result:= Destination.Locate(lPK,lPKValues,[]);
+ end;
+
+var
+ j: integer;
+ ev: boolean;
+ val: Variant;
+ flds: TDAFieldArray; // flds in stream
+ i: integer;
+ Realfldcount: integer;
+ lRow : TROJSONArray;
+ lProgress: Boolean;
+ lTotal: integer;
+ lFldValues: array of Variant; // flds values for append mode
+ lPKFlds: TDAFieldArray; // PK flds (Append mode)
+ lOffset: integer;
+begin
+ Realfldcount := Length(ARealFields);
+ setLength(flds, Realfldcount);
+ For i:= 0 to Realfldcount-1 do
+ flds[i] := Destination.Fields[ARealFields[i]];
+ ev := Assigned(OnReadFieldValue);
+ lProgress := Assigned(OnReadDatasetProgress);
+ lTotal := ARowsArray.Count;
+
+ lPK := Dataset_GetPK(flds, lPKFlds);
+ lOnePK := Length(lPKFlds) = 1;
+ AppendMode := AppendMode and (Length(lPKFlds)>0);
+ if AppendMode then begin
+ SetLength(lFldValues, Length(flds));
+ SetLength(lPKValues, Length(lPKFlds));
+ end;
+
+ for j:= 0 to ARowsArray.Count -1 do begin
+ lRow := ARowsArray[j].ASArray;
+ Destination.Append;
+ for i := 0 to Realfldcount - 1 do begin
+ val := lRow[i].VarValue;
+ if ev then OnReadFieldValue(flds[i], val);
+ if not VarIsNull(val) then
+ case flds[i].DataType of
+ datDecimal: flds[i].AsDecimal := VariantToBCD(val);
+ datDateTime: flds[i].AsDateTime := SOAPDateTimeToDateTime(val, lOffset);
+ datBlob:
+ case VarType(val) of
+ varString, varOleStr, varUString: flds[i].Value := DecodeBlob({$IFDEF UNICODE}VarToAnsiStr{$ENDIF}(val));
+ else
+ flds[i].Value := val;
+ end;
+ else flds[i].Value := val;
+ end;
+ end;
+ if AppendMode then begin
+ // store values and avoid firing OnReadFieldValue event
+ for I := 0 to Length(Flds) - 1 do
+ lFldValues[i]:= Flds[i].Value;
+ // store PK values for locate
+ for I := 0 to Length(lPKFlds) - 1 do
+ lPKValues[i]:= lPKFlds[i].Value;
+
+ Destination.Cancel;
+ if Dataset_Locate then
+ Destination.Edit
+ else
+ Destination.Append;
+ // assign new values
+ for I := 0 to Length(Flds) - 1 do
+ Flds[i].Value := lFldValues[i];
+ end;
+
+ try
+ Destination.Post;
+ except
+ // Introduced to restore the dsBrowse state of the datatable
+ // in case of errors
+ Destination.Cancel;
+ raise;
+ end;
+ if lProgress then OnReadDatasetProgress(Self, Destination, j, lTotal);
+ end;
+end;
+
+procedure TDAJSONDataStreamer.InternalDoWriteDataset(
+ const Source: IDADataset; var k: integer; const Maxrecords: integer;
+ ARealFields: array of integer; aDataIndex: Integer;
+ info: array of TDASmallFieldInfo);
+var
+ ev1, ev2,ev3: boolean;
+ BitMask: Ansistring;
+ BitMaskSize: integer;
+ i : integer;
+ Realfldcnt: integer;
+ flds: array of TDAField;
+ val: Variant;
+ lRowsArray: TROJSONArray;
+ lCurrentRow: TROJSONArray;
+ lProgress: Boolean;
+begin
+ lRowsArray := GetDataArraysByPropName(Source.LogicalName,pn_Dataset_Data_Rows,True);
+
+ Realfldcnt:= Length(ARealFields);
+ BitMaskSize := (Realfldcnt + 7) div 8;
+ SetLength(BitMask, BitMaskSize);
+ SetLength(flds,Realfldcnt);
+ for i := 0 to Realfldcnt-1 do begin
+ if ARealFields[i] = -10 then
+ flds[i]:=nil
+ else
+ flds[i]:=Source.Fields[ARealFields[i]];
+ end;
+ ev1 := Assigned(OnBeforeFieldValueSerialization);
+ ev2 := Assigned(OnWriteFieldValue);
+ ev3 := Assigned(OnWriteFieldValueEx);
+ lProgress := Assigned(onWriteDatasetProgress);
+ // with events
+ while (k <> Maxrecords) and not Source.EOF do begin
+ lCurrentRow := lRowsArray.AddArrayValue.ASArray;
+ for i := 0 to (Realfldcnt - 1) do begin
+ //ARealFields[i] = -10 then this is @SourceTable field
+ if ARealFields[i] = -10 then begin
+ //We shouldn't fire events since this is special internal field
+ val := aDataIndex;
+ end else begin
+ val := Source.FieldValues[ARealFields[i]];
+ if ev1 then OnBeforeFieldValueSerialization(flds[i], val);
+ if ev2 then OnWriteFieldValue(flds[i], val);
+ if ev3 then OnWriteFieldValueEx(Source, flds[i], val);
+ end;
+
+ if VarIsNull(Val) then
+ lCurrentRow.AddNullValue
+ else
+ case flds[i].DataType of
+ datDateTime: lCurrentRow.Add.AsString := DateTimeToSOAPDateTime(val); // DateTime in SOAP format
+ datDecimal: lCurrentRow.Add.AsString := EncodeDecimal(val);
+ datBlob: lCurrentRow.Add.VarValue := EncodeBlob(val); // BLOB as Base64-encoded string
+ else
+ lCurrentRow.Add.VarValue := val;
+ end;
+
+ end;
+ Inc(k);
+ if lProgress then OnWriteDatasetProgress(Self, Source, k, Maxrecords);
+ Source.Next;
+ if Source.EOF then Break;
+ end;
+end;
+
+function TDAJSONDataStreamer.GetDataArraysByPropName(const ADatasetName,
+ AObjectName: JSON_String; const ACreate: Boolean): TROJSONArray;
+var
+ lProp: TROJSONProperty;
+ lobj: TROJSONObject;
+begin
+ Result := nil;
+ lobj := GetDatasetObjectByPropName(ADatasetName,pn_Dataset_Data,ACreate);
+ lProp := lobj.FindItem(AObjectName);
+ if (lProp = nil) then begin
+ if ACreate then
+ lProp := lobj.AddArrayProperty(AObjectName)
+ else
+ Exit;
+ end;
+ Result := lProp.ASArray;
+end;
+
+function TDAJSONDataStreamer.GetDeltaObject(
+ const ADeltaName: JSON_String; const ACreate: Boolean): TROJSONObject;
+begin
+ Result := FDeltas.FindObjectByStringValue(pn_Delta_Name, ADeltaName);
+ if (Result = nil) then begin
+ if ACreate then begin
+ Result := FDeltas.AddObject.AsObject;
+ Result.AddStringProperty(pn_Delta_Name,ADeltaName);
+ end
+ else begin
+ raise EDAException.Create('Cannot find delta '+ADeltaName);
+ end;
+ end;
+end;
+
+function TDAJSONDataStreamer.GetTargetDataType: TRODataType;
+begin
+ Result := rtXML;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAKDBInfo.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAKDBInfo.pas
new file mode 100644
index 0000000..c0f4ef0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAKDBInfo.pas
@@ -0,0 +1,325 @@
+unit uDAKDBInfo;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes,
+ kdbInfo, kdbstruc,
+ uDAInterfaces, uDAClasses;
+
+type
+ TDAKDBConnectionInfo = class(TKDBInfo)
+ private
+ fConnection: IDAConnection;
+ fDatabaseName: string;
+ procedure AddGroupWithFields(aStructure: TKDBStructure; aTable: TDSTable);
+ protected
+ procedure TablesByDatabase(TablesList : TStrings); override;
+ procedure FieldsByTable(const TableName : string; FieldsList : TDBFieldList); override;
+ procedure AvailableDatabases(DBList : TStrings); override; //NEW: replacement for GetDatabaseNames
+ public
+ property Connection: IDAConnection read fConnection write fConnection;
+ property DatabaseName: string read fDatabaseName write fDatabaseName;
+
+ procedure GetSQLValues(SQL : String; AValues,AItems : TStrings); override;
+
+ procedure FillStructure(aStructure: TKDBStructure);
+ end;
+
+ TDAKDBSchemaInfo = class(TKDBInfo)
+ private
+ fSchema: TDASchema;
+ fDatabaseName: string;
+ procedure AddGroupWithFields(aStructure: TKDBStructure; aTable: TDSTable);
+ procedure SetSchema(const Value: TDASchema);
+ protected
+ procedure TablesByDatabase(TablesList : TStrings); override;
+ procedure FieldsByTable(const TableName : string; FieldsList : TDBFieldList); override;
+ procedure AvailableDatabases(DBList : TStrings); override; //NEW: replacement for GetDatabaseNames
+
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ public
+ property Schema: TDASchema read fSchema write SetSchema;
+ property DatabaseName: string read fDatabaseName write fDatabaseName;
+
+ procedure GetSQLValues(SQL : String; AValues,AItems : TStrings); override;
+
+ procedure FillStructure(aStructure: TKDBStructure);
+ end;
+
+implementation
+
+uses
+ uROClasses, sqglobal, SysUtils, Math;
+
+{ TDAKDBConnectionInfo }
+
+procedure TDAKDBConnectionInfo.FieldsByTable(const TableName: string; FieldsList: TDBFieldList);
+var
+ lNewField: TDBFieldInfo;
+ i: Integer;
+ lFields: TDAFieldCollection;
+begin
+ inherited;
+ fConnection.GetTableFields(TableName, lFields);
+ FieldsList.Clear();
+ for i := 0 to lFields.Count-1 do begin
+ lNewField := TDBFieldInfo.Create();
+ lNewField.FieldName := lFields[i].Name;
+ lNewField.FieldSize := lFields[i].Size;
+ lNewField.FieldType := DATypeToVCLType(lFields[i].DataType);
+ FieldsList.Add(lNewField);
+ end; { for }
+end;
+
+
+procedure TDAKDBConnectionInfo.AvailableDatabases(DBList : TStrings);
+ //NEW: previously realization of GetDatabaseNames, name Alist replaced with DBList
+begin
+ inherited;
+ DBList.Clear();
+ DBList.Add(DatabaseName);
+end;
+
+procedure TDAKDBConnectionInfo.GetSQLValues(SQL: String; AValues, AItems: TStrings);
+begin
+ inherited;
+
+end;
+
+procedure TDAKDBConnectionInfo.TablesByDatabase(TablesList: TStrings);
+var
+ lROStrings: IROStrings;
+begin
+ inherited;
+ fConnection.GetTableNames(lROStrings);
+ TablesList.Clear();
+ TablesList.Text := lROStrings.Text;
+end;
+
+
+
+
+
+
+procedure TDAKDBConnectionInfo.AddGroupWithFields(aStructure: TKDBStructure; aTable: TDSTable);
+var
+ G : TDSFieldGroup;
+ //LastRootNode, GroupNode : TTreeNode;
+ I,Idx : integer;
+ TblFields : TStrings;
+begin
+ TblFields := TStringList.Create;
+ try
+ G := TDSFieldGroup.Create(aStructure);
+ G.GroupName := ATable.TableName;
+ aStructure.FieldGroups.Add(G);
+ //FillGroupsCombo;
+
+ {LastRootNode := nil;
+ if not chbRootFirst.Checked then
+ begin
+ for I := tvFields.Items.Count - 1 downto 0 do
+ if tvFields.Items[I].Parent <> nil then
+ begin
+ if I <> tvFields.Items.Count - 1 then
+ LastRootNode := tvFields.Items[I + 1];
+ break;
+ end;
+ end;}
+
+ {if LastRootNode = nil then
+ GroupNode := tvFields.Items.AddObject(nil, G.GroupName, G)
+ else
+ GroupNode := tvFields.Items.InsertObject(LastRootNode, G.GroupName, G);}
+
+// ShowField(tvFields);
+
+ aStructure.DatabaseInfo.GetFieldNamesByTable(aTable.TableName, TblFields);
+
+ for I := 0 to TblFields.Count - 1 do
+ begin
+ Idx := aStructure.AddField(kfkData, TblFields[I], aTable.TableName+'.'+TblFields[I], ATable);
+ aStructure.Fields[Idx].AddAppliedOperators;
+ aStructure.Fields[Idx].Group := G;
+ //AddFieldNodeTo(GroupNode, aStructure.Fields[Idx]);
+ end;
+
+ finally
+ TblFields.Free;
+ end;
+end;
+
+procedure TDAKDBConnectionInfo.FillStructure(aStructure: TKDBStructure);
+var
+ lLink: TDSLink;
+ lFKs: TDADriverForeignKeyCollection;
+ i: Integer;
+ sl: TStringList;
+ lTable: integer;
+begin
+ sl := TStringList.Create();
+ try
+
+ aStructure.ClearStructure();
+ aStructure.AddDefOperators(true);
+
+ GetTableNames(sl);
+ sl.Sort;
+ for i := 0 to (sl.Count-1) do begin
+ lTable := aStructure.AddTable(sl[i],sl[i]);
+ AddGroupWithFields(aStructure, aStructure.Tables[lTable]);
+ end;
+
+ Connection.GetForeignKeys(lFKs);
+ try
+ for i := 0 to lFKs.Count-1 do begin
+ lLink := TDSLink.Create();
+ lLink.Table1 := aStructure.TableByName(0, lFKs[i].FKTable);
+ lLink.Table2 := aStructure.TableByName(0, lFKs[i].PKTable);
+ lLink.Fields1.Text := lFKs[i].FKField;
+ lLink.Fields2.Text := lFKs[i].PKField;
+ aStructure.AddLinkByRef(lLink)
+ end;
+
+ finally
+ FreeAndNil(lFKs);
+ end;
+
+
+ finally
+ sl.Free();
+ end;
+
+end;
+
+{ TDAKDBSchemaInfo }
+
+procedure TDAKDBSchemaInfo.AddGroupWithFields(aStructure: TKDBStructure; aTable: TDSTable);
+begin
+
+end;
+
+procedure TDAKDBSchemaInfo.FieldsByTable(const TableName: string; FieldsList: TDBFieldList);
+var
+ lDataSet: TDADataSet;
+ lNewField: TDBFieldInfo;
+ i: Integer;
+begin
+ inherited;
+
+ lDataSet := Schema.Datasets.FindItem(TableName) as TDADataSet;
+ if not Assigned(lDataSet) then
+ RaiseError('DataSet %s not found in Schema',[TableName]);
+
+ FieldsList.Clear();
+ for i := 0 to lDataSet.Fields.Count-1 do begin
+ lNewField := TDBFieldInfo.Create();
+ lNewField.FieldName := lDataSet.Fields[i].Name;
+ lNewField.FieldSize := lDataSet.Fields[i].Size;
+ lNewField.FieldType := DATypeToVCLType(lDataSet.Fields[i].DataType);
+ FieldsList.Add(lNewField);
+ end; { for }
+end;
+
+procedure TDAKDBSchemaInfo.FillStructure(aStructure: TKDBStructure);
+var
+ lLink: TDSLink;
+ lFK: TDADatasetRelationship;
+ i: Integer;
+ sl: TStringList;
+ lTable: integer;
+begin
+
+ aStructure.ClearStructure();
+ aStructure.AddDefOperators(true);
+
+ sl := TStringList.Create();
+ try
+ GetTableNames(sl);
+ sl.Sort;
+ for i := 0 to (sl.Count-1) do begin
+ lTable := aStructure.AddTable(sl[i],sl[i]);
+ AddGroupWithFields(aStructure, aStructure.Tables[lTable]);
+ end;
+ finally
+ sl.Free();
+ end;
+
+ for i := 0 to Schema.Relationships.Count-1 do begin
+ lLink := TDSLink.Create();
+ lFK := Schema.Relationships[i];
+ lLink.Table1 := aStructure.TableByName(0, lFK.DetailDatasetName);
+ lLink.Table2 := aStructure.TableByName(0, lFK.MasterDatasetName);
+
+ //ToDo: add list
+ //lLink.Fields1.Text := lFK.DetailFields;
+ //lLink.Fields2.Text := lFK.MasterFields;
+ aStructure.AddLinkByRef(lLink)
+ end;
+
+end;
+
+procedure TDAKDBSchemaInfo.AvailableDatabases(DBList : TStrings);
+ //NEW: previously realization of GetDatabaseNames, name Alist replaced with DBList
+begin
+ inherited;
+ DBList.Clear();
+ DBList.Add(DatabaseName);
+end;
+
+procedure TDAKDBSchemaInfo.TablesByDatabase(TablesList: TStrings);
+var
+ i: Integer;
+begin
+ inherited;
+ TablesList.BeginUpdate();
+ try
+ TablesList.Clear();
+ for i := 0 to Schema.Datasets.Count-1 do begin
+ TablesList.Add(Schema.Datasets[i].Name);
+ end; { for }
+ finally
+ TablesList.EndUpdate();
+ end;
+end;
+
+procedure TDAKDBSchemaInfo.GetSQLValues(SQL: String; AValues,
+ AItems: TStrings);
+begin
+ inherited;
+
+end;
+
+procedure TDAKDBSchemaInfo.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited;
+ if Operation <> opRemove then exit;
+ if AComponent = Schema then Schema := nil;
+end;
+
+procedure TDAKDBSchemaInfo.SetSchema(const Value: TDASchema);
+begin
+ if (fSchema <> Value) then begin
+ fSchema := Value;
+ if Assigned(fSchema) then fSchema.FreeNotification(self);
+ end;
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDALocalCommand.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDALocalCommand.pas
new file mode 100644
index 0000000..1820dfc
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDALocalCommand.pas
@@ -0,0 +1,139 @@
+unit uDALocalCommand;
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Lazarus/FPC }
+{ platform: Win32, Unux, Mac }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+uses
+ Classes,
+ uROClient,
+ DataAbstract4_Intf, uDALocalHelpers;
+type
+ { TDARemoteCommand }
+ TDALocalCommand = class(TROComponent)
+ private
+ fServiceInstance: IDataAbstractLocalServiceAccess;
+ fServiceName: string;
+ fServiceInstanceNeedsRelease: Boolean;
+ FSessionID: TGuid;
+ function GetServiceInstance: IDataAbstractLocalServiceAccess;
+ procedure SetServiceInstance(const Value: IDataAbstractLocalServiceAccess);
+ procedure SetServiceName(const Value: String);
+ public
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ function Execute(aCommandName: string): integer; overload;
+ function Execute(aCommandName: string; aInputParameters: DataParameterArray): integer; overload;
+ function Execute(aCommandName: string; aInputParameters: DataParameterArray; out aOutputParameters: DataParameterArray): integer; overload;
+ function Execute(aCommandName: string; aParamNames: array of string; aParamValues: array of variant): integer; overload;
+
+ property ServiceInstance: IDataAbstractLocalServiceAccess read GetServiceInstance write SetServiceInstance;
+ property SessionID: TGuid read FSessionID write fSessionID;
+ published
+ property ServiceName: String read fServiceName write SetServiceName;
+ end;
+
+implementation
+uses
+ uDAEngine;
+{ TDALocalCommand }
+
+procedure TDALocalCommand.Assign(Source: TPersistent);
+var
+ lSource: TDALocalCommand;
+begin
+ inherited;
+ if Source is TDALocalCommand then begin
+ lSource := TDALocalCommand(Source);
+
+ ServiceName := lSource.ServiceName;
+ end;
+end;
+
+destructor TDALocalCommand.Destroy;
+begin
+ ServiceInstance := nil;
+ inherited;
+end;
+
+function TDALocalCommand.Execute(aCommandName: string;
+ aInputParameters: DataParameterArray): integer;
+var
+ lOutputParameters: DataParameterArray;
+begin
+ Result := Self.Execute(aCommandName, aInputParameters, lOutputParameters);
+ lOutputParameters.Free;
+end;
+
+function TDALocalCommand.Execute(aCommandName: string;
+ aParamNames: array of string; aParamValues: array of variant): integer;
+var
+ i, idx: Integer;
+ lInputParameters: DataParameterArray;
+begin
+ lInputParameters := DataParameterArray.Create();
+ if (High(aParamNames) <> High(aParamValues)) then
+ raise EDAException.Create(Self.Name+': Error in parameters. Count of parameter values doesn''t correspond to count of parameters');
+
+ for i := Low(aParamNames) to High(aParamNames) do begin
+ idx := lInputParameters.Add(DataParameter.Create());
+ lInputParameters[idx].Name := UTF8Encode(aParamNames[i]);
+ lInputParameters[idx].Value := aParamValues[i];
+ end;
+ try
+ result := Self.Execute(aCommandName, lInputParameters);
+ finally
+ lInputParameters.Free;
+ end;
+end;
+
+function TDALocalCommand.Execute(aCommandName: string): integer;
+begin
+ Result := Execute(aCommandName,[],[]);
+end;
+
+function TDALocalCommand.Execute(aCommandName: string;
+ aInputParameters: DataParameterArray;
+ out aOutputParameters: DataParameterArray): integer;
+begin
+ Result := ServiceInstance.ExecuteCommandEx(aCommandName, aInputParameters, aOutputParameters);
+end;
+
+function TDALocalCommand.GetServiceInstance: IDataAbstractLocalServiceAccess;
+begin
+ if fServiceInstance <> nil then begin
+ Result := fServiceInstance;
+ Exit;
+ end;
+ result:= LocalServiceAccessHelper_Acquire(SessionID, ServiceName);
+ fServiceInstanceNeedsRelease := true;
+end;
+
+procedure TDALocalCommand.SetServiceInstance(
+ const Value: IDataAbstractLocalServiceAccess);
+begin
+ if Value <> fServiceInstance then begin
+ if (fServiceInstanceNeedsRelease) and (fServiceInstance <> nil) then begin
+ LocalServiceAccessHelper_Release(SessionID, ServiceName, fServiceInstance);
+ end;
+ fServiceInstance := value;
+ fServiceInstanceNeedsRelease := false;
+ end;
+end;
+
+procedure TDALocalCommand.SetServiceName(const Value: String);
+begin
+ fServiceName := Value;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDALocalDataAdapter.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDALocalDataAdapter.pas
new file mode 100644
index 0000000..9308331
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDALocalDataAdapter.pas
@@ -0,0 +1,794 @@
+unit uDALocalDataAdapter;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF}
+ SysUtils, Classes,
+ uROTypes, uROClasses,
+ uDAInterfaces, DataAbstract4_Intf, uDADelta, uDADataTable,
+ uDADataStreamer, uDADataAdapter, uDAClasses, uDALocalHelpers;
+
+type
+ TDALocalDataAdapter = class;
+
+ TDALDADatasetOperation = procedure(DataStreamer: TDALocalDataAdapter; const Datasetname: string; const Dataset: IDADataset) of object;
+ TDALDADataStreamerReadDatasetProgress = procedure(Sender: TDALocalDataAdapter; const aDataset: IDADataset; const aCurrent, aTotal: Integer) of object;
+ TDALDADataStreamerWriteDatasetProgress = procedure(Sender: TDALocalDataAdapter; const aDataset: IDADataset; const aCurrent, aMaxRecords: Integer) of object;
+
+
+ { TDALocalDataAdapter }
+ TDALocalDataAdapter = class(TDABaseDataAdapter)
+ private
+ fServiceInstance: IDataAbstractLocalServiceAccess;
+ fServiceName: string;
+ fServiceInstanceNeedsRelease: Boolean;
+ FSessionID: TGuid;
+ fOnBeforeFieldValueSerialization: TDAReadWriteFieldValue;
+ fOnReadFieldValue: TDAReadWriteFieldValue;
+ fOnWriteDataset: TDALDADatasetOperation;
+ fOnWriteFieldValueEx: TDAReadWriteFieldValueEx;
+ fOnWriteFieldValue: TDAReadWriteFieldValue;
+ fOnReadDatasetProgress: TDALDADataStreamerReadDatasetProgress;
+ fOnWriteDatasetProgress: TDALDADataStreamerWriteDatasetProgress;
+ function GetServiceInstance: IDataAbstractLocalServiceAccess;
+ procedure SetServiceInstance(value: IDataAbstractLocalServiceAccess);
+ procedure SetServiceName(value: string);
+ // stub for events
+ procedure DoWriteDataset(DataStreamer: TDADataStreamer; const Datasetname: string; const Dataset: IDADataset);
+ procedure DoReadDatasetProgress(Sender: TDADataStreamer; const aDataset: IDADataset; const aCurrent, aTotal: Integer);
+ procedure DoWriteDatasetProgress(Sender: TDADataStreamer; const aDataset: IDADataset; const aCurrent, aMaxRecords: Integer);
+ procedure AssignEvents(aDataStreamer: TDADataStreamer);
+ protected
+ function InternalFillSchema(var aStream: TROBinaryMemoryStream): TRODataType; override;
+ function InternalFillScripts(aTables: array of TDADataTable): UTF8String; override;
+ procedure InternalApplyUpdates(aTables, aTablesWithDetails: array of TDADataTable); override;
+ function InternalReadSchema: UTF8String; override;
+ procedure InternalFill(aTableArray: array of TDADataTable; aArray: TableRequestInfoArray; const aIncludeSchema, aAppendMode: boolean; aSavedOptions: TDATableOptionsArray);override;
+ public
+ destructor Destroy; override;
+ property ServiceInstance: IDataAbstractLocalServiceAccess read GetServiceInstance write SetServiceInstance;
+ property SessionID: TGuid read FSessionID write fSessionID;
+ published
+ property ServiceName: String read fServiceName write SetServiceName;
+
+ property OnStreamerWriteDataset: TDALDADatasetOperation read fOnWriteDataset write fOnWriteDataset;
+ property OnStreamerReadFieldValue: TDAReadWriteFieldValue read fOnReadFieldValue write fOnReadFieldValue;
+ property OnStreamerWriteFieldValue: TDAReadWriteFieldValue read fOnWriteFieldValue write fOnWriteFieldValue;
+ property OnStreamerWriteFieldValueEx: TDAReadWriteFieldValueEx read fOnWriteFieldValueEx write fOnWriteFieldValueEx;
+ property OnStreamerBeforeFieldValueSerialization: TDAReadWriteFieldValue read fOnBeforeFieldValueSerialization write fOnBeforeFieldValueSerialization;
+ property OnStreamerReadDatasetProgress: TDALDADataStreamerReadDatasetProgress read fOnReadDatasetProgress write fOnReadDatasetProgress;
+ property OnStreamerWriteDatasetProgress: TDALDADataStreamerWriteDatasetProgress read fOnWriteDatasetProgress write fOnWriteDatasetProgress;
+ end;
+
+
+implementation
+uses
+ Variants, DB,FMTBcd,
+ uROBinaryHelpers,
+ uDAEngine;
+
+const
+ TDADataTypeStrings: array[Low(TDADataType)..High(TDADataType)] of AnsiString =
+ ('datUnknown', 'datString', 'datDateTime', 'datFloat',
+ 'datCurrency', 'datAutoInc', 'datInteger', 'datLargeInt',
+ 'datBoolean', 'datMemo', 'datBlob', 'datWideString',
+ 'datWideMemo', 'datLargeAutoInc', 'datByte', 'datShortInt',
+ 'datWord', 'datSmallInt', 'datCardinal', 'datLargeUInt',
+ 'datGuid', 'datXml', 'datDecimal', 'datSingleFloat');
+type
+ TDASmallFieldInfo = record
+ Name: String;
+ Datatype: TDADataType;
+ Size: integer;
+ end;
+
+ TDADataForAppendBin2 = class(TDADataForAppend)
+ public
+ FieldsInfo: array of TDASmallFieldInfo;
+ CurrentDataTable : TDADataTable;
+ readonlyfields: array of boolean;
+
+ DestRealFields: array of integer;
+ Destflds: TDAFieldArray;
+
+ IncludeSchema: Boolean;
+ // for append mode
+ CurrentAppendMode: Boolean;
+ lPK: string;
+ lPKValues: array of variant;
+ lOnePK:Boolean;
+ lPKFlds: TDAFieldArray; // PK flds (Append mode)
+ lFldValues: array of Variant; // flds values for append mode
+
+ // MemDatasetBatchAdding
+ lBatchAdding: IDAMemDatasetBatchAdding;
+ lBatchAddingList: TList;
+ end;
+
+ TDALocalDataStreamer = class(TDADataStreamer)
+ private
+ fTables: array of TDADataTable;
+ fAppendMode: array of boolean;
+ fIncludeSchema: array of boolean;
+ protected
+ procedure DoReadDelta(const DeltaName: string; const Destination: IDADelta); override;
+ procedure DoWriteDelta(const Source: IDADelta); override;
+ procedure DoReadDataset(const DatasetName: string; const Destination: IDADataset; ApplySchema: boolean; AppendMode: Boolean); override;
+ function DoWriteDataset(const Source: IDADataset; Options: TDAWriteOptions; MaxRows: integer; ADynFieldNames: array of string): integer; override;
+ function DoBeginWriteDataset( const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend; override;
+ function DoWriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aDataIndex: Integer = -1): Integer; override;
+ function DoEndWriteDataset(aDataForAppend: TDADataForAppend): Integer; override;
+ procedure InternalDoWriteDataset(const Source: IDADataset; aDataIndex: Integer; aDataForAppend: TDADataForAppendBin2);
+ procedure DoInitialize(Mode: TDAAdapterInitialization); override;
+ procedure DoFinalize; override;
+ function DoCreateStream: TStream; override;
+ public
+ constructor Create(aOwner: TComponent; aTables: array of TDADataTable; aSavedOptions: TDATableOptionsArray; aArray: TableRequestInfoArray); reintroduce;
+ destructor Destroy; override;
+ function GetTargetDataType: TRODataType; override;
+ end;
+
+{ TDALocalDataAdapter }
+
+
+procedure TDALocalDataAdapter.AssignEvents(aDataStreamer: TDADataStreamer);
+begin
+ aDataStreamer.OnBeforeFieldValueSerialization := fOnBeforeFieldValueSerialization;
+ aDataStreamer.OnReadFieldValue := fOnReadFieldValue;
+ aDataStreamer.OnWriteFieldValue := fOnWriteFieldValue;
+ aDataStreamer.OnWriteFieldValueEx := fOnWriteFieldValueEx;
+ if Assigned(fOnWriteDataset) then aDataStreamer.OnWriteDataset := DoWriteDataset;
+ if Assigned(fOnReadDatasetProgress) then aDataStreamer.OnReadDatasetProgress := DoReadDatasetProgress;
+ if Assigned(fOnWriteDatasetProgress) then aDataStreamer.OnWriteDatasetProgress := DoWriteDatasetProgress;
+end;
+
+destructor TDALocalDataAdapter.Destroy;
+begin
+ ServiceInstance := nil;
+ inherited;
+end;
+
+procedure TDALocalDataAdapter.DoReadDatasetProgress(Sender: TDADataStreamer;
+ const aDataset: IDADataset; const aCurrent, aTotal: Integer);
+begin
+ if Assigned(fOnReadDatasetProgress) then fOnReadDatasetProgress(Self,aDataset, aCurrent, aTotal);
+end;
+
+procedure TDALocalDataAdapter.DoWriteDataset(DataStreamer: TDADataStreamer;
+ const Datasetname: string; const Dataset: IDADataset);
+begin
+ if Assigned(fOnWriteDataset) then fOnWriteDataset(Self, Datasetname, Dataset);
+end;
+
+procedure TDALocalDataAdapter.DoWriteDatasetProgress(Sender: TDADataStreamer;
+ const aDataset: IDADataset; const aCurrent, aMaxRecords: Integer);
+begin
+ if Assigned(fOnWriteDatasetProgress) then fOnWriteDatasetProgress(Self,aDataset, aCurrent, aMaxRecords);
+end;
+
+function TDALocalDataAdapter.GetServiceInstance: IDataAbstractLocalServiceAccess;
+begin
+ if fServiceInstance <> nil then begin
+ Result := fServiceInstance;
+ Exit;
+ end;
+ if csDesigning in ComponentState then
+ if ServiceName = '' then raise Exception.Create('For data adapter ServiceName must be set.')
+ else raise Exception.Create('Service "' + ServiceName + '" for data adapter isn''t found.');
+ result:= LocalServiceAccessHelper_Acquire(SessionID, ServiceName);
+ fServiceInstanceNeedsRelease := true;
+end;
+
+procedure TDALocalDataAdapter.InternalApplyUpdates(aTables,aTablesWithDetails: array of TDADataTable);
+var
+ aList: IDeltaArray;
+ i: integer;
+begin
+ SetLength(aList, Length(aTablesWithDetails));
+ try
+ for I := 0 to Length(aTablesWithDetails) - 1 do
+ aList[i] := aTablesWithDetails[i].Delta;
+ ServiceInstance.UpdateData(aList);
+ finally
+ SetLength(aList, 0);
+ end;
+end;
+
+procedure TDALocalDataAdapter.InternalFill(aTableArray: array of TDADataTable;
+ aArray: TableRequestInfoArray; const aIncludeSchema, aAppendMode: boolean;
+ aSavedOptions: TDATableOptionsArray);
+var
+ lArray : StringArray;
+ i: integer;
+ lDataStreamer :TDALocalDataStreamer;
+begin
+ lDataStreamer := TDALocalDataStreamer.Create(Self, aTableArray, aSavedOptions,aArray);
+ lArray := StringArray.Create();
+ try
+ AssignEvents(lDataStreamer);
+ lArray.Resize(Length(aTableArray));
+ for i := Low(aTableArray) to High(aTableArray) do
+ lArray[i-Low(aTableArray)] := UTF8Encode(aTableArray[i].LogicalName);
+ ServiceInstance.GetData(lArray, aArray, lDataStreamer);
+ finally
+ lArray.Free;
+ lDataStreamer.Free;
+ end;
+end;
+
+function TDALocalDataAdapter.InternalFillSchema(var aStream: TROBinaryMemoryStream): TRODataType;
+begin
+ Result := rtString;
+ Schema;
+end;
+
+function TDALocalDataAdapter.InternalFillScripts(
+ aTables: array of TDADataTable): UTF8String;
+begin
+ Result := ServiceInstance.GetDatasetScripts(GetTableNamesAsCommaText(aTables));
+end;
+
+function TDALocalDataAdapter.InternalReadSchema: UTF8String;
+begin
+ Result := ServiceInstance.GetSchema('');
+end;
+
+procedure TDALocalDataAdapter.SetServiceInstance(
+ Value: IDataAbstractLocalServiceAccess);
+begin
+ if Value <> fServiceInstance then begin
+ if (fServiceInstanceNeedsRelease) and (fServiceInstance <> nil) then begin
+ LocalServiceAccessHelper_Release(SessionID, ServiceName, fServiceInstance);
+ end;
+ fServiceInstance := value;
+ fServiceInstanceNeedsRelease := false;
+ end;
+end;
+
+procedure TDALocalDataAdapter.SetServiceName(value: string);
+begin
+ ServiceInstance := nil;
+ fServiceName := value;
+end;
+
+constructor TDALocalDataStreamer.Create(aOwner: TComponent; aTables: array of TDADataTable; aSavedOptions: TDATableOptionsArray; aArray: TableRequestInfoArray);
+var
+ i: integer;
+begin
+ inherited Create(aOwner);
+ SetLength(fTables, Length(aTables));
+ SetLength(fAppendMode, Length(aTables));
+ SetLength(fIncludeSchema, Length(aTables));
+ for I := 0 to Length(aTables) - 1 do begin
+ fTables[i] := aTables[i];
+ fAppendMode[i] := aSavedOptions[i].AppendMode;
+ fIncludeSchema[i]:= aArray[i].IncludeSchema;
+ end;
+ AdapterInitialization := aiWrite;
+end;
+
+destructor TDALocalDataStreamer.Destroy;
+begin
+ SetLength(fTables, 0);
+ inherited;
+end;
+
+function TDALocalDataStreamer.DoBeginWriteDataset(const Source: IDADataset;
+ const Schema: TDADataset; Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend;
+var
+ k, i, Realfldcnt: integer;
+ fld: TDAField;
+// RealFields: array of integer;
+ lfields: array of integer;
+ lDataForAppend : TDADataForAppendBin2;
+ lSchemaFields: TDAFieldCollection;
+ lLogicalName: String;
+ lFldList:TStringList;
+ lErrorMessage: String;
+ lErrorMesCnt: integer;
+ lCurrTable: TDADataTable;
+ FTableInitializedFromSource: Boolean;
+begin
+ lDataForAppend := TDADataForAppendBin2.Create();
+
+ try
+ if Assigned(Schema) then begin
+ lDataForAppend.TableSchema := Schema;
+ if Schema is TDAUnionDataTable then begin
+ fld := Schema.FindField(def_SourceTableFieldName);
+ if not Assigned(fld) then begin
+ fld := Schema.Fields.Add();
+ fld.Name := def_SourceTableFieldName;
+ fld.DataType := datInteger;
+ fld.InPrimaryKey := true;
+ fld.ServerAutoRefresh := true;
+ end;
+ end;
+ lSchemaFields := Schema.Fields;
+ lLogicalName := Schema.Name;
+ end else begin
+ if Assigned(Source) then begin
+ lSchemaFields := Source.Fields;
+ lLogicalName := Source.LogicalName;
+ end else begin
+ raise EDAException.Create('Schema or source should be assigned.');
+ end;
+ end;
+
+ if Length(ADynFieldNames) > 0 then begin
+ SetLength(lfields, Length(ADynFieldNames));
+ For i:=0 to High(ADynFieldNames) do begin
+ fld := lSchemaFields.FindField(ADynFieldNames[i]);
+ if fld <> nil then
+ lfields[i]:= fld.Index
+ else
+ lfields[i]:= -1; // TODO: shoudln't this raise an exception "field not found", or the like?
+ end;
+ end else begin
+ SetLength(lfields, lSchemaFields.Count);
+ For i:=0 to lSchemaFields.Count-1 do
+ lfields[i]:=i;
+ end;
+
+ SetLength(lDataForAppend.FieldsInfo, lSchemaFields.Count);
+ SetLength(lDataForAppend.RealFields, lSchemaFields.Count);
+ SetLength(lDataForAppend.DestRealFields, lSchemaFields.Count);
+ Realfldcnt := 0;
+ for i := 0 to High(lfields) do begin
+ if lSchemaFields[lfields[i]].Calculated or lSchemaFields[lfields[i]].Lookup then Continue;
+ lDataForAppend.RealFields[Realfldcnt] := lfields[i];
+ lDataForAppend.DestRealFields[Realfldcnt] := lfields[i]; // by default = RealFields
+ lDataForAppend.FieldsInfo[Realfldcnt].Name := lSchemaFields[lfields[i]].Name;
+ lDataForAppend.FieldsInfo[Realfldcnt].Datatype := lSchemaFields[lfields[i]].DataType;
+ lDataForAppend.FieldsInfo[Realfldcnt].Size := lSchemaFields[lfields[i]].Size;
+ inc(Realfldcnt);
+ end;
+ SetLength(lDataForAppend.FieldsInfo, Realfldcnt);
+ SetLength(lDataForAppend.RealFields, Realfldcnt);
+ SetLength(lDataForAppend.DestRealFields, Realfldcnt);
+ lDataForAppend.MaxRowCount := MaxRows;
+
+ k := 0;
+ lDataForAppend.RecordCount := k;
+ lCurrTable := nil;
+ // detect DataTable
+ for I := 0 to Length(fTables) - 1 do
+ if AnsiSameText(lLogicalName,fTables[i].LogicalName) then begin
+ lCurrTable :=fTables[i];
+ lDataForAppend.IncludeSchema := fIncludeSchema[i];
+ lDataForAppend.CurrentAppendMode:= fAppendMode[i] and lCurrTable.Active and not (lCurrTable.EOF and lCurrTable.BOF);;
+ Break;
+ end;
+
+ if lCurrTable = nil then raise EDAException.CreateFmt('LDA: Destination data table not found.: %s',[lLogicalName]);
+ FTableInitializedFromSource := lDataForAppend.IncludeSchema and not (soIgnoreStreamSchema in lCurrTable.StreamingOptions);
+ if FTableInitializedFromSource then begin
+ lDataForAppend.CurrentAppendMode := False;
+ lCurrTable.Close;
+ lCurrTable.Fields.AssignFieldCollection(lSchemaFields);
+ end;
+ if not lCurrTable.Active then lCurrTable.InitializeDataTable;
+
+ if TDALocalDataAdapter(Owner).AutoFillScripts then TDALocalDataAdapter(Owner).FillScripts([lCurrTable]);
+
+ if not FTableInitializedFromSource then begin
+ lErrorMessage := '';
+ lErrorMesCnt := 0;
+ // checking schema with table schema
+
+ // step 1
+ lFldList:=TStringList.Create;
+ try
+ lFldList.Sorted:=False;
+ lFldList.Duplicates:=dupIgnore;
+ For i:= 0 to lCurrTable.Fields.Count-1 do
+ lFldList.AddObject(lCurrTable.Fields[i].Name,Pointer(lCurrTable.Fields[i].Index));
+ lFldList.Sorted:=True;
+
+ for i := 0 to Realfldcnt - 1 do begin
+ k:=lFldList.IndexOf(lDataForAppend.FieldsInfo[i].Name);
+ if k = -1 then begin
+ inc(lErrorMesCnt);
+ if lErrorMesCnt > 5 then begin
+ lErrorMessage := lErrorMessage + '' + sLineBreak;
+ break;
+ end
+ else begin
+ lErrorMessage := lErrorMessage + Format('The %s field isn''t found.' + sLineBreak,[lDataForAppend.FieldsInfo[i].Name])
+ end;
+ end
+ else begin
+ lDataForAppend.DestRealFields[i]:= Integer(lFldList.Objects[k]);
+ end;
+ end;
+ finally
+ lFldList.Free;
+ end;
+ // step 2
+ if (Length(lErrorMessage) = 0) then begin
+ k := 0;
+ for i := 0 to (lCurrTable.Fields.Count - 1) do begin
+ if lCurrTable.Fields[i].Calculated or lCurrTable.Fields[i].Lookup then Continue;
+ if (k >= Realfldcnt) then begin
+ lErrorMessage := lErrorMessage + 'Fields count mismatch' + sLineBreak
+ end
+ else begin
+ fld:=lCurrTable.Fields[lDataForAppend.DestRealFields[k]];
+ // if (fld.Name <> Info[k].Name) then lErrorMessage := lErrorMessage + Format('Name mismatch: %s expected but %s found in stream.', [fld.Name, Info[k].Name])+ sLineBreak
+ if (fld.DataType <> lDataForAppend.FieldsInfo[k].Datatype) then
+ lErrorMessage := lErrorMessage + Format('Data type mismatch for column ''%s.%s'': %s expected but %s found in source.',
+ [lLogicalName, fld.Name, TDADataTypeStrings[fld.DataType], TDADataTypeStrings[lDataForAppend.FieldsInfo[k].Datatype]])+ sLineBreak
+ else if (fld.Size <> lDataForAppend.FieldsInfo[k].Size) then
+ lErrorMessage := lErrorMessage + Format('Size mismatch for column ''%s.%s'': %d expected but %d found in source.',
+ [lLogicalName, fld.Name, fld.Size, lDataForAppend.FieldsInfo[k].Size]) + sLineBreak;
+ end;
+ inc(k);
+ end;
+ if (k <> Realfldcnt) then lErrorMessage := lErrorMessage + Format('Fields count mismatch: %d expected but %d found in the stream', [k, Realfldcnt]) + sLineBreak;
+ end;
+ if (Length(lErrorMessage) > 0) then begin
+ lErrorMessage := 'Format of the data of source doesn''t match the destination table format.'+ sLineBreak + sLineBreak + lErrorMessage;
+ RaiseError(lErrorMessage);
+ end;
+ end;
+ except
+ lDataForAppend.Free;
+ raise;
+ end;
+
+ setLength(lDataForAppend.Destflds, Realfldcnt);
+ For i:= 0 to Realfldcnt-1 do
+ lDataForAppend.Destflds[i] := lCurrTable.Fields[lDataForAppend.DestRealFields[i]];
+
+ lDataForAppend.lPK := Dataset_GetPK(lDataForAppend.Destflds, lDataForAppend.lPKFlds);
+ lDataForAppend.lOnePK := Length(lDataForAppend.lPKFlds) = 1;
+ lDataForAppend.CurrentAppendMode := lDataForAppend.CurrentAppendMode and (Length(lDataForAppend.lPKFlds)>0);
+ if lDataForAppend.CurrentAppendMode then begin
+ SetLength(lDataForAppend.lFldValues, Length(lDataForAppend.Destflds));
+ SetLength(lDataForAppend.lPKValues, Length(lDataForAppend.lPKFlds));
+ end;
+
+
+ lDataForAppend.CurrentDataTable := lCurrTable;
+ lDataForAppend.CurrentDataTable.DisableControls;
+
+ if not Supports(lCurrTable,IDAMemDatasetBatchAdding, lDataForAppend.lBatchAdding) then begin
+ lDataForAppend.lBatchAdding := nil
+ end
+ else begin
+ lDataForAppend.lBatchAddingList := TList.Create;
+ end;
+
+ SetLength(lDataForAppend.readonlyfields, lCurrTable.Fields.Count);
+ // reset Fields[i].ReadOnly
+ for i := 0 to (lCurrTable.Fields.Count - 1) do begin
+ lDataForAppend.readonlyfields[i] := lCurrTable.Fields[i].ReadOnly;
+ lCurrTable.Fields[i].ReadOnly := FALSE;
+ end;
+ result := lDataForAppend;
+end;
+
+function TDALocalDataStreamer.DoCreateStream: TStream;
+begin
+ // outdated, for backward capability
+ Result := nil;
+end;
+
+function TDALocalDataStreamer.DoEndWriteDataset(
+ aDataForAppend: TDADataForAppend): Integer;
+var
+ i: integer;
+ lData : TDADataForAppendBin2;
+begin
+ lData := TDADataForAppendBin2(aDataForAppend);
+
+ if (lData.lBatchAdding <> nil) and (lData.lBatchAddingList.Count <> 0) then begin
+ lData.lBatchAdding.AddRecordsfromList(lData.lBatchAddingList,lData.CurrentAppendMode);
+ end;
+
+ // restore ReadOnly
+ for i := 0 to (lData.CurrentDataTable.Fields.Count - 1) do
+ lData.CurrentDataTable.Fields[i].ReadOnly := lData.readonlyfields[i];
+ // enable controls
+ lData.CurrentDataTable.EnableControls;
+ Result:= aDataForAppend.RecordCount;
+ lData.lBatchAddingList.Free;
+ aDataForAppend.Free();
+end;
+
+procedure TDALocalDataStreamer.DoFinalize;
+begin
+ // empty
+end;
+
+procedure TDALocalDataStreamer.DoInitialize(Mode: TDAAdapterInitialization);
+begin
+ // empty
+end;
+
+procedure TDALocalDataStreamer.DoReadDataset(const DatasetName: string;
+ const Destination: IDADataset; ApplySchema, AppendMode: Boolean);
+begin
+ NotSupported;
+end;
+
+procedure TDALocalDataStreamer.DoReadDelta(const DeltaName: string;
+ const Destination: IDADelta);
+begin
+ NotSupported;
+end;
+
+function TDALocalDataStreamer.DoWriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): integer;
+var
+ lData : TDADataForAppend;
+begin
+ lData := DoBeginWriteDataset(Source, nil,Options, MaxRows, ADynFieldNames);
+ try
+ DoWriteDatasetData(Source, lData, -1);
+ finally
+ Result := DoEndWriteDataset(lData);
+ end;
+end;
+
+function TDALocalDataStreamer.DoWriteDatasetData(const Source: IDADataset;
+ var aDataForAppend: TDADataForAppend; aDataIndex: Integer): Integer;
+var
+ i, Realfldcnt: integer;
+ lDataForAppend: TDADataForAppendBin2;
+ lMapToFieldName: String;
+ lColumnMappings: TDAColumnMappingCollection;
+ lColumnMapping: TDAColumnMapping;
+begin
+ lDataForAppend := TDADataForAppendBin2(aDataForAppend);
+ Realfldcnt := Length(lDataForAppend.RealFields);
+
+ // Mapping fields of Source table to the streamed dataset
+ if Assigned(lDataForAppend.TableSchema) and (lDataForAppend.TableSchema is TDAUnionDataTable) then begin
+ lColumnMappings := TDAUnionSourceTable(TDAUnionDataTable(lDataForAppend.TableSchema).SourceTables.ItemByName(Source.Name)).ColumnMappings;
+ for i := 0 to Realfldcnt - 1 do begin
+ if lDataForAppend.FieldsInfo[i].Name = def_SourceTableFieldName then begin
+ lDataForAppend.RealFields[i] := -10;
+ continue;
+ end;
+ lMapToFieldName := lDataForAppend.FieldsInfo[i].Name;
+ if Assigned(lColumnMappings) then begin
+ lColumnMapping := lColumnMappings.MappingByDatasetField(lDataForAppend.FieldsInfo[i].Name);
+ if Assigned(lColumnMapping) and (lColumnMapping.TableField <> '') then
+ lMapToFieldName := lColumnMapping.TableField;
+ end;
+ lDataForAppend.RealFields[i] := Source.FieldByName(lMapToFieldName).Index;
+ end;
+ end;
+
+ with Source do try
+ DisableControls;
+
+ if not Source.Active then Source.Open;
+ try
+ InternalDoWriteDataset(Source, aDataIndex, lDataForAppend);
+ except
+ raise;
+ end;
+
+ finally
+ EnableControls;
+ result := lDataForAppend.RecordCount ;
+ end;
+end;
+
+procedure TDALocalDataStreamer.DoWriteDelta(const Source: IDADelta);
+begin
+ NotSupported;
+end;
+
+function TDALocalDataStreamer.GetTargetDataType: TRODataType;
+begin
+ Result := rtBinary;
+end;
+
+procedure TDALocalDataStreamer.InternalDoWriteDataset(
+ const Source: IDADataset;
+ aDataIndex: Integer;
+ aDataForAppend: TDADataForAppendBin2);
+
+ function Dataset_Locate(): boolean;
+ begin
+ if aDataForAppend.lOnePK then
+ Result:= aDataForAppend.CurrentDataTable.Locate(aDataForAppend.lPK,aDataForAppend.lPKValues[0],[])
+ else
+ Result:= aDataForAppend.CurrentDataTable.Locate(aDataForAppend.lPK,aDataForAppend.lPKValues,[]);
+ end;
+
+var
+ ev1, ev2, ev3, ev4: boolean;
+ Realfldcnt: integer;
+ Sourceflds: array of TDAField;
+ val: array of Variant;
+
+ procedure GetSourceValues;
+ var
+ i: integer;
+ begin
+ for i := 0 to (Realfldcnt - 1) do begin
+ //ARealFields[i] = -10 then this is @SourceTable field
+ if aDataForAppend.RealFields[i] = -10 then begin
+ //We shouldn't fire events since this is special internal field
+ val[i] := aDataIndex;
+ end else begin
+ val[i] := Source.FieldValues[aDataForAppend.RealFields[i]];
+ if ev1 then OnBeforeFieldValueSerialization(Sourceflds[i], val[i]);
+ if ev2 then OnWriteFieldValue(Sourceflds[i], val[i]);
+ if ev3 then OnWriteFieldValueEx(Source,Sourceflds[i], val[i]);
+ end;
+ end;
+ end;
+
+ procedure SetDestValues_StdMode;
+ var
+ i: integer;
+ begin
+ aDataForAppend.CurrentDataTable.Append;
+ for i := 0 to Realfldcnt - 1 do begin
+ if ev4 then OnReadFieldValue(aDataForAppend.Destflds[i], val[i]);
+ aDataForAppend.Destflds[i].Value := val[i];
+ end;
+ if aDataForAppend.CurrentAppendMode then begin
+ // store values and avoid firing OnReadFieldValue event
+ for i := 0 to Length(aDataForAppend.Destflds) - 1 do
+ aDataForAppend.lFldValues[i]:= aDataForAppend.Destflds[i].Value;
+ // store PK values for locate
+ for I := 0 to Length(aDataForAppend.lPKFlds) - 1 do
+ aDataForAppend.lPKValues[i]:= aDataForAppend.lPKFlds[i].Value;
+
+ aDataForAppend.CurrentDataTable.Cancel;
+ if Dataset_Locate then
+ aDataForAppend.CurrentDataTable.Edit
+ else
+ aDataForAppend.CurrentDataTable.Append;
+ // assign new values
+ for i := 0 to Length(aDataForAppend.Destflds) - 1 do
+ aDataForAppend.Destflds[i].Value := aDataForAppend.lFldValues[i];
+ end;
+
+ try
+ aDataForAppend.CurrentDataTable.Post;
+ except
+ // Introduced to restore the dsBrowse state of the datatable
+ // in case of errors
+ aDataForAppend.CurrentDataTable.Cancel;
+ raise;
+ end;
+ end;
+
+ procedure SetDestValues_BatchMode;
+ type
+ PMemDatasetrecord_Native = ^TMemDatasetrecord_Native;
+ TMemDatasetrecord_Native = packed record
+ Ident: byte;
+ Data: PAnsichar;
+ end;
+
+ var
+ i: integer;
+ buf, buf1: PAnsiChar;
+ s: AnsiString;
+ begin
+ buf:= aDataForAppend.lBatchAdding.AllocRecordBuffer;
+ try
+ for i := 0 to Length(aDataForAppend.Destflds) - 1 do begin
+ if aDataForAppend.Destflds[i].Calculated or aDataForAppend.Destflds[i].Lookup then Continue;
+ if ev4 then OnReadFieldValue(aDataForAppend.Destflds[i], val[i]);
+ if VarIsNull(Val[i]) then
+ aDataForAppend.lBatchAdding.SetNullMask(PMemDatasetrecord_Native(buf)^.Data,aDataForAppend.Destflds[i].BindedField, True)
+ else begin
+ aDataForAppend.lBatchAdding.SetNullMask(PMemDatasetrecord_Native(buf)^.Data,aDataForAppend.Destflds[i].BindedField, False);
+ buf1:= aDataForAppend.lBatchAdding.GetFieldNativeBuffer(buf,aDataForAppend.Destflds[i].BindedField);
+ case aDataForAppend.Destflds[i].DataType of
+ datUnknown: ;
+ datWideString: aDataForAppend.lBatchAdding.SetWideString(buf1,aDataForAppend.Destflds[i].BindedField,{$IFDEF UNICODE}VarToStr{$ELSE}VarToWideStr{$ENDIF}(Val[i]));
+ datString: aDataForAppend.lBatchAdding.SetAnsiString(buf1,aDataForAppend.Destflds[i].BindedField,VarToAnsiStr(val[i]));
+ datCurrency: PCurrency(buf1)^ := Currency(Val[i]);
+ datDateTime: PDateTime(buf1)^ := TimeStampToMSecs(DateTimeToTimeStamp(VarToDateTime(Val[i])));
+ datFloat: PDouble(buf1)^ := Double(Val[i]);
+ datLargeInt, datLargeAutoInc, datLargeUInt: PInt64(buf1)^ := Val[i];
+ datBoolean: System.PBoolean(buf1)^ := Boolean(Val[i]);
+ datAutoInc,
+ datInteger: PInteger(buf1)^ := integer(Val[i]);
+ datSingleFloat: PDouble(buf1)^ := Double(Val[i]);
+ datDecimal: PBCD(buf1)^ := VariantToBCD(val[i]);
+ datCardinal: PCardinal(buf1)^ := Cardinal(Val[i]);
+ datByte: PSmallInt(buf1)^ := Byte(Val[i]);
+ datWord: PWord(buf1)^ := Word(Val[i]);
+ datShortInt: PSmallInt(buf1)^ := ShortInt(Val[i]);
+ datSmallInt: PSmallInt(buf1)^ := SmallInt(Val[i]);
+ datGuid: begin
+ s:= VarToAnsiStr(val[i]);
+ Move(pointer(s)^, pointer(buf1)^, 38 {Length(GuidString)});
+ end;
+ datBlob,
+ datMemo,
+ datWideMemo,
+ datXml: PPointer(buf1)^ := aDataForAppend.lBatchAdding.MakeBlobFromString(VariantToAnsiString(Val[i]));
+ end;
+ end;
+ end;
+ aDataForAppend.lBatchAddingList.Add(Buf);
+ except
+ aDataForAppend.lBatchAdding.FreeRecordBuffer(buf);
+ For i:=0 to aDataForAppend.lBatchAddingList.Count-1 do begin
+ buf:=aDataForAppend.lBatchAddingList[i];
+ aDataForAppend.lBatchAdding.FreeRecordBuffer(Buf);
+ end;
+ aDataForAppend.lBatchAddingList.Clear;
+ raise;
+ end;
+ end;
+
+
+var
+ i : integer;
+{$IFDEF LDADEBUG_time}
+ t1,t2: TDateTime;
+{$ENDIF LDADEBUG_time}
+ lWriteProgress: boolean;
+ lReadProgress: Boolean;
+begin
+ Realfldcnt:= Length(aDataForAppend.RealFields);
+
+ lWriteProgress := Assigned(onWriteDatasetProgress);
+ lReadProgress := Assigned(OnReadDatasetProgress);
+ ev1 := Assigned(OnBeforeFieldValueSerialization);
+ ev2 := Assigned(OnWriteFieldValue);
+ ev3 := Assigned(OnWriteFieldValueEx);
+ ev4 := Assigned(OnReadFieldValue);
+
+ SetLength(Sourceflds,Realfldcnt);
+ for i := 0 to Realfldcnt-1 do begin
+ if aDataForAppend.RealFields[i] = -10 then
+ Sourceflds[i]:=nil
+ else
+ Sourceflds[i]:=Source.Fields[aDataForAppend.RealFields[i]];
+ end;
+ SetLength(val,Realfldcnt);
+
+ while (aDataForAppend.RecordCount <> aDataForAppend.MaxRowCount) and not Source.EOF do begin
+ GetSourceValues;
+
+ Inc(aDataForAppend.RecordCount);
+ if lWriteProgress then OnWriteDatasetProgress(Self, Source, aDataForAppend.RecordCount, aDataForAppend.MaxRowCount);
+ Source.Next;
+
+ if aDataForAppend.lBatchAdding <> nil then
+ SetDestValues_BatchMode
+ else
+ SetDestValues_StdMode;
+
+ if lReadProgress then OnReadDatasetProgress(Self, Source, aDataForAppend.RecordCount, aDataForAppend.MaxRowCount);
+ if Source.EOF then Break;
+ end;
+ {$IFDEF LDADEBUG_time}
+ t2:=now;
+ OutputDebugString(PAnsiChar('TDABIN2DataStreamer.InternalDoWriteDataset:'+TimeToStr(t2-t1)+' | ' +FloatToStr(t2-t1)));
+ {$ENDIF LDADEBUG_time}
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDALocalHelpers.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDALocalHelpers.pas
new file mode 100644
index 0000000..2e3b599
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDALocalHelpers.pas
@@ -0,0 +1,59 @@
+unit uDALocalHelpers;
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Lazarus/FPC }
+{ platform: Win32, Unux, Mac }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ DataAbstract4_Intf, uDADelta, uDADataStreamer;
+
+type
+ IDeltaArray = array of IDADelta;
+
+ IDataAbstractLocalServiceAccess = interface
+ ['{72319FE4-BCE3-4C89-96BD-36A450F75241}']
+ procedure UpdateData(aDeltaList: IDeltaArray);
+ function GetSchema(const aFilter: UTF8String): UTF8String;
+ procedure GetData(const aTableNameArray: StringArray; const aTableRequestInfoArray: TableRequestInfoArray; aStreamer: TDADataStreamer);
+ function GetDatasetScripts(const DatasetNames: Utf8String): Utf8String;
+ function ExecuteCommandEx(const aCommandName: String; const aInputParameters: DataParameterArray; out aOutputParameters: DataParameterArray):integer;
+ end;
+
+function LocalServiceAccessHelper_Acquire(aGuid: TGuid; aName: String): IDataAbstractLocalServiceAccess;
+procedure LocalServiceAccessHelper_Release(aGuid: TGuid; aName: String; aService: IDataAbstractLocalServiceAccess);
+
+implementation
+uses
+ uROServer, uROServerIntf, uRORes, uROClasses;
+
+function LocalServiceAccessHelper_Acquire(aGuid: TGuid; aName: String): IDataAbstractLocalServiceAccess;
+var
+ lLocal: IUnknown;
+begin
+ GetClassFactory(aName).CreateInstance(aGuid, lLocal);
+ if (lLocal = nil) then RaiseError(err_ClassFactoryDidNotReturnInstance, [aName]);
+ Result := lLocal as IDataAbstractLocalServiceAccess;
+ lLocal := nil;
+ if Result <> nil then (Result as IROObjectActivation).OnActivate(aGuid,nil);
+end;
+
+procedure LocalServiceAccessHelper_Release(aGuid: TGuid; aName: String; aService: IDataAbstractLocalServiceAccess);
+var
+ lLocal: IUnknown;
+begin
+ lLocal := aService;
+ if lLocal <> nil then (lLocal as IROObjectActivation).OnDeactivate(aGuid);
+ GetClassFactory(aName).ReleaseInstance(aGuid, lLocal);
+end;
+
+end.
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMacroProcessors.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMacroProcessors.pas
new file mode 100644
index 0000000..c83e81b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMacroProcessors.pas
@@ -0,0 +1,509 @@
+unit uDAMacroProcessors;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses uDAEngine;
+
+(*
+ Macros:
+
+ -------------------- Date --------------------
+
+ Returns the current date from the server
+
+ Syntax: {Date()}
+ Example: SELECT * FROM Table WHERE OrderDate>{Date()}
+
+ Parameters: this macro has no parameters
+
+ -------------------- Time --------------------
+
+ Returns the current time from the server
+
+ Syntax: {Time()}
+ Example: SELECT * FROM Table WHERE OrderDate>{Time()}
+
+ Parameters: this macro has no parameters
+
+ -------------------- DateTime --------------------
+
+ Returns the current datetime from the server
+
+ Syntax: {DateTime()}
+ Example: SELECT * FROM Table WHERE OrderDate>{DateTime()}
+
+ Parameters: this macro has no parameters
+
+ -------------------- AddTime --------------------
+
+ Returns a new datetime value based on adding an interval to the specified date.
+ Not all databases support this macro.
+
+ Syntax: {AddTime(, , )}
+ Example: SELECT * FROM Table WHERE OrderDate>{AddTime(Date(), 2, day)}
+
+ Parameters: : a valid date
+ : number of days, weeks, etc as per next parameter
+ : day, week, year, hour, min, sec
+
+ -------------------- FormatDateTime --------------------
+
+ Formats the specified datetime to the datetime format used by the database
+
+ Syntax: {FormatDateTime()}
+ Example: SELECT * FROM Table WHERE OrderDate>{FormatDateTime('12/22/2003 15:22:34.123')}
+
+ Parameters: : a string expression representing a data in format MM/DD/YYYY HH24:MM:SS.MS
+
+ -------------------- FormatDate --------------------
+
+ Formats the specified date to the date format used by the database
+
+ Syntax: {FormatDateTime()}
+ Example: SELECT * FROM Table WHERE OrderDate>{FormatDate('12/22/2003')}
+
+ Parameters: : a string expression representing a data in format MM/DD/YYYY
+
+ -------------------- Length --------------------
+
+ Returns the length of the given string
+
+ Syntax: {Length()}
+ Example: SELECT * FROM Table WHERE {Length(CustomerID)}>3
+
+ Parameters: : a text string
+
+ -------------------- LowerCase --------------------
+
+ Converts the given string to lower case
+
+ Syntax: {LowerCase()}
+ Example: SELECT * FROM Table WHERE {LowerCase(CustomerID)}='alfki'
+
+ Parameters: : a text string
+
+ -------------------- UpperCase --------------------
+
+ Converts the given string to upper case
+
+ Syntax: {UpperCase()}
+ Example: SELECT * FROM Table WHERE {UpperCase(CustomerID)}='ALFKI'
+
+ Parameters: : a text string
+
+ -------------------- TrimLeft --------------------
+
+ Removes the leading spaces from a string
+
+ Syntax: {TrimLeft()}
+ Example: SELECT * FROM Table WHERE {TrimLeft(CustomerID)}='ALFKI'
+
+ Parameters: : a text string
+
+ -------------------- TrimRight --------------------
+
+ Removes the trailing spaces from a string
+
+ Syntax: {TrimRight()}
+ Example: SELECT * FROM Table WHERE {TrimRight(CustomerID)}='ALFKI'
+
+ Parameters: : a text string
+
+ -------------------- Copy --------------------
+
+ Returns characters starting from from
+
+ Syntax: {Copy(, , )}
+ Example: SELECT * FROM Table WHERE OrderDate>{Date()}
+
+ Parameters:
+ : a field name or a string
+ : the position from where to start copying
+ : the number of characters to copy
+
+ -------------------- NoLockHint --------------------
+
+ Returns (NOLOCK) for MSSQL server and empty string for other databases
+
+ Syntax: {NoLockHint}
+ Example: SELECT * FROM Table {NoLockHint}
+
+*)
+
+type { TDAMSSQLMacroProcessor }
+ TDAMSSQLMacroProcessor = class(TDASQLMacroProcessor)
+ protected
+ function DateTime(Sender: TObject; const Parameters: array of string): string; override;
+
+ function AddTime(Sender: TObject; const Parameters: array of string): string; override;
+
+ function Length(Sender: TObject; const Parameters: array of string): string; override;
+ function LowerCase(Sender: TObject; const Parameters: array of string): string; override;
+ function UpperCase(Sender: TObject; const Parameters: array of string): string; override;
+ function TrimLeft(Sender: TObject; const Parameters: array of string): string; override;
+ function TrimRight(Sender: TObject; const Parameters: array of string): string; override;
+ function Copy(Sender: TObject; const Parameters: array of string): string; override;
+ function Nolock(Sender: TObject; const Parameters: array of string): string; override;
+
+ public
+ constructor Create;
+ end;
+ TMSSQLMacroProcessor = TDAMSSQLMacroProcessor;
+
+ { TDAIBMacroProcessor }
+ TDAIBMacroProcessor = class(TDASQLMacroProcessor)
+ protected
+ function DateTime(Sender: TObject; const Parameters: array of string): string; override;
+
+ function AddTime(Sender: TObject; const Parameters: array of string): string; override;
+
+ function Length(Sender: TObject; const Parameters: array of string): string; override;
+ function LowerCase(Sender: TObject; const Parameters: array of string): string; override;
+ function UpperCase(Sender: TObject; const Parameters: array of string): string; override;
+ function TrimLeft(Sender: TObject; const Parameters: array of string): string; override;
+ function TrimRight(Sender: TObject; const Parameters: array of string): string; override;
+ function Copy(Sender: TObject; const Parameters: array of string): string; override;
+ function Nolock(Sender: TObject; const Parameters: array of string): string; override;
+
+ public
+ constructor Create;
+ end;
+ TIBMacroProcessor = TDAIBMacroProcessor;
+
+ { TDAOracleMacroProcessor }
+ TDAOracleMacroProcessor = class(TDASQLMacroProcessor)
+ function DateTime(Sender: TObject; const Parameters: array of string): string; override;
+
+ function AddTime(Sender: TObject; const Parameters: array of string): string; override;
+
+ function Length(Sender: TObject; const Parameters: array of string): string; override;
+ function LowerCase(Sender: TObject; const Parameters: array of string): string; override;
+ function UpperCase(Sender: TObject; const Parameters: array of string): string; override;
+ function TrimLeft(Sender: TObject; const Parameters: array of string): string; override;
+ function TrimRight(Sender: TObject; const Parameters: array of string): string; override;
+ function Copy(Sender: TObject; const Parameters: array of string): string; override;
+ function FormatDate(Sender: TObject; const Parameters: array of string): string; override;
+ function FormatDateTime(Sender: TObject; const Parameters: array of string): string; override;
+ function Nolock(Sender: TObject; const Parameters: array of string): string; override;
+
+ public
+ constructor Create;
+ end;
+ TOracleMacroProcessor = TDAOracleMacroProcessor;
+
+ { TDADBISAMMacroProcessor }
+ TDADBISAMMacroProcessor = class(TDASQLMacroProcessor)
+ function DateTime(Sender: TObject; const Parameters: array of string): string; override;
+
+ function AddTime(Sender: TObject; const Parameters: array of string): string; override;
+
+ function Length(Sender: TObject; const Parameters: array of string): string; override;
+ function LowerCase(Sender: TObject; const Parameters: array of string): string; override;
+ function UpperCase(Sender: TObject; const Parameters: array of string): string; override;
+ function TrimLeft(Sender: TObject; const Parameters: array of string): string; override;
+ function TrimRight(Sender: TObject; const Parameters: array of string): string; override;
+ function Copy(Sender: TObject; const Parameters: array of string): string; override;
+ function Nolock(Sender: TObject; const Parameters: array of string): string; override;
+
+ public
+ constructor Create;
+ end;
+ TDBISAMMacroProcessor = TDADBISAMMacroProcessor;
+
+implementation
+
+uses SysUtils;
+
+{ TDAMSSQLMacroProcessor }
+
+constructor TDAMSSQLMacroProcessor.Create;
+begin
+ inherited Create('yyyy-mm-dd', 'yyyy-mm-dd hh:nn:ss.zzz', FALSE, '@');
+end;
+
+function TDAMSSQLMacroProcessor.AddTime(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('dateadd(%s, %s, %s)', [Parameters[2], Parameters[1], Parameters[0]]);
+end;
+
+function TDAMSSQLMacroProcessor.Copy(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('substring(%s, %s, %s)', [Parameters[0], Parameters[1], Parameters[2]]);
+end;
+
+function TDAMSSQLMacroProcessor.DateTime(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'GetDate()';
+end;
+
+function TDAMSSQLMacroProcessor.Length(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'len(' + Parameters[0] + ')'
+end;
+
+function TDAMSSQLMacroProcessor.LowerCase(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'lower(' + Parameters[0] + ')'
+end;
+
+function TDAMSSQLMacroProcessor.TrimLeft(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'ltrim(' + Parameters[0] + ')'
+end;
+
+function TDAMSSQLMacroProcessor.TrimRight(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'rtrim(' + Parameters[0] + ')'
+end;
+
+function TDAMSSQLMacroProcessor.UpperCase(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'upper(' + Parameters[0] + ')'
+end;
+
+function TDAMSSQLMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string;
+begin
+ result := ' (NOLOCK) ';
+end;
+
+{ TDAIBMacroProcessor }
+
+constructor TDAIBMacroProcessor.Create;
+begin
+ inherited Create('yyyy-mm-dd', 'yyyy-mm-dd hh:mm:ss.zzz', FALSE);
+end;
+
+function TDAIBMacroProcessor.AddTime(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := '???'
+end;
+
+function TDAIBMacroProcessor.Copy(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('substring(%s from %s for %s)', [Parameters[0], Parameters[1], Parameters[2]]);
+end;
+
+function TDAIBMacroProcessor.DateTime(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := '(select current_timestamp from rdb$database)';
+end;
+
+function TDAIBMacroProcessor.Length(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('char_length(%s)', [Parameters[0]]);
+end;
+
+function TDAIBMacroProcessor.LowerCase(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'lower(' + Parameters[0] + ')'
+end;
+
+function TDAIBMacroProcessor.TrimLeft(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'trim ( leading from ' + Parameters[0] + ')'
+end;
+
+function TDAIBMacroProcessor.TrimRight(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'trim ( trailing from ' + Parameters[0] + ')'
+end;
+
+function TDAIBMacroProcessor.UpperCase(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'upper(' + Parameters[0] + ')'
+end;
+
+function TDAIBMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string;
+begin
+ result := '';
+end;
+
+{ TDAOracleMacroProcessor }
+
+constructor TDAOracleMacroProcessor.Create;
+begin
+ inherited Create('MM/DD/YYYY', 'MM/DD/YYYY HH:MM:SS.ZZZ', FALSE);
+end;
+
+function TDAOracleMacroProcessor.FormatDate(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := StringReplace('TO_DATE(''' + Parameters[0] + ''', ''MM/DD/YYYY'')', '''''', '''', [rfReplaceAll]);
+end;
+
+function TDAOracleMacroProcessor.FormatDateTime(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := StringReplace('TO_DATE(''' + Parameters[0] + ''', ''MM/DD/YYYY HH24:MI:SS.FF3'')', '''''', '''', [rfReplaceAll]);
+end;
+
+function TDAOracleMacroProcessor.AddTime(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Parameters[0] + '+';
+
+ if SameText(Parameters[2], 'DAY') then
+ result := result + Parameters[1]
+ else if SameText(Parameters[2], 'WEEK') then
+ result := result + Parameters[1] + '*7'
+ else if SameText(Parameters[2], 'YEAR') then
+ result := result + Parameters[1] + '*365'
+ else if SameText(Parameters[2], 'HOUR') then
+ result := result + Parameters[1] + '/24'
+ else if SameText(Parameters[2], 'MIN') then
+ result := result + Parameters[1] + '/1440'
+ else if SameText(Parameters[2], 'SEC') then
+ result := result + Parameters[1] + '/86400';
+end;
+
+function TDAOracleMacroProcessor.Copy(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('SUBSTR(%s, %s, %s)', [Parameters[0], Parameters[1], Parameters[2]]);
+end;
+
+function TDAOracleMacroProcessor.DateTime(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'SYSDATE'
+end;
+
+function TDAOracleMacroProcessor.Length(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('LENGTH(%s)', [Parameters[0]]);
+end;
+
+function TDAOracleMacroProcessor.LowerCase(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('LOWER(%s)', [Parameters[0]]);
+end;
+
+function TDAOracleMacroProcessor.TrimLeft(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('TRIM(%s)', [Parameters[0]]);
+end;
+
+function TDAOracleMacroProcessor.TrimRight(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('TRIM(%s)', [Parameters[0]]);
+end;
+
+function TDAOracleMacroProcessor.UpperCase(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('UPPER(%s)', [Parameters[0]]);
+end;
+
+function TDAOracleMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string;
+begin
+ result := '';
+end;
+{ TDADBISAMMacroProcessor }
+
+constructor TDADBISAMMacroProcessor.Create;
+begin
+ inherited Create('MM/DD/YYYY', 'MM/DD/YYYY HH:MM:SS.ZZZ', FALSE);
+end;
+
+function TDADBISAMMacroProcessor.AddTime(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Parameters[0] + '+';
+
+ if SameText(Parameters[2], 'DAY') then
+ result := result + Parameters[1]
+ else if SameText(Parameters[2], 'WEEK') then
+ result := result + Parameters[1] + '*7'
+ else if SameText(Parameters[2], 'YEAR') then
+ result := result + Parameters[1] + '*365'
+ else if SameText(Parameters[2], 'HOUR') then
+ result := result + Parameters[1] + '/24'
+ else if SameText(Parameters[2], 'MIN') then
+ result := result + Parameters[1] + '/1440'
+ else if SameText(Parameters[2], 'SEC') then
+ result := result + Parameters[1] + '/86400';
+end;
+
+function TDADBISAMMacroProcessor.Copy(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('SUBSTRING(%s FROM %s FOR %s)', [Parameters[0], Parameters[1], Parameters[2]]);
+end;
+
+function TDADBISAMMacroProcessor.DateTime(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := 'CURRENT_TIMESTAMP'
+end;
+
+function TDADBISAMMacroProcessor.Length(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('LENGTH(%s)', [Parameters[0]]);
+end;
+
+function TDADBISAMMacroProcessor.LowerCase(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('LOWER(%s)', [Parameters[0]]);
+end;
+
+function TDADBISAMMacroProcessor.TrimLeft(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('TRIM(LEADING '' '' FROM %s)', [Parameters[0]]);
+end;
+
+function TDADBISAMMacroProcessor.TrimRight(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('TRIM(TRAILING '' '' FROM %s)', [Parameters[0]]);
+end;
+
+function TDADBISAMMacroProcessor.UpperCase(Sender: TObject;
+ const Parameters: array of string): string;
+begin
+ result := Format('UPPER(%s)', [Parameters[0]]);
+end;
+
+function TDADBISAMMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string;
+begin
+ result := '';
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMacros.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMacros.pas
new file mode 100644
index 0000000..010fd51
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMacros.pas
@@ -0,0 +1,894 @@
+unit uDAMacros;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ SysUtils, Classes;
+
+type
+ TROPasToken = (
+ CSTI_EOF,
+ {Items that are used internally}
+ CSTIINT_Comment,
+ CSTIINT_WhiteSpace,
+ {Tokens}
+ CSTI_Identifier,
+ CSTI_SemiColon,
+ CSTI_Comma,
+ CSTI_Period,
+ CSTI_Colon,
+ CSTI_OpenRound,
+ CSTI_CloseRound,
+ CSTI_OpenBlock,
+ CSTI_CloseBlock,
+ CSTI_Assignment,
+ CSTI_Equal,
+ CSTI_NotEqual,
+ CSTI_Smaller,
+ CSTI_SmallerEqual,
+ CSTI_Greater,
+ CSTI_GreaterEqual,
+ CSTI_Plus,
+ CSTI_Minus,
+ CSTI_Divide,
+ CSTI_Multiply,
+ CSTI_Integer,
+ CSTI_Real,
+ CSTI_String,
+ CSTI_Date,
+ CSTI_HexInt,
+ CSTI_Modulus,
+ CSTII_In,
+ CSTII_like,
+ CSTII_And,
+ CSTII_Or,
+ CSTII_Xor,
+ CSTII_Not,
+ CSTII_IsNull,
+ CSTII_IsNotNull
+ );
+ {TROParserErrorKind is used to store the parser error}
+ TROParserErrorKind = (iNoError, iCommentError, iStringError, iCharError, iSyntaxError);
+ TROParserErrorEvent = procedure(Parser: TObject; Kind: TROParserErrorKind) of object;
+
+ {TROPacalParser is the parser used to parse the current script}
+ TROPascalParser = class(TObject)
+ private
+ FData: string;
+ FRow,
+ FCol: Cardinal;
+ FLastEnterPos: Longint;
+ FText: PChar;
+ FRealPosition, FTokenLength: Cardinal;
+ FTokenId: TROPasToken;
+ FToken: string;
+ FOriginalToken: string;
+ FParserError: TROParserErrorEvent;
+ fOpenBlockEscape: Boolean;
+ // only applicable when Token in [CSTI_Identifier, CSTI_Integer, CSTI_Real, CSTI_String, CSTI_Char, CSTI_HexInt]
+ procedure SkipWhiteSpaces(var ci: cardinal);
+ public
+ { means you can use [something] to escape identifiers}
+ property OpenBlockEscape: Boolean read fOpenBlockEscape write fOpenBlockEscape;
+ {Go to the next token}
+ procedure Next;
+ {Return the token in case it is a string, char, integer, number or idenTROier}
+ property GetToken: string read FToken;
+ {Return the token but do not uppercase it}
+ property OriginalToken: string read FOriginalToken;
+ {The current token position}
+ property CurrTokenPos: Cardinal read FRealPosition;
+ {The current token ID}
+ property CurrTokenID: TROPasToken read FTokenId;
+ {Row}
+ property Row: Cardinal read FRow;
+ {Column}
+ property Col: Cardinal read FCol;
+ {Load a script}
+ procedure SetText(const Data: string);
+ {Parser error event will be called on (syntax) errors in the script}
+ property OnParserError: TROParserErrorEvent read FParserError write FParserError;
+ end;
+
+ TExternalProc = function(Sender: TObject; const Parameters: array of string): string of object;
+
+ TROMacroProc = class
+ private
+ FExternalProc: TExternalProc;
+ FExternalName: string;
+ FExternalNameHash: Longint;
+ fParamCount: integer;
+ public
+ property ExternalName: string read FExternalName write FExternalName;
+ property ExternalNameHash: Integer read FExternalNameHash write FExternalNameHash;
+ property ExternalProc: TExternalProc read FExternalProc write FExternalProc;
+ property ParamCount: integer read fParamCount write fParamCount;
+ end;
+
+ TROMacroVar = class
+ private
+ FName: string;
+ FNameHash: Longint;
+ FValue: string;
+ public
+ constructor Create(const aName: string);
+ property Name: string read FName;
+ property NameHash: Longint read FNameHash;
+ property Value: string read FValue write FValue;
+ end;
+
+ TOnUnknownIdentifier = function(Sender: TObject; const Name, OrgName: string; var Value: string): Boolean of object;
+ TROMacroParser = class(TInterfacedObject)
+ private
+ FProcs: TList;
+ FVars: TList;
+ FOnUnknownIdentifier: TOnUnknownIdentifier;
+ FParser: TROPascalParser;
+ procedure ParserError(Parser: TObject; Kind: TROParserErrorKind);
+ function GetVarCount: Longint;
+ function GetVarNo(I: Integer): TROMacroVar;
+ public
+ property OnUnknownIdentifier: TOnUnknownIdentifier read FOnUnknownIdentifier write FOnUnknownIdentifier;
+
+ procedure ClearProcs;
+ procedure RegisterProc(const Name: string; ExProc: TExternalProc; aParamCount: integer);
+
+ property VariableCount: Longint read GetVarCount;
+ property Variable[I: Longint]: TROMacroVar read GetVarNo;
+
+ procedure DeleteVariable(I: Longint);
+ procedure ClearVariables;
+ function AddVariable(const Name: string): TROMacroVar;
+ function IndexOfName(const aName: string): integer;
+ constructor Create;
+
+ function EvalToken(const Text: string): string;
+ function Eval(const Text: string; TextDelimiter: char = ''''): string;
+
+ destructor Destroy; override;
+ end;
+
+function MakeHash(const s: string): Longint;
+function FastUppercase(const s: string): string;
+
+implementation
+uses
+ uROClasses;
+
+function MakeHash(const s: string): Longint;
+{small hash maker}
+var
+ I: Integer;
+begin
+ Result := 0;
+ for I := 1 to Length(s) do
+ Result := ((Result shl 7) or (Result shr 25)) + Ord(s[I]);
+end;
+
+function FastUppercase(const s: string): string;
+begin
+ Result := Uppercase(s);
+end;
+
+procedure TROPascalParser.Next;
+var
+ Err: TROParserErrorKind;
+
+ function _GetToken(CurrTokenPos, CurrTokenLen: Cardinal): string;
+ var
+ s: string;
+ begin
+ SetLength(s, CurrTokenLen);
+ Move(FText[CurrTokenPos], S[1], CurrtokenLen*sizeOf(char));
+ Result := s;
+ end;
+
+ function ParseToken(var CurrTokenPos, CurrTokenLen: Cardinal; var CurrTokenId: TROPasToken): TROParserErrorKind;
+ {Parse the token}
+ var
+ ct, ci, cx: Cardinal;
+ s: string;
+ hs: Boolean;
+ begin
+ ParseToken := iNoError;
+ ct := CurrTokenPos;
+ case FText[ct] of
+ #0: begin
+ CurrTokenId := CSTI_EOF;
+ CurrTokenLen := 0;
+ end;
+ 'A'..'Z', 'a'..'z', '_', '@': begin
+ ci := ct + 1;
+ while CharInSet(FText[ci], ['_', '0'..'9', 'a'..'z', 'A'..'Z']) do begin
+ Inc(ci);
+ end;
+ CurrTokenLen := ci - ct;
+ CurrTokenId := CSTI_Identifier;
+ s := FastUppercase(_GetToken(CurrTokenPos, CurrTokenLen));
+ case s[1] of
+ 'I': if s = 'IN' then begin
+ CurrTokenId := CSTII_In;
+ end
+ else if s = 'IS' then begin
+ SkipWhiteSpaces(ci);
+ cx:=ci;
+ while CharInSet(FText[ci], ['a'..'z', 'A'..'Z']) do Inc(ci);
+ s := FastUppercase(_GetToken(cx, ci-cx));
+ if s = 'NULL' then begin //is null
+ CurrTokenLen := ci - ct;
+ CurrTokenId := CSTII_IsNull;
+ end
+ else if s = 'NOT' then begin
+ SkipWhiteSpaces(ci);
+ cx:=ci;
+ while CharInSet(FText[ci], ['a'..'z', 'A'..'Z']) do Inc(ci);
+ s := FastUppercase(_GetToken(cx, ci-cx));
+ if s = 'NULL' then begin //is not null
+ CurrTokenLen := ci - ct;
+ CurrTokenId := CSTII_IsNotNull;
+ end
+ end;
+ end;
+ 'L': if s = 'LIKE' then CurrTokenId := CSTII_like;
+ 'A': if s = 'AND' then CurrTokenId := CSTII_And;
+ 'O': if s = 'OR' then CurrTokenId := CSTII_Or;
+ 'X': if s = 'XOR' then CurrTokenId := CSTII_Xor;
+ 'N': if s = 'NOT' then CurrTokenId := CSTII_Not;
+ end;
+
+ end;
+ '$': begin
+ ci := ct + 1;
+
+ while CharInSet(FText[ci], ['0'..'9', 'a'..'f', 'A'..'F']) do
+ Inc(ci);
+
+ CurrTokenId := CSTI_HexInt;
+ CurrTokenLen := ci - ct;
+ end;
+
+ '0'..'9': begin
+ hs := False;
+ ci := ct;
+ while CharInSet(FText[ci], ['0'..'9']) do begin
+ Inc(ci);
+ if (FText[ci] = '.') and (not hs) then begin
+ if FText[ci + 1] = '.' then break;
+ hs := True;
+ Inc(ci);
+ end;
+ end;
+
+ if hs then
+ CurrTokenId := CSTI_Real
+ else
+ CurrTokenId := CSTI_Integer;
+
+ CurrTokenLen := ci - ct;
+ end;
+
+ #39: begin
+ ci := ct + 1;
+ while (FText[ci] <> #0) and (FText[ci] <> #13) and
+ (FText[ci] <> #10) and (FText[ci] <> #39) do begin
+ Inc(ci);
+ while (FText[ci] = #39) and (FText[ci + 1] = #39) do
+ Inc(ci, 2);
+ end;
+ if FText[ci] = #39 then
+ CurrTokenId := CSTI_String
+ else begin
+ CurrTokenId := CSTI_String;
+ ParseToken := iStringError;
+ end;
+ CurrTokenLen := ci - ct + 1;
+ end;
+ '#': begin
+ ci := ct + 1;
+ while CharInSet(FText[ci], ['0'..'9', '/']) do begin
+ Inc(ci);
+ end;
+ if FText[ci] <> '#' then begin
+ ParseToken := iCharError;
+ CurrTokenId := CSTI_Date;
+ end
+ else begin
+ inc(ci);
+ CurrTokenId := CSTI_Date;
+ end;
+ CurrTokenLen := ci - ct;
+ end;
+ '=': begin
+ CurrTokenId := CSTI_Equal;
+ CurrTokenLen := 1;
+ end;
+ '>': begin
+ if FText[ct + 1] = '=' then begin
+ CurrTokenid := CSTI_GreaterEqual;
+ CurrTokenLen := 2;
+ end
+ else begin
+ CurrTokenid := CSTI_Greater;
+ CurrTokenLen := 1;
+ end;
+ end;
+ '<': begin
+ if FText[ct + 1] = '=' then begin
+ CurrTokenId := CSTI_SmallerEqual;
+ CurrTokenLen := 2;
+ end
+ else if FText[ct + 1] = '>' then begin
+ CurrTokenId := CSTI_NotEqual;
+ CurrTokenLen := 2;
+ end
+ else begin
+ CurrTokenId := CSTI_Smaller;
+ CurrTokenLen := 1;
+ end;
+ end;
+ ')': begin
+ CurrTokenId := CSTI_CloseRound;
+ CurrTokenLen := 1;
+ end;
+ '(': begin
+ if FText[ct + 1] = '*' then begin
+ ci := ct + 1;
+ while (FText[ci] <> #0) do begin
+ if (FText[ci] = #13) then begin
+ if FText[ci + 1] = #10 then
+ Inc(ci);
+ FLastEnterPos := ci;
+ Inc(FRow);
+ end
+ else if FText[ci] = #10 then begin
+ FLastEnterPos := ci;
+ Inc(FRow);
+ end;
+ if (FText[ci] = '*') and (FText[ci + 1] = ')') then
+ Break;
+ Inc(ci);
+ end;
+ if (FText[ci] = #0) then begin
+ CurrTokenId := CSTIINT_Comment;
+ ParseToken := iCommentError;
+ end
+ else begin
+ CurrTokenId := CSTIINT_Comment;
+ Inc(ci, 2);
+ end;
+ CurrTokenLen := ci - ct;
+ end
+ else begin
+ CurrTokenId := CSTI_OpenRound;
+ CurrTokenLen := 1;
+ end;
+ end;
+ '[': begin
+ if fOpenBlockEscape then begin
+ ci := ct + 1;
+ while not CharInSet(FText[ci], [']', #0]) do begin
+ if FText[ci] = '\' then
+ inc(Ci);
+ Inc(ci);
+ end;
+ if FText[ci] = ']' then Inc(ci);
+ CurrTokenLen := ci - ct;
+ CurrTokenId := CSTI_Identifier;
+ end else begin
+ CurrTokenId := CSTI_OpenBlock;
+ CurrTokenLen := 1;
+ end;
+ end;
+ ']': begin
+ CurrTokenId := CSTI_CloseBlock;
+ CurrTokenLen := 1;
+ end;
+ ',': begin
+ CurrTokenId := CSTI_Comma;
+ CurrTokenLen := 1;
+ end;
+ '.': begin
+ CurrTokenId := CSTI_Period;
+ CurrTokenLen := 1;
+ end;
+ ';': begin
+ CurrTokenId := CSTI_Semicolon;
+ CurrTokenLen := 1;
+ end;
+ ':': begin
+ if FText[ct + 1] = '=' then begin
+ CurrTokenId := CSTI_Assignment;
+ CurrTokenLen := 2;
+ end
+ else begin
+ CurrTokenId := CSTI_Colon;
+ CurrTokenLen := 1;
+ end;
+ end;
+ '+': begin
+ CurrTokenId := CSTI_Plus;
+ CurrTokenLen := 1;
+ end;
+ '-': begin
+ CurrTokenId := CSTI_Minus;
+ CurrTokenLen := 1;
+ end;
+ '%': begin
+ CurrTokenId := CSTI_Modulus;
+ CurrTokenLen := 1;
+ end;
+ '*': begin
+ CurrTokenId := CSTI_Multiply;
+ CurrTokenLen := 1;
+ end;
+ '/': begin
+ if FText[ct + 1] = '/' then begin
+ ci := ct + 1;
+ while (FText[ci] <> #0) and (FText[ci] <> #13) and (FText[ci] <> #10) do begin
+ Inc(ci);
+ end;
+ if (FText[ci] = #0) then begin
+ CurrTokenId := CSTIINT_Comment;
+ ParseToken := iCommentError;
+ end
+ else begin
+ if (FText[ci] = #13) and (FText[ci + 1] = #10) then
+ Inc(ci);
+ Inc(FRow);
+ FLastEnterPos := ci;
+
+ CurrTokenId := CSTIINT_Comment;
+ end;
+ CurrTokenLen := ci - ct + 1;
+ end
+ else begin
+ CurrTokenId := CSTI_Divide;
+ CurrTokenLen := 1;
+ end;
+ end;
+ #32, #9, #13, #10: begin
+ ci := ct + 1;
+ SkipWhiteSpaces(ci);
+ CurrTokenId := CSTIINT_WhiteSpace;
+ CurrTokenLen := ci - ct;
+ end;
+ '{': begin
+ ci := ct + 1;
+ while (FText[ci] <> #0) and (FText[ci] <> '}') do begin
+ if (FText[ci] = #13) then begin
+ if FText[ci + 1] = #10 then
+ Inc(ci);
+ FLastEnterPos := ci;
+ Inc(FRow);
+ end
+ else if FText[ci] = #10 then begin
+ FLastEnterPos := ci;
+ Inc(FRow);
+ end;
+ Inc(ci);
+ end;
+ if (FText[ci] = #0) then begin
+ CurrTokenId := CSTIINT_Comment;
+ ParseToken := iCommentError;
+ end
+ else
+ CurrTokenId := CSTIINT_Comment;
+ CurrTokenLen := ci - ct + 1;
+ end;
+ else begin
+ ParseToken := iSyntaxError;
+ CurrTokenId := CSTIINT_Comment;
+ CurrTokenLen := 1;
+ end;
+ end;
+ end;
+ //-------------------------------------------------------------------
+begin
+ if FText = nil then begin
+ FTokenLength := 0;
+ FRealPosition := 0;
+ FRow := 1;
+ FLastEnterPos := 0;
+ FTokenId := CSTI_EOF;
+ Exit;
+ end;
+ repeat
+ FRealPosition := FRealPosition + FTokenLength;
+ Err := ParseToken(FRealPosition, FTokenLength, FTokenID);
+ if Err <> iNoError then begin
+ FTokenLength := 0;
+ FTokenId := CSTI_EOF;
+ FToken := '';
+ FOriginalToken := '';
+ FCol := Longint(FRealPosition) - FLastEnterPos;
+ if @FParserError <> nil then FParserError(Self, Err);
+ exit;
+ end;
+ case FTokenID of
+ CSTIINT_Comment, CSTIINT_WhiteSpace: Continue;
+ CSTI_Integer, CSTI_Real, CSTI_String, CSTI_Date, CSTI_HexInt: begin
+ FOriginalToken := _GetToken(FRealPosition, FTokenLength);
+ FToken := FOriginalToken;
+ end;
+ CSTI_Identifier: begin
+ FOriginalToken := _GetToken(FRealPosition, FTokenLength);
+ FToken := FastUppercase(FOriginalToken);
+ end;
+ else begin
+ FOriginalToken := '';
+ FToken := '';
+ end;
+ end;
+ Break;
+ until False;
+ FCol := Longint(FRealPosition) - FLastEnterPos;
+end;
+
+procedure TROPascalParser.SetText(const Data: string);
+begin
+ FData := Data;
+ FText := Pointer(FData);
+ FTokenLength := 0;
+ FRealPosition := 0;
+ FRow := 1;
+ FLastEnterPos := -1;
+ FTokenId := CSTI_EOF;
+ Next;
+end;
+
+{ TROMacroParser }
+
+function TROMacroParser.AddVariable(const Name: string): TROMacroVar;
+begin
+ Result := TROMacroVar.Create(Uppercase(Name));
+ FVars.Add(Result);
+end;
+
+procedure TROMacroParser.ClearProcs;
+var
+ i: Longint;
+begin
+ for i := FProcs.Count - 1 downto 0 do begin
+ TROMacroProc(FPRocs[i]).Free;
+ end;
+ FProcs.Clear;
+end;
+
+procedure TROMacroParser.ClearVariables;
+var
+ i: Longint;
+begin
+ for i := FVars.Count - 1 downto 0 do begin
+ TROMacroVar(FVars[i]).Free;
+ end;
+ FVars.Clear;
+end;
+
+constructor TROMacroParser.Create;
+begin
+ inherited Create;
+ FProcs := TList.Create;
+ FVars := TList.Create;
+ FParser := TROPascalParser.Create;
+ FParser.OnParserError := ParserError;
+end;
+
+procedure TROMacroParser.DeleteVariable(I: Integer);
+var
+ f: TROMacroVar;
+begin
+ f := FVars[i];
+ FVars.Delete(i);
+ f.Free;
+end;
+
+destructor TROMacroParser.Destroy;
+begin
+ FParser.Free;
+ ClearProcs;
+ ClearVariables;
+ FProcs.Free;
+ FVars.Free;
+ inherited Destroy;
+end;
+
+function MKString(const s: string): string;
+begin
+ Result := StringReplace(s, #39#39, #39, [rfReplaceAll]);
+ Delete(Result, 1, 1);
+ Delete(Result, Length(Result), 1);
+end;
+
+function SQLEscapeStr(const s: string): string;
+var
+ i, l: Longint;
+ c: char;
+begin
+ SetLength(Result, Length(s) + 10);
+ Result[1] := '''';
+ i := 1;
+ l := 1;
+ while i <= length(s) do begin
+ case s[i] of
+ #13: c := 'r';
+ #10: c := 'n';
+ #9: c := 't';
+ '\': c := '\';
+ #39: c := #39;
+ '"': c := '"';
+ else
+ c := #0;
+ end;
+ if c = #0 then begin
+ inc(l);
+ if L > Length(Result) then
+ SetLength(Result, l + 10);
+ Result[l] := s[i];
+ end
+ else begin
+ inc(l, 2);
+ if L > Length(Result) then
+ SetLength(Result, l + 10);
+ Result[l - 1] := '\';
+ Result[l] := c;
+ end;
+ Inc(i);
+ end;
+ SetLength(Result, l + 1);
+ Result[l + 1] := '''';
+end;
+
+type
+ TOperator = (opFirst, opAdd);
+
+function TROMacroParser.EvalToken(const Text: string): string;
+
+ function Evaluate: string;
+ var
+ h, i: Longint;
+ b: Boolean;
+ resval: string;
+
+ procedure CheckParamCount(P: TROMacroProc; Params: array of string);
+ begin
+ if (Length(Params) < P.ParamCount) then
+ raise Exception.CreateFmt('Invalid number of parameters. %d given, %d expected.',
+ [Length(Params), P.ParamCount])
+ end;
+
+ function CallProc(P: TROMacroProc): string;
+ var
+ Params: array of string;
+ s: string;
+ begin
+ Params:=nil;
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_OpenRound then begin
+ CheckParamCount(P, Params);
+ Result := P.ExternalProc(Self, Params);
+ exit;
+ end;
+ FParser.Next;
+ while FParser.CurrTokenID <> CSTI_CloseRound do begin
+ s := Evaluate;
+ SetLength(Params, Length(Params) + 1);
+ Params[Length(Params) - 1] := s;
+ if FParser.CurrTokenId = CSTI_CloseRound then begin
+ Break;
+ end;
+ if FParser.CurrTokenId <> CSTI_Comma then
+ raise Exception.Create('[' + IntToStr(FParser.Row) + ':' + IntToStr(FParser.Col) + ']: Closing parenthesis expected');
+ FParser.Next;
+ end;
+ FParser.Next;
+
+ CheckParamCount(P, Params);
+ Result := P.ExternalProc(Self, Params);
+ end;
+ begin
+ Result := '';
+ while true do begin
+ case FParser.CurrTokenID of
+ CSTI_Identifier: begin
+ h := MakeHash(FParser.GetToken);
+ b := False;
+ for i := 0 to FProcs.Count - 1 do begin
+ with TROMacroProc(FProcs[i]) do begin
+ if (ExternalNameHash = h) and SameText(ExternalName, FParser.GetToken) then begin
+ resval := CallProc(TROMacroProc(FProcs[i]));
+ b := True;
+ end;
+ end;
+ end;
+ if (not b) then begin
+ for i := 0 to FVars.Count - 1 do begin
+ with TROMacroVar(FVars[i]) do begin
+ if (NameHash = h) and (Name = FParser.GetToken) then begin
+ FParser.Next;
+ resval := Value;
+ b := True;
+ break;
+ end;
+ end;
+ end;
+ end;
+ if (not b) and (@FOnUnknownIdentifier <> nil) then begin
+ b := FOnUnknownIdentifier(Self, FParser.GetToken, FParser.OriginalToken, resval);
+ if b then FParser.Next;
+ end;
+ if not b then
+ raise Exception.Create('[' + IntToStr(FParser.Row) + ':' + IntToStr(FParser.Col) + ']: Unknown identifier ' + FParser.GetToken);
+ end;
+ CSTI_Real, CSTI_Integer: begin
+ Resval := FParser.GetToken;
+ FParser.Next;
+ end;
+ CSTI_HexInt: begin
+ Resval := IntToStr(StrToInt(FParser.GetToken));
+ FParser.Next;
+ end;
+ CSTI_String, CSTI_Date: begin
+ Resval := '';
+ while (FParser.CurrTokenId = CSTI_String) or (FParser.CurrTokenId = CSTI_Date) do begin
+ if FParser.CurrTokenId = CSTI_String then
+ Resval := resval + MKString(FParser.GetToken)
+ else
+ Resval := resval + FParser.GetToken;
+ FParser.Next;
+ end;
+ ResVal := SQLEscapeStr(ResVal);
+ end;
+ end;
+ Result := Result + ResVal;
+ case FParser.CurrTokenId of
+ CSTI_Minus: Result := Result + ' - ';
+ CSTI_Plus: Result := Result + ' + ';
+ else
+ Break;
+ end;
+ FParser.Next;
+ end;
+ end;
+begin
+ FParser.SetText(Text);
+ Result := Evaluate();
+ if FParser.CurrTokenID <> CSTI_EOF then
+ // Raise Exception.Create('['+IntToStr(FParser.Row)+':'+IntToStr(FParser.Col)+']: End of expression expected');
+end;
+
+const
+ LenInc = 32;
+
+function TROMacroParser.Eval(const Text: string; TextDelimiter: char = ''''): string;
+var
+ start, i, l: Longint;
+ InStr: Boolean;
+ s: string;
+begin
+ SetLength(Result, Length(Text) + LenInc);
+ i := 1;
+ l := 0;
+ InStr := False;
+ while i <= length(Text) do begin
+ if Text[i] = '''' then
+ InStr := not InStr;
+ if (Text[i] = '{') and not (InStr) then begin
+ start := i;
+ inc(i);
+ InStr := False;
+ while i <= Length(Text) do begin
+ case Text[i] of
+ #39: InStr := not InStr;
+ '}': if not InStr then Break;
+ end;
+ Inc(i);
+ end;
+ s := EvalToken(Copy(Text, Start + 1, I - Start - 1));
+ if L + Length(s) > Length(Result) then
+ SetLength(Result, l + Length(s) + LenInc);
+ Start := 1;
+ while Start <= Length(s) do begin
+ Inc(l);
+ Result[l] := s[Start];
+ Inc(Start);
+ end;
+ Inc(i);
+ end
+ else begin
+ inc(l);
+ if L > Length(Result) then
+ SetLength(Result, l + LenInc);
+ Result[l] := Text[i];
+ Inc(i);
+ end;
+ end;
+ SetLength(Result, l);
+end;
+
+function TROMacroParser.GetVarCount: Longint;
+begin
+ Result := FVars.Count;
+end;
+
+function TROMacroParser.GetVarNo(I: Integer): TROMacroVar;
+begin
+ Result := FVars[i];
+end;
+
+procedure TROMacroParser.ParserError(Parser: TObject;
+ Kind: TROParserErrorKind);
+var
+ err: string;
+begin
+ case Kind of
+ iCommentError: err := 'Comment Error';
+ iCharError, iStringError: err := 'String error';
+ else
+ err := 'Syntax Error';
+ end;
+
+ raise Exception.Create('[' + IntToStr(FParser.Row) + ':' + IntToStr(FParser.Col) + ']: ' + err);
+end;
+
+procedure TROMacroParser.RegisterProc(const Name: string; ExProc: TExternalProc; aParamCount: integer);
+var
+ R: TROMacroProc;
+begin
+ R := TROMacroProc.Create;
+ r.ExternalName := UpperCase(Name);
+ r.ExternalNameHash := MakeHash(r.ExternalName);
+ r.ExternalProc := ExProc;
+ r.ParamCount := aParamCount;
+
+ FProcs.Add(r);
+end;
+
+function TROMacroParser.IndexOfName(const aName: string): integer;
+begin
+ For Result:= 0 to FVars.Count -1 do
+ if SameText(aName, TROMacroVar(FVars[Result]).Name) then Exit;
+ Result:=-1;
+end;
+
+{ TROMacroVar }
+
+constructor TROMacroVar.Create(const aName: string);
+begin
+ inherited Create;
+ FName := aName;
+ FNameHash := MakeHash(aName);
+end;
+
+procedure TROPascalParser.SkipWhiteSpaces(var ci: cardinal);
+begin
+ while CharInSet(FText[ci], [#32, #9, #13, #10]) do begin
+ if (FText[ci] = #13) then begin
+ if FText[ci + 1] = #10 then
+ Inc(ci);
+ FLastEnterPos := ci;
+ Inc(FRow);
+ end
+ else if FText[ci] = #10 then begin
+ FLastEnterPos := ci;
+ Inc(FRow);
+ end;
+ Inc(ci);
+ end;
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMemDataTable.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMemDataTable.pas
new file mode 100644
index 0000000..06f6e08
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMemDataTable.pas
@@ -0,0 +1,733 @@
+unit uDAMemDataTable;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes,DB, uDAInterfaces,
+ uDADataTable, uDAMemDataset;
+
+type
+ TDAMemDataset = class(TDAMemoryDataset, IDADataTableDataset)
+ private
+ FDeletedRecordsList: TStringList;
+ FLogDeletedRecords: Boolean;
+ procedure ClearDeletedRecords;
+ protected
+ function GetDataTable: TDADataTable; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure InternalRefresh; override;
+ procedure InternalInitFieldDefs; override;
+ procedure InternalOpen; override;
+ function GetStateFieldValue(State: TDataSetState;Field: TField): Variant; {$IFNDEF FPC}override;{$ENDIF}
+ procedure InternalDelete; override;
+ procedure InternalInsert; override;
+ procedure InternalPost; override;
+ procedure InternalClose; override;
+ procedure AttachToSource(const Source: TDAMemoryDataset); override;
+ procedure DetachFromSource; override;
+ procedure OpenCursor(InfoQuery: Boolean); override;
+ function IsLoadingState: Boolean; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy;override;
+ end;
+
+ TDAMemDataTable = class(TDADataTable,IDAMemDatasetBatchAdding,IDARangeController)
+ private
+ fMemDataset: TDAMemDataset;
+ fWasReadonly: Boolean;
+ fMemCloneSource:TDAMemDataTable;
+ function GetIndexDefs: TIndexDefs;
+ function GetIndexName: string;
+ procedure SetIndexDefs(const Value: TIndexDefs);
+ procedure SetIndexName(const Value: string);
+ function GetIndexFieldNames: string;
+ procedure SetIndexFieldNames(const Value: string);
+ function GetAutoCompactRecords: boolean;
+ procedure SetAutoPackRecords(const Value: boolean);
+ procedure SetCloneSource(const Value: TDAMemDataTable);
+ procedure CloneCursorInternalOpen;
+ function GetCloneSource: TDAMemDataTable;
+ function GetAutoSortRecords: Boolean;
+ procedure SetAutoSortRecords(const Value: Boolean);
+ function GetCurrIDCallback: Integer;
+ protected
+ // IDAMemDatasetBatchAdding
+ function AllocRecordBuffer: PAnsiChar;
+ procedure FreeRecordBuffer(var Buffer: PAnsiChar);
+ function GetFieldNativeBuffer(Buffer: PAnsiChar; Field: TField): Pointer;
+ function MakeBlobFromString(Blob:AnsiString):pointer;
+ procedure SetNullMask(Buffer: PAnsiChar; Field: TField; const Value: boolean);
+ procedure SetAnsiString(NativeBuf: Pointer; Field: TField; const Value: Ansistring);
+ procedure SetWideString(NativeBuf: Pointer; Field: TField; const Value: Unicodestring);
+ procedure AddRecordsfromList(AList: TList; AppendMode: Boolean);
+ function GetFieldNo(AField: TField): integer;
+ protected
+ function GetRangeState: Boolean; override;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ function GetDatasetClass: TDatasetClass; override;
+ procedure CreateInternalFields(aDataset: TDataset; someFieldDefinitions: TDAFieldCollection); override;
+ procedure DoSort(const FieldNames: array of string; const Directions: array of TDASortDirection); override;
+
+ procedure SetMasterSource(const Value: TDADataSource); override;
+ function GetMasterSource: TDADataSource; override;
+ procedure SetDetailsFields(const Value: string); override;
+ procedure SetMasterFields(const Value: string); override;
+ function GetDetailFields: string; override;
+ function GetMasterFields: string; override;
+
+ function GetFilter: string; override;
+ function GetFiltered: boolean; override;
+ procedure SetFilter(const Value: string); override;
+ procedure SetFiltered(const Value: boolean); override;
+ function GetReadOnly: boolean; override;
+ procedure SetReadOnly(const Value: boolean); override;
+ procedure DoOpen(IgnoreAutoFetchSettings: Boolean = False); override;
+ function GetMasterDataLink: TMasterDataLink; override;
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure EnableConstraints; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DisableConstraints; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CloneCursor(Source: TDADataTable); override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ { IDARangeController }
+ procedure ApplyRange; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure CancelRange; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRange(const StartValues, EndValues: array of const); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure EditRangeEnd; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure EditRangeStart; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRangeEnd; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure SetRangeStart; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ //
+ procedure SetKey;
+ procedure EditKey;
+ function FindKey(const KeyValues: array of const): Boolean;
+ procedure FindNearest(const KeyValues: array of const);
+ function GotoKey: Boolean;
+ procedure GotoNearest;
+ function LocateByIndex(const aIndexName: string; const KeyValues: Variant): Boolean;
+ function LookupByIndex(const aIndexName: string; const KeyValues: Variant; const ResultFields: string): Variant;
+ procedure PrepareIndexForSorting(const aIndexName: string = '');
+ published
+ property IndexDefs: TIndexDefs read GetIndexDefs write SetIndexDefs;
+ property IndexName: string read GetIndexName write SetIndexName;
+ property IndexFieldNames: string read GetIndexFieldNames write SetIndexFieldNames;
+ property AutoCompactRecords: boolean read GetAutoCompactRecords write SetAutoPackRecords default False;
+ property CloneSource: TDAMemDataTable read GetCloneSource write SetCloneSource;
+ property AutoSortRecords: Boolean read GetAutoSortRecords write SetAutoSortRecords default False;
+ end;
+
+
+implementation
+
+uses
+ SysUtils, Variants,
+ uROClasses, uROClient;
+
+{ TDAMemDataset }
+
+
+procedure TDAMemDataset.AttachToSource(const Source: TDAMemoryDataset);
+var
+ lMemSource: TDAMemDataTable;
+begin
+ inherited;
+ if (Source <> Self) and Active and (Source is TDAMemDataset) then begin
+ lMemSource := TDAMemDataTable(GetDataTable);
+ lMemSource.Fields.Clear;
+ lMemSource.Fields.Assign(TDAMemDataset(Source).GetDataTable.Fields);
+ lMemSource.Fields.Bind(Self);
+ if Fields.Count > 0 then begin
+ lMemSource.RecIDField := Self.FieldByName(RecIDFieldName) as TIntegerField;
+ lMemSource.RecIDField.Visible := FALSE;
+ end;
+ end;
+end;
+
+procedure TDAMemDataset.ClearDeletedRecords;
+var
+ buf: Dataset_PAnsiChar;
+begin
+ while FDeletedRecordsList.Count <> 0 do begin
+ buf := Pointer(FDeletedRecordsList.Objects[FDeletedRecordsList.Count-1]);
+ FreeRecordBuffer(Buf);
+ FDeletedRecordsList.Delete(FDeletedRecordsList.Count-1);
+ end;
+end;
+
+constructor TDAMemDataset.Create(AOwner: TComponent);
+begin
+ inherited;
+ FDeletedRecordsList := TStringList.Create;
+ FLogDeletedRecords := True;
+end;
+
+destructor TDAMemDataset.Destroy;
+begin
+ inherited;
+ ClearDeletedRecords;
+ FDeletedRecordsList.Free;
+end;
+
+procedure TDAMemDataset.DetachFromSource;
+begin
+ if GetDataTable <> nil then GetDataTable.Close;
+ inherited;
+end;
+
+function TDAMemDataset.GetDataTable: TDADataTable;
+begin
+ result := TDADataTable(Owner);
+end;
+
+function TDAMemDataset.GetStateFieldValue(State: TDataSetState;
+ Field: TField): Variant;
+begin
+ if (State = dsOldValue) and (Self.State in [dsEdit, dsInsert]) then
+ Result := TDAMemDataTable(GetDataTable).fOldValues[Field.Index]
+ else
+ {$IFNDEF FPC} result := Inherited GetStateFieldValue(State, Field){$ENDIF};
+end;
+
+procedure TDAMemDataset.InternalClose;
+begin
+ ClearDeletedRecords;
+ inherited;
+end;
+
+procedure TDAMemDataset.InternalDelete;
+var
+ buf: pointer;
+begin
+ if FLogDeletedRecords and (GetDataTable.LogChanges) then begin
+ buf := CreateMemDatasetRecord(mrEmpty,0,True);
+ RecordToBuffer(CurrentRecord, buf);
+ FDeletedRecordsList.AddObject(Self.Fields[0].AsString, buf);
+ end;
+ inherited;
+end;
+
+procedure TDAMemDataset.InternalInitFieldDefs;
+begin
+ inherited;
+end;
+
+procedure TDAMemDataset.InternalInsert;
+var
+ fCurRec: String;
+ i: integer;
+ buf1: Pointer;
+begin
+ if FLogDeletedRecords then begin
+ fCurRec := IntToStr(GetDataTable.CurrRecId);
+ i := FDeletedRecordsList.IndexOf(fCurRec);
+ if i <> -1 then begin
+ buf1:=ActiveBuffer;
+ DuplicateBuffer(Pointer(FDeletedRecordsList.Objects[i]), buf1, True);
+ end;
+ end;
+ inherited;
+end;
+
+procedure TDAMemDataset.InternalOpen;
+begin
+ inherited;
+end;
+
+procedure TDAMemDataset.InternalPost;
+var
+ i: integer;
+ buf: Dataset_PAnsiChar;
+begin
+ inherited;
+ if FLogDeletedRecords and (State = dsInsert) then begin
+ i := FDeletedRecordsList.IndexOf(Fields[0].AsString);
+ if i <> -1 then begin
+ buf := pointer(FDeletedRecordsList.Objects[i]);
+ FreeRecordBuffer(buf);
+ FDeletedRecordsList.Delete(i);
+ end;
+ end;
+end;
+
+procedure TDAMemDataset.InternalRefresh;
+begin
+ inherited;
+end;
+
+function TDAMemDataset.IsLoadingState: Boolean;
+begin
+ Result := inherited IsLoadingState or ((Owner <> nil) and ((csLoading in Owner.ComponentState)));
+end;
+
+procedure TDAMemDataset.OpenCursor(InfoQuery: Boolean);
+begin
+ inherited;
+ if (not InfoQuery) and Active then
+ FieldByName(RecIDFieldName).Visible := FALSE;
+end;
+
+{ TDAMemDataTable }
+
+
+procedure TDAMemDataTable.AddRecordsfromList(AList: TList;AppendMode: Boolean);
+
+ function GetPK: string;
+ var
+ i: integer;
+ begin
+ Result := '';
+ for i := 0 to Fields.Count-1 do
+ if Fields[i].InPrimaryKey then
+ Result := Result + Fields[i].Name+';';
+ if Result <> '' then begin
+ Result := Copy(Result, 1, Length(Result)-1);
+ end
+ else begin
+ // use AutoInc as PK
+ for i := 0 to Fields.Count-1 do
+ if Fields[i].DataType in [datAutoInc, datLargeAutoInc] then begin
+ Result := Result + Fields[i].Name;
+ break;
+ end;
+ end;
+ end;
+
+var
+ rec: TDACallbackRecord;
+begin
+ Rec.RecIDCallback := GetCurrIDCallback;
+ Rec.PK := GetPK;
+ Rec.AppendMode := AppendMode and (Rec.PK <> '');
+ fMemDataset.AddRecordsfromList(AList,@Rec);
+// fMemDataset.ProcessFilter;
+end;
+
+function TDAMemDataTable.AllocRecordBuffer: PAnsiChar;
+begin
+ Result:= Pointer(fMemDataset.CreateMemDatasetRecord(mrBin2Style,0,False));
+end;
+
+procedure TDAMemDataTable.ApplyRange;
+begin
+ fMemDataset.ApplyRange;
+end;
+
+procedure TDAMemDataTable.Assign(Source: TPersistent);
+var
+ lSource: TDAMemDataTable;
+begin
+ inherited;
+ if Source is TDAMemDataTable then begin
+ lSource := TDAMemDataTable(Source);
+
+ AutoCompactRecords := lSource.AutoCompactRecords;
+ AutoSortRecords := lSource.AutoSortRecords;
+ IndexDefs := lSource.IndexDefs;
+ IndexFieldNames := lSource.IndexFieldNames;
+ IndexName := lSource.IndexName;
+ CloneSource := lSource.CloneSource;
+ end;
+end;
+
+procedure TDAMemDataTable.CancelRange;
+begin
+ fMemDataset.CancelRange;
+end;
+
+procedure TDAMemDataTable.CloneCursor(Source: TDADataTable);
+begin
+ if Source = nil then Exception.Create('CloneCursor. Source should be specified.');
+ if not (Source is TDAMemDataTable) then Exception.Create('Can''t clone cursor from ' + Source.ClassName);
+ if Source = Self then DatabaseError(Self.Name+ ': Can''t use itself as clonesource table');
+ if Active then raise Exception.Create('Datatable is already open');
+ FMemCloneSource := nil;
+ CloneSource := (Source as TDAMemDataTable);
+ CloneCursorInternalOpen;
+end;
+
+procedure TDAMemDataTable.CloneCursorInternalOpen;
+begin
+ try
+ FMemCloneSource.Open;
+ fMemDataset.Open;
+ RecIDField := fMemDataset.FieldByName(RecIDFieldName) as TIntegerField;
+ RecIDField.Visible := FALSE;
+
+ Fields.Bind(fMemDataset);
+
+ // Prepares the delta
+ Delta := FMemCloneSource.Delta;
+
+ // Finishes to prepare the internal dataset (descendant might need additional customization and might not be open)
+ DoBeforeOpenDataset;
+ if not FMemDataset.Active then FMemDataset.Open;
+ DoAfterOpenDataset;
+ except
+ // Restores the previous state
+ fMemCloneSource := NIL;
+ Delta := NIL;
+ raise;
+ end;
+end;
+
+constructor TDAMemDataTable.Create(aOwner: TComponent);
+begin
+ inherited;
+ fMemDataset := TDAMemDataset(Dataset);
+end;
+
+procedure TDAMemDataTable.CreateInternalFields(aDataset: TDataset;
+ someFieldDefinitions: TDAFieldCollection);
+begin
+ inherited;
+ fMemDataset.Open;
+end;
+
+destructor TDAMemDataTable.Destroy;
+begin
+ CloneSource := nil;
+ inherited;
+end;
+
+procedure TDAMemDataTable.DisableConstraints;
+begin
+ fWasReadonly := ReadOnly;
+ ReadOnly := False;
+// fMemDataset.DisableConstraints;
+end;
+
+procedure TDAMemDataTable.DoOpen(IgnoreAutoFetchSettings: Boolean);
+begin
+ fCloneSource := fMemCloneSource;
+ inherited;
+end;
+
+procedure TDAMemDataTable.DoSort(const FieldNames: array of string;
+ const Directions: array of TDASortDirection);
+var
+ i: integer;
+ s,s1: string;
+begin
+ if Length(FieldNames) <> Length(Directions) then DatabaseError('Can''t perform sorting: FieldNames and Directions should have same dimension.');
+ s := '';
+ s1:='';
+ for i := Low(FieldNames) to High(FieldNames) do begin
+ s := s + FieldNames[i] + ';';
+ if Directions[i] = sdDescending then
+ s1 := s1 + FieldNames[i] + ';';
+ end;
+ fMemDataset.SortOnFields(s,'',s1);
+end;
+
+procedure TDAMemDataTable.EditKey;
+begin
+ fMemDataset.EditKey;
+end;
+
+procedure TDAMemDataTable.EditRangeEnd;
+begin
+ fMemDataset.EditRangeEnd;
+end;
+
+procedure TDAMemDataTable.EditRangeStart;
+begin
+ fMemDataset.EditRangeStart;
+end;
+
+procedure TDAMemDataTable.EnableConstraints;
+begin
+ //fMemDataset.EnableConstraints;
+ ReadOnly := fWasReadonly;
+end;
+
+function TDAMemDataTable.FindKey(const KeyValues: array of const): Boolean;
+begin
+ Result := fMemDataset.FindKey(KeyValues);
+end;
+
+procedure TDAMemDataTable.FindNearest(const KeyValues: array of const);
+begin
+ fMemDataset.FindNearest(KeyValues);
+end;
+
+procedure TDAMemDataTable.FreeRecordBuffer(var Buffer: PAnsiChar);
+begin
+ fMemDataset.FreeMemDatasetRecord(PMemDatasetrecord_Native(Buffer));
+ Buffer := nil;
+end;
+
+function TDAMemDataTable.GetAutoCompactRecords: boolean;
+begin
+ Result := fMemDataset.AutoCompactRecords;
+end;
+
+function TDAMemDataTable.GetAutoSortRecords: Boolean;
+begin
+ Result := fMemDataset.AutoSortRecords;
+end;
+
+function TDAMemDataTable.GetCloneSource: TDAMemDataTable;
+begin
+ Result := fMemCloneSource;
+ if Result = nil then Result := TDAMemDataTable(fCloneSource);
+end;
+
+function TDAMemDataTable.GetCurrIDCallback: Integer;
+begin
+ Result := CurrRecId;
+ CurrRecId:=CurrRecId+1;
+end;
+
+function TDAMemDataTable.GetDatasetClass: TDatasetClass;
+begin
+ Result := TDAMemDataset;
+end;
+
+function TDAMemDataTable.GetDetailFields: string;
+begin
+ result := fMemDataset.DetailFields;
+end;
+
+function TDAMemDataTable.GetFieldNativeBuffer(Buffer: PAnsiChar;
+ Field: TField): Pointer;
+begin
+ Result:= fMemDataset.IntFindFieldData(PMemDatasetrecord_Native(Buffer)^.Data, Field, True);
+end;
+
+function TDAMemDataTable.GetFieldNo(AField: TField): integer;
+begin
+ Result := fMemDataSet.GetFieldNo(AField);
+end;
+
+function TDAMemDataTable.GetFilter: string;
+begin
+ Result := fMemDataset.Filter;
+end;
+
+function TDAMemDataTable.GetFiltered: boolean;
+begin
+ Result := fMemDataset.Filtered;
+end;
+
+function TDAMemDataTable.GetIndexDefs: TIndexDefs;
+begin
+ result := fMemDataset.IndexDefs;
+end;
+
+function TDAMemDataTable.GetIndexFieldNames: string;
+begin
+ Result := fMemDataset.IndexFieldNames;
+end;
+
+function TDAMemDataTable.GetIndexName: string;
+begin
+ result := fMemDataset.IndexName;
+end;
+
+function TDAMemDataTable.GetMasterDataLink: TMasterDataLink;
+begin
+ Result := fMemDataset.MasterDataLink;
+end;
+
+function TDAMemDataTable.GetMasterFields: string;
+begin
+ result := fMemDataset.MasterFields
+end;
+
+function TDAMemDataTable.GetMasterSource: TDADataSource;
+begin
+ result := TDADataSource(fMemDataset.DataSource);
+end;
+
+function TDAMemDataTable.GetRangeState: Boolean;
+begin
+ Result:= fMemDataset.RangeActive;
+end;
+
+function TDAMemDataTable.GetReadOnly: boolean;
+begin
+ Result := fMemDataset.ReadOnly;
+end;
+
+function TDAMemDataTable.GotoKey: Boolean;
+begin
+ Result := fMemDataset.GotoKey;
+end;
+
+procedure TDAMemDataTable.GotoNearest;
+begin
+ fMemDataset.GotoNearest;
+end;
+
+function TDAMemDataTable.LocateByIndex(const aIndexName: string;
+ const KeyValues: Variant): Boolean;
+begin
+ Result:= fMemDataset.LocateByIndex(aIndexName,KeyValues);
+end;
+
+function TDAMemDataTable.LookupByIndex(const aIndexName: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ Result:= fMemDataset.LookupByIndex(aIndexName,KeyValues,ResultFields);
+end;
+
+function TDAMemDataTable.MakeBlobFromString(Blob: AnsiString): pointer;
+begin
+ Result:= fMemDataset.MakeBlobFromString(Blob);
+end;
+
+procedure TDAMemDataTable.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited;
+ if (Operation = opRemove) and (AComponent = FCloneSource) then
+ CloneSource := nil;
+ if (Operation = opRemove) and (AComponent = fMemCloneSource) then
+ CloneSource := nil;
+end;
+
+procedure TDAMemDataTable.PrepareIndexForSorting(const aIndexName: string);
+begin
+ fMemDataset.PrepareIndexForSorting(aIndexName);
+end;
+
+procedure TDAMemDataTable.SetAnsiString(NativeBuf: Pointer; Field: TField;
+ const Value: Ansistring);
+begin
+ fMemDataset.SetAnsiString(NativeBuf,Field, Value);
+end;
+
+procedure TDAMemDataTable.SetAutoPackRecords(const Value: boolean);
+begin
+ fMemDataset.AutoCompactRecords := Value;
+end;
+
+procedure TDAMemDataTable.SetAutoSortRecords(const Value: Boolean);
+begin
+ fMemDataset.AutoSortRecords := Value;
+end;
+
+procedure TDAMemDataTable.SetCloneSource(const Value: TDAMemDataTable);
+
+var
+ FOldActive: Boolean;
+begin
+ FOldActive := Active;
+ Close;
+ if fMemCloneSource <> nil then fMemCloneSource.RORemoveFreeNotification(Self);
+ if (fCloneSource <> nil) then fCloneSource.RORemoveFreeNotification(Self);
+ if FMemCloneSource <> Value then begin
+ if (Value <> nil) then begin
+ Fields.Clear;
+ Fields.Assign(Value.Fields);
+ end;
+ FCloneSource := Value;
+ FMemCloneSource := Value;
+ if Value <> nil then
+ fMemDataset.CloneSource := Value.fMemDataset
+ else
+ fMemDataset.CloneSource := nil;
+ if fMemCloneSource <> nil then fMemCloneSource.ROFreeNotification(Self);
+ if (fCloneSource <> nil) and (fMemCloneSource <>fCloneSource) then fCloneSource.ROFreeNotification(Self);
+ end;
+ if FOldActive and (FMemCloneSource <> nil) then
+ CloneCursorInternalOpen;
+end;
+
+procedure TDAMemDataTable.SetDetailsFields(const Value: string);
+begin
+ fMemDataset.DetailFields := Value
+end;
+
+procedure TDAMemDataTable.SetFilter(const Value: string);
+begin
+ fMemDataset.Filter := Value;
+end;
+
+procedure TDAMemDataTable.SetFiltered(const Value: boolean);
+begin
+ fMemDataset.Filtered := Value;
+end;
+
+procedure TDAMemDataTable.SetIndexDefs(const Value: TIndexDefs);
+begin
+ fMemDataset.IndexDefs.Assign(Value);
+end;
+
+procedure TDAMemDataTable.SetIndexFieldNames(const Value: string);
+begin
+ fMemDataset.IndexFieldNames := Value;
+end;
+
+procedure TDAMemDataTable.SetIndexName(const Value: string);
+begin
+ fMemDataset.IndexName:=Value;
+end;
+
+procedure TDAMemDataTable.SetKey;
+begin
+ fMemDataset.SetKey;
+end;
+
+procedure TDAMemDataTable.SetMasterFields(const Value: string);
+begin
+ inherited;
+ fMemDataset.MasterFields := Value
+end;
+
+procedure TDAMemDataTable.SetMasterSource(const Value: TDADataSource);
+begin
+ fMemDataset.MasterSource := Value;
+ inherited;
+end;
+
+procedure TDAMemDataTable.SetNullMask(Buffer: PAnsiChar; Field: TField;
+ const Value: boolean);
+begin
+ fMemDataset.SetNullMask(Dataset_PAnsiChar(Buffer),fMemDataset.GetFieldNo(Field),Value);
+end;
+
+procedure TDAMemDataTable.SetRange(const StartValues,
+ EndValues: array of const);
+begin
+ fMemDataset.SetRange(StartValues, EndValues);
+end;
+
+procedure TDAMemDataTable.SetRangeEnd;
+begin
+ fMemDataset.SetRangeEnd;
+end;
+
+procedure TDAMemDataTable.SetRangeStart;
+begin
+ fMemDataset.SetRangeStart;
+end;
+
+procedure TDAMemDataTable.SetReadOnly(const Value: boolean);
+begin
+ fMemDataset.ReadOnly := Value;
+end;
+
+procedure TDAMemDataTable.SetWideString(NativeBuf: Pointer; Field: TField;
+ const Value: Unicodestring);
+begin
+ fMemDataset.SetWideString(NativeBuf, Field, Value);
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMemDataset.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMemDataset.pas
new file mode 100644
index 0000000..2cdc86f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMemDataset.pas
@@ -0,0 +1,5309 @@
+unit uDAMemDataset;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up }
+{ platform: Win32 }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+{.$DEFINE MEMDATASET_DEBUG}
+{$DEFINE CHECK_RANGE}
+{$DEFINE USE_REALLOC}
+// defer to .XX
+{.$DEFINE MEM_PACKETRECORDS}
+
+uses
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF}
+ Classes, DB, uDAExpressionEvaluator;
+
+type
+{$IFDEF DELPHI2009UP}
+ Dataset_PAnsiChar = PByte;
+{$ELSE}
+ Dataset_PAnsiChar = PAnsiChar;
+{$ENDIF}
+
+{$IFDEF UNICODE}
+ UnicodeChar = Char;
+ PUnicodeChar = PChar;
+{$ELSE}
+ UnicodeString = WideString;
+ PUnicodeString = PWideString;
+ UnicodeChar = WideChar;
+ PUnicodeChar = PWideChar;
+{$ENDIF}
+
+{$IFDEF DELPHI2009UP}
+ TMemBookmarkData = TBookmark;
+{$ELSE}
+ TMemBookmarkData = TBookmarkStr;
+{$ENDIF}
+
+ TDAMemoryDataset = class;
+ PBookmarkData = ^TBookmarkData;
+ TBookmarkData = Pointer;
+
+ PRecInfo = ^TRecInfo;
+ TRecInfo = packed record
+ Bookmark: TBookmarkData;
+ BookmarkFlag: TBookmarkFlag;
+ end;
+
+ TOffsetArray = array of Cardinal;
+ PBLOBRecord = ^TBLOBRecord;
+ TBLOBRecord = packed record
+ size: Cardinal;
+ Data: UnicodeChar;
+ end;
+
+ TSortRecord = record
+ data: PAnsiChar;
+ position: integer;
+ end;
+
+ PSortRecordList = ^TSortRecordList;
+ TSortRecordList = array[0..MaxListSize - 1] of TSortRecord;
+
+ // these operators are used in Assign and go beyond simply copying
+ // mlaCopy = dest becomes a copy of the source
+ // mlaAnd = intersection of the two lists
+ // mlaOr = union of the two lists
+ // mlaXor = only those not in both lists
+ // the last two operators can actually be thought of as binary operators but
+ // their implementation has been optimized over their binary equivalent.
+ // mlaSrcUnique = only those unique to source (same as mlaAnd followed by mlaXor)
+ // mlaDestUnique = only those unique to dest (same as mlaOr followed by mlaXor)
+ TMemListAssignOp = (mlaCopy, mlaAnd, mlaOr, mlaXor, mlaSrcUnique, mlaDestUnique);
+
+ TMemList = class(TObject)
+ private
+ FList: PPointerList;
+ FSortList:PSortRecordList;
+ FCount: Integer;
+ FCapacity: Integer;
+ FNeedRefresh: boolean;
+ procedure QuickSort(L, R: Integer);
+ procedure Sort;
+ function intIndexOf(Item: PAnsiChar): Integer;
+ protected
+ function Get(Index: Integer): Pointer;
+ procedure Grow; virtual;
+ procedure Put(Index: Integer; Item: Pointer);
+ procedure SetCapacity(NewCapacity: Integer);
+ procedure SetCount(NewCount: Integer);
+ public
+ constructor Create;
+ destructor Destroy; override;
+ function Add(Item: Pointer): Integer;
+ procedure Clear; virtual;
+ procedure Delete(Index: Integer);
+ class procedure Error(const Msg: string; Data: Integer); overload; virtual;
+ class procedure Error(Msg: PResStringRec; Data: Integer); overload;
+ procedure Exchange(Index1, Index2: Integer);
+ function Expand: TMemList;
+ function Extract(Item: Pointer): Pointer;
+ function First: Pointer;
+ function IndexOf(Item: Pointer): Integer;
+ procedure Insert(Index: Integer; Item: Pointer);
+ function Last: Pointer;
+ procedure Move(CurIndex, NewIndex: Integer);
+ function Remove(Item: Pointer): Integer;
+ procedure Pack;
+ procedure Assign(ListA: TMemList; AOperator: TMemListAssignOp = mlaCopy; ListB: TMemList = nil);
+ property Capacity: Integer read FCapacity write SetCapacity;
+ property Count: Integer read FCount write SetCount;
+ property Items[Index: Integer]: Pointer read Get write Put; default;
+ property List: PPointerList read FList;
+ end;
+
+ TThreadMemList = class
+ private
+ FList: TMemList;
+ FLock: TRTLCriticalSection;
+ FReadLock: Integer;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ procedure Add(Item: Pointer);
+ procedure Clear;
+ function LockListForReading: TMemList;
+ function LockListForWriting: TMemList;
+ procedure Remove(Item: Pointer);
+ procedure UnlockListForReading;
+ procedure UnlockListForWriting;
+ end;
+
+ TMemDataSetNotification = (mdnInsert, mdnModify, mdnDelete, mdnBatchAdding);
+
+ TDAValueStruct = record
+ Value: variant;
+ AsAnsiString: AnsiString;
+ AsWideString: UnicodeString;
+ end;
+
+ TMemKeyIndex = (kiLookup, kiRangeStart, kiRangeEnd, kiCurRangeStart, kiCurRangeEnd, kiSave);
+
+ PMemKeyBuffer = ^TMemKeyBuffer;
+ TMemKeyBuffer = record
+ Modified: Boolean;
+ Exclusive: Boolean;
+ FieldCount: Integer;
+ Data: record end; // native bin2 format
+ end;
+
+{$IFDEF BDS4UP}{$REGION 'MEM_PACKETRECORDS'}{$ENDIF BDS4UP}
+ {$IFDEF MEM_PACKETRECORDS}
+
+ TMemPackedRecords = class;
+
+ TMemPackedRecord = class
+ private
+ fBuffer: PAnsiChar;
+ FOwner: TMemPackedRecords;
+ function GetValues(Index: Integer): Variant;
+ procedure SetValues(Index: Integer; const Value: Variant);
+ function GetIsNull(Index: Integer): Boolean;
+ procedure SetIsNull(Index: Integer; const Value: Boolean);
+ function GetValuesByFieldName(AName: string): Variant;
+ procedure SetValuesByFieldName(AName: string; const Value: Variant);
+ public
+ constructor Create(AOwner: TMemPackedRecords);
+ destructor Destroy; override;
+ property isNull[Index: Integer]: Boolean read GetIsNull write SetIsNull;
+ property Values[Index: Integer]: Variant read GetValues write SetValues;
+ property ValuesByFieldName[AName: string]: Variant read GetValuesByFieldName write SetValuesByFieldName;
+ end;
+
+ TMemPackedRecords = class
+ private
+ fOwner: TDAMemoryDataset;
+ fList: TList;
+ function GetCount: Integer;
+ function GetItems(Index: Integer): TMemPackedRecord;
+ public
+ constructor Create(AOwner: TDAMemoryDataset);
+ destructor Destroy; override;
+ procedure Clear;
+ function Add: TMemPackedRecord;
+ procedure Delete(aIndex: integer);
+ property Items[Index: Integer]: TMemPackedRecord read GetItems;
+ property Count: Integer read GetCount;
+ end;
+ {$ENDIF MEM_PACKETRECORDS}
+
+{$IFDEF BDS4UP}{$ENDREGION}{$ENDIF BDS4UP}
+ TDAMemIndex = class
+ private
+ FOwner: TDAMemoryDataset;
+ FSortDescMode: Boolean;
+ FIndexCaseInsList: TList;
+ FIndexDescFields: TList;
+ FIndexFieldNameList: TList;
+ FDataList: TMemList;
+ FInitFromIndexDef: Boolean;
+ FLastSorted: TDateTime;
+ FIndexDef_Options: TIndexOptions;
+ FIndexDef_Fields: string;
+ FIndexDef_DescFields: string;
+ FIndexDef_CaseInsFields: String;
+ FInit_FieldNames: String;
+ FInit_CaseInsFields: String;
+ FInit_DescFields: String;
+ FUseFullList: Boolean;
+ procedure Init(const AFieldNames: string; const CaseInsFields: string = ''; const DescFields: string='');overload;
+ procedure Init(const Fields: string; CaseInsensitive, Descending: Boolean);overload;
+ procedure Init(AIndexDef: TIndexDef); overload;
+ function GetDataList: TMemList;
+ procedure Clear;
+ function IsValid: boolean;
+ procedure UpdateIndex(AIndexDef: TIndexDef);
+ function isCanUsed(const Fields: string; CaseInsensitive: Boolean): boolean;
+ property IndexFieldNameList: TList read FIndexFieldNameList;
+ property IndexCaseInsList: TList read FIndexCaseInsList;
+ property IndexDescFields: TList read FIndexDescFields;
+ property SortDescMode : Boolean read FSortDescMode;
+ property DataList: TMemList read GetDataList;
+ property LastSorted: TDateTime read FLastSorted write FLastSorted;
+ property UseFullList: Boolean read FUseFullList write FUseFullList;
+ public
+ constructor Create(AOwner: TDAMemoryDataset);
+ destructor Destroy; override;
+ end;
+
+ PMemLocateStruct = ^TMemLocateStruct;
+ TMemLocateStruct = record
+ lWorkList: TMemList;
+ lFields: TList;
+ lFieldIndexes: array of integer;
+ lOffsets: array of cardinal;
+ lValues: array of TDAValueStruct;
+ lDatatypes: array of TFieldType;
+ lnull: array of boolean;
+ ldesc: array of boolean;
+ lcaseIns: array of boolean;
+ end;
+
+ TmrMode = (mrEmpty, mrBin2Style, mrBin3Style);
+
+ {BitMask: AnsiChar;
+ offsetDataSize: byte;
+ case integer of
+ 1:( byteOffset: array [0..0] of byte);
+ 2:( WordOffset: array [0..0] of word);
+ 4:( CardinalOffset: array [0..0] of Cardinal);
+ }
+ PMemDatasetrecord_Native = ^TMemDatasetrecord_Native;
+ TMemDatasetrecord_Native = packed record
+ Ident: TmrMode;
+ Data: Dataset_PAnsiChar;
+ end;
+
+ PMemDatasetrecord = ^TMemDatasetrecord;
+ TMemDatasetrecord = packed record
+ Ident: TmrMode;
+ Data: Dataset_PAnsiChar;
+ BookmarkData: TRecInfo;
+ CalcData: byte;
+// FBookMarkOffset := FNativeRecordSize;
+// FCalculatedOffset := FBookMarkOffset + SizeOf(TRecInfo);
+// FDatasetBufferSize := FCalculatedOffset + CalcFieldsSize;
+ end;
+
+ TMemLocateCompare = function (buf1: pointer; aValue:TDAValueStruct; aDataType: TFieldType;aSortCaseInsensitive:Boolean; abin2: boolean): boolean of Object;
+ TDAMemDatasetCompare = function(p1, p2: PMemDatasetrecord_Native; AIndex: TDAMemIndex): Integer of object;
+ TDAMemDatasetGetIDCallback = function: integer of object;
+
+ PDACallbackRecord = ^TDACallbackRecord;
+ TDACallbackRecord = record
+ AppendMode: Boolean;
+ RecIDCallback: TDAMemDatasetGetIDCallback;
+ PK: string;
+ end;
+
+ TPostEditAction = (peaResort);
+ TPostEditActions = set of TPostEditAction;
+ { TDAMemoryDataset }
+ TDAMemoryDataset = class(TDataset)
+ private
+ FRecordsList: TThreadMemList;
+ FDataList: TMemList;
+ FRecordPos: integer;
+ FActive: Boolean;
+ FOffsets: TOffsetArray; // FOffset[0] = FNullMask
+ FDataSizeArray:TOffsetArray;
+ FNativeRecordSize: Cardinal;
+// FBookMarkOffset: Integer; // = FNativeRecordSize
+// FCalculatedOffset: Integer; // FBookMarkOffset + BookMark data size
+ FDatasetBufferSize: Cardinal; // FCalculatedOffset+ Calc fields size
+ FKeyBufferSize: cardinal; // SizeOf(TMemKeyBuffer) + FNativeRecordSize
+ FNullMaskSize: Cardinal;
+ FMasterDataLink: TMasterDataLink;
+ FFilterBuffer: Dataset_PAnsiChar;
+ FIndexName: string;
+ FDataTypeArray: array of TFieldType;
+ FStoreStringsAsReference: boolean;
+ FExpressionEvaluator: TDAExpressionEvaluator;
+ FExpressionBuffer: PMemDatasetrecord_Native;
+ {$IFDEF MSWINDOWS}
+ FSortLocale: LCID;
+ {$ENDIF MSWINDOWS}
+ FFieldsIndex: Boolean;
+ FIndexDefs: TIndexDefs;
+ FCloneSource: TDAMemoryDataset;
+ FCloneClientList:TThreadList;
+ FClonePermanentClientList:TThreadList;
+ FReadOnly: Boolean;
+ FDetailFields: string;
+ FDetailsFieldNameList: TList;
+ FRangeActive: boolean;
+ fUseIndexinLocate: Boolean;
+// FNeedRefreshIndexConditional: Boolean;
+{$IFDEF MEM_PACKETRECORDS}
+ fPackedMode: Boolean;
+{$ENDIF MEM_PACKETRECORDS}
+ FHasReferencedFields: boolean;
+ FLastUpdate: TDateTime;
+ f_DefaultIndexRecord: TDAMemIndex;
+ FIndexList: TList;
+ FAutoCompactRecords: Boolean;
+ FMemCloneSource: TDAMemoryDataset;
+ FAutoSort: Boolean;
+ FPostEditActions: TPostEditActions;
+ FFieldNoList: TStringList;
+ procedure ConvertBin3ToBin2Record(Buffer: PMemDatasetrecord_Native);
+ procedure ConvertBin2ToBin3Record(ASource : PMemDatasetrecord_Native);
+ function Bin2ToBin3(ASource: Dataset_PAnsiChar): Dataset_PAnsiChar;
+ function CalcFieldLen(aDataType: TFieldType; aSize: Integer): integer;
+ procedure CalculateOffsets;
+ procedure ClearRecords;
+ procedure ClearFieldByFieldType(FieldBuffer: pointer; ADataType: TFieldType);
+ procedure ClearBin2Field(Buffer: Dataset_PAnsiChar; AField: TField);
+ function IsReferencedField(ADataType: TFieldType):Boolean;
+ function GetNullMask(Buffer: Dataset_PAnsiChar; const AIndex: Integer): boolean;
+ function IntFindRecordID(Buf: pointer): Integer;
+ function GetActiveRecBuf(var RecBuf: Dataset_PAnsiChar): Boolean;
+ procedure InternalSetFieldData(Field: TField; Buffer: Pointer);
+ procedure IntAssignRecord(Source, Dest: PMemDatasetrecord_Native);
+ procedure SetBlobData(Field: TField; Buffer: PMemDatasetrecord_Native; Value: PBLOBRecord);
+ function GetMasterFields: string;
+ procedure SetDataSource(const Value: TDataSource);
+ procedure SetMasterFields(const Value: string);
+ function GetIndexFieldNames: string;
+ procedure SetIndexFieldNames(const Value: string);
+ function InternalGetRecord(Buffer: PMemDatasetRecord; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
+ procedure DoSort(AIndex: TDAMemIndex; AUseFullListForIndexes: boolean = False);
+ procedure QuickSort(L, R: Integer; SCompare: TDAMemDatasetCompare; AIndex: TDAMemIndex);
+ function Compare(i1, i2: PMemDatasetrecord_Native;AIndex: TDAMemIndex): Integer;
+ function CompareValues(buf1, buf2: pointer; aDataType: TFieldType;aSortCaseInsensitive:Boolean; aBin2_1, aBin2_2: Boolean): integer;
+ function CompareValues2(buf1: pointer; aValue: TDAValueStruct; aDataType: TFieldType;aSortCaseInsensitive:Boolean; aBin2: boolean): integer;
+ function CompareValues2_full(buf1: pointer; aValue: TDAValueStruct; aDataType: TFieldType;aSortCaseInsensitive:Boolean; abin2: boolean): boolean;
+ function CompareValues2_partial(buf1: pointer; aValue: TDAValueStruct; aDataType: TFieldType;aSortCaseInsensitive: Boolean; abin2: boolean): boolean;
+ function CompareValues_Range(buf: PMemDatasetrecord_Native; keybuffer: PMemKeyBuffer): integer;
+ procedure DoFilterRecords;
+ function ApplyMasterFilter: boolean;
+ procedure ApplyRangeFilter;
+ function FilterRecord(buf: PMemDatasetrecord_Native; AUseEvent: Boolean):Boolean;
+ procedure SetStoreStringAsReference(const Value: Boolean);
+ procedure EEGetValue(Sender: TDAExpressionEvaluator; const aIdentifier: string; out aValue: Variant);
+ function GetVarValueFromBuffer(Buffer: pointer; Field: TField;abin2: boolean):variant;
+ function IsActiveFilter: Boolean;
+ function GetIndexDefs: TIndexDefs;
+ procedure SetIndexDefs(const Value: TIndexDefs);
+ function GetIndexName: string;
+ procedure SetIndexName(const Value: string);
+ procedure SetIndex(const Value: string; FieldsIndex: Boolean);
+ procedure ValidateFieldForIndex(aField: TField);
+ function IntGetRecordList: TThreadMemList;
+ procedure RegisterClient(const AClient: TDAMemoryDataset);
+ procedure RegisterPermanentClient(const AClient: TDAMemoryDataset);
+ procedure UnregisterPermanentClient(const AClient: TDAMemoryDataset);
+ procedure RegisterPermanentClients;
+ procedure UnregisterClient(const AClient: TDAMemoryDataset);
+ procedure UnregisterAllClients;
+ procedure UnregisterPermanentClients;
+ procedure NotifyClients(Buf: PMemDatasetrecord_Native; Operation: TMemDataSetNotification; ASender: TDAMemoryDataset);
+ procedure RecordNotification(Buf: PMemDatasetrecord_Native; Operation: TMemDataSetNotification);
+ procedure IntInsertBuffer(Buffer: PMemDatasetrecord_Native; ASender: TDAMemoryDataset=nil);
+ procedure IntRemoveBuffer(Buffer: PMemDatasetrecord_Native; ASender: TDAMemoryDataset = nil);
+ procedure IntUpdateBuffer(Buffer: PMemDatasetrecord_Native; ASender: TDAMemoryDataset = nil);
+ procedure SetReadOnly(const Value: Boolean);
+ procedure SetDetailsFields(const Value: string);
+ procedure InitDetailFieldNamesList;
+ function GetIndexFields: string;
+ function internalGotoKey(const KeyBuffer: PMemKeyBuffer;isNearest: Boolean):Boolean;
+ procedure RefreshIndexConditional;
+ procedure MemList_ClearRecords(aMemList: TMemList);
+ procedure IndexList_Clear;
+ function LocateWithIndex(const LocateStruct: PMemLocateStruct; Buffer: PMemDatasetrecord): boolean;
+ procedure UpdateMemIndexes(AIndex: integer = -1);
+ procedure LocalBufferToDatasetBuffer(LocalBuf: PMemDatasetrecord_Native; DatasetBuffer: PMemDatasetrecord);
+ function LocateRecordByIndex(const aIndexName: string; const KeyValues: Variant; SyncCursor: Boolean): Boolean;overload;
+ function LocateRecordByIndex(const aIndex: Integer; const KeyValues: Variant; SyncCursor: Boolean): Boolean;overload;
+ function intLocateRecordByIndex(aIndex: TDAMemIndex; const KeyValues: Variant; SyncCursor: Boolean): Boolean;
+ procedure InitMemLocateStruct(AStruct: PMemLocateStruct; const KeyValues: Variant);
+ function CreateBin3Struct(const ASize:Cardinal): Dataset_PAnsiChar;
+ function GetBin3Offset(Buffer: Dataset_PAnsiChar;const aFieldNo:integer):cardinal;
+ Procedure FreeBin3Buffer(Buffer: Dataset_PAnsiChar);
+ procedure SetAutoPackRecords(const Value: boolean);
+ procedure SetCloneSource(const Value: TDAMemoryDataset);
+ Procedure AssignCloneSource(Source: TDAMemoryDataset);
+ procedure CheckforCircularLinks(ASource:TDataset; CheckForClone: Boolean);
+ procedure SetAutoSort(const Value: Boolean);
+ procedure IntAutoSort(ABuf : PMemDatasetrecord_Native; ANeedResync: Boolean);
+ function GetBin2FieldOffset(const aFieldNo:integer):cardinal;
+ function GetStoreStringsAsReference : Boolean;
+ function GetHasReferencedFields: Boolean;
+ private
+ { Set range }
+ FKeyBuffers: array[TMemKeyIndex] of PMemKeyBuffer;
+ FKeyBuffer: PMemKeyBuffer;
+ procedure AllocKeyBuffers;
+ procedure FreeKeyBuffers;
+ procedure SetKeyBuffer(KeyIndex: TMemKeyIndex; Clear: Boolean);
+ procedure SetKeyFields(KeyIndex: TMemKeyIndex; const Values: array of const);
+ function InitKeyBuffer(Buffer: PMemKeyBuffer): PMemKeyBuffer;
+ protected
+ function CreateMemDatasetRecord(const AType:TmrMode; ABin3Size: Cardinal = 0; ADatasetCompatible: Boolean =False):PMemDatasetrecord_Native;
+ procedure FreeMemDatasetRecord(Buffer: PMemDatasetrecord_Native);
+ procedure AttachToSource(const Source: TDAMemoryDataset);virtual;
+ procedure DetachFromSource; virtual;
+ function IsLoadingState: Boolean; virtual;
+
+ protected
+ // for IDAMemDatasetBatchAdding
+ procedure SetNullMask(Buffer: Dataset_PAnsiChar; const AIndex: Integer; const Value: boolean);
+ function IntFindFieldData(Buffer: PMemDatasetrecord_Native; Field: TField): Pointer; overload;
+ function IntFindFieldData(Buffer: Dataset_PAnsiChar; Field: TField; aBin2: Boolean): Pointer; overload;
+ function MakeBlobFromString(Blob: AnsiString):PBLOBRecord;
+ procedure SetAnsiString(NativeBuf: Pointer; Field: TField; const Value: Ansistring);
+ procedure SetWideString(NativeBuf: Pointer; Field: TField; const Value: Unicodestring);
+ procedure ProcessFilter;
+ procedure AddRecordsfromList(AList: TList; ACallbackRecord: PDACallbackRecord);
+ procedure ClearBin2Buffer(Buffer: Dataset_PAnsiChar);
+ Procedure FreeBin2Buffer(Buffer: Dataset_PAnsiChar);
+ function CreateBin2Struct: Dataset_PAnsiChar;
+ function GetFieldNo(aField: TField): integer;
+ protected
+ procedure DuplicateBuffer(Source, Dest: PMemDatasetrecord_Native; ACanPack:boolean);
+ procedure RecordToBuffer(RecNo: integer; Buffer: PMemDatasetRecord);
+ property MasterDataLink: TMasterDataLink read FMasterDataLink;
+ procedure MasterChanged(Sender: TObject); virtual;
+ procedure MasterDisabled(Sender: TObject); virtual;
+ function LocateRecord(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions; SyncCursor: Boolean): Boolean;
+ protected // tdataset
+ { IProviderSupport }
+ function PSGetIndexDefs(IndexTypes: TIndexOptions): TIndexDefs; {$IFNDEF FPC}override;{$ENDIF}
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ protected
+ procedure PostKeyBuffer(Commit: Boolean);
+ function GetIsIndexField(Field: TField): Boolean; override;
+ procedure DoOnNewRecord; override;
+ function GetRecord(Buffer: Dataset_PAnsiChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
+ procedure InternalClose; override;
+ procedure InternalHandleException; override;
+ procedure InternalInitFieldDefs; override;
+ procedure InternalOpen; override;
+ function IsCursorOpen: Boolean; override;
+ function AllocRecordBuffer: Dataset_PAnsiChar; override;
+ procedure FreeRecordBuffer(var Buffer: Dataset_PAnsiChar); override;
+ procedure GetBookmarkData(Buffer: Dataset_PAnsiChar; Data: Pointer); override;
+ function GetBookmarkFlag(Buffer: Dataset_PAnsiChar): TBookmarkFlag; override;
+ function GetRecordSize: Word; override;
+ procedure InternalAddRecord(Buffer: Pointer; Append: Boolean); override;
+ procedure InternalDelete; override;
+ procedure InternalFirst; override;
+ procedure InternalGotoBookmark(Bookmark: Pointer); override;
+ procedure InternalInitRecord(Buffer: Dataset_PAnsiChar); override;
+ procedure InternalLast; override;
+ procedure InternalPost; override;
+ procedure InternalSetToRecord(Buffer: Dataset_PAnsiChar); override;
+ procedure SetBookmarkFlag(Buffer: Dataset_PAnsiChar; Value: TBookmarkFlag); override;
+ procedure SetBookmarkData(Buffer: Dataset_PAnsiChar; Data: Pointer); override;
+ procedure SetFieldData(Field: TField; Buffer: Pointer); overload; override;
+ function GetRecordCount: Integer; override;
+ function GetRecNo: Integer; override;
+ procedure SetRecNo(Value: Integer); override;
+ procedure OpenCursor(InfoQuery: Boolean); override;
+ procedure DataConvert(Field: TField; Source, Dest: Pointer; ToNative: Boolean); override;
+ function GetDataSource: TDataSource; override;
+ procedure SetFiltered(Value: Boolean); override;
+ procedure SetFilterOptions(Value: TFilterOptions); override;
+ procedure SetFilterText(const Value: string); override;
+ procedure SetOnFilterRecord(const Value: TFilterRecordEvent); override;
+ procedure DoAfterOpen; override;
+ procedure DoAfterCancel; override;
+ procedure UpdateIndexDefs; override;
+ procedure DefChanged(Sender: TObject); {$IFNDEF FPC}override;{$ENDIF}
+ procedure intInsertRecord(Buf: PMemDatasetrecord_Native);
+ function GetCanModify: Boolean; override;
+ protected
+ procedure SwitchToIndex(const IndexName: string);
+ property RangeActive:boolean read FRangeActive;
+ public //from TDataset `
+ function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
+ function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
+// procedure GetDetailLinkFields(MasterFields, DetailFields: TList); {$IFNDEF FPC}override;{$ENDIF}
+ function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; override;
+ function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; override;
+ function LocateByIndex(const aIndexName: string; const KeyValues: Variant): Boolean;overload;
+ function LocateByIndex(const aIndex: integer; const KeyValues: Variant): Boolean;overload;
+ function LookupByIndex(const aIndexName: string; const KeyValues: Variant; const ResultFields: string): Variant;overload;
+ function LookupByIndex(const aIndex: integer; const KeyValues: Variant; const ResultFields: string): Variant;overload;
+ procedure PrepareIndexForSorting(const aIndexName: string = '');
+ function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer; override;
+ function BookmarkValid(Bookmark: TBookmark): Boolean; override;
+ {$IFNDEF MEMDATASET_DEBUG}
+ protected // postponed to .31
+ {$ENDIF MEMDATASET_DEBUG}
+ property UseIndexinLocate: Boolean read fUseIndexinLocate write fUseIndexinLocate;
+ procedure SortOnFields(AIndex: TDAMemIndex);overload;
+ Function CalculateRecordsSize: Cardinal;
+ procedure CompactRecords;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure SortOnFields(const Fields: string; CaseInsensitive: Boolean = False; Descending: Boolean = False);overload;
+ procedure SortOnFields(const Fields, CaseInsFields, DescFields: string);overload;
+ procedure SortOnFields;overload;
+ procedure GetIndexNames(List: TStrings);
+ procedure AddIndex(const Name, Fields: string; const DescFields: string = ''; const CaseInsFields: string = '');
+ procedure DeleteIndex(const Name: string);
+ procedure CloneCursor(Source: TDAMemoryDataset; Reset: Boolean; KeepSettings: Boolean = False); virtual;
+ property StoreStringAsReference: Boolean read FStoreStringsAsReference write SetStoreStringAsReference;
+ procedure Post; override;
+ procedure Cancel; override;
+ {$IFDEF MSWINDOWS}
+ property SortLocale: LCID read FSortLocale write FSortLocale;
+ {$ENDIF MSWINDOWS}
+ property AutoCompactRecords: boolean read FAutoCompactRecords write SetAutoPackRecords;
+{$IFDEF BDS4UP}{$REGION 'MEM_PACKETRECORDS'}{$ENDIF BDS4UP}
+{$IFDEF MEM_PACKETRECORDS}
+ // packed adding
+ protected
+ function GetPackedMode: Boolean;
+ procedure SetPackedMode(const Value: Boolean);
+ Property PackedMode: Boolean read GetPackedMode write SetPackedMode;
+ procedure PackedRecordListClear;
+ public
+ Procedure StartPackedMode;
+ Procedure CommitPackedMode;
+ Procedure CancelPackedMode;
+{$ENDIF MEM_PACKETRECORDS}
+{$IFDEF BDS4UP}{$ENDREGION}{$ENDIF BDS4UP}
+ public { Set range }
+ procedure ApplyRange;
+ procedure CancelRange;
+ procedure SetRange(const StartValues, EndValues: array of const);
+ procedure EditRangeEnd;
+ procedure EditRangeStart;
+ procedure SetRangeEnd;
+ procedure SetRangeStart;
+ //
+ procedure SetKey;
+ procedure EditKey;
+ function FindKey(const KeyValues: array of const): Boolean;
+ procedure FindNearest(const KeyValues: array of const);
+ function GotoKey: Boolean;
+ procedure GotoNearest;
+ published
+ property Active;
+ property FieldDefs;
+ property OnFilterRecord;
+ property IndexFieldNames: string read GetIndexFieldNames write SetIndexFieldNames;
+ property IndexName: string read GetIndexName write SetIndexName;
+ property IndexDefs: TIndexDefs read GetIndexDefs write SetIndexDefs;
+ property MasterFields: string read GetMasterFields write SetMasterFields;
+ property MasterSource: TDataSource read GetDataSource write SetDataSource;
+ property DetailFields: string read FDetailFields write SetDetailsFields;
+ property ReadOnly: Boolean read FReadOnly write SetReadOnly default False;
+ property Filter;
+ property Filtered;
+ property BeforeOpen;
+ property AfterOpen;
+ property BeforeClose;
+ property AfterClose;
+ property BeforeInsert;
+ property AfterInsert;
+ property BeforeEdit;
+ property AfterEdit;
+ property BeforePost;
+ property AfterPost;
+ property BeforeCancel;
+ property AfterCancel;
+ property BeforeDelete;
+ property AfterDelete;
+ property BeforeScroll;
+ property AfterScroll;
+ property BeforeRefresh;
+ property AfterRefresh;
+ property OnCalcFields;
+ property OnDeleteError;
+ property OnEditError;
+ property OnNewRecord;
+ property OnPostError;
+ property CloneSource: TDAMemoryDataset read FMemCloneSource write SetCloneSource;
+ property AutoSortRecords: Boolean read FAutoSort write SetAutoSort default False;
+ end;
+
+ TDABlobStream = class(TMemoryStream)
+ private
+ FField: TBlobField;
+ FDataSet: TDAMemoryDataset;
+ FBuffer: PMemDatasetrecord_Native;
+ FMode: TBlobStreamMode;
+ FOpened: Boolean;
+ FModified: Boolean;
+ FPosition: Longint;
+ FCached: Boolean;
+ function GetBlobSize: Longint;
+ procedure GetBLOBRecordFromRecord(Field: TField; out aLocked:Boolean; out blob_size: integer; out blob_data: pointer);
+ function GetBLOBRecordFromBuffer(Buffer: PMemDatasetrecord_Native; Field: TField; out blob_size: integer; out blob_data: pointer): PBLOBRecord;
+ procedure Truncate;
+ public
+ constructor Create(Field: TBlobField; Mode: TBlobStreamMode);
+ destructor Destroy; override;
+ function Read(var Buffer; Count: Longint): Longint; override;
+ function Write(const Buffer; Count: Longint): Longint; override;
+ function Seek(Offset: Longint; Origin: Word): Longint; override;
+ end;
+
+var
+ MaxStringSizeInline : integer = 4096;
+
+implementation
+uses
+ uROClasses, uROBinaryHelpers,
+ Variants, SysUtils,{$IFDEF FPC}dbconst,{$ELSE}DBConsts,{$ENDIF}
+ {$IFNDEF FPC}Forms, SqlTimSt,{$ENDIF} FMTBcd, RTLConsts, Math;
+
+const
+ guidsize = 38; { Length(GuidString) }
+
+resourcestring
+ SNoDetailFilter = 'Filter property cannot be used for detail tables';
+const
+ ft_Inline = [ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat,
+ ftCurrency, ftDate, ftTime, ftDateTime, ftAutoInc,
+ ftLargeint, {$IFNDEF FPC}ftTimeStamp,{$ENDIF} ftBCD, ftFMTBCD, ftGuid
+ {$IFDEF DELPHI2009UP},ftLongWord, ftShortint, ftByte, ftExtended{$ENDIF}
+ {$IFDEF DELPHI2010UP},ftSingle{$ENDIF}];
+ ft_BlobTypes = [ftBlob, ftMemo,{$IFDEF DA_WideMemoSupport}ftWideMemo,{$ENDIF DA_WideMemoSupport} ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftOraBlob, ftOraClob];
+ ft_Strings = [ftString, ftWideString,{$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport} ftFixedChar];
+ ft_AnsiStringValues = [ftString, ftFixedChar, {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}ftGuid];
+ ft_WideStringValues = [ftWideString];
+ ft_Supported = ft_Inline + ft_BlobTypes + ft_Strings;
+// ft_UnSupported = [ftADT, ftArray, ftReference, ftDataSet, ftBytes, ftVarBytes, ftCursor, ftInterface,ftIDispatch,ftOraTimeStamp, ftOraInterval,ftConnection,ftParams,ftStream] + [ftVariant];
+type
+ PCardinalArray = ^TCardinalArray;
+ TCardinalArray = array [0..MaxListSize - 1] of Cardinal;
+
+function CreateBlobRecord(ASize: cardinal = 0; AInit: Boolean = False): PBlobRecord;
+begin
+ {$IFDEF FPC}
+ Result := nil;
+ {$ENDIF FPC}
+ GetMem(Result, ASize + SizeOf(TBLOBRecord));
+ FillChar(Result^, sizeof(TBLOBRecord), 0);
+ Result.size:=ASize;
+ if AInit then FillChar(Result.Data, Asize, 0);
+end;
+
+procedure FreeBlobRecord(buf: Pointer);
+begin
+// if buf = nil then Exit;
+ FreeMem(buf);
+end;
+
+{ TMemList }
+
+destructor TMemList.Destroy;
+begin
+ Clear;
+end;
+
+function TMemList.Add(Item: Pointer): Integer;
+begin
+ Result := FCount;
+ if Result = FCapacity then Grow;
+ FList^[Result] := Item;
+ Inc(FCount);
+ FNeedRefresh:=True;
+end;
+
+procedure TMemList.Clear;
+begin
+ SetCount(0);
+ SetCapacity(0);
+ ReallocMem(FSortList,0);
+ FNeedRefresh:=True;
+end;
+
+procedure TMemList.Delete(Index: Integer);
+begin
+ if (Index < 0) or (Index >= FCount) then Error(@SListIndexError, Index);
+ Dec(FCount);
+ if Index < FCount then
+ System.Move(FList^[Index + 1], FList^[Index],(FCount - Index) * SizeOf(Pointer));
+ fNeedRefresh:=True;
+end;
+
+class procedure TMemList.Error(const Msg: string; Data: Integer);
+ {$IFNDEF FPC}
+ function ReturnAddr: Pointer;
+ asm
+ MOV EAX,[EBP+4]
+ end;
+ {$ENDIF}
+begin
+ raise EListError.CreateFmt(Msg, [Data]) at {$IFNDEF FPC}ReturnAddr{$ELSE}get_caller_addr(get_frame){$ENDIF};
+end;
+
+class procedure TMemList.Error(Msg: PResStringRec; Data: Integer);
+begin
+ TMemList.Error(LoadResString(Msg), Data);
+end;
+
+procedure TMemList.Exchange(Index1, Index2: Integer);
+var
+ Item: Pointer;
+begin
+ if (Index1 < 0) or (Index1 >= FCount) then Error(@SListIndexError, Index1);
+ if (Index2 < 0) or (Index2 >= FCount) then Error(@SListIndexError, Index2);
+ Item := FList^[Index1];
+ FList^[Index1] := FList^[Index2];
+ FList^[Index2] := Item;
+ FNeedRefresh:=True;
+end;
+
+function TMemList.Expand: TMemList;
+begin
+ if FCount = FCapacity then Grow;
+ Result := Self;
+end;
+
+function TMemList.First: Pointer;
+begin
+ Result := Get(0);
+end;
+
+function TMemList.Get(Index: Integer): Pointer;
+begin
+ if (Index < 0) or (Index >= FCount) then Error(@SListIndexError, Index);
+ Result := FList^[Index];
+end;
+
+procedure TMemList.Grow;
+var
+ Delta: Integer;
+begin
+ if FCapacity > 64 then
+ Delta := FCapacity div 4
+ else
+ if FCapacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetCapacity(FCapacity + Delta);
+end;
+
+function TMemList.IndexOf(Item: Pointer): Integer;
+begin
+ Sort;
+ Result := intIndexOf(Item);
+ if Result > -1 then Result:= FSortList^[Result].position;
+end;
+
+procedure TMemList.Insert(Index: Integer; Item: Pointer);
+begin
+ if (Index < 0) or (Index > FCount) then Error(@SListIndexError, Index);
+ if FCount = FCapacity then Grow;
+ if Index < FCount then
+ System.Move(FList^[Index], FList^[Index + 1], (FCount - Index) * SizeOf(Pointer));
+ FList^[Index] := Item;
+ Inc(FCount);
+ fNeedRefresh:=True;
+end;
+
+function TMemList.Last: Pointer;
+begin
+ Result := Get(FCount - 1);
+end;
+
+procedure TMemList.Move(CurIndex, NewIndex: Integer);
+var
+ Item: Pointer;
+begin
+ if CurIndex <> NewIndex then
+ begin
+ if (NewIndex < 0) or (NewIndex >= FCount) then Error(@SListIndexError, NewIndex);
+ Item := Get(CurIndex);
+ FList^[CurIndex] := nil;
+ Delete(CurIndex);
+ Insert(NewIndex, nil);
+ FList^[NewIndex] := Item;
+ FNeedRefresh:=True;
+ end;
+end;
+
+procedure TMemList.Put(Index: Integer; Item: Pointer);
+begin
+ if (Index < 0) or (Index >= FCount) then Error(@SListIndexError, Index);
+ if Item <> FList^[Index] then
+ begin
+ FList^[Index] := Item;
+ fNeedRefresh:=True;
+ end;
+end;
+
+function TMemList.Remove(Item: Pointer): Integer;
+begin
+ Result := IndexOf(Item);
+ if Result >= 0 then begin
+ Delete(Result);
+ FNeedRefresh:=True;
+ end
+end;
+
+procedure TMemList.Pack;
+var
+ I: Integer;
+begin
+ for I := FCount - 1 downto 0 do
+ if Items[I] = nil then
+ Delete(I);
+ FNeedRefresh:=True;
+end;
+
+procedure TMemList.SetCapacity(NewCapacity: Integer);
+begin
+ if (NewCapacity < FCount) or (NewCapacity > MaxListSize) then Error(@SListCapacityError, NewCapacity);
+ if NewCapacity <> FCapacity then
+ begin
+ ReallocMem(FList, NewCapacity * SizeOf(Pointer));
+ FCapacity := NewCapacity;
+ end;
+end;
+
+procedure TMemList.SetCount(NewCount: Integer);
+begin
+ if (NewCount < 0) or (NewCount > MaxListSize) then Error(@SListCountError, NewCount);
+ if NewCount > FCapacity then SetCapacity(NewCount);
+ if NewCount > FCount then FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0);
+ FCount := NewCount;
+ FNeedRefresh:=True;
+end;
+
+procedure TMemList.QuickSort(L, R: Integer);
+var
+ I, J, P : integer;
+ k: TSortRecord;
+begin
+ repeat
+ I := L;
+ J := R;
+ P := (L + R) shr 1;
+ repeat
+ while FSortList^[i].Data < FSortList^[P].Data do Inc(I);
+ while FSortList^[J].Data > FSortList^[P].Data do Dec(J);
+ if I <= J then
+ begin
+ k:= FSortList^[i];
+ FSortList^[i]:=FSortList^[j];
+ FSortList^[j]:=k;
+ if P = I then P := J
+ else if P = J then P := I;
+ Inc(I);
+ Dec(J);
+ end;
+ until I > J;
+ if L < J then QuickSort(L, J);
+ L := I;
+ until I >= R;
+end;
+
+procedure TMemList.Sort;
+var
+ i: integer;
+begin
+ if FNeedRefresh and (FList <> nil) and (Count > 0) then begin
+ ReallocMem(FSortList, Capacity * SizeOf(TSortRecord));
+ For i:=0 to Count -1 do begin
+ FSortList^[i].data:= FList^[I];
+ FSortList^[i].position:= i;
+ end;
+ QuickSort(0, Count - 1);
+ FNeedRefresh:=False;
+ end;
+end;
+
+function TMemList.Extract(Item: Pointer): Pointer;
+var
+ I: Integer;
+begin
+ Result := nil;
+ I := IndexOf(Item);
+ if I >= 0 then
+ begin
+ Result := Item;
+ FList^[I] := nil;
+ Delete(I);
+ end;
+end;
+
+
+procedure TMemList.Assign(ListA: TMemList; AOperator: TMemListAssignOp; ListB: TMemList);
+var
+ I: Integer;
+ LTemp, LSource: TMemList;
+begin
+ FNeedRefresh:=True;
+ // ListB given?
+ if ListB <> nil then
+ begin
+ LSource := ListB;
+ Assign(ListA);
+ end
+ else
+ LSource := ListA;
+
+ // on with the show
+ case AOperator of
+
+ // 12345, 346 = 346 : only those in the new list
+ mlaCopy:
+ begin
+ Clear;
+ Capacity := LSource.Capacity;
+ for I := 0 to LSource.Count - 1 do
+ Add(LSource[I]);
+ end;
+
+ // 12345, 346 = 34 : intersection of the two lists
+ mlaAnd:
+ for I := Count - 1 downto 0 do
+ if LSource.IndexOf(Items[I]) = -1 then
+ Delete(I);
+
+ // 12345, 346 = 123456 : union of the two lists
+ mlaOr:
+ for I := 0 to LSource.Count - 1 do
+ if IndexOf(LSource[I]) = -1 then
+ Add(LSource[I]);
+
+ // 12345, 346 = 1256 : only those not in both lists
+ mlaXor:
+ begin
+ LTemp := TMemList.Create; // Temp holder of 4 byte values
+ try
+ LTemp.Capacity := LSource.Count;
+ for I := 0 to LSource.Count - 1 do
+ if IndexOf(LSource[I]) = -1 then
+ LTemp.Add(LSource[I]);
+ for I := Count - 1 downto 0 do
+ if LSource.IndexOf(Items[I]) <> -1 then
+ Delete(I);
+ I := Count + LTemp.Count;
+ if Capacity < I then
+ Capacity := I;
+ for I := 0 to LTemp.Count - 1 do
+ Add(LTemp[I]);
+ finally
+ LTemp.Free;
+ end;
+ end;
+
+ // 12345, 346 = 125 : only those unique to source
+ mlaSrcUnique:
+ for I := Count - 1 downto 0 do
+ if LSource.IndexOf(Items[I]) <> -1 then
+ Delete(I);
+
+ // 12345, 346 = 6 : only those unique to dest
+ mlaDestUnique:
+ begin
+ LTemp := TMemList.Create;
+ try
+ LTemp.Capacity := LSource.Count;
+ for I := LSource.Count - 1 downto 0 do
+ if IndexOf(LSource[I]) = -1 then
+ LTemp.Add(LSource[I]);
+ Assign(LTemp);
+ finally
+ LTemp.Free;
+ end;
+ end;
+ end;
+end;
+
+function TMemList.intIndexOf(Item: PAnsiChar): Integer;
+var
+ L, H, I, C : integer;
+ Res : boolean;
+begin
+ Res := False;
+ L := 0;
+ H := FCount - 1;
+ while L <= H do
+ begin
+ I := (L + H) shr 1;
+ C := FSortList^[i].Data - Item;
+ if C < 0 then
+ L := I + 1
+ else
+ begin
+ H := I - 1;
+ if C = 0 then Res := True;
+ end;
+ end;
+ if Res then
+ Result := L
+ else
+ Result := -1;
+end;
+
+constructor TMemList.Create;
+begin
+ inherited;
+end;
+
+{ TDAMemoryDataset }
+
+function TDAMemoryDataset.AllocRecordBuffer: Dataset_PAnsiChar;
+begin
+ Result:= Dataset_PAnsiChar(CreateMemDatasetRecord(mrEmpty, 0, True));
+end;
+
+procedure TDAMemoryDataset.CalculateOffsets;
+var
+ i: integer;
+ lField: TField;
+ llen: cardinal;
+ k: integer;
+begin
+ if not FStoreStringsAsReference then begin
+ for i := 0 to FieldCount - 1 do
+ with Fields[i] do
+ if (DataType in ft_Strings) and (Size >= MaxStringSizeInline) then begin
+ FStoreStringsAsReference := True;
+ Break;
+ end;
+ end;
+ SetLength(FOffsets, FieldCount + 1);
+ SetLength(FDataSizeArray,FieldCount);
+ SetLength(FDataTypeArray,FieldCount);
+ // FOffsets[FieldCount+1] = BookMarkOffset
+ FNullMaskSize := (FieldCount + 7) div 8;
+ FOffsets[0] := FNullMaskSize; // = offset of 1st record
+ FHasReferencedFields := FStoreStringsAsReference;
+ FFieldNoList.Clear;
+ FFieldNoList.Sorted := False;
+ k := -1;
+ for i := 0 to FieldCount - 1 do begin
+ lField := Fields[i];
+ if lField.FieldNo = -1 then Continue;
+ inc(k);
+ FDataTypeArray[k]:=lField.DataType;
+ llen:=CalcFieldLen(lField.DataType,lField.Size);
+ FDataSizeArray[k] := llen;
+ FOffsets[k + 1] := FOffsets[k] + llen; // = offset of k+1 record
+ FHasReferencedFields := FHasReferencedFields or IsReferencedField(lField.DataType);
+ end;
+
+ for i := 0 to FieldCount - 1 do begin
+ lField := Fields[i];
+ if lField.FieldNo <> -1 then Continue;
+ inc(k);
+ FDataTypeArray[k]:=lField.DataType;
+ llen:=CalcFieldLen(lField.DataType,lField.Size);
+ FDataSizeArray[k] := llen;
+ FOffsets[k + 1] := FOffsets[k] + llen; // = offset of k+1 record
+ FHasReferencedFields := FHasReferencedFields or IsReferencedField(lField.DataType);
+ FFieldNoList.AddObject(lField.FieldName,pointer(k));
+ end;
+
+ FFieldNoList.Sorted := True;
+ FNativeRecordSize := FOffsets[FieldCount];
+
+ //
+
+// FBookMarkOffset := FNativeRecordSize;
+// FCalculatedOffset := FBookMarkOffset + SizeOf(TRecInfo);
+// FDatasetBufferSize := FCalculatedOffset + CalcFieldsSize;
+ FDatasetBufferSize := SizeOf(TMemDatasetrecord)+CalcFieldsSize;
+ FKeyBufferSize := SizeOf(TMemKeyBuffer) + FNativeRecordSize;
+end;
+
+procedure TDAMemoryDataset.ClearFieldByFieldType(FieldBuffer: pointer; ADataType: TFieldType);
+begin
+ case ADataType of
+ ftString, ftFixedChar: begin
+ PAnsiString(FieldBuffer)^ := '';
+ PPointer(FieldBuffer)^ := nil;
+ end;
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}
+ ftWideString: begin
+ PUnicodeString(FieldBuffer)^ := '';
+ PPointer(FieldBuffer)^ := nil;
+ end;
+ else
+ if ADataType in ft_BlobTypes then begin
+ FreeBlobRecord(PPointer(FieldBuffer)^);
+ PPointer(FieldBuffer)^ := nil;
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.ClearBin2Field(Buffer: Dataset_PAnsiChar; AField: TField);
+begin
+ if GetNullMask(Buffer, GetFieldNo(AField)) then Exit;
+ if IsReferencedField(AField.DataType) then
+ ClearFieldByFieldType(IntFindFieldData(Buffer, AField, True), AField.DataType);
+ SetNullMask(Buffer, GetFieldNo(AField), True);
+end;
+
+procedure TDAMemoryDataset.ClearRecords;
+var
+ aList: TMemList;
+begin
+ FDataList.Clear;
+{$IFDEF MEM_PACKETRECORDS}
+ PackedRecordListClear;
+{$ENDIF MEM_PACKETRECORDS}
+ UnregisterAllClients;
+ AList := FRecordsList.LockListForWriting;
+ try
+ MemList_ClearRecords(aList);
+ finally
+ FRecordsList.UnlockListForWriting;
+ end;
+end;
+
+constructor TDAMemoryDataset.Create(AOwner: TComponent);
+begin
+ inherited;
+{$IFDEF MEM_PACKETRECORDS}
+ fPackedMode := False;
+{$ENDIF MEM_PACKETRECORDS}
+ FRecordsList := TThreadMemList.Create;
+ FDataList := TMemList.Create;
+ FMasterDataLink := TMasterDataLink.Create(Self);
+ FMasterDataLink.OnMasterChange := MasterChanged;
+ FMasterDataLink.OnMasterDisable := MasterDisabled;
+ f_DefaultIndexRecord := TDAMemIndex.Create(Self);
+// FIndexFieldNameList := TList.Create;
+// FIndexCaseInsList := TList.Create;
+// FIndexDescFields := TList.Create;
+ FDetailsFieldNameList := TList.Create;
+
+ {$IFDEF MSWINDOWS}
+ FSortLocale := LOCALE_USER_DEFAULT;
+ {$ENDIF MSWINDOWS}
+ FStoreStringsAsReference:=False;
+ FExpressionEvaluator:= TDAStdExpressionEvaluator.Create;
+ FExpressionEvaluator.OnGetValue := EEGetValue;
+ FExpressionEvaluator.UseWildcardsInEqual:= True; // FilterOptions = []
+ FExpressionEvaluator.StringCaseInsensitive:= False; // FilterOptions = []
+ fUseIndexinLocate:=True;
+ FIndexList := TList.Create;
+ FAutoCompactRecords := False;
+ FAutoSort := False;
+ FPostEditActions := [];
+ FFieldNoList:= TStringList.Create;
+end;
+
+function TDAMemoryDataset.CreateBlobStream(Field: TField;
+ Mode: TBlobStreamMode): TStream;
+begin
+ Result := TDABlobStream.Create(TBlobField(Field), Mode);
+end;
+
+destructor TDAMemoryDataset.Destroy;
+begin
+ CloneSource := nil;
+ inherited;
+ UnregisterPermanentClients;
+ IndexList_Clear;
+ FDetailsFieldNameList.Free;
+ FExpressionEvaluator.Free;
+// FIndexFieldNameList.Free;
+// FIndexCaseInsList.Free;
+// FIndexDescFields.Free;
+ f_DefaultIndexRecord.Free;
+ FMasterDataLink.Free;
+ FIndexList.Free;
+ FDataList.Free;
+ FRecordsList.Free;
+ FIndexDefs.Free;
+ FFieldNoList.Free;
+ if FCloneClientList <> nil then FCloneClientList.Free;
+ if FClonePermanentClientList <> nil then FClonePermanentClientList.Free;
+end;
+
+procedure TDAMemoryDataset.DuplicateBuffer(Source, Dest: PMemDatasetrecord_Native;ACanPack:boolean);
+var
+ i: Cardinal;
+ p, p2: PBlobRecord;
+ lbin3: Dataset_PAnsiChar;
+begin
+{$IFDEF MEMDATASET_DEBUG}
+// if not ((Source.Ident in [mrEmpty..mrBin3Style]) and(Dest.Ident in [mrEmpty..mrBin3Style])) then DatabaseError('TDAMemoryDataset.DuplicateBuffer: Data are damaged');
+{$ENDIF MEMDATASET_DEBUG}
+ case Source.Ident of
+ mrEmpty: begin
+ case Dest.Ident of
+ mrEmpty :;
+ mrBin2Style: FreeBin2Buffer(Dest.Data);
+ mrBin3Style: FreeBin3Buffer(Dest.Data);
+ end;
+ Dest.Data := nil;
+ Dest.Ident := mrEmpty;
+ end;
+ mrBin3Style: begin
+ I := GetBin3Offset(Source.Data, FieldCount);
+ {$IFDEF USE_REALLOC}
+ case Dest.Ident of
+ mrEmpty : Dest.Data := CreateBin3Struct(i);
+ mrBin2Style: begin
+ ClearBin2Buffer(Dest.Data);
+ if i < FNativeRecordSize then begin
+ ReallocMem(Dest.Data,i);
+ end
+ else begin
+ FreeMem(Dest.Data);
+ Dest.Data := CreateBin3Struct(i);
+ end;
+ end;
+ mrBin3Style: begin
+ if i <= GetBin3Offset(Dest.Data, FieldCount) then begin
+ ReallocMem(Dest.Data,i)
+ end
+ else begin
+ FreeMem(Dest.Data);
+ Dest.Data := CreateBin3Struct(i);
+ end;
+ end;
+ end;
+ {$ELSE}
+ case Dest.Ident of
+ mrBin2Style: FreeBin2Buffer(Dest.Data);
+ mrBin3Style: FreeBin3Buffer(Dest.Data);
+ end;
+ Dest.Data := CreateBin3Struct(i);
+ {$ENDIF}
+ Move(pointer(Source.Data)^, pointer(Dest.Data)^, i);
+ Dest.Ident := mrBin3Style;
+ end;
+ mrBin2Style: begin
+ if Dest.Ident = mrBin3Style then FreeBin3Buffer(Dest.Data);
+ if ACanPack and FAutoCompactRecords then
+ lbin3 := Bin2ToBin3(Source.Data)
+ else
+ lbin3 := nil;
+ if lbin3 <> nil then begin
+ if Dest.Ident = mrBin2Style then FreeBin2Buffer(Dest.Data);
+ Dest.Ident := mrBin3Style;
+ Dest.Data := lbin3;
+ end
+ else begin
+ if Dest.Ident = mrBin2Style then
+ ClearBin2Buffer(Dest.Data)
+ else
+ Dest.Data := CreateBin2Struct;
+ Dest.Ident := mrBin2Style;
+ if not GetHasReferencedFields then begin
+ Move(pointer(Source.Data)^, pointer(Dest.Data)^, FNativeRecordSize);
+ end
+ else begin
+ Move(pointer(Source.Data)^, pointer(Dest.Data)^, FNullMaskSize);
+
+ for I := 0 to FieldCount - 1 do begin
+ if (not GetNullMask(Source.Data, i)) then begin
+ if not IsReferencedField(FDataTypeArray[i]) then begin
+ Move(pointer(Source.Data + FOffsets[i])^, pointer(Dest.Data + FOffsets[i])^, FDataSizeArray[i])
+ end
+ else begin
+ case FDataTypeArray[i] of
+ ftString,ftFixedChar: PAnsiString(Dest.Data + FOffsets[i])^ := PAnsiString(Source.Data + FOffsets[i])^;
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}
+ ftWideString: PUnicodeString(Dest.Data + FOffsets[i])^ := PUnicodeString(Source.Data + FOffsets[i])^;
+ else
+ if FDataTypeArray[i] in ft_BlobTypes then begin
+ p := PPointer(Source.Data + FOffsets[i])^;
+ if p <> nil then begin
+ p2 := CreateBlobRecord(PBlobRecord(p)^.size);
+ Move(pointer(p)^, pointer(p2)^, p^.size + SizeOf(TBlobRecord));
+ PPointer(Dest.Data + FOffsets[i])^ := p2;
+ end
+ else begin
+ SetNullMask(Dest.Data, i, True);
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.EEGetValue(Sender: TDAExpressionEvaluator; const aIdentifier: string; out aValue: Variant);
+var
+ lIdentifier: string;
+ lLen: integer;
+begin
+ lLen := Length(aIdentifier);
+ if (lLen >0) and (aIdentifier[1] = '[') and (aIdentifier[lLen] = ']') then
+ lIdentifier := Copy(aIdentifier, 2, lLen-2)
+ else
+ lIdentifier := aIdentifier;
+ aValue:= GetVarValueFromBuffer(FExpressionBuffer^.Data, FieldByName(lIdentifier), FExpressionBuffer^.Ident = mrBin2Style);
+end;
+
+procedure TDAMemoryDataset.ProcessFilter;
+begin
+ CheckBrowseMode;
+ DoFilterRecords;
+end;
+
+function TDAMemoryDataset.FilterRecord(buf: PMemDatasetrecord_Native; AUseEvent: Boolean): Boolean;
+begin
+ Result:=True;
+ if FRangeActive then begin
+ IntGetRecordList.LockListForReading;
+ try
+ Result := (CompareValues_Range(buf,FKeyBuffers[kiCurRangeStart]) >=0) and
+ (CompareValues_Range(buf,FKeyBuffers[kiCurRangeEnd]) <=0);
+ finally
+ IntGetRecordList.UnlockListForReading;
+ end;
+ end;
+ if Result and Filtered and (Filter <> '') then begin
+ IntGetRecordList.LockListForReading;
+ try
+ FExpressionBuffer:=buf;
+ Result := FExpressionEvaluator.Evaluate(Filter);
+ finally
+ IntGetRecordList.UnlockListForReading;
+ end;
+ end;
+ if Result and AUseEvent and Assigned(OnFilterRecord) then OnFilterRecord(Self, Result);
+end;
+
+procedure TDAMemoryDataset.FreeRecordBuffer(var Buffer: Dataset_PAnsiChar);
+begin
+ FreeMemDatasetRecord(pointer(Buffer));
+ Buffer := nil;
+end;
+
+function TDAMemoryDataset.GetActiveRecBuf(var RecBuf: Dataset_PAnsiChar): Boolean;
+begin
+ case State of
+ dsBrowse:
+ if IsEmpty then
+ RecBuf := nil
+ else
+ RecBuf := ActiveBuffer;
+ dsEdit, dsInsert, dsNewValue: RecBuf := ActiveBuffer;
+ dsCalcFields: RecBuf := CalcBuffer;
+ dsFilter: RecBuf := FFilterBuffer;
+ dsSetKey: RecBuf := Dataset_PAnsiChar(FKeyBuffer) + SizeOf(TMemKeyBuffer);
+ else
+ RecBuf := nil;
+ end;
+ Result := RecBuf <> nil;
+end;
+
+procedure TDAMemoryDataset.GetBookmarkData(Buffer: Dataset_PAnsiChar; Data: Pointer);
+begin
+ Move(PMemDatasetrecord(Buffer)^.BookmarkData.Bookmark, PBookmarkData(Data)^, SizeOf(TBookmarkData));
+end;
+
+function TDAMemoryDataset.GetBookmarkFlag(Buffer: Dataset_PAnsiChar): TBookmarkFlag;
+begin
+ Result := PMemDatasetrecord(Buffer)^.BookmarkData.BookmarkFlag;
+end;
+
+function TDAMemoryDataset.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
+var
+ RecBuf: Dataset_PAnsiChar;
+ Data: Dataset_PAnsiChar;
+ // VarData : Variant;
+ Len: integer;
+ k,k1: Cardinal;
+begin
+ Result := False;
+ {$IFDEF FPC}
+ RecBuf := nil;
+ {$ENDIF FPC}
+ if not GetActiveRecBuf(RecBuf) then Exit;
+ Result := (PMemDatasetrecord_Native(RecBuf)^.Ident in [mrBin2Style, mrBin3Style]) and
+ (Field.DataType in ft_Supported) and
+ not GetNullMask(PMemDatasetrecord_Native(RecBuf)^.Data, GetFieldNo(Field));
+ if Result and (Buffer <> nil) then begin
+ case PMemDatasetrecord_Native(RecBuf)^.Ident of
+ mrBin2Style: begin
+ Data := PMemDatasetrecord_Native(RecBuf)^.Data + FOffsets[GetFieldNo(Field)];
+ if Data = nil then begin
+ Result:=False;
+ Exit;
+ end;
+ {if Field.DataType = ftVariant then
+ begin
+ VarData := PVariant(Data)^;
+ PVariant(Buffer)^ := VarData;
+ end
+ else}
+ if not IsReferencedField(Field.DataType) then begin
+ Move(Data^, Buffer^, FDataSizeArray[GetFieldNo(Field)])
+ end else begin
+ case Field.DataType of
+ ftString,ftFixedChar: begin
+ len := Length(PAnsiString(Data)^);
+ if Len > Field.Size then Len := Field.Size;
+ Move(pointer(PAnsiString(Data)^)^, buffer^, len*SizeOf(AnsiChar));
+ PAnsiChar(buffer)[Len] := #0;
+ end;
+ ftWideString: begin
+ len := Length(PUnicodeString(Data)^);
+ if Len > Field.Size then Len := Field.Size;
+ Move(pointer(PUnicodeString(Data)^)^, buffer^, len * sizeOf(UnicodeChar));
+ PUnicodeChar(buffer)[Len] := #0;
+ end;
+ else
+ if Field.DataType in ft_BlobTypes then DatabaseError('GetFieldData: BlobType');
+ end;
+ end;
+ end;
+ mrBin3Style: begin
+ Data :=PMemDatasetrecord_Native(RecBuf)^.Data;
+ k := GetBin3Offset(Data,GetFieldNo(Field));
+ k1 := GetBin3Offset(Data,GetFieldNo(Field)+1);
+ Move((Data+k)^, buffer^, k1-k);
+ end;
+ end;
+ end;
+end;
+
+function TDAMemoryDataset.GetFieldNo(aField: TField): integer;
+begin
+ Result := aField.FieldNo-1;
+ if Result < 0 then begin
+ Result := FFieldNoList.IndexOf(aField.FieldName);
+ if Result <> -1 then Result := integer(FFieldNoList.Objects[Result]);
+ end;
+end;
+
+function TDAMemoryDataset.GetHasReferencedFields: Boolean;
+begin
+ if FCloneSource <> nil then
+ Result:= FCloneSource.FHasReferencedFields
+ else
+ Result:= FHasReferencedFields;
+end;
+
+function TDAMemoryDataset.GetRecNo: Integer;
+begin
+ UpdateCursorPos;
+ if (FRecordPos = -1) and (RecordCount > 0) then
+ Result := 1
+ else
+ Result := FRecordPos + 1;
+end;
+
+function TDAMemoryDataset.InternalGetRecord(Buffer: PMemDatasetRecord; GetMode: TGetMode;
+ DoCheck: Boolean): TGetResult;
+begin
+ if Buffer = nil then begin
+ Result := grError;
+ Exit;
+ end;
+
+ Result := grOk;
+ case GetMode of
+ gmCurrent: begin
+ if (FRecordPos = -1) and (RecordCount > 0) then FRecordPos := 0;
+ if (FRecordPos < 0) or (FRecordPos >= RecordCount) then Result := grError;
+ end;
+ gmPrior:
+ if FRecordPos <= 0 then begin
+ Result := grBOF;
+ FRecordPos := -1;
+ end
+ else
+ Dec(FRecordPos);
+ gmNext:
+ if FRecordPos >= RecordCount - 1 then
+ Result := grEOF
+ else
+ Inc(FRecordPos);
+ end;
+ if Result = grOk then begin
+ RecordToBuffer(FRecordPos, Buffer);
+ GetCalcFields(Dataset_PAnsiChar(Buffer));
+ end
+ else if (Result = grError) and DoCheck then
+ DatabaseError('No data found');
+end;
+
+function TDAMemoryDataset.GetRecordCount: Integer;
+begin
+ Result := FDataList.Count;
+end;
+
+function TDAMemoryDataset.GetRecordSize: Word;
+begin
+ Result := FDatasetBufferSize;
+end;
+
+function TDAMemoryDataset.GetStoreStringsAsReference: Boolean;
+begin
+ if FCloneSource <> nil then
+ Result:= FCloneSource.GetStoreStringsAsReference
+ else
+ Result := FStoreStringsAsReference;
+end;
+
+function TDAMemoryDataset.GetVarValueFromBuffer(Buffer: pointer; Field: TField; abin2: boolean): variant;
+var
+ buf: PAnsiChar;
+ p: pointer;
+ lLen: cardinal;
+begin
+ if GetNullMask(Buffer,GetFieldNo(Field)) then begin
+ Result := Null;
+ end
+ else begin
+ buf := IntFindFieldData(Buffer,Field,aBin2);
+ case Field.DataType of
+ ftString, ftFixedChar: begin
+ if abin2 and GetStoreStringsAsReference then
+ Result := PAnsistring(Buf)^
+ else
+ Result := Ansistring(PAnsiChar(Buf));
+ end;
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}
+ ftWideString: begin
+ if abin2 and GetStoreStringsAsReference then
+ Result := PUnicodestring(Buf)^
+ else
+ Result := UnicodeString(PUnicodeChar(Buf))
+ end;
+ ftSmallint: Result := PSmallint(buf)^;
+ ftInteger, ftDate, ftTime, ftAutoInc: Result := PInteger(buf)^;
+ ftWord: Result := PWord(buf)^;
+ ftBoolean: Result := PWordBool(buf)^;
+ ftFloat, ftCurrency: Result := PDouble(Buf)^;
+ ftDateTime: Result := TimeStampToDateTime(MSecsToTimeStamp({$IFDEF FPC}Trunc{$ENDIF}( PDateTime(Buf)^)));
+ ftBcd: Result := PCurrency(buf)^;
+ ftFMTBCD: Result := BCDToVariant(PBcd(buf)^);
+ ftLargeint: Result := PInt64(Buf)^;
+ {$IFNDEF FPC}
+ ftTimeStamp: Result := VarSQLTimeStampCreate(PSQLTimeStamp(Buf)^);
+ {$ENDIF FPC}
+ ftGuid: Result:= AnsiString(PAnsiChar(Buf));
+ {$IFDEF DELPHI2009UP}
+ ftLongWord: Result := PLongWord(Buf)^;
+ ftShortint: Result := PShortInt(Buf)^;
+ ftByte: Result := PByte(Buf)^;
+ ftExtended: Result := PExtended(Buf)^;
+ {$ENDIF}
+ {$IFDEF DELPHI2010UP}
+ ftSingle: Result := PSingle(Buf)^;
+ {$ENDIF}
+
+ else
+ if abin2 then
+ lLen:=PBLOBRecord(buf)^.size
+ else
+ lLen := GetBin3Offset(Buffer, GetFieldNo(Field)+1)-GetBin3Offset(Buffer, GetFieldNo(Field));
+ Result := VarArrayCreate([0,lLen-1],varByte);
+ p := VarArrayLock(Result);
+ try
+ if abin2 then
+ move(PBLOBRecord(buf)^.Data, p^,PBLOBRecord(buf)^.size)
+ else
+ Move(buf^, p^, lLen);
+ finally
+ VarArrayUnlock(Result);
+ end;
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.IntAssignRecord(Source, Dest: PMemDatasetrecord_Native);
+begin
+ if State = dsFilter then DatabaseError(SNotEditing);
+ DuplicateBuffer(Source, Dest,True);
+end;
+
+
+procedure TDAMemoryDataset.InternalAddRecord(Buffer: Pointer; Append: Boolean);
+var
+ RecPos: Integer;
+ Rec: PMemDatasetrecord_Native;
+begin
+ Rec := CreateMemDatasetRecord(mrEmpty,0,False);
+ if Append then
+ RecPos := FDataList.Add(Rec)
+ else begin
+ if FRecordPos = -1 then
+ RecPos := 0
+ else
+ RecPos := FRecordPos;
+ FDataList.Insert(RecNo, Rec);
+ end;
+ FRecordPos := RecPos;
+ // SetAutoIncFields(Buffer);
+ IntAssignRecord(Buffer, Rec);
+ IntInsertBuffer(Rec);
+end;
+
+procedure TDAMemoryDataset.InternalClose;
+var
+ i: integer;
+begin
+ f_DefaultIndexRecord.Clear;
+ For i:=0 to FIndexList.Count-1 do
+ TDAMemIndex(FIndexList[i]).Clear;
+
+// FIndexFieldNameList.Clear;
+// FIndexCaseInsList.Clear;
+// FIndexDescFields.Clear;
+ UnregisterClient(Self);
+ UnregisterPermanentClients;
+ ClearRecords;
+ FreeKeyBuffers;
+ FCloneSource := nil;
+ BindFields(False);
+ if DefaultFields then DestroyFields;
+ SetLength(FDataTypeArray,0);
+ SetLength(FOffsets, 0);
+ SetLength(FDataSizeArray,0);
+ FActive := False;
+end;
+
+procedure TDAMemoryDataset.InternalDelete;
+var
+ f: boolean;
+begin
+ IntRemoveBuffer(FDataList.Items[FRecordPos]);
+ f := f_DefaultIndexRecord.LastSorted > FLastUpdate;
+ FLastUpdate := Now;
+ if f then f_DefaultIndexRecord.LastSorted :=Now;
+end;
+
+procedure TDAMemoryDataset.InternalFirst;
+begin
+ FRecordPos := -1;
+end;
+
+procedure TDAMemoryDataset.InternalGotoBookmark(Bookmark: Pointer);
+var
+ lRecNo: Integer;
+begin
+ lRecNo := IntFindRecordID(PBookMarkData(Bookmark)^);
+ if lRecNo <> -1 then
+ FRecordPos := lRecNo
+ else
+ DatabaseError('Bookmark not found');
+end;
+
+procedure TDAMemoryDataset.InternalHandleException;
+begin
+ {$IFDEF FPC}
+ inherited;
+ {$ELSE}
+ Application.HandleException(Self);
+ {$ENDIF}
+end;
+
+procedure TDAMemoryDataset.InternalInitFieldDefs;
+begin
+ // inherited InternalInitFieldDefs;
+end;
+
+procedure TDAMemoryDataset.InternalInitRecord(Buffer: Dataset_PAnsiChar);
+begin
+ with PMemDatasetrecord_Native(Buffer)^ do begin
+ case Ident of
+ mrEmpty:;
+ mrBin2Style: FreeBin2Buffer(Data);
+ mrBin3Style: FreeBin3Buffer(Data);
+ end;
+ Ident := mrEmpty;
+ Data := nil;
+ end;
+end;
+
+procedure TDAMemoryDataset.InternalLast;
+begin
+ FRecordPos := RecordCount;
+end;
+
+procedure TDAMemoryDataset.InternalOpen;
+begin
+ BookmarkSize := SizeOf(TBookmarkData);
+ FieldDefs.Update;
+ IndexDefs.Updated := False;
+ if DefaultFields then CreateFields;
+ BindFields(True);
+ CalculateOffsets;
+ RegisterClient(Self);
+ RegisterPermanentClients;
+ AllocKeyBuffers;
+ FLastUpdate:=Now;
+ if FDetailFields <> '' then InitDetailFieldNamesList;
+ if FIndexName <> '' then f_DefaultIndexRecord.Init(GetIndexFields);
+ DoFilterRecords;
+ InternalFirst;
+end;
+
+procedure TDAMemoryDataset.InternalPost;
+var
+ Rec: Pointer;
+begin
+{$IFDEF DELPHI6UP}
+ inherited InternalPost;
+{$ENDIF}
+ if State = dsEdit then begin
+ Rec:=FDataList[FRecordPos];
+ IntGetRecordList.LockListForWriting;
+ try
+ IntAssignRecord(pointer(ActiveBuffer), Rec);
+ finally
+ IntGetRecordList.UnlockListForWriting;
+ end;
+ IntUpdateBuffer(Rec);
+ end
+ else begin
+ // if State in [dsInsert] then SetAutoIncFields(ActiveBuffer);
+ Rec := CreateMemDatasetRecord(mrEmpty,0,False);
+ IntAssignRecord(Pointer(ActiveBuffer), Rec);
+ intInsertRecord(Rec);
+ IntInsertBuffer(Rec);
+ end;
+ FLastUpdate := now;
+end;
+
+procedure TDAMemoryDataset.InternalSetFieldData(Field: TField; Buffer: Pointer);
+var
+ RecBuf: Dataset_PAnsiChar;
+ Data: PAnsiChar;
+ nativeData: Dataset_PAnsiChar;
+begin
+ {$IFDEF FPC}
+ RecBuf := nil;
+ {$ENDIF FPC}
+ GetActiveRecBuf(RecBuf);
+ with Field do begin
+ if State = dsSetKey then
+ nativeData := RecBuf
+ else begin
+ ConvertBin3ToBin2Record(PMemDatasetrecord_Native(RecBuf));
+ nativeData := PMemDatasetrecord_Native(RecBuf)^.Data;
+ end;
+ Data := IntFindFieldData(nativeData, Field, True);
+ if Data <> nil then begin
+ {
+ if DataType = ftVariant then begin
+ if Buffer <> nil then
+ VarData := PVariant(Buffer)^
+ else
+ VarData := EmptyParam;
+ PVariant(Data)^ := VarData;
+ end else
+ }
+ if not IsReferencedField(Field.DataType) then begin
+ if Buffer <> nil then begin
+ Move(Buffer^, Data^, FDataSizeArray[GetFieldNo(Field)]);
+ SetNullMask(nativeData, GetFieldNo(Field), False);
+ end
+ else
+ SetNullMask(nativeData, GetFieldNo(Field), True);
+ end
+ else begin
+ if Buffer <> nil then begin
+ if Field.DataType in [ftString,ftFixedChar] then begin
+ PAnsiString(Data)^ := PAnsiChar(buffer);
+ SetNullMask(nativeData, GetFieldNo(Field), False);
+ end
+ else if Field.DataType in [{$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}ftWideString] then begin
+ PUnicodeString(Data)^ := PUnicodeChar(buffer);
+ SetNullMask(nativeData, GetFieldNo(Field), False);
+ end;
+ end
+ else
+ SetNullMask(nativeData, GetFieldNo(Field), True);
+ end;
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.InternalSetToRecord(Buffer: Dataset_PAnsiChar);
+begin
+ InternalGotoBookmark(@PMemDatasetRecord(Buffer)^.BookmarkData.Bookmark);
+end;
+
+function TDAMemoryDataset.IntFindFieldData(Buffer: Dataset_PAnsiChar;
+ Field: TField; aBin2: Boolean): Pointer;
+begin
+ if (Buffer <> nil) and (Field.DataType in ft_Supported) then begin
+ if aBin2 then
+ Result := (Buffer + FOffsets[GetFieldNo(Field)])
+ else
+ Result := Buffer + GetBin3Offset(Buffer,GetFieldNo(Field));
+ end
+ else
+ Result := nil;
+end;
+
+function TDAMemoryDataset.IntFindFieldData(Buffer: PMemDatasetrecord_Native;Field: TField): Pointer;
+begin
+ if (Buffer <> nil) then
+ Result := IntFindFieldData(Buffer^.Data,Field, Buffer^.Ident = mrBin2Style)
+ else
+ Result := nil;
+end;
+
+function TDAMemoryDataset.IntFindRecordID(Buf: pointer): Integer;
+begin
+ Result := FDataList.IndexOf(Buf);
+end;
+
+function TDAMemoryDataset.IsActiveFilter: Boolean;
+begin
+ Result := (Filtered and ((Filter <> '') or Assigned(OnFilterRecord))) or FRangeActive;
+end;
+
+function TDAMemoryDataset.IsCursorOpen: Boolean;
+begin
+ Result := FActive;
+end;
+
+function TDAMemoryDataset.IsReferencedField(ADataType: TFieldType): Boolean;
+begin
+ Result:= (ADataType in ft_BlobTypes) or ((ADataType in ft_Strings) and GetStoreStringsAsReference);
+end;
+
+procedure TDAMemoryDataset.OpenCursor(InfoQuery: Boolean);
+var
+ i: integer;
+ lfld, lfld2: TField;
+begin
+ if not InfoQuery then begin
+ if (FMemCloneSource <> nil) and (FCloneSource = nil) then begin
+ if FMemCloneSource <> nil then FMemCloneSource.Open;
+ FMemCloneSource.RegisterClient(Self);
+ end;
+ if FCloneSource <> nil then begin
+ Fields.Clear;
+ // creating
+ FieldDefs.Assign(FCloneSource.FieldDefs);
+ for i:=0 to FieldDefs.Count-1 do
+ FieldDefs[i].CreateField(Self).DataSet := Self;
+ // creating lookups
+ For i:=0 to FCloneSource.Fields.Count-1 do begin
+ lfld2 := FCloneSource.Fields[i];
+ if lfld2.FieldKind in [fkCalculated,fkLookup] then begin
+ lfld := TField(lfld2.NewInstance).Create(Self);
+ lfld.Name := Self.Name + lfld2.FieldName;
+ lfld.FieldName := lfld2.FieldName;
+ lfld.DataSet := Self;
+ if (lfld2 is TStringField) or (lfld2 is TWideStringField) then lfld.Size := lfld2.Size;
+ lfld.FieldKind := lfld2.FieldKind;
+ lfld.Required := lfld2.Required;
+ {$IFNDEF FPC}
+ lfld.Lookup := lfld2.Lookup;
+ {$ENDIF}
+ lfld.LookupDataSet := lfld2.LookupDataSet;
+ lfld.LookupKeyFields := lfld2.LookupKeyFields;
+ lfld.LookupCache := lfld2.LookupCache;
+ lfld.LookupResultField := lfld2.LookupResultField;
+ lfld.KeyFields := lfld2.KeyFields;
+ end;
+ end;
+ for i := 0 to FCloneSource.Fields.Count-1 do
+ FieldByName(FCloneSource.Fields[i].FieldName).Index := i + 1;
+ end
+ else begin
+ if FieldCount > 0 then FieldDefs.Clear;
+ InitFieldDefsFromFields;
+ end;
+ FExpressionEvaluator.UseTrueFalseinVariableName:=False;
+ For i:=0 to Fields.Count-1 do begin
+ // eugene: 20080407 - SameText
+ if SameText(Fields[i].FieldName,'True') or SameText(Fields[i].FieldName,'False') then begin
+ FExpressionEvaluator.UseTrueFalseinVariableName:=True;
+ Break;
+ end;
+ end;
+ end;
+ FActive := True;
+ inherited OpenCursor(InfoQuery);
+end;
+
+function TDAMemoryDataset.GetNullMask(Buffer: Dataset_PAnsiChar; const AIndex: Integer): boolean;
+begin
+ Result := (ord(Buffer[AIndex shr 3]) shr (AIndex and 7)) and 1 = 1;
+end;
+
+procedure TDAMemoryDataset.RecordToBuffer(RecNo: integer; Buffer: PMemDatasetRecord);
+begin
+ IntGetRecordList.LockListForReading;
+ try
+ with Buffer^.BookmarkData do begin
+ Bookmark := TBookmarkData(FDataList[RecNo]);
+ BookmarkFlag := bfCurrent;
+ end;
+ DuplicateBuffer(FDataList[RecNo], Pointer(Buffer),False);
+ finally
+ IntGetRecordList.UnlockListForReading;
+ end;
+end;
+
+procedure TDAMemoryDataset.SetAnsiString(NativeBuf: Pointer; Field: TField;
+ const Value: Ansistring);
+var
+ len: integer;
+begin
+ if GetStoreStringsAsReference then
+ PAnsiString(NativeBuf)^:=Value
+ else begin
+ len := Length(Value);
+ if Len > Field.Size then len:= Field.Size;
+ move(Pointer(Value)^,NativeBuf^,len*SizeOf(AnsiChar));
+ PAnsiChar(NativeBuf)[len]:=#0;
+ end;
+end;
+
+procedure TDAMemoryDataset.SetBlobData(Field: TField; Buffer: PMemDatasetrecord_Native;
+ Value: PBLOBRecord);
+begin
+ ConvertBin3ToBin2Record(Buffer);
+ if PPointer(Buffer.Data + FOffsets[GetFieldNo(Field)])^ <> Value then begin
+ PPointer(Buffer.Data + FOffsets[GetFieldNo(Field)])^ := Value;
+ SetNullMask(Buffer.Data, GetFieldNo(Field), False);
+ end;
+end;
+
+procedure TDAMemoryDataset.SetBookmarkData(Buffer: Dataset_PAnsiChar; Data: Pointer);
+begin
+ Move(Data^, PMemDatasetRecord(Buffer)^.BookmarkData.Bookmark, SizeOf(TBookmarkData));
+end;
+
+procedure TDAMemoryDataset.SetBookmarkFlag(Buffer: Dataset_PAnsiChar; Value: TBookmarkFlag);
+begin
+ PMemDatasetRecord(Buffer)^.BookmarkData.BookmarkFlag := Value;
+end;
+
+procedure TDAMemoryDataset.SetFieldData(Field: TField; Buffer: Pointer);
+begin
+ if (State = dsSetKey) and ((Field.FieldNo < 0) or f_DefaultIndexRecord.IsValid and not Field.IsIndexField) then DatabaseErrorFmt(SNotIndexField, [Field.DisplayName]);
+ if not (State in dsWriteModes) then DatabaseError(SNotEditing);
+ with Field do begin
+ if FieldNo > 0 then begin
+ if State in [dsCalcFields, dsFilter] then DatabaseError(SNotEditing);
+ if ReadOnly and not (State in [dsSetKey, dsFilter]) then DatabaseErrorFmt({$IFDEF FPC}SReadOnlyField{$ELSE}SFieldReadOnly{$ENDIF}, [DisplayName]);
+ Validate(Buffer);
+ end;
+ if FieldKind <> fkInternalCalc then begin
+ InternalSetFieldData(Field, Buffer);
+ end;
+ if not (State in [dsCalcFields, dsInternalCalc, dsFilter, dsNewValue]) then DataEvent(deFieldChange, Longint(Field));
+ end;
+end;
+
+procedure TDAMemoryDataset.SetNullMask(Buffer: Dataset_PAnsiChar; const AIndex: Integer; const Value: boolean);
+var
+ i: byte;
+begin
+ i := AIndex shr 3;
+ if Value then
+ Buffer[I] := {$IFNDEF DELPHI2009UP}AnsiChar{$ENDIF}(ord(Buffer[I]) or (1 shl (AIndex and 7)))
+ else
+ Buffer[I] := {$IFNDEF DELPHI2009UP}AnsiChar{$ENDIF}(ord(Buffer[I]) and not (1 shl (AIndex and 7)))
+end;
+
+procedure TDAMemoryDataset.SetOnFilterRecord(const Value: TFilterRecordEvent);
+begin
+ inherited;
+ if Active and Filtered then First;
+end;
+
+procedure TDAMemoryDataset.SetRecNo(Value: Integer);
+begin
+ if (Value > 0) and (Value <= RecordCount) then begin
+ DoBeforeScroll;
+ FRecordPos := Value - 1;
+ Resync([]);
+ DoAfterScroll;
+ end;
+end;
+
+procedure TDAMemoryDataset.DataConvert(Field: TField; Source,
+ Dest: Pointer; ToNative: Boolean);
+{$IFNDEF DELPHI10UP}
+var
+ len: integer;
+{$ENDIF DELPHI10UP}
+begin
+ Case Field.Datatype of
+ ftBCD: PCurrency(Dest)^ := PCurrency(Source)^;
+{$IFNDEF FPC}
+{$IFNDEF DELPHI10UP}
+ ftWideString: begin
+ if ToNative then begin
+ len := Length(PUnicodeString(Source)^);
+ Move(PUnicodeChar(Source^)^, PUnicodeChar(Dest)^, len * SizeOf(UnicodeChar));
+ PUnicodeChar(Dest)[Len] := #0;
+ end
+ else begin
+ len := Length(PUnicodeChar(Source));
+ SetString(UnicodeString(Dest^), PUnicodeChar(Source), Len);
+ end;
+ end
+{$ENDIF}
+{$ENDIF}
+ else
+ inherited DataConvert(Field, Source, Dest, ToNative);
+ end;
+end;
+
+function TDAMemoryDataset.GetDataSource: TDataSource;
+begin
+ Result := MasterDataLink.DataSource;
+end;
+
+function TDAMemoryDataset.GetMasterFields: string;
+begin
+ Result := MasterDataLink.FieldNames;
+end;
+
+{$IFDEF FPC}
+const
+ SCircularDataLink = 'Circular datalinks are not allowed';
+{$ENDIF}
+
+procedure TDAMemoryDataset.SetDataSource(const Value: TDataSource);
+begin
+ if Value <> MasterDataLink.DataSource then begin
+ if (Value <> nil) and (Value.DataSet <> nil) then CheckforCircularLinks(Value.DataSet, False);
+ if IsLinkedTo(Value) then DatabaseError(SCircularDataLink, Self);
+ DataEvent(dePropertyChange, 0);
+ MasterDataLink.DataSource := Value;
+ end;
+end;
+
+procedure TDAMemoryDataset.SetMasterFields(const Value: string);
+begin
+ if (Value <> '') and (Filter <> '') then DatabaseError(SNoDetailFilter, Self);
+ if MasterDataLink.FieldNames <> Value then DataEvent(dePropertyChange, 0);
+ MasterDataLink.FieldNames := Value;
+end;
+
+function TDAMemoryDataset.GetIndexFieldNames: string;
+begin
+ if FFieldsIndex then Result := FIndexName else Result := '';
+end;
+
+procedure TDAMemoryDataset.SetIndexFieldNames(const Value: string);
+begin
+ SetIndex(Value, True);
+end;
+
+function TDAMemoryDataset.GetRecord(Buffer: Dataset_PAnsiChar; GetMode: TGetMode;
+ DoCheck: Boolean): TGetResult;
+var
+ Accept: Boolean;
+ SaveState: TDataSetState;
+begin
+ if Filtered and Assigned(OnFilterRecord) then begin
+ FFilterBuffer := Buffer;
+ SaveState := SetTempState(dsFilter);
+ try
+ Accept := True;
+ repeat
+ Result := InternalGetRecord(Pointer(Buffer), GetMode, DoCheck);
+ if Result = grOK then begin
+ OnFilterRecord(Self, Accept);
+ if not Accept and (GetMode = gmCurrent) then
+ Result := grError;
+ end;
+ until Accept or (Result <> grOK);
+ except
+ ApplicationHandleException(Self);
+ Result := grError;
+ end;
+ RestoreState(SaveState);
+ end else
+ Result := InternalGetRecord(Pointer(Buffer), GetMode, DoCheck)
+end;
+
+procedure TDAMemoryDataset.SetFiltered(Value: Boolean);
+begin
+ if Active and (Value <> Filtered) then begin
+ inherited;
+ if (Filter <> '') then
+ ProcessFilter
+ else if Assigned(OnFilterRecord) then First;
+ end
+ else
+ inherited;
+end;
+
+procedure TDAMemoryDataset.SetFilterOptions(Value: TFilterOptions);
+begin
+ if (Value <> FilterOptions) then begin
+ inherited;
+ FExpressionEvaluator.StringCaseInsensitive := foCaseInsensitive in FilterOptions;
+ FExpressionEvaluator.UseWildcardsInEqual := not (foNoPartialCompare in FilterOptions);
+ if Active and Filtered then ProcessFilter;
+ end;
+end;
+
+procedure TDAMemoryDataset.SetFilterText(const Value: string);
+begin
+ if Active and Filtered and (Value <> Filter) then begin
+ inherited;
+ ProcessFilter;
+ end
+ else
+ inherited;
+end;
+
+procedure TDAMemoryDataset.DoSort(AIndex: TDAMemIndex; AUseFullListForIndexes: boolean = False);
+var
+ pos: TBookmarkData;
+ lRecList:TThreadMemList;
+ LList:TMemList;
+ lflag: boolean;
+ loldRangeActive: Boolean;
+begin
+ if Active and (FieldCount > 0) and (FDataList.Count <> 0) then begin
+ if AIndex = f_DefaultIndexRecord then begin
+{$IFDEF MEMDATASET_DEBUG}
+OutputDebugString(Pchar('TDAMemoryDataset.DoSort'));
+{$ENDIF}
+ loldRangeActive := FRangeActive;
+ FRangeActive := False;
+ try
+ if (FRecordPos<>-1) and (FRecordPos < FDataList.Count) then
+ pos := FDataList[FRecordPos]
+ else
+ pos := nil;
+ try
+ lRecList:=IntGetRecordList;
+ LList:=lRecList.LockListForReading;
+ try
+ lflag:=(not AIndex.IsValid) and (FDataList.Count = LList.Count);
+ if lFlag then
+ FDataList.Assign(LList)
+ else begin
+ QuickSort(0, FDataList.Count - 1, Compare, AIndex);
+ end;
+ finally
+ lRecList.UnlockListForReading;
+ end;
+ AIndex.LastSorted := Now;
+ SetBufListSize(0);
+ try
+ SetBufListSize(BufferCount + 1);
+ except
+ SetState(dsInactive);
+ CloseCursor;
+ raise;
+ end;
+ {$IFDEF FPC}
+ RecalcBufListSize;
+ {$ENDIF}
+ finally
+ if pos = nil then
+ FRecordPos := -1
+ else
+ FRecordPos := IntFindRecordID(pos);
+ if (FRecordPos = -1) and (RecordCount > 0) then FRecordPos := 0;
+ end;
+ finally
+ FRangeActive := loldRangeActive;
+ end;
+ Resync([]);
+ end
+ else begin
+ if AIndex.IsValid then begin
+ if (FLastUpdate > AIndex.LastSorted) or (AUseFullListForIndexes <> AIndex.UseFullList) then begin
+ if AUseFullListForIndexes then begin
+ lRecList:=IntGetRecordList;
+ LList:=lRecList.LockListForReading;
+ try
+ AIndex.DataList.Assign(LList);
+ QuickSort(0, FDataList.Count - 1, Compare, AIndex);
+ finally
+ lRecList.UnlockListForReading;
+ end;
+ end
+ else begin
+ AIndex.DataList.Assign(FDataList);
+ QuickSort(0, AIndex.DataList.Count - 1, Compare, AIndex);
+ end;
+ AIndex.LastSorted := Now;
+ AIndex.UseFullList := AUseFullListForIndexes;
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.QuickSort(L, R: Integer; SCompare: TDAMemDatasetCompare;AIndex: TDAMemIndex);
+var
+ I, J: Integer;
+ P: pointer;
+ llist: TMemList;
+begin
+ if AIndex.DataList.Count < 2 then Exit;
+ lList := AIndex.DataList;
+ repeat
+ I := L;
+ J := R;
+ P := lList[(L + R) shr 1];
+ repeat
+ while SCompare(lList[I], P, AIndex) < 0 do Inc(I);
+ while SCompare(lList[j], P, AIndex) > 0 do Dec(J);
+ if I <= J then begin
+ lList.Exchange(I, J);
+ Inc(I);
+ Dec(J);
+ end;
+ until I > J;
+ if L < J then QuickSort(L, J, SCompare, AIndex);
+ L := I;
+ until I >= R;
+end;
+
+function TDAMemoryDataset.Compare(i1, i2: PMemDatasetrecord_Native; AIndex: TDAMemIndex): Integer;
+var
+ buf1, buf2: Dataset_PAnsiChar;
+ i: integer;
+ Field: TField;
+ p1, p2: PAnsiChar;
+ lList: TMemList;
+ lbin2_1,lbin2_2: Boolean;
+begin
+ buf1 := i1^.Data;
+ buf2 := i2^.Data;
+ Result := 0;
+ if AIndex.IsValid then begin
+ lbin2_1 := i1^.Ident = mrBin2Style;
+ lbin2_2 := i2^.Ident = mrBin2Style;
+ for i := 0 to AIndex.IndexFieldNameList.Count - 1 do begin
+ Field := AIndex.IndexFieldNameList[i];
+ if not GetNullMask(buf1, GetFieldNo(Field)) then
+ p1 := intFindFieldData(buf1, Field, lbin2_1)
+ else
+ p1 := nil;
+ if not GetNullMask(buf2, GetFieldNo(Field)) then
+ p2 := intFindFieldData(buf2, Field, lbin2_2)
+ else
+ p2 := nil;
+ if (p1 <> nil) and (p2 <> nil) then begin
+ Result := CompareValues(p1, p2, Field.DataType, AIndex.IndexCaseInsList[i] <> nil, lBin2_1, lBin2_2)
+ end
+ else
+ if p1 <> nil then Result := 1
+ else if p2 <> nil then Result := -1
+ else continue;
+ if AIndex.IndexDescFields[i] <> nil then Result := -Result;
+ if Result <> 0 then Exit;
+ end;
+ end;
+ if Result = 0 then begin
+ lList:=IntGetRecordList.LockListForReading;
+ try
+ Result := lList.IndexOf(buf1) - lList.IndexOf(buf2);
+ finally
+ IntGetRecordList.UnlockListForReading;
+ end;
+ if AIndex.SortDescMode then Result := -Result;
+ end;
+end;
+
+function WordBoolCompare(val1, val2: WordBool): integer;
+begin
+ if val2 and not val1 then Result := -1
+ else if val1 and not val2 then Result := 1
+ else Result := 0;
+end;
+
+function Int64Compare(val1, val2: Int64): integer;
+begin
+ if val1 > val2 then Result := 1
+ else if val2 > val1 then Result := -1
+ else Result := 0;
+end;
+
+function IntegerCompare(val1, val2: integer): integer;
+begin
+ if val1 > val2 then Result := 1
+ else if val2 > val1 then Result := -1
+ else Result := 0;
+end;
+
+function DoubleCompare(val1, val2: double): integer;
+begin
+ if val1 > val2 then Result := 1
+ else if val2 > val1 then Result := -1
+ else Result := 0;
+end;
+
+function TDateTimeCompare(val1, val2: TDateTime): integer;
+begin
+ if val1 > val2 then Result := 1
+ else if val2 > val1 then Result := -1
+ else Result := 0;
+end;
+
+function CurrencyCompare(val1, val2: Currency): integer;
+begin
+ if val1 > val2 then Result := 1
+ else if val2 > val1 then Result := -1
+ else Result := 0;
+end;
+
+function ExtendedCompare(val1, val2: Extended): integer;
+begin
+ if val1 > val2 then Result := 1
+ else if val2 > val1 then Result := -1
+ else Result := 0;
+end;
+
+function SingleCompare(val1, val2: Single): integer;
+begin
+ if val1 > val2 then Result := 1
+ else if val2 > val1 then Result := -1
+ else Result := 0;
+end;
+
+function ByteCompare(val1, val2: Byte): integer;
+begin
+ if val1 > val2 then Result := 1
+ else if val2 > val1 then Result := -1
+ else Result := 0;
+end;
+
+function LongWordCompare(val1, val2: LongWord): integer;
+begin
+ if val1 > val2 then Result := 1
+ else if val2 > val1 then Result := -1
+ else Result := 0;
+end;
+
+function ShortIntCompare(val1, val2: ShortInt): integer;
+begin
+ if val1 > val2 then Result := 1
+ else if val2 > val1 then Result := -1
+ else Result := 0;
+end;
+
+
+function TDAMemoryDataset.CompareValues(buf1, buf2: pointer;aDataType: TFieldType;aSortCaseInsensitive:Boolean; aBin2_1, aBin2_2: Boolean): integer;
+begin
+ Result := 0;
+ case aDataType of
+ ftString, ftFixedChar: begin
+ if GetStoreStringsAsReference then begin
+ case (ord(aBin2_1) shl 1) or ord(aBin2_2) of
+ 0 { 00b }: Result:= ROAnsiCompare(PAnsiChar(Buf1),PAnsiChar(Buf2),aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ 1 { 01b }: Result:= ROAnsiCompare(PAnsiChar(Buf1),PAnsiString(Buf2)^,aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ 2 { 10b }: Result:= ROAnsiCompare(PAnsiString(Buf1)^,PAnsiChar(Buf2),aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ 3 { 11b }: Result:= ROAnsiCompare(PAnsiString(Buf1)^,PAnsiString(Buf2)^,aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ end;
+ end
+ else begin
+ Result:= ROAnsiCompare(PAnsiChar(Buf1),PAnsiChar(Buf2),aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ end;
+ end;
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}
+ ftWideString: begin
+ if GetStoreStringsAsReference then begin
+ case (ord(aBin2_1) shl 1) OR ord(aBin2_2) of
+ 0 { 00b }: Result:= ROWideCompare(PUnicodeChar(Buf1),PUnicodeChar(Buf2),aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ 1 { 01b }: Result:= ROWideCompare(PUnicodeChar(Buf1),PUnicodeString(Buf2)^,aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ 2 { 10b }: Result:= ROWideCompare(PUnicodeString(Buf1)^,PUnicodeChar(Buf2),aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ 3 { 11b }: Result:= ROWideCompare(PUnicodeString(Buf1)^,PUnicodeString(Buf2)^,aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ end;
+ end
+ else begin
+ Result:= ROWideCompare(PUnicodeChar(Buf1),PUnicodeChar(Buf2),aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ end;
+ end;
+ ftGuid: Result := StrLIComp(PAnsiChar(Buf1), PAnsiChar(Buf2),guidsize);
+ ftSmallint: Result := IntegerCompare(PSmallInt(buf1)^, PSmallInt(buf2)^);
+ ftInteger, ftDate, ftTime, ftAutoInc: Result := IntegerCompare(PInteger(buf1)^, PInteger(buf2)^);
+ ftWord: Result := IntegerCompare(PWord(buf1)^, PWord(buf2)^);
+ ftBoolean: Result := WordBoolCompare(PWordBool(buf1)^, PWordBool(buf2)^);
+ ftFloat, ftCurrency: Result := DoubleCompare(PDouble(Buf1)^, PDouble(Buf2)^);
+ ftDateTime: Result := TDateTimeCompare(PDateTime(Buf1)^, PDateTime(Buf2)^);
+ ftBcd: Result := CurrencyCompare(PCurrency(Buf1)^, PCurrency(Buf2)^);
+ ftFMTBCD: Result := BcdCompare(PBcd(buf1)^, PBcd(buf2)^);
+ ftLargeint: Result := Int64Compare(PInt64(Buf1)^, PInt64(Buf2)^);
+ {$IFNDEF FPC}
+ ftTimeStamp: Result := DoubleCompare(SQLTimeStampToDateTime(PSQLTimeStamp(Buf1)^), SQLTimeStampToDateTime(PSQLTimeStamp(Buf2)^));
+ {$ENDIF FPC}
+ {$IFDEF DELPHI2009UP}
+ ftLongWord: Result := LongWordCompare(PLongWord(Buf1)^, PLongWord(Buf2)^);
+ ftShortint: Result := ShortintCompare(PShortint(Buf1)^, PShortint(Buf2)^);
+ ftByte: Result := ByteCompare(PByte(Buf1)^, PByte(Buf2)^);
+ ftExtended: Result := ExtendedCompare(PExtended(Buf1)^, PExtended(Buf2)^);
+ {$ENDIF}
+ {$IFDEF DELPHI2010UP}
+ ftSingle: Result := SingleCompare(PSingle(Buf1)^, PSingle(Buf2)^);
+ {$ENDIF}
+ else
+ end;
+end;
+
+procedure TDAMemoryDataset.SortOnFields(const Fields: string;
+ CaseInsensitive, Descending: Boolean);
+begin
+ if FActive then begin
+ if (Fields = '') and (FIndexName <> '') then begin
+ // default sorting
+ if FFieldsIndex then
+ SortOnFields(IndexFieldNames)
+ else
+ SwitchToIndex(IndexName);
+ f_DefaultIndexRecord.LastSorted := Now;
+ end
+ else begin
+ if Fields = '' then
+ f_DefaultIndexRecord.Init(IndexFieldNames, CaseInsensitive, Descending)
+ else
+ f_DefaultIndexRecord.Init(Fields, CaseInsensitive, Descending);
+ SortOnFields(f_DefaultIndexRecord);
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.SetStoreStringAsReference(const Value: Boolean);
+begin
+ CheckInactive;
+ FStoreStringsAsReference := Value;
+end;
+
+procedure TDAMemoryDataset.SetWideString(NativeBuf: Pointer; Field: TField;
+ const Value: Unicodestring);
+var
+ len: integer;
+begin
+ if GetStoreStringsAsReference then
+ PUnicodeString(NativeBuf)^:=Value
+ else begin
+ len := Length(Value);
+ if Len > Field.Size then len:= Field.Size;
+ move(Pointer(Value)^,NativeBuf^,len*Sizeof(UnicodeChar));
+ PUnicodeChar(NativeBuf)[len]:=#0;
+ end;
+end;
+
+procedure TDAMemoryDataset.DoAfterOpen;
+begin
+ if not IsEmpty then SortOnFields();
+ inherited;
+end;
+
+procedure TDAMemoryDataset.MasterChanged(Sender: TObject);
+begin
+ ProcessFilter;
+end;
+
+procedure TDAMemoryDataset.MasterDisabled(Sender: TObject);
+begin
+ DataEvent(dePropertyChange, 0);
+ DoFilterRecords;
+end;
+(*
+procedure TDAMemoryDataset.GetDetailLinkFields(MasterFields,
+ DetailFields: TList);
+begin
+ { TODO : GetDetailLinkFields }
+ inherited GetDetailLinkFields(MasterFields, DetailFields);
+end;
+*)
+
+procedure TDAMemoryDataset.DoFilterRecords;
+var
+ i: integer;
+ pos: TBookmarkData;
+begin
+ if (FDataList.Count > 0) and (FRecordPos <> -1) and (FRecordPos < FDataList.Count) then
+ pos := FDataList[FRecordPos]
+ else
+ pos := nil;
+ //==============================
+ if ApplyMasterFilter then pos := nil;
+ if FIndexName <> '' then SortOnFields;
+ if FRangeActive then begin
+ ApplyRangeFilter; // currently it is empty
+ pos := nil;
+ end;
+ // apply filters
+ if IsActiveFilter then begin
+ for i := FDataList.Count-1 downto 0 do
+ if not FilterRecord(FDataList.List[i], False) then
+ FDataList.Delete(i);
+ end;
+ //==============================
+ if Active then begin
+ if pos = nil then
+ FRecordPos := -1
+ else
+ FRecordPos := IntFindRecordID(pos);
+ if (FRecordPos = -1) then First;
+ if (RecordCount > 0) then FRecordPos := 0;
+ Resync([]);
+ end;
+end;
+
+function TDAMemoryDataset.MakeBlobFromString(Blob: AnsiString): PBLOBRecord;
+var
+ s: integer;
+begin
+ s:= Length(blob);
+ Result:=CreateBlobRecord(s);
+ Move(Pointer(blob)^, PBlobRecord(Result)^.Data, s * SizeOf(AnsiChar));
+end;
+
+procedure TDAMemoryDataset.IntInsertBuffer(Buffer: PMemDatasetrecord_Native;ASender: TDAMemoryDataset);
+begin
+ if ASender = nil then ASender:=Self;
+ if FCloneSource <> nil then
+ FCloneSource.IntInsertBuffer(Buffer, aSender)
+ else begin
+ FRecordsList.Add(Buffer);
+ NotifyClients(Buffer, mdnInsert, ASender);
+ end;
+end;
+
+function TDAMemoryDataset.GetBin2FieldOffset(
+ const aFieldNo: integer): cardinal;
+begin
+ if aFieldNo < FieldCount then
+ Result:=FOffsets[aFieldNo]
+ else
+ Result:=0;
+end;
+
+procedure TDAMemoryDataset.DoOnNewRecord;
+var
+ I: Integer;
+begin
+ if FMasterDataLink.Active and (FMasterDataLink.Fields.Count > 0) then
+ for I := 0 to FMasterDataLink.Fields.Count - 1 do
+ if FDetailsFieldNameList.Count > i then
+ TField(FDetailsFieldNameList[I]).Assign(TField(FMasterDataLink.Fields[I]));
+ inherited;
+end;
+
+function TDAMemoryDataset.Locate(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+begin
+ DoBeforeScroll;
+ Result := LocateRecord(KeyFields, KeyValues, Options, True);
+ if Result then
+ begin
+ Resync([rmExact, rmCenter]);
+ DoAfterScroll;
+ end;
+end;
+
+function TDAMemoryDataset.LocateByIndex(const aIndex: integer;
+ const KeyValues: Variant): Boolean;
+begin
+ DoBeforeScroll;
+ Result := LocateRecordByIndex(aIndex, KeyValues, True);
+ if Result then
+ begin
+ Resync([rmExact, rmCenter]);
+ DoAfterScroll;
+ end;
+end;
+
+function TDAMemoryDataset.LocateRecord(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions; SyncCursor: Boolean): Boolean;
+var
+ Buffer: PMemDatasetrecord;
+ lLocateStr: TMemLocateStruct;
+
+ function LocateWithOutIndex: boolean;
+ var
+ i,j: integer;
+ k: boolean;
+ lCaseInsensitive: boolean;
+ f: TMemLocateCompare;
+ buf: Dataset_PAnsiChar;
+ lBin2: Boolean;
+ begin
+ if loPartialKey in Options then
+ f := CompareValues2_partial
+ else
+ f := CompareValues2_full;
+ lCaseInsensitive:= loCaseInsensitive in Options;
+ with lLocateStr do begin
+ Result:=False;
+ For i:= 0 to lWorkList.Count - 1 do begin
+ k := False;
+ buf := PMemDatasetrecord_Native(lWorkList[i])^.Data;
+ lBin2 := PMemDatasetrecord_Native(lWorkList[i])^.Ident = mrBin2Style;
+ For j:=0 to lFields.Count-1 do begin
+ if ((buf = nil) or GetNullMask(buf,lFieldIndexes[j])) = lnull[j] then begin
+ if lnull[j] then
+ k := True // null | null
+ else
+ if lBin2 then
+ k := f(buf+lOffsets[j], lValues[j], lDatatypes[j], lCaseInsensitive, True)
+ else
+ k := f(buf+GetBin3Offset(buf,lFieldIndexes[j]), lValues[j], lDatatypes[j], lCaseInsensitive, False);
+ end
+ else
+ k:=False;
+ if not k then Break;
+ end;
+ if k then begin
+ RecordToBuffer(i, Buffer);
+ Result:=True;
+ Break;
+ end;
+ end;
+ end;
+ end;
+
+ function SearchIndex_Direct: TDAMemIndex;
+ var
+ i: integer;
+ begin
+ Result := f_DefaultIndexRecord;
+ if Result.isCanUsed(KeyFields,loCaseInsensitive in Options) then Exit;
+ for i:= 0 to FIndexList.Count - 1 do begin
+ Result := TDAMemIndex(FIndexList[i]);
+ if Result.isCanUsed(KeyFields,loCaseInsensitive in Options) then Exit;
+ end;
+ Result := nil;
+ end;
+
+var
+ lBookmark: TMemBookmarkData;
+ lLocalIndex: TDAMemIndex;
+begin
+ Result := False;
+
+ // try to use indexes
+ if not (loPartialKey in Options) then begin
+ UpdateMemIndexes(-1);
+ // try to use indexes
+ lLocalIndex := SearchIndex_Direct;
+ if lLocalIndex <> nil then begin
+ Result := intLocateRecordByIndex(lLocalIndex,KeyValues,SyncCursor);
+ exit;
+ end;
+ end;
+
+ if Self.State <> dsBrowse then CheckBrowseMode;
+ CursorPosChanged;
+ Buffer := Pointer(TempBuffer);
+ if IsEmpty then Exit;
+ FillChar(lLocateStr, SizeOf(TMemLocateStruct),0);
+ try
+ lLocateStr.lFields := TList.Create;
+ try
+ GetFieldList(lLocateStr.lFields,KeyFields);
+ if lLocateStr.lFields.Count = 0 then Exit;
+ InitMemLocateStruct(@lLocateStr, KeyValues);
+ lLocateStr.lWorkList:= FDataList;
+ IntGetRecordList.LockListForReading;
+ try
+ result:= LocateWithOutIndex;
+ if Result then begin
+ SetLength(lBookmark, BookmarkSize);
+ GetBookmarkData(Pointer(Buffer), Pointer(lBookmark));
+ end;
+ finally
+ IntGetRecordList.UnlockListForReading;
+ end;
+ finally
+ lLocateStr.lFields.Free;
+ end;
+ finally
+ if Result then begin
+ if SyncCursor then InternalGotoBookmark(pointer(lBookmark));
+ SetLength(lBookmark, 0);
+ end;
+ end;
+end;
+
+function TDAMemoryDataset.LocateRecordByIndex(const aIndex: Integer;
+ const KeyValues: Variant; SyncCursor: Boolean): Boolean;
+var
+ lIndex: TDAMemIndex;
+begin
+ if (aIndex < 0) or (aIndex > FIndexDefs.Count) then DatabaseError(SFieldIndexError);
+ UpdateMemIndexes(aIndex);
+ lIndex := TDAMemIndex(FIndexList[aIndex]);
+ DoSort(lIndex);
+ Result:= intLocateRecordByIndex(lIndex, KeyValues, SyncCursor);
+end;
+
+function TDAMemoryDataset.Lookup(const KeyFields: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ Result := Null;
+ if LocateRecord(KeyFields, KeyValues, [], False) then
+ begin
+ SetTempState(dsCalcFields);
+ try
+ CalculateFields(TempBuffer);
+ Result := FieldValues[ResultFields];
+ finally
+ RestoreState(dsBrowse);
+ end;
+ end;
+end;
+
+function TDAMemoryDataset.LookupByIndex(const aIndex: integer;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ Result := Null;
+ if LocateRecordByIndex(aIndex, KeyValues, False) then
+ begin
+ SetTempState(dsCalcFields);
+ try
+ CalculateFields(TempBuffer);
+ Result := FieldValues[ResultFields];
+ finally
+ RestoreState(dsBrowse);
+ end;
+ end;
+end;
+
+function TDAMemoryDataset.CompareValues2(buf1: pointer; aValue: TDAValueStruct; aDataType: TFieldType; aSortCaseInsensitive: Boolean;aBin2: boolean): integer;
+var
+ str1: Ansistring;
+ wstr1: UnicodeString;
+begin
+ Result := 0;
+ case aDataType of
+ ftString, ftFixedChar: begin
+ if abin2 and GetStoreStringsAsReference then
+ str1:=PAnsiString(Buf1)^
+ else
+ str1:=PAnsiChar(Buf1);
+ Result:= ROAnsiCompare(str1, aValue.AsAnsiString, aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ end;
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}
+ ftWideString: begin
+ if abin2 and GetStoreStringsAsReference then
+ wstr1:=PUnicodeString(Buf1)^
+ else
+ wstr1:=PUnicodeChar(Buf1);
+ Result:= ROWideCompare(wstr1, aValue.AsWideString, aSortCaseInsensitive {$IFDEF MSWINDOWS},FSortLocale {$ENDIF MSWINDOWS});
+ end;
+ ftGuid: begin
+ SetString(str1, PAnsiChar(buf1), guidsize);
+ Result := ROAnsiCompare(str1, aValue.AsAnsiString, True);
+ end;
+ ftSmallint: Result := IntegerCompare(PSmallInt(buf1)^, aValue.value);
+ ftInteger, ftDate, ftTime, ftAutoInc: Result := IntegerCompare(PInteger(buf1)^, aValue.Value);
+ ftWord: Result := IntegerCompare(PWord(buf1)^, aValue.Value);
+ ftBoolean: Result := WordBoolCompare(PWordBool(buf1)^, aValue.Value);
+ ftFloat, ftCurrency: Result := DoubleCompare(PDouble(Buf1)^, aValue.Value);
+ ftDateTime: Result := TDateTimeCompare(PDateTime(Buf1)^, TimeStampToMSecs(DateTimeToTimeStamp(aValue.Value)));
+ ftBcd: Result := CurrencyCompare(PCurrency(buf1)^,aValue.Value);
+ ftFMTBCD: Result := BcdCompare(PBcd(buf1)^, VariantToBCD(aValue.Value));
+ ftLargeint: Result := Int64Compare(PInt64(Buf1)^, aValue.Value);
+ {$IFNDEF FPC}
+ ftTimeStamp: Result := DoubleCompare(SQLTimeStampToDateTime(PSQLTimeStamp(Buf1)^), SQLTimeStampToDateTime(VarToSQLTimeStamp(aValue.Value)));
+ {$ENDIF FPC}
+ {$IFDEF DELPHI2009UP}
+ ftLongWord: Result := LongWordCompare(PLongWord(Buf1)^, aValue.Value);
+ ftShortint: Result := ShortintCompare(PShortint(Buf1)^, aValue.Value);
+ ftByte: Result := ByteCompare(PByte(Buf1)^, aValue.Value);
+ ftExtended: Result := ExtendedCompare(PExtended(Buf1)^, aValue.Value);
+ {$ENDIF}
+ {$IFDEF DELPHI2010UP}
+ ftSingle: Result := SingleCompare(PSingle(Buf1)^, aValue.Value);
+ {$ENDIF}
+ else
+ end;
+end;
+
+
+function TDAMemoryDataset.CompareBookmarks(Bookmark1,
+ Bookmark2: TBookmark): Integer;
+var
+ idx1, idx2: integer;
+begin
+ if (Bookmark1 = nil) and (BookMark2 = nil) then
+ Result:=0
+ else if (Bookmark1 <> nil) and (BookMark2 = nil) then
+ Result := 1
+ else if (Bookmark1 = nil) and (BookMark2 <> nil) then
+ Result := -1
+ else begin
+ idx1 := IntFindRecordID(TBookMarkData(PPointer(Bookmark1)^));
+ idx2 := IntFindRecordID(TBookMarkData(PPointer(Bookmark2)^));
+ if idx1 > idx2 then
+ Result := 1
+ else if idx1 < idx2 then
+ Result := -1
+ else
+ Result:=0;
+ end;
+end;
+
+function TDAMemoryDataset.BookmarkValid(Bookmark: TBookmark): Boolean;
+begin
+ Result := IntFindRecordID(TBookMarkData(PPointer(Bookmark)^)) <> -1;
+end;
+
+function TDAMemoryDataset.GetIndexDefs: TIndexDefs;
+begin
+ if FIndexDefs = nil then
+ FIndexDefs := TIndexDefs.Create(Self);
+ Result := FIndexDefs;
+end;
+
+procedure TDAMemoryDataset.SetIndexDefs(const Value: TIndexDefs);
+begin
+ IndexDefs.Assign(Value);
+end;
+
+function TDAMemoryDataset.PSGetIndexDefs(
+ IndexTypes: TIndexOptions): TIndexDefs;
+begin
+ Result := inherited GetIndexDefs(IndexDefs, IndexTypes);
+end;
+
+procedure TDAMemoryDataset.UpdateIndexDefs;
+begin
+ inherited;
+end;
+
+function TDAMemoryDataset.GetIndexName: string;
+begin
+ if FFieldsIndex then Result := '' else Result := FIndexName;
+end;
+
+procedure TDAMemoryDataset.SetIndexName(const Value: string);
+begin
+ SetIndex(Value, Value = '');
+end;
+
+procedure TDAMemoryDataset.SetIndex(const Value: string;
+ FieldsIndex: Boolean);
+begin
+ if FActive then begin
+ CheckBrowseMode;
+ UpdateCursorPos;
+ if (FIndexName <> Value) or (FFieldsIndex <> FieldsIndex) then begin
+ FIndexName := Value;
+ FFieldsIndex := FieldsIndex;
+ if FieldsIndex or (Value = '') then begin
+ SortOnFields(Value, False, False);
+ end
+ else
+ SwitchToIndex(Value);
+ end;
+ end;
+ FIndexName := Value;
+ FFieldsIndex := FieldsIndex;
+ f_DefaultIndexRecord.LastSorted := Now;
+end;
+
+
+procedure TDAMemoryDataset.SwitchToIndex(const IndexName: string);
+var
+ i: integer;
+begin
+ if FActive then begin
+ i:= IndexDefs.IndexOf(IndexName);
+ if i = -1 then DatabaseErrorFmt(SIndexNotFound,[IndexName]);
+ f_DefaultIndexRecord.Init(IndexDefs[i]);
+ f_DefaultIndexRecord.FInitFromIndexDef:= False;
+ SortOnFields(f_DefaultIndexRecord);
+ end;
+end;
+
+procedure TDAMemoryDataset.GetIndexNames(List: TStrings);
+begin
+ IndexDefs.Update;
+ IndexDefs.GetItemNames(List);
+end;
+
+procedure TDAMemoryDataset.AddIndex(const Name, Fields, DescFields,
+ CaseInsFields: string);
+var
+ lIndexDef: TIndexDef;
+begin
+ lIndexDef := IndexDefs.AddIndexDef;
+ lIndexDef.Name := Name;
+ lIndexDef.Fields := Fields;
+ lIndexDef.DescFields := DescFields;
+ lIndexDef.CaseInsFields := CaseInsFields;
+end;
+
+procedure TDAMemoryDataset.DeleteIndex(const Name: string);
+var
+ i: integer;
+begin
+ i:=IndexDefs.IndexOf(Name);
+ if i <> -1 then IndexDefs.Delete(i);
+end;
+
+{$IFDEF FPC}
+const
+ SInvalidCalcType = 'Field ''%s'' cannot be a calculated or lookup field';
+{$ENDIF}
+
+procedure TDAMemoryDataset.ValidateFieldForIndex(aField: TField);
+begin
+ if not ((aField.FieldKind =fkData) and (aField.DataType in ft_Supported - ft_BlobTypes)) then
+ DatabaseErrorFmt(SInvalidCalcType, [aField.DisplayName]);
+end;
+
+{$IFDEF DELPHI10UP}
+{$WARN SYMBOL_DEPRECATED OFF}
+{$ENDIF DELPHI10UP}
+procedure TDAMemoryDataset.SortOnFields(const Fields, CaseInsFields, DescFields: string);
+begin
+ if FActive then begin
+ f_DefaultIndexRecord.Init(Fields,CaseInsFields,DescFields);
+ SortOnFields(f_DefaultIndexRecord);
+ end;
+end;
+{$IFDEF DELPHI10UP}
+{$WARN SYMBOL_DEPRECATED ON}
+{$ENDIF DELPHI10UP}
+
+procedure TDAMemoryDataset.SortOnFields;
+begin
+ SortOnFields('');
+end;
+
+procedure TDAMemoryDataset.DefChanged(Sender: TObject);
+begin
+ {$IFNDEF FPC}
+ inherited;
+ {$ENDIF}
+ if Sender = FIndexDefs then
+ UpdateMemIndexes;
+ if (not FFieldsIndex) and (FIndexName <> '') then begin
+ if FIndexDefs.Count = 0 then FIndexName:='';
+ SortOnFields;
+ end;
+end;
+
+function CompareAnsiStrPartial(const aStr1, aStr2: AnsiString; aSortCaseInsensitive:Boolean): boolean;
+var
+ l1: integer;
+ l2: Integer;
+ k: AnsiString;
+begin
+ l1 := Length(aStr1);
+ l2 := Length(aStr2);
+ if (l1 > l2) or (l1 = 0) then
+ Result := False
+ else begin
+ if l1 = l2 then
+ k := aStr2
+ else
+ SetString(k,PAnsiChar(aStr2), l1);
+ Result := ROAnsiCompare(aStr1, k , aSortCaseInsensitive) = 0;
+ end;
+end;
+
+function CompareWideStrPartial(const aStr1, aStr2: UnicodeString; aSortCaseInsensitive:Boolean): boolean;
+var
+ l1: integer;
+ l2: Integer;
+ k: UnicodeString;
+begin
+ l1 := Length(aStr1);
+ l2 := Length(aStr2);
+ if (l1 > l2) or (l1 = 0) then
+ Result := False
+ else begin
+ if l1 = l2 then
+ k := aStr2
+ else
+ SetString(k, PUnicodeChar(aStr2), l1);
+ Result := ROWideCompare(aStr1, k , aSortCaseInsensitive) = 0;
+ end;
+end;
+
+function TDAMemoryDataset.CompareValues2_partial(buf1: pointer; aValue: TDAValueStruct; aDataType: TFieldType; aSortCaseInsensitive:Boolean;abin2: boolean): boolean;
+var
+ str1: AnsiString;
+ wstr1: Unicodestring;
+begin
+ Result := False;
+ case aDataType of
+ ftString, ftFixedChar: begin
+ if abin2 and GetStoreStringsAsReference then
+ str1 := PAnsiString(Buf1)^
+ else
+ str1 := PAnsiChar(Buf1);
+ Result := CompareAnsiStrPartial(aValue.AsAnsiString, str1, aSortCaseInsensitive);
+ end;
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}
+ ftWideString: begin
+ if abin2 and GetStoreStringsAsReference then
+ wstr1 := PUnicodeString(Buf1)^
+ else
+ wstr1 := PUnicodeChar(Buf1);
+ Result := CompareWideStrPartial(aValue.AsWideString, wstr1, aSortCaseInsensitive);
+ end;
+ ftGuid: begin
+ SetString(str1, PAnsiChar(buf1), guidsize);
+ Result := CompareAnsiStrPartial(aValue.AsAnsiString, str1, aSortCaseInsensitive);
+ end;
+ ftSmallint: Result := pos(VarToStr(aValue.Value), IntToStr(PSmallInt(buf1)^)) = 1;
+ ftInteger, ftDate, ftTime, ftAutoInc: Result := pos(VarToStr(aValue.Value), IntToStr(PInteger(buf1)^)) = 1;
+ ftWord: Result := pos(VarToStr(aValue.Value), IntToStr(PWord(buf1)^)) = 1;
+ ftBoolean: Result:= PWordBool(buf1)^ = aValue.Value;
+ ftFloat, ftCurrency: Result := pos(VarToStr(aValue.Value), FloatToStr(PDouble(buf1)^)) = 1;
+ ftDateTime: Result := pos(VarToStr(aValue.Value), DateToStr(TimeStampToDateTime(MSecsToTimeStamp({$IFDEF FPC}Trunc{$ENDIF}(PDateTime(buf1)^))))) = 1;
+ ftBcd: Result := Pos(VarToStr(aValue.Value), CurrToStr(PCurrency(Buf1)^)) = 1;
+ ftFMTBCD: Result :=pos(VarToStr(aValue.Value), BcdToStr(PBcd(buf1)^)) = 1;
+ ftLargeint: Result := pos(VarToStr(aValue.Value), IntToStr(PInt64(buf1)^)) = 1;
+ {$IFNDEF FPC}
+ ftTimeStamp: Result := pos(VarToStr(aValue.Value), DateTimeToStr(SQLTimeStampToDateTime(PSQLTimeStamp(Buf1)^))) = 1;
+ {$ENDIF FPC}
+ {$IFDEF DELPHI2009UP}
+ ftLongWord: Result := pos(VarToStr(aValue.Value), IntToStr(PLongWord(buf1)^)) = 1;
+ ftShortint: Result := pos(VarToStr(aValue.Value), IntToStr(PShortInt(buf1)^)) = 1;
+ ftByte: Result := pos(VarToStr(aValue.Value), IntToStr(PByte(buf1)^)) = 1;
+ ftExtended: Result := pos(VarToStr(aValue.Value), FloatToStr(PExtended(buf1)^)) = 1;
+ {$ENDIF}
+ {$IFDEF DELPHI2010UP}
+ ftSingle: Result := pos(VarToStr(aValue.Value), FloatToStr(PSingle(buf1)^)) = 1;
+ {$ENDIF}
+ else
+ end;
+end;
+
+procedure TDAMemoryDataset.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited;
+ if (Operation = opRemove) and (AComponent = FCloneSource) then
+ DetachFromSource;
+ if (Operation = opRemove) and (AComponent = fMemCloneSource) then
+ FMemCloneSource := nil;
+end;
+
+procedure TDAMemoryDataset.CloneCursor(Source: TDAMemoryDataset; Reset: Boolean; KeepSettings: Boolean = False);
+begin
+ if Source <> nil then CheckforCircularLinks(Source,True);
+ Source.CheckActive;
+ Close;
+ FMemCloneSource := Source;
+ FCloneSource := Source;
+ if Reset then
+ AssignCloneSource(nil)
+ else if not KeepSettings then
+ AssignCloneSource(Source);
+ Open;
+ if Reset then Resync([]);
+end;
+
+procedure TDAMemoryDataset.IntRemoveBuffer(Buffer: PMemDatasetrecord_Native; ASender: TDAMemoryDataset);
+begin
+ if FCloneSource <> nil then
+ FCloneSource.IntRemoveBuffer(Buffer,ASender)
+ else begin
+ NotifyClients(Buffer,mdnDelete,ASender);
+ with FRecordsList.LockListForWriting do try
+ Remove(Buffer);
+ FreeMemDatasetRecord(Buffer);
+ finally
+ FRecordsList.UnlockListForWriting;
+ end;
+ end;
+end;
+
+function TDAMemoryDataset.IntGetRecordList: TThreadMemList;
+begin
+ if FCloneSource <> nil then
+ Result:= FCloneSource.IntGetRecordList
+ else
+ Result:=FRecordsList;
+end;
+
+
+procedure TDAMemoryDataset.RegisterClient(const AClient: TDAMemoryDataset);
+begin
+ if FCloneSource <> nil then begin
+ FCloneSource.RegisterClient(AClient);
+ end
+ else begin
+ if FCloneClientList = nil then FCloneClientList:=TThreadList.Create;
+ FCloneClientList.Add(AClient);
+ if AClient <> self then
+ AClient.AttachToSource(Self);
+ end;
+end;
+
+procedure TDAMemoryDataset.UnregisterClient(const AClient: TDAMemoryDataset);
+begin
+ if FCloneSource <> nil then begin
+ FCloneSource.UnregisterClient(AClient);
+ end
+ else begin
+ if FCloneClientList <> nil then
+ FCloneClientList.Remove(AClient);
+ if AClient.FCloneSource <> nil then AClient.DetachFromSource;
+ end;
+end;
+
+procedure TDAMemoryDataset.UnregisterAllClients;
+var
+ i: integer;
+ lList: TList;
+ lClient: TDAMemoryDataset;
+begin
+ if FCloneClientList <> nil then begin
+ lList:= FCloneClientList.LockList;
+ try
+ for i:= lList.Count-1 downto 0 do begin
+ lClient:= TDAMemoryDataset(lList[i]);
+ if Assigned(lClient) then lClient.DetachFromSource;
+ end;
+ lList.Clear;
+ finally
+ FCloneClientList.UnlockList;
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.DetachFromSource;
+begin
+ FCloneSource := nil;
+ if Active then begin
+ FDataList.Clear;
+ InternalFirst;
+ Resync([]);
+ end;
+end;
+
+procedure TDAMemoryDataset.NotifyClients(Buf: PMemDatasetrecord_Native; Operation: TMemDataSetNotification;ASender: TDAMemoryDataset);
+var
+ i: integer;
+begin
+ if FCloneClientList <> nil then
+ with FCloneClientList.LockList do try
+ For i:=0 to Count -1 do
+ if ASender <> TDAMemoryDataset(Items[i]) then begin
+ TDAMemoryDataset(Items[i]).RecordNotification(Buf,Operation)
+ end
+ else begin
+ if Operation in [mdnInsert, mdnModify] then begin
+ TDAMemoryDataset(Items[i]).IntAutoSort(Buf, peaResort in FPostEditActions);
+ FPostEditActions := [];
+ end;
+ end;
+ finally
+ FCloneClientList.UnlockList;
+ end;
+end;
+
+
+procedure TDAMemoryDataset.RecordNotification(Buf: PMemDatasetrecord_Native; Operation: TMemDataSetNotification);
+var
+ i: integer;
+ FNeedResort: boolean;
+ f: boolean;
+begin
+ if Active then begin
+ f := f_DefaultIndexRecord.LastSorted > FLastUpdate;
+ FNeedResort := False;
+ FLastUpdate := now;
+ case Operation of
+ mdnInsert:
+ begin
+ intInsertRecord(Buf);
+ FNeedResort:= True;
+ end;
+ mdnModify:
+ if IsActiveFilter and not FilterRecord(Buf, True) then begin
+ i := FDataList.Remove(buf);
+ if (i <> -1) and (i = FRecordPos) and (FRecordPos >= RecordCount) then Dec(FRecordPos);
+ end
+ else begin
+ FNeedResort:= True;
+ end;
+ mdnDelete:
+ begin
+ if f then f_DefaultIndexRecord.LastSorted :=Now;
+ i := FDataList.Remove(buf);
+ if (i <> -1) and (i = FRecordPos) and (FRecordPos >= RecordCount) then Dec(FRecordPos);
+ end;
+ mdnBatchAdding:
+ begin
+ ProcessFilter;
+ end;
+ end;
+ DataEvent(deUpdateState, 0);
+ // Refresh;
+ if State in dsEditModes then begin
+ if FNeedResort then FPostEditActions := FPostEditActions + [peaResort];
+ end
+ else begin
+ if FNeedResort then
+ IntAutoSort(Buf,True)
+ else
+ Resync([]);
+ FPostEditActions := [];
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.IntUpdateBuffer(Buffer: PMemDatasetrecord_Native; ASender: TDAMemoryDataset);
+begin
+ if ASender = nil then ASender:=Self;
+ if FCloneSource <> nil then
+ FCloneSource.IntUpdateBuffer(Buffer, ASender)
+ else begin
+ NotifyClients(Buffer,mdnModify,ASender);
+ end;
+end;
+
+procedure TDAMemoryDataset.intInsertRecord(Buf: PMemDatasetrecord_Native);
+var
+ lCount: integer;
+ RecPos: integer;
+begin
+ if not IsActiveFilter or FilterRecord(Buf, True) then begin
+ if State = dsInsert then begin
+ lCount:= IntGetRecordList.lockListForReading.Count;
+ IntGetRecordList.UnlockListForReading;
+ if FRecordPos >= lCount then begin
+ FDataList.Add(Buf);
+ FRecordPos := RecordCount - 1;
+ end
+ else begin
+ if FRecordPos = -1 then
+ RecPos := 0
+ else
+ RecPos := FRecordPos;
+ FDataList.Insert(RecPos, Buf);
+ FRecordPos := RecPos;
+ end;
+ end
+ else begin
+ FDataList.Add(Buf);
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.AddRecordsfromList(AList: TList; ACallbackRecord: PDACallbackRecord);
+
+ function SearchIndex_Direct: TDAMemIndex;
+ var
+ i: integer;
+ begin
+ Result := f_DefaultIndexRecord;
+ if Result.isCanUsed(ACallbackRecord^.PK,False) then Exit;
+ for i:= 0 to FIndexList.Count - 1 do begin
+ Result := TDAMemIndex(FIndexList[i]);
+ if Result.isCanUsed(ACallbackRecord^.PK,False) then Exit;
+ end;
+ Result := nil;
+ end;
+
+var
+ old_count: integer;
+ i,j: integer;
+ lRecIDOffset: Cardinal;
+ lIndex: TDAMemIndex;
+ ltempIndex: Boolean;
+ or_buf,buf: PMemDatasetrecord_Native;
+ lKeyValues: array of Variant;
+ lUpdateList, lAppendList: TList;
+ lcnt: Integer;
+begin
+ lUpdateList := TList.Create;
+ lAppendList := TList.Create;
+ try
+ if ACallbackRecord <> nil then begin
+ // DataAbstract Mode. RecID = field[0]
+ lRecIDOffset := GetBin2FieldOffset(0);
+ if (ACallbackRecord^.AppendMode) and (ACallbackRecord^.PK <> '') then begin
+ lIndex := SearchIndex_Direct;
+ ltempIndex := lIndex = nil;
+ if ltempIndex then begin
+ lIndex := TDAMemIndex.Create(Self);
+ lIndex.Init(ACallbackRecord^.PK,False,False);
+ lIndex.FInitFromIndexDef:= False;
+ end;
+ try
+ DoSort(lIndex,True);
+ SetLength(lKeyValues, lIndex.IndexFieldNameList.Count);
+ lcnt:= lIndex.IndexFieldNameList.Count;
+ for I := 0 to AList.Count - 1 do begin
+ buf:=PMemDatasetrecord_Native(AList[i]);
+ for j := 0 to lcnt - 1 do
+ lKeyValues[j]:=GetVarValueFromBuffer(buf.data,lIndex.IndexFieldNameList[j],True);
+ if ((lcnt = 1) and (intLocateRecordByIndex(lIndex,lKeyValues[0],False))) or
+ ((lcnt > 1) and (intLocateRecordByIndex(lIndex,lKeyValues,False))) then begin
+ PCardinal(buf^.Data+lRecIDOffset)^:= PCardinal(IntFindFieldData(PMemDatasetrecord_Native(TempBuffer),Fields[0]))^;
+ SetNullMask(buf^.Data,0,False); //RECID
+ lUpdateList.Add(PMemDatasetrecord(TempBuffer)^.BookmarkData.Bookmark);
+ lUpdateList.Add(AList[i]);
+ end
+ else begin
+ PCardinal(buf^.Data+lRecIDOffset)^:=ACallbackRecord^.RecIDCallback;
+ SetNullMask(buf^.Data,0,False); //RECID
+ lAppendList.Add(AList[i]);
+ end;
+ end;
+ finally
+ if ltempIndex then lIndex.Free;
+ end;
+ end
+ else begin
+ for I := 0 to AList.Count - 1 do begin
+ buf:=PMemDatasetrecord_Native(AList[i]);
+ PCardinal(buf^.Data+lRecIDOffset)^:=ACallbackRecord^.RecIDCallback;
+ SetNullMask(buf^.Data,0,False); //RECID
+ end;
+ lAppendList.Count := AList.Count;
+ System.Move(AList.List^, lAppendList.List^, AList.Count*SizeOf(Pointer));
+ end;
+ end;
+
+ with IntGetRecordList.LockListForWriting do try
+ for I := 0 to (lUpdateList.Count div 2)-1 do begin
+ or_buf := lUpdateList.List^[i*2];
+ buf := lUpdateList.List^[i*2+1];
+ InternalInitRecord(Dataset_PAnsiChar(or_buf));
+ or_buf^.Ident := buf^.Ident;
+ or_buf^.Data := buf^.Data;
+ buf^.Ident:= mrEmpty;
+ buf^.Data := nil;
+ FreeMemDatasetRecord(buf);
+ end;
+ old_count:=Count;
+ Count:=old_count+lAppendList.Count;
+ System.Move(lAppendList.List^, PAnsiChar(List^[old_Count]), lAppendList.Count*SizeOf(Pointer));
+ if FAutoCompactRecords then begin
+ For i := old_count to Count -1 do
+ ConvertBin2ToBin3Record(List^[i]);
+ for I := 0 to (lUpdateList.Count div 2)-1 do begin
+ ConvertBin2ToBin3Record(lUpdateList.List^[i*2]);
+ end;
+ end;
+ finally
+ IntGetRecordList.UnlockListForWriting;
+ end;
+ if (AList.Count > 0) then FLastUpdate := Now;
+ AList.Clear;
+ NotifyClients(nil, mdnBatchAdding, nil);
+ finally
+ lUpdateList.Free;
+ lAppendList.Free;
+ end;
+end;
+
+function TDAMemoryDataset.CalcFieldLen(aDataType: TFieldType;
+ aSize: Integer): integer;
+begin
+ if not (aDataType in ft_Supported) then
+ Result := 0
+ else if IsReferencedField(aDataType) then
+ Result := sizeof(Pointer)
+ else case aDataType of
+ ftSmallint: Result := SizeOf(Smallint);
+ ftInteger, ftAutoInc: Result := SizeOf(Integer);
+ ftWord: Result := SizeOf(Word);
+ ftBoolean: Result := SizeOf(WordBool);
+ ftFloat, ftCurrency: Result := SizeOf(Double);
+ ftDate, ftTime: Result := SizeOf(Integer);
+ ftDateTime: Result := SizeOf(TDateTime);
+ ftLargeint: Result := SizeOf(Largeint);
+ {$IFNDEF FPC}
+ ftTimeStamp: Result := SizeOf(TSQLTimeStamp);
+ {$ENDIF}
+ ftFMTBCD: Result := SizeOf(TBcd);
+ ftBCD: Result := SizeOf(Currency);
+ ftGuid: Result := GuidSize+1;
+ ftString,ftFixedChar: Result := (aSize + 1)* Sizeof(AnsiChar);
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}
+ ftWideString: Result := (aSize + 1) * Sizeof(UnicodeChar);
+ {$IFDEF DELPHI2009UP}
+ ftLongWord: Result := SizeOf(LongWord);
+ ftShortint: Result := SizeOf(ShortInt);
+ ftByte: Result := SizeOf(Byte);
+ ftExtended: Result := SizeOf(Extended);
+ {$ENDIF}
+ {$IFDEF DELPHI2010UP}
+ ftSingle: Result := SizeOf(Single);
+ {$ENDIF}
+ else
+ Result:=0;
+ end;
+end;
+
+procedure TDAMemoryDataset.SetReadOnly(const Value: Boolean);
+begin
+ FReadOnly := Value;
+end;
+
+function TDAMemoryDataset.GetCanModify: Boolean;
+begin
+ Result := not FReadOnly;
+end;
+
+procedure TDAMemoryDataset.ApplyRange;
+begin
+ CheckBrowseMode;
+ if not (BuffersEqual(FKeyBuffers[kiRangeStart], FKeyBuffers[kiCurRangeStart], FKeyBufferSize) and
+ BuffersEqual(FKeyBuffers[kiRangeEnd], FKeyBuffers[kiCurRangeEnd], FKeyBufferSize)) then begin
+ Move(FKeyBuffers[kiRangeStart]^, FKeyBuffers[kiCurRangeStart]^, FKeyBufferSize);
+ Move(FKeyBuffers[kiRangeEnd]^, FKeyBuffers[kiCurRangeEnd]^, FKeyBufferSize);
+ FRangeActive:=(FKeyBuffers[kiCurRangeStart]<>nil) and (FKeyBuffers[kiCurRangeEnd]<>nil);
+ RefreshIndexConditional;
+ InternalFirst;
+ DoFilterRecords;
+ First;
+ end;
+end;
+
+procedure TDAMemoryDataset.CancelRange;
+begin
+ CheckBrowseMode;
+ UpdateCursorPos;
+ FRangeActive := False;
+ if FKeyBuffers[kiCurRangeStart].Modified or FKeyBuffers[kiCurRangeEnd].Modified then begin
+ InitKeyBuffer(FKeyBuffers[kiCurRangeStart]);
+ InitKeyBuffer(FKeyBuffers[kiCurRangeEnd]);
+ end;
+ DoFilterRecords;
+end;
+
+procedure TDAMemoryDataset.EditRangeEnd;
+begin
+ SetKeyBuffer(kiRangeEnd, False);
+end;
+
+procedure TDAMemoryDataset.EditRangeStart;
+begin
+ SetKeyBuffer(kiRangeStart, False);
+end;
+
+procedure TDAMemoryDataset.SetRange(const StartValues,
+ EndValues: array of const);
+begin
+ CheckBrowseMode;
+ SetKeyFields(kiRangeStart, StartValues);
+ SetKeyFields(kiRangeEnd, EndValues);
+ ApplyRange;
+end;
+
+procedure TDAMemoryDataset.SetRangeEnd;
+begin
+ SetKeyBuffer(kiRangeEnd, True);
+end;
+
+procedure TDAMemoryDataset.SetRangeStart;
+begin
+ SetKeyBuffer(kiRangeStart, True);
+end;
+
+procedure TDAMemoryDataset.SetKeyBuffer(KeyIndex: TMemKeyIndex; Clear: Boolean);
+begin
+ CheckBrowseMode;
+ RefreshIndexConditional;
+ FKeyBuffer := FKeyBuffers[KeyIndex];
+ Move(FKeyBuffer^, FKeyBuffers[kiSave]^, FKeyBufferSize);
+ if Clear then InitKeyBuffer(FKeyBuffer);
+ FKeyBuffer.FieldCount:= f_DefaultIndexRecord.IndexFieldNameList.Count;
+ SetState(dsSetKey);
+ SetModified(FKeyBuffer.Modified);
+ DataEvent(deDataSetChange, 0);
+end;
+
+procedure TDAMemoryDataset.SetKeyFields(KeyIndex: TMemKeyIndex; const Values: array of const);
+var
+ I: Integer;
+ k: integer;
+ SaveState: TDataSetState;
+begin
+ RefreshIndexConditional;
+ if f_DefaultIndexRecord.IndexFieldNameList.Count = 0 then DatabaseError(SNoFieldIndexes, Self);
+ SaveState := SetTempState(dsSetKey);
+ try
+ if f_DefaultIndexRecord.IndexFieldNameList.Count >= High(Values)-Low(Values)+1 then
+ k:= High(Values)-Low(Values)+1
+ else begin
+ k:= f_DefaultIndexRecord.IndexFieldNameList.Count;
+ {$IFDEF CHECK_RANGE}
+ DatabaseError('Can''t assign values: array size is larger than possible',Self);
+ {$ENDIF CHECK_RANGE}
+ end;
+ FKeyBuffer := InitKeyBuffer(FKeyBuffers[KeyIndex]);
+ for I := 0 to k-1 do
+ TField(f_DefaultIndexRecord.IndexFieldNameList[i]).AssignValue(Values[I]);
+ FKeyBuffer^.FieldCount := High(Values) + 1;
+ FKeyBuffer^.Modified := Modified;
+ finally
+ RestoreState(SaveState);
+ end;
+end;
+
+procedure TDAMemoryDataset.AllocKeyBuffers;
+var
+ KeyIndex: TMemKeyIndex;
+begin
+ try
+ for KeyIndex := Low(TMemKeyIndex) to High(TMemKeyIndex) do
+ FKeyBuffers[KeyIndex] := AllocMem(FKeyBufferSize);
+ if Assigned(FCloneSource) and FCloneSource.Active then
+ for KeyIndex := Low(TMemKeyIndex) to High(TMemKeyIndex) do
+ Move(FCloneSource.FKeyBuffers[KeyIndex]^, FKeyBuffers[KeyIndex]^, FKeyBufferSize);
+ except
+ FreeKeyBuffers;
+ raise;
+ end;
+end;
+
+procedure TDAMemoryDataset.FreeKeyBuffers;
+var
+ KeyIndex: TMemKeyIndex;
+begin
+ for KeyIndex := Low(TMemKeyIndex) to High(TMemKeyIndex) do
+ DisposeMem(FKeyBuffers[KeyIndex], FKeyBufferSize);
+end;
+
+function TDAMemoryDataset.InitKeyBuffer(Buffer: PMemKeyBuffer): PMemKeyBuffer;
+begin
+ FillChar(Buffer^, FKeyBufferSize, 0);
+ Result := Buffer;
+end;
+
+procedure TDAMemoryDataset.SetDetailsFields(const Value: string);
+begin
+ if FDetailFields <> Value then begin
+ FDetailFields := Value;
+ if Active then begin
+ InitDetailFieldNamesList;
+ DoFilterRecords;
+ end;
+ DataEvent(dePropertyChange, 0);
+ end;
+end;
+
+{$IFDEF DELPHI10UP}
+{$WARN SYMBOL_DEPRECATED OFF}
+{$ENDIF DELPHI10UP}
+procedure TDAMemoryDataset.InitDetailFieldNamesList;
+var
+ pos1: integer;
+ fld: TField;
+begin
+ FDetailsFieldNameList.Clear;
+ if FDetailFields = '' then Exit;;
+ Pos1 := 1;
+ while Pos1 <= Length(FDetailFields) do begin
+ Fld := FieldByName(ExtractFieldName(FDetailFields, Pos1));
+ ValidateFieldForIndex(Fld);
+ FDetailsFieldNameList.Add(Fld);
+ end;
+end;
+{$IFDEF DELPHI10UP}
+{$WARN SYMBOL_DEPRECATED ON}
+{$ENDIF DELPHI10UP}
+
+function TDAMemoryDataset.ApplyMasterFilter:boolean;
+var
+ i, j: integer;
+ MasterArray: array of TDAValueStruct;
+ buf: PAnsiChar;
+ flag: boolean;
+ fld_cnt: integer;
+ str: Ansistring;
+ lList: TMemList;
+ ldata: Dataset_PAnsiChar;
+ lBin2: Boolean;
+ lStoreStringsAsReference: Boolean;
+begin
+ FDataList.Clear;
+ if (MasterSource = nil) or (MasterSource.DataSet = nil) or
+ (not MasterSource.DataSet.Active) or (MasterDataLink.Fields.Count = 0) or
+ (FDetailsFieldNameList.Count = 0) then begin
+ // not filtered!
+ lList:=IntGetRecordList.LockListForReading;
+ try
+ FDataList.Assign(LList);
+ finally
+ IntGetRecordList.UnlockListForReading;
+ end;
+ Result := False;
+ end
+ else begin
+ fld_cnt := MasterDataLink.Fields.Count;
+ if FDetailsFieldNameList.Count < fld_cnt then fld_cnt := FDetailsFieldNameList.Count;
+ SetLength(MasterArray, fld_cnt);
+ for i := 0 to fld_cnt - 1 do begin
+ if TField(MasterDataLink.Fields[i]).DataType in ft_AnsiStringValues then
+ MasterArray[i].AsAnsiString := TField(MasterDataLink.Fields[i]).{$IFDEF DELPHI2009UP}asAnsiString{$ELSE}asString{$ENDIF}
+ else if TField(MasterDataLink.Fields[i]).DataType in ft_WideStringValues then
+ MasterArray[i].AsWideString := TWideStringField(MasterDataLink.Fields[i]).Value
+ else if TField(MasterDataLink.Fields[i]).DataType = ftDate then
+ MasterArray[i].Value := DateTimeToTimeStamp(TDateField(MasterDataLink.Fields[i]).AsDateTime).Date
+ else if TField(MasterDataLink.Fields[i]).DataType = ftTime then
+ MasterArray[i].Value := DateTimeToTimeStamp(TTimeField(MasterDataLink.Fields[i]).AsDateTime).Time
+ else
+ MasterArray[i].Value := TField(MasterDataLink.Fields[i]).Value;
+ end;
+ lList:= IntGetRecordList.LockListForReading;
+ try
+ FDataList.Capacity := lList.Count;
+ lStoreStringsAsReference := GetStoreStringsAsReference;
+ for i := 0 to LList.Count - 1 do begin
+ flag := true;
+ ldata := PMemDatasetrecord_Native(LList.FList^[i])^.Data;
+ lBin2 := PMemDatasetrecord_Native(LList.FList^[i])^.Ident = mrBin2Style;
+ for j := 0 to fld_cnt - 1 do begin
+ buf := IntFindFieldData(ldata, TField(FDetailsFieldNameList[j]), lBin2);
+ if (buf <> nil) then
+ case TField(FDetailsFieldNameList[j]).DataType of
+ ftString, ftFixedChar: begin
+ if lBin2 and lStoreStringsAsReference then
+ flag := ROAnsiCompare(PAnsistring(Buf)^, MasterArray[j].AsAnsiString, True {$IFDEF MSWINDOWS}, FSortLocale {$ENDIF}) = 0
+ else
+ flag := ROAnsiCompare(PAnsiChar(Buf), MasterArray[j].AsAnsiString, True {$IFDEF MSWINDOWS}, FSortLocale {$ENDIF}) = 0
+ end;
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}
+ ftWideString: begin
+ if lBin2 and lStoreStringsAsReference then
+ flag := ROWideCompare(PUnicodeString(Buf)^, MasterArray[j].AsWideString,True {$IFDEF MSWINDOWS}, FSortLocale {$ENDIF}) = 0
+ else
+ flag := ROWideCompare(PUnicodeChar(Buf), MasterArray[j].AsWideString,True {$IFDEF MSWINDOWS}, FSortLocale {$ENDIF}) = 0
+ end;
+ ftSmallint: flag := PSmallint(buf)^ = MasterArray[j].value;
+ ftInteger, ftDate, ftTime, ftAutoInc: Flag := PInteger(buf)^ = MasterArray[j].value;
+ ftWord: flag := PWord(buf)^ = MasterArray[j].value;
+ ftBoolean: flag := PWordBool(buf)^ = wordbool(MasterArray[j].value);
+ ftFloat, ftCurrency: flag := PDouble(Buf)^ = MasterArray[j].value;
+ ftDateTime: flag := PDateTime(Buf)^ = MasterArray[j].value;
+ ftBcd: flag := PCurrency(Buf)^ = MasterArray[j].value;
+ ftFMTBCD: flag := BcdCompare(PBcd(buf)^, VariantToBCD(MasterArray[j].value)) = 0;
+ ftLargeint: flag := PInt64(Buf)^ = MasterArray[j].value;
+ {$IFNDEF FPC}
+ ftTimeStamp: flag := SQLTimeStampToDateTime(PSQLTimeStamp(Buf)^) = SQLTimeStampToDateTime(VarToSQLTimeStamp(MasterArray[j].value));
+ {$ENDIF FPC}
+ ftGuid: begin
+ SetString(str, PAnsiChar(Buf), guidsize);
+ flag := ROAnsiCompare(str, MasterArray[j].AsAnsiString, True) = 0;
+ end;
+ {$IFDEF DELPHI2009UP}
+ ftLongWord: flag := PLongWord(Buf)^ = MasterArray[j].value;
+ ftShortint: flag := PShortInt(Buf)^ = MasterArray[j].value;
+ ftByte: flag := PByte(Buf)^ = MasterArray[j].value;
+ ftExtended: flag := PExtended(Buf)^ = MasterArray[j].value;
+ {$ENDIF}
+ {$IFDEF DELPHI2010UP}
+ ftSingle: flag := PSingle(Buf)^ = MasterArray[j].value;
+ {$ENDIF}
+ end
+ else
+ Flag := not VarIsNull(MasterArray[j].value);
+ if not flag then Break;
+ end;
+ if flag then FDataList.Add(lList.FList^[i]);
+ end;
+ finally
+ IntGetRecordList.UnlockListForReading;
+ end;
+ Result := true;
+ end;
+end;
+
+function TDAMemoryDataset.CompareValues_Range(buf: PMemDatasetrecord_Native; keybuffer: PMemKeyBuffer): integer;
+var
+ i, lFieldCount: integer;
+ p1,p2: PAnsiChar;
+ lField: TField;
+ lBuf, lbuf2: Dataset_PAnsiChar;
+ lbin2_1,lbin2_2 :Boolean;
+begin
+ if f_DefaultIndexRecord.IndexFieldNameList.Count >= keybuffer^.FieldCount then begin
+ lFieldCount := keybuffer^.FieldCount
+ end
+ else begin
+ lFieldCount := f_DefaultIndexRecord.IndexFieldNameList.Count;
+ {$IFDEF CHECK_RANGE}
+ DatabaseError('Error during applying range');
+ {$ENDIF CHECK_RANGE}
+ end;
+ Result := 0;
+ lbuf := buf^.Data;
+ lbuf2 := @keybuffer.Data;
+ lbin2_1 := buf^.Ident = mrBin2Style;
+ lbin2_2 := True;
+ For i:=0 to lFieldCount-1 do begin
+ lField := TField(f_DefaultIndexRecord.IndexFieldNameList[i]);
+
+ if (lBuf <> nil) and not GetNullMask(lbuf, GetFieldNo(lField)) then
+ p1 := intFindFieldData(lbuf, lField, lbin2_1)
+ else
+ p1 := nil;
+
+ if not GetNullMask(lbuf2, GetFieldNo(lField)) then
+ p2 := intFindFieldData(lbuf2, lField, lbin2_2)
+ else
+ p2 := nil;
+
+ if (p1 <> nil) and (p2 <> nil) then
+ Result := CompareValues(p1, p2, lField.DataType, f_DefaultIndexRecord.IndexCaseInsList[i] <> nil, lbin2_1, lbin2_2)
+ else if p1 <> nil then Result := 1
+ else if p2 <> nil then Result := -1
+ else Continue;
+
+ if Result <> 0 then break;
+ end;
+end;
+
+procedure TDAMemoryDataset.ApplyRangeFilter;
+begin
+ { TODO : Can be optimized here }
+end;
+
+function TDAMemoryDataset.CompareValues2_full(buf1: pointer;
+ aValue: TDAValueStruct; aDataType: TFieldType;
+ aSortCaseInsensitive: Boolean; abin2: boolean): boolean;
+begin
+ Result := CompareValues2(buf1,aValue,aDataType,aSortCaseInsensitive, abin2) = 0;
+end;
+
+
+function TDAMemoryDataset.FindKey(const KeyValues: array of const): Boolean;
+begin
+ CheckBrowseMode;
+ SetKeyFields(kiLookup, KeyValues);
+ Result := GotoKey;
+end;
+
+procedure TDAMemoryDataset.FindNearest(const KeyValues: array of const);
+begin
+ CheckBrowseMode;
+ SetKeyFields(kiLookup, KeyValues);
+ GotoNearest;
+end;
+
+function TDAMemoryDataset.GotoKey: Boolean;
+begin
+ Result := internalGotoKey(FKeyBuffers[kiLookup], False);
+end;
+
+procedure TDAMemoryDataset.GotoNearest;
+begin
+ internalGotoKey(FKeyBuffers[kiLookup], True);
+end;
+
+procedure TDAMemoryDataset.EditKey;
+begin
+ SetKeyBuffer(kiLookup, False);
+end;
+
+procedure TDAMemoryDataset.SetKey;
+begin
+ SetKeyBuffer(kiLookup, True);
+end;
+
+function TDAMemoryDataset.GetIndexFields: string;
+var
+ i: integer;
+begin
+ Result := '';
+ if FIndexName <> '' then begin
+ if FFieldsIndex then begin
+ Result:=FIndexName
+ end
+ else begin
+ i:= IndexDefs.IndexOf(FIndexName);
+ if i = -1 then DatabaseErrorFmt(SIndexNotFound,[FIndexName]);
+ Result:=IndexDefs[i].Fields;
+ end;
+ end;
+end;
+
+function TDAMemoryDataset.internalGotoKey(const KeyBuffer: PMemKeyBuffer;
+ isNearest: Boolean): Boolean;
+var
+ L, H, I, C : integer;
+begin
+ CheckBrowseMode;
+ DoBeforeScroll;
+ RefreshIndexConditional;
+ if not isNearest then CursorPosChanged;
+ KeyBuffer.FieldCount:= f_DefaultIndexRecord.IndexFieldNameList.Count;
+ IntGetRecordList.LockListForReading;
+ try
+ Result := False;
+ if isNearest then l:= FRecordPos else L := 0;
+ H := FDataList.Count - 1;
+ while L <= H do
+ begin
+ I := (L + H) shr 1;
+ c := CompareValues_Range(FDataList.List[i],KeyBuffer);
+ if C < 0 then
+ L := I + 1
+ else
+ begin
+ H := I - 1;
+ if C = 0 then Result := True;
+ end;
+ end;
+ if Result then
+ FRecordPos := l
+ else if isNearest then begin
+ if L + 1 <= H then
+ FRecordPos := L+1
+ else
+ FRecordPos := L;
+ end;
+ finally
+ IntGetRecordList.UnlockListForReading;
+ end;
+ if not isNearest then begin
+ if Result then begin
+ Resync([rmExact, rmCenter]);
+ DoAfterScroll;
+ end;
+ end else begin
+ Resync([rmCenter]);
+ DoAfterScroll;
+ end;
+end;
+
+function TDAMemoryDataset.GetIsIndexField(Field: TField): Boolean;
+begin
+ with Field do
+ Result:= (FieldNo > 0) and (f_DefaultIndexRecord.IndexFieldNameList.IndexOf(Field) >= 0);
+end;
+
+procedure TDAMemoryDataset.PostKeyBuffer(Commit: Boolean);
+begin
+ DataEvent(deCheckBrowseMode, 0);
+ if Commit then
+ FKeyBuffer.Modified := Modified else
+ Move(FKeyBuffers[kiSave]^, FKeyBuffer^, FKeyBufferSize);
+ SetState(dsBrowse);
+ DataEvent(deDataSetChange, 0);
+end;
+
+procedure TDAMemoryDataset.Post;
+begin
+ inherited;
+ if State = dsSetKey then PostKeyBuffer(True);
+end;
+
+procedure TDAMemoryDataset.Cancel;
+begin
+ inherited;
+ if State = dsSetKey then PostKeyBuffer(False);
+end;
+
+procedure TDAMemoryDataset.RefreshIndexConditional;
+begin
+ if FLastUpdate > f_DefaultIndexRecord.LastSorted then SortOnFields;
+end;
+
+{$IFDEF BDS4UP}{$REGION 'MEM_PACKETRECORDS'}{$ENDIF BDS4UP}
+{$IFDEF MEM_PACKETRECORDS}
+procedure TDAMemoryDataset.CancelPackedMode;
+begin
+{ TODO : }
+ PackedRecordListClear;
+ PackedMode := False;
+end;
+
+procedure TDAMemoryDataset.CommitPackedMode;
+begin
+{ TODO : ApplyChanges }
+ PackedMode := False;
+end;
+
+procedure TDAMemoryDataset.StartPackedMode;
+begin
+ PackedMode := True;
+{ TODO : }
+end;
+
+function TDAMemoryDataset.GetPackedMode: Boolean;
+begin
+{ if FCloneSource <> nil then
+ Result:= FCloneSource.PackedMode
+ else
+}
+ Result := fPackedMode;
+end;
+
+procedure TDAMemoryDataset.SetPackedMode(const Value: Boolean);
+begin
+ if Value and (Value = GetPackedMode) then DatabaseError('Dataset already in packed mode');
+{ if FCloneSource <> nil then
+ FCloneSource.PackedMode := Value
+ else }
+ fPackedMode := Value;
+end;
+
+procedure TDAMemoryDataset.PackedRecordListClear;
+begin
+// MemList_ClearRecords(FPackedRecordsList);
+end;
+{$ENDIF MEM_PACKETRECORDS}
+{$IFDEF BDS4UP}{$ENDREGION}{$ENDIF BDS4UP}
+
+procedure TDAMemoryDataset.MemList_ClearRecords(aMemList: TMemList);
+var
+ i: integer;
+begin
+ for i := aMemList.Count - 1 downto 0 do
+ FreeMemDatasetRecord(aMemList.List[i]);
+ aMemList.Clear;
+end;
+
+function TDAMemoryDataset.LocateByIndex(const aIndexName: string;
+ const KeyValues: Variant): Boolean;
+begin
+ DoBeforeScroll;
+ Result := LocateRecordByIndex(aIndexName, KeyValues, True);
+ if Result then
+ begin
+ Resync([rmExact, rmCenter]);
+ DoAfterScroll;
+ end;
+end;
+
+function TDAMemoryDataset.LookupByIndex(const aIndexName: string;
+ const KeyValues: Variant; const ResultFields: string): Variant;
+begin
+ Result := Null;
+ if LocateRecordByIndex(aIndexName, KeyValues, False) then
+ begin
+ SetTempState(dsCalcFields);
+ try
+ CalculateFields(TempBuffer);
+ Result := FieldValues[ResultFields];
+ finally
+ RestoreState(dsBrowse);
+ end;
+ end;
+end;
+
+function TDAMemoryDataset.LocateRecordByIndex(const aIndexName: string;
+ const KeyValues: Variant; SyncCursor: Boolean): Boolean;
+var
+ i: integer;
+begin
+ i:= IndexDefs.IndexOf(aIndexName);
+ if i = -1 then DatabaseErrorFmt(SIndexNotFound,[aIndexName]);
+ Result := LocateRecordByIndex(i,KeyValues,SyncCursor);
+end;
+
+procedure TDAMemoryDataset.SortOnFields(AIndex: TDAMemIndex);
+begin
+ if FActive then DoSort(AIndex);
+end;
+
+procedure TDAMemoryDataset.IndexList_Clear;
+begin
+ While FIndexList.Count >0 do begin
+ TDAMemIndex(FIndexList.Last).Free;
+ FIndexList.Delete(FIndexList.Count-1);
+ end;
+end;
+
+function TDAMemoryDataset.LocateWithIndex(const LocateStruct: PMemLocateStruct; Buffer: PMemDatasetrecord): boolean;
+var
+ L, H, I, C,j : integer;
+ lBin2: Boolean;
+ lBuf: Dataset_PAnsiChar;
+begin
+ with LocateStruct^ do begin
+ Result := False;
+ L := 0;
+ H := lWorkList.Count - 1;
+ while L <= H do
+ begin
+ I := (L + H) shr 1;
+ c:=0;
+ lBuf:=PMemDatasetrecord_Native(lWorkList[i])^.Data;
+ lBin2:=PMemDatasetrecord_Native(lWorkList[i])^.Ident = mrBin2Style;
+ For j:=0 to lFields.Count-1 do begin
+ if GetNullMask(lBuf ,lFieldIndexes[j]) = lnull[j] then begin
+ if lnull[j] then
+ c := 0 // null | null
+ else
+ if lBin2 then
+ c := CompareValues2(lBuf + lOffsets[j], lValues[j], lDatatypes[j], lcaseIns[j],True) // not null | not null
+ else
+ c := CompareValues2(lBuf + GetBin3Offset(lBuf,lFieldIndexes[j]), lValues[j], lDatatypes[j], lcaseIns[j],True) // not null | not null
+ end
+ else begin
+ if lNull[j] then
+ c := 1 // not null | null
+ else
+ c := -1; // null | not null
+ end;
+ if c <> 0 then begin
+ if ldesc[j] then c:=-c;
+ Break;
+ end;
+ end;
+ if (C < 0) then
+ L := I + 1
+ else
+ begin
+ H := I - 1;
+ if C = 0 then Result := True;
+ end;
+ end;
+ if Result then LocalBufferToDatasetBuffer(lWorkList[l],Buffer);
+ end;
+end;
+
+procedure TDAMemoryDataset.UpdateMemIndexes(AIndex: integer = -1);
+var
+ i: integer;
+begin
+ if Active then begin
+ While FIndexDefs.Count > FIndexList.Count do
+ FIndexList.Add(TDAMemIndex.Create(self));
+
+ While FIndexDefs.Count < FIndexList.Count do begin
+ TDAMemIndex(FIndexList.Last).Free;
+ FIndexList.Delete(FIndexList.Count-1);
+ end;
+
+ if AIndex <> -1 then begin
+ TDAMemIndex(FIndexList[AIndex]).UpdateIndex(FIndexDefs[AIndex]);
+ end
+ else begin
+ For i:= 0 to FIndexDefs.Count -1 do
+ TDAMemIndex(FIndexList[i]).UpdateIndex(FIndexDefs[i]);
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.LocalBufferToDatasetBuffer(LocalBuf: PMemDatasetrecord_Native; DatasetBuffer: PMemDatasetrecord);
+begin
+ IntGetRecordList.LockListForReading;
+ try
+ with DatasetBuffer^.BookmarkData do begin
+ Bookmark := TBookmarkData(LocalBuf);
+ BookmarkFlag := bfCurrent;
+ end;
+ DuplicateBuffer(LocalBuf, Pointer(DatasetBuffer),False);
+ finally
+ IntGetRecordList.UnlockListForReading;
+ end;
+end;
+
+procedure TDAMemoryDataset.PrepareIndexForSorting(const aIndexName: string = '');
+var
+ i: integer;
+begin
+ if aIndexName = '' then begin
+ UpdateMemIndexes(-1);
+ For i := 0 to IndexDefs.Count-1 do
+ DoSort(TDAMemIndex(FIndexList[i]));
+ end
+ else begin
+ i:= IndexDefs.IndexOf(aIndexName);
+ if i = -1 then DatabaseErrorFmt(SIndexNotFound,[aIndexName]);
+ UpdateMemIndexes(i);
+ DoSort(TDAMemIndex(FIndexList[i]));
+ end;
+end;
+
+function TDAMemoryDataset.intLocateRecordByIndex(aIndex: TDAMemIndex;
+ const KeyValues: Variant; SyncCursor: Boolean): Boolean;
+var
+ i: integer;
+ Buffer: PMemDatasetrecord;
+ lBookmark: TMemBookmarkData;
+ lLocateStr: TMemLocateStruct;
+begin
+ Result := False;
+ if Self.State <> dsBrowse then CheckBrowseMode;
+ CursorPosChanged;
+ Buffer := pointer(TempBuffer);
+ if IsEmpty then Exit;
+ try
+ FillChar(lLocateStr, SizeOf(TMemLocateStruct),0);
+ lLocateStr.lFields := aIndex.IndexFieldNameList;
+ InitMemLocateStruct(@lLocateStr, KeyValues);
+ for i:=0 to lLocateStr.lFields.Count-1 do begin
+ lLocateStr.ldesc[i]:=aIndex.IndexDescFields[i]<>nil;
+ lLocateStr.lcaseIns[i] := aIndex.IndexCaseInsList[i]<>nil;
+ end;
+ lLocateStr.lWorkList:= aIndex.DataList;
+ Result := LocateWithIndex(@lLocateStr,Buffer);
+ if Result and SyncCursor then begin
+ SetLength(lBookmark, BookmarkSize);
+ GetBookmarkData(pointer(Buffer), Pointer(lBookmark));
+ end;
+ finally
+ if Result and SyncCursor then begin
+ InternalGotoBookmark(pointer(lBookmark));
+ SetLength(lBookmark, 0);
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.InitMemLocateStruct(AStruct: PMemLocateStruct;
+ const KeyValues: Variant);
+var
+ i: integer;
+begin
+ with AStruct^ do begin
+ SetLength(lOffsets,lFields.Count);
+ SetLength(lDatatypes,lFields.Count);
+ SetLength(lValues,lFields.Count);
+ SetLength(lnull,lFields.Count);
+ SetLength(ldesc,lFields.Count);
+ SetLength(lcaseIns,lFields.Count);
+ SetLength(lFieldIndexes,lFields.Count);
+ for i:=0 to lFields.Count-1 do begin
+ lFieldIndexes[i]:=GetFieldNo(TField(lFields[i]));
+ lOffsets[i] := GetBin2FieldOffset(lFieldIndexes[i]);
+ lDatatypes[i] := TField(lFields[i]).DataType;
+ if lFields.Count = 1 then
+ lValues[i].Value := KeyValues
+ else
+ lValues[i].Value := KeyValues[i];
+ lnull[i]:=VarIsEmpty(lValues[i].Value) or VarIsNull(lValues[i].Value);
+ if not lnull[i] then begin
+ if lDatatypes[i] in ft_AnsiStringValues then
+ lValues[i].AsAnsiString := VarToAnsiStr(lValues[i].Value)
+ else if lDatatypes[i] in ft_WideStringValues then
+ lValues[i].AsWideString := VarToWideStr(lValues[i].Value)
+ else if lDatatypes[i] in [ftDate, ftTime, ftDateTime] then begin
+ case TVarData(lValues[i].Value).VType of
+ varString, varOleStr, varUString: lValues[i].Value := StrToDate(lValues[i].Value);
+ end;
+ case lDatatypes[i] of
+ ftDate: lValues[i].Value := DateTimeToTimeStamp(lValues[i].Value).Date;
+ ftTime: lValues[i].Value := DateTimeToTimeStamp(lValues[i].Value).Time;
+ end;
+ end;
+ end;
+ end;
+ end;
+end;
+
+
+function TDAMemoryDataset.CreateBin3Struct(const ASize: Cardinal): Dataset_PAnsiChar;
+begin
+ {$IFDEF FPC}
+ Result := nil;
+ {$ENDIF FPC}
+ GetMem(Result, ASize);
+end;
+
+function TDAMemoryDataset.GetBin3Offset(Buffer: Dataset_PAnsiChar;
+ const aFieldNo: integer): cardinal;
+begin
+ case pByte(buffer+FNullMaskSize)^ of
+ sizeOf(Byte): Result := PByteArray(Buffer+FNullMaskSize+1)^[aFieldNo];
+ sizeOf(word): Result := PWordArray(Buffer+FNullMaskSize+1)^[aFieldNo];
+ sizeOf(Cardinal): Result := PCardinalArray(Buffer+FNullMaskSize+1)^[aFieldNo];
+ else
+ raise Exception.Create('incompatible buffer format');
+ Result := 0;
+ end;
+end;
+
+function TDAMemoryDataset.CreateMemDatasetRecord(const AType: TmrMode;
+ ABin3Size: Cardinal;
+ ADatasetCompatible: Boolean): PMemDatasetrecord_Native;
+var
+ lRecordSize: Cardinal;
+begin
+ if ADatasetCompatible then
+ lRecordSize := SizeOf(TMemDatasetrecord)
+ else
+ lRecordSize := SizeOf(TMemDatasetrecord_Native);
+ {$IFDEF FPC}
+ Result := nil;
+ {$ENDIF}
+ GetMem(Result, lRecordSize);
+ FillChar(Result^,lRecordSize,0);
+ Result.Ident := AType;
+ case AType of
+ mrEmpty: ;
+ mrBin2Style: Result.Data := CreateBin2Struct;
+ mrBin3Style: Result.Data := CreateBin3Struct(ABin3Size);
+ end;
+end;
+
+function TDAMemoryDataset.CreateBin2Struct: Dataset_PAnsiChar;
+begin
+ {$IFDEF FPC}
+ Result := nil;
+ {$ENDIF FPC}
+ GetMem(Result, FNativeRecordSize);
+ FillChar(Result^, FNullMaskSize, $FF);
+ FillChar((Result+FNullMaskSize)^, FNativeRecordSize-FNullMaskSize, 0);
+end;
+
+procedure TDAMemoryDataset.FreeMemDatasetRecord(Buffer: PMemDatasetrecord_Native);
+begin
+ if Buffer <> nil then begin
+ with buffer^ do
+ case Ident of
+ mrBin2Style: FreeBin2Buffer(Data);
+ mrBin3Style: FreeBin3Buffer(Data);
+ mrEmpty:;
+ end;
+ FreeMem(Buffer);
+ end;
+end;
+
+procedure TDAMemoryDataset.FreeBin2Buffer(Buffer: Dataset_PAnsiChar);
+begin
+ if buffer <> nil then ClearBin2Buffer(Buffer);
+ FreeMem(buffer);
+end;
+
+procedure TDAMemoryDataset.FreeBin3Buffer(Buffer: Dataset_PAnsiChar);
+begin
+ FreeMem(buffer);
+end;
+
+procedure TDAMemoryDataset.ConvertBin3ToBin2Record(Buffer: PMemDatasetrecord_Native);
+var
+ i: integer;
+ source, dest: Dataset_PAnsiChar;
+ k,k1: cardinal;
+ p2: PBlobRecord;
+begin
+ case Buffer^.Ident of
+ mrEmpty: begin
+ Buffer^.Data := CreateBin2Struct;
+ Buffer^.Ident := mrBin2Style;
+ end;
+ mrBin2Style: ; //nothing
+ mrBin3Style: begin
+ source := Buffer^.Data;
+ Dest := CreateBin2Struct;
+ Buffer.Data:= Pointer(dest);
+ Buffer.Ident := mrBin2Style;
+ try
+ Move(pointer(Source)^, pointer(Dest)^, FNullMaskSize);
+
+ for I := 0 to FieldCount - 1 do begin
+ if (not GetNullMask(Source, i)) then begin
+ k := GetBin3Offset(Source, i);
+ k1:= GetBin3Offset(Source, i+1);
+ if not IsReferencedField(FDataTypeArray[i]) then begin
+ Move(pointer(Source + k)^, pointer(Dest + FOffsets[i])^, k1-k)
+ end
+ else begin
+ case FDataTypeArray[i] of
+ ftString,ftFixedChar: PAnsiString(Dest + FOffsets[i])^ := PAnsiString(Source + k)^;
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}
+ ftWideString: PUnicodeString(Dest + FOffsets[i])^ := PUnicodeString(Source + k)^;
+ else
+ if FDataTypeArray[i] in ft_BlobTypes then begin
+ p2 := CreateBlobRecord(k1-k);
+ Move(pointer(Source + k)^, pointer(@p2.Data)^, k1-k);
+ PPointer(Dest + FOffsets[i])^ := p2;
+ end;
+ end;
+ end;
+ end;
+ end;
+ finally
+ FreeBin3Buffer(source);
+ end;
+ end;
+ end;
+end;
+
+function TDAMemoryDataset.CalculateRecordsSize: Cardinal;
+var
+ i,j: integer;
+ List: TMemList;
+ buf: Dataset_PAnsiChar;
+ lStoreStringsAsReference: Boolean;
+begin
+ if FCloneSource <> nil then
+ Result := FCloneSource.CalculateRecordsSize
+ else begin
+ Result:=0;
+ List:=FRecordsList.LockListForReading;
+ try
+ inc(Result, SizeOf(TMemDatasetrecord_Native)*List.Count);
+ lStoreStringsAsReference := GetStoreStringsAsReference;
+ For i:= 0 To List.Count-1 do begin
+ buf:=PMemDatasetrecord_Native(List[i])^.Data;
+ case PMemDatasetrecord_Native(List[i])^.Ident of
+ mrBin2Style : begin
+ inc(Result,FNativeRecordSize);
+ For j := 0 to FieldCount-1 do begin
+ if not GetNullMask(buf,j) then begin
+ if FDataTypeArray[j] in ft_BlobTypes then
+ inc(Result, PBlobRecord(PPointer(buf + FOffsets[j])^)^.size)
+ else if lStoreStringsAsReference then
+ case FDataTypeArray[j] of
+ ftString, ftFixedChar : inc(Result,Length(PAnsiString(buf + FOffsets[j])^)*SizeOf(AnsiChar));
+ {$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}
+ ftWideString:inc(Result,Length(PUnicodeString(buf + FOffsets[j])^)*SizeOf(UnicodeChar));
+ end;
+ end;
+ end;
+ end;
+ mrBin3Style : inc(Result,GetBin3Offset(buf,FieldCount));
+ end;
+ end;
+ finally
+ FRecordsList.UnlockListForReading;
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.ClearBin2Buffer(Buffer: Dataset_PAnsiChar);
+var
+ i: integer;
+begin
+ if GetHasReferencedFields then begin
+ for I := 0 to FieldCount - 1 do
+ if (not GetNullMask(Buffer, i)) and
+ IsReferencedField(FDataTypeArray[i]) and
+ (PPointer(Buffer + FOffsets[i])^ <> nil) then
+ ClearFieldByFieldType(Buffer + FOffsets[i], FDataTypeArray[i]);
+ end;
+end;
+
+function WStrLen(const Str: PUnicodeChar): Cardinal;
+var
+ P : PUnicodeChar;
+begin
+ P := Str;
+ while (P^ <> #0) do Inc(P);
+ Result := (P - Str);
+end;
+
+procedure TDAMemoryDataset.ConvertBin2ToBin3Record(ASource : PMemDatasetrecord_Native);
+var
+ lbin2, lbin3: Dataset_PAnsiChar;
+begin
+ if ASource^.Ident = mrBin2Style then begin
+ lbin2 := ASource^.Data;
+ lBin3 := Bin2ToBin3(lBin2);
+ if lbin3 <> nil then begin
+ FreeBin2Buffer(lBin2);
+ ASource^.Data := lBin3;
+ ASource^.Ident := mrBin3Style;
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.CompactRecords;
+var
+ List: TMemList;
+ i: integer;
+begin
+ if FCloneSource <> nil then
+ FCloneSource.CompactRecords
+ else begin
+ List := FRecordsList.LockListForWriting;
+ try
+ for i:= 0 to List.Count -1 do
+ try
+ ConvertBin2ToBin3Record(List.FList^[i]);
+ except
+ FAutoCompactRecords := FAutoCompactRecords;
+ end;
+ finally
+ FRecordsList.UnlockListForWriting;
+ end;
+ end;
+end;
+
+function TDAMemoryDataset.Bin2ToBin3(ASource: Dataset_PAnsiChar): Dataset_PAnsiChar;
+var
+ i: integer;
+ p1: Dataset_PAnsiChar;
+ lBin2RecordSize, dx: cardinal;
+ lBlobPresent: boolean;
+ loffsets: array of cardinal;
+ lBin2DataSize: array of cardinal;
+ lDatatypeSize: Byte;
+ buf: Dataset_PAnsiChar;
+ lStoreStringsAsReference: Boolean;
+begin
+ Result := nil;
+ lBin2RecordSize := 0;
+ lBlobPresent := False;
+ SetLength(loffsets, FieldCount+1);
+ SetLength(lBin2DataSize, FieldCount);
+ loffsets[0] := 0;
+ lStoreStringsAsReference := GetStoreStringsAsReference;
+ For i := 0 to FieldCount-1 do begin
+ if GetNullMask(ASource, i) then begin
+ lBin2DataSize[i] := 0;
+ end
+ else begin
+ if FDataTypeArray[i] in ft_BlobTypes then begin
+ lBlobPresent := True;
+ lBin2DataSize[i] := PBlobRecord(PPointer(ASource + FOffsets[i])^)^.size;
+ end
+ else if FDataTypeArray[i] in [ftString, ftFixedChar] then begin
+ if lStoreStringsAsReference then
+ lBin2DataSize[i] := Length(PAnsiString(ASource + FOffsets[i])^)
+ else
+ lBin2DataSize[i] := StrLen(PAnsiChar(ASource + FOffsets[i]));
+ inc(lBin2DataSize[i],SizeOf(AnsiChar)); // #0
+ end
+ else if FDataTypeArray[i] in [{$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}ftWideString] then begin
+ if lStoreStringsAsReference then
+ lBin2DataSize[i] := Length(PUnicodeString(ASource + FOffsets[i])^)*SizeOf(UnicodeChar)
+ else
+ lBin2DataSize[i] := WStrLen(PUnicodeChar(ASource + FOffsets[i]))*SizeOf(UnicodeChar);
+ inc(lBin2DataSize[i], SizeOf(UnicodeChar)); // #0
+ end
+ else
+ lBin2DataSize[i]:= FDataSizeArray[i];
+ end;
+ loffsets[i+1] := loffsets[i]+ lBin2DataSize[i];
+ inc(lBin2RecordSize, lBin2DataSize[i]);
+ end;
+ inc(lBin2RecordSize, FNullMaskSize+SizeOf(Byte));
+ if lBin2RecordSize <= $FF - (Cardinal(FieldCount)+1)*SizeOf(Byte) then
+ lDatatypeSize := SizeOf(Byte)
+ else if lBin2RecordSize <= $FFFF - Cardinal(FieldCount+1)*SizeOf(Word) then
+ lDatatypeSize := SizeOf(Word)
+ else
+ lDatatypeSize := SizeOf(Cardinal);
+ inc(lBin2RecordSize,(FieldCount+1)*lDatatypeSize);
+ if (FNativeRecordSize > lBin2RecordSize) or lStoreStringsAsReference or lBlobPresent then begin
+ // convert it!
+ Result:=CreateBin3Struct(lBin2RecordSize);
+ p1 := Result;
+ move(ASource^, p1^, FNullMaskSize);
+ PByte(p1 + FNullMaskSize)^ := lDatatypeSize;
+ dx:=FNullMaskSize+SizeOf(Byte);
+ inc(p1, dx);
+ inc(dx,(FieldCount+1)*lDatatypeSize);
+ case lDatatypeSize of
+ SizeOf(Byte): for i:=0 to FieldCount do PBytearray(p1)^[i] := loffsets[i]+dx;
+ SizeOf(Word): for i:=0 to FieldCount do PWordArray(p1)^[i] := loffsets[i]+dx;
+ SizeOf(Cardinal): for i:=0 to FieldCount do PCardinalArray(p1)^[i] := loffsets[i]+dx;
+ end;
+ inc(p1, (FieldCount+1)*lDatatypeSize);
+ for i:=0 to FieldCount-1 do begin
+ if lBin2DataSize[i] > 0 then begin
+ buf := ASource + FOffsets[i];
+ if FDataTypeArray[i] in ft_BlobTypes then begin
+ move(PBlobRecord(PPointer(buf)^)^.Data, p1^,lBin2DataSize[i]);
+ end
+ else if FDataTypeArray[i] in [ftString, ftFixedChar] then begin
+ dx := lBin2DataSize[i]-SizeOf(AnsiChar);
+ if lStoreStringsAsReference then
+ Move(pointer(PAnsiString(buf)^)^, p1^, dx)
+ else
+ move(buf^, p1^, dx);
+ PAnsiChar(p1+dx)^ := #0;
+ end
+ else if FDataTypeArray[i] in [{$IFDEF DA_FixedWideCharSupport}ftFixedWideChar,{$ENDIF DA_FixedWideCharSupport}ftWideString] then begin
+ dx := lBin2DataSize[i] - SizeOf(UnicodeChar);
+ if lStoreStringsAsReference then
+ Move(pointer(PUnicodeString(buf)^)^, p1^, dx)
+ else
+ move(buf^, p1^, dx);
+ PUnicodeChar(p1+dx)^ := #0;
+ end
+ else
+ move(buf^, p1^, lBin2DataSize[i]);
+ inc(p1, lBin2DataSize[i]);
+ end;
+ end;
+ end;
+end;
+
+
+procedure TDAMemoryDataset.SetAutoPackRecords(const Value: boolean);
+begin
+ FAutoCompactRecords := Value;
+ if FAutoCompactRecords then CompactRecords;
+end;
+
+procedure TDAMemoryDataset.Assign(Source: TPersistent);
+var
+ lSource: TDAMemoryDataset;
+begin
+ inherited;
+ if Source is TDAMemoryDataset then begin
+ lSource := TDAMemoryDataset(Source);
+
+ Active := False;
+
+ AfterCancel := lSource.AfterCancel;
+ AfterClose := lSource.AfterClose;
+ AfterDelete := lSource.AfterDelete;
+ AfterEdit := lSource.AfterEdit;
+ AfterInsert := lSource.AfterInsert;
+ AfterOpen := lSource.AfterOpen;
+ AfterPost := lSource.AfterPost;
+ AfterRefresh := lSource.AfterRefresh;
+ AfterScroll := lSource.AfterScroll;
+ AutoSortRecords := lSource.AutoSortRecords;
+ BeforeCancel := lSource.BeforeCancel;
+ BeforeClose := lSource.BeforeClose;
+ BeforeDelete := lSource.BeforeDelete;
+ BeforeEdit := lSource.BeforeEdit;
+ BeforeInsert := lSource.BeforeInsert;
+ BeforeOpen := lSource.BeforeOpen;
+ BeforePost := lSource.BeforePost;
+ BeforeRefresh := lSource.BeforeRefresh;
+ BeforeScroll := lSource.BeforeScroll;
+ CloneSource := lSource.CloneSource;
+ DetailFields := lSource.DetailFields;
+ FieldDefs := lSource.FieldDefs;
+ Filter := lSource.Filter;
+ Filtered := lSource.Filtered;
+ IndexDefs := lSource.IndexDefs;
+ IndexFieldNames := lSource.IndexFieldNames;
+ IndexName := lSource.IndexName;
+ MasterFields := lSource.MasterFields;
+ MasterSource := lSource.MasterSource;
+ OnCalcFields := lSource.OnCalcFields;
+ OnDeleteError := lSource.OnDeleteError;
+ OnEditError := lSource.OnEditError;
+ OnFilterRecord := lSource.OnFilterRecord;
+ OnNewRecord := lSource.OnNewRecord;
+ OnPostError := lSource.OnPostError;
+ ReadOnly := lSource.ReadOnly;
+ Active := lSource.Active;
+ end;
+end;
+
+procedure TDAMemoryDataset.AssignCloneSource(Source: TDAMemoryDataset);
+begin
+ if Source = nil then begin
+ Filtered := False;
+ Filter := '';
+ OnFilterRecord := nil;
+ IndexDefs.Clear;
+ IndexName := '';
+ MasterSource := nil;
+ MasterFields := '';
+ DetailFields := '';
+ ReadOnly := False;
+ end
+ else begin
+ Filter := Source.Filter;
+ OnFilterRecord := Source.OnFilterRecord;
+ Filtered := Source.Filtered;
+ IndexDefs.Assign(Source.IndexDefs);
+ if Source.IndexName <> '' then
+ IndexName := Source.IndexName
+ else
+ IndexFieldNames := Source.IndexFieldNames;
+ MasterSource := Source.MasterSource;
+ MasterFields := Source.MasterFields;
+ DetailFields := Source.DetailFields;
+ ReadOnly := Source.ReadOnly;
+ end;
+end;
+
+procedure TDAMemoryDataset.SetCloneSource(const Value: TDAMemoryDataset);
+var
+ FOldActive : Boolean;
+begin
+ if (Value <> nil) and (Value <> FMemCloneSource) then CheckforCircularLinks(Value,True);
+
+ if Value = Self then DatabaseError(Self.Name+ ': Can''t use itself as clonesource dataset');
+ FOldActive := Active;
+ Close;
+ if FMemCloneSource <> Value then begin
+ if not IsLoadingState then begin
+ if FMemCloneSource <> nil then begin
+ FMemCloneSource.UnregisterPermanentClient(Self);
+ AssignCloneSource(nil);
+ end;
+ end;
+ FMemCloneSource := Value;
+
+ if (FMemCloneSource <> nil) then begin
+ FMemCloneSource.RegisterPermanentClient(Self);
+ if not IsLoadingState then AssignCloneSource(FMemCloneSource);
+ end;
+
+ end;
+ if FOldActive then Open;
+end;
+
+procedure TDAMemoryDataset.RegisterPermanentClient(
+ const AClient: TDAMemoryDataset);
+begin
+ if FClonePermanentClientList = nil then FClonePermanentClientList:=TThreadList.Create;
+ FClonePermanentClientList.Add(AClient);
+end;
+
+procedure TDAMemoryDataset.RegisterPermanentClients;
+var
+ lClient: TDAMemoryDataset;
+ i: integer;
+begin
+ if FClonePermanentClientList <> nil then begin
+ with FClonePermanentClientList.LockList do try
+ For I := 0 to Count - 1 do begin
+ lClient:= TDAMemoryDataset(Items[i]);
+ if Assigned(lClient) then begin
+ RegisterClient(lClient);
+ lClient.RegisterPermanentClients;
+ end;
+ end;
+ finally
+ FClonePermanentClientList.UnlockList;
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.UnregisterPermanentClients;
+var
+ i: integer;
+ lList: TList;
+ lClient: TDAMemoryDataset;
+begin
+ if FClonePermanentClientList <> nil then begin
+ lList:= FClonePermanentClientList.LockList;
+ try
+ for i:= lList.Count-1 downto 0 do begin
+ lClient:= TDAMemoryDataset(lList[i]);
+ if Assigned(lClient) then UnregisterClient(lClient);
+ end;
+ lList.Clear;
+ finally
+ FClonePermanentClientList.UnlockList;
+ end;
+ end;
+end;
+
+procedure TDAMemoryDataset.UnregisterPermanentClient(
+ const AClient: TDAMemoryDataset);
+begin
+ if FClonePermanentClientList <> nil then
+ FClonePermanentClientList.Remove(AClient);
+end;
+
+procedure TDAMemoryDataset.AttachToSource(const Source: TDAMemoryDataset);
+var
+ fOldActive: Boolean;
+begin
+ if Source <> FCloneSource then begin
+ DetachFromSource;
+ fOldActive:= Active;
+ Close;
+ FCloneSource := Source;
+ if fOldActive then Open;
+ end;
+end;
+
+procedure TDAMemoryDataset.CheckforCircularLinks(ASource: TDataset; CheckForClone: Boolean);
+
+ procedure _CheckInPermanentClients(APermSource: TDAMemoryDataset);
+ var
+ i: integer;
+ lList: TList;
+ lDataset: TDAMemoryDataset;
+ begin
+ if (APermSource.FClonePermanentClientList <> nil) then begin
+ lList := APermSource.FClonePermanentClientList.LockList;
+ try
+ for i:=0 to lList.Count-1 do begin
+ lDataset := TDAMemoryDataset(lList[i]);
+ if lDataset = ASource then DatabaseError(SCircularDataLink, Self);
+ _CheckInPermanentClients(lDataset);
+ end;
+ finally
+ APermSource.FClonePermanentClientList.UnlockList;
+ end;
+ end;
+ if (APermSource.MasterSource <> nil) and
+ (APermSource.MasterSource.DataSet <> nil) and
+ (APermSource.MasterSource.DataSet is TDAMemoryDataset) then
+ _CheckInPermanentClients(TDAMemoryDataset(APermSource.MasterSource.DataSet));
+ end;
+
+begin
+ if ASource = nil then Exit;
+ if ASource = Self then DatabaseError(SCircularDataLink, Self);
+
+ if CheckForClone then begin
+ if ((MasterSource <> nil) and (ASource = MasterSource.DataSet)) then DatabaseError(SCircularDataLink, Self);
+ if ASource.IsLinkedTo(MasterSource) then DatabaseError(SCircularDataLink, Self);
+ end
+ else begin
+ if (ASource = FMemCloneSource) then DatabaseError(SCircularDataLink, Self);
+ end;
+
+ if (ASource is TDAMemoryDataset) then begin
+ // check in parent MasterSources
+ if (TDAMemoryDataset(ASource).MasterSource <> nil) then CheckforCircularLinks(TDAMemoryDataset(ASource).MasterSource.DataSet, CheckForClone);
+ // check in parent clonesources
+ CheckforCircularLinks(TDAMemoryDataset(ASource).FMemCloneSource,CheckForClone);
+ end;
+
+ _CheckInPermanentClients(Self);
+end;
+
+function TDAMemoryDataset.IsLoadingState: Boolean;
+begin
+ Result := (csLoading in ComponentState);
+end;
+
+procedure TDAMemoryDataset.SetAutoSort(const Value: Boolean);
+begin
+ FAutoSort := Value;
+ if FAutoSort then IntAutoSort(nil,True);
+end;
+
+procedure TDAMemoryDataset.IntAutoSort(ABuf : PMemDatasetrecord_Native; ANeedResync: Boolean);
+var
+ lbookmark: pointer;
+ k: integer;
+ st: TDataSetState;
+begin
+ if Active then begin
+ if FAutoSort and (FIndexName <> '') then begin
+ if ABuf = nil then begin
+ lbookmark:=GetBookmark;
+ if lbookmark <> nil then ABuf := TBookMarkData(PPointer(lBookmark)^);
+ end;
+ SortOnFields;
+ if ABuf <> nil then
+ k := IntFindRecordID(ABuf)
+ else
+ k := -1;
+ if k <> -1 then begin
+ st := State;
+ if St = dsInsert then SetState(dsBrowse);
+ try
+ FRecordPos := k;
+ Resync([rmExact, rmCenter]);
+ finally
+ if st <> State then SetState(st);
+ end;
+ end;
+ end
+ else
+ if ANeedResync then Resync([]);
+ end;
+end;
+
+procedure TDAMemoryDataset.DoAfterCancel;
+begin
+ if peaResort in FPostEditActions then begin
+ IntAutoSort(nil, True);
+ FPostEditActions := [];
+ end;
+ inherited;
+end;
+
+{ TDABlobStream }
+
+constructor TDABlobStream.Create(Field: TBlobField; Mode: TBlobStreamMode);
+var
+ lbuf: Dataset_PAnsiChar;
+begin
+ inherited Create;
+ FMode := Mode;
+ FField := Field;
+ FDataSet := FField.DataSet as TDAMemoryDataset;
+ if not FDataSet.GetActiveRecBuf(lBuf) then Exit;
+ FBuffer := PMemDatasetrecord_Native(lBuf);
+ if not FField.Modified and (Mode <> bmRead) then begin
+ if FField.ReadOnly then DatabaseErrorFmt({$IFDEF FPC}SReadOnlyField{$ELSE}SFieldReadOnly{$ENDIF}, [FField.DisplayName]);
+ if not (FDataSet.State in [dsEdit, dsInsert]) then DatabaseError(SNotEditing);
+ FCached := True;
+ end
+ else
+ FCached := (lBuf = FDataSet.ActiveBuffer);
+ FOpened := True;
+ if Mode = bmWrite then Truncate;
+end;
+
+destructor TDABlobStream.Destroy;
+begin
+ if FOpened and FModified then FField.Modified := True;
+ if FModified then try
+ FDataSet.DataEvent(deFieldChange, Longint(FField));
+ except
+ {$IFDEF FPC}
+ if assigned(classes.ApplicationHandleException) then
+ classes.ApplicationHandleException(self)
+ else
+ ShowException(ExceptObject,ExceptAddr);
+ {$ELSE}
+ Application.HandleException(Self);
+ {$ENDIF}
+ end;
+ inherited Destroy;
+end;
+
+procedure TDABlobStream.GetBLOBRecordFromRecord(Field: TField; out aLocked:Boolean; out blob_size: integer; out blob_data: pointer);
+var
+ Pos: Integer;
+begin
+ Pos := FDataSet.FRecordPos;
+ if (Pos < 0) and (FDataSet.RecordCount > 0) then
+ Pos := 0
+ else if Pos >= FDataSet.RecordCount then
+ Pos := FDataSet.RecordCount - 1;
+ if (Pos >= 0) and (Pos < FDataSet.RecordCount) then begin
+ GetBLOBRecordFromBuffer(FDataSet.IntGetRecordList.LockListForReading[Pos], Field, blob_size, blob_data);
+ ALocked:=True;
+ end
+ else begin
+ blob_data:=nil;
+ blob_size:=0;
+ end;
+end;
+
+function TDABlobStream.GetBlobSize: Longint;
+var
+ llocked: Boolean;
+ ldata: pointer;
+begin
+ Result := 0;
+ if FOpened then begin
+ if FCached then begin
+ GetBLOBRecordFromBuffer(FBuffer, FField,Result,ldata);
+ end
+ else begin
+ GetBLOBRecordFromRecord(FField, llocked,Result, ldata);
+ if llocked then FDataSet.IntGetRecordList.UnlockListForReading;
+ end;
+ end;
+end;
+
+function TDABlobStream.GetBLOBRecordFromBuffer(Buffer: PMemDatasetrecord_Native; Field: TField;out blob_size: integer; out blob_data: pointer): PBLOBRecord;
+begin
+ case Buffer^.Ident of
+ mrBin2Style: begin
+ Result := PPointer(FDataSet.IntFindFieldData(Buffer^.Data, Field, True))^;
+ if Result <> nil then begin
+ with Result^ do begin
+ blob_data := @Data;
+ blob_size := size;
+ end;
+ end
+ else begin
+ blob_data := nil;
+ blob_size := 0;
+ end;
+ end;
+ mrBin3Style: begin
+ blob_size := FDataSet.GetBin3Offset(Buffer^.Data,FDataSet.GetFieldNo(Field)+1)-FDataSet.GetBin3Offset(Buffer^.Data,FDataSet.GetFieldNo(Field));
+ blob_data := FDataSet.IntFindFieldData(Buffer^.Data, Field, False);
+ Result := nil;
+ end;
+ else
+ blob_data := nil;
+ blob_size := 0;
+ Result := nil;
+ end;
+end;
+
+function TDABlobStream.Read(var Buffer; Count: Integer): Longint;
+var
+ llocked: boolean;
+ lData: pointer;
+ lSize: integer;
+begin
+ llocked:=False;
+ Result := 0;
+ if FOpened then begin
+ if Count > Size - FPosition then
+ Result := Size - FPosition
+ else
+ Result := Count;
+ if Result > 0 then begin
+ if FCached then
+ GetBLOBRecordFromBuffer(FBuffer, FField,lSize,lData)
+ else
+ GetBLOBRecordFromRecord(FField,llocked,lSize,lData);
+ try
+ if lSize <> 0 then begin
+ Move(Dataset_PAnsiChar(lData)[FPosition], Buffer, Result);
+ Inc(FPosition, Result);
+ end;
+ finally
+ if llocked then FDataSet.IntGetRecordList.UnlockListForReading;
+ end;
+ end;
+ end;
+end;
+
+function TDABlobStream.Seek(Offset: Integer; Origin: Word): Longint;
+begin
+ case Origin of
+ soFromBeginning: FPosition := Offset;
+ soFromCurrent: Inc(FPosition, Offset);
+ soFromEnd: FPosition := GetBlobSize + Offset;
+ end;
+ Result := FPosition;
+end;
+
+procedure TDABlobStream.Truncate;
+begin
+ if FOpened and FCached and (FMode <> bmRead) then begin
+ FDataset.ConvertBin3ToBin2Record(FBuffer);
+ FDataset.ClearBin2Field(FBuffer^.Data, FField);
+ FModified := True;
+ end;
+end;
+
+function TDABlobStream.Write(const Buffer; Count: Integer): Longint;
+var
+ Temp: PBLOBRecord;
+ lblobSize: integer;
+ lBlobData: pointer;
+begin
+ Result := 0;
+ if FOpened and FCached and (FMode <> bmRead) then begin
+ Temp := GetBLOBRecordFromBuffer(FBuffer, FField,lblobSize,lBlobData);
+ if temp = nil then begin
+ temp := CreateBlobRecord(FPosition + Count);
+ end
+ else if Temp.size + SizeOf(TBLOBRecord) < Cardinal(FPosition + Count) then begin
+ ReallocMem(temp, SizeOf(TBLOBRecord) + FPosition); // compact date before realloc
+ ReallocMem(temp, SizeOf(TBLOBRecord) + FPosition + Count);
+ inc(Temp.size, Count);
+ end;
+ Move(Buffer, PAnsiChar(@Temp.Data)[FPosition], Count);
+ FDataset.SetBlobData(FField, FBuffer, Temp);
+ Inc(FPosition, Count);
+ Result := Count;
+ FModified := True;
+ end;
+end;
+
+{ TThreadMemList }
+
+procedure TThreadMemList.Add(Item: Pointer);
+begin
+ LockListForWriting;
+ try
+ FList.Add(Item);
+ finally
+ UnlockListForWriting;
+ end;
+end;
+
+procedure TThreadMemList.Clear;
+begin
+ LockListForWriting;
+ try
+ FList.Clear;
+ finally
+ UnlockListForWriting;
+ end;
+end;
+
+constructor TThreadMemList.Create;
+begin
+ inherited Create;
+ {$IFDEF FPC}
+ InitCriticalSection(FLock);
+ {$ELSE}
+ InitializeCriticalSection(FLock);
+ {$ENDIF}
+ FList := TMemList.Create;
+ FReadLock:=0;
+end;
+
+destructor TThreadMemList.Destroy;
+begin
+ LockListForWriting; // Make sure nobody else is inside the list.
+ try
+ FList.Free;
+ inherited Destroy;
+ finally
+ UnlockListForWriting;
+ {$IFDEF FPC}
+ DoneCriticalSection(FLock);
+ {$ELSE}
+ DeleteCriticalSection(FLock);
+ {$ENDIF}
+ end;
+end;
+
+function TThreadMemList.LockListForReading: TMemList;
+begin
+ if FReadLock = 0 then EnterCriticalSection(FLock);
+ inc(FReadLock);
+ Result := FList;
+end;
+
+function TThreadMemList.LockListForWriting: TMemList;
+begin
+ EnterCriticalSection(FLock);
+ Result := FList;
+end;
+
+procedure TThreadMemList.Remove(Item: Pointer);
+begin
+ LockListForWriting;
+ try
+ FList.Remove(Item);
+ finally
+ UnlockListForWriting;
+ end;
+end;
+
+
+procedure TThreadMemList.UnlockListForReading;
+begin
+ Dec(FReadLock);
+ if FReadLock = 0 then LeaveCriticalSection(FLock);
+end;
+
+procedure TThreadMemList.UnlockListForWriting;
+begin
+ LeaveCriticalSection(FLock);
+end;
+
+{$IFDEF BDS4UP}{$REGION 'MEM_PACKETRECORDS'}{$ENDIF BDS4UP}
+{$IFDEF MEM_PACKETRECORDS}
+{ TMemPackedRecord }
+
+constructor TMemPackedRecord.Create(AOwner: TMemPackedRecords);
+begin
+ fOwner := AOwner;
+ if AOwner = nil then DatabaseError('AOwner should be assigned');
+ fBuffer:= AOwner.fOwner.IntAllocRecordBuffer(True);
+end;
+
+destructor TMemPackedRecord.Destroy;
+begin
+ fOwner.fOwner.IntFreeRecordBuffer(fBuffer);
+ inherited;
+end;
+
+function TMemPackedRecord.GetIsNull(Index: Integer): Boolean;
+begin
+ Result := fOwner.fOwner.GetNullMask(fBuffer,Index);
+end;
+
+function TMemPackedRecord.GetValues(Index: Integer): Variant;
+begin
+ Result := FOwner.fOwner.GetVarValueFromBuffer(fBuffer,FOwner.fOwner.Fields[Index]);
+end;
+
+function TMemPackedRecord.GetValuesByFieldName(AName: string): Variant;
+begin
+ Result := FOwner.fOwner.GetVarValueFromBuffer(fBuffer,FOwner.fOwner.FieldByName(AName));
+end;
+
+procedure TMemPackedRecord.SetIsNull(Index: Integer; const Value: Boolean);
+begin
+ fOwner.fOwner.ClearBin2Field(fBuffer,fOwner.fOwner.Fields[Index]);
+ fOwner.fOwner.SetNullMask(fBuffer,Index,Value);
+end;
+
+procedure TMemPackedRecord.SetValues(Index: Integer; const Value: Variant);
+begin
+
+end;
+
+procedure TMemPackedRecord.SetValuesByFieldName(AName: string;
+ const Value: Variant);
+begin
+
+end;
+
+{ TMemPackedRecords }
+
+function TMemPackedRecords.Add: TMemPackedRecord;
+begin
+ Result:= TMemPackedRecord.Create(Self);
+ fList.Add(Result);
+end;
+
+procedure TMemPackedRecords.Clear;
+var
+ i: integer;
+begin
+ For i:= 0 to fList.Count - 1 do
+ TMemPackedRecord(fList[i]).Free;
+ fList.Clear;
+end;
+
+constructor TMemPackedRecords.Create(AOwner: TDAMemoryDataset);
+begin
+ fOwner := AOwner;
+ fList := TList.Create;
+end;
+
+procedure TMemPackedRecords.Delete(aIndex: integer);
+var
+ lRec: TMemPackedRecord;
+begin
+ lRec := TMemPackedRecord(fList.Items[aIndex]);
+ fList.Delete(aIndex);
+ lRec.Free;
+end;
+
+destructor TMemPackedRecords.Destroy;
+begin
+ Clear;
+ fList.Free;
+ inherited;
+end;
+
+function TMemPackedRecords.GetCount: Integer;
+begin
+ Result:= fList.Count;
+end;
+
+function TMemPackedRecords.GetItems(Index: Integer): TMemPackedRecord;
+begin
+ Result := TMemPackedRecord(fList[Index]);
+end;
+{$ENDIF MEM_PACKETRECORDS}
+{$IFDEF BDS4UP}{$ENDREGION}{$ENDIF BDS4UP}
+
+{ TDAMemIndex }
+
+procedure TDAMemIndex.Clear;
+begin
+ FInit_FieldNames:= '';
+ FInit_CaseInsFields:='';
+ FInit_DescFields:='';
+ FIndexDef_Options:= [];
+ FIndexDef_Fields:='';
+ FIndexDef_DescFields:='';
+ FIndexDef_CaseInsFields:='';
+ FIndexCaseInsList.Clear;
+ FIndexDescFields.Clear;
+ FIndexFieldNameList.Clear;
+ FSortDescMode := False;
+ FDataList.Clear;
+ FLastSorted := 0;
+end;
+
+constructor TDAMemIndex.Create(AOwner: TDAMemoryDataset);
+begin
+ inherited Create;
+ FOwner := AOwner;
+ FIndexCaseInsList:= TList.Create;
+ FIndexDescFields := TList.Create;
+ FIndexFieldNameList := TList.Create;
+ FSortDescMode := False;
+ FInitFromIndexDef := False;
+ FLastSorted := 0;
+ FDataList:=TMemList.Create;
+end;
+
+destructor TDAMemIndex.Destroy;
+begin
+ Clear;
+ FIndexCaseInsList.Free;
+ FIndexDescFields.Free;
+ FIndexFieldNameList.Free;
+ FDataList.Free;
+ inherited;
+end;
+
+{$IFDEF DELPHI10UP}
+{$WARN SYMBOL_DEPRECATED OFF}
+{$ENDIF DELPHI10UP}
+procedure TDAMemIndex.Init(const AFieldNames: string; const CaseInsFields: string = ''; const DescFields: string='');
+var
+ pos1: integer;
+ fld: TField;
+ j: integer;
+begin
+ Clear;
+ FInit_FieldNames:= AFieldNames;
+ FInit_CaseInsFields:=CaseInsFields;
+ FInit_DescFields:=DescFields;
+
+ Pos1 := 1;
+ while Pos1 <= Length(AFieldNames) do begin
+ Fld := FOwner.FieldByName(ExtractFieldName(AFieldNames, Pos1));
+ FOwner.ValidateFieldForIndex(Fld);
+ FIndexFieldNameList.Add(Fld);
+ end;
+
+ //CaseInsFields
+ FIndexCaseInsList.Count := FIndexFieldNameList.Count;
+ Pos1 := 1;
+ while Pos1 <= Length(CaseInsFields) do begin
+ Fld := FOwner.FieldByName(ExtractFieldName(CaseInsFields, Pos1));
+ j := FIndexFieldNameList.IndexOf(Fld);
+ if j <> -1 then FIndexCaseInsList[j]:=pointer(1) ;
+ end;
+
+ // DescFields
+ FIndexDescFields.Count := FIndexFieldNameList.Count;
+ Pos1 := 1;
+ while Pos1 <= Length(DescFields) do begin
+ Fld := FOwner.FieldByName(ExtractFieldName(DescFields, Pos1));
+ j:= IndexFieldNameList.IndexOf(Fld);
+ if j <> -1 then FIndexDescFields[j]:=pointer(1);
+ end;
+end;
+{$IFDEF DELPHI10UP}
+{$WARN SYMBOL_DEPRECATED ON}
+{$ENDIF DELPHI10UP}
+
+
+function TDAMemIndex.GetDataList: TMemList;
+begin
+ if FInitFromIndexDef then
+ Result := FDataList
+ else
+ Result := FOwner.FDataList;
+end;
+
+procedure TDAMemIndex.Init(AIndexDef: TIndexDef);
+var
+ lCaseInsField, lDescFields: string;
+begin
+ lCaseInsField := AIndexDef.CaseInsFields;
+ if (lCaseInsField = '') and (ixCaseInsensitive in AIndexDef.Options) then
+ lCaseInsField := AIndexDef.Fields;
+ lDescFields := AIndexDef.DescFields;
+ if (lDescFields = '') and (ixDescending in AIndexDef.Options) then
+ lDescFields := AIndexDef.Fields;
+ Init(AIndexDef.Fields, lCaseInsField,lDescFields);
+ FInitFromIndexDef := True;
+ FIndexDef_Options:=AIndexDef.Options;
+ FIndexDef_Fields:=AIndexDef.Fields;
+ FIndexDef_DescFields:=AIndexDef.DescFields;
+ FIndexDef_CaseInsFields:=AIndexDef.CaseInsFields;
+end;
+
+procedure TDAMemIndex.Init(const Fields: string; CaseInsensitive,
+ Descending: Boolean);
+var
+ i: integer;
+begin
+ Init(Fields);
+
+ if CaseInsensitive then FInit_CaseInsFields := FInit_FieldNames;
+ for i:= 0 to IndexCaseInsList.Count-1 do
+ IndexCaseInsList[i]:= Pointer({$IFDEF FPC}PtrUInt{$ELSE}cardinal{$ENDIF}(ord(CaseInsensitive)));
+
+ if Descending then FInit_DescFields := FInit_FieldNames;
+ FSortDescMode:= Descending;
+ for i:= 0 to IndexDescFields.Count-1 do
+ IndexDescFields[i]:= Pointer({$IFDEF FPC}PtrUInt{$ELSE}cardinal{$ENDIF}(ord(Descending)));
+end;
+
+function TDAMemIndex.IsValid: boolean;
+begin
+ Result := FIndexFieldNameList.Count > 0;
+end;
+
+procedure TDAMemIndex.UpdateIndex(AIndexDef: TIndexDef);
+begin
+ if not ((AIndexDef.Fields = FIndexDef_Fields) and
+ (AIndexDef.CaseInsFields = FIndexDef_CaseInsFields) and
+ (AIndexDef.DescFields = FIndexDef_DescFields) and
+ (AIndexDef.Options = FIndexDef_Options)) then Init(AIndexDef);
+end;
+
+function TDAMemIndex.isCanUsed(const Fields: string; CaseInsensitive: Boolean): boolean;
+var
+ lcase: string;
+begin
+ if CaseInsensitive then lcase:= Fields else lcase := '';
+ Result :=
+ IsValid and
+ (FLastSorted > FOwner.FLastUpdate) and
+ // eugene: 20080407: AnsiSameText
+ AnsiSameText(FInit_FieldNames,Fields) and
+ AnsiSameText(FInit_CaseInsFields,lcase) and
+ (AnsiSameText(FInit_DescFields,Fields) or (FInit_DescFields=''));
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMySQLInterfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMySQLInterfaces.pas
new file mode 100644
index 0000000..a106431
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAMySQLInterfaces.pas
@@ -0,0 +1,810 @@
+unit uDAMySQLInterfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ SysUtils, DB,
+ uDAInterfaces, uDAEngine, uROClasses, uDAUtils;
+
+type
+ { IDAMySQLConnection
+ For identification purposes Implemented by all MySQL connections }
+ IDAMySQLConnection = interface(IDAConnection)
+ ['{EB62495C-E922-45B3-B8DC-5DFCD787D3C8}']
+ end;
+
+ TDAMySQLDriver = class(TDAEDriver)
+ protected
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetAuxParams(const AuxDriver: string; out List: IROStrings); override;
+ function GetDefaultCustomParameters: string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ TDAMySQLConnection = class(TDAEConnection, IDAMySQLConnection, IDACanQueryDatabaseNames)
+ private
+ FMySQLVersion: integer;
+ function GetMySQLVersion: integer;
+ protected
+ function GetTableSchema: string; virtual;
+ function useUnicode:Boolean; virtual;
+ protected
+ procedure DoApplyConnectionString(aConnStrParser: TDAConnectionStringParser; aConnectionObject: TCustomConnection); override;
+ function DoGetLastAutoInc(const GeneratorName: string): integer; override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ function GetDatabaseNames: IROStrings;
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ constructor Create(aDriver: TDAEDriver; aName: string = ''); override;
+ property MySQLVersion: integer read GetMySQLVersion;
+ end;
+
+function MySQL_GetLastAutoInc(const GeneratorName: string; Query: IDADataset): variant;
+function MYSQL_GetDefaultCustomParameters: string;
+procedure MYSQL_GetAuxParams(List: IROStrings);
+function MYSQL_GetDatabaseNames(AConnection: TDAEConnection): IROStrings;
+procedure MYSQL_DoGetNames(Query: IDADataset; AList: IROStrings; AObjectType: TDAObjecttype; aSchema: string; AMySQLVersion: integer);
+procedure MYSQL_DoGetForeignKeys(Query: IDADataset; ForeignKeys: TDADriverForeignKeyCollection; aSchema: string; AMySQLVersion: integer);
+procedure MYSQL_DoGetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection; aSchema: string; AMySQLVersion: integer; useUnicode: Boolean=False);
+procedure MYSQL_DoGetStoredProcedureParams(const aStoredProcedureName: string; Query: IDADataset; out Params: TDAParamCollection; aSchema: string);
+function MYSQL_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+function MYSQL_GetVersion(Query: IDADataset): cardinal;
+
+const
+ MySQL_DriverType = 'MySQL';
+
+implementation
+uses
+ StrUtils;
+
+var
+ mysql_reservedwords : array of string;
+
+function MySQL_GetLastAutoInc(const GeneratorName: string; Query: IDADataset): variant;
+begin
+ try
+ Query.SQL := 'SELECT LAST_INSERT_ID()';
+ Query.Open;
+ Result := Query.Fields[0].Value;
+ finally
+ Query := nil;
+ end;
+end;
+
+function MYSQL_GetDefaultCustomParameters: string;
+begin
+ Result := 'Port=3306;';
+end;
+
+procedure MYSQL_GetAuxParams(List: IROStrings);
+begin
+ List.Add('Port=');
+end;
+{ TDAMySQLDriver }
+
+procedure TDAMySQLDriver.GetAuxParams(const AuxDriver: string;
+ out List: IROStrings);
+begin
+ inherited;
+ MYSQL_GetAuxParams(List);
+end;
+
+function TDAMySQLDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+function TDAMySQLDriver.GetDefaultCustomParameters: string;
+begin
+ Result := MYSQL_GetDefaultCustomParameters;
+end;
+
+function MYSQL_GetDatabaseNames(AConnection: TDAEConnection): IROStrings;
+begin
+ Result := Engine_GetDatabaseNames(AConnection,'MySQL','SHOW DATABASES');
+end;
+
+procedure MYSQL_DoGetNames(Query: IDADataset; AList: IROStrings; AObjectType: TDAObjecttype; aSchema: string;AMySQLVersion: integer);
+const
+ sDoGetTableNames =
+ 'SELECT TABLE_NAME ' +
+ 'FROM INFORMATION_SCHEMA.TABLES ' +
+ 'WHERE TABLE_TYPE = ''%s'' AND TABLE_SCHEMA = ''%s''';
+ sDOGetProcedures =
+ 'SELECT ROUTINE_NAME ' +
+ 'FROM INFORMATION_SCHEMA.ROUTINES ' +
+ 'WHERE ROUTINE_TYPE = ''PROCEDURE'' AND ROUTINE_SCHEMA = ''%s''';
+begin
+ try
+ if AMySQLVersion < 50000 then begin
+ case AObjectType of
+ dotTable: Query.SQL := Format('SHOW TABLES FROM %s',[aSchema]);
+ dotView: Query.SQL := ''; // not supported
+ dotProcedure: Query.SQL := '';// not supported
+ end;
+ end
+ else begin
+ case AObjectType of
+ dotTable: Query.SQL := Format(sDoGetTableNames, ['BASE TABLE', aSchema]);
+ dotView: Query.SQL := Format(sDoGetTableNames, ['VIEW', aSchema]);
+ dotProcedure: Query.SQL := Format(sDOGetProcedures, [aSchema]);
+ end;
+ end;
+ if Query.SQL <> '' then begin
+ Query.Open;
+ while not Query.Eof do begin
+ Alist.Add(Query.Fields[0].AsString);
+ Query.Next;
+ end;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+procedure MYSQL_DoGetForeignKeys(Query: IDADataset; ForeignKeys: TDADriverForeignKeyCollection; aSchema: string; AMySQLVersion: integer);
+var
+ lCurrConstraint : string;
+ lCurrFK : TDADriverForeignKey;
+const
+ sFK_SQL =
+ 'SELECT ' +
+ 'TABLE_NAME, REFERENCED_TABLE_NAME, COLUMN_NAME, REFERENCED_COLUMN_NAME ' +
+ 'FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE ' +
+ 'WHERE CONSTRAINT_SCHEMA=''%s'' AND REFERENCED_TABLE_NAME IS NOT NULL';
+begin
+ ForeignKeys.Clear;
+ lCurrConstraint := '';
+ lCurrFK := nil;
+ try
+ if AMySQLVersion >=50000 then begin
+ Query.SQL := Format(sFK_SQL, [aSchema]);
+ Query.Open;
+
+ while (not Query.EOF) do begin
+ if lCurrConstraint <> Query.Fields[0].AsString + '|' + Query.Fields[1].AsString then begin
+ lCurrConstraint := Query.Fields[0].AsString + '|' + Query.Fields[1].AsString;
+
+ lCurrFK := ForeignKeys.Add();
+ with lCurrFK do begin
+ PKTable := TrimRight(Query.Fields[0].AsString);
+ FKTable := TrimRight(Query.Fields[1].AsString);
+ PKField := TrimRight(Query.Fields[2].AsString);
+ FKField := TrimRight(Query.Fields[3].AsString);
+ end;
+ end else begin
+ with lCurrFK do begin
+ PKField := PKField + ';' + TrimRight(Query.Fields[2].AsString);
+ FKField := FKField + ';' + TrimRight(Query.Fields[3].AsString);
+ end;
+ end;
+ Query.Next;
+ end;
+ end
+ else begin
+ // not implemented
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+function MySQLDataTypeToDA(aDataType: string; Unicode, AutoInc, Unsigned: boolean): TDADataType;
+begin
+ aDataType := LowerCase(aDataType);
+ if (aDAtaType = 'char') or (aDAtaType = 'varchar') or
+ (aDAtaType = 'binary') or (aDAtaType = 'varbinary') or
+ (aDataType = 'enum') or (aDataType = 'set') then begin
+ if Unicode then
+ Result := datWideString
+ else
+ Result := datString;
+ end
+ else if (aDataType = 'text') or (aDataType = 'longtext') or
+ (aDataType = 'tinytext') or (aDataType = 'mediumtext') then begin
+ if Unicode then
+ Result := datWideMemo
+ else
+ Result := datMemo;
+ end
+ else if (aDataType = 'blob') or (aDataType = 'tinyblob') or
+ (aDataType = 'mediumblob') or (aDataType = 'longblob') then
+ Result := datBlob
+ else if (aDataType = 'date') or (aDataType = 'time') or (aDataType = 'datetime') or (aDataType = 'timestamp') then
+ result := datDateTime
+ else if (aDataType = 'bit') then
+ Result := datLargeUInt
+ else if (aDataType = 'tinyint') then begin
+ if Unsigned then
+ result := datByte
+ else
+ result := datShortInt
+ end
+ else if (aDataType = 'smallint') then begin
+ if Unsigned then
+ Result := datWord
+ else
+ Result := datSmallInt
+ end
+ else if (aDataType = 'year') then
+ Result := datWord
+ else if (aDataType = 'mediumint') or (aDataType = 'int') or (aDataType = 'integer') then begin
+ if AutoInc then
+ Result := datAutoInc
+ else if Unsigned then
+ Result := datCardinal
+ else
+ result := datInteger
+ end
+ else if (aDataType = 'bigint') then begin
+ if AutoInc then
+ Result := datLargeAutoInc
+ else if Unsigned then
+ Result := datLargeUInt
+ else
+ result := datLargeInt
+ end
+ else if (aDataType = 'float') then begin
+ Result := datSingleFloat
+ end
+ else if (aDataType = 'double') then begin
+ Result := datFloat
+ end
+ else if (aDataType = 'decimal') then
+ result := datDecimal
+ else
+ result := datUnknown;
+end;
+
+procedure MYSQL_DoGetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection; aSchema: string; AMySQLVersion: integer;useUnicode: Boolean);
+const
+ sGetTableFields =
+ 'SELECT ' +
+ //TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE, COLUMN_KEY, EXTRA, PRIVILEGES, COLUMN_COMMENT
+ 'COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, CHARACTER_MAXIMUM_LENGTH, CHARACTER_SET_NAME, COLUMN_KEY, COLUMN_COMMENT, EXTRA, COLUMN_TYPE,NUMERIC_PRECISION, NUMERIC_SCALE ' +
+ 'FROM INFORMATION_SCHEMA.COLUMNS ' +
+ 'WHERE ' +
+ '(TABLE_SCHEMA = ''%s'') AND (TABLE_NAME = ''%s'') ' +
+ 'ORDER BY ORDINAL_POSITION';
+var
+ fld : TDAField;
+ s,s1: string;
+ i: integer;
+begin
+ try
+ if AMySQLVersion >= 50000 then begin
+ Query.SQL := Format(sGetTableFields, [aSchema, aTableName]);
+ Query.Open;
+ Fields := TDAFieldCollection.Create(nil);
+ while not Query.Eof do begin
+ fld := Fields.Add;
+ fld.Name := Query.Fields[0].AsString;
+ fld.Required := Query.Fields[2].AsString <> 'YES';
+ if not Query.Fields[3].IsNull then
+ fld.DefaultValue := Query.Fields[3].AsString;
+ fld.InPrimaryKey := SameText(Query.Fields[6].AsString, 'PRI');
+ fld.Description := Query.Fields[7].AsString;
+ fld.DataType := MysqlDataTypeToDA(Query.Fields[1].asString, useUnicode and ( sametext(Query.Fields[5].AsString, 'utf8') or sametext(Query.Fields[5].AsString, 'ucs2')), SameText(Query.Fields[8].AsString, 'auto_increment'), pos(' unsigned',LowerCase(Query.Fields[9].AsString))>0);
+ if fld.DataType <> datBlob then fld.Size := GetVarInt64(Query.Fields[4].Value);
+ if fld.DataType = datDecimal then begin
+ fld.DecimalPrecision:=Query.Fields[10].AsInteger;
+ fld.DecimalScale:=Query.Fields[11].AsInteger;
+ end;
+ if fld.DefaultValue <> '' then begin
+ if not TestDefaultValue(fld.DefaultValue, fld.DataType) then
+ fld.DefaultValue := '';
+ end;
+ Query.Next;
+ end;
+ end
+ else begin
+ query.SQL := Format('SHOW FULL COLUMNS FROM %s FROM %s', [ATableName, aSchema]);
+ Query.Open;
+ Fields := TDAFieldCollection.Create(nil);
+ while not Query.Eof do begin
+ fld := Fields.Add;
+ fld.Name := Query.FieldByName('Field').AsString;
+ fld.InPrimaryKey := Query.FieldByName('Key').AsString = 'PRI';
+ fld.Required := Query.FieldByName('Null').AsString <> 'YES';
+ s:=Query.FieldByName('Type').AsString;
+ i := pos('(',s);
+ if i > 0 then begin
+ s1:= copy(s,1,i-1);
+ delete(s,1,i);
+ SetLength(s, Length(s)-1);
+ end
+ else begin
+ s1:=s;
+ s:='';
+ end;
+ if not Query.FieldByName('Default').IsNull then
+ fld.DefaultValue := Query.FieldByName('Default').AsString;
+ fld.DataType := MysqlDataTypeToDA(s1, useUnicode and ( sametext(Query.FieldByName('COLLATION').AsString, 'utf8') or sametext(Query.FieldByName('Extra').AsString, 'ucs2')), SameText(Query.Fields[8].AsString, 'auto_increment'), False);
+ fld.Description := Query.FieldByNAme('Comment').AsString;
+ if s <> '' then begin
+ i:= pos(',', s);
+ if i = 0 then begin
+ fld.Size:=StrToIntDef(s,0)
+ end
+ else begin
+ fld.DecimalPrecision:=StrToIntDef(copy(s,1,i-1),0);
+ fld.DecimalScale:=StrToIntDef(copy(s,i+1, length(s)),0);
+ end;
+ end;
+ Query.Next;
+ end;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+procedure MYSQL_DoGetStoredProcedureParams(const aStoredProcedureName: string; Query: IDADataset; out Params: TDAParamCollection; aSchema: string);
+const
+ sSQL = 'SELECT PARAM_LIST FROM MYSQL.PROC WHERE DB = ''%s'' AND NAME = ''%s''';
+ sError = 'Can''t parse procedures params';
+ aValidChars = ['A'..'Z', 'a'..'z', '0'..'9','_'];
+var
+ par : TDAParam;
+ s, s1 : string;
+ p, p1 : pchar;
+begin
+ try
+ Query.SQL := Format(sSQL, [aSchema, aStoredProcedureName]);
+ Query.Open;
+ Params := TDAParamCollection.Create(nil);
+ if (not Query.Eof) and (not Query.Fields[0].IsNull) then begin
+ s := Query.Fields[0].AsString;
+ p := Pchar(s);
+ repeat
+ while p^ = ',' do inc(p);
+ while p^ = ' ' do inc(p);
+ if p^ = #0 then Exit;
+ par := Params.Add;
+ p1 := p;
+ while CharInSet(p1^ , aValidChars) do inc(p1);
+ if p1^ = #0 then exit;
+ SetString(s1, p, p1 - p);
+ s1 := Lowercase(s1);
+ if s1 = 'in' then par.ParamType := daptInput
+ else if s1 = 'out' then par.ParamType := daptOutput
+ else if s1 = 'inout' then par.ParamType := daptInputOutput;
+ if par.ParamType <> daptUnknown then begin
+ while p1^ = ' ' do inc(p1);
+ p := p1;
+ while CharInSet(p1^ , aValidChars) do inc(p1);
+ if p1^ = #0 then exit;
+ SetString(s1, p, p1 - p);
+ end
+ else begin
+ par.ParamType := daptInput;
+ end;
+ par.Name := s1;
+ while p1^ = ' ' do inc(p1);
+ p := p1;
+ while CharInSet(p1^, aValidChars) do inc(p1);
+ SetString(s1, p, p1 - p);
+ par.DataType := MysqlDataTypeToDA(s1, sametext(s1, 'utf8') or sametext(s1, 'ucs2'), False, pos(' unsigned',s1)>0);
+ if p1^ = #0 then exit;
+ while p1^ = ' ' do inc(p1);
+ p := p1;
+ until p^ <> ',';
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+function MYSQL_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+begin
+ result := TestIdentifier(iIdentifier, mysql_reservedwords);
+end;
+
+function MYSQL_GetVersion(Query: IDADataset): cardinal;
+
+ function ExtractValue(var s:string): integer;
+ var
+ i: integer;
+ begin
+ Result := 0;
+ i := pos('.',s);
+ if i > 0 then begin
+ Result := StrToIntDef(Copy(s,1,i-1),0);
+ Delete(s,1,i);
+ exit;
+ end;
+ i := pos('-',s);
+ if i > 0 then begin
+ Result := StrToIntDef(Copy(s,1,i-1),0);
+ Delete(s,1,i);
+ exit;
+ end;
+ i:=0;
+ while CharInSet(s[i+1],['0'..'9']) do begin
+ inc(i);
+ if Length(s) >=i then break;
+ end;
+ if i > 0 then begin
+ Result := StrToIntDef(Copy(s,1,i-1),0);
+ Delete(s,1,i-1);
+ end;
+ end;
+
+var
+ s: string;
+begin
+ try
+ Query.SQL:= 'SHOW VARIABLES like "version"';
+ Query.Open;
+ if Query.EOF then
+ Result:=50000
+ else begin
+ s:= Query.Fields[1].AsString;
+ Result :=
+ ExtractValue(s)*10000 +
+ ExtractValue(s)*100 +
+ ExtractValue(s);
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+{ TDAMySQLConnection }
+
+constructor TDAMySQLConnection.Create(aDriver: TDAEDriver; aName: string);
+begin
+ inherited;
+ FMySQLVersion:=-1;
+end;
+
+procedure TDAMySQLConnection.DoApplyConnectionString(
+ aConnStrParser: TDAConnectionStringParser;
+ aConnectionObject: TCustomConnection);
+begin
+ inherited;
+ FMySQLVersion := -1;
+end;
+
+procedure TDAMySQLConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ inherited;
+ MYSQL_DoGetForeignKeys(GetDatasetClass.Create(Self), ForeignKeys, GetTableSchema,MySQLVersion);
+end;
+
+function TDAMySQLConnection.DoGetLastAutoInc(
+ const GeneratorName: string): integer;
+begin
+ Result := DoGetLastAutoIncValue(GeneratorName);
+end;
+
+function TDAMySQLConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+begin
+ Result := MySQL_GetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+end;
+
+procedure TDAMySQLConnection.DoGetStoredProcedureNames(
+ out List: IROStrings);
+begin
+ inherited;
+ MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotProcedure, GetTableSchema,MySQLVersion);
+end;
+
+procedure TDAMySQLConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ MYSQL_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params, GetTableSchema);
+end;
+
+procedure TDAMySQLConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ MYSQL_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), GetDatasetClass.Create(Self), Fields, GetTableSchema,MySQLVersion, useUnicode);
+end;
+
+procedure TDAMySQLConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited;
+ MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotTable, GetTableSchema,MySQLVersion);
+end;
+
+procedure TDAMySQLConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited;
+ MYSQL_DoGetNames(GetDatasetClass.Create(Self), List, dotView, GetTableSchema,MySQLVersion);
+end;
+
+function TDAMySQLConnection.GetDatabaseNames: IROStrings;
+begin
+ Result := MYSQL_GetDatabaseNames(Self);
+end;
+
+
+function TDAMySQLConnection.GetMySQLVersion: integer;
+begin
+ if FMySQLVersion = -1 then FMySQLVersion := MYSQL_GetVersion(GetDatasetClass.Create(Self));
+ Result := FMySQLVersion;
+end;
+
+function TDAMySQLConnection.GetTableSchema: string;
+begin
+ with TDAConnectionStringParser.Create(GetConnectionString) do try
+ Result := Database;
+ finally
+ Free;
+ end;
+end;
+
+procedure MYSQL_InitializeReservedWords;
+begin
+ SetLength(mysql_reservedwords, 230);
+ // sorted with TStringList.Sort (bds2007)
+ mysql_reservedwords[0] := '_BINARY';
+ mysql_reservedwords[1] := 'ACTION';
+ mysql_reservedwords[2] := 'ADD';
+ mysql_reservedwords[3] := 'ALL';
+ mysql_reservedwords[4] := 'ALTER';
+ mysql_reservedwords[5] := 'ANALYZE';
+ mysql_reservedwords[6] := 'AND';
+ mysql_reservedwords[7] := 'AS';
+ mysql_reservedwords[8] := 'ASC';
+ mysql_reservedwords[9] := 'ASENSITIVE';
+ mysql_reservedwords[10] := 'BEFORE';
+ mysql_reservedwords[11] := 'BETWEEN';
+ mysql_reservedwords[12] := 'BIGINT';
+ mysql_reservedwords[13] := 'BINARY';
+ mysql_reservedwords[14] := 'BIT';
+ mysql_reservedwords[15] := 'BLOB';
+ mysql_reservedwords[16] := 'BOTH';
+ mysql_reservedwords[17] := 'BY';
+ mysql_reservedwords[18] := 'CALL';
+ mysql_reservedwords[19] := 'CASCADE';
+ mysql_reservedwords[20] := 'CASE';
+ mysql_reservedwords[21] := 'CHANGE';
+ mysql_reservedwords[22] := 'CHAR';
+ mysql_reservedwords[23] := 'CHARACTER';
+ mysql_reservedwords[24] := 'CHECK';
+ mysql_reservedwords[25] := 'COLLATE';
+ mysql_reservedwords[26] := 'COLUMN';
+ mysql_reservedwords[27] := 'CONDITION';
+ mysql_reservedwords[28] := 'CONSTRAINT';
+ mysql_reservedwords[29] := 'CONTINUE';
+ mysql_reservedwords[30] := 'CONVERT';
+ mysql_reservedwords[31] := 'CREATE';
+ mysql_reservedwords[32] := 'CROSS';
+ mysql_reservedwords[33] := 'CURRENT_DATE';
+ mysql_reservedwords[34] := 'CURRENT_TIME';
+ mysql_reservedwords[35] := 'CURRENT_TIMESTAMP';
+ mysql_reservedwords[36] := 'CURRENT_USER';
+ mysql_reservedwords[37] := 'CURSOR';
+ mysql_reservedwords[38] := 'DATABASE';
+ mysql_reservedwords[39] := 'DATABASES';
+ mysql_reservedwords[40] := 'DATE';
+ mysql_reservedwords[41] := 'DAY_HOUR';
+ mysql_reservedwords[42] := 'DAY_MICROSECOND';
+ mysql_reservedwords[43] := 'DAY_MINUTE';
+ mysql_reservedwords[44] := 'DAY_SECOND';
+ mysql_reservedwords[45] := 'DEC';
+ mysql_reservedwords[46] := 'DECIMAL';
+ mysql_reservedwords[47] := 'DECLARE';
+ mysql_reservedwords[48] := 'DEFAULT';
+ mysql_reservedwords[49] := 'DELAYED';
+ mysql_reservedwords[50] := 'DELETE';
+ mysql_reservedwords[51] := 'DESC';
+ mysql_reservedwords[52] := 'DESCRIBE';
+ mysql_reservedwords[53] := 'DETERMINISTIC';
+ mysql_reservedwords[54] := 'DISTINCT';
+ mysql_reservedwords[55] := 'DISTINCTROW';
+ mysql_reservedwords[56] := 'DIV';
+ mysql_reservedwords[57] := 'DOUBLE';
+ mysql_reservedwords[58] := 'DROP';
+ mysql_reservedwords[59] := 'DUAL';
+ mysql_reservedwords[60] := 'EACH';
+ mysql_reservedwords[61] := 'ELSE';
+ mysql_reservedwords[62] := 'ELSEIF';
+ mysql_reservedwords[63] := 'ENCLOSED';
+ mysql_reservedwords[64] := 'ENUM';
+ mysql_reservedwords[65] := 'ESCAPED';
+ mysql_reservedwords[66] := 'EXISTS';
+ mysql_reservedwords[67] := 'EXIT';
+ mysql_reservedwords[68] := 'EXPLAIN';
+ mysql_reservedwords[69] := 'FALSE';
+ mysql_reservedwords[70] := 'FETCH';
+ mysql_reservedwords[71] := 'FLOAT';
+ mysql_reservedwords[72] := 'FLOAT4';
+ mysql_reservedwords[73] := 'FLOAT8';
+ mysql_reservedwords[74] := 'FOR';
+ mysql_reservedwords[75] := 'FORCE';
+ mysql_reservedwords[76] := 'FOREIGN';
+ mysql_reservedwords[77] := 'FROM';
+ mysql_reservedwords[78] := 'FULLTEXT';
+ mysql_reservedwords[79] := 'GRANT';
+ mysql_reservedwords[80] := 'GROUP';
+ mysql_reservedwords[81] := 'HAVING';
+ mysql_reservedwords[82] := 'HIGH_PRIORITY';
+ mysql_reservedwords[83] := 'HOUR_MICROSECOND';
+ mysql_reservedwords[84] := 'HOUR_MINUTE';
+ mysql_reservedwords[85] := 'HOUR_SECOND';
+ mysql_reservedwords[86] := 'IF';
+ mysql_reservedwords[87] := 'IGNORE';
+ mysql_reservedwords[88] := 'IN';
+ mysql_reservedwords[89] := 'INDEX';
+ mysql_reservedwords[90] := 'INFILE';
+ mysql_reservedwords[91] := 'INNER';
+ mysql_reservedwords[92] := 'INOUT';
+ mysql_reservedwords[93] := 'INSENSITIVE';
+ mysql_reservedwords[94] := 'INSERT';
+ mysql_reservedwords[95] := 'INT';
+ mysql_reservedwords[96] := 'INT1';
+ mysql_reservedwords[97] := 'INT2';
+ mysql_reservedwords[98] := 'INT3';
+ mysql_reservedwords[99] := 'INT4';
+ mysql_reservedwords[100] := 'INT8';
+ mysql_reservedwords[101] := 'INTEGER';
+ mysql_reservedwords[102] := 'INTERVAL';
+ mysql_reservedwords[103] := 'INTO';
+ mysql_reservedwords[104] := 'IS';
+ mysql_reservedwords[105] := 'ITERATE';
+ mysql_reservedwords[106] := 'JOIN';
+ mysql_reservedwords[107] := 'KEY';
+ mysql_reservedwords[108] := 'KEYS';
+ mysql_reservedwords[109] := 'KILL';
+ mysql_reservedwords[110] := 'LEADING';
+ mysql_reservedwords[111] := 'LEAVE';
+ mysql_reservedwords[112] := 'LEFT';
+ mysql_reservedwords[113] := 'LIKE';
+ mysql_reservedwords[114] := 'LIMIT';
+ mysql_reservedwords[115] := 'LINES';
+ mysql_reservedwords[116] := 'LOAD';
+ mysql_reservedwords[117] := 'LOCALTIME';
+ mysql_reservedwords[118] := 'LOCALTIMESTAMP';
+ mysql_reservedwords[119] := 'LOCK';
+ mysql_reservedwords[120] := 'LONG';
+ mysql_reservedwords[121] := 'LONGBLOB';
+ mysql_reservedwords[122] := 'LONGTEXT';
+ mysql_reservedwords[123] := 'LOOP';
+ mysql_reservedwords[124] := 'LOW_PRIORITY';
+ mysql_reservedwords[125] := 'MATCH';
+ mysql_reservedwords[126] := 'MEDIUMBLOB';
+ mysql_reservedwords[127] := 'MEDIUMINT';
+ mysql_reservedwords[128] := 'MEDIUMTEXT';
+ mysql_reservedwords[129] := 'MIDDLEINT';
+ mysql_reservedwords[130] := 'MINUTE_MICROSECOND';
+ mysql_reservedwords[131] := 'MINUTE_SECOND';
+ mysql_reservedwords[132] := 'MOD';
+ mysql_reservedwords[133] := 'MODIFIES';
+ mysql_reservedwords[134] := 'NATURAL';
+ mysql_reservedwords[135] := 'NO';
+ mysql_reservedwords[136] := 'NO_WRITE_TO_BINLOG';
+ mysql_reservedwords[137] := 'NOT';
+ mysql_reservedwords[138] := 'NULL';
+ mysql_reservedwords[139] := 'NUMERIC';
+ mysql_reservedwords[140] := 'ON';
+ mysql_reservedwords[141] := 'OPTIMIZE';
+ mysql_reservedwords[142] := 'OPTION';
+ mysql_reservedwords[143] := 'OPTIONALLY';
+ mysql_reservedwords[144] := 'OR';
+ mysql_reservedwords[145] := 'ORDER';
+ mysql_reservedwords[146] := 'OUT';
+ mysql_reservedwords[147] := 'OUTER';
+ mysql_reservedwords[148] := 'OUTFILE';
+ mysql_reservedwords[149] := 'PRECISION';
+ mysql_reservedwords[150] := 'PRIMARY';
+ mysql_reservedwords[151] := 'PROCEDURE';
+ mysql_reservedwords[152] := 'PURGE';
+ mysql_reservedwords[153] := 'RAID0';
+ mysql_reservedwords[154] := 'READ';
+ mysql_reservedwords[155] := 'READS';
+ mysql_reservedwords[156] := 'REAL';
+ mysql_reservedwords[157] := 'REFERENCES';
+ mysql_reservedwords[158] := 'REGEXP';
+ mysql_reservedwords[159] := 'RELEASE';
+ mysql_reservedwords[160] := 'RENAME';
+ mysql_reservedwords[161] := 'REPEAT';
+ mysql_reservedwords[162] := 'REPLACE';
+ mysql_reservedwords[163] := 'REQUIRE';
+ mysql_reservedwords[164] := 'RESTRICT';
+ mysql_reservedwords[165] := 'RETURN';
+ mysql_reservedwords[166] := 'REVOKE';
+ mysql_reservedwords[167] := 'RIGHT';
+ mysql_reservedwords[168] := 'RLIKE';
+ mysql_reservedwords[169] := 'SCHEMA';
+ mysql_reservedwords[170] := 'SCHEMAS';
+ mysql_reservedwords[171] := 'SECOND_MICROSECOND';
+ mysql_reservedwords[172] := 'SELECT';
+ mysql_reservedwords[173] := 'SENSITIVE';
+ mysql_reservedwords[174] := 'SEPARATOR';
+ mysql_reservedwords[175] := 'SET';
+ mysql_reservedwords[176] := 'SHOW';
+ mysql_reservedwords[177] := 'SMALLINT';
+ mysql_reservedwords[178] := 'SONAME';
+ mysql_reservedwords[179] := 'SPATIAL';
+ mysql_reservedwords[180] := 'SPECIFIC';
+ mysql_reservedwords[181] := 'SQL';
+ mysql_reservedwords[182] := 'SQL_BIG_RESULT';
+ mysql_reservedwords[183] := 'SQL_CALC_FOUND_ROWS';
+ mysql_reservedwords[184] := 'SQL_SMALL_RESULT';
+ mysql_reservedwords[185] := 'SQLEXCEPTION';
+ mysql_reservedwords[186] := 'SQLSTATE';
+ mysql_reservedwords[187] := 'SQLWARNING';
+ mysql_reservedwords[188] := 'SSL';
+ mysql_reservedwords[189] := 'STARTING';
+ mysql_reservedwords[190] := 'STRAIGHT_JOIN';
+ mysql_reservedwords[191] := 'TABLE';
+ mysql_reservedwords[192] := 'TERMINATED';
+ mysql_reservedwords[193] := 'TEXT';
+ mysql_reservedwords[194] := 'THEN';
+ mysql_reservedwords[195] := 'TIME';
+ mysql_reservedwords[196] := 'TIMESTAMP';
+ mysql_reservedwords[197] := 'TINYBLOB';
+ mysql_reservedwords[198] := 'TINYINT';
+ mysql_reservedwords[199] := 'TINYTEXT';
+ mysql_reservedwords[200] := 'TO';
+ mysql_reservedwords[201] := 'TRAILING';
+ mysql_reservedwords[202] := 'TRIGGER';
+ mysql_reservedwords[203] := 'TRUE';
+ mysql_reservedwords[204] := 'UNDO';
+ mysql_reservedwords[205] := 'UNION';
+ mysql_reservedwords[206] := 'UNIQUE';
+ mysql_reservedwords[207] := 'UNLOCK';
+ mysql_reservedwords[208] := 'UNSIGNED';
+ mysql_reservedwords[209] := 'UPDATE';
+ mysql_reservedwords[210] := 'USAGE';
+ mysql_reservedwords[211] := 'USE';
+ mysql_reservedwords[212] := 'USING';
+ mysql_reservedwords[213] := 'UTC_DATE';
+ mysql_reservedwords[214] := 'UTC_TIME';
+ mysql_reservedwords[215] := 'UTC_TIMESTAMP';
+ mysql_reservedwords[216] := 'VALUES';
+ mysql_reservedwords[217] := 'VARBINARY';
+ mysql_reservedwords[218] := 'VARCHAR';
+ mysql_reservedwords[219] := 'VARCHARACTER';
+ mysql_reservedwords[220] := 'VARYING';
+ mysql_reservedwords[221] := 'WHEN';
+ mysql_reservedwords[222] := 'WHERE';
+ mysql_reservedwords[223] := 'WHILE';
+ mysql_reservedwords[224] := 'WITH';
+ mysql_reservedwords[225] := 'WRITE';
+ mysql_reservedwords[226] := 'X509';
+ mysql_reservedwords[227] := 'XOR';
+ mysql_reservedwords[228] := 'YEAR_MONTH';
+ mysql_reservedwords[229] := 'ZEROFILL';
+end;
+
+function TDAMySQLConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(iIdentifier) or MYSQL_IdentifierNeedsQuoting(iIdentifier);
+end;
+
+function TDAMySQLConnection.useUnicode: Boolean;
+begin
+ Result:=False;
+end;
+
+initialization
+ mysql_InitializeReservedWords;
+finalization
+ mysql_reservedwords := nil;
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAOracleInterfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAOracleInterfaces.pas
new file mode 100644
index 0000000..fc100ba
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAOracleInterfaces.pas
@@ -0,0 +1,609 @@
+unit uDAOracleInterfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ uROClasses,
+ uDAInterfaces, uDAEngine;
+
+type
+ { IDAOracleConnection
+ For identification purposes Implemented by all Oracle connections }
+ IDAOracleConnection = interface(IDAConnection)
+ ['{C7C88680-12BF-402A-8843-80016429BAC1}']
+ end;
+ IOracleConnection = IDAOracleConnection;
+
+ TDAOracleLockMode = (olmNone, olmLockImmediate, olmLockDelayed);
+
+ TDAOracleOption = (opAutoClose,
+ opDefaultValues,
+ opLongStrings,
+ opQueryRecCount,
+ opCacheLobs,
+ opDeferredLobRead,
+ opKeepPrepared);
+ TDAOracleOptions = set of TDAOracleOption;
+
+ { IOracleDataset
+ Provides access to features of ODAC mostly which might or might not be mappable
+ to other drivers for Oracle. }
+ IDAOracleDataset = interface
+ ['{D555E209-0ED7-40D4-B97B-7C2044453E70}']
+ function GetLockMode: TDAOracleLockMode;
+ procedure SetLockMode(Value: TDAOracleLockMode);
+
+ function GetOptions: TDAOracleOptions;
+ procedure SetOptions(Value: TDAOracleOptions);
+
+ property LockMode: TDAOracleLockMode read GetLockMode write SetLockMode;
+ property Options: TDAOracleOptions read GetOptions write SetOptions;
+ end;
+ IOracleDataset = IDAOracleDataset;
+
+ TDAOracleDriver = class(TDAEDriver)
+ protected
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+ TDAOracleConnection = class(TDAEConnection, IDAOracleConnection, IDAUseGenerators, IDAUseGenerators2)
+ protected
+ function CreateCompatibleQuery: IDADataset; virtual;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetQuoteChars: TDAQuoteCharArray; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+ function GetSPSelectSyntax(HasArguments: Boolean): String; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ function DoGetLastAutoInc(const GeneratorName: string): integer; override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ function CreateMacroProcessor: TDASQLMacroProcessor; override;
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ // IDAUseGenerators
+ function GetNextAutoinc(const GeneratorName: string): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAUseGenerators2
+ function GetNextAutoinc2(const GeneratorName: string): variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+function Oracle_CreateMacroProcessor: TDASQLMacroProcessor;
+function Oracle_GetSPSelectSyntax(HasArguments: Boolean): String;
+function Oracle_DoGetLastAutoInc(const GeneratorName: string;Query: IDADataset): Variant;
+function Oracle_GetNextAutoinc(const GeneratorName: string;Query: IDADataset): Variant;
+procedure Oracle_DoGetNames(Query: IDADataset; AList: IROStrings; AObjectType: TDAObjecttype);
+procedure Oracle_DoGetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection);
+Procedure Oracle_DoGetForeignKeys(Query: IDADataset;ForeignKeys: TDADriverForeignKeyCollection);
+function Oracle_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+function Oracle_GetQuoteChars: TDAQuoteCharArray;
+procedure Oracle_DoGetStoredProcedureParams(const aStoredProcedureName: string; Query: IDADataset; out Params: TDAParamCollection);
+
+const
+ Oracle_DriverType = 'Oracle';
+
+implementation
+uses
+ uDAMacroProcessors, SysUtils;
+
+var
+ Oracle_reservedwords: array of string;
+
+function Oracle_CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ Result := TDAOracleMacroProcessor.Create;
+end;
+
+function Oracle_GetSPSelectSyntax(HasArguments: Boolean): String;
+begin
+ if HasArguments then
+ Result := 'CALL {0}({1})'
+ else
+ Result := 'CALL {0}';
+end;
+
+function Oracle_DoGetLastAutoInc(const GeneratorName: string;Query: IDADataset): Variant;
+begin
+ try
+ Query.SQL := 'SELECT ' + GeneratorName + '.Currval FROM dual';
+ Query.Open;
+ result := Query.Fields[0].Value;
+ finally
+ Query := nil;
+ end;
+end;
+
+function Oracle_GetNextAutoinc(const GeneratorName: string;Query: IDADataset): Variant;
+begin
+ try
+ Query.SQL := 'SELECT ' + GeneratorName + '.Nextval FROM dual';
+ Query.Open;
+ result := Query.Fields[0].Value;
+ finally
+ Query := nil;
+ end;
+end;
+
+procedure Oracle_DoGetNames(Query: IDADataset; AList: IROStrings; AObjectType: TDAObjecttype);
+const
+ sql = 'SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE = ''%s''';
+
+ procedure _ExecSQL(aObject: string);
+ begin
+ Query.Close;
+ Query.SQL := Format(sql,[aObject]);
+ Query.Open;
+ while not Query.EOF do begin
+ AList.Add(Trim(Query.Fields[0].AsString));
+ Query.Next;
+ end;
+ Query.Close;
+ end;
+
+begin
+ AList.Clear;
+ try
+ case AObjectType of
+ dotTable: _ExecSQL('TABLE');
+ dotView: _ExecSQL('VIEW');
+ dotProcedure: begin
+ _ExecSQL('PROCEDURE');
+ _ExecSQL('FUNCTION');
+ end;
+ else
+ end;
+ finally
+ Query := nil;
+ end;
+ AList.Sorted:=True;
+ AList.Sorted:=False;
+end;
+
+function OracleTypeToDADataType(const aTypeName: string; const aDataPrecision,aDataScale: integer):TDADataType;
+begin
+ if (aTypeName = 'VARCHAR2') or (aTypeName = 'VARCHAR') or (aTypeName = 'CHAR') then Result := datString
+ else if (aTypeName = 'NVARCHAR2') or (aTypeName = 'NCHAR') OR (aTypeName = 'NCHAR VARYING') then Result := datWideString
+ else if aTypeName = 'FLOAT' then Result := datFloat
+ else if aTypeName = 'NUMBER' then begin
+ if aDataScale <= 0 then begin
+ case aDataPrecision of
+ 0: Result := datFloat;
+ 1,2: Result := datShortInt;
+ 3,4: Result := datSmallInt;
+ 5..9: Result := datInteger;
+ else
+ Result := datLargeInt;
+ end;
+ end
+ else Result:= datDecimal;
+ end
+ else if (aTypeName = 'RAW') or (aTypeName = 'LONG RAW') OR
+ (aTypeName = 'BLOB') OR (aTypeName = 'LOB') OR
+ (aTypeName = 'BFILE') OR (aTypeName = 'CFILE') then Result:= datBlob
+ else if (aTypeName = 'DATE') OR
+ (aTypeName = 'TIME') OR (aTypeName = 'TIME WITH TIME ZONE') OR
+ (aTypeName = 'TIMESTAMP') OR (aTypeName = 'TIMESTAMP WITH TIME ZONE') OR (aTypeName = 'TIMESTAMP WITH LOCAL TIME ZONE') then Result:= datDateTime
+ { else if aTypeName = 'YEAR' then Result:= datSmallInt
+ else if (aTypeName = 'MONTH') or (aTypeName = 'DAY') or (aTypeName = 'HOUR') or (aTypeName = 'MINUTE') or (aTypeName = 'TIMEZONE_MINUTE') then Result:= datByte
+ else if (aTypeName = 'SECOND') then Result:= datFloat
+ else if (aTypeName = 'TIMEZONE_HOUR') then Result:= datShortInt }
+ else if (aTypeName = 'LONG') or (aTypeName = 'CLOB') then Result:= datMemo
+ else if (aTypeName = 'NCLOB') then Result:= datWideMemo
+ else if (aTypeName = 'ROWID') or (aTypeName = 'UROWID') then Result:= datString
+ else if (aTypeName = 'BINARY_INTEGER') OR (aTypeName = 'NATIVE INTEGER') then Result := datInteger
+//else if (aTypeName = 'REF CURSOR') then Result:= ???
+//else if (aTypeName = 'MLSLABEL') then Result:= ???
+//else if (aTypeName = 'REF') then Result:= ???
+//else if (aTypeName = 'OBJECT') then Result:= ???
+//else if (aTypeName = 'TABLE') then Result:= ???
+//else if (aTypeName = 'VARRAY') then Result:= ???
+//else if (aTypeName = 'INTERVAL YEAR TO MONTH') then Result:= ???
+//else if (aTypeName = 'INTERVAL DAY TO SECOND') then Result:= ???
+//else if (aTypeName = 'PL/SQL RECORD') then Result:= ???
+//else if (aTypeName = 'PL/SQL TABLE') then Result:= ???
+ else if aTypeName = 'PL/SQL BOOLEAN' then Result := datBoolean
+ else Result:= datUnknown;
+end;
+
+procedure Oracle_DoGetStoredProcedureParams(const aStoredProcedureName: string; Query: IDADataset; out Params: TDAParamCollection);
+const
+ sSPP_SQL = 'SELECT ARGUMENT_NAME, DATA_TYPE, IN_OUT, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, PLS_TYPE '+
+ 'FROM USER_ARGUMENTS '+
+ 'WHERE ((IN_OUT = ''IN'' AND ARGUMENT_NAME IS NOT NULL) OR IN_OUT = ''OUT'' OR IN_OUT = ''IN/OUT'') AND OBJECT_NAME = ''%S'' '+
+ 'ORDER BY POSITION';
+begin
+ Params := TDAParamCollection.Create(nil);
+ try
+ Query.SQL := Format(sSPP_SQL,[aStoredProcedureName]);
+ Query.Open;
+ while not Query.EOF do begin
+ With Params.Add do begin
+ Name := Query.Fields[0].AsString;
+ if Query.Fields[2].AsString = 'IN' then
+ ParamType := daptInput
+ else if Query.Fields[2].AsString = 'IN/OUT'
+ then ParamType := daptInputOutput
+ else if Query.Fields[2].AsString = 'OUT' then begin
+ if Name = '' then begin
+ Name:= 'RESULT';
+ ParamType := daptResult;
+ end
+ else begin
+ ParamType := daptInputOutput;
+ end;
+ end
+ else
+ ParamType := daptUnknown;
+ DataType := OracleTypeToDADataType(Query.Fields[1].AsString, Query.Fields[4].AsInteger, Query.Fields[5].AsInteger);
+ Size := Query.Fields[3].AsInteger;
+
+ if DataType = datDecimal then begin
+ DecimalPrecision := Query.Fields[4].AsInteger;
+ DecimalScale := Query.Fields[5].AsInteger;
+ if DecimalScale < 0 then DecimalScale := 0;
+ end;
+ end;
+ Query.Next;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+
+procedure Oracle_DoGetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection);
+const // CHARACTER_SET_NAME, CHAR_LENGTH
+ SQL_TABLEINFO ='SELECT C.COLUMN_NAME, C.DATA_TYPE, C.DATA_LENGTH, C.DATA_PRECISION, C.DATA_SCALE, C.NULLABLE, C.DATA_LENGTH, CC.COMMENTS '+
+ 'FROM USER_TAB_COLUMNS C LEFT OUTER JOIN USER_COL_COMMENTS CC on (CC.TABLE_NAME = C.TABLE_NAME AND CC.COLUMN_NAME = C.COLUMN_NAME) '+
+ 'WHERE (C.TABLE_NAME=''%s'')';
+ SQL_PRIMARYKEY = 'SELECT ACC.COLUMN_NAME, ACC.POSITION FROM USER_CONSTRAINTS AC, USER_CONS_COLUMNS ACC '+
+ 'WHERE (AC.TABLE_NAME=''%s'') AND (ACC.TABLE_NAME = AC.TABLE_NAME) AND '+
+ '(AC.CONSTRAINT_NAME = ACC.CONSTRAINT_NAME) AND AC.CONSTRAINT_TYPE = ''P''';
+var
+ fld: TDAField;
+ ltable: string;
+ ldt: TDADataType;
+begin
+ Fields := TDAFieldCollection.Create(nil);
+ try
+ ltable := aTableName;
+ ltable:= AnsiDequotedStr(ltable,'"');
+ Query.Close;
+ Query.SQL:= Format(SQL_TABLEINFO, [ltable]);
+ Query.Open;
+ While not Query.Eof do begin
+ fld := Fields.Add;
+ fld.Name:=Query.Fields[0].AsString;
+ ldt:=OracleTypeToDADataType(Query.Fields[1].AsString,Query.Fields[3].AsInteger,Query.Fields[4].AsInteger);
+ fld.DataType:=ldt;
+ If ldt = datDecimal then begin
+ fld.DecimalPrecision :=Query.Fields[3].AsInteger;
+ fld.DecimalScale :=Query.Fields[4].AsInteger;
+ if fld.DecimalScale < 0 then fld.DecimalScale := 0;
+ end;
+ fld.Required := Query.Fields[5].AsString = 'N';
+ if ldt in [datString, datWideString] then begin
+ if (Query.Fields[1].AsString = 'ROWID') or (Query.Fields[1].AsString = 'UROWID') then
+ fld.Size := 18
+ else
+ fld.Size := Query.Fields[6].AsInteger;
+ end;
+ fld.Description := Query.Fields[7].AsString;
+ Query.Next;
+ end;
+
+ // pk
+ Query.Close;
+ Query.SQL:= Format(SQL_PRIMARYKEY,[aTableName]);
+ Query.Open;
+ While not Query.Eof do begin
+ fld := Fields.FindField(Trim(Query.Fields[0].AsString));
+ if Fld <> nil then fld.InPrimaryKey := True;
+ Query.Next;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+Procedure Oracle_DoGetForeignKeys(Query: IDADataset;ForeignKeys: TDADriverForeignKeyCollection);
+var
+ lCurrConstraint: string;
+ lCurrFK: TDADriverForeignKey;
+const
+ sFK_SQL = 'SELECT AC.CONSTRAINT_NAME, AC_PK.TABLE_NAME, AC_FK.TABLE_NAME, AC_PK.COLUMN_NAME, AC_FK.COLUMN_NAME, '+
+ 'AC_FK.POSITION FROM USER_CONSTRAINTS AC, USER_CONS_COLUMNS AC_PK, USER_CONS_COLUMNS AC_FK WHERE (AC.CONSTRAINT_TYPE = ''R'') AND '+
+ '((AC.CONSTRAINT_NAME = AC_PK.CONSTRAINT_NAME) ) AND ((AC.R_CONSTRAINT_NAME = AC_FK.CONSTRAINT_NAME) '+
+ ') AND (AC_FK.POSITION = AC_PK.POSITION) ORDER BY 1,2,3,6';
+begin
+ lCurrConstraint := '';
+ lCurrFK := nil;
+ try
+ Query.SQL := sFK_SQL;
+ Query.Open;
+
+ ForeignKeys.Clear;
+ while (not Query.EOF) do begin
+
+ if lCurrConstraint <> Query.Fields[0].AsString then begin
+ lCurrConstraint := Query.Fields[0].AsString;
+ lCurrFK := ForeignKeys.Add();
+ with lCurrFK do begin
+ PKTable := TrimRight(Query.Fields[1].AsString);
+ FKTable := TrimRight(Query.Fields[2].AsString);
+ PKField := TrimRight(Query.Fields[3].AsString);
+ FKField := TrimRight(Query.Fields[4].AsString);
+ end;
+ end else begin
+ with lCurrFK do begin
+ PKField := PKField + ';' + TrimRight(Query.Fields[3].AsString);
+ FKField := FKField + ';' + TrimRight(Query.Fields[4].AsString);
+ end;
+ end;
+ Query.Next;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+function Oracle_IdentifierIsQuoted(const iIdentifier: string): boolean;
+var
+ lQuoteChars: TDAQuoteCharArray;
+ lLength:integer;
+begin
+ lQuoteChars := Oracle_GetQuoteChars;
+ lLength := Length(iIdentifier);
+ result := (lLength > 2) and (iIdentifier[1] = lQuoteChars[0]) and (iIdentifier[lLength] = lQuoteChars[1]);
+end;
+
+function Oracle_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+begin
+ result := false;
+ if Oracle_IdentifierIsQuoted(iIdentifier) then Exit;
+ Result:=
+ ((UpperCase(iIdentifier) <> iIdentifier) and
+ (LowerCase(iIdentifier) <> iIdentifier)) or
+ (pos('_', iIdentifier) = 1);
+
+ Result := Result or TestIdentifier(iIdentifier,Oracle_reservedwords);
+end;
+
+function Oracle_GetQuoteChars: TDAQuoteCharArray;
+begin
+ Result[0] := '"';
+ Result[1] := '"';
+end;
+
+procedure Oracle_InitializeReservedWords;
+begin
+ SetLength(Oracle_reservedwords, 109);
+ // sorted with TStringList.Sort (bds2007)
+ Oracle_reservedwords[0] := 'ACCESS';
+ Oracle_reservedwords[1] := 'ADD';
+ Oracle_reservedwords[2] := 'ALL';
+ Oracle_reservedwords[3] := 'ALTER';
+ Oracle_reservedwords[4] := 'AND';
+ Oracle_reservedwords[5] := 'ANY';
+ Oracle_reservedwords[6] := 'AS';
+ Oracle_reservedwords[7] := 'ASC';
+ Oracle_reservedwords[8] := 'AUDIT';
+ Oracle_reservedwords[9] := 'BETWEEN';
+ Oracle_reservedwords[10] := 'BY';
+ Oracle_reservedwords[11] := 'CHAR';
+ Oracle_reservedwords[12] := 'CHECK';
+ Oracle_reservedwords[13] := 'CLUSTER';
+ Oracle_reservedwords[14] := 'COLUMN';
+ Oracle_reservedwords[15] := 'COMMENT';
+ Oracle_reservedwords[16] := 'COMPRESS';
+ Oracle_reservedwords[17] := 'CONNECT';
+ Oracle_reservedwords[18] := 'CREATE';
+ Oracle_reservedwords[19] := 'CURRENT';
+ Oracle_reservedwords[20] := 'DATE';
+ Oracle_reservedwords[21] := 'DECIMAL';
+ Oracle_reservedwords[22] := 'DEFAULT';
+ Oracle_reservedwords[23] := 'DELETE';
+ Oracle_reservedwords[24] := 'DESC';
+ Oracle_reservedwords[25] := 'DISTINCT';
+ Oracle_reservedwords[26] := 'DROP';
+ Oracle_reservedwords[27] := 'ELSE';
+ Oracle_reservedwords[28] := 'EXCLUSIVE';
+ Oracle_reservedwords[29] := 'EXISTS';
+ Oracle_reservedwords[30] := 'FILE';
+ Oracle_reservedwords[31] := 'FLOAT';
+ Oracle_reservedwords[32] := 'FOR';
+ Oracle_reservedwords[33] := 'FROM';
+ Oracle_reservedwords[34] := 'GRANT';
+ Oracle_reservedwords[35] := 'GROUP';
+ Oracle_reservedwords[36] := 'HAVING';
+ Oracle_reservedwords[37] := 'IDENTIFIED';
+ Oracle_reservedwords[38] := 'IMMEDIATE';
+ Oracle_reservedwords[39] := 'IN';
+ Oracle_reservedwords[40] := 'INCREMENT';
+ Oracle_reservedwords[41] := 'INDEX';
+ Oracle_reservedwords[42] := 'INITIAL';
+ Oracle_reservedwords[43] := 'INSERT';
+ Oracle_reservedwords[44] := 'INTEGER';
+ Oracle_reservedwords[45] := 'INTERSECT';
+ Oracle_reservedwords[46] := 'INTO';
+ Oracle_reservedwords[47] := 'IS';
+ Oracle_reservedwords[48] := 'LEVEL';
+ Oracle_reservedwords[49] := 'LIKE';
+ Oracle_reservedwords[50] := 'LOCK';
+ Oracle_reservedwords[51] := 'LONG';
+ Oracle_reservedwords[52] := 'MAXEXTENTS';
+ Oracle_reservedwords[53] := 'MINUS';
+ Oracle_reservedwords[54] := 'MLSLABEL';
+ Oracle_reservedwords[55] := 'MODE';
+ Oracle_reservedwords[56] := 'MODIFY';
+ Oracle_reservedwords[57] := 'NOAUDIT';
+ Oracle_reservedwords[58] := 'NOCOMPRESS';
+ Oracle_reservedwords[59] := 'NOT';
+ Oracle_reservedwords[60] := 'NOWAIT';
+ Oracle_reservedwords[61] := 'NULL';
+ Oracle_reservedwords[62] := 'NUMBER';
+ Oracle_reservedwords[63] := 'OF';
+ Oracle_reservedwords[64] := 'OFFLINE';
+ Oracle_reservedwords[65] := 'ON';
+ Oracle_reservedwords[66] := 'ONLINE';
+ Oracle_reservedwords[67] := 'OPTION';
+ Oracle_reservedwords[68] := 'OR';
+ Oracle_reservedwords[69] := 'ORDER';
+ Oracle_reservedwords[70] := 'PCTFREE';
+ Oracle_reservedwords[71] := 'PRIOR';
+ Oracle_reservedwords[72] := 'PRIVILEGES';
+ Oracle_reservedwords[73] := 'PUBLIC';
+ Oracle_reservedwords[74] := 'RAW';
+ Oracle_reservedwords[75] := 'RENAME';
+ Oracle_reservedwords[76] := 'RESOURCE';
+ Oracle_reservedwords[77] := 'REVOKE';
+ Oracle_reservedwords[78] := 'ROW';
+ Oracle_reservedwords[79] := 'ROWID';
+ Oracle_reservedwords[80] := 'ROWNUM';
+ Oracle_reservedwords[81] := 'ROWS';
+ Oracle_reservedwords[82] := 'SELECT';
+ Oracle_reservedwords[83] := 'SESSION';
+ Oracle_reservedwords[84] := 'SET';
+ Oracle_reservedwords[85] := 'SHARE';
+ Oracle_reservedwords[86] := 'SIZE';
+ Oracle_reservedwords[87] := 'SMALLINT';
+ Oracle_reservedwords[88] := 'START';
+ Oracle_reservedwords[89] := 'SUCCESSFUL';
+ Oracle_reservedwords[90] := 'SYNONYM';
+ Oracle_reservedwords[91] := 'SYSDATE';
+ Oracle_reservedwords[92] := 'TABLE';
+ Oracle_reservedwords[93] := 'THEN';
+ Oracle_reservedwords[94] := 'TO';
+ Oracle_reservedwords[95] := 'TRIGGER';
+ Oracle_reservedwords[96] := 'UID';
+ Oracle_reservedwords[97] := 'UNION';
+ Oracle_reservedwords[98] := 'UNIQUE';
+ Oracle_reservedwords[99] := 'UPDATE';
+ Oracle_reservedwords[100] := 'USER';
+ Oracle_reservedwords[101] := 'VALIDATE';
+ Oracle_reservedwords[102] := 'VALUES';
+ Oracle_reservedwords[103] := 'VARCHAR';
+ Oracle_reservedwords[104] := 'VARCHAR2';
+ Oracle_reservedwords[105] := 'VIEW';
+ Oracle_reservedwords[106] := 'WHENEVER';
+ Oracle_reservedwords[107] := 'WHERE';
+ Oracle_reservedwords[108] := 'WITH';
+end;
+{ TDAOracleDriver }
+
+function TDAOracleDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ Result := Oracle_DriverType;
+end;
+
+{ TDAOracleConnection }
+
+function TDAOracleConnection.CreateCompatibleQuery: IDADataset;
+begin
+ Result := GetDatasetClass.Create(Self);
+end;
+
+function TDAOracleConnection.CreateMacroProcessor: TDASQLMacroProcessor;
+begin
+ result := Oracle_CreateMacroProcessor;
+end;
+
+procedure TDAOracleConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ inherited DoGetForeignKeys(ForeignKeys);
+ Oracle_DoGetForeignKeys(CreateCompatibleQuery, ForeignKeys);
+end;
+
+function TDAOracleConnection.DoGetLastAutoInc(
+ const GeneratorName: string): integer;
+begin
+ Result := DoGetLastAutoIncValue(GeneratorName);
+end;
+
+function TDAOracleConnection.DoGetLastAutoIncValue(
+ const GeneratorName: string): Variant;
+begin
+ Result := Oracle_DoGetLastAutoInc(GeneratorName,CreateCompatibleQuery);
+end;
+
+procedure TDAOracleConnection.DoGetStoredProcedureNames(
+ out List: IROStrings);
+begin
+ inherited DoGetStoredProcedureNames(List);
+ Oracle_DoGetNames(CreateCompatibleQuery, List, dotProcedure);
+end;
+
+procedure TDAOracleConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ Oracle_DoGetStoredProcedureParams(aStoredProcedureName,CreateCompatibleQuery,Params);
+end;
+
+procedure TDAOracleConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ Oracle_DoGetTableFields(QuoteIdentifierIfNeeded(aTableName), CreateCompatibleQuery, Fields);
+end;
+
+procedure TDAOracleConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited DoGetTableNames(List);
+ Oracle_DoGetNames(CreateCompatibleQuery, List, dotTable);
+end;
+
+procedure TDAOracleConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited DoGetViewNames(List);
+ Oracle_DoGetNames(CreateCompatibleQuery, List, dotView);
+end;
+
+function TDAOracleConnection.GetNextAutoinc(
+ const GeneratorName: string): integer;
+begin
+ Result := GetNextAutoinc2(GeneratorName);
+end;
+
+function TDAOracleConnection.GetNextAutoinc2(
+ const GeneratorName: string): variant;
+begin
+ Result := Oracle_GetNextAutoinc(GeneratorName, CreateCompatibleQuery);
+end;
+
+function TDAOracleConnection.GetQuoteChars: TDAQuoteCharArray;
+begin
+ Result := Oracle_GetQuoteChars;
+end;
+
+function TDAOracleConnection.GetSPSelectSyntax(
+ HasArguments: Boolean): String;
+begin
+ Result:= Oracle_GetSPSelectSyntax(HasArguments);
+end;
+
+function TDAOracleConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result:= inherited IdentifierNeedsQuoting(iIdentifier) or Oracle_IdentifierNeedsQuoting(iIdentifier);
+end;
+
+initialization
+ Oracle_InitializeReservedWords;
+finalization
+ Oracle_reservedwords:=nil;
+end.
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPSScriptingProvider.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPSScriptingProvider.pas
new file mode 100644
index 0000000..2e09995
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPSScriptingProvider.pas
@@ -0,0 +1,225 @@
+unit uDAPSScriptingProvider;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes,
+ uDAScriptingProvider, uDAInterfaces, uDABusinessProcessor, uDADataTable,
+ uPSComponent, uDAPascalScript,
+ uPSComponent_DB, uPSComponent_Default,uPSUtils;
+
+type
+ TDAPSScriptingProvider = class;
+ TDAPSScript = class(TPSScript)
+ private
+ fProvider: TDAPSScriptingProvider;
+ protected
+ function DoOnGetNotificationVariant (const Name: tbtstring): Variant; override;
+ procedure DoOnSetNotificationVariant (const Name: tbtstring; V: Variant); override;
+ procedure DoOnCompile; override;
+ end;
+ TDAPSScriptingProvider = class(TDAScriptingProvider, IDADataTableScriptingProvider, IDABusinessProcessorScriptingProvider)
+ private
+ fDataTablePlugin: TDAPSDataTableRulesPlugin;
+ fBusinessProcessor: TDABusinessProcessor;
+ fDataTable: TDADataTable;
+ fScript: TPSScript;
+ fPluginClasses: TPSImport_Classes;
+ fPluginDB: TPSImport_DB;
+ fPluginDateUtils: TPSImport_DateUtils;
+
+ procedure RunDataTableScript(aDataTable: TDADataTable; const aScript: string; const aMethod: string; aLanguage:TROSEScriptLanguage);
+ procedure RunBusinessProcessorScript(aBusinessProcessor: TDABusinessProcessor; const aScript: string; const aMethod: string; aLanguage:TROSEScriptLanguage);
+
+ procedure OnCompile(Sender: TPSScript);
+ function OnGetNotificationVariant(Sender: TPSScript; const Name: tbtstring): Variant;
+ procedure OnSetNotificationVariant(Sender: TPSScript; const Name: tbtstring; V: Variant);
+
+ //procedure OnVerifyProc(Sender: TPSScript; Proc: TPSInternalProcedure; const Decl: string; var Error: Boolean);
+
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure PrepareForDataTable(aDataTable: TDADataTable);
+ procedure PrepareForBusinessProcessor(aBusinessProcessor: TDABusinessProcessor);
+
+ published
+ property ScriptEngine: TPSScript read fScript;
+ property PluginClasses: TPSImport_Classes read fPluginClasses;
+ property PluginDB: TPSImport_DB read fPluginDB;
+ property PluginDateUtils: TPSImport_DateUtils read fPluginDateUtils;
+ end;
+
+implementation
+
+uses
+ SysUtils, uROClasses;
+
+{ TDADataTableScripter }
+
+procedure TDAPSScriptingProvider.Assign(Source: TPersistent);
+var
+ lSource: TDAPSScriptingProvider;
+begin
+ inherited;
+ if Source is TDAPSScriptingProvider then begin
+ lSource := TDAPSScriptingProvider(Source);
+
+ PluginClasses.Assign(lSource.PluginClasses);
+ PluginDateUtils.Assign(lSource.PluginDateUtils);
+ PluginDB.Assign(lSource.PluginDB);
+ ScriptEngine.Assign(lSource.ScriptEngine);
+ end;
+end;
+
+constructor TDAPSScriptingProvider.Create(AOwner: TComponent);
+begin
+ inherited;
+ fScript := TDAPSScript.Create(self);
+ TDAPSScript(fScript).fProvider := Self;
+ fScript.Name := 'ScriptEngine';
+ fScript.SetSubComponent(true);
+ //fScript.OnVerifyProc := OnVerifyProc;
+ fScript.CompilerOptions := [icAllowNoBegin, icAllowNoEnd, icBooleanShortCircuit];
+ fPluginClasses := TPSImport_Classes.Create(self);
+ fPluginClasses.Name := 'PluginClasses';
+ fPluginDB := TPSImport_DB.Create(self);
+ fPluginDB.Name := 'PluginDB';
+ fPluginDateUtils := TPSImport_DateUtils.Create(self);
+ fPluginDateUtils.Name := 'PluginDateUtils';
+ (fScript.Plugins.Add() as TPSPluginItem).Plugin := fPluginClasses;
+ (fScript.Plugins.Add() as TPSPluginItem).Plugin := fPluginDB;
+ (fScript.Plugins.Add() as TPSPluginItem).Plugin := fPluginDateUtils;
+end;
+
+destructor TDAPSScriptingProvider.Destroy;
+begin
+ FreeAndNil(fScript);
+ inherited;
+end;
+
+procedure TDAPSScriptingProvider.OnCompile(Sender: TPSScript);
+var
+ i: Integer;
+begin
+ if Assigned(fDataTable) then begin
+ for i := 0 to fDataTable.Fields.Count-1 do begin
+ fScript.AddRegisteredVariable({$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(fDataTable.Fields[i].Name), '!NOTIFICATIONVARIANT');
+ end; { for }
+ end;
+
+ if Assigned(fBusinessProcessor) then begin
+ //ToDo:
+ end;
+end;
+
+{procedure TDAPSScriptingProvider.OnVerifyProc(Sender: TPSScript; Proc: TPSInternalProcedure; const Decl: string; var Error: Boolean);
+begin
+ if Proc.Decl.ParamCount = 0 then
+ Proc.aExport := etExportDecl;
+end;}
+
+function TDAPSScriptingProvider.OnGetNotificationVariant(Sender: TPSScript; const Name: tbtstring): Variant;
+begin
+ result := fDataTable.Fields.FieldByName({$IFDEF UNICODE}AnsiStringToWideString{$ENDIF}(Name)).Value;
+end;
+
+procedure TDAPSScriptingProvider.OnSetNotificationVariant(Sender: TPSScript; const Name: tbtstring; V: Variant);
+begin
+ fDataTable.Fields.FieldByName({$IFDEF UNICODE}AnsiStringToWideString{$ENDIF}(Name)).Value := V;
+end;
+
+procedure TDAPSScriptingProvider.PrepareForBusinessProcessor(aBusinessProcessor: TDABusinessProcessor);
+begin
+
+end;
+
+procedure TDAPSScriptingProvider.PrepareForDataTable(aDataTable: TDADataTable);
+begin
+ fDataTable := aDataTable;
+ fBusinessProcessor := nil;
+ fScript.Defines.Text := 'DATA_ABSTRACT_SCRIPT'#13#10'DATA_ABSTRACT_SCRIPT_CLIENT';
+ if not assigned(fDataTablePlugin) then begin
+ fDataTablePlugin := TDAPSDataTableRulesPlugin.Create(self);
+ fDataTablePlugin.DataTable := aDataTable;
+ (fScript.Plugins.Add() as TPSPluginItem).Plugin := fDataTablePlugin;
+ end;
+end;
+
+
+procedure TDAPSScriptingProvider.RunBusinessProcessorScript(
+ aBusinessProcessor: TDABusinessProcessor; const aScript, aMethod: string;
+ aLanguage: TROSEScriptLanguage);
+begin
+ fDataTable := nil;
+ FreeAndNil(fDataTablePlugin);
+ fBusinessProcessor := aBusinessProcessor;
+ fScript.Defines.Text := 'DATA_ABSTRACT_SCRIPT'#13#10'DATA_ABSTRACT_SCRIPT_SERVER';
+ //(fScript.Plugins.Add() as TPSPluginItem).Plugin := TDAPSDataTableRulesPlugin.Create(self);
+end;
+
+type
+ TScriptMethod = procedure of object;
+
+procedure TDAPSScriptingProvider.RunDataTableScript(aDataTable: TDADataTable; const aScript: string; const aMethod: string; aLanguage: TROSEScriptLanguage);
+var
+ lMessages: tbtstring;
+ i: Integer;
+ lMethod: TScriptMethod;
+begin
+ if fDataTable <> aDataTable then begin
+ PrepareForDataTable(aDataTable);
+ end;
+ if aScript <> fScript.Script.Text then begin
+ fScript.Script.Text := aScript;
+ if not fScript.Compile then begin
+ lMessages := '';
+ for i := 0 to fScript.CompilerMessageCount-1 do begin
+ lMessages := lMessages+#13#10+fScript.CompilerMessages[i].MessageToString;
+ end; { for }
+ RaiseError('There were errors compiling the business rule script for %s.'#13'%s',[aDataTable.Name,lMessages], EDAScriptCompileError);
+ end;
+ end;
+
+ fDataTablePlugin.DataTable := aDataTable;
+ lMethod := TScriptMethod(fScript.GetProcMethod({$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(aMethod)));
+ if assigned(@lMethod) then
+ lMethod();
+end;
+
+{ TDAPSScript }
+
+procedure TDAPSScript.DoOnCompile;
+begin
+ inherited;
+ fProvider.OnCompile(Self);
+end;
+
+function TDAPSScript.DoOnGetNotificationVariant(
+ const Name: tbtstring): Variant;
+begin
+ Result := fProvider.OnGetNotificationVariant(Self, Name);
+end;
+
+procedure TDAPSScript.DoOnSetNotificationVariant(const Name: tbtstring;
+ V: Variant);
+begin
+ fProvider.OnSetNotificationVariant(Self, Name, V);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPascalScript.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPascalScript.pas
new file mode 100644
index 0000000..4a2b905
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPascalScript.pas
@@ -0,0 +1,1196 @@
+unit uDAPascalScript;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ SysUtils, Classes, uPSComponent, uPSCompiler, uPSRuntime, uDADataTable,
+ uDAInterfaces, db, uPSUtils;
+
+type
+ TDAPSDataTableRulesPlugin = class;
+ TDAPSDataTableRules = class(TDADataTableRules)
+ private
+ FSE: TPSScript;
+ procedure SetSE(const Value: TPSScript);
+ protected
+ procedure BeforeOpen(Sender: TDADataTable); override;
+ procedure AfterOpen(Sender: TDADataTable); override;
+ procedure BeforeClose(Sender: TDADataTable); override;
+ procedure AfterClose(Sender: TDADataTable); override;
+ procedure BeforeInsert(Sender: TDADataTable); override;
+ procedure AfterInsert(Sender: TDADataTable); override;
+ procedure BeforeEdit(Sender: TDADataTable); override;
+ procedure AfterEdit(Sender: TDADataTable); override;
+ procedure BeforePost(Sender: TDADataTable); override;
+ procedure AfterPost(Sender: TDADataTable); override;
+ procedure BeforeCancel(Sender: TDADataTable); override;
+ procedure AfterCancel(Sender: TDADataTable); override;
+ procedure BeforeDelete(Sender: TDADataTable); override;
+ procedure AfterDelete(Sender: TDADataTable); override;
+ procedure BeforeScroll(Sender: TDADataTable); override;
+ procedure AfterScroll(Sender: TDADataTable); override;
+ procedure BeforeRefresh(Sender: TDADataTable); override;
+ procedure AfterRefresh(Sender: TDADataTable); override;
+ procedure OnCalcFields(Sender: TDADataTable); override;
+ procedure OnNewRecord(Sender: TDADataTable); override;
+
+ procedure Setup(const Dataset: TDADataTable);
+ procedure ExecuteProc(Dataset: TDADataTable; const Name: tbtstring);
+ public
+ property SE: TPSScript read FSE write SetSE;
+ end;
+
+ TDAPSDataTableRulesPlugin = class(TPsPlugin)
+ private
+ fDataTable: TDADataTable;
+ fScriptEngine: TPSScript;
+ procedure SetDataTable(const Value: TDADataTable);
+ public
+ procedure CompOnUses(CompExec: TPSScript); override;
+ procedure CompileImport1(CompExec: TPSScript); override;
+ procedure ExecImport2(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); override;
+ property DataTable: TDADataTable read fDataTable write SetDataTable;
+ end;
+
+implementation
+
+uses
+ uDAScriptingProvider, Dialogs, uROClasses;
+//uses
+// uDADataTable;
+
+procedure SIRegister_TDADataTable(CL: TIFPSPascalCompiler);
+begin
+ //with RegClassS(CL,'TComponent', 'TDADataTable') do
+ with CL.AddClassN(CL.FindClass('TComponent'), 'TDADataTable') do begin
+ RegisterProperty('Active', 'boolean', iptrw);
+ RegisterProperty('Fields', 'TDAFieldCollection', iptrw);
+ RegisterProperty('Params', 'TDAParamCollection', iptrw);
+ RegisterProperty('LogChanges', 'boolean', iptrw);
+ RegisterProperty('RemoteFetchEnabled', 'boolean', iptrw);
+ RegisterProperty('MasterFields', 'string', iptrw);
+ RegisterProperty('DetailFields', 'string', iptrw);
+ RegisterProperty('MasterRequestMappings', 'TStrings', iptrw);
+ RegisterProperty('DetailOptions', 'TDADetailOptions', iptrw);
+ RegisterProperty('MasterOptions', 'TDAMasterOptions', iptrw);
+ RegisterProperty('Filtered', 'boolean', iptrw);
+ RegisterProperty('Filter', 'string', iptrw);
+ RegisterProperty('LogicalName', 'string', iptrw);
+ RegisterProperty('BusinessRulesID', 'string', iptrw);
+ RegisterProperty('State','TDataSetState',iptR);
+ end;
+end;
+
+procedure SIRegister_TDAParamCollection(CL: TIFPSPascalCompiler);
+begin
+ //with RegClassS(CL,'TSearcheableInterfacedCollection', 'TDAParamCollection') do
+ with CL.AddClassN(CL.FindClass('TSearcheableInterfacedCollection'), 'TDAParamCollection') do begin
+ RegisterMethod('Constructor Create( aOwner : TPersistent)');
+ RegisterMethod('Procedure WriteValues( OutputParams : TParams)');
+ RegisterMethod('Procedure ReadValues( InputParams : TParams)');
+ RegisterMethod('Function Add : TDAParam');
+ RegisterMethod('Function ParamByName( const aName : string) : TDAParam');
+ RegisterMethod('Function FindParam( const aParamName : string) : TDAParam');
+ RegisterMethod('Procedure AssignParamCollection( Source : TDAParamCollection)');
+ RegisterProperty('Params', 'TDAParam integer', iptrw);
+ SetDefaultPropery('Params');
+ RegisterProperty('HasInputParams', 'boolean', iptr);
+ end;
+end;
+
+procedure SIRegister_TDAParam(CL: TIFPSPascalCompiler);
+begin
+ //with RegClassS(CL,'TDABaseField', 'TDAParam') do
+ with CL.AddClassN(CL.FindClass('TDABaseField'), 'TDAParam') do begin
+ RegisterMethod('Procedure SaveToStream( const aStream : IROStream)');
+ RegisterMethod('Procedure LoadFromStream( const aStream : IROStream)');
+ RegisterMethod('Procedure SaveToFile( const aFileName : string)');
+ RegisterMethod('Procedure LoadFromFile( const aFileName : string)');
+ RegisterProperty('ParamType', 'TDAParamType', iptrw);
+ end;
+end;
+
+procedure SIRegister_TDAFieldCollection(CL: TIFPSPascalCompiler);
+begin
+ //with RegClassS(CL,'TDACustomFieldCollection', 'TDAFieldCollection') do
+ with CL.AddClassN(CL.FindClass('TDACustomFieldCollection'), 'TDAFieldCollection') do begin
+ RegisterMethod('Constructor Create( aOwner : TPersistent)');
+ RegisterMethod('Function FieldByName( const aName : string) : TDAField');
+ RegisterMethod('Function FindField( const aName : string) : TDAField');
+ RegisterProperty('Fields', 'TDAField integer', iptrw);
+ SetDefaultPropery('Fields');
+ end;
+end;
+
+procedure SIRegister_TDACustomFieldCollection(CL: TIFPSPascalCompiler);
+begin
+ //with RegClassS(CL,'TSearcheableInterfacedCollection', 'TDACustomFieldCollection') do
+ with CL.AddClassN(CL.FindClass('TSearcheableInterfacedCollection'), 'TDACustomFieldCollection') do begin
+ RegisterMethod('Procedure Bind( aDataset : TDataset)');
+ RegisterMethod('Procedure Unbind');
+ RegisterProperty('FieldEventsDisabled', 'boolean', iptrw);
+ RegisterMethod('Procedure AssignFieldCollection( Source : TDACustomFieldCollection)');
+ RegisterMethod('Function FieldByName( const aName : string) : TDACustomField');
+ RegisterMethod('Function FindField( const aName : string) : TDACustomField');
+ RegisterMethod('Procedure MoveItem( iFromIndex, iToIndex : integer)');
+ RegisterProperty('DataDictionary', 'IDADataDictionary', iptrw);
+ RegisterProperty('Fields', 'TDACustomField integer', iptrw);
+ SetDefaultPropery('Fields');
+ end;
+end;
+
+procedure SIRegister_TDADataDictionaryField(CL: TIFPSPascalCompiler);
+begin
+ //with RegClassS(CL,'TDACustomField', 'TDADataDictionaryField') do
+ with CL.AddClassN(CL.FindClass('TDACustomField'), 'TDADataDictionaryField') do begin
+ end;
+end;
+
+procedure SIRegister_TDAField(CL: TIFPSPascalCompiler);
+begin
+ //with RegClassS(CL,'TDACustomField', 'TDAField') do
+ with CL.AddClassN(CL.FindClass('TDACustomField'), 'TDAField') do begin
+ end;
+end;
+
+procedure SIRegister_TDACustomField(CL: TIFPSPascalCompiler);
+begin
+ //with RegClassS(CL,'TDABaseField', 'TDACustomField') do
+ with CL.AddClassN(CL.FindClass('TDABaseField'), 'TDACustomField') do begin
+ RegisterMethod('Procedure Bind( aField : TField)');
+ RegisterMethod('Procedure Unbind');
+ RegisterMethod('Procedure SaveToStream( const aStream : IROStream)');
+ RegisterMethod('Procedure LoadFromStream( const aStream : IROStream)');
+ RegisterMethod('Procedure SaveToFile( const aFileName : string)');
+ RegisterMethod('Procedure LoadFromFile( const aFileName : string)');
+ RegisterProperty('FieldCollection', 'TDACustomFieldCollection', iptr);
+ RegisterProperty('TableField', 'string', iptrw);
+ RegisterProperty('IsNull', 'boolean', iptr);
+ RegisterProperty('InPrimaryKey', 'boolean', iptrw);
+ RegisterProperty('Calculated', 'boolean', iptrw);
+ RegisterProperty('Lookup', 'boolean', iptrw);
+ RegisterProperty('LookupSource', 'TDataSource', iptrw);
+ RegisterProperty('LookupKeyFields', 'string', iptrw);
+ RegisterProperty('LookupResultField', 'string', iptrw);
+ RegisterProperty('KeyFields', 'string', iptrw);
+ RegisterProperty('LookupCache', 'boolean', iptrw);
+ RegisterProperty('LogChanges', 'boolean', iptrw);
+ RegisterProperty('RegExpression', 'string', iptrw);
+ RegisterProperty('DefaultValue', 'string', iptrw);
+ RegisterProperty('Required', 'boolean', iptrw);
+ RegisterProperty('DisplayWidth', 'integer', iptrw);
+ RegisterProperty('DisplayLabel', 'string', iptrw);
+ RegisterProperty('EditMask', 'string', iptrw);
+ RegisterProperty('Visible', 'boolean', iptrw);
+ RegisterProperty('ReadOnly', 'boolean', iptrw);
+ RegisterProperty('CustomAttributes', 'TStrings', iptrw);
+ RegisterProperty('DisplayFormat', 'string', iptrw);
+ RegisterProperty('BusinessRulesID', 'string', iptrw);
+ RegisterProperty('EditFormat', 'string', iptrw);
+ RegisterProperty('Alignment', 'TAlignment', iptrw);
+ end;
+end;
+
+procedure SIRegister_TDABaseField(CL: TIFPSPascalCompiler);
+begin
+ //with RegClassS(CL,'TCollectionItem', 'TDABaseField') do
+ with CL.AddClassN(CL.FindClass('TCollectionItem'), 'TDABaseField') do begin
+ RegisterProperty('Value', 'Variant', iptrw);
+ RegisterMethod('Procedure AssignField( Source : TDABaseField)');
+ RegisterMethod('Function HasValidDictionaryField : Boolean');
+ RegisterProperty('AsBoolean', 'boolean', iptrw);
+ RegisterProperty('AsCurrency', 'currency', iptrw);
+ RegisterProperty('AsDateTime', 'TDateTime', iptrw);
+ RegisterProperty('AsFloat', 'double', iptrw);
+ RegisterProperty('AsInteger', 'integer', iptrw);
+ RegisterProperty('AsString', 'string', iptrw);
+ RegisterProperty('AsVariant', 'variant', iptrw);
+ RegisterProperty('DictionaryEntry', 'string', iptrw);
+ RegisterProperty('Name', 'string', iptrw);
+ RegisterProperty('DataType', 'TDADataType', iptrw);
+ RegisterProperty('Size', 'integer', iptrw);
+ RegisterProperty('Description', 'string', iptrw);
+ RegisterProperty('BlobType', 'TDABlobType', iptrw);
+ end;
+end;
+
+procedure SIRegister_uDA(CL: TIFPSPascalCompiler);
+begin
+ CL.AddTypeS('TDAPersistFormat', '( pfBinary, pfXML )');
+ CL.AddTypeS('TDAParamType', '( daptUnknown, daptInput, daptOutput, daptInputO'
+ + 'utput, daptResult )');
+ CL.AddTypeS('TDADataType', '( datUnknown, datString, datDateTime, datFloat, d'
+ + 'atCurrency, datAutoInc, datInteger, datLargeInt, datBoolean, datMemo, datB'
+ + 'lob, datWideString, datWideMemo, datLargeAutoInc, datByte, datShortInt, '
+ + 'datWord, datSmallInt, datCardinal, datLargeUInt, datGuid, datXml, datDecimal, datSingleFloat )');
+ CL.AddTypeS('TDABlobType', '( dabtUnknown, dabtBlob, dabtMemo, dabtOraBlob, d'
+ + 'abtOraClob, dabtGraphic,dabtTypedBinary)');
+ SIRegister_TDABaseField(CL);
+ CL.AddClassN(CL.FindClass('TOBJECT'), 'TDACustomFieldCollection');
+ SIRegister_TDACustomField(CL);
+ SIRegister_TDAField(CL);
+ SIRegister_TDADataDictionaryField(CL);
+ SIRegister_TDACustomFieldCollection(CL);
+ SIRegister_TDAFieldCollection(CL);
+ SIRegister_TDAParam(CL);
+ SIRegister_TDAParamCollection(CL);
+ SIRegister_TDADataTable(CL);
+end;
+
+(* === run-time registration functions === *)
+
+procedure TDADataTableBusinessRulesID_W(Self: TDADataTable; const T: string);
+begin
+ Self.BusinessRulesID := T;
+end;
+
+procedure TDADataTableBusinessRulesID_R(Self: TDADataTable; var T: string);
+begin
+ T := Self.BusinessRulesID;
+end;
+
+procedure TDADataTableLogicalName_W(Self: TDADataTable; const T: string);
+begin
+ Self.LogicalName := T;
+end;
+
+procedure TDADataTableLogicalName_R(Self: TDADataTable; var T: string);
+begin
+ T := Self.LogicalName;
+end;
+
+procedure TDADataTableFilter_W(Self: TDADataTable; const T: string);
+begin
+ Self.Filter := T;
+end;
+
+procedure TDADataTableFilter_R(Self: TDADataTable; var T: string);
+begin
+ T := Self.Filter;
+end;
+
+procedure TDADataTableFiltered_W(Self: TDADataTable; const T: boolean);
+begin
+ Self.Filtered := T;
+end;
+
+procedure TDADataTableFiltered_R(Self: TDADataTable; var T: boolean);
+begin
+ T := Self.Filtered;
+end;
+
+procedure TDADataTableMasterOptions_W(Self: TDADataTable; const T: TDAMasterOptions);
+begin
+ Self.MasterOptions := T;
+end;
+
+procedure TDADataTableMasterOptions_R(Self: TDADataTable; var T: TDAMasterOptions);
+begin
+ T := Self.MasterOptions;
+end;
+
+procedure TDADataTableDetailOptions_W(Self: TDADataTable; const T: TDADetailOptions);
+begin
+ Self.DetailOptions := T;
+end;
+
+procedure TDADataTableDetailOptions_R(Self: TDADataTable; var T: TDADetailOptions);
+begin
+ T := Self.DetailOptions;
+end;
+
+procedure TDADataTableMasterRequestMappings_W(Self: TDADataTable; const T: TStrings);
+begin
+ Self.MasterRequestMappings := T;
+end;
+
+procedure TDADataTableMasterRequestMappings_R(Self: TDADataTable; var T: TStrings);
+begin
+ T := Self.MasterRequestMappings;
+end;
+
+procedure TDADataTableDetailFields_W(Self: TDADataTable; const T: string);
+begin
+ Self.DetailFields := T;
+end;
+
+procedure TDADataTableDetailFields_R(Self: TDADataTable; var T: string);
+begin
+ T := Self.DetailFields;
+end;
+
+procedure TDADataTableMasterFields_W(Self: TDADataTable; const T: string);
+begin
+ Self.MasterFields := T;
+end;
+
+procedure TDADataTableMasterFields_R(Self: TDADataTable; var T: string);
+begin
+ T := Self.MasterFields;
+end;
+
+procedure TDADataTableRemoteFetchEnabled_W(Self: TDADataTable; const T: boolean);
+begin
+ Self.RemoteFetchEnabled := T;
+end;
+
+procedure TDADataTableRemoteFetchEnabled_R(Self: TDADataTable; var T: boolean);
+begin
+ T := Self.RemoteFetchEnabled;
+end;
+
+procedure TDADataTableLogChanges_W(Self: TDADataTable; const T: boolean);
+begin
+ Self.LogChanges := T;
+end;
+
+procedure TDADataTableLogChanges_R(Self: TDADataTable; var T: boolean);
+begin
+ T := Self.LogChanges;
+end;
+
+procedure TDADataTableParams_W(Self: TDADataTable; const T: TDAParamCollection);
+begin
+ Self.Params := T;
+end;
+
+procedure TDADataTableParams_R(Self: TDADataTable; var T: TDAParamCollection);
+begin
+ T := Self.Params;
+end;
+
+procedure TDADataTableFields_W(Self: TDADataTable; const T: TDAFieldCollection);
+begin
+ Self.Fields := T;
+end;
+
+procedure TDADataTableFields_R(Self: TDADataTable; var T: TDAFieldCollection);
+begin
+ T := Self.Fields;
+end;
+
+procedure TDADataTableActive_W(Self: TDADataTable; const T: boolean);
+begin
+ Self.Active := T;
+end;
+
+procedure TDADataTableActive_R(Self: TDADataTable; var T: boolean);
+begin
+ T := Self.Active;
+end;
+
+procedure TDAParamCollectionHasInputParams_R(Self: TDAParamCollection; var T: boolean);
+begin
+ T := Self.HasInputParams;
+end;
+
+procedure TDAParamCollectionParams_W(Self: TDAParamCollection; const T: TDAParam; const t1: integer);
+begin
+ Self.Params[t1] := T;
+end;
+
+procedure TDAParamCollectionParams_R(Self: TDAParamCollection; var T: TDAParam; const t1: integer);
+begin
+ T := Self.Params[t1];
+end;
+
+procedure TDAParamParamType_W(Self: TDAParam; const T: TDAParamType);
+begin
+ Self.ParamType := T;
+end;
+
+procedure TDAParamParamType_R(Self: TDAParam; var T: TDAParamType);
+begin
+ T := Self.ParamType;
+end;
+
+procedure TDAFieldCollectionFields_W(Self: TDAFieldCollection; const T: TDAField; const t1: integer);
+begin
+ Self.Fields[t1] := T;
+end;
+
+procedure TDAFieldCollectionFields_R(Self: TDAFieldCollection; var T: TDAField; const t1: integer);
+begin
+ T := Self.Fields[t1];
+end;
+
+procedure TDACustomFieldCollectionFields_W(Self: TDACustomFieldCollection; const T: TDACustomField; const t1: integer);
+begin
+ Self.Fields[t1] := T;
+end;
+
+procedure TDACustomFieldCollectionFields_R(Self: TDACustomFieldCollection; var T: TDACustomField; const t1: integer);
+begin
+ T := Self.Fields[t1];
+end;
+
+procedure TDACustomFieldCollectionDataDictionary_W(Self: TDACustomFieldCollection; const T: IDADataDictionary);
+begin
+ Self.DataDictionary := T;
+end;
+
+procedure TDACustomFieldCollectionDataDictionary_R(Self: TDACustomFieldCollection; var T: IDADataDictionary);
+begin
+ T := Self.DataDictionary;
+end;
+
+procedure TDACustomFieldCollectionFieldEventsDisabled_W(Self: TDACustomFieldCollection; const T: boolean);
+begin
+ Self.FieldEventsDisabled := T;
+end;
+
+procedure TDACustomFieldCollectionFieldEventsDisabled_R(Self: TDACustomFieldCollection; var T: boolean);
+begin
+ T := Self.FieldEventsDisabled;
+end;
+
+procedure TDACustomFieldAlignment_W(Self: TDACustomField; const T: TAlignment);
+begin
+ Self.Alignment := T;
+end;
+
+procedure TDACustomFieldAlignment_R(Self: TDACustomField; var T: TAlignment);
+begin
+ T := Self.Alignment;
+end;
+
+procedure TDACustomFieldEditFormat_W(Self: TDACustomField; const T: string);
+begin
+ Self.EditFormat := T;
+end;
+
+procedure TDACustomFieldEditFormat_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.EditFormat;
+end;
+
+procedure TDACustomFieldBusinessRulesID_W(Self: TDACustomField; const T: string);
+begin
+ Self.BusinessClassID := T;
+end;
+
+procedure TDACustomFieldBusinessRulesID_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.BusinessClassID;
+end;
+
+procedure TDACustomFieldDisplayFormat_W(Self: TDACustomField; const T: string);
+begin
+ Self.DisplayFormat := T;
+end;
+
+procedure TDACustomFieldDisplayFormat_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.DisplayFormat;
+end;
+
+procedure TDACustomFieldCustomAttributes_W(Self: TDACustomField; const T: TStrings);
+begin
+ Self.CustomAttributes := T;
+end;
+
+procedure TDACustomFieldCustomAttributes_R(Self: TDACustomField; var T: TStrings);
+begin
+ T := Self.CustomAttributes;
+end;
+
+procedure TDACustomFieldReadOnly_W(Self: TDACustomField; const T: boolean);
+begin
+ Self.ReadOnly := T;
+end;
+
+procedure TDACustomFieldReadOnly_R(Self: TDACustomField; var T: boolean);
+begin
+ T := Self.ReadOnly;
+end;
+
+procedure TDACustomFieldVisible_W(Self: TDACustomField; const T: boolean);
+begin
+ Self.Visible := T;
+end;
+
+procedure TDACustomFieldVisible_R(Self: TDACustomField; var T: boolean);
+begin
+ T := Self.Visible;
+end;
+
+procedure TDACustomFieldEditMask_W(Self: TDACustomField; const T: string);
+begin
+ Self.EditMask := T;
+end;
+
+procedure TDACustomFieldEditMask_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.EditMask;
+end;
+
+procedure TDACustomFieldDisplayLabel_W(Self: TDACustomField; const T: string);
+begin
+ Self.DisplayLabel := T;
+end;
+
+procedure TDACustomFieldDisplayLabel_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.DisplayLabel;
+end;
+
+procedure TDACustomFieldDisplayWidth_W(Self: TDACustomField; const T: integer);
+begin
+ Self.DisplayWidth := T;
+end;
+
+procedure TDACustomFieldDisplayWidth_R(Self: TDACustomField; var T: integer);
+begin
+ T := Self.DisplayWidth;
+end;
+
+procedure TDACustomFieldRequired_W(Self: TDACustomField; const T: boolean);
+begin
+ Self.Required := T;
+end;
+
+procedure TDACustomFieldRequired_R(Self: TDACustomField; var T: boolean);
+begin
+ T := Self.Required;
+end;
+
+procedure TDACustomFieldDefaultValue_W(Self: TDACustomField; const T: string);
+begin
+ Self.DefaultValue := T;
+end;
+
+procedure TDACustomFieldDefaultValue_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.DefaultValue;
+end;
+
+procedure TDACustomFieldRegExpression_W(Self: TDACustomField; const T: string);
+begin
+ Self.RegExpression := T;
+end;
+
+procedure TDACustomFieldRegExpression_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.RegExpression;
+end;
+
+procedure TDACustomFieldLogChanges_W(Self: TDACustomField; const T: boolean);
+begin
+ Self.LogChanges := T;
+end;
+
+procedure TDACustomFieldLogChanges_R(Self: TDACustomField; var T: boolean);
+begin
+ T := Self.LogChanges;
+end;
+
+procedure TDACustomFieldLookupCache_W(Self: TDACustomField; const T: boolean);
+begin
+ Self.LookupCache := T;
+end;
+
+procedure TDACustomFieldLookupCache_R(Self: TDACustomField; var T: boolean);
+begin
+ T := Self.LookupCache;
+end;
+
+procedure TDACustomFieldKeyFields_W(Self: TDACustomField; const T: string);
+begin
+ Self.KeyFields := T;
+end;
+
+procedure TDACustomFieldKeyFields_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.KeyFields;
+end;
+
+procedure TDACustomFieldLookupResultField_W(Self: TDACustomField; const T: string);
+begin
+ Self.LookupResultField := T;
+end;
+
+procedure TDACustomFieldLookupResultField_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.LookupResultField;
+end;
+
+procedure TDACustomFieldLookupKeyFields_W(Self: TDACustomField; const T: string);
+begin
+ Self.LookupKeyFields := T;
+end;
+
+procedure TDACustomFieldLookupKeyFields_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.LookupKeyFields;
+end;
+
+procedure TDACustomFieldLookupSource_W(Self: TDACustomField; const T: TDataSource);
+begin
+ Self.LookupSource := T;
+end;
+
+procedure TDACustomFieldLookupSource_R(Self: TDACustomField; var T: TDataSource);
+begin
+ T := Self.LookupSource;
+end;
+
+procedure TDACustomFieldLookup_W(Self: TDACustomField; const T: boolean);
+begin
+ Self.Lookup := T;
+end;
+
+procedure TDACustomFieldLookup_R(Self: TDACustomField; var T: boolean);
+begin
+ T := Self.Lookup;
+end;
+
+procedure TDACustomFieldCalculated_W(Self: TDACustomField; const T: boolean);
+begin
+ Self.Calculated := T;
+end;
+
+procedure TDACustomFieldCalculated_R(Self: TDACustomField; var T: boolean);
+begin
+ T := Self.Calculated;
+end;
+
+procedure TDACustomFieldInPrimaryKey_W(Self: TDACustomField; const T: boolean);
+begin
+ Self.InPrimaryKey := T;
+end;
+
+procedure TDACustomFieldInPrimaryKey_R(Self: TDACustomField; var T: boolean);
+begin
+ T := Self.InPrimaryKey;
+end;
+
+procedure TDACustomFieldIsNull_R(Self: TDACustomField; var T: boolean);
+begin
+ T := Self.IsNull;
+end;
+
+procedure TDACustomFieldTableField_W(Self: TDACustomField; const T: string);
+begin
+ Self.TableField := T;
+end;
+
+procedure TDACustomFieldTableField_R(Self: TDACustomField; var T: string);
+begin
+ T := Self.TableField;
+end;
+
+procedure TDACustomFieldFieldCollection_R(Self: TDACustomField; var T: TDACustomFieldCollection);
+begin
+ T := Self.FieldCollection;
+end;
+
+procedure TDABaseFieldBlobType_W(Self: TDABaseField; const T: TDABlobType);
+begin
+ Self.BlobType := T;
+end;
+
+procedure TDABaseFieldBlobType_R(Self: TDABaseField; var T: TDABlobType);
+begin
+ T := Self.BlobType;
+end;
+
+procedure TDABaseFieldDescription_W(Self: TDABaseField; const T: string);
+begin
+ Self.Description := T;
+end;
+
+procedure TDABaseFieldDescription_R(Self: TDABaseField; var T: string);
+begin
+ T := Self.Description;
+end;
+
+procedure TDABaseFieldSize_W(Self: TDABaseField; const T: integer);
+begin
+ Self.Size := T;
+end;
+
+procedure TDABaseFieldSize_R(Self: TDABaseField; var T: integer);
+begin
+ T := Self.Size;
+end;
+
+procedure TDABaseFieldDataType_W(Self: TDABaseField; const T: TDADataType);
+begin
+ Self.DataType := T;
+end;
+
+procedure TDABaseFieldDataType_R(Self: TDABaseField; var T: TDADataType);
+begin
+ T := Self.DataType;
+end;
+
+procedure TDABaseFieldName_W(Self: TDABaseField; const T: string);
+begin
+ Self.Name := T;
+end;
+
+procedure TDABaseFieldName_R(Self: TDABaseField; var T: string);
+begin
+ T := Self.Name;
+end;
+
+procedure TDABaseFieldDictionaryEntry_W(Self: TDABaseField; const T: string);
+begin
+ Self.DictionaryEntry := T;
+end;
+
+procedure TDABaseFieldDictionaryEntry_R(Self: TDABaseField; var T: string);
+begin
+ T := Self.DictionaryEntry;
+end;
+
+procedure TDABaseFieldAsVariant_W(Self: TDABaseField; const T: variant);
+begin
+ Self.AsVariant := T;
+end;
+
+procedure TDABaseFieldAsVariant_R(Self: TDABaseField; var T: variant);
+begin
+ T := Self.AsVariant;
+end;
+
+procedure TDABaseFieldAsString_W(Self: TDABaseField; const T: string);
+begin
+ Self.AsString := T;
+end;
+
+procedure TDABaseFieldAsString_R(Self: TDABaseField; var T: string);
+begin
+ T := Self.AsString;
+end;
+
+procedure TDABaseFieldAsInteger_W(Self: TDABaseField; const T: integer);
+begin
+ Self.AsInteger := T;
+end;
+
+procedure TDABaseFieldAsInteger_R(Self: TDABaseField; var T: integer);
+begin
+ T := Self.AsInteger;
+end;
+
+procedure TDABaseFieldAsFloat_W(Self: TDABaseField; const T: double);
+begin
+ Self.AsFloat := T;
+end;
+
+procedure TDABaseFieldAsFloat_R(Self: TDABaseField; var T: double);
+begin
+ T := Self.AsFloat;
+end;
+
+procedure TDABaseFieldAsDateTime_W(Self: TDABaseField; const T: TDateTime);
+begin
+ Self.AsDateTime := T;
+end;
+
+procedure TDABaseFieldAsDateTime_R(Self: TDABaseField; var T: TDateTime);
+begin
+ T := Self.AsDateTime;
+end;
+
+procedure TDABaseFieldAsCurrency_W(Self: TDABaseField; const T: currency);
+begin
+ Self.AsCurrency := T;
+end;
+
+procedure TDABaseFieldAsCurrency_R(Self: TDABaseField; var T: currency);
+begin
+ T := Self.AsCurrency;
+end;
+
+procedure TDABaseFieldAsBoolean_W(Self: TDABaseField; const T: boolean);
+begin
+ Self.AsBoolean := T;
+end;
+
+procedure TDABaseFieldAsBoolean_R(Self: TDABaseField; var T: boolean);
+begin
+ T := Self.AsBoolean;
+end;
+
+procedure TDABaseFieldValue_W(Self: TDABaseField; const T: Variant);
+begin
+ Self.Value := T;
+end;
+
+procedure TDABaseFieldValue_R(Self: TDABaseField; var T: Variant);
+begin
+ T := Self.Value;
+end;
+
+procedure TDADataTableState_R(Self: TDADataTable; var T: TDataSetState);
+begin
+ T := Self.State;
+end;
+
+procedure RIRegister_TDADataTable(CL: TIFPSRuntimeClassImporter);
+begin
+ with CL.Add(TDADataTable) do begin
+ RegisterPropertyHelper(@TDADataTableActive_R, @TDADataTableActive_W, 'Active');
+ RegisterPropertyHelper(@TDADataTableFields_R, @TDADataTableFields_W, 'Fields');
+ RegisterPropertyHelper(@TDADataTableParams_R, @TDADataTableParams_W, 'Params');
+ RegisterPropertyHelper(@TDADataTableLogChanges_R, @TDADataTableLogChanges_W, 'LogChanges');
+ RegisterPropertyHelper(@TDADataTableRemoteFetchEnabled_R, @TDADataTableRemoteFetchEnabled_W, 'RemoteFetchEnabled');
+ RegisterPropertyHelper(@TDADataTableMasterFields_R, @TDADataTableMasterFields_W, 'MasterFields');
+ RegisterPropertyHelper(@TDADataTableDetailFields_R, @TDADataTableDetailFields_W, 'DetailFields');
+ RegisterPropertyHelper(@TDADataTableMasterRequestMappings_R, @TDADataTableMasterRequestMappings_W, 'MasterRequestMappings');
+ RegisterPropertyHelper(@TDADataTableDetailOptions_R, @TDADataTableDetailOptions_W, 'DetailOptions');
+ RegisterPropertyHelper(@TDADataTableMasterOptions_R, @TDADataTableMasterOptions_W, 'MasterOptions');
+ RegisterPropertyHelper(@TDADataTableFiltered_R, @TDADataTableFiltered_W, 'Filtered');
+ RegisterPropertyHelper(@TDADataTableFilter_R, @TDADataTableFilter_W, 'Filter');
+ RegisterPropertyHelper(@TDADataTableLogicalName_R, @TDADataTableLogicalName_W, 'LogicalName');
+ RegisterPropertyHelper(@TDADataTableBusinessRulesID_R, @TDADataTableBusinessRulesID_W, 'BusinessRulesID');
+ RegisterPropertyHelper(@TDADataTableState_R, nil, 'State');
+ end;
+end;
+
+procedure RIRegister_TDAParamCollection(CL: TIFPSRuntimeClassImporter);
+begin
+ with CL.Add(TDAParamCollection) do begin
+ RegisterConstructor(@TDAParamCollection.Create, 'Create');
+ RegisterMethod(@TDAParamCollection.WriteValues, 'WriteValues');
+ RegisterMethod(@TDAParamCollection.ReadValues, 'ReadValues');
+ RegisterMethod(@TDAParamCollection.Add, 'Add');
+ RegisterMethod(@TDAParamCollection.ParamByName, 'ParamByName');
+ RegisterMethod(@TDAParamCollection.FindParam, 'FindParam');
+ RegisterMethod(@TDAParamCollection.AssignParamCollection, 'AssignParamCollection');
+ RegisterPropertyHelper(@TDAParamCollectionParams_R, @TDAParamCollectionParams_W, 'Params');
+ RegisterPropertyHelper(@TDAParamCollectionHasInputParams_R, nil, 'HasInputParams');
+ end;
+end;
+
+procedure RIRegister_TDAParam(CL: TIFPSRuntimeClassImporter);
+begin
+ with CL.Add(TDAParam) do begin
+ RegisterMethod(@TDAParam.SaveToStream, 'SaveToStream');
+ RegisterMethod(@TDAParam.LoadFromStream, 'LoadFromStream');
+ RegisterMethod(@TDAParam.SaveToFile, 'SaveToFile');
+ RegisterMethod(@TDAParam.LoadFromFile, 'LoadFromFile');
+ RegisterPropertyHelper(@TDAParamParamType_R, @TDAParamParamType_W, 'ParamType');
+ end;
+end;
+
+procedure RIRegister_TDAFieldCollection(CL: TIFPSRuntimeClassImporter);
+begin
+ with CL.Add(TDAFieldCollection) do begin
+ RegisterConstructor(@TDAFieldCollection.Create, 'Create');
+ RegisterMethod(@TDAFieldCollection.FieldByName, 'FieldByName');
+ RegisterMethod(@TDAFieldCollection.FindField, 'FindField');
+ RegisterPropertyHelper(@TDAFieldCollectionFields_R, @TDAFieldCollectionFields_W, 'Fields');
+ end;
+end;
+
+procedure RIRegister_TDACustomFieldCollection(CL: TIFPSRuntimeClassImporter);
+begin
+ with CL.Add(TDACustomFieldCollection) do begin
+ RegisterMethod(@TDACustomFieldCollection.Bind, 'Bind');
+ RegisterMethod(@TDACustomFieldCollection.Unbind, 'Unbind');
+ RegisterPropertyHelper(@TDACustomFieldCollectionFieldEventsDisabled_R, @TDACustomFieldCollectionFieldEventsDisabled_W, 'FieldEventsDisabled');
+ RegisterMethod(@TDACustomFieldCollection.AssignFieldCollection, 'AssignFieldCollection');
+ RegisterMethod(@TDACustomFieldCollection.FieldByName, 'FieldByName');
+ RegisterMethod(@TDACustomFieldCollection.FindField, 'FindField');
+ RegisterMethod(@TDACustomFieldCollection.MoveItem, 'MoveItem');
+ RegisterPropertyHelper(@TDACustomFieldCollectionDataDictionary_R, @TDACustomFieldCollectionDataDictionary_W, 'DataDictionary');
+ RegisterPropertyHelper(@TDACustomFieldCollectionFields_R, @TDACustomFieldCollectionFields_W, 'Fields');
+ end;
+end;
+
+procedure RIRegister_TDADataDictionaryField(CL: TIFPSRuntimeClassImporter);
+begin
+ with CL.Add(TDADataDictionaryField) do begin
+ end;
+end;
+
+procedure RIRegister_TDAField(CL: TIFPSRuntimeClassImporter);
+begin
+ with CL.Add(TDAField) do begin
+ end;
+end;
+
+procedure RIRegister_TDACustomField(CL: TIFPSRuntimeClassImporter);
+begin
+ with CL.Add(TDACustomField) do begin
+ RegisterMethod(@TDACustomField.Bind, 'Bind');
+ RegisterMethod(@TDACustomField.Unbind, 'Unbind');
+ RegisterMethod(@TDACustomField.SaveToStream, 'SaveToStream');
+ RegisterMethod(@TDACustomField.LoadFromStream, 'LoadFromStream');
+ RegisterMethod(@TDACustomField.SaveToFile, 'SaveToFile');
+ RegisterMethod(@TDACustomField.LoadFromFile, 'LoadFromFile');
+ RegisterPropertyHelper(@TDACustomFieldFieldCollection_R, nil, 'FieldCollection');
+ RegisterPropertyHelper(@TDACustomFieldTableField_R, @TDACustomFieldTableField_W, 'TableField');
+ RegisterPropertyHelper(@TDACustomFieldIsNull_R, nil, 'IsNull');
+ RegisterPropertyHelper(@TDACustomFieldInPrimaryKey_R, @TDACustomFieldInPrimaryKey_W, 'InPrimaryKey');
+ RegisterPropertyHelper(@TDACustomFieldCalculated_R, @TDACustomFieldCalculated_W, 'Calculated');
+ RegisterPropertyHelper(@TDACustomFieldLookup_R, @TDACustomFieldLookup_W, 'Lookup');
+ RegisterPropertyHelper(@TDACustomFieldLookupSource_R, @TDACustomFieldLookupSource_W, 'LookupSource');
+ RegisterPropertyHelper(@TDACustomFieldLookupKeyFields_R, @TDACustomFieldLookupKeyFields_W, 'LookupKeyFields');
+ RegisterPropertyHelper(@TDACustomFieldLookupResultField_R, @TDACustomFieldLookupResultField_W, 'LookupResultField');
+ RegisterPropertyHelper(@TDACustomFieldKeyFields_R, @TDACustomFieldKeyFields_W, 'KeyFields');
+ RegisterPropertyHelper(@TDACustomFieldLookupCache_R, @TDACustomFieldLookupCache_W, 'LookupCache');
+ RegisterPropertyHelper(@TDACustomFieldLogChanges_R, @TDACustomFieldLogChanges_W, 'LogChanges');
+ RegisterPropertyHelper(@TDACustomFieldRegExpression_R, @TDACustomFieldRegExpression_W, 'RegExpression');
+ RegisterPropertyHelper(@TDACustomFieldDefaultValue_R, @TDACustomFieldDefaultValue_W, 'DefaultValue');
+ RegisterPropertyHelper(@TDACustomFieldRequired_R, @TDACustomFieldRequired_W, 'Required');
+ RegisterPropertyHelper(@TDACustomFieldDisplayWidth_R, @TDACustomFieldDisplayWidth_W, 'DisplayWidth');
+ RegisterPropertyHelper(@TDACustomFieldDisplayLabel_R, @TDACustomFieldDisplayLabel_W, 'DisplayLabel');
+ RegisterPropertyHelper(@TDACustomFieldEditMask_R, @TDACustomFieldEditMask_W, 'EditMask');
+ RegisterPropertyHelper(@TDACustomFieldVisible_R, @TDACustomFieldVisible_W, 'Visible');
+ RegisterPropertyHelper(@TDACustomFieldReadOnly_R, @TDACustomFieldReadOnly_W, 'ReadOnly');
+ RegisterPropertyHelper(@TDACustomFieldCustomAttributes_R, @TDACustomFieldCustomAttributes_W, 'CustomAttributes');
+ RegisterPropertyHelper(@TDACustomFieldDisplayFormat_R, @TDACustomFieldDisplayFormat_W, 'DisplayFormat');
+ RegisterPropertyHelper(@TDACustomFieldBusinessRulesID_R, @TDACustomFieldBusinessRulesID_W, 'BusinessRulesID');
+ RegisterPropertyHelper(@TDACustomFieldEditFormat_R, @TDACustomFieldEditFormat_W, 'EditFormat');
+ RegisterPropertyHelper(@TDACustomFieldAlignment_R, @TDACustomFieldAlignment_W, 'Alignment');
+ end;
+end;
+
+procedure RIRegister_TDABaseField(CL: TIFPSRuntimeClassImporter);
+begin
+ with CL.Add(TDABaseField) do begin
+ RegisterPropertyHelper(@TDABaseFieldValue_R, @TDABaseFieldValue_W, 'Value');
+ RegisterVirtualMethod(@TDABaseField.AssignField, 'AssignField');
+ RegisterMethod(@TDABaseField.HasValidDictionaryField, 'HasValidDictionaryField');
+ RegisterPropertyHelper(@TDABaseFieldAsBoolean_R, @TDABaseFieldAsBoolean_W, 'AsBoolean');
+ RegisterPropertyHelper(@TDABaseFieldAsCurrency_R, @TDABaseFieldAsCurrency_W, 'AsCurrency');
+ RegisterPropertyHelper(@TDABaseFieldAsDateTime_R, @TDABaseFieldAsDateTime_W, 'AsDateTime');
+ RegisterPropertyHelper(@TDABaseFieldAsFloat_R, @TDABaseFieldAsFloat_W, 'AsFloat');
+ RegisterPropertyHelper(@TDABaseFieldAsInteger_R, @TDABaseFieldAsInteger_W, 'AsInteger');
+ RegisterPropertyHelper(@TDABaseFieldAsString_R, @TDABaseFieldAsString_W, 'AsString');
+ RegisterPropertyHelper(@TDABaseFieldAsVariant_R, @TDABaseFieldAsVariant_W, 'AsVariant');
+ RegisterPropertyHelper(@TDABaseFieldDictionaryEntry_R, @TDABaseFieldDictionaryEntry_W, 'DictionaryEntry');
+ RegisterPropertyHelper(@TDABaseFieldName_R, @TDABaseFieldName_W, 'Name');
+ RegisterPropertyHelper(@TDABaseFieldDataType_R, @TDABaseFieldDataType_W, 'DataType');
+ RegisterPropertyHelper(@TDABaseFieldSize_R, @TDABaseFieldSize_W, 'Size');
+ RegisterPropertyHelper(@TDABaseFieldDescription_R, @TDABaseFieldDescription_W, 'Description');
+ RegisterPropertyHelper(@TDABaseFieldBlobType_R, @TDABaseFieldBlobType_W, 'BlobType');
+ end;
+end;
+
+procedure RIRegister_uDA(CL: TIFPSRuntimeClassImporter);
+begin
+ RIRegister_TDABaseField(CL);
+ RIRegister_TDACustomField(CL);
+ RIRegister_TDAField(CL);
+ RIRegister_TDADataDictionaryField(CL);
+ RIRegister_TDACustomFieldCollection(CL);
+ RIRegister_TDAFieldCollection(CL);
+ RIRegister_TDAParam(CL);
+ RIRegister_TDAParamCollection(CL);
+ RIRegister_TDADataTable(CL);
+end;
+
+{ TDAPSDataTableRulesPlugin }
+
+function PSNewGuid: string;
+begin
+ result := NewGuidAsString();
+end;
+
+procedure PSRaiseError(const aMsg: string);
+begin
+ raise EDAScriptError.Create(aMsg);
+end;
+
+procedure PSAbort;
+begin
+ Abort;
+end;
+
+procedure TDAPSDataTableRulesPlugin.CompileImport1(CompExec: TPSScript);
+begin
+ fScriptEngine := CompExec;
+ SIRegister_uDA(CompExec.Comp);
+ CompExec.AddRegisteredVariable('Table', 'TDADataTable');
+ CompExec.AddFunction(@ShowMessage,'procedure ShowMessage(const Msg: string);');
+ CompExec.AddFunction(@PSRaiseError,'procedure RaiseError(const aMsg: string);');
+ CompExec.AddFunction(@PSAbort,'procedure Abort;');
+ CompExec.AddFunction(@PSNewGuid,'function NewGuid: string;');
+end;
+
+procedure TDAPSDataTableRulesPlugin.CompOnUses(CompExec: TPSScript);
+begin
+ fScriptEngine := CompExec;
+end;
+
+procedure TDAPSDataTableRulesPlugin.ExecImport2(CompExec: TPSScript;
+ const ri: TPSRuntimeClassImporter);
+begin
+ fScriptEngine := CompExec;
+ RIRegister_uDA(ri);
+ CompExec.SetVarToInstance('Table', fDataTable);
+end;
+
+procedure TDAPSDataTableRulesPlugin.SetDataTable(
+ const Value: TDADataTable);
+begin
+ fDataTable := Value;
+ if (fScriptEngine <> nil) then
+ fScriptEngine.SetVarToInstance('Table', fDataTable);
+end;
+
+{ TDAPSDataTableRules }
+
+procedure TDAPSDataTableRules.AfterCancel(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'AfterCancel');
+end;
+
+procedure TDAPSDataTableRules.AfterClose(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'AfterClose');
+end;
+
+procedure TDAPSDataTableRules.AfterDelete(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'AfterDelete');
+end;
+
+procedure TDAPSDataTableRules.AfterEdit(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'AfterEdit');
+end;
+
+procedure TDAPSDataTableRules.AfterInsert(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'AfterInsert');
+end;
+
+procedure TDAPSDataTableRules.AfterOpen(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'AfterOpen');
+end;
+
+procedure TDAPSDataTableRules.AfterPost(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'AfterPost');
+end;
+
+procedure TDAPSDataTableRules.AfterRefresh(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'AfterRefresh');
+end;
+
+procedure TDAPSDataTableRules.AfterScroll(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'AfterScroll');
+end;
+
+procedure TDAPSDataTableRules.BeforeCancel(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'BeforeCancel');
+end;
+
+procedure TDAPSDataTableRules.BeforeClose(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'BeforeClose');
+end;
+
+procedure TDAPSDataTableRules.BeforeDelete(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'BeforeDelete');
+end;
+
+procedure TDAPSDataTableRules.BeforeEdit(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'BeforeEdit');
+end;
+
+procedure TDAPSDataTableRules.BeforeInsert(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'BeforeInsert');
+end;
+
+procedure TDAPSDataTableRules.BeforeOpen(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'BeforeOpen');
+end;
+
+procedure TDAPSDataTableRules.BeforePost(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'BeforePost');
+end;
+
+procedure TDAPSDataTableRules.BeforeRefresh(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'BeforeRefresh');
+end;
+
+procedure TDAPSDataTableRules.BeforeScroll(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'BeforeScroll');
+end;
+
+procedure TDAPSDataTableRules.ExecuteProc(Dataset: TDADataTable;
+ const Name: tbtstring);
+var
+ ProcNo: Cardinal;
+begin
+ if FSE = nil then raise Exception.Create('No script engine attached');
+ Setup(Dataset);
+ ProcNo := FSE.Exec.GetProc(Name);
+ if ProcNo <> InvalidVal then {// Nothing to do} begin
+ FSE.Exec.RunProc(nil, ProcNo);
+ FSE.Exec.RaiseCurrentException;
+ end;
+end;
+
+procedure TDAPSDataTableRules.OnCalcFields(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'OnCalcFields');
+end;
+
+procedure TDAPSDataTableRules.OnNewRecord(Sender: TDADataTable);
+begin
+ ExecuteProc(Sender, 'OnNewRecord');
+end;
+
+procedure TDAPSDataTableRules.SetSE(const Value: TPSScript);
+var
+ lPlugin: TPSPlugin;
+ i: Integer;
+begin
+ if Value = nil then begin
+ FSE := nil
+ end
+ else begin
+ // ToDo: use GetPlugin() lateron.
+ lPlugin := nil;
+ for i := 0 to Value.Plugins.Count-1 do begin
+ if Assigned(Value.Plugins.Items[i]) and ((Value.Plugins.Items[i] as TPSPluginItem).Plugin is TDAPSDataTableRulesPlugin) then
+ lPlugin := (Value.Plugins.Items[i] as TPSPluginItem).Plugin;
+ end; { for }
+ if lPlugin = nil then begin
+ FSE := nil;
+ raise Exception.Create('No TDAPSDataTableRulesPlugin plugin attached to the script engine.');
+ end;
+ FSE := Value;
+ end;
+end;
+
+procedure TDAPSDataTableRules.Setup(const Dataset: TDADataTable);
+begin
+ FSE.SetVarToInstance('Table', Dataset);
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPleaseWaitForm.lfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPleaseWaitForm.lfm
new file mode 100644
index 0000000..c2110e2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPleaseWaitForm.lfm
@@ -0,0 +1,208 @@
+object PleaseWaitForm: TPleaseWaitForm
+ Left = 336
+ Top = 344
+ BorderIcons = []
+ BorderStyle = bsDialog
+ Caption = 'RemObjects SDK'
+ ClientHeight = 41
+ ClientWidth = 542
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ FormStyle = fsStayOnTop
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnHide = FormHide
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object lbl_Caption: TLabel
+ Left = 64
+ Top = 14
+ Width = 66
+ Height = 13
+ Caption = 'Please wait...'
+ end
+ object img_Logo: TImage
+ Left = 2
+ Top = 0
+ Width = 48
+ Height = 41
+ Center = True
+ Picture.Data = {
+ 07544269746D617006150000424D061500000000000036000000280000003000
+ 0000250000000100180000000000D0140000130B0000130B0000000000000000
+ 0000C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4D2D9DCCFD6D9C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4E7EAECC7D9DF95BAC686B1BEE1E9ECC8
+ D0D4C8D0D4C8D0D4CBD3D7E3E7E9CFD6D9C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4D2D9DC
+ 86B1BE0B4E940A3CA40B409E86B1BED6DCDFC8D0D4CBD3D7E5ECEF5893A695BA
+ C6DFE6E9CFD6D9C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4D6DCDF679DAE092CB8091FC2091EBE1B648DE1
+ E9ECD2D9DCDBE3E73A8096093B930A3F8F1B6888B3CED6D2D9DCC8D0D4C8D0D4
+ C8D0D4C8D0D4A3AAAD3234350000000D0D0D64686AC8D0D43234350000000000
+ 00262728979DA0C8D0D4979DA0323435C8D0D4C8D0D464686A64686AC8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4D2D9DCD9E5E9EAEDEFCFD6D9C8D0D4D9DFE1
+ 498A9E0920C6091FC2091EBD0A37A4498A9E86B1BE3A8096093798071DA5071C
+ A008329386B1BECBD3D7C8D0D4C8D0D4C8D0D4C8D0D47D8385717578C8D0D4BC
+ C4C8191A1BA3AAAD323435979DA0C8D0D4979DA0191A1BB0B7BA979DA0262728
+ C8D0D4BCC4C8191A1BBCC4C8C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4D2D9DCCEDE
+ E41C688C2B7294A4C4CEEEF0F2BFD5DB2B768E0920C6091FC2091EBD091EB909
+ 2FA7092EA4092EA1071DA8071DA5071CA00A3F8DBFD5DBC8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4A3AAAD191A1BA3AAAD323435979DA0C8D0
+ D4C8D0D44B4E50717578979DA00000007D838564686A585B5DC8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4CBD3D7CBDBE11C688C0B24DC0B24D80B41AB1B688B0C4D97
+ 0A28C10920C6091FC2091EBD091EB9081EB5081CB1081DAD071DA8071DA5071C
+ A00B4C87D6E3E7C8D0D4C8D0D4C8D0D4D2D9DCC8D0D4BCC4C83F414300000026
+ 2728717578C8D0D4323435979DA0C8D0D4C8D0D464686A64686A979DA0262728
+ 0D0D0D0D0D0DB0B7BAC8D0D4C8D0D4C8D0D4C8D0D4C8D0D4D9DFE1679DAE0B3D
+ B80B20E20B20DD0A20D80A20D40A1FCF0A20CB0920C6091FC1091EBD091EB908
+ 1EB5081CB0081DAC071DA8071DA4071CA00936913A8096E1E9ECD2E0E4A4C4CE
+ 95BAC6DCE2E47175783F4143BCC4C8C8D0D4C8D0D4C8D0D4323435979DA0C8D0
+ D4C8D0D42627288A9092979DA0323435979DA0191A1BBCC4C8C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4E1E9EC1B64920B24DB0B20DD0A20D80A20D40A1FCF
+ 0A20CB0920C6091FC1091EBD091EB9081EB5081CB0071DAC071DA8071DA4071C
+ 9F071C9C09368E0C5A800A4C83093F850B5180BFD5DB8D9295191A1B64686A4B
+ 4E503F4143C8D0D43234354B4E5064686A323435323435C8D0D4979DA0323435
+ C8D0D464686A323435C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4D2D9DC86B1
+ BE0C41AF0B20DD0A20D80A20D30A1FCF0A20CA0920C5091FC1091EBD091EB908
+ 1EB5081CB0071DAC071DA8071DA4071C9F071C9C061C97061B94061B90051B8C
+ 062487498A9EE3E7E9979DA064686A717578BCC4C8C8D0D47D838564686A6468
+ 6A7D8385C8D0D4C8D0D4B0B7BA7D8385C8D0D4C8D0D4717578A3AAADC8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4CBDBE10C4E9C0B20DD0A20D80A20D30A1FCF
+ 0A20CA0920C5091EC1091EBD091EB9081EB5081CB0071DAC071DA8071CA4071C
+ 9F071C9C061C97061B94061B90051B8C051F880C597FD6E3E7C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4D6DCDFE3E7E9EEF0F2B8CFD65893
+ A60B30C80B20DD0A20D70A20D30A1FCE0A20CA0920C5091EC1091EBC091EB908
+ 1EB5081CB0071DAC071DA8071CA4071C9F071C9C061C97061B94061B8F061F8B
+ 0B5580A1C1CCD2D9DCC8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D4D2E0E42B72950C529A0C46AD0B3DB80B20E10B20DD0A20D70A20D30A1FCE
+ 0A20CA0920C50A34AC0C5A85498A9E3A80960B4D8D0825A6071DA7071CA3071C
+ 9F071C9B061C97061B93061B8F0B5580A1C1CCD2D9DCC8D0D4C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4BFD5DB0C42B80B20F00B21EB0B21
+ E60B20E10B20DD0A20D70A20D30A1FCE0A20CA0A30B33A8096D6E3E7DCE2E4E0
+ E4E7BFD5DB1B68880721A5071CA3071C9F071C9B061C97061B93061B8F0B5181
+ E1E9ECC8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D495BAC60C39C70B20F00B21EA0B20E50B20E10B20DC0A20D70A20D30A1FCE
+ 0A20C90B4E94D9E5E9CBD3D7C8D0D4C8D0D4D2D9DCA4C4CE093B94071CA3071C
+ 9F071C9B061C97061B93061B8F093F8582ADBCEAEDEFCFD6D9C8D0D4C8D0D4CB
+ D3D7CFD6D9C8D0D4C8D0D4E7EAEC86B1BE95BAC6BFD5DBDCE2E4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D495BAC60C529B0B31D30B21EA0B20
+ E50B20E10B20DC0A20D70A20D30A1FCE0A20C92B768EE3E7E9C8D0D4C8D0D4C8
+ D0D4C8D0D4D2E0E40B4D8A071CA3071C9E071C9B061C96061B93061B8F06248A
+ 0A47812A718E95BAC6D8E0E4E0E4E7BFD5DBB0CBD4D2D9DCC8D0D4B0CBD40B4E
+ 940A38A80C5A86DFE6E9C8D0D4C8D0D4D2D9DCC8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D4DCE2E4CBDBE1679DAE0C5A8B0B31CB0B20E00B20DC0A20D70A20D20A1FCE
+ 0A20C90C568BEAEDEFC8D0D4C8D0D4C8D0D4C8D0D4BBD2D90A448F071CA3071C
+ 9E071C9B061C96061B93061B8F051B8B051A87061E830B507EB3CED6498A9E0C
+ 4E9D0C5690A1C1CCF1F3F45893A6092CB8091EC00B4499BBD2D9CFD6D9EAEDEF
+ 95BAC6E1E9ECCBD3D7C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4D9DFE1BFD5DB0C41
+ B10B20E00B20DC0A20D60A20D20A1FCE0920C90B41A186B1BEDCE2E4C8D0D4C8
+ D0D4EAEDEF498A9E082E9C071CA3071C9E071C9B061C96061B93061B8E051B8B
+ 051A87061A830B507EE0EBEE0C52970B20E10B24D50C568E0C5A880B459F091F
+ C4091EBF0A37A3498A9EA4C4CE2A72900A488C2A7290C7D9DFCBD3D7C8D0D4C8
+ D0D4C8D0D4C8D0D4CBD3D7CBDBE10C52970B20E00B20DB0A20D60A20D20A1FCD
+ 0920C90924BF0C518E679DAEBFD5DBB3CED6498A9E0A4094071DA7071CA3071C
+ 9E071C9B061C96061B92061B8E051B8B051A870727821B6386FFFFFF2B72940B
+ 20DF0A20D90A20D40A1FCE0920C8091FC2091EBD081EB80826AC0A3F950725A2
+ 071CA3093692679DAEDCE2E4C8D0D4C8D0D4C8D0D4CBD3D7E5ECEF3A7C9C0B2D
+ D10B20E00B21DB0A20D60A20D20A1FCD0920C9091FC4091EBF0A33A80B409A0A
+ 40980829A5071DAA071DA6071CA3071C9E071C9A061C96061B9207288B1B6387
+ 498A9E679DAEA4C4CEECF2F42B768E0B28D10A20D70A1FD20A1FCC0920C6091E
+ C0091EBB081EB6081CB0071DAB071DA6071CA10B5185BBD2D9C8D0D4C8D0D4C8
+ D0D4CBD3D7E5ECEF3A7C9D0B2DD50B20E50B20E00B21DB0A20D60A20D20A1FCD
+ 0920C9091FC4091EBF091EBB091EB7081DB3081CAF071DAA071DA6071CA2071C
+ 9E071C9A061C96061B920A4884C2D8DEC2D8DE4981AC1B64943A80960B3DB50B
+ 20DC0A20D50A1FD0091FCA091FC4091EBF091EBA081DB4081CAF071DA9071CA5
+ 07209D2B768EE7EAECC8D0D4C8D0D4C8D0D4C8D0D4BFD5DB0C4AA70B21E90B20
+ E40B20E00B21DB0A20D60A20D10A1FCD0920C8091FC3091EBF091EBB091EB708
+ 1DB3081CAF071DAA071DA6071CA2071C9E071C9A061C96061B921C6C86FCFCFC
+ 5893A60B29E30B20EC0B20E50B20DF0A20D90A20D40A1FCE0920C8091FC2091E
+ BD081EB8081DB2071CAD071DA8071CA3071C9D0B4C86A4C4CEC2D8DEC4D6DBD9
+ DFE1C8D0D4E3E7E9498A9E0B2DD50B20E40B28D30B35BE0A24D00A20D10A1FCD
+ 0920C8091FC3091EBF091EBB081EB7081DB3081CAE071DAA071DA6071CA2071C
+ 9D071C9A061C96061B92094385A4C4CE2B768E0B31D30B21EA0B20E30B20DE0A
+ 20D70A1FD20A1FCC0920C60A38A80B409D0A33A5081CB1071DAB071DA6071CA1
+ 071C9C072095093F88093F850C5A7FEEF0F2C8D0D4CBD3D7BBD2D90C5A8B2B72
+ 945893A676A7B60C568E0A24CC0A1FCD0920C8091FC3091EBF091EBB081EB708
+ 1DB3081CAE071DAA071DA6071CA2071C9D071C9A061C96061B92061F8D1B6886
+ E0EBEE3A80960B39BF0B20E10B20DC0A20D50A1FD00A1FCA0B4E94679DAEC2D8
+ DE679DAE0B4D8D071DA9071CA5071C9F071C9A061B95061B90051B8B094382BB
+ D2D9C8D0D4C8D0D4D9DFE1F1F3F4E3E7E9D9DFE1E0E4E786B1BE0B41A70A1FCD
+ 0920C8091FC3091EBF091EBB081EB6081DB2081CAE071DAA071DA6071CA20832
+ 93082D92061B96061B92061F8D0C5A7FCEDEE4E5ECEF0C52970B20E00A20D90A
+ 20D40A1FCE0A34B2679DAEDCE2E4C8D0D4DCE2E4679DAE08329A071CA3071C9D
+ 061C98061B94061B8F0731861B6387D1E1E6C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4CFD6D986B1BE0A30BB0A1FCD0920C8091FC3091EBF091EBB081EB608
+ 1DB2081CAE071DAA0725A10B5187679DAE679DAE0B518308318B0B5581A4C4CE
+ DDE8EB5893A60C41B00B20DE0A20D70A1FD20A1FCC0B41A3C2D8DEC8D0D4C8D0
+ D4C8D0D4C2D8DE0A4091071CA1071C9C061C97061B92093A875893A6D2E0E4D6
+ DCDFC8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4D6DCDF679DAE0A2CC00A1FCC
+ 0920C7092CB60C5E820C518D0B4993081DB2081CAE071DAA082E9C86B1BEE0E4
+ E7DCE2E4D9E5E9679DAEA4C4CEC2D8DE1B64930B39BF0B20E10B20DC0A20D60A
+ 1FD00A1FCA0A34AF679DAEE0E4E7C8D0D4E0E4E7679DAE083298071C9F071C9A
+ 061B95061B900A4883BBD2D9C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4E0E4E7498A9E0B38B10A1FCC0A28BE1B688AC7D9DFEEF0F2679DAE09
+ 2EA4081CAE071DA909379795BAC6C8D0D4C8D0D4C8D0D4DCE2E4D2D9DCBFD5DB
+ 0C46AD0B20E50B20E00A20D90A20D40A1FCE0920C8091FC20B4996679DAEB3CE
+ D6679DAE0A488D071CA3071C9E071C99061B94061B8F093F84498A9EDFE6E9CB
+ D3D7C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4D2D9DCD2E0E4679DAE0C5A87
+ 0C568CCEDEE4D2D9DCC8D0D4D9E5E90B518A081CAE071DA90A488DC2D8DEC8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4DFE6E90C5A8B0C41B10B35C00A28CC0A1FD20A
+ 1FCC0920C6091EC0091EBC0A33A40A3F9709329D071DA6071CA1071C9C061C97
+ 061B92051B8D051A880835823A8096EAEDEFC8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4D6DCDFDFE6E9CEDEE4D2D9DCC8D0D4C8D0D4DCE2E467
+ 9DAE0B51893A8096679DAED2E0E4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4D9DFE1
+ D1E1E6C2D8DE76A7B60C52930A1FD00A1FCB091FC4091EBF091EBA081DB5081C
+ AF071DAA071DA5071C9F071C9A061B96061B90051B8C051A87082C815893A6DC
+ E2E4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4EEF0F2E7EAECE3E7E9D6DCDFC8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4E7EAEC3A80960A27C409
+ 20C9091FC2091EBD091EB8081DB3081CAD071DA8071CA3071C9E071C99061B94
+ 0836890C5E7E0B50800C597EBBD2D9C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4BBD2D90B499C0A1FCC0920C6091EC1091EBC081EB7081CB1071D
+ AC071DA6071CA1071C9C061C9707288F2B768EDFE6E9EAEDEFD2E0E4D9DFE1C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4DCE2E4679DAE0B38B00A1FCB09
+ 28BC0B49960A2FAB081DB5081CAF071DAA071DA5071C9F071C9B061B96061B90
+ 3A8096E0E4E7C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4CBD3D7C7D9DF3A7C9B0B499A2B7292A4C4CE498A9E092EA5081CAE071D
+ A80B4D8A0C5A820A4887061B94061B8F0B5181DFE6E9C8D0D4C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4CBD3D7E1E9EC95BAC6DF
+ E6E9CBD3D7B3CED60A3F97071CAC082E9D679DAEF1F3F4A4C4CE0B55810B5182
+ 5893A6D8E0E4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4D2D9DCC8D0D4C8D0D4D2E0E40C55870A40940B4D
+ 8ABFD5DBC8D0D4DCE2E4B3CED6BBD2D9DCE2E4C8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0
+ D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8
+ D0D4C8D0D4E0E4E7BBD2D9B3CED686B1BEE7EAECC8D0D4C8D0D4D2D9DCC8D0D4
+ C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4C8D0D4
+ }
+ Transparent = True
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPleaseWaitForm.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPleaseWaitForm.lrs
new file mode 100644
index 0000000..85b8dd9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPleaseWaitForm.lrs
@@ -0,0 +1,266 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TPleaseWaitForm','FORMDATA',[
+ 'TPF0'#15'TPleaseWaitForm'#14'PleaseWaitForm'#4'Left'#3'P'#1#6'Height'#2')'#3
+ +'Top'#3'X'#1#5'Width'#3#30#2#18'HorzScrollBar.Page'#3#29#2#18'VertScrollBar.'
+ +'Page'#2'('#11'BorderIcons'#11#0#11'BorderStyle'#7#8'bsDialog'#7'Caption'#6
+ +#14'RemObjects SDK'#12'ClientHeight'#2')'#11'ClientWidth'#3#30#2#11'Font.Hei'
+ +'ght'#2#245#9'Font.Name'#6#6'Tahoma'#9'FormStyle'#7#11'fsStayOnTop'#6'OnHide'
+ +#7#8'FormHide'#6'OnShow'#7#8'FormShow'#8'Position'#7#14'poScreenCenter'#10'L'
+ +'CLVersion'#6#6'0.9.25'#0#6'TLabel'#11'lbl_Caption'#4'Left'#2'@'#6'Height'#2
+ +#20#3'Top'#2#14#5'Width'#2'T'#7'Caption'#6#14'Please wait...'#11'ParentColor'
+ +#8#0#0#6'TImage'#8'img_Logo'#4'Left'#2#2#6'Height'#2')'#5'Width'#2'0'#6'Cent'
+ +'er'#9#12'Picture.Data'#10#18#21#0#0#7'TBitmap'#6#21#0#0'BM'#6#21#0#0#0#0#0#0
+ +'6'#0#0#0'('#0#0#0'0'#0#0#0'%'#0#0#0#1#0#24#0#0#0#0#0#208#20#0#0#19#11#0#0#19
+ +#11#0#0#0#0#0#0#0#0#0#0#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#210#217#220#207#214#217#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#231#234#236#199#217#223#149#186#198#134
+ +#177#190#225#233#236#200#208#212#200#208#212#200#208#212#203#211#215#227#231
+ +#233#207#214#217#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#210#217
+ +#220#134#177#190#11'N'#148#10'<'#164#11'@'#158#134#177#190#214#220#223#200
+ +#208#212#203#211#215#229#236#239'X'#147#166#149#186#198#223#230#233#207#214
+ +#217#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#214#220#223'g'#157#174#9','#184#9#31#194#9
+ +#30#190#27'd'#141#225#233#236#210#217#220#219#227#231':'#128#150#9';'#147#10
+ +'?'#143#27'h'#136#179#206#214#210#217#220#200#208#212#200#208#212#200#208#212
+ +#200#208#212#163#170#173'245'#0#0#0#13#13#13'dhj'#200#208#212'245'#0#0#0#0#0
+ +#0'&''('#151#157#160#200#208#212#151#157#160'245'#200#208#212#200#208#212'dh'
+ +'jdhj'#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#210#217#220#217#229#233#234#237#239#207#214#217#200#208#212#217#223#225
+ +'I'#138#158#9' '#198#9#31#194#9#30#189#10'7'#164'I'#138#158#134#177#190':'
+ +#128#150#9'7'#152#7#29#165#7#28#160#8'2'#147#134#177#190#203#211#215#200#208
+ +#212#200#208#212#200#208#212#200#208#212'}'#131#133'qux'#200#208#212#188#196
+ +#200#25#26#27#163#170#173'245'#151#157#160#200#208#212#151#157#160#25#26#27
+ +#176#183#186#151#157#160'&''('#200#208#212#188#196#200#25#26#27#188#196#200
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#210#217#220#206
+ +#222#228#28'h'#140'+r'#148#164#196#206#238#240#242#191#213#219'+v'#142#9' '
+ +#198#9#31#194#9#30#189#9#30#185#9'/'#167#9'.'#164#9'.'#161#7#29#168#7#29#165
+ +#7#28#160#10'?'#141#191#213#219#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#163#170#173#25#26#27#163
+ +#170#173'245'#151#157#160#200#208#212#200#208#212'KNPqux'#151#157#160#0#0#0
+ +'}'#131#133'dhjX[]'#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#203#211#215#203#219#225#28'h'#140#11'$'#220#11'$'#216#11'A'#171#27'h'
+ +#139#12'M'#151#10'('#193#9' '#198#9#31#194#9#30#189#9#30#185#8#30#181#8#28
+ +#177#8#29#173#7#29#168#7#29#165#7#28#160#11'L'#135#214#227#231#200#208#212
+ +#200#208#212#200#208#212#210#217#220#200#208#212#188#196#200'?AC'#0#0#0'&''('
+ +'qux'#200#208#212'245'#151#157#160#200#208#212#200#208#212'dhjdhj'#151#157
+ +#160'&''('#13#13#13#13#13#13#176#183#186#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#217#223#225'g'#157#174#11'='#184#11' '#226#11' '#221
+ +#10' '#216#10' '#212#10#31#207#10' '#203#9' '#198#9#31#193#9#30#189#9#30#185
+ +#8#30#181#8#28#176#8#29#172#7#29#168#7#29#164#7#28#160#9'6'#145':'#128#150
+ +#225#233#236#210#224#228#164#196#206#149#186#198#220#226#228'qux?AC'#188#196
+ ,#200#200#208#212#200#208#212#200#208#212'245'#151#157#160#200#208#212#200#208
+ +#212'&''('#138#144#146#151#157#160'245'#151#157#160#25#26#27#188#196#200#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#225#233
+ +#236#27'd'#146#11'$'#219#11' '#221#10' '#216#10' '#212#10#31#207#10' '#203#9
+ +' '#198#9#31#193#9#30#189#9#30#185#8#30#181#8#28#176#7#29#172#7#29#168#7#29
+ +#164#7#28#159#7#28#156#9'6'#142#12'Z'#128#10'L'#131#9'?'#133#11'Q'#128#191
+ +#213#219#141#146#149#25#26#27'dhjKNP?AC'#200#208#212'245KNPdhj245245'#200#208
+ +#212#151#157#160'245'#200#208#212'dhj245'#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#210#217#220#134#177#190#12'A'#175#11' '
+ +#221#10' '#216#10' '#211#10#31#207#10' '#202#9' '#197#9#31#193#9#30#189#9#30
+ +#185#8#30#181#8#28#176#7#29#172#7#29#168#7#29#164#7#28#159#7#28#156#6#28#151
+ +#6#27#148#6#27#144#5#27#140#6'$'#135'I'#138#158#227#231#233#151#157#160'dhjq'
+ +'ux'#188#196#200#200#208#212'}'#131#133'dhjdhj}'#131#133#200#208#212#200#208
+ +#212#176#183#186'}'#131#133#200#208#212#200#208#212'qux'#163#170#173#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#203#219#225
+ +#12'N'#156#11' '#221#10' '#216#10' '#211#10#31#207#10' '#202#9' '#197#9#30
+ +#193#9#30#189#9#30#185#8#30#181#8#28#176#7#29#172#7#29#168#7#28#164#7#28#159
+ +#7#28#156#6#28#151#6#27#148#6#27#144#5#27#140#5#31#136#12'Y'#214#227#231#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#214
+ +#220#223#227#231#233#238#240#242#184#207#214'X'#147#166#11'0'#200#11' '#221
+ +#10' '#215#10' '#211#10#31#206#10' '#202#9' '#197#9#30#193#9#30#188#9#30#185
+ +#8#30#181#8#28#176#7#29#172#7#29#168#7#28#164#7#28#159#7#28#156#6#28#151#6#27
+ +#148#6#27#143#6#31#139#11'U'#128#161#193#204#210#217#220#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#210#224#228'+r'#149
+ +#12'R'#154#12'F'#173#11'='#184#11' '#225#11' '#221#10' '#215#10' '#211#10#31
+ +#206#10' '#202#9' '#197#10'4'#172#12'Z'#133'I'#138#158':'#128#150#11'M'#141#8
+ +'%'#166#7#29#167#7#28#163#7#28#159#7#28#155#6#28#151#6#27#147#6#27#143#11'U'
+ +#128#161#193#204#210#217#220#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#191#213#219#12'B'#184#11' '#240#11
+ +'!'#235#11'!'#230#11' '#225#11' '#221#10' '#215#10' '#211#10#31#206#10' '#202
+ +#10'0'#179':'#128#150#214#227#231#220#226#228#224#228#231#191#213#219#27'h'
+ +#136#7'!'#165#7#28#163#7#28#159#7#28#155#6#28#151#6#27#147#6#27#143#11'Q'#129
+ +#225#233#236#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#149#186#198#12'9'#199#11' '#240#11'!'
+ +#234#11' '#229#11' '#225#11' '#220#10' '#215#10' '#211#10#31#206#10' '#201#11
+ +'N'#148#217#229#233#203#211#215#200#208#212#200#208#212#210#217#220#164#196
+ +#206#9';'#148#7#28#163#7#28#159#7#28#155#6#28#151#6#27#147#6#27#143#9'?'#133
+ +#130#173#188#234#237#239#207#214#217#200#208#212#200#208#212#203#211#215#207
+ +#214#217#200#208#212#200#208#212#231#234#236#134#177#190#149#186#198#191#213
+ +#219#220#226#228#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#149#186#198#12'R'#155#11'1'#211#11'!'
+ +#234#11' '#229#11' '#225#11' '#220#10' '#215#10' '#211#10#31#206#10' '#201'+'
+ +'v'#142#227#231#233#200#208#212#200#208#212#200#208#212#200#208#212#210#224
+ +#228#11'M'#138#7#28#163#7#28#158#7#28#155#6#28#150#6#27#147#6#27#143#6'$'#138
+ +#10'G'#129'*q'#142#149#186#198#216#224#228#224#228#231#191#213#219#176#203
+ +#212#210#217#220#200#208#212#176#203#212#11'N'#148#10'8'#168#12'Z'#134#223
+ +#230#233#200#208#212#200#208#212#210#217#220#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#220#226#228#203#219#225'g'#157#174#12'Z'#139#11
+ +'1'#203#11' '#224#11' '#220#10' '#215#10' '#210#10#31#206#10' '#201#12'V'#139
+ +#234#237#239#200#208#212#200#208#212#200#208#212#200#208#212#187#210#217#10
+ +'D'#143#7#28#163#7#28#158#7#28#155#6#28#150#6#27#147#6#27#143#5#27#139#5#26
+ +#135#6#30#131#11'P~'#179#206#214'I'#138#158#12'N'#157#12'V'#144#161#193#204
+ +#241#243#244'X'#147#166#9','#184#9#30#192#11'D'#153#187#210#217#207#214#217
+ +#234#237#239#149#186#198#225#233#236#203#211#215#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#217#223#225#191#213#219#12'A'#177#11' '#224
+ +#11' '#220#10' '#214#10' '#210#10#31#206#9' '#201#11'A'#161#134#177#190#220
+ ,#226#228#200#208#212#200#208#212#234#237#239'I'#138#158#8'.'#156#7#28#163#7
+ +#28#158#7#28#155#6#28#150#6#27#147#6#27#142#5#27#139#5#26#135#6#26#131#11'P~'
+ +#224#235#238#12'R'#151#11' '#225#11'$'#213#12'V'#142#12'Z'#136#11'E'#159#9#31
+ +#196#9#30#191#10'7'#163'I'#138#158#164#196#206'*r'#144#10'H'#140'*r'#144#199
+ +#217#223#203#211#215#200#208#212#200#208#212#200#208#212#200#208#212#203#211
+ +#215#203#219#225#12'R'#151#11' '#224#11' '#219#10' '#214#10' '#210#10#31#205
+ +#9' '#201#9'$'#191#12'Q'#142'g'#157#174#191#213#219#179#206#214'I'#138#158#10
+ +'@'#148#7#29#167#7#28#163#7#28#158#7#28#155#6#28#150#6#27#146#6#27#142#5#27
+ +#139#5#26#135#7''''#130#27'c'#134#255#255#255'+r'#148#11' '#223#10' '#217#10
+ +' '#212#10#31#206#9' '#200#9#31#194#9#30#189#8#30#184#8'&'#172#10'?'#149#7'%'
+ +#162#7#28#163#9'6'#146'g'#157#174#220#226#228#200#208#212#200#208#212#200#208
+ +#212#203#211#215#229#236#239':|'#156#11'-'#209#11' '#224#11'!'#219#10' '#214
+ +#10' '#210#10#31#205#9' '#201#9#31#196#9#30#191#10'3'#168#11'@'#154#10'@'#152
+ +#8')'#165#7#29#170#7#29#166#7#28#163#7#28#158#7#28#154#6#28#150#6#27#146#7'('
+ +#139#27'c'#135'I'#138#158'g'#157#174#164#196#206#236#242#244'+v'#142#11'('
+ +#209#10' '#215#10#31#210#10#31#204#9' '#198#9#30#192#9#30#187#8#30#182#8#28
+ +#176#7#29#171#7#29#166#7#28#161#11'Q'#133#187#210#217#200#208#212#200#208#212
+ +#200#208#212#203#211#215#229#236#239':|'#157#11'-'#213#11' '#229#11' '#224#11
+ +'!'#219#10' '#214#10' '#210#10#31#205#9' '#201#9#31#196#9#30#191#9#30#187#9
+ +#30#183#8#29#179#8#28#175#7#29#170#7#29#166#7#28#162#7#28#158#7#28#154#6#28
+ +#150#6#27#146#10'H'#132#194#216#222#194#216#222'I'#129#172#27'd'#148':'#128
+ +#150#11'='#181#11' '#220#10' '#213#10#31#208#9#31#202#9#31#196#9#30#191#9#30
+ +#186#8#29#180#8#28#175#7#29#169#7#28#165#7' '#157'+v'#142#231#234#236#200#208
+ +#212#200#208#212#200#208#212#200#208#212#191#213#219#12'J'#167#11'!'#233#11
+ +' '#228#11' '#224#11'!'#219#10' '#214#10' '#209#10#31#205#9' '#200#9#31#195#9
+ +#30#191#9#30#187#9#30#183#8#29#179#8#28#175#7#29#170#7#29#166#7#28#162#7#28
+ +#158#7#28#154#6#28#150#6#27#146#28'l'#134#252#252#252'X'#147#166#11')'#227#11
+ +' '#236#11' '#229#11' '#223#10' '#217#10' '#212#10#31#206#9' '#200#9#31#194#9
+ +#30#189#8#30#184#8#29#178#7#28#173#7#29#168#7#28#163#7#28#157#11'L'#134#164
+ +#196#206#194#216#222#196#214#219#217#223#225#200#208#212#227#231#233'I'#138
+ +#158#11'-'#213#11' '#228#11'('#211#11'5'#190#10'$'#208#10' '#209#10#31#205#9
+ +' '#200#9#31#195#9#30#191#9#30#187#8#30#183#8#29#179#8#28#174#7#29#170#7#29
+ +#166#7#28#162#7#28#157#7#28#154#6#28#150#6#27#146#9'C'#133#164#196#206'+v'
+ +#142#11'1'#211#11'!'#234#11' '#227#11' '#222#10' '#215#10#31#210#10#31#204#9
+ +' '#198#10'8'#168#11'@'#157#10'3'#165#8#28#177#7#29#171#7#29#166#7#28#161#7
+ +#28#156#7' '#149#9'?'#136#9'?'#133#12'Z'#238#240#242#200#208#212#203#211#215
+ +#187#210#217#12'Z'#139'+r'#148'X'#147#166'v'#167#182#12'V'#142#10'$'#204#10
+ +#31#205#9' '#200#9#31#195#9#30#191#9#30#187#8#30#183#8#29#179#8#28#174#7#29
+ +#170#7#29#166#7#28#162#7#28#157#7#28#154#6#28#150#6#27#146#6#31#141#27'h'#134
+ +#224#235#238':'#128#150#11'9'#191#11' '#225#11' '#220#10' '#213#10#31#208#10
+ +#31#202#11'N'#148'g'#157#174#194#216#222'g'#157#174#11'M'#141#7#29#169#7#28
+ +#165#7#28#159#7#28#154#6#27#149#6#27#144#5#27#139#9'C'#130#187#210#217#200
+ +#208#212#200#208#212#217#223#225#241#243#244#227#231#233#217#223#225#224#228
+ +#231#134#177#190#11'A'#167#10#31#205#9' '#200#9#31#195#9#30#191#9#30#187#8#30
+ +#182#8#29#178#8#28#174#7#29#170#7#29#166#7#28#162#8'2'#147#8'-'#146#6#27#150
+ +#6#27#146#6#31#141#12'Z'#206#222#228#229#236#239#12'R'#151#11' '#224#10' '
+ +#217#10' '#212#10#31#206#10'4'#178'g'#157#174#220#226#228#200#208#212#220#226
+ +#228'g'#157#174#8'2'#154#7#28#163#7#28#157#6#28#152#6#27#148#6#27#143#7'1'
+ +#134#27'c'#135#209#225#230#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#207#214#217#134#177#190#10'0'#187#10#31#205#9' '#200
+ +#9#31#195#9#30#191#9#30#187#8#30#182#8#29#178#8#28#174#7#29#170#7'%'#161#11
+ +'Q'#135'g'#157#174'g'#157#174#11'Q'#131#8'1'#139#11'U'#129#164#196#206#221
+ +#232#235'X'#147#166#12'A'#176#11' '#222#10' '#215#10#31#210#10#31#204#11'A'
+ +#163#194#216#222#200#208#212#200#208#212#200#208#212#194#216#222#10'@'#145#7
+ +#28#161#7#28#156#6#28#151#6#27#146#9':'#135'X'#147#166#210#224#228#214#220
+ +#223#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#214#220#223'g'#157#174#10','#192#10#31#204#9' '#199#9','#182#12'^'#130#12'Q'
+ +#141#11'I'#147#8#29#178#8#28#174#7#29#170#8'.'#156#134#177#190#224#228#231
+ +#220#226#228#217#229#233'g'#157#174#164#196#206#194#216#222#27'd'#147#11'9'
+ +#191#11' '#225#11' '#220#10' '#214#10#31#208#10#31#202#10'4'#175'g'#157#174
+ +#224#228#231#200#208#212#224#228#231'g'#157#174#8'2'#152#7#28#159#7#28#154#6
+ +#27#149#6#27#144#10'H'#131#187#210#217#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#224#228#231'I'
+ +#138#158#11'8'#177#10#31#204#10'('#190#27'h'#138#199#217#223#238#240#242'g'
+ ,#157#174#9'.'#164#8#28#174#7#29#169#9'7'#151#149#186#198#200#208#212#200#208
+ +#212#200#208#212#220#226#228#210#217#220#191#213#219#12'F'#173#11' '#229#11
+ +' '#224#10' '#217#10' '#212#10#31#206#9' '#200#9#31#194#11'I'#150'g'#157#174
+ +#179#206#214'g'#157#174#10'H'#141#7#28#163#7#28#158#7#28#153#6#27#148#6#27
+ +#143#9'?'#132'I'#138#158#223#230#233#203#211#215#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#210#217#220#210#224#228'g'#157
+ +#174#12'Z'#135#12'V'#140#206#222#228#210#217#220#200#208#212#217#229#233#11
+ +'Q'#138#8#28#174#7#29#169#10'H'#141#194#216#222#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#223#230#233#12'Z'#139#12'A'#177#11'5'#192#10
+ +'('#204#10#31#210#10#31#204#9' '#198#9#30#192#9#30#188#10'3'#164#10'?'#151#9
+ +'2'#157#7#29#166#7#28#161#7#28#156#6#28#151#6#27#146#5#27#141#5#26#136#8'5'
+ +#130':'#128#150#234#237#239#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#214#220#223#223#230#233#206
+ +#222#228#210#217#220#200#208#212#200#208#212#220#226#228'g'#157#174#11'Q'#137
+ +':'#128#150'g'#157#174#210#224#228#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#217#223#225#209#225#230#194#216#222'v'#167#182#12'R'#147
+ +#10#31#208#10#31#203#9#31#196#9#30#191#9#30#186#8#29#181#8#28#175#7#29#170#7
+ +#29#165#7#28#159#7#28#154#6#27#150#6#27#144#5#27#140#5#26#135#8','#129'X'#147
+ +#166#220#226#228#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#238#240#242#231#234#236#227#231
+ +#233#214#220#223#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#231#234#236':'#128#150#10
+ +''''#196#9' '#201#9#31#194#9#30#189#9#30#184#8#29#179#8#28#173#7#29#168#7#28
+ +#163#7#28#158#7#28#153#6#27#148#8'6'#137#12'^~'#11'P'#128#12'Y~'#187#210#217
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#187#210#217#11'I'#156#10#31#204
+ +#9' '#198#9#30#193#9#30#188#8#30#183#8#28#177#7#29#172#7#29#166#7#28#161#7#28
+ +#156#6#28#151#7'('#143'+v'#142#223#230#233#234#237#239#210#224#228#217#223
+ +#225#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#220#226#228'g'#157#174#11'8'#176#10#31
+ +#203#9'('#188#11'I'#150#10'/'#171#8#29#181#8#28#175#7#29#170#7#29#165#7#28
+ +#159#7#28#155#6#27#150#6#27#144':'#128#150#224#228#231#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#203#211#215#199#217#223':|'
+ +#155#11'I'#154'+r'#146#164#196#206'I'#138#158#9'.'#165#8#28#174#7#29#168#11
+ +'M'#138#12'Z'#130#10'H'#135#6#27#148#6#27#143#11'Q'#129#223#230#233#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#203
+ +#211#215#225#233#236#149#186#198#223#230#233#203#211#215#179#206#214#10'?'
+ +#151#7#28#172#8'.'#157'g'#157#174#241#243#244#164#196#206#11'U'#129#11'Q'#130
+ +'X'#147#166#216#224#228#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#210#217#220#200#208#212
+ +#200#208#212#210#224#228#12'U'#135#10'@'#148#11'M'#138#191#213#219#200#208
+ +#212#220#226#228#179#206#214#187#210#217#220#226#228#200#208#212#200#208#212
+ +#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212
+ ,#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#200#208#212#200#208#212#200#208#212#200#208#212#224#228#231#187#210#217
+ +#179#206#214#134#177#190#231#234#236#200#208#212#200#208#212#210#217#220#200
+ +#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208#212#200#208
+ +#212#0#0#0
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPleaseWaitForm.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPleaseWaitForm.pas
new file mode 100644
index 0000000..4dc71d3
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPleaseWaitForm.pas
@@ -0,0 +1,118 @@
+unit uDAPleaseWaitForm;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {$IFDEF FPC}LResources,{$ENDIF}
+ uROPleaseWaitForm,
+ Classes;
+
+type
+ IROPleaseWaitForm = interface
+ ['{32003A95-B7F4-4ED6-B65E-78B4204DF2AF}']
+ procedure Show(const iCaption:string=''); overload;
+ procedure Hide;
+ procedure Free;
+ end;
+
+function CreatePleaseWaitForm(aOwner: TComponent; const aCaption: string; aShow: boolean; aLogo:string; aWindowCaption:string=''): IROPleaseWaitForm; overload;
+function CreatePleaseWaitForm(aOwner: TComponent; const aCaption: string; aShow: boolean = true): IROPleaseWaitForm; overload;
+function CreatePleaseWaitForm(const aCaption: string; aShow: boolean = true): IROPleaseWaitForm; overload;
+
+implementation
+
+uses
+ Graphics,
+ SysUtils;
+
+{$IFNDEF FPC}
+ {$IFDEF MSWINDOWS}
+ {$R IDE\DataAbstract_IDE_AdditionalResources.res}
+ {$ENDIF}
+
+ {$IFNDEF MSWINDOWS}
+ {$R IDE/DataAbstract_IDE_AdditionalResources.res}
+ {$ENDIF}
+{$ENDIF FPC}
+
+type
+ TROPleaseWaitFormWrapper = class(TInterfacedObject, IROPleaseWaitForm)
+ private
+ fForm: TPleaseWaitForm;
+ public
+ constructor Create(aForm: TPleaseWaitForm);
+ destructor Destroy; override;
+ procedure Show(const iCaption:string=''); overload;
+ procedure Hide;
+ procedure Free;
+ end;
+
+function CreatePleaseWaitForm(aOwner: TComponent; const aCaption: string; aShow: boolean; aLogo:string; aWindowCaption:string): IROPleaseWaitForm; overload;
+var
+ lBitmap: TBitmap;
+begin
+ if aWindowCaption = '' then aWindowCaption := 'Data Abstract';
+ lBitmap := TBitmap.Create();
+ lBitmap.LoadFromResourceName(hInstance, aLogo);
+ result := TROPleaseWaitFormWrapper.Create(TPleaseWaitForm.Create(aOwner, aCaption, aWindowCaption, lBitmap, true));
+ if aShow then result.Show();
+end;
+
+function CreatePleaseWaitForm(aOwner: TComponent; const aCaption: string; aShow: boolean = true): IROPleaseWaitForm;
+begin
+ result := CreatePleaseWaitForm(aOWner, aCaption, aShow, 'dalogo');
+end;
+
+function CreatePleaseWaitForm(const aCaption: string; aShow: boolean = true): IROPleaseWaitForm;
+begin
+ result := CreatePleaseWaitForm(nil, aCaption, aShow);
+end;
+
+{ TROPleaseWaitFormWrapper }
+
+constructor TROPleaseWaitFormWrapper.Create(aForm: TPleaseWaitForm);
+begin
+ fForm := aForm;
+end;
+
+destructor TROPleaseWaitFormWrapper.Destroy;
+begin
+ fForm.Close;
+ FreeAndNil(fForm);
+ inherited;
+end;
+
+procedure TROPleaseWaitFormWrapper.Free;
+begin
+ { no-op }
+end;
+
+procedure TROPleaseWaitFormWrapper.Hide;
+begin
+ fForm.Hide();
+end;
+
+procedure TROPleaseWaitFormWrapper.Show(const iCaption: string='');
+begin
+ fForm.Show(iCaption);
+end;
+
+{$IFDEF FPC}
+initialization
+ {$I IDE/DataAbstract_IDE_AdditionalResources.lrs}
+{$ENDIF}
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPostgresInterfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPostgresInterfaces.pas
new file mode 100644
index 0000000..8ebf7a6
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPostgresInterfaces.pas
@@ -0,0 +1,593 @@
+unit uDAPostgresInterfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ SysUtils,
+ uDAInterfaces, uDAEngine, uROClasses;
+
+type
+ { IDAPostgresConnection
+ For identification purposes Implemented by all Postgres connections }
+ IDAPostgresConnection = interface(IDAConnection)
+ ['{D8EADB7E-7AA0-48FF-9E7D-34853F999BFC}']
+ end;
+
+ TDAPostgresDriver = class(TDAEDriver)
+ protected
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ public
+ end;
+
+ TDAEPostgresConnection = class(TDAEConnection, IDAPostgresConnection, IDACanQueryDatabaseNames, IDAUseGenerators, IDAUseGenerators2)
+ protected
+ function DoGetLastAutoInc(const GeneratorName: string): integer; override;
+ function DoGetLastAutoIncValue(const GeneratorName: string): Variant; override;
+ procedure DoGetTableFields(const aTableName: string; out Fields: TDAFieldCollection); override;
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); override;
+ function GetSPSelectSyntax(HasArguments: Boolean): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure DoGetStoredProcedureParams(const aStoredProcedureName: string; out Params: TDAParamCollection); override;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDACanQueryDatabaseNames
+ function GetDatabaseNames: IROStrings;
+ // IDAUseGenerators
+ function GetNextAutoinc(const GeneratorName: string): integer; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDAUseGenerators2
+ function GetNextAutoinc2(const GeneratorName: string): variant; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ end;
+
+function Postgres_GetDatabaseNames(aConnection: TDAEConnection): IROStrings;
+function Postgres_DoGetLastAutoInc(const GeneratorName: string; Query: IDADataset): variant;
+function Postgres_GetNextAutoInc(const GeneratorName: string; Query: IDADataset): Variant;
+procedure Postgres_DoGetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection);
+procedure Postgres_DoGetNames(Query: IDADataset; AList: IROStrings; AObjectType: TDAObjecttype);
+function PostgresDataTypeToDA(aDataType: string; Unicode: Boolean=False): TDADataType;
+procedure Postgres_DoGetForeignKeys(Query: IDADataset;ForeignKeys: TDADriverForeignKeyCollection);
+function Postgres_GetSPSelectSyntax(HasArguments: Boolean): String;
+procedure Postgres_DoGetStoredProcedureParams(const aStoredProcedureName: string; Query: IDADataset; out Params: TDAParamCollection);
+function Postgres_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+
+const
+ PostgreSQL_DriverType = 'PostgreSQL';
+
+implementation
+
+var
+ postgres_reservedwords: array of string;
+
+const
+ Postgres_MasterDatabase = 'template1';
+ Postgres_GetDatabaseNames_SQL = 'SELECT datname FROM pg_database ORDER BY datname';
+
+function PostgresDataTypeToDA(aDataType: string; Unicode: Boolean): TDADataType;
+begin
+ aDataType := LowerCase(aDataType);
+ if pos(' ', aDataType) <> 0 then Delete(aDataType, Pos(' ', aDataType), MaxInt);
+ if (aDAtaType = 'varchar') or (aDataType = 'character varying') or
+ (aDataType = 'character') or (aDataType = 'char') or
+ (aDataType = '"char"') or (aDataType = 'name') then begin
+ if Unicode then
+ Result := datWideString
+ else
+ Result := datString;
+ end
+ else if aDataType = 'text' then begin
+ if Unicode then
+ Result := datWideMemo
+ else
+ Result := datMemo;
+ end
+ else if (aDataType = 'blob') or (aDataType = 'binary') or
+ (aDataType = 'varbinary') or (aDataType = 'bytea') or
+ (aDataType = 'binary large object') then
+ Result := datBlob
+ else if (aDataType = 'date') or (aDataType = 'absdate') or
+ (aDataType = 'time') or (aDataType = 'timetz') or
+ (aDataType = 'datetime') or
+ (aDataType = 'timestamp') or (aDataType = 'timestamptz') or
+ (aDataType = 'year') then
+ result := datDateTime
+ else if (aDataType = 'single') or
+ (aDataType = 'real') or (aDataType = 'float4') then
+ Result := datSingleFloat
+ else if (aDataType = 'double') or
+ (aDataType = 'float') or
+ (aDataType = 'doubleprecision') or (aDataType = 'float8') then
+ Result := datFloat
+ else if (aDataType = 'bit') or (aDataType = 'boolean') or (aDataType = 'bool') then
+ Result := datBoolean
+ else if (aDataType = 'bigint') or (aDataType = 'int8') then
+ result := datLargeInt
+ else if (aDataType = 'decimal') or (aDataType = 'numeric') then
+ result := datDecimal
+ else if (aDataType = 'money') then
+ result := datCurrency
+ else if (aDataType = 'serial') or (aDataType = 'serial4') then
+ result := datAutoInc
+ else if (aDataType = 'bigserial') or (aDataType = 'serial8') then
+ result := datLargeAutoInc
+ else if (aDataType = 'smallint') or (aDataType = 'int2') then
+ result := datSmallInt
+ else if (aDataType = 'shortint') or (aDataType = 'int1') then
+ result := datShortInt
+ else if (aDataType = 'enum') or
+ (aDataType = 'int4') or (adatatype = 'int') or (adatatype = 'integer') or
+ (aDataType = 'tinyint') then
+ result := datInteger
+ else
+ result := datUnknown;
+end;
+
+function Postgres_GetDatabaseNames(aConnection: TDAEConnection): IROStrings;
+begin
+ Result := Engine_GetDatabaseNames(aConnection, Postgres_MasterDatabase, Postgres_GetDatabaseNames_SQL);
+end;
+
+function Postgres_DoGetLastAutoInc(const GeneratorName: string; Query: IDADataset): variant;
+begin
+ try
+ Query.SQL := 'SELECT currval(''' + GeneratorName + ''')';
+ Query.Open;
+ result := Query.Fields[0].Value;
+ finally
+ Query := nil;
+ end;
+end;
+
+function Postgres_GetNextAutoInc(const GeneratorName: string; Query: IDADataset): Variant;
+begin
+ try
+ Query.SQL := 'SELECT nextval(''' + GeneratorName + ''')';
+ Query.Open;
+ result := Query.Fields[0].Value;
+ finally
+ Query := nil;
+ end;
+end;
+
+procedure Postgres_DoGetTableFields(const aTableName: string; Query: IDADataset; out Fields: TDAFieldCollection);
+const
+ main_sql = 'SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, CHARACTER_MAXIMUM_LENGTH, CHARACTER_SET_NAME, NUMERIC_PRECISION, NUMERIC_SCALE ' +
+ 'FROM INFORMATION_SCHEMA.COLUMNS ' +
+ 'WHERE TABLE_NAME=''{tbl}'' and TABLE_SCHEMA=''{schem}'' ' +
+ 'ORDER BY ORDINAL_POSITION';
+ pk_sql = 'SELECT COLUMN_NAME ' +
+ 'FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE ' +
+ 'WHERE TABLE_NAME=''{tbl}'' and TABLE_SCHEMA=''{schem}'' AND CONSTRAINT_NAME like ''%_pkey''';
+var
+ fld : TDAField;
+ lSchema, lTable : string;
+ p1 : integer;
+ s : string;
+begin
+ Fields := TDAFieldCollection.Create(nil);
+ try
+ {
+ Query.SQL := 'SELECT * FROM ' + aTableName + ' WHERE 1=0';
+ Query.Open;
+ Fields.Assign(Query.Fields);
+ Query.Close;
+ }
+ Query.SQL := main_sql;
+ lTable := aTableName;
+ if pos('.', lTable) = 0 then begin
+ lSchema := 'public'
+ end else begin
+ lSchema := copy(lTable, 1, pos('.', lTable) - 1);
+ Delete(lTable, 1, pos('.', lTable));
+ end;
+ Query.SQL := StringReplace(Query.SQL, '{tbl}', lTable, []);
+ Query.SQL := StringReplace(Query.SQL, '{schem}', lSchema, []);
+ Query.Open;
+ while not Query.Eof do begin
+ fld := Fields.Add;
+ fld.Name:=Query.Fields[0].AsString;
+ fld.Required := Query.Fields[2].AsString <> 'YES';
+ fld.DefaultValue := Query.Fields[3].AsString;
+ fld.DataType := PostgresDataTypeToDA(Query.Fields[1].asString, sametext(Query.Fields[5].AsString, 'utf8') or sametext(Query.Fields[5].AsString, 'utf16'));
+ if fld.DataType = datDecimal then begin
+ fld.DecimalPrecision := Query.Fields[6].asInteger;
+ fld.DecimalScale := Query.Fields[7].asInteger;
+ end;
+ if Query.Fields[1].asString = '"char"' then fld.size := 1
+ else if Query.Fields[1].asString = 'name' then fld.size := 63
+ else fld.Size := Query.Fields[4].AsInteger;
+
+ if fld.DefaultValue <> '' then begin
+ if pos('nextval(', fld.DefaultValue) = 1 then begin
+ case fld.DataType of
+ datInteger: fld.DataType := datAutoInc;
+ datLargeInt: fld.DataType := datLargeAutoInc;
+ else
+ fld.DefaultValue := '';
+ end;
+ if fld.DefaultValue <> '' then begin
+ s := fld.DefaultValue;
+ p1 := pos('''', s);
+ Delete(s, 1, p1);
+ p1 := pos('''', s);
+ fld.GeneratorName := Copy(s, 1, p1 - 1);
+ fld.DefaultValue := '';
+ end;
+ end else if not TestDefaultValue(fld.DefaultValue, fld.DataType) then begin
+ fld.DefaultValue := '';
+ end;
+ end;
+ Query.Next;
+ end;
+ Query.Close;
+ Query.SQL := pk_sql;
+ Query.SQL := StringReplace(Query.SQL, '{tbl}', lTable, []);
+ Query.SQL := StringReplace(Query.SQL, '{schem}', lSchema, []);
+ Query.Open;
+ while not Query.Eof do begin
+ fld := Fields.FindField(Query.Fields[0].AsString);
+ if fld <> nil then
+ fld.InPrimaryKey := true;
+ Query.Next;
+ end;
+ finally
+ Query := nil;
+ end;
+end;
+
+procedure Postgres_DoGetNames(Query: IDADataset; AList: IROStrings; AObjectType: TDAObjecttype);
+const
+ c_select = 'SELECT pg_namespace.nspname, pg_class.relname FROM pg_class, pg_namespace '+
+ 'WHERE (pg_class.relkind = ''r'') AND (pg_namespace.oid = pg_class.relnamespace) AND '+
+ '(pg_namespace.nspname NOT LIKE ''pg_%'') AND (pg_namespace.nspname NOT LIKE ''information_schema'') ORDER BY 1,2';
+ c_stored = 'SELECT pg_namespace.nspname, pg_proc.proname '+
+ 'FROM pg_namespace, pg_proc '+
+ 'WHERE pg_namespace.oid = pg_proc.pronamespace and '+
+ '(pg_namespace.nspname NOT LIKE ''pg_%'') AND (pg_namespace.nspname NOT LIKE ''information_schema'') ORDER BY 1,2';
+ c_view = 'SELECT pg_namespace.nspname, pg_class.relname FROM pg_class, pg_namespace '+
+ 'WHERE (pg_class.relkind = ''v'') AND (pg_namespace.oid = pg_class.relnamespace) AND '+
+ '(pg_namespace.nspname NOT LIKE ''pg_%'') AND (pg_namespace.nspname NOT LIKE ''information_schema'') ORDER BY 1,2';
+begin
+ try
+ case AObjectType of
+ dotTable: Query.SQL := c_select;
+ dotProcedure: Query.SQL := c_stored;
+ dotView: Query.SQL := c_view;
+ else
+ end;
+ Query.Open;
+ while not Query.EOF do begin
+ if SameText(Query.fields[0].AsString, 'public') then
+ AList.Add(Trim(Query.Fields[1].AsString))
+ else
+ AList.Add(Trim(Query.Fields[0].AsString)+'.'+Trim(Query.Fields[1].AsString));
+ Query.Next;
+ end;
+ Query.Close;
+ finally
+ Query := nil;
+ end;
+end;
+
+procedure Postgres_DoGetForeignKeys(Query: IDADataset;ForeignKeys: TDADriverForeignKeyCollection);
+const
+ s_sql = 'select c.conname,s.seq,fn.nspname,f.relname,fa.attname,pn.nspname,p.relname,pa.attname '+
+ 'from pg_constraint c join pg_class p ON (c.conrelid = p.oid) join pg_namespace pn ON (p.relnamespace = pn.oid) '+
+ 'join pg_class f ON (c.confrelid = f.oid) join pg_namespace fn ON (f.relnamespace = fn.oid) '+
+ 'join (select s.seq from generate_series(0,100) as s(seq)) as s on ( s.seq BETWEEN array_lower(conkey,1) and array_upper(conkey,1)) '+
+ 'join pg_attribute pa ON ((c.conrelid = pa.attrelid) and (pa.attnum = c.conkey[s.seq])) '+
+ 'join pg_attribute fa ON ((c.confrelid = fa.attrelid) and (fa.attnum = c.confkey[s.seq])) '+
+ 'WHERE c.contype=''f'' ORDER by 1,3,4,2';
+var
+ lCurrConstraint: string;
+ lCurrFK: TDADriverForeignKey;
+begin
+ lCurrConstraint:='';
+ lCurrFK := nil;
+ ForeignKeys.Clear;
+ try
+ Query.SQL := s_sql;
+ Query.Open;
+ while not Query.Eof do begin
+ if lCurrConstraint <> Query.Fields[0].AsString then begin
+ lCurrConstraint := Query.Fields[0].AsString;
+ lCurrFK := ForeignKeys.Add();
+ with lCurrFK do begin
+ Name := Trim(Query.Fields[0].AsString);
+ if not SameText(Query.fields[2].AsString, 'public') then
+ PKTable := Format('%s.%s', [Trim(Query.Fields[2].AsString), Trim(Query.Fields[3].AsString)])
+ else
+ PKTable := Trim(Query.Fields[3].AsString);
+ if not SameText(Query.fields[5].AsString, 'public') then
+ FKTable := Format('%s.%s', [Trim(Query.fields[5].AsString), Trim(Query.fields[6].AsString)])
+ else
+ FKTable := Trim(Query.fields[6].AsString);
+ PKField := Trim(Query.Fields[4].AsString);
+ FKField := Trim(Query.Fields[7].AsString);
+ end
+ end
+ else
+ with lCurrFK do begin
+ PKField := PKField + ';' + TrimRight(Query.Fields[4].AsString);
+ FKField := FKField + ';' + TrimRight(Query.Fields[7].AsString);
+ end;
+ Query.Next;
+ end;
+ Query.Close;
+ finally
+ Query := nil;
+ end;
+end;
+
+function Postgres_GetSPSelectSyntax(HasArguments: Boolean): String;
+begin
+ if HasArguments then
+ Result := 'SELECT * FROM {0}({1})'
+ else
+ Result := 'SELECT * FROM {0}()';
+end;
+
+procedure Postgres_DoGetStoredProcedureParams(const aStoredProcedureName: string; Query: IDADataset; out Params: TDAParamCollection);
+const
+ s_sql= 'select ns.nspname as schema,p.proname as name, ' +
+ // '/* p.pronargs,p.proretset,p.prorettype,p.proargtypes,p.proallargtypes,p.proargmodes,p.proargnames,*/ ' +
+ 'COALESCE(s.seq,1) as paramnumber,ipt.typname as paramtype, ' +
+ 'COALESCE(p.proargmodes[s.seq], case when (p.pronargs < s.seq) then ''r'' else ''i'' end) as parammode, ' +
+ 'COALESCE(p.proargnames[s.seq], case when (p.proargmodes[s.seq] is null) and (p.pronargs < s.seq) then ''result'' else ''$''||s.seq end) as paramname '+
+ 'from pg_proc p '+
+ 'join pg_namespace ns on ((p.pronamespace = ns.oid)) '+ // and (ns.nspname not like ''pg_%'') and (ns.nspname <> ''information_schema'')) ' +
+ 'join (select s.seq from generate_series(0,100) as s(seq)) as s on (s.seq between COALESCE(array_lower(p.proallargtypes,1),1) and COALESCE(array_upper(p.proallargtypes,1),p.pronargs+1)) ' +
+ 'join pg_type ipt on (COALESCE(p.proargtypes[s.seq-1],p.proallargtypes[s.seq-1],prorettype) =ipt.oid) ';
+ s_where='where (ns.nspname = ''%s'') and (p.proname = ''%s'') ';
+ s_order='order by schema,name,paramnumber';
+var
+ schema, proc:string;
+ s: string;
+begin
+ Params := TDAParamCollection.Create(nil);
+ if Pos('.', aStoredProcedureName) > 0 then
+ begin
+ schema := Trim(Copy(aStoredProcedureName, 1, Pos('.', aStoredProcedureName) - 1));
+ proc := Trim(Copy(aStoredProcedureName, Pos('.', aStoredProcedureName) + 1, Length(aStoredProcedureName)));
+ end else
+ begin
+ schema := 'public';
+ proc := aStoredProcedureName;
+ end;
+ Query.SQL:= s_sql+ Format(s_where,[schema,proc])+s_order;
+ Query.Open;
+ while not Query.EOF do begin
+ With Params.Add do begin
+ s:= Query.Fields[4].AsString;
+ if s = 'r' then ParamType:=daptResult
+ else if s = 'o' then ParamType:=daptOutput
+ else if s = 'b' then ParamType:=daptInputOutput
+ else ParamType:=daptInput;
+ Name := Query.Fields[5].AsString;
+ DataType := PostgresDataTypeToDA(Query.Fields[3].AsString);
+ end;
+ Query.Next;
+ end;
+end;
+
+function Postgres_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+begin
+ Result:= (LowerCase(iIdentifier) <> iIdentifier) or TestIdentifier(iIdentifier, postgres_reservedwords);
+end;
+
+{ TDAEPostgresConnection }
+
+procedure TDAEPostgresConnection.DoGetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ inherited;
+ Postgres_DoGetForeignKeys(GetDatasetClass.Create(Self),ForeignKeys);
+end;
+
+function TDAEPostgresConnection.DoGetLastAutoInc(
+ const GeneratorName: string): integer;
+begin
+ Result := DoGetLastAutoIncValue(GeneratorName);
+end;
+
+function TDAEPostgresConnection.DoGetLastAutoIncValue(const GeneratorName: string): Variant;
+begin
+ Result := Postgres_DoGetLastAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+end;
+
+procedure TDAEPostgresConnection.DoGetStoredProcedureNames(
+ out List: IROStrings);
+begin
+ inherited;
+ Postgres_DoGetNames(GetDatasetClass.Create(Self),List,dotProcedure);
+end;
+
+procedure TDAEPostgresConnection.DoGetStoredProcedureParams(
+ const aStoredProcedureName: string; out Params: TDAParamCollection);
+begin
+ inherited;
+ exit;
+// Postgres_DoGetStoredProcedureParams(aStoredProcedureName, GetDatasetClass.Create(Self), Params);
+end;
+
+procedure TDAEPostgresConnection.DoGetTableFields(const aTableName: string;
+ out Fields: TDAFieldCollection);
+begin
+ Postgres_DoGetTableFields(aTableName, GetDatasetClass.Create(Self), Fields);
+end;
+
+procedure TDAEPostgresConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited;
+ Postgres_DoGetNames(GetDatasetClass.Create(Self),List,dotTable);
+end;
+
+procedure TDAEPostgresConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited;
+ Postgres_DoGetNames(GetDatasetClass.Create(Self), List, dotView);
+end;
+
+function TDAEPostgresConnection.GetDatabaseNames: IROStrings;
+begin
+ Result := Postgres_GetDatabaseNames(Self);
+end;
+
+function TDAEPostgresConnection.GetNextAutoinc(
+ const GeneratorName: string): integer;
+begin
+ Result := GetNextAutoinc2(GeneratorName);
+end;
+
+function TDAEPostgresConnection.GetNextAutoinc2(
+ const GeneratorName: string): variant;
+begin
+ Result := Postgres_GetNextAutoInc(GeneratorName, GetDatasetClass.Create(Self));
+end;
+
+function TDAEPostgresConnection.GetSPSelectSyntax(
+ HasArguments: Boolean): string;
+begin
+ Result:= Postgres_GetSPSelectSyntax(HasArguments);
+end;
+
+function TDAEPostgresConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result:= inherited IdentifierNeedsQuoting(iIdentifier) or Postgres_IdentifierNeedsQuoting(iIdentifier);
+end;
+
+{ TDAPostgresDriver }
+
+function TDAPostgresDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ Result := [doServerName, doDatabaseName, doLogin, doCustom];
+end;
+
+function TDAPostgresDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ Result:= PostgreSQL_DriverType;
+end;
+
+procedure postgres_InitializeReservedWords;
+begin
+ SetLength(postgres_reservedwords, 95);
+ // sorted with TStringList.Sort (bds2007)
+ postgres_reservedwords[0] := 'ALL';
+ postgres_reservedwords[1] := 'ANALYSE';
+ postgres_reservedwords[2] := 'ANALYZE';
+ postgres_reservedwords[3] := 'AND';
+ postgres_reservedwords[4] := 'ANY';
+ postgres_reservedwords[5] := 'ARRAY';
+ postgres_reservedwords[6] := 'AS';
+ postgres_reservedwords[7] := 'ASC';
+ postgres_reservedwords[8] := 'ASYMMETRIC';
+ postgres_reservedwords[9] := 'AUTHORIZATION';
+ postgres_reservedwords[10] := 'BETWEEN';
+ postgres_reservedwords[11] := 'BINARY';
+ postgres_reservedwords[12] := 'BOTH';
+ postgres_reservedwords[13] := 'CASE';
+ postgres_reservedwords[14] := 'CAST';
+ postgres_reservedwords[15] := 'CHECK';
+ postgres_reservedwords[16] := 'COLLATE';
+ postgres_reservedwords[17] := 'COLUMN';
+ postgres_reservedwords[18] := 'CONSTRAINT';
+ postgres_reservedwords[19] := 'CREATE';
+ postgres_reservedwords[20] := 'CROSS';
+ postgres_reservedwords[21] := 'CURRENT_DATE';
+ postgres_reservedwords[22] := 'CURRENT_ROLE';
+ postgres_reservedwords[23] := 'CURRENT_TIME';
+ postgres_reservedwords[24] := 'CURRENT_TIMESTAMP';
+ postgres_reservedwords[25] := 'CURRENT_USER';
+ postgres_reservedwords[26] := 'DEFAULT';
+ postgres_reservedwords[27] := 'DEFERRABLE';
+ postgres_reservedwords[28] := 'DESC';
+ postgres_reservedwords[29] := 'DISTINCT';
+ postgres_reservedwords[30] := 'DO';
+ postgres_reservedwords[31] := 'ELSE';
+ postgres_reservedwords[32] := 'END';
+ postgres_reservedwords[33] := 'EXCEPT';
+ postgres_reservedwords[34] := 'FALSE';
+ postgres_reservedwords[35] := 'FOR';
+ postgres_reservedwords[36] := 'FOREIGN';
+ postgres_reservedwords[37] := 'FREEZE';
+ postgres_reservedwords[38] := 'FROM';
+ postgres_reservedwords[39] := 'FULL';
+ postgres_reservedwords[40] := 'GRANT';
+ postgres_reservedwords[41] := 'GROUP';
+ postgres_reservedwords[42] := 'HAVING';
+ postgres_reservedwords[43] := 'ILIKE';
+ postgres_reservedwords[44] := 'IN';
+ postgres_reservedwords[45] := 'INITIALLY';
+ postgres_reservedwords[46] := 'INNER';
+ postgres_reservedwords[47] := 'INTERSECT';
+ postgres_reservedwords[48] := 'INTO';
+ postgres_reservedwords[49] := 'IS';
+ postgres_reservedwords[50] := 'ISNULL';
+ postgres_reservedwords[51] := 'JOIN';
+ postgres_reservedwords[52] := 'LEADING';
+ postgres_reservedwords[53] := 'LEFT';
+ postgres_reservedwords[54] := 'LIKE';
+ postgres_reservedwords[55] := 'LIMIT';
+ postgres_reservedwords[56] := 'LOCALTIME';
+ postgres_reservedwords[57] := 'LOCALTIMESTAMP';
+ postgres_reservedwords[58] := 'NATURAL';
+ postgres_reservedwords[59] := 'NEW';
+ postgres_reservedwords[60] := 'NOT';
+ postgres_reservedwords[61] := 'NOTNULL';
+ postgres_reservedwords[62] := 'NULL';
+ postgres_reservedwords[63] := 'OFF';
+ postgres_reservedwords[64] := 'OFFSET';
+ postgres_reservedwords[65] := 'OLD';
+ postgres_reservedwords[66] := 'ON';
+ postgres_reservedwords[67] := 'ONLY';
+ postgres_reservedwords[68] := 'OR';
+ postgres_reservedwords[69] := 'ORDER';
+ postgres_reservedwords[70] := 'OUTER';
+ postgres_reservedwords[71] := 'OVERLAPS';
+ postgres_reservedwords[72] := 'PLACING';
+ postgres_reservedwords[73] := 'PRIMARY';
+ postgres_reservedwords[74] := 'REFERENCES';
+ postgres_reservedwords[75] := 'RETURNING';
+ postgres_reservedwords[76] := 'RIGHT';
+ postgres_reservedwords[77] := 'SELECT';
+ postgres_reservedwords[78] := 'SESSION_USER';
+ postgres_reservedwords[79] := 'SIMILAR';
+ postgres_reservedwords[80] := 'SOME';
+ postgres_reservedwords[81] := 'SYMMETRIC';
+ postgres_reservedwords[82] := 'TABLE';
+ postgres_reservedwords[83] := 'THEN';
+ postgres_reservedwords[84] := 'TO';
+ postgres_reservedwords[85] := 'TRAILING';
+ postgres_reservedwords[86] := 'TRUE';
+ postgres_reservedwords[87] := 'UNION';
+ postgres_reservedwords[88] := 'UNIQUE';
+ postgres_reservedwords[89] := 'USER';
+ postgres_reservedwords[90] := 'USING';
+ postgres_reservedwords[91] := 'VERBOSE';
+ postgres_reservedwords[92] := 'WHEN';
+ postgres_reservedwords[93] := 'WHERE';
+ postgres_reservedwords[94] := 'WITH';
+end;
+
+initialization
+ postgres_InitializeReservedWords;
+finalization
+ postgres_reservedwords := nil;
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPoweredByDataAbstractButton.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPoweredByDataAbstractButton.lrs
new file mode 100644
index 0000000..988fce2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPoweredByDataAbstractButton.lrs
@@ -0,0 +1,2187 @@
+LazarusResources.Add('POWERED_BY_DATAABSTRACT_CLIENT','BMP',[
+ 'BMxw'#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#212#0#0#0'0'#0#0#0#1#0#24#0#0#0#0#0'Bw'#0
+ +#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'
+ +#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0'S'#18#0
+ +'S'#18#0'S'#18#0'S'#18#0'S'#18#0#0#0#0#0#0#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'
+ +#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'
+ +#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19'w'#159#129#255#255#255#238#243#239'U'#135'b'#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'
+ +#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'
+ +#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'
+ +#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'
+ +#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'
+ +#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'
+ +#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'
+ +#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'
+ +#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0
+ +'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0'K'#19#0#0#0#0#0#0#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ ,#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ +#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16'U'#140'`U'#140
+ +'`'#170#197#175#255#255#255'"i0'#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ +#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ +#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ +#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ +#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ +#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ +#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ +#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ +#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0
+ +'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'#16#0'R'
+ +#16#0'R'#16#0#0#0#0#0#0#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0
+ +'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0
+ +'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#17'] '#255#255#255'f'#151'p'#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0
+ +'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0
+ +'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0
+ +'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0
+ +'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0
+ +'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0
+ +'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0
+ +'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0
+ +'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'
+ +#16#0'Q'#16#0'Q'#16#0'Q'#16#0'Q'#16#0#0#0#0#0#0#0'P'#21'f'#150's'#255#255#255
+ +#0'P'#21#0'P'#21#0'P'#21#187#208#193#255#255#255'"g4'#0'P'#21#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#0'P'#21#187#208#193#204#220#208
+ +#0'P'#21#0'P'#21#0'P'#21#204#220#208'"g4'#0'P'#21#0'P'#21#170#197#177#255#255
+ +#255#0'P'#21#0'P'#21#0'P'#21#0'P'#21#136#173#146#221#232#224#255#255#255#255
+ +#255#255#204#220#208'D'#127'S'#0'P'#21#0'P'#21#0'P'#21#0'P'#21#255#255#255
+ +#255#255#255#255#255#255#204#220#208'3sD'#0'P'#21#0'P'#21#0'P'#21#255#255#255
+ +'w'#162#130#0'P'#21#0'P'#21#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#0'P'#21#0'P'#21#0'P'#21#0'P'#21#136#173#146#221#232#224#255#255
+ +#255#255#255#255#221#232#224'f'#150's'#0'P'#21#0'P'#21#0'P'#21#0'P'#21#255
+ +#255#255'f'#150's'#0'P'#21#0'P'#21#0'P'#21'3sD'#221#232#224#255#255#255#255
+ +#255#255#170#197#177#17'\%'#0'P'#21#0'P'#21#0'P'#21#0'P'#21#0'P'#21#0'P'#21
+ +#221#232#224#221#232#224#221#232#224#221#232#224#238#243#239#170#197#177'D'
+ +#127'S'#0'P'#21#0'P'#21#170#197#177#221#232#224#221#232#224#0'P'#21#0'P'#21#0
+ +'P'#21#0'P'#21#187#208#193#221#232#224#221#232#224'f'#150's'#0'P'#21#0'P'#21
+ +#221#232#224#221#232#224#221#232#224#0'P'#21#0'P'#21#170#197#177#221#232#224
+ +#221#232#224#0'P'#21#0'P'#21#0'P'#21#0'P'#21#187#208#193#221#232#224#221#232
+ +#224'f'#150's'#0'P'#21#0'P'#21#0'P'#21#170#197#177#221#232#224#221#232#224#0
+ +'P'#21#0'P'#21#0'P'#21#0'P'#21#187#208#193#221#232#224#221#232#224'f'#150's'
+ +#0'P'#21#221#232#224#221#232#224#221#232#224#221#232#224#238#243#239#187#208
+ +#193'D'#127'S'#0'P'#21#0'P'#21'f'#150's'#204#220#208#238#243#239#238#243#239
+ ,#187#208#193'D'#127'S'#0'P'#21#0'P'#21#0'P'#21#0'P'#21#0'P'#21#221#232#224
+ +#221#232#224#221#232#224#0'P'#21#0'P'#21#0'P'#21#0'P'#21#221#232#224#221#232
+ +#224#221#232#224#0'P'#21'"g4'#221#232#224#221#232#224#221#232#224#153#185#161
+ +#0'P'#21#170#197#177#221#232#224#221#232#224#0'P'#21#0'P'#21#0'P'#21#0'P'#21
+ +#187#208#193#221#232#224#221#232#224'f'#150's'#0'P'#21#0'P'#21'3sD'#170#197
+ +#177#221#232#224#221#232#224#221#232#224'w'#162#130#0'P'#21#0'P'#21#0'P'#21#0
+ +'P'#21#221#232#224#221#232#224#221#232#224#0'P'#21#0'P'#21#0'P'#21#0'P'#21#0
+ +'P'#21#0#0#0#0#0#0#0'O'#22'w'#161#131#255#255#255#0'O'#22#0'O'#22'f'#149's'
+ +#255#255#255'U'#138'd'#0'O'#22#0'O'#22#255#255#255#153#185#162'U'#138'dU'#138
+ +'dD~T'#0'O'#22#153#185#162#238#243#239#0'O'#22#0'O'#22'D~T'#255#255#255#153
+ +#185#162#0'O'#22#0'O'#22#187#208#193#204#220#208#0'O'#22#0'O'#22#17'[&'#204
+ +#220#208#238#243#239#136#173#146'U'#138'dU'#138'd'#187#208#193#255#255#255'w'
+ +#161#131#0'O'#22#0'O'#22#0'O'#22#255#255#255#136#173#146'D~T'#187#208#193#238
+ +#243#239#17'[&'#0'O'#22#0'O'#22#255#255#255'w'#161#131#0'O'#22#0'O'#22#255
+ +#255#255#153#185#162'U'#138'dU'#138'dD~T'#0'O'#22#0'O'#22#17'[&'#204#220#208
+ +#238#243#239#136#173#146'U'#138'dU'#138'd'#136#173#146#153#185#162#0'O'#22#0
+ +'O'#22#0'O'#22#0'O'#22#255#255#255'w'#161#131#0'O'#22#0'O'#22#0'O'#22'U'#138
+ +'d'#153#185#162'D~TD~T'#221#232#224#187#208#193#0'O'#22#0'O'#22#0'O'#22#0'O'
+ +#22#0'O'#22#0'O'#22#221#232#224#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255'f'#149's'#0'O'#22'D~T'#255#255#255#255#255#255
+ +#136#173#146'U'#138'dU'#138'df'#149's'#255#255#255#255#255#255#221#232#224#0
+ +'O'#22#0'O'#22#0'O'#22#221#232#224#255#255#255#221#232#224#0'O'#22#0'O'#22'D'
+ +'~T'#255#255#255#255#255#255#136#173#146'U'#138'dU'#138'df'#149's'#255#255
+ +#255#255#255#255#221#232#224#0'O'#22#0'O'#22#0'O'#22#0'O'#22'D~T'#255#255#255
+ +#255#255#255#136#173#146'U'#138'dU'#138'df'#149's'#255#255#255#255#255#255
+ +#221#232#224#0'O'#22#0'O'#22#221#232#224#255#255#255#255#255#255#221#232#224
+ +#255#255#255#255#255#255#255#255#255'f'#149's'#0'O'#22'w'#161#131#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255'U'#138'd'#0'O'#22#0'O'#22#0
+ +'O'#22#0'O'#22#221#232#224#255#255#255#221#232#224#0'O'#22#0'O'#22#0'O'#22#0
+ +'O'#22#221#232#224#255#255#255#221#232#224#0'O'#22#204#220#208#255#255#255
+ +#255#255#255#238#243#239#17'[&'#0'O'#22'D~T'#255#255#255#255#255#255#136#173
+ +#146'U'#138'dU'#138'df'#149's'#255#255#255#255#255#255#221#232#224#0'O'#22#0
+ +'O'#22'f'#149's'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#170#196#177#0'O'#22#0'O'#22#0'O'#22#0'O'#22#221#232#224#255#255#255#221#232
+ +#224#0'O'#22#0'O'#22#0'O'#22#0'O'#22#0'O'#22#0#0#0#0#0#0#0'M'#20'w'#160#130
+ +#255#255#255#0'M'#20'"e3'#238#243#239#153#184#161#0'M'#20#0'M'#20#0'M'#20#255
+ +#255#255'w'#160#130#0'M'#20#0'M'#20#0'M'#20#0'M'#20'f'#148'r'#255#255#255#0
+ +'M'#20#0'M'#20#187#208#192#204#219#208#255#255#255#17'Y$'#0'M'#20#204#219#208
+ +#170#196#177#0'M'#20#0'M'#20#187#208#192#221#231#224'"e3'#0'M'#20#0'M'#20#0
+ +'M'#20#0'M'#20'f'#148'r'#255#255#255'U'#136'b'#0'M'#20#0'M'#20#255#255#255'w'
+ +#160#130#0'M'#20'"e3'#255#255#255'f'#148'r'#0'M'#20#0'M'#20#255#255#255'w'
+ +#160#130#0'M'#20#0'M'#20#255#255#255'w'#160#130#0'M'#20#0'M'#20#0'M'#20#0'M'
+ +#20#0'M'#20#187#208#192#238#243#239'"e3'#0'M'#20#0'M'#20#0'M'#20#0'M'#20#0'M'
+ +#20#0'M'#20#0'M'#20#0'M'#20#0'M'#20#255#255#255'w'#160#130#0'M'#20#0'M'#20#0
+ +'M'#20#0'M'#20#0'M'#20#0'M'#20#0'M'#20#153#184#161#255#255#255#0'M'#20#0'M'
+ +#20#0'M'#20#0'M'#20#0'M'#20#0'M'#20#221#231#224#255#255#255#238#243#239'w'
+ +#160#130#153#184#161#255#255#255#255#255#255#255#255#255'D|S'#0'M'#20#187#208
+ +#192#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255'f'#148'r'#0'M'#20#0'M'#20#0'M'#20#221#231#224#255#255#255#221
+ +#231#224#0'M'#20#0'M'#20#0'M'#20#187#208#192#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255'f'#148'r'#0'M'#20#0'M'
+ +#20#0'M'#20#0'M'#20#0'M'#20#187#208#192#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255'f'#148'r'#0'M'#20#0'M'#20
+ +#221#231#224#255#255#255#221#231#224#0'M'#20'"e3'#255#255#255#255#255#255#221
+ +#231#224#0'M'#20'f'#148'r'#204#219#208'f'#148'rf'#148'r'#255#255#255#255#255
+ +#255#204#219#208#0'M'#20#0'M'#20#0'M'#20#0'M'#20#221#231#224#255#255#255#221
+ +#231#224#0'M'#20#0'M'#20#0'M'#20#0'M'#20#221#231#224#255#255#255#221#231#224
+ +'w'#160#130#255#255#255#255#255#255#255#255#255'U'#136'b'#0'M'#20#0'M'#20#0
+ +'M'#20#187#208#192#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255'f'#148'r'#0'M'#20'D|S'#255#255#255#255#255#255
+ +#255#255#255#187#208#192#136#172#145#187#208#192#170#196#177#0'M'#20#0'M'#20
+ +#0'M'#20#0'M'#20#221#231#224#255#255#255#221#231#224#0'M'#20#0'M'#20#0'M'#20
+ +#0'M'#20#0'M'#20#0#0#0#0#0#0#0'K'#26'w'#159#133#255#255#255#0'K'#26#187#207
+ +#194#221#231#224#0'K'#26#0'K'#26#0'K'#26#0'K'#26#255#255#255'w'#159#133#0'K'
+ ,#26#0'K'#26#0'K'#26#0'K'#26'D{W'#255#255#255'3oH"c9'#255#255#255'3oH'#187#207
+ +#194'w'#159#133#0'K'#26#238#243#240#153#183#163#0'K'#26'"c9'#255#255#255'f'
+ +#147'v'#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#187#207#194#204#219
+ +#209#0'K'#26#0'K'#26#255#255#255'w'#159#133#0'K'#26#17'W)'#255#255#255'f'#147
+ +'v'#0'K'#26#0'K'#26#255#255#255'w'#159#133#0'K'#26#0'K'#26#255#255#255'w'#159
+ +#133#0'K'#26#0'K'#26#0'K'#26#0'K'#26'"c9'#255#255#255'f'#147'v'#0'K'#26#0'K'
+ +#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#255#255
+ +#255'w'#159#133#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#204
+ +#219#209#238#243#240#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#221#231
+ +#224#255#255#255#221#231#224#0'K'#26#0'K'#26'f'#147'v'#255#255#255#255#255
+ +#255#170#195#179#0'K'#26'D{W'#255#255#255#255#255#255#238#243#240#238#243#240
+ +#255#255#255#255#255#255#221#231#224#0'K'#26#0'K'#26#0'K'#26#0'K'#26#221#231
+ +#224#255#255#255#221#231#224#0'K'#26#0'K'#26#0'K'#26'D{W'#255#255#255#255#255
+ +#255#238#243#240#238#243#240#255#255#255#255#255#255#221#231#224#0'K'#26#0'K'
+ +#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26'D{W'#255#255#255#255#255#255#238#243#240
+ +#238#243#240#255#255#255#255#255#255#221#231#224#0'K'#26#0'K'#26#0'K'#26#221
+ +#231#224#255#255#255#221#231#224#0'K'#26'3oH'#255#255#255#255#255#255#221#231
+ +#224#0'K'#26#17'W)'#0'K'#26#0'K'#26'w'#159#133#255#255#255#255#255#255#238
+ +#243#240#0'K'#26#0'K'#26#0'K'#26#0'K'#26#221#231#224#255#255#255#221#231#224
+ +#0'K'#26#0'K'#26#0'K'#26#0'K'#26#221#231#224#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#136#171#148#0'K'#26#0'K'#26#0'K'#26#0'K'#26'D{W'
+ +#255#255#255#255#255#255#238#243#240#238#243#240#255#255#255#255#255#255#221
+ +#231#224#0'K'#26#0'K'#26#170#195#179#255#255#255#255#255#255'w'#159#133#0'K'
+ +#26#0'K'#26#0'K'#26#17'W)'#0'K'#26#0'K'#26#0'K'#26#0'K'#26#221#231#224#255
+ +#255#255#221#231#224#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0'K'#26#0#0#0#0#0#0#0'L'
+ +#30'w'#160#135#255#255#255#255#255#255#255#255#255#187#207#195#17'X-'#0'L'#30
+ +#0'L'#30#0'L'#30#255#255#255#153#183#165'U'#136'iU'#136'i3pK'#0'L'#30'"d<'
+ +#255#255#255'D|Z'#153#183#165#187#207#195#0'L'#30'D|Z'#238#243#240#0'L'#30
+ +#255#255#255'w'#160#135#0'L'#30'f'#148'x'#255#255#255#17'X-'#0'L'#30#0'L'#30
+ +#0'L'#30#0'L'#30#0'L'#30#0'L'#30'w'#160#135#255#255#255#0'L'#30#0'L'#30#255
+ +#255#255'w'#160#135#17'X-'#153#183#165#238#243#240#17'X-'#0'L'#30#0'L'#30#255
+ +#255#255'w'#160#135#0'L'#30#0'L'#30#255#255#255#153#183#165'U'#136'iU'#136'i'
+ +'3pK'#0'L'#30'f'#148'x'#255#255#255#17'X-'#0'L'#30#0'L'#30#0'L'#30#0'L'#30#0
+ +'L'#30#0'L'#30#0'L'#30#0'L'#30#0'L'#30#0'L'#30#255#255#255'w'#160#135#0'L'#30
+ +#0'L'#30#0'L'#30#0'L'#30#0'L'#30'3pK'#221#231#225#255#255#255'U'#136'i'#0'L'
+ +#30#0'L'#30#0'L'#30#0'L'#30#0'L'#30#0'L'#30#221#231#225#255#255#255#221#231
+ +#225#0'L'#30#0'L'#30#17'X-'#238#243#240#255#255#255#221#231#225#0'L'#30#0'L'
+ +#30#204#219#210#255#255#255#153#183#165'f'#148'x'#255#255#255#255#255#255'f'
+ +#148'x'#0'L'#30#0'L'#30#0'L'#30#0'L'#30#221#231#225#255#255#255#221#231#225#0
+ +'L'#30#0'L'#30#0'L'#30#0'L'#30#204#219#210#255#255#255#153#183#165'f'#148'x'
+ +#255#255#255#255#255#255'f'#148'x'#0'L'#30#0'L'#30#0'L'#30#0'L'#30#0'L'#30#0
+ +'L'#30#0'L'#30#204#219#210#255#255#255#153#183#165'f'#148'x'#255#255#255#255
+ +#255#255'f'#148'x'#0'L'#30#0'L'#30#0'L'#30#221#231#225#255#255#255#255#255
+ +#255#221#231#225#255#255#255#255#255#255#255#255#255'U'#136'i'#0'L'#30#0'L'
+ +#30#0'L'#30#170#195#180#255#255#255#255#255#255#255#255#255#153#183#165#0'L'
+ +#30#0'L'#30#0'L'#30#0'L'#30#221#231#225#255#255#255#221#231#225#0'L'#30#0'L'
+ +#30#0'L'#30#0'L'#30#221#231#225#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#170#195#180#17'X-'#0'L'#30#0'L'#30#0'L'#30#0'L'#30#204#219
+ +#210#255#255#255#153#183#165'f'#148'x'#255#255#255#255#255#255'f'#148'x'#0'L'
+ +#30#0'L'#30#221#231#225#255#255#255#238#243#240#17'X-'#0'L'#30#0'L'#30#0'L'
+ +#30#0'L'#30#0'L'#30#0'L'#30#0'L'#30#0'L'#30#221#231#225#255#255#255#221#231
+ +#225#0'L'#30#0'L'#30#0'L'#30#0'L'#30#0'L'#30#0#0#0#0#0#0#0'W'#27'w'#165#133
+ +#255#255#255#0'W'#27'3yI'#221#233#225#170#199#179#0'W'#27#0'W'#27#0'W'#27#255
+ +#255#255#255#255#255#255#255#255#255#255#255#170#199#179#0'W'#27#0'W'#27#255
+ +#255#255'w'#165#133#255#255#255'D'#132'X'#0'W'#27#0'W'#27#204#221#209'f'#154
+ +'v'#255#255#255'U'#143'g'#0'W'#27'f'#154'v'#255#255#255#17'b*'#0'W'#27#0'W'
+ +#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27'w'#165#133#255#255#255#0'W'#27#0'W'#27
+ +#255#255#255#255#255#255#255#255#255#255#255#255'D'#132'X'#0'W'#27#0'W'#27#0
+ +'W'#27#255#255#255'w'#165#133#0'W'#27#0'W'#27#255#255#255#255#255#255#255#255
+ +#255#255#255#255#170#199#179#0'W'#27'f'#154'v'#255#255#255#17'b*'#0'W'#27#0
+ +'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#255
+ +#255#255'w'#165#133#0'W'#27#0'W'#27#0'W'#27#0'W'#27'D'#132'X'#255#255#255#238
+ +#244#240'D'#132'X'#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27
+ +#221#233#225#255#255#255#221#233#225#0'W'#27#0'W'#27#17'b*'#238#244#240#255
+ ,#255#255#238#244#240#0'W'#27#0'W'#27'U'#143'g'#255#255#255#238#244#240#221
+ +#233#225#255#255#255#221#233#225#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#221
+ +#233#225#255#255#255#221#233#225#0'W'#27#0'W'#27#0'W'#27#0'W'#27'U'#143'g'
+ +#255#255#255#238#244#240#221#233#225#255#255#255#221#233#225#0'W'#27#0'W'#27
+ +#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27'U'#143'g'#255#255#255#238
+ +#244#240#221#233#225#255#255#255#221#233#225#0'W'#27#0'W'#27#0'W'#27#0'W'#27
+ +#221#233#225#255#255#255#255#255#255#221#233#225#255#255#255#255#255#255#204
+ +#221#209#17'b*'#0'W'#27#0'W'#27#153#188#164#255#255#255#255#255#255#255#255
+ +#255#187#210#194#17'b*'#0'W'#27#0'W'#27#0'W'#27#0'W'#27#221#233#225#255#255
+ +#255#221#233#225#0'W'#27#0'W'#27#0'W'#27#0'W'#27#221#233#225#255#255#255#238
+ +#244#240'3yIf'#154'v'#255#255#255#255#255#255#170#199#179#0'W'#27#0'W'#27#0
+ +'W'#27#0'W'#27'U'#143'g'#255#255#255#238#244#240#221#233#225#255#255#255#221
+ +#233#225#0'W'#27#0'W'#27#0'W'#27#238#244#240#255#255#255#238#244#240#17'b*'#0
+ +'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#221#233#225
+ +#255#255#255#221#233#225#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0'W'#27#0#0#0#0#0#0
+ +#0'X'#25'w'#166#132#255#255#255#0'X'#25#0'X'#25'w'#166#132#255#255#255#0'X'
+ +#25#0'X'#25#0'X'#25#255#255#255'w'#166#132#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0
+ +'X'#25#221#233#224#255#255#255#204#222#209#0'X'#25#0'X'#25#0'X'#25'U'#144'f'
+ +#255#255#255#255#255#255'D'#133'V'#0'X'#25'"n8'#255#255#255'f'#155'u'#0'X'#25
+ +#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#187#210#194#204#222#209#0'X'#25#0'X'
+ +#25#255#255#255'w'#166#132#17'c('#187#210#194#187#210#194#0'X'#25#0'X'#25#0
+ +'X'#25#255#255#255'w'#166#132#0'X'#25#0'X'#25#255#255#255'w'#166#132#0'X'#25
+ +#0'X'#25#0'X'#25#0'X'#25'"n8'#255#255#255'f'#155'u'#0'X'#25#0'X'#25#0'X'#25#0
+ +'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#255#255#255'w'#166#132
+ +#0'X'#25#0'X'#25#0'X'#25#0'X'#25#221#233#224#204#222#209#17'c('#0'X'#25#0'X'
+ +#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#221#233#224#255#255#255
+ +#221#233#224#0'X'#25#0'X'#25'f'#155'u'#255#255#255#255#255#255#170#199#178#0
+ +'X'#25#0'X'#25#0'X'#25#204#222#209#255#255#255#255#255#255#255#255#255'f'#155
+ +'u'#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#221#233#224#255#255#255#221#233
+ +#224#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#204#222#209#255#255#255#255#255
+ +#255#255#255#255'f'#155'u'#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0
+ +'X'#25#0'X'#25#0'X'#25#204#222#209#255#255#255#255#255#255#255#255#255'f'#155
+ +'u'#0'X'#25#0'X'#25#0'X'#25#0'X'#25#221#233#224#255#255#255#221#233#224#0'X'
+ +#25'3yG'#255#255#255#255#255#255#170#199#178#0'X'#25#17'c('#255#255#255#255
+ +#255#255#255#255#255'w'#166#132#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'
+ +#25#221#233#224#255#255#255#221#233#224#0'X'#25#0'X'#25#0'X'#25#0'X'#25#221
+ +#233#224#255#255#255#221#233#224#0'X'#25#0'X'#25#238#244#240#255#255#255#238
+ +#244#240#0'X'#25#0'X'#25#0'X'#25#0'X'#25#0'X'#25#204#222#209#255#255#255#255
+ +#255#255#255#255#255'f'#155'u'#0'X'#25#0'X'#25#0'X'#25#187#210#194#255#255
+ +#255#255#255#255'w'#166#132#0'X'#25#0'X'#25#0'X'#25'"n8'#0'X'#25#0'X'#25#0'X'
+ +#25#0'X'#25#221#233#224#255#255#255#221#233#224#0'X'#25#0'X'#25#0'X'#25#0'X'
+ +#25#0'X'#25#0#0#0#0#0#0#0'U'#22'w'#164#131#255#255#255#0'U'#22#0'U'#22#136
+ +#176#146#255#255#255#0'U'#22#0'U'#22#0'U'#22#255#255#255'w'#164#131#0'U'#22#0
+ +'U'#22#0'U'#22#0'U'#22#0'U'#22#187#210#193#255#255#255'U'#142'd'#0'U'#22#0'U'
+ +#22#0'U'#22#0'U'#22#221#232#224#255#255#255'3wE'#0'U'#22#0'U'#22#187#210#193
+ +#221#232#224'"l5'#0'U'#22#0'U'#22#0'U'#22#0'U'#22'f'#153's'#255#255#255'U'
+ +#142'd'#0'U'#22#0'U'#22#255#255#255'w'#164#131#0'U'#22'w'#164#131#255#255#255
+ +#0'U'#22#0'U'#22#0'U'#22#255#255#255'w'#164#131#0'U'#22#0'U'#22#255#255#255
+ +'w'#164#131#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#187#210#193#238#244#239
+ +'"l5'#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22
+ +#255#255#255'w'#164#131#0'U'#22#0'U'#22#0'U'#22#0'U'#22#255#255#255'w'#164
+ +#131#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22
+ +#221#232#224#255#255#255#238#244#239'w'#164#131#153#187#162#255#255#255#255
+ +#255#255#255#255#255'D'#130'T'#0'U'#22#0'U'#22#0'U'#22'U'#142'd'#255#255#255
+ +#255#255#255#221#232#224#0'U'#22#0'U'#22#0'U'#22'f'#153'sw'#164#131'w'#164
+ +#131#238#244#239#255#255#255#238#244#239'w'#164#131'w'#164#131'f'#153's'#0'U'
+ +#22#0'U'#22'U'#142'd'#255#255#255#255#255#255#221#232#224#0'U'#22#0'U'#22#0
+ +'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22'U'#142'd'#255
+ +#255#255#255#255#255#221#232#224#0'U'#22#0'U'#22#0'U'#22#0'U'#22#0'U'#22#221
+ +#232#224#255#255#255#221#232#224#0'U'#22'3wE'#255#255#255#255#255#255#204#221
+ +#208#0'U'#22#0'U'#22#238#244#239#255#255#255#255#255#255'U'#142'dw'#164#131
+ +'w'#164#131#0'U'#22'f'#153'sw'#164#131'w'#164#131#238#244#239#255#255#255#238
+ +#244#239'w'#164#131'w'#164#131'f'#153's'#0'U'#22#221#232#224#255#255#255#238
+ +#244#239'U'#142'd'#153#187#162#255#255#255#255#255#255#204#221#208#0'U'#22#0
+ ,'U'#22#0'U'#22#0'U'#22#0'U'#22'U'#142'd'#255#255#255#255#255#255#221#232#224
+ +#0'U'#22#0'U'#22#0'U'#22#0'U'#22'D'#130'T'#255#255#255#255#255#255#255#255
+ +#255#187#210#193#136#176#146#187#210#193#136#176#146#0'U'#22'f'#153'sw'#164
+ +#131'w'#164#131#238#244#239#255#255#255#238#244#239'w'#164#131'w'#164#131'f'
+ +#153's'#0'U'#22#0'U'#22#0#0#0#0#0#0#0'X'#15'w'#166#127#255#255#255'D'#133'Of'
+ +#155'o'#238#244#239#170#199#175#0'X'#15#0'X'#15#0'X'#15#255#255#255#153#188
+ +#159'U'#144'_U'#144'_D'#133'O'#0'X'#15#0'X'#15#153#188#159#221#233#223#0'X'
+ +#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15'w'#166#127#255#255#255#0'X'#15#0'X'#15#0
+ +'X'#15#17'c'#31#204#222#207#238#244#239#136#177#143'U'#144'_U'#144'_'#187#210
+ +#191#255#255#255'w'#166#127#0'X'#15#0'X'#15#0'X'#15#255#255#255#136#177#143
+ +'D'#133'O'#221#233#223#204#222#207#0'X'#15#0'X'#15#0'X'#15#255#255#255'w'#166
+ +#127#0'X'#15#0'X'#15#255#255#255#153#188#159'U'#144'_U'#144'_D'#133'O'#0'X'
+ +#15#0'X'#15#17'c'#31#204#222#207#238#244#239#153#188#159'U'#144'_U'#144'_'
+ +#153#188#159#136#177#143#17'c'#31'U'#144'_U'#144'_U'#144'_'#255#255#255#153
+ +#188#159'U'#144'_U'#144'_3y?'#0'X'#15#204#222#207#204#222#207'D'#133'OD'#133
+ +'O'#153#188#159#0'X'#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15#221#233#223
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255'f'
+ +#155'o'#0'X'#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15#221#233#223#255#255#255'f'
+ +#155'o'#0'X'#15#0'X'#15#0'X'#15#204#222#207#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#204#222#207#0'X'#15#0'X'
+ +#15#0'X'#15#221#233#223#255#255#255'f'#155'o'#0'X'#15#0'X'#15#0'X'#15#0'X'#15
+ +#0'X'#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15#221#233#223#255#255
+ +#255'f'#155'o'#0'X'#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15#221#233#223#255#255
+ +#255#255#255#255#221#233#223#255#255#255#255#255#255#255#255#255'w'#166#127#0
+ +'X'#15#0'X'#15#136#177#143#255#255#255#255#255#255#255#255#255#255#255#255
+ +#136#177#143#0'X'#15#204#222#207#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#204#222#207#0'X'#15#221#233#223#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255'U'#144
+ +'_'#0'X'#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15#221#233#223#255#255#255
+ +'f'#155'o'#0'X'#15#0'X'#15#0'X'#15#0'X'#15#0'X'#15'f'#155'o'#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#136#177#143#0'X'#15#204#222#207
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#204#222#207#0'X'#15#0'X'#15#0#0#0#0#0#0#0'['#15'f'#157'o'#255#255
+ +#255#255#255#255#238#244#239#153#189#159#0'['#15#0'['#15#0'['#15#0'['#15#255
+ +#255#255#255#255#255#255#255#255#255#255#255#238#244#239#0'['#15#0'['#15'w'
+ +#168#127'w'#168#127#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#221#233
+ +#223#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#136#178#143#221#233#223#255#255
+ +#255#255#255#255#204#222#207'D'#135'O'#0'['#15#0'['#15#0'['#15#0'['#15#255
+ +#255#255#255#255#255#255#255#255#204#222#207'"q/'#0'['#15#0'['#15#0'['#15#255
+ +#255#255'f'#157'o'#0'['#15#0'['#15#255#255#255#255#255#255#255#255#255#255
+ +#255#255#238#244#239#0'['#15#0'['#15#0'['#15#0'['#15'w'#168#127#221#233#223
+ +#255#255#255#255#255#255#221#233#223'U'#146'_f'#157'o'#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#204#222#207
+ +#0'['#15'"q/'#187#211#191#255#255#255#255#255#255#204#222#207#0'['#15#0'['#15
+ +#0'['#15#0'['#15#0'['#15#0'['#15#221#233#223#221#233#223#221#233#223#221#233
+ +#223#238#244#239#170#200#175'D'#135'O'#0'['#15#0'['#15#0'['#15#0'['#15#0'['
+ +#15#0'['#15'U'#146'_'#204#222#207#0'['#15#0'['#15#0'['#15#0'['#15#187#211#191
+ +#221#233#223#221#233#223#221#233#223#221#233#223#221#233#223#221#233#223#221
+ +#233#223#187#211#191#0'['#15#0'['#15#0'['#15'U'#146'_'#204#222#207#0'['#15#0
+ +'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0'['
+ +#15#0'['#15'U'#146'_'#204#222#207#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0
+ +'['#15#221#233#223#221#233#223#221#233#223#221#233#223#221#233#223#187#211
+ +#191'w'#168#127#0'['#15#0'['#15#0'['#15#0'['#15'w'#168#127#204#222#207#221
+ +#233#223#221#233#223'w'#168#127#0'['#15#187#211#191#221#233#223#221#233#223
+ +#221#233#223#221#233#223#221#233#223#221#233#223#221#233#223#187#211#191#0'['
+ +#15#221#233#223#221#233#223#221#233#223#221#233#223#221#233#223#170#200#175
+ +'D'#135'O'#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15'U'#146'_'
+ +#204#222#207#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15#0'['#15'3|?'#170
+ +#200#175#221#233#223#221#233#223#221#233#223'w'#168#127#0'['#15#187#211#191
+ +#221#233#223#221#233#223#221#233#223#221#233#223#221#233#223#221#233#223#221
+ +#233#223#187#211#191#0'['#15#0'['#15#0#0#0#0#0#0#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ +'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ ,'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ +'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ +'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ +'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ +'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ +'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ +'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ +'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ +'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'
+ +#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0
+ +'d'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0'd'#14#0#0#0#0#0#0#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'
+ +#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0'b'#12#0
+ +#0#0#0#0#0#0'^'#9'"s*'#255#255#255#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9
+ +#0'^'#9'D'#137'K'#221#234#222#255#255#255#255#255#255#221#234#222'D'#137'K'#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9'"s*'#221#234#222#0'^'#9#17'i'#25#221
+ +#234#222#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#255#255#255#255#255#255
+ +#255#255#255#187#212#189#0'^'#9#0'^'#9#0'^'#9'"s*'#255#255#255#0'^'#9#0'^'#9
+ +#187#212#189#221#234#222#0'^'#9#0'^'#9#0'^'#9#255#255#255#255#255#255#255#255
+ +#255#187#212#189#0'^'#9#0'^'#9#0'^'#9'"s*'#255#255#255#255#255#255#255#255
+ +#255'w'#169'|'#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9
+ +#0'^'#9'"s*'#255#255#255#255#255#255#255#255#255'D'#137'K'#0'^'#9#0'^'#9#0'^'
+ +#9#0'^'#9'"s*'#255#255#255#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0'^'#9#0
+ +#0#0#0#0#0#0'g'#4'"{%'#255#255#255#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4
+ +'D'#144'G'#255#255#255'w'#174'y'#0'g'#4#0'g'#4'w'#174'y'#255#255#255'D'#144
+ ,'G'#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#153#194#155#255#255#255'D'#144'G'#136
+ +#184#138#255#255#255'D'#144'G'#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#255#255#255
+ +'"{%'#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4'"{%'#255#255#255#0'g'#4'w'#174'y'
+ +#255#255#255#17'q'#21#0'g'#4#0'g'#4#0'g'#4#255#255#255'"{%'#0'g'#4#0'g'#4#0
+ +'g'#4#0'g'#4#0'g'#4'"{%'#255#255#255#0'g'#4'"{%'#221#235#222#136#184#138#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4'"{%'#255#255#255#0
+ +'g'#4'w'#174'y'#255#255#255#0'g'#4#0'g'#4#0'g'#4#0'g'#4'"{%'#255#255#255#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'
+ +#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0'g'#4#0#0#0#0#0#0#0#127#2'"'#144'$'
+ +#255#255#255#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#238#246#238'w'
+ +#187'x'#0#127#2#0#127#2#0#127#2#0#127#2'w'#187'x'#221#238#221#0#127#2#0#127#2
+ +#0#127#2#0#127#2#0#127#2#255#255#255#136#195#137#221#238#221#255#255#255#153
+ +#204#154#204#229#204#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#255#255#255'"'
+ +#144'$'#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2'"'#144'$'#255#255#255'"'#144
+ +'$'#255#255#255'D'#161'E'#0#127#2#0#127#2#0#127#2#0#127#2#255#255#255'"'#144
+ +'$'#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2'"'#144'$'#255#255#255#0#127#2#0
+ +#127#2'D'#161'E'#255#255#255#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2
+ +#0#127#2#0#127#2#0#127#2'"'#144'$'#255#255#255#0#127#2'U'#170'V'#255#255#255
+ +#0#127#2#0#127#2#0#127#2#0#127#2'"'#144'$'#255#255#255#0#127#2#0#127#2#0#127
+ +#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0
+ +#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127
+ +#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0
+ +#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127
+ +#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0
+ +#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127
+ +#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0
+ +#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127
+ +#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0
+ +#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127
+ +#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0
+ +#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127
+ +#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0#127#2#0
+ +#127#2#0#127#2#0#0#0#0#0#0#0#138#2'"'#154'$'#255#255#255#255#255#255#255#255
+ +#255'U'#177'V'#0#138#2#0#138#2#0#138#2#255#255#255'"'#154'$'#0#138#2#0#138#2
+ +#0#138#2#0#138#2'"'#154'$'#255#255#255#0#138#2#0#138#2#0#138#2#0#138#2#136
+ +#200#137#187#224#188#0#138#2#255#255#255#187#224#188#0#138#2#255#255#255'3'
+ +#161'5'#0#138#2#0#138#2#0#138#2#0#138#2#255#255#255#255#255#255#255#255#255
+ +#153#208#154#0#138#2#0#138#2#0#138#2'"'#154'$'#255#255#255#255#255#255#255
+ +#255#255'U'#177'V'#0#138#2#0#138#2#0#138#2#0#138#2#255#255#255#255#255#255
+ +#255#255#255#153#208#154#0#138#2#0#138#2#0#138#2'"'#154'$'#255#255#255#0#138
+ +#2#0#138#2#0#138#2#255#255#255#17#146#19#0#138#2#0#138#2#0#138#2#0#138#2#0
+ +#138#2#0#138#2#0#138#2#0#138#2'"'#154'$'#255#255#255#255#255#255#255#255#255
+ +'U'#177'V'#0#138#2#0#138#2#0#138#2#0#138#2'w'#193'x'#255#255#255'3'#161'5'#0
+ +#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138
+ +#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0
+ +#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138
+ +#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0
+ +#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138
+ +#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0
+ +#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138
+ +#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0
+ +#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138
+ +#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0
+ +#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138
+ ,#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0
+ +#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138#2#0#138
+ +#2#0#138#2#0#138#2#0#138#2#0#0#0#0#0#0#0'{'#3'"'#141'%'#255#255#255#0'{'#3'f'
+ +#176'h'#255#255#255#0'{'#3#0'{'#3#0'{'#3#238#246#238'w'#185'y'#0'{'#3#0'{'#3
+ +#0'{'#3#0'{'#3'w'#185'y'#238#246#238#0'{'#3#0'{'#3#0'{'#3#0'{'#3#255#255#255
+ +'D'#158'F'#0'{'#3#255#255#255#187#220#188#0'{'#3#136#193#137#187#220#188#0'{'
+ +#3#0'{'#3#0'{'#3#0'{'#3#255#255#255'"'#141'%'#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3'"'#141'%'#255#255#255#0'{'#3'U'#167'W'#255#255#255#0'{'#3#0'{'#3#0'{'#3
+ +#0'{'#3#255#255#255'"'#141'%'#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3'"'#141'%'
+ +#255#255#255#0'{'#3#0'{'#3'D'#158'F'#255#255#255#0'{'#3#0'{'#3#0'{'#3#0'{'#3
+ +#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3'"'#141'%'#255#255#255'"'#141'%'#255#255
+ +#255#0'{'#3#0'{'#3#0'{'#3#0'{'#3'"'#141'%'#255#255#255#187#220#188#204#229
+ +#205#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0
+ +'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0'{'#3#0#0#0#0#0#0#0'}'#4'"'#142'%'
+ +#255#255#255#0'}'#4'f'#177'h'#255#255#255#0'}'#4#0'}'#4#0'}'#4'D'#160'G'#255
+ +#255#255'w'#186'y'#0'}'#4#0'}'#4'w'#186'y'#255#255#255'D'#160'G'#0'}'#4#0'}'
+ +#4#0'}'#4'w'#186'y'#221#238#222#0'}'#4'w'#186'y'#221#238#222#255#255#255'"'
+ +#142'%'#0'}'#4#255#255#255'"'#142'%'#0'}'#4#0'}'#4#0'}'#4#255#255#255'"'#142
+ +'%'#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4'"'#142'%'#255#255#255#0'}'#4'w'#186'y'
+ +#255#255#255#0'}'#4#0'}'#4#0'}'#4#0'}'#4#255#255#255'"'#142'%'#0'}'#4#0'}'#4
+ +#0'}'#4#0'}'#4#0'}'#4'"'#142'%'#255#255#255#0'}'#4'"'#142'%'#221#238#222#136
+ +#194#138#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4'"'
+ +#142'%'#255#255#255#0'}'#4#255#255#255#17#134#21#0'}'#4#0'}'#4#0'}'#4#187#220
+ +#188#153#203#155#0'}'#4#204#229#205#136#194#138#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0'}'#4#0
+ +'}'#4#0#0#0#0#0#0#0'w'#4'"'#137'%'#255#255#255#255#255#255#238#246#238'U'#164
+ +'X'#0'w'#4#0'w'#4#0'w'#4#0'w'#4'D'#155'G'#221#237#222#255#255#255#255#255#255
+ +#221#237#222'D'#155'G'#0'w'#4#0'w'#4#0'w'#4#0'w'#4#255#255#255'f'#173'h'#0'w'
+ +#4#255#255#255'f'#173'h'#153#201#155#187#219#188#0'w'#4#170#210#171#187#219
+ +#188#0'w'#4#0'w'#4#0'w'#4#255#255#255#255#255#255#255#255#255#187#219#188#0
+ +'w'#4#0'w'#4#0'w'#4'"'#137'%'#255#255#255#255#255#255#238#246#238'D'#155'G'#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#255#255#255#255#255#255#255#255#255#187#219#188#0
+ +'w'#4#0'w'#4#0'w'#4'"'#137'%'#255#255#255#255#255#255#255#255#255#136#192#138
+ +#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4'"'#137
+ +'%'#255#255#255#255#255#255#170#210#171#0'w'#4#0'w'#4#0'w'#4'w'#182'y'#255
+ +#255#255#0'w'#4#0'w'#4'3'#146'6'#255#255#255'D'#155'G'#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ ,'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0'w'#4#0
+ +'w'#4#0#0#0#0#0#0#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0'n'#5#0
+ +'n'#5#0'n'#5#0'n'#5#0'n'#5#0#0#0#0#0#0#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0
+ +'t'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0't'#6#0#0#0#0#0#0#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0
+ +'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0'w'#5#0#0#0#0
+ +#0#0#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3
+ +#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133
+ ,#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133
+ +#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133
+ +#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133
+ +#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133
+ +#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133
+ +#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133
+ +#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133
+ +#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133
+ +#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133
+ +#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0#133#3#0
+ +#133#3#0#133#3#0#0#0#0#0#0#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0
+ +#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138#8#0#138
+ +#8#0#138#8#0#138#8#0#138#8#0#138#8#0#0#0#0#0#0#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ ,#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153
+ +#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0#153#14#0
+ +#153#14#0#153#14#0#153#14#0#0#0#0#0#0#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183
+ +#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0#183#13#0
+ +#183#13#0#183#13#0#0#0#0#0#0#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168
+ +#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0#168#12#0
+ +#168#12#0#0#0#0#0#0#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ ,#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188
+ +#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0#188#14#0
+ +#0#0#0#0#0#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0
+ +#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203
+ +#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#203#16#0#0#0#0#0
+ +#0#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0
+ +#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221
+ +#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#221#24#0#0#0#0#0#0#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ ,#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0
+ +#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229
+ +#31#0#229#31#0#229#31#0#229#31#0#229#31#0#229#31#0#0#0#0#0#0#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0
+ +#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215' '#0#215
+ +' '#0#215' '#0#215' '#0#215' '#0#215' '#0#0#0#0#0#0#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ ,#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0
+ +#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201'#'#0#201
+ +'#'#0#201'#'#0#201'#'#0#201'#'#0#0#0#0#0#0#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0
+ +#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168'"'#0#168
+ +'"'#0#168'"'#0#168'"'#0#0#0#0#0#0#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0
+ +#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150'+'#0#150
+ +'+'#0#150'+'#0#0#0#0#0#0#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n'
+ +'$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0
+ +'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'
+ +#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n'
+ +'$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0
+ ,'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'
+ +#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n'
+ +'$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0
+ +'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'
+ +#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n'
+ +'$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0
+ +'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'
+ +#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n'
+ +'$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0
+ +'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'
+ +#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n'
+ +'$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0'n$'#0#0#0#0
+ +#0#0#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27
+ +#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0
+ +'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0
+ +'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0
+ +'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0
+ +'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0
+ +'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0
+ +'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0
+ +'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0
+ +'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0
+ +'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0
+ +'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'#27#0'p'
+ +#27#0'p'#27#0#0#0#0#0#0#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30
+ +#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0
+ +#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158#30#0#158
+ +#30#0#0#0#0#0#0#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ ,#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136
+ +#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0
+ +#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#136#25#0#0#0
+ +#0#0#0#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g'
+ +'%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0
+ +'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'
+ +#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g'
+ +'%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0
+ +'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'
+ +#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g'
+ +'%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0
+ +'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'
+ +#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g'
+ +'%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0
+ +'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'
+ +#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g'
+ +'%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0
+ +'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'
+ +#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g'
+ +'%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0'g%'#0#0#0#0#0#0#0'N!'#0'N!'#0
+ +'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'
+ +#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N'
+ +'!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0
+ +'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'
+ +#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N'
+ +'!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0
+ +'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'
+ +#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N'
+ +'!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0
+ +'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'
+ +#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N'
+ +'!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0
+ +'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'
+ +#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N'
+ +'!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0
+ +'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'
+ +#0'N!'#0'N!'#0'N!'#0'N!'#0'N!'#0#0#0#0#0#0#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ +'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ +'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ +'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ +'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ +'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ ,'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ +'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ +'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ +'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ +'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0
+ +'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'
+ +#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0'T'#29#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+]);
+LazarusResources.Add('POWERED_BY_DATAABSTRACT_SERVER','BMP',[
+ 'BMxw'#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#212#0#0#0'0'#0#0#0#1#0#24#0#0#0#0#0'Bw'#0
+ +#0#18#11#0#0#18#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#2
+ +'G'#0#2'G'#0#2'G'#0#2'G'#0#2'G'#0#0#0#0#0#0#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2
+ +'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2
+ +'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2
+ +'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2
+ +'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'Hwx'#157#255#255#255
+ +#238#238#243'UV'#133#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'
+ +#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#2'H'#0#0#0#0#0#0#0
+ +#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0
+ +#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0
+ +#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0
+ +#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0
+ +#4'M'#0#4'MUX'#136'UX'#136#170#171#196#255#255#255'"%e'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ ,#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'#0#4'M'
+ +#0#4'M'#0#4'M'#0#0#0#0#0#0#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0
+ +#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0
+ +#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0
+ +#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0
+ +#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#17#25'Z'#255#255#255
+ +'fk'#149#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9
+ +'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#9'N'#0#0#0#0#0#0#0#9'Bfk'#142#255
+ +#255#255#0#9'B'#0#9'B'#0#9'B'#187#189#205#255#255#255'"*['#0#9'B'#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#0#9'B'#187#189#205#204#206
+ +#217#0#9'B'#0#9'B'#0#9'B'#204#206#217'"*['#0#9'B'#0#9'B'#170#173#192#255#255
+ +#255#0#9'B'#0#9'B'#0#9'B'#0#9'B'#136#140#167#221#222#230#255#255#255#255#255
+ +#255#204#206#217'DKt'#0#9'B'#0#9'B'#0#9'B'#0#9'B'#255#255#255#255#255#255#255
+ +#255#255#204#206#217'3:h'#0#9'B'#0#9'B'#0#9'B'#255#255#255'w|'#154#0#9'B'#0#9
+ +'B'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#9'B'#0#9'B'
+ +#0#9'B'#0#9'B'#136#140#167#221#222#230#255#255#255#255#255#255#221#222#230'f'
+ +'k'#142#0#9'B'#0#9'B'#0#9'B'#0#9'B'#255#255#255'fk'#142#0#9'B'#0#9'B'#0#9'B3'
+ +':h'#221#222#230#255#255#255#255#255#255#170#173#192#17#25'O'#0#9'B'#0#9'B'#0
+ +#9'B'#0#9'B'#0#9'B'#0#9'B'#221#222#230#221#222#230#221#222#230#221#222#230
+ +#238#239#242#170#173#192'DKt'#0#9'B'#0#9'B'#170#173#192#221#222#230#221#222
+ +#230#0#9'B'#0#9'B'#0#9'B'#0#9'B'#187#189#205#221#222#230#221#222#230'fk'#142
+ +#0#9'B'#0#9'B'#221#222#230#221#222#230#221#222#230#0#9'B'#0#9'B'#170#173#192
+ +#221#222#230#221#222#230#0#9'B'#0#9'B'#0#9'B'#0#9'B'#187#189#205#221#222#230
+ +#221#222#230'fk'#142#0#9'B'#0#9'B'#0#9'B'#170#173#192#221#222#230#221#222#230
+ +#0#9'B'#0#9'B'#0#9'B'#0#9'B'#187#189#205#221#222#230#221#222#230'fk'#142#0#9
+ +'B'#221#222#230#221#222#230#221#222#230#221#222#230#238#239#242#187#189#205
+ +'DKt'#0#9'B'#0#9'Bfk'#142#204#206#217#238#239#242#238#239#242#187#189#205'DK'
+ +'t'#0#9'B'#0#9'B'#0#9'B'#0#9'B'#0#9'B'#221#222#230#221#222#230#221#222#230#0
+ +#9'B'#0#9'B'#0#9'B'#0#9'B'#221#222#230#221#222#230#221#222#230#0#9'B"*['#221
+ +#222#230#221#222#230#221#222#230#153#157#179#0#9'B'#170#173#192#221#222#230
+ +#221#222#230#0#9'B'#0#9'B'#0#9'B'#0#9'B'#187#189#205#221#222#230#221#222#230
+ +'fk'#142#0#9'B'#0#9'B3:h'#170#173#192#221#222#230#221#222#230#221#222#230'w|'
+ +#154#0#9'B'#0#9'B'#0#9'B'#0#9'B'#221#222#230#221#222#230#221#222#230#0#9'B'#0
+ +#9'B'#0#9'B'#0#9'B'#0#9'B'#0#0#0#0#0#0#0#12'Lw}'#160#255#255#255#0#12'L'#0#12
+ +'Lfm'#148#255#255#255'U]'#136#0#12'L'#0#12'L'#255#255#255#153#158#183'U]'#136
+ +'U]'#136'DM|'#0#12'L'#153#158#183#238#239#243#0#12'L'#0#12'LDM|'#255#255#255
+ +#153#158#183#0#12'L'#0#12'L'#187#190#207#204#206#219#0#12'L'#0#12'L'#17#28'X'
+ +#204#206#219#238#239#243#136#142#171'U]'#136'U]'#136#187#190#207#255#255#255
+ +'w}'#160#0#12'L'#0#12'L'#0#12'L'#255#255#255#136#142#171'DM|'#187#190#207#238
+ +#239#243#17#28'X'#0#12'L'#0#12'L'#255#255#255'w}'#160#0#12'L'#0#12'L'#255#255
+ ,#255#153#158#183'U]'#136'U]'#136'DM|'#0#12'L'#0#12'L'#17#28'X'#204#206#219
+ +#238#239#243#136#142#171'U]'#136'U]'#136#136#142#171#153#158#183#0#12'L'#0#12
+ +'L'#0#12'L'#0#12'L'#255#255#255'w}'#160#0#12'L'#0#12'L'#0#12'LU]'#136#153#158
+ +#183'DM|DM|'#221#223#231#187#190#207#0#12'L'#0#12'L'#0#12'L'#0#12'L'#0#12'L'
+ +#0#12'L'#221#223#231#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255'fm'#148#0#12'LDM|'#255#255#255#255#255#255#136#142#171'U]'
+ +#136'U]'#136'fm'#148#255#255#255#255#255#255#221#223#231#0#12'L'#0#12'L'#0#12
+ +'L'#221#223#231#255#255#255#221#223#231#0#12'L'#0#12'LDM|'#255#255#255#255
+ +#255#255#136#142#171'U]'#136'U]'#136'fm'#148#255#255#255#255#255#255#221#223
+ +#231#0#12'L'#0#12'L'#0#12'L'#0#12'LDM|'#255#255#255#255#255#255#136#142#171
+ +'U]'#136'U]'#136'fm'#148#255#255#255#255#255#255#221#223#231#0#12'L'#0#12'L'
+ +#221#223#231#255#255#255#255#255#255#221#223#231#255#255#255#255#255#255#255
+ +#255#255'fm'#148#0#12'Lw}'#160#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255'U]'#136#0#12'L'#0#12'L'#0#12'L'#0#12'L'#221#223#231#255#255
+ +#255#221#223#231#0#12'L'#0#12'L'#0#12'L'#0#12'L'#221#223#231#255#255#255#221
+ +#223#231#0#12'L'#204#206#219#255#255#255#255#255#255#238#239#243#17#28'X'#0
+ +#12'LDM|'#255#255#255#255#255#255#136#142#171'U]'#136'U]'#136'fm'#148#255#255
+ +#255#255#255#255#221#223#231#0#12'L'#0#12'Lfm'#148#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#170#174#195#0#12'L'#0#12'L'#0#12'L'#0#12
+ +'L'#221#223#231#255#255#255#221#223#231#0#12'L'#0#12'L'#0#12'L'#0#12'L'#0#12
+ +'L'#0#0#0#0#0#0#0#24'Nw'#132#161#255#255#255#0#24'N"7f'#238#240#243#153#163
+ +#184#0#24'N'#0#24'N'#0#24'N'#255#255#255'w'#132#161#0#24'N'#0#24'N'#0#24'N'#0
+ +#24'Nft'#149#255#255#255#0#24'N'#0#24'N'#187#193#208#204#209#220#255#255#255
+ +#17'''Z'#0#24'N'#204#209#220#170#178#196#0#24'N'#0#24'N'#187#193#208#221#224
+ +#231'"7f'#0#24'N'#0#24'N'#0#24'N'#0#24'Nft'#149#255#255#255'Ue'#137#0#24'N'#0
+ +#24'N'#255#255#255'w'#132#161#0#24'N"7f'#255#255#255'ft'#149#0#24'N'#0#24'N'
+ +#255#255#255'w'#132#161#0#24'N'#0#24'N'#255#255#255'w'#132#161#0#24'N'#0#24
+ +'N'#0#24'N'#0#24'N'#0#24'N'#187#193#208#238#240#243'"7f'#0#24'N'#0#24'N'#0#24
+ +'N'#0#24'N'#0#24'N'#0#24'N'#0#24'N'#0#24'N'#0#24'N'#255#255#255'w'#132#161#0
+ +#24'N'#0#24'N'#0#24'N'#0#24'N'#0#24'N'#0#24'N'#0#24'N'#153#163#184#255#255
+ +#255#0#24'N'#0#24'N'#0#24'N'#0#24'N'#0#24'N'#0#24'N'#221#224#231#255#255#255
+ +#238#240#243'w'#132#161#153#163#184#255#255#255#255#255#255#255#255#255'DV}'
+ +#0#24'N'#187#193#208#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255'ft'#149#0#24'N'#0#24'N'#0#24'N'#221#224#231#255
+ +#255#255#221#224#231#0#24'N'#0#24'N'#0#24'N'#187#193#208#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255'ft'#149#0#24
+ +'N'#0#24'N'#0#24'N'#0#24'N'#0#24'N'#187#193#208#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255'ft'#149#0#24'N'#0#24
+ +'N'#221#224#231#255#255#255#221#224#231#0#24'N"7f'#255#255#255#255#255#255
+ +#221#224#231#0#24'Nft'#149#204#209#220'ft'#149'ft'#149#255#255#255#255#255
+ +#255#204#209#220#0#24'N'#0#24'N'#0#24'N'#0#24'N'#221#224#231#255#255#255#221
+ +#224#231#0#24'N'#0#24'N'#0#24'N'#0#24'N'#221#224#231#255#255#255#221#224#231
+ +'w'#132#161#255#255#255#255#255#255#255#255#255'Ue'#137#0#24'N'#0#24'N'#0#24
+ +'N'#187#193#208#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255'ft'#149#0#24'NDV}'#255#255#255#255#255#255#255#255
+ +#255#187#193#208#136#147#172#187#193#208#170#178#196#0#24'N'#0#24'N'#0#24'N'
+ +#0#24'N'#221#224#231#255#255#255#221#224#231#0#24'N'#0#24'N'#0#24'N'#0#24'N'
+ +#0#24'N'#0#0#0#0#0#0#0'+Qw'#142#162#255#255#255#0'+Q'#187#198#209#221#227#232
+ +#0'+Q'#0'+Q'#0'+Q'#0'+Q'#255#255#255'w'#142#162#0'+Q'#0'+Q'#0'+Q'#0'+QDd'#127
+ +#255#255#255'3Ut"Gh'#255#255#255'3Ut'#187#198#209'w'#142#162#0'+Q'#238#241
+ +#243#153#170#185#0'+Q"Gh'#255#255#255'f'#128#151#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+'
+ +'Q'#0'+Q'#187#198#209#204#213#220#0'+Q'#0'+Q'#255#255#255'w'#142#162#0'+Q'#17
+ +'9]'#255#255#255'f'#128#151#0'+Q'#0'+Q'#255#255#255'w'#142#162#0'+Q'#0'+Q'
+ +#255#255#255'w'#142#162#0'+Q'#0'+Q'#0'+Q'#0'+Q"Gh'#255#255#255'f'#128#151#0
+ +'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#255#255#255'w'#142
+ +#162#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#204#213#220#238#241#243#0'+Q'
+ +#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#221#227#232#255#255#255#221#227#232#0'+Q'#0'+'
+ +'Qf'#128#151#255#255#255#255#255#255#170#184#197#0'+QDd'#127#255#255#255#255
+ +#255#255#238#241#243#238#241#243#255#255#255#255#255#255#221#227#232#0'+Q'#0
+ +'+Q'#0'+Q'#0'+Q'#221#227#232#255#255#255#221#227#232#0'+Q'#0'+Q'#0'+QDd'#127
+ +#255#255#255#255#255#255#238#241#243#238#241#243#255#255#255#255#255#255#221
+ +#227#232#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+Q'#0'+QDd'#127#255#255#255#255#255#255
+ +#238#241#243#238#241#243#255#255#255#255#255#255#221#227#232#0'+Q'#0'+Q'#0'+'
+ +'Q'#221#227#232#255#255#255#221#227#232#0'+Q3Ut'#255#255#255#255#255#255#221
+ ,#227#232#0'+Q'#17'9]'#0'+Q'#0'+Qw'#142#162#255#255#255#255#255#255#238#241
+ +#243#0'+Q'#0'+Q'#0'+Q'#0'+Q'#221#227#232#255#255#255#221#227#232#0'+Q'#0'+Q'
+ +#0'+Q'#0'+Q'#221#227#232#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#136#156#174#0'+Q'#0'+Q'#0'+Q'#0'+QDd'#127#255#255#255#255#255#255
+ +#238#241#243#238#241#243#255#255#255#255#255#255#221#227#232#0'+Q'#0'+Q'#170
+ +#184#197#255#255#255#255#255#255'w'#142#162#0'+Q'#0'+Q'#0'+Q'#17'9]'#0'+Q'#0
+ +'+Q'#0'+Q'#0'+Q'#221#227#232#255#255#255#221#227#232#0'+Q'#0'+Q'#0'+Q'#0'+Q'
+ +#0'+Q'#0#0#0#0#0#0#0'4Vw'#147#165#255#255#255#255#255#255#255#255#255#187#201
+ +#210#17'Ba'#0'4V'#0'4V'#0'4V'#255#255#255#153#174#187'Ux'#142'Ux'#142'3]x'#0
+ +'4V"Om'#255#255#255'Dj'#131#153#174#187#187#201#210#0'4VDj'#131#238#241#244#0
+ +'4V'#255#255#255'w'#147#165#0'4Vf'#133#154#255#255#255#17'Ba'#0'4V'#0'4V'#0
+ +'4V'#0'4V'#0'4V'#0'4Vw'#147#165#255#255#255#0'4V'#0'4V'#255#255#255'w'#147
+ +#165#17'Ba'#153#174#187#238#241#244#17'Ba'#0'4V'#0'4V'#255#255#255'w'#147#165
+ +#0'4V'#0'4V'#255#255#255#153#174#187'Ux'#142'Ux'#142'3]x'#0'4Vf'#133#154#255
+ +#255#255#17'Ba'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'
+ +#255#255#255'w'#147#165#0'4V'#0'4V'#0'4V'#0'4V'#0'4V3]x'#221#228#232#255#255
+ +#255'Ux'#142#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#221#228#232#255#255#255#221
+ +#228#232#0'4V'#0'4V'#17'Ba'#238#241#244#255#255#255#221#228#232#0'4V'#0'4V'
+ +#204#214#221#255#255#255#153#174#187'f'#133#154#255#255#255#255#255#255'f'
+ +#133#154#0'4V'#0'4V'#0'4V'#0'4V'#221#228#232#255#255#255#221#228#232#0'4V'#0
+ +'4V'#0'4V'#0'4V'#204#214#221#255#255#255#153#174#187'f'#133#154#255#255#255
+ +#255#255#255'f'#133#154#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#204#214#221
+ +#255#255#255#153#174#187'f'#133#154#255#255#255#255#255#255'f'#133#154#0'4V'
+ +#0'4V'#0'4V'#221#228#232#255#255#255#255#255#255#221#228#232#255#255#255#255
+ +#255#255#255#255#255'Ux'#142#0'4V'#0'4V'#0'4V'#170#187#199#255#255#255#255
+ +#255#255#255#255#255#153#174#187#0'4V'#0'4V'#0'4V'#0'4V'#221#228#232#255#255
+ +#255#221#228#232#0'4V'#0'4V'#0'4V'#0'4V'#221#228#232#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#170#187#199#17'Ba'#0'4V'#0'4V'#0'4V'#0
+ +'4V'#204#214#221#255#255#255#153#174#187'f'#133#154#255#255#255#255#255#255
+ +'f'#133#154#0'4V'#0'4V'#221#228#232#255#255#255#238#241#244#17'Ba'#0'4V'#0'4'
+ +'V'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#0'4V'#221#228#232#255#255#255#221#228#232#0
+ +'4V'#0'4V'#0'4V'#0'4V'#0'4V'#0#0#0#0#0#0#0'8Pw'#149#162#255#255#255#0'8P3`s'
+ +#221#228#232#170#189#197#0'8P'#0'8P'#0'8P'#255#255#255#255#255#255#255#255
+ +#255#255#255#255#170#189#197#0'8P'#0'8P'#255#255#255'w'#149#162#255#255#255
+ +'Dm'#127#0'8P'#0'8P'#204#215#220'f'#136#150#255#255#255'Uz'#138#0'8Pf'#136
+ +#150#255#255#255#17'E\'#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#0'8Pw'#149#162#255#255
+ +#255#0'8P'#0'8P'#255#255#255#255#255#255#255#255#255#255#255#255'Dm'#127#0'8'
+ +'P'#0'8P'#0'8P'#255#255#255'w'#149#162#0'8P'#0'8P'#255#255#255#255#255#255
+ +#255#255#255#255#255#255#170#189#197#0'8Pf'#136#150#255#255#255#17'E\'#0'8P'
+ +#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#255#255#255'w'#149#162
+ +#0'8P'#0'8P'#0'8P'#0'8PDm'#127#255#255#255#238#242#243'Dm'#127#0'8P'#0'8P'#0
+ +'8P'#0'8P'#0'8P'#0'8P'#0'8P'#221#228#232#255#255#255#221#228#232#0'8P'#0'8P'
+ +#17'E\'#238#242#243#255#255#255#238#242#243#0'8P'#0'8PUz'#138#255#255#255#238
+ +#242#243#221#228#232#255#255#255#221#228#232#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'
+ +#221#228#232#255#255#255#221#228#232#0'8P'#0'8P'#0'8P'#0'8PUz'#138#255#255
+ +#255#238#242#243#221#228#232#255#255#255#221#228#232#0'8P'#0'8P'#0'8P'#0'8P'
+ +#0'8P'#0'8P'#0'8P'#0'8PUz'#138#255#255#255#238#242#243#221#228#232#255#255
+ +#255#221#228#232#0'8P'#0'8P'#0'8P'#0'8P'#221#228#232#255#255#255#255#255#255
+ +#221#228#232#255#255#255#255#255#255#204#215#220#17'E\'#0'8P'#0'8P'#153#175
+ +#185#255#255#255#255#255#255#255#255#255#187#202#208#17'E\'#0'8P'#0'8P'#0'8P'
+ +#0'8P'#221#228#232#255#255#255#221#228#232#0'8P'#0'8P'#0'8P'#0'8P'#221#228
+ +#232#255#255#255#238#242#243'3`sf'#136#150#255#255#255#255#255#255#170#189
+ +#197#0'8P'#0'8P'#0'8P'#0'8PUz'#138#255#255#255#238#242#243#221#228#232#255
+ +#255#255#221#228#232#0'8P'#0'8P'#0'8P'#238#242#243#255#255#255#238#242#243#17
+ +'E\'#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#221#228#232#255#255#255
+ +#221#228#232#0'8P'#0'8P'#0'8P'#0'8P'#0'8P'#0#0#0#0#0#0#0'EZw'#156#167#255#255
+ +#255#0'EZ'#0'EZw'#156#167#255#255#255#0'EZ'#0'EZ'#0'EZ'#255#255#255'w'#156
+ +#167#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#221#230#233#255#255#255#204#218#222#0'EZ'
+ +#0'EZ'#0'EZU'#131#145#255#255#255#255#255#255'Dw'#134#0'EZ"^p'#255#255#255'f'
+ +#143#156#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#187#205#211#204#218#222#0'EZ'#0
+ +'EZ'#255#255#255'w'#156#167#17'Qe'#187#205#211#187#205#211#0'EZ'#0'EZ'#0'EZ'
+ +#255#255#255'w'#156#167#0'EZ'#0'EZ'#255#255#255'w'#156#167#0'EZ'#0'EZ'#0'EZ'
+ +#0'EZ"^p'#255#255#255'f'#143#156#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0
+ +'EZ'#0'EZ'#0'EZ'#255#255#255'w'#156#167#0'EZ'#0'EZ'#0'EZ'#0'EZ'#221#230#233
+ ,#204#218#222#17'Qe'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#221#230
+ +#233#255#255#255#221#230#233#0'EZ'#0'EZf'#143#156#255#255#255#255#255#255#170
+ +#193#200#0'EZ'#0'EZ'#0'EZ'#204#218#222#255#255#255#255#255#255#255#255#255'f'
+ +#143#156#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#221#230#233#255#255#255#221#230#233#0
+ +'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#204#218#222#255#255#255#255#255#255#255#255#255
+ +'f'#143#156#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#204#218#222
+ +#255#255#255#255#255#255#255#255#255'f'#143#156#0'EZ'#0'EZ'#0'EZ'#0'EZ'#221
+ +#230#233#255#255#255#221#230#233#0'EZ3j{'#255#255#255#255#255#255#170#193#200
+ +#0'EZ'#17'Qe'#255#255#255#255#255#255#255#255#255'w'#156#167#0'EZ'#0'EZ'#0'E'
+ +'Z'#0'EZ'#0'EZ'#0'EZ'#221#230#233#255#255#255#221#230#233#0'EZ'#0'EZ'#0'EZ'#0
+ +'EZ'#221#230#233#255#255#255#221#230#233#0'EZ'#0'EZ'#238#243#244#255#255#255
+ +#238#243#244#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#204#218#222#255#255#255#255#255
+ +#255#255#255#255'f'#143#156#0'EZ'#0'EZ'#0'EZ'#187#205#211#255#255#255#255#255
+ +#255'w'#156#167#0'EZ'#0'EZ'#0'EZ"^p'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#221#230#233#255
+ +#255#255#221#230#233#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0'EZ'#0#0#0#0#0#0#0'AXw'#154#166
+ +#255#255#255#0'AX'#0'AX'#136#166#177#255#255#255#0'AX'#0'AX'#0'AX'#255#255
+ +#255'w'#154#166#0'AX'#0'AX'#0'AX'#0'AX'#0'AX'#187#204#210#255#255#255'U'#128
+ +#144#0'AX'#0'AX'#0'AX'#0'AX'#221#230#233#255#255#255'3gy'#0'AX'#0'AX'#187#204
+ +#210#221#230#233'"Zn'#0'AX'#0'AX'#0'AX'#0'AXf'#141#155#255#255#255'U'#128#144
+ +#0'AX'#0'AX'#255#255#255'w'#154#166#0'AXw'#154#166#255#255#255#0'AX'#0'AX'#0
+ +'AX'#255#255#255'w'#154#166#0'AX'#0'AX'#255#255#255'w'#154#166#0'AX'#0'AX'#0
+ +'AX'#0'AX'#0'AX'#187#204#210#238#242#244'"Zn'#0'AX'#0'AX'#0'AX'#0'AX'#0'AX'#0
+ +'AX'#0'AX'#0'AX'#0'AX'#255#255#255'w'#154#166#0'AX'#0'AX'#0'AX'#0'AX'#255#255
+ +#255'w'#154#166#0'AX'#0'AX'#0'AX'#0'AX'#0'AX'#0'AX'#0'AX'#0'AX'#0'AX'#221#230
+ +#233#255#255#255#238#242#244'w'#154#166#153#179#188#255#255#255#255#255#255
+ +#255#255#255'Dt'#133#0'AX'#0'AX'#0'AXU'#128#144#255#255#255#255#255#255#221
+ +#230#233#0'AX'#0'AX'#0'AXf'#141#155'w'#154#166'w'#154#166#238#242#244#255#255
+ +#255#238#242#244'w'#154#166'w'#154#166'f'#141#155#0'AX'#0'AXU'#128#144#255
+ +#255#255#255#255#255#221#230#233#0'AX'#0'AX'#0'AX'#0'AX'#0'AX'#0'AX'#0'AX'#0
+ +'AX'#0'AX'#0'AXU'#128#144#255#255#255#255#255#255#221#230#233#0'AX'#0'AX'#0
+ +'AX'#0'AX'#0'AX'#221#230#233#255#255#255#221#230#233#0'AX3gy'#255#255#255#255
+ +#255#255#204#217#222#0'AX'#0'AX'#238#242#244#255#255#255#255#255#255'U'#128
+ +#144'w'#154#166'w'#154#166#0'AXf'#141#155'w'#154#166'w'#154#166#238#242#244
+ +#255#255#255#238#242#244'w'#154#166'w'#154#166'f'#141#155#0'AX'#221#230#233
+ +#255#255#255#238#242#244'U'#128#144#153#179#188#255#255#255#255#255#255#204
+ +#217#222#0'AX'#0'AX'#0'AX'#0'AX'#0'AXU'#128#144#255#255#255#255#255#255#221
+ +#230#233#0'AX'#0'AX'#0'AX'#0'AXDt'#133#255#255#255#255#255#255#255#255#255
+ +#187#204#210#136#166#177#187#204#210#136#166#177#0'AXf'#141#155'w'#154#166'w'
+ +#154#166#238#242#244#255#255#255#238#242#244'w'#154#166'w'#154#166'f'#141#155
+ +#0'AX'#0'AX'#0#0#0#0#0#0#0'JXw'#158#166#255#255#255'Dz'#133'f'#146#155#238
+ +#243#244#170#195#199#0'JX'#0'JX'#0'JX'#255#255#255#153#183#188'U'#134#144'U'
+ +#134#144'Dz'#133#0'JX'#0'JX'#153#183#188#221#231#233#0'JX'#0'JX'#0'JX'#0'JX'
+ +#0'JXw'#158#166#255#255#255#0'JX'#0'JX'#0'JX'#17'Vc'#204#219#222#238#243#244
+ +#136#171#177'U'#134#144'U'#134#144#187#207#210#255#255#255'w'#158#166#0'JX'#0
+ +'JX'#0'JX'#255#255#255#136#171#177'Dz'#133#221#231#233#204#219#222#0'JX'#0'J'
+ +'X'#0'JX'#255#255#255'w'#158#166#0'JX'#0'JX'#255#255#255#153#183#188'U'#134
+ +#144'U'#134#144'Dz'#133#0'JX'#0'JX'#17'Vc'#204#219#222#238#243#244#153#183
+ +#188'U'#134#144'U'#134#144#153#183#188#136#171#177#17'VcU'#134#144'U'#134#144
+ +'U'#134#144#255#255#255#153#183#188'U'#134#144'U'#134#144'3ny'#0'JX'#204#219
+ +#222#204#219#222'Dz'#133'Dz'#133#153#183#188#0'JX'#0'JX'#0'JX'#0'JX'#0'JX'#0
+ +'JX'#221#231#233#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255'f'#146#155#0'JX'#0'JX'#0'JX'#0'JX'#0'JX'#221#231#233#255#255#255
+ +'f'#146#155#0'JX'#0'JX'#0'JX'#204#219#222#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#204#219#222#0'JX'#0'JX'#0'J'
+ +'X'#221#231#233#255#255#255'f'#146#155#0'JX'#0'JX'#0'JX'#0'JX'#0'JX'#0'JX'#0
+ +'JX'#0'JX'#0'JX'#0'JX'#0'JX'#221#231#233#255#255#255'f'#146#155#0'JX'#0'JX'#0
+ +'JX'#0'JX'#0'JX'#221#231#233#255#255#255#255#255#255#221#231#233#255#255#255
+ +#255#255#255#255#255#255'w'#158#166#0'JX'#0'JX'#136#171#177#255#255#255#255
+ +#255#255#255#255#255#255#255#255#136#171#177#0'JX'#204#219#222#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#204
+ +#219#222#0'JX'#221#231#233#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255'U'#134#144#0'JX'#0'JX'#0'JX'#0'JX'#0'JX'#0'JX'#221
+ +#231#233#255#255#255'f'#146#155#0'JX'#0'JX'#0'JX'#0'JX'#0'JXf'#146#155#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#136#171#177#0'JX'
+ ,#204#219#222#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#204#219#222#0'JX'#0'JX'#0#0#0#0#0#0#0'C"X\'#255#255#255#255#255#255#238#242#242'U~'#130#0'>C'#0
+ +'>C'#0'>C'#0'>CDqu'#221#229#230#255#255#255#255#255#255#221#229#230'Dqu'#0'>'
+ +'C'#0'>C'#0'>C'#0'>C'#255#255#255'f'#139#142#0'>C'#255#255#255'f'#139#142#153
+ +#178#180#187#204#205#0'>C'#170#191#192#187#204#205#0'>C'#0'>C'#0'>C'#255#255
+ +#255#255#255#255#255#255#255#187#204#205#0'>C'#0'>C'#0'>C"X\'#255#255#255#255
+ +#255#255#238#242#242'Dqu'#0'>C'#0'>C'#0'>C'#0'>C'#255#255#255#255#255#255#255
+ +#255#255#187#204#205#0'>C'#0'>C'#0'>C"X\'#255#255#255#255#255#255#255#255#255
+ +#136#165#167#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C"X\'
+ +#255#255#255#255#255#255#170#191#192#0'>C'#0'>C'#0'>Cw'#152#155#255#255#255#0
+ +'>C'#0'>C3ei'#255#255#255'Dqu'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>'
+ +'C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0
+ +'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'
+ +#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>'
+ +'C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0
+ +'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'
+ +#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>'
+ +'C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0
+ +'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'
+ +#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>C'#0'>'
+ +'C'#0'>C'#0'>C'#0'>C'#0#0#0#0#0#0#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0
+ +'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'
+ +#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O'
+ ,'8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0
+ +'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'
+ +#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O'
+ +'8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0
+ +'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'
+ +#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O'
+ +'8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0
+ +'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'
+ +#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O'
+ +'8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0
+ +'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'
+ +#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O'
+ +'8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0
+ +'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'#0'O8'
+ +#0#0#0#0#0#0#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`'
+ +'8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0
+ +'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'
+ +#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`'
+ +'8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0
+ +'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'
+ +#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`'
+ +'8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0
+ +'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'
+ +#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`'
+ +'8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0
+ +'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'
+ +#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`'
+ +'8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0
+ +'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'
+ +#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`'
+ +'8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0'`8'#0#0#0#0#0#0#0'n0'#0
+ +'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'
+ +#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n'
+ +'0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0
+ +'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'
+ +#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n'
+ +'0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0
+ +'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'
+ +#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n'
+ +'0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0
+ +'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'
+ +#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n'
+ +'0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0
+ +'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'
+ +#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n'
+ +'0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0
+ +'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'
+ +#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0'n0'#0#0#0#0#0#0#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ ,#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137
+ +'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0#137'-'#0
+ +#137'-'#0#137'-'#0#137'-'#0#0#0#0#0#0#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0
+ +'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'
+ +#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{'
+ +'-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0
+ +'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'
+ +#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{'
+ +'-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0
+ +'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'
+ +#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{'
+ +'-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0
+ +'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'
+ +#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{'
+ +'-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0
+ +'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'
+ +#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{'
+ +'-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0
+ +'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'#0'{-'
+ +#0'{-'#0#0#0#0#0#0#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127
+ +'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0#127'+'#0
+ +#0#0#0#0#0#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ ,'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0
+ +#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138
+ +'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#138'7'#0#0#0#0#0
+ +#0#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0
+ +#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138
+ +'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#138'6'#0#0#0#0#0#0#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0
+ +#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152
+ +':'#0#152':'#0#152':'#0#152':'#0#152':'#0#152':'#0#0#0#0#0#0#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ ,#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0
+ +#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#158
+ +'D'#0#158'D'#0#158'D'#0#158'D'#0#158'D'#0#0#0#0#0#0#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0
+ +#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176'F'#0#176
+ +'F'#0#176'F'#0#176'F'#0#176'F'#0#0#0#0#0#0#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ ,#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0
+ +#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151'M'#0#151
+ +'M'#0#151'M'#0#151'M'#0#0#0#0#0#0#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0
+ +#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153'H'#0#153
+ +'H'#0#153'H'#0#0#0#0#0#0#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0
+ +#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189'<'#0#189
+ +'<'#0#0#0#0#0#0#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ ,'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168
+ +'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0
+ +#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#168'-'#0#0#0
+ +#0#0#0#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192
+ +'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0
+ +#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#192'A'#0#0#0#0#0#0#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ ,'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178
+ +'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0
+ +#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#178'P'#0#0#0#0#0#0#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150
+ +'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0
+ +#150'T'#0#150'T'#0#150'T'#0#150'T'#0#150'T'#0#0#0#0#0#0#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132
+ +'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0#132'W'#0
+ +#132'W'#0#132'W'#0#132'W'#0#132'W'#0#0#0#0#0#0#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ ,#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142
+ +'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0#142'Z'#0
+ +#142'Z'#0#142'Z'#0#142'Z'#0#0#0#0#0#0#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158
+ +'d'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0#158'd'#0
+ +#158'd'#0#158'd'#0#0#0#0#0#0#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ +#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153
+ +'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0#153'^'#0
+ ,#153'^'#0#0#0#0#0#0#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160
+ +'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0#160'Z'#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPoweredByDataAbstractButton.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPoweredByDataAbstractButton.pas
new file mode 100644
index 0000000..d2d670e
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPoweredByDataAbstractButton.pas
@@ -0,0 +1,75 @@
+unit uDAPoweredByDataAbstractButton;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {$IFDEF FPC}LResources,{$ENDIF}
+ {$IFDEF MSWINDOWS} Windows, {$ENDIF}
+ uROPoweredByRemObjectsButton,SysUtils,Classes,
+ Graphics, Controls;
+
+{$IFNDEF FPC}
+ {$R uDAPoweredByDataAbstractButton.res}
+{$ENDIF FPC}
+
+type
+ TDAPoweredByDataAbstractButton = class(TROPoweredByRemObjectsButton)
+ protected
+ procedure GetBitmap; override;
+ public
+ procedure Click; override;
+ end;
+
+implementation
+
+{$IFDEF MSWINDOWS}
+uses ShellAPI;
+{$ENDIF MSWINDOWS}
+
+const
+ STR_POWERED_BY_DATAABSTRACT_CLIENT = 'POWERED_BY_DATAABSTRACT_CLIENT';
+ STR_POWERED_BY_DATAABSTRACT_SERVER = 'POWERED_BY_DATAABSTRACT_SERVER';
+
+{ TDAPoweredByDataAbstractButton }
+
+procedure TDAPoweredByDataAbstractButton.GetBitmap;
+begin
+{$IFDEF FPC}
+ case ApplicationType of
+ atServer: Bitmap.LoadFromLazarusResource(STR_POWERED_BY_DATAABSTRACT_SERVER);
+ atClient: Bitmap.LoadFromLazarusResource(STR_POWERED_BY_DATAABSTRACT_CLIENT);
+ end; { case }
+{$ELSE}
+ case ApplicationType of
+ atServer: Bitmap.LoadFromResourceName(hInstance,STR_POWERED_BY_DATAABSTRACT_SERVER);
+ atClient: Bitmap.LoadFromResourceName(hInstance,STR_POWERED_BY_DATAABSTRACT_CLIENT);
+ end; { case }
+{$ENDIF}
+end;
+
+procedure TDAPoweredByDataAbstractButton.Click;
+begin
+ {$IFDEF MSWINDOWS}
+ ShellExecute(0,'open','http://www.dataabstract.com',nil,nil,SW_SHOWNORMAL);
+ {$ENDIF MSWINDOWS}
+end;
+
+{$IFDEF FPC}
+initialization
+ {$I uDAPoweredByDataAbstractButton.lrs}
+{$ENDIF}
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPoweredByDataAbstractButton.res b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPoweredByDataAbstractButton.res
new file mode 100644
index 0000000..0dd5c2d
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAPoweredByDataAbstractButton.res differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.dfm
new file mode 100644
index 0000000..ae8fe93
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.dfm
@@ -0,0 +1,551 @@
+object ReconcileDialogForm: TReconcileDialogForm
+ Left = 354
+ Top = 231
+ Width = 541
+ Height = 403
+ BorderStyle = bsSizeToolWin
+ BorderWidth = 5
+ Caption = 'One or more updates failed to apply on the server...'
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poOwnerFormCenter
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ DesignSize = (
+ 515
+ 357)
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 264
+ Top = 154
+ Width = 238
+ Height = 39
+ Anchors = [akLeft, akRight, akBottom]
+ Caption =
+ 'Skip over this change and ignore the error. You can try and corr' +
+ 'ect the problem by modifying data, or reapply the change again a' +
+ 't a later time.'
+ WordWrap = True
+ end
+ object Label2: TLabel
+ Left = 264
+ Top = 210
+ Width = 225
+ Height = 26
+ Anchors = [akLeft, akRight, akBottom]
+ Caption =
+ 'Cancel the changes you made and restore the record to its origin' +
+ 'al values.'
+ WordWrap = True
+ end
+ object Label3: TLabel
+ Left = 264
+ Top = 266
+ Width = 230
+ Height = 39
+ Anchors = [akLeft, akRight, akBottom]
+ Caption =
+ 'Show a dialog with details of the changes made to the record sin' +
+ 'ce it was last retrieved from or applied to the server.'
+ WordWrap = True
+ end
+ object SkipButton: TButton
+ Left = 161
+ Top = 154
+ Width = 96
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = '&Skip Change'
+ TabOrder = 3
+ OnClick = SkipButtonClick
+ end
+ object CancelButton: TButton
+ Left = 161
+ Top = 210
+ Width = 96
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = '&Cancel Change'
+ TabOrder = 4
+ OnClick = CancelButtonClick
+ end
+ object SkipAllButton: TButton
+ Left = 0
+ Top = 332
+ Width = 75
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = 'Skip &All'
+ TabOrder = 1
+ OnClick = SkipAllButtonClick
+ end
+ object CancelAllButton: TButton
+ Left = 80
+ Top = 332
+ Width = 75
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = 'Cancel A&ll'
+ TabOrder = 2
+ OnClick = CancelAllButtonClick
+ end
+ object ShowDetailButton: TButton
+ Left = 161
+ Top = 266
+ Width = 96
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = 'Show &Details'
+ TabOrder = 5
+ OnClick = ShowDetailButtonClick
+ end
+ object TreeView: TTreeView
+ Left = 0
+ Top = 0
+ Width = 155
+ Height = 327
+ Anchors = [akLeft, akTop, akBottom]
+ HideSelection = False
+ Indent = 20
+ MultiSelectStyle = []
+ ReadOnly = True
+ RowSelect = True
+ ShowButtons = False
+ ShowLines = False
+ ShowRoot = False
+ StateImages = ImageList
+ TabOrder = 0
+ OnClick = ListBoxClick
+ end
+ object btn_Cancel: TButton
+ Left = 440
+ Top = 332
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Cancel = True
+ Caption = 'Close'
+ ModalResult = 2
+ TabOrder = 6
+ end
+ object memMessageError: TMemo
+ Left = 160
+ Top = 0
+ Width = 353
+ Height = 145
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ Color = clBtnFace
+ ReadOnly = True
+ ScrollBars = ssVertical
+ TabOrder = 7
+ end
+ object ImageList: TImageList
+ Left = 59
+ Top = 124
+ 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
+ 0000000000000000000000000000000000000000000000000000000D6C00000D
+ 6C00000C5D00000A5100000A4F00000A4F00000A4F00000A4F00000A4F00000A
+ 4F00000A4F000008400000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000001397000017B9000016
+ B5000015AA000013A0000013A00000139700001397000013A000001397000013
+ 97000013A000000F7A0000084000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000017B900001CE200001A
+ D5000018CA000018C6000016B5000016B5000015AA000015AA000016B5000015
+ AA000016B5000013A000000A4F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018C600001EF000001C
+ E200001AD5000018C6000018C6000016B5000016B5000015AA000013A0000015
+ AA000015AA000013A000000A4F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA000224FF00001E
+ F000001CE200001AD5000018CA000018C6000016B5000016B5000015AA000013
+ A0000017B90000139700000A4F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA00163BFF000528
+ FF00001EF000001CE200001AD5000018CA000018CA000017B9000016B5000015
+ AA000015AA000013A000000A4F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA003559FF000F35
+ FF000224FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000017
+ B9000016B5000013A000000A4F00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA004E6EFF00193F
+ FF000224FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000018
+ C6000018C60000139D00000C5D00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA005A79FF002146
+ FF00092DFF000224FF00001EF000001DEE00001DEE00001CE200001AD5000018
+ CA000018CA000016B500000D6C00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA006682FF002D51
+ FF00163BFF000F35FF000224FF00001FFF00001EF000001EF000001DEE00001C
+ DE00001CDE000017B900000F7A00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA007690FF004163
+ FF00193FFF00163BFF00092DFF000528FF000224FF000224FF00001DEE00001D
+ EE00001CE2000018C60000118700000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA007F98FF00728C
+ FF005676FF004163FF003559FF00284CFF00163BFF000224FF00001FFF00001D
+ EE00001DEE00001CDE0000139700000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000018CA005877FF007F98
+ FF00839CFF007690FF006682FF004E6EFF00284CFF000F35FF000224FF00001F
+ FF00001DEE00001CE2000013A000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001DEE00092D
+ FF000F35FF00092DFF000528FF000224FF00001DEE00001CDE00001AD5000018
+ CA00001AD5000016B50000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000015F05000269090002640700005E0400004D0300000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000002C2C6C0005056300000065000000600000004F00000000000000
+ 0000000000000000000000000000000000000000000000000000000D6C00000D
+ 6C00000C5D00000A5100000A4F00000A4F00000A4F00000A4F00000A4F00000A
+ 4F00000A4F000008400000000000000000000000000000000000000D6C00000D
+ 6C00000C5D00000A5100000A4F00000A4F00000A4F00000A4F00000A4F00000A
+ 4F00000A4F000008400000000000000000000000000000000000000000000271
+ 08000C98220011B62F000DB4250009B21C0006B0160001AE0B0000910700005B
+ 0400000000000000000000000000000000000000000000000000000000002929
+ AC000000840000008E0000008E0000008F0000008C0000008800000081000101
+ 54000000000000000000000000000000000000000000001397000017B9000016
+ B5000015AA000013A0000013A00000139700001397000013A000001397000013
+ 97000013A000000F7A00000840000000000000000000001397000017B9000016
+ B5000015AA000013A0000013A00000139700001397000013A000001397000013
+ 97000013A000000F7A0000084000000000000000000000000000078414001CB6
+ 45001BBA440017B83A0012B630000EB426001AB72D0008B21B0004AF110000AD
+ 09000067050000000000000000000000000000000000000000002929AC000000
+ 96000000970000009B0000009F000000A00000009D000000970000008F000000
+ 880000006200000000000000000000000000000000000017B900001CE200001A
+ D5000018CA000018C6000016B5000016B5000015AA000015AA000016B5000015
+ AA000016B5000013A000000A4F0000000000000000000017B900001CE200001A
+ D1000019CC000018C6000016B5000016B5000015AA000015AA000016B5000015
+ AA000016B5000013A000000A4F00000000000000000004860B0023B7530024BE
+ 580021BD51001CBA45001ABA430012B630000EB426000EB426000AB21D0007B1
+ 180002AE0D00005F04000000000000000000000000002929AC000101A3000808
+ 9E009999D4006868D0000000AC000000AE000000A9004848B800B7B7E3002727
+ A50000008C00010152000000000000000000000000000018C600001EF000001C
+ E200001AD5000018C6000018C6000016B5000016B5000015AA000013A0000015
+ AA000015AA000013A000000A4F0000000000000000000018C600001EF000001C
+ E200001AD1000018C6003653D300EAEEFA008899E000061FAF000013A0000015
+ AA000015AA000013A000000A4F00000000000000000017A437002EC26B002CC1
+ 660025BF5A0021BD5100FFFFFF001ABA430012B6300013B6310011B62E000BB3
+ 210009B21C00059712000000000000000000000000002929AC000000AB002828
+ A300DEDED200FEFEFF006464D4000000B3004646C000E7E7EC00FFFFF7005E5E
+ B70000009A00020287000000000000000000000000000018CA000224FF00001E
+ F000001CE200001AD5000018C600FFFFFF00F4F7FF000016B5000015AA000013
+ A0000017B90000139700000A4F0000000000000000000019CC000224FF00001E
+ F0009AACF6000624D7000019CC009AAAEB00FFFFFF008899E0000015AA000015
+ AA000015AA000013A000000A4F00000000000091020028BB5E002EC26B002EC2
+ 6B002EC26B00FFFFFF00FFFFFF00FFFFFF001ABA43001ABA430015B8380012B6
+ 30000FB52A000AB21D0002670800000000004B4BD3000707B1000303B9000000
+ C2004C4CA700E6E6D900FCFCFF009E9EE600E8E9F400FFFFF1007575B9000606
+ B1000101AB000202A00013145D0000000000000000000018CA00163BFF000528
+ FF00001EF000001CE200001BD900FFFFFF00FFFFFF000017B9000016B5000015
+ AA000015AA000013A000000A4F0000000000000000000019CC00163BFF000528
+ FF00FFFFFF00768FF300001AD1003654DE00FFFFFF00ADBBEE000016B5000015
+ AA000016B50000139700000A4F0000000000009701002EC26B002EC26B002EC2
+ 6B00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001ABA43001ABA43000EB4
+ 260014B7340011B62F0005771000000000004B4BD3000808BB000707C8000505
+ D1000000C8005353B600F2F2ED00FFFFFF00FFFFFC007575C9000000BE000101
+ C3000303B8000303AC0010106F0000000000000000000018CA003559FF000F35
+ FF000224FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000017
+ B9000016B5000013A000000A4F0000000000000000000019CC003559FF000F35
+ FF00FFFFFF00FFFFFF00768FF300EAEEFA00FFFFFF00889CEB000018C6000016
+ B5000016B5000013A000000A4F000000000000A001002EC26B002EC26B002EC2
+ 6B00FFFFFF00FFFFFF002EC26B00FFFFFF00FFFFFF00FFFFFF001ABA43001ABA
+ 43001BBA440017B83A000A8D1B00000000004B4BD3000C0CC9000D0DD8000B0B
+ DC000000D6003C3DCE00EEEFED00FFFFFF00FFFFFD005858DB000000CA000303
+ CB000606C5000606B8001212790000000000000000000018CA004E6EFF00193F
+ FF000224FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000018
+ C6000018C6000013A000000A510000000000000000000019CC004D6DFF00193F
+ FF004D6DFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EAEEFA001C3BD5000018
+ C6000017B9000015AA00000A51000000000000A4010033C36E002EC26B002EC2
+ 6B00FFFFFF002EC26B002EC26B002EC26B00FFFFFF00FFFFFF00FFFFFF002BBF
+ 640021BD51001CBA4500077F1300000000004B4BD3001414D8001717EA000B0B
+ F1004343DB00E4E4EA00FDFDF500BABAD400EAEAE800FEFEFF006363E5000303
+ D7000A0ACF000A0AC30021217F0000000000000000000018CA005A79FF002146
+ FF00092DFF000224FF00001EF000FFFFFF00FFFFFF00001CE200001BD9000018
+ CA000018CA000016B500000D6C0000000000000000000019CC005A79FF002146
+ FF00092DFF00294DFF006681F8004565F400C1CCFB00FFFFFF00EAEEFA001C3B
+ D5000019CC000016B500000D6C000000000000AD000044C665003FC776002EC2
+ 6B003AC573002EC26B002EC26B002EC26B002EC26B00FFFFFF00FFFFFF002BBF
+ 640025BF5A0023BE5700047E0D00000000004B4BD3002626E5002222FB003F3F
+ E900DCDCE500FDFDEE007373C5000303D7005151B000E3E3D600FFFFFE006161
+ E5000808DB000F0FCA001212790000000000000000000018CA006682FF002D51
+ FF00163BFF000F35FF000224FF00FFFFFF00FFFFFF00001DEE00001CE200001C
+ E200001BD9000017B900000F7A0000000000000000000019CC006681F8002D51
+ FF00163BFF000F35FF000224FF00001FFF000528FF00EAEEFA00FFFFFF00EAEE
+ FA00001BD9000017B900000F7A00000000000000000031BE3C0072D5950052CC
+ 820035C470003AC573002EC26B002EC26B002EC26B002EC26B00FFFFFF002BBF
+ 64002DC26A001AA73E000000000000000000000000003131FB003232FF005252
+ ED00B3B3C2007777CA000000EA000000EC000000E8005252B400ADADB0004D4D
+ E1001818ED001818B1000000000000000000000000000018CA007690FF004163
+ FF00193FFF00163BFF00092DFF000528FF000224FF000224FF00001EF000001D
+ EE00001CE2000018CA000011870000000000000000000019CC007690FF004163
+ FF00193FFF00163BFF00092DFF000528FF000224FF001C41FF00EAEEFA00C1CC
+ FB00001CE2000019CC0000118700000000000000000000B7000075D6830082DA
+ A00066D28E0044C879003AC573002EC26B002EC26B002EC26B0028BD5E002BBF
+ 64002BBF640003870A000000000000000000000000003131FB003E3EFB005353
+ FF006868EF005757F9003838FF002525FD002929FF003838FC004242EB003232
+ FF001F1FE9003131FB000000000000000000000000000018CA007F98FF00728C
+ FF005676FF004163FF003559FF00284CFF00163BFF000224FF00001FF900001D
+ EE00001EF000001BD9000013A00000000000000000000019CC007F98FF00728C
+ FF005676FF004163FF003559FF002449FF00193FFF000224FF000224FF00001E
+ F000001EF000001BD9000013A0000000000000000000000000000FBC100077D7
+ 800098E0AD0076D798005ACE86003AC573002EC26B002EC26B002EC26B0028BD
+ 5E000998170000000000000000000000000000000000000000003131FB004949
+ FD006E6EFF009191FF009393FF008484FF007676FF006767FF005151FF003131
+ FB003131FB00000000000000000000000000000000000018CA005877FF007F98
+ FF00839CFF007690FF006682FF004E6EFF00284CFF000F35FF000224FF00001F
+ F900001FF900001CE2000013A00000000000000000000019CC005877FF007F98
+ FF00839CFF007690FF006681F8004D6DFF00294DFF000F35FF00001FFF00001F
+ FF00001FFF00001BD9000013A0000000000000000000000000000000000000B8
+ 000047CB490084DA91008CDCA6006AD391004ECB7F002DBF610017B13600049C
+ 0A00000000000000000000000000000000000000000000000000000000003131
+ FB003131FB006969FE008787FF009292FF007676FF005353FF005151F3003131
+ FB00000000000000000000000000000000000000000000000000001DEE00092D
+ FF000F35FF00092DFF000528FF000224FF00001DEE00001BD900001AD5000018
+ CA00001AD5000016B50000000000000000000000000000000000001DEE00092D
+ FF000F35FF00092DFF000528FF000224FF00001DEE00001BD900001AD1000019
+ CC000019CC000017B90000000000000000000000000000000000000000000000
+ 00000000000000B8000000B6000000AE000000AD000000A60100000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000003131FB003131FB003131FB003131FB003131FB00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000424D3E000000000000003E000000
+ 2800000040000000300000000100010000000000800100000000000000000000
+ 000000000000000000000000FFFFFF0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000FFFF000000000000C003000000000000
+ 8001000000000000800100000000000080010000000000008001000000000000
+ 8001000000000000800100000000000080010000000000008001000000000000
+ 8001000000000000800100000000000080010000000000008001000000000000
+ C003000000000000FFFF000000000000FFFFFFFFFFFFFFFFF83FF83FC003C003
+ E00FE00F80018001C007C0078001800180038003800180018003800380018001
+ 0001000180018001000100018001800100010001800180010001000180018001
+ 000100018001800180038003800180018003800380018001C007C00780018001
+ E00FE00FC003C003F83FF83FFFFFFFFF00000000000000000000000000000000
+ 000000000000}
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.lfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.lfm
new file mode 100644
index 0000000..41d65f9
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.lfm
@@ -0,0 +1,304 @@
+object ReconcileDialogForm: TReconcileDialogForm
+ Left = 327
+ Height = 357
+ Top = 206
+ Width = 515
+ ActiveControl = TreeView
+ BorderStyle = bsDialog
+ Caption = 'One or more updates failed to apply on the server...'
+ ClientHeight = 357
+ ClientWidth = 515
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ Position = poOwnerFormCenter
+ LCLVersion = '0.9.29'
+ object Label1: TLabel
+ Left = 264
+ Height = 40
+ Top = 154
+ Width = 239
+ Caption = 'Skip over this change and ignore the error. You can try and correct the problem by modifying data, or reapply the change again at a later time.'
+ ParentColor = False
+ WordWrap = True
+ end
+ object Label2: TLabel
+ Left = 264
+ Height = 27
+ Top = 210
+ Width = 210
+ Caption = 'Cancel the changes you made and restore the record to it''s original values.'
+ ParentColor = False
+ WordWrap = True
+ end
+ object Label3: TLabel
+ Left = 264
+ Height = 40
+ Top = 266
+ Width = 231
+ Caption = 'Show a dialog with details of the changes made to the record since it was last retrieved from or applied to the server.'
+ ParentColor = False
+ WordWrap = True
+ end
+ object SkipButton: TButton
+ Left = 161
+ Height = 25
+ Top = 154
+ Width = 96
+ BorderSpacing.InnerBorder = 4
+ Caption = '&Skip Change'
+ OnClick = SkipButtonClick
+ TabOrder = 3
+ end
+ object CancelButton: TButton
+ Left = 161
+ Height = 25
+ Top = 210
+ Width = 96
+ BorderSpacing.InnerBorder = 4
+ Caption = '&Cancel Change'
+ OnClick = CancelButtonClick
+ TabOrder = 4
+ end
+ object SkipAllButton: TButton
+ Left = 0
+ Height = 25
+ Top = 332
+ Width = 75
+ Anchors = [akLeft, akBottom]
+ BorderSpacing.InnerBorder = 4
+ Caption = 'Skip &All'
+ OnClick = SkipAllButtonClick
+ TabOrder = 1
+ end
+ object CancelAllButton: TButton
+ Left = 80
+ Height = 25
+ Top = 332
+ Width = 75
+ Anchors = [akLeft, akBottom]
+ BorderSpacing.InnerBorder = 4
+ Caption = 'Cancel A&ll'
+ OnClick = CancelAllButtonClick
+ TabOrder = 2
+ end
+ object ShowDetailButton: TButton
+ Left = 161
+ Height = 25
+ Top = 266
+ Width = 96
+ BorderSpacing.InnerBorder = 4
+ Caption = 'Show &Details'
+ OnClick = ShowDetailButtonClick
+ TabOrder = 5
+ end
+ object TreeView: TTreeView
+ Left = 0
+ Height = 327
+ Top = 0
+ Width = 155
+ Anchors = [akTop, akLeft, akBottom]
+ DefaultItemHeight = 16
+ HideSelection = False
+ Indent = 20
+ RightClickSelect = True
+ RowSelect = True
+ ShowButtons = False
+ ShowLines = False
+ ShowRoot = False
+ StateImages = ImageList
+ TabOrder = 0
+ OnClick = ListBoxClick
+ Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoRightClickSelect, tvoRowSelect, tvoToolTips]
+ end
+ object btn_Cancel: TButton
+ Left = 440
+ Height = 25
+ Top = 332
+ Width = 75
+ Anchors = [akRight, akBottom]
+ BorderSpacing.InnerBorder = 4
+ Cancel = True
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 6
+ end
+ object memMessageError: TMemo
+ Left = 161
+ Height = 146
+ Top = 0
+ Width = 342
+ Color = clBtnFace
+ ScrollBars = ssAutoVertical
+ TabOrder = 7
+ TabStop = False
+ end
+ object ImageList: TImageList
+ left = 59
+ top = 124
+ Bitmap = {
+ 4C69050000001000000010000000000000000000000000000000000000000000
+ 000000B800FF00B600FF00AE00FF00AD00FF00A601FF00000000000000000000
+ 000000000000000000000000000000000000000000000000000000B800FF47CB
+ 49FF84DA91FF8CDCA6FF6AD391FF4ECB7FFF2DBF61FF17B136FF049C0AFF0000
+ 000000000000000000000000000000000000000000000FBC10FF77D780FF98E0
+ ADFF76D798FF5ACE86FF3AC573FF2EC26BFF2EC26BFF2EC26BFF28BD5EFF0998
+ 17FF0000000000000000000000000000000000B700FF75D683FF82DAA0FF66D2
+ 8EFF44C879FF3AC573FF2EC26BFF2EC26BFF2EC26BFF28BD5EFF2BBF64FF2BBF
+ 64FF03870AFF00000000000000000000000031BE3CFF72D595FF52CC82FF35C4
+ 70FF3AC573FF2EC26BFF2EC26BFF2EC26BFF2EC26BFFFFFFFFFF2BBF64FF2DC2
+ 6AFF1AA73EFF000000000000000000AD00FF44C665FF3FC776FF2EC26BFF3AC5
+ 73FF2EC26BFF2EC26BFF2EC26BFF2EC26BFFFFFFFFFFFFFFFFFF2BBF64FF25BF
+ 5AFF23BE57FF047E0DFF0000000000A401FF33C36EFF2EC26BFF2EC26BFFFFFF
+ FFFF2EC26BFF2EC26BFF2EC26BFFFFFFFFFFFFFFFFFFFFFFFFFF2BBF64FF21BD
+ 51FF1CBA45FF077F13FF0000000000A001FF2EC26BFF2EC26BFF2EC26BFFFFFF
+ FFFFFFFFFFFF2EC26BFFFFFFFFFFFFFFFFFFFFFFFFFF1ABA43FF1ABA43FF1BBA
+ 44FF17B83AFF0A8D1BFF00000000009701FF2EC26BFF2EC26BFF2EC26BFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1ABA43FF1ABA43FF0EB426FF14B7
+ 34FF11B62FFF057710FF00000000009102FF28BB5EFF2EC26BFF2EC26BFF2EC2
+ 6BFFFFFFFFFFFFFFFFFFFFFFFFFF1ABA43FF1ABA43FF15B838FF12B630FF0FB5
+ 2AFF0AB21DFF026708FF000000000000000017A437FF2EC26BFF2CC166FF25BF
+ 5AFF21BD51FFFFFFFFFF1ABA43FF12B630FF13B631FF11B62EFF0BB321FF09B2
+ 1CFF059712FF00000000000000000000000004860BFF23B753FF24BE58FF21BD
+ 51FF1CBA45FF1ABA43FF12B630FF0EB426FF0EB426FF0AB21DFF07B118FF02AE
+ 0DFF005F04FF00000000000000000000000000000000078414FF1CB645FF1BBA
+ 44FF17B83AFF12B630FF0EB426FF1AB72DFF08B21BFF04AF11FF00AD09FF0067
+ 05FF000000000000000000000000000000000000000000000000027108FF0C98
+ 22FF11B62FFF0DB425FF09B21CFF06B016FF01AE0BFF009107FF005B04FF0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000015F05FF026909FF026407FF005E04FF004D03FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00003131FBFF3131FBFF3131FBFF3131FBFF3131FBFF00000000000000000000
+ 00000000000000000000000000000000000000000000000000003131FBFF3131
+ FBFF6969FEFF8787FFFF9292FFFF7676FFFF5353FFFF5151F3FF3131FBFF0000
+ 000000000000000000000000000000000000000000003131FBFF4949FDFF6E6E
+ FFFF9191FFFF9393FFFF8484FFFF7676FFFF6767FFFF5151FFFF3131FBFF3131
+ FBFF000000000000000000000000000000003131FBFF3E3EFBFF5353FFFF6868
+ EFFF5757F9FF3838FFFF2525FDFF2929FFFF3838FCFF4242EBFF3232FFFF1F1F
+ E9FF3131FBFF0000000000000000000000003131FBFF3232FFFF5252EDFFB3B3
+ C2FF7777CAFF0000EAFF0000ECFF0000E8FF5252B4FFADADB0FF4D4DE1FF1818
+ EDFF1818B1FF00000000000000004B4BD3FF2626E5FF2222FBFF3F3FE9FFDCDC
+ E5FFFDFDEEFF7373C5FF0303D7FF5151B0FFE3E3D6FFFFFFFEFF6161E5FF0808
+ DBFF0F0FCAFF121279FF000000004B4BD3FF1414D8FF1717EAFF0B0BF1FF4343
+ DBFFE4E4EAFFFDFDF5FFBABAD4FFEAEAE8FFFEFEFFFF6363E5FF0303D7FF0A0A
+ CFFF0A0AC3FF21217FFF000000004B4BD3FF0C0CC9FF0D0DD8FF0B0BDCFF0000
+ D6FF3C3DCEFFEEEFEDFFFFFFFFFFFFFFFDFF5858DBFF0000CAFF0303CBFF0606
+ C5FF0606B8FF121279FF000000004B4BD3FF0808BBFF0707C8FF0505D1FF0000
+ C8FF5353B6FFF2F2EDFFFFFFFFFFFFFFFCFF7575C9FF0000BEFF0101C3FF0303
+ B8FF0303ACFF10106FFF000000004B4BD3FF0707B1FF0303B9FF0000C2FF4C4C
+ A7FFE6E6D9FFFCFCFFFF9E9EE6FFE8E9F4FFFFFFF1FF7575B9FF0606B1FF0101
+ ABFF0202A0FF13145DFF00000000000000002929ACFF0000ABFF2828A3FFDEDE
+ D2FFFEFEFFFF6464D4FF0000B3FF4646C0FFE7E7ECFFFFFFF7FF5E5EB7FF0000
+ 9AFF020287FF0000000000000000000000002929ACFF0101A3FF08089EFF9999
+ D4FF6868D0FF0000ACFF0000AEFF0000A9FF4848B8FFB7B7E3FF2727A5FF0000
+ 8CFF010152FF000000000000000000000000000000002929ACFF000096FF0000
+ 97FF00009BFF00009FFF0000A0FF00009DFF000097FF00008FFF000088FF0000
+ 62FF0000000000000000000000000000000000000000000000002929ACFF0000
+ 84FF00008EFF00008EFF00008FFF00008CFF000088FF000081FF010154FF0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00002C2C6CFF050563FF000065FF000060FF00004FFF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000001DEEFF092DFFFF0F35
+ FFFF092DFFFF0528FFFF0224FFFF001DEEFF001BD9FF001AD5FF0018CAFF001A
+ D5FF0016B5FF0000000000000000000000000018CAFF5877FFFF7F98FFFF839C
+ FFFF7690FFFF6682FFFF4E6EFFFF284CFFFF0F35FFFF0224FFFF001FF9FF001F
+ F9FF001CE2FF0013A0FF00000000000000000018CAFF7F98FFFF728CFFFF5676
+ FFFF4163FFFF3559FFFF284CFFFF163BFFFF0224FFFF001FF9FF001DEEFF001E
+ F0FF001BD9FF0013A0FF00000000000000000018CAFF7690FFFF4163FFFF193F
+ FFFF163BFFFF092DFFFF0528FFFF0224FFFF0224FFFF001EF0FF001DEEFF001C
+ E2FF0018CAFF001187FF00000000000000000018CAFF6682FFFF2D51FFFF163B
+ FFFF0F35FFFF0224FFFFFFFFFFFFFFFFFFFF001DEEFF001CE2FF001CE2FF001B
+ D9FF0017B9FF000F7AFF00000000000000000018CAFF5A79FFFF2146FFFF092D
+ FFFF0224FFFF001EF0FFFFFFFFFFFFFFFFFF001CE2FF001BD9FF0018CAFF0018
+ CAFF0016B5FF000D6CFF00000000000000000018CAFF4E6EFFFF193FFFFF0224
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0018C6FF0018
+ C6FF0013A0FF000A51FF00000000000000000018CAFF3559FFFF0F35FFFF0224
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0017B9FF0016
+ B5FF0013A0FF000A4FFF00000000000000000018CAFF163BFFFF0528FFFF001E
+ F0FF001CE2FF001BD9FFFFFFFFFFFFFFFFFF0017B9FF0016B5FF0015AAFF0015
+ AAFF0013A0FF000A4FFF00000000000000000018CAFF0224FFFF001EF0FF001C
+ E2FF001AD5FF0018C6FFFFFFFFFFF4F7FFFF0016B5FF0015AAFF0013A0FF0017
+ B9FF001397FF000A4FFF00000000000000000018C6FF001EF0FF001CE2FF001A
+ D5FF0018C6FF0018C6FF0016B5FF0016B5FF0015AAFF0013A0FF0015AAFF0015
+ AAFF0013A0FF000A4FFF00000000000000000017B9FF001CE2FF001AD5FF0018
+ CAFF0018C6FF0016B5FF0016B5FF0015AAFF0015AAFF0016B5FF0015AAFF0016
+ B5FF0013A0FF000A4FFF0000000000000000001397FF0017B9FF0016B5FF0015
+ AAFF0013A0FF0013A0FF001397FF001397FF0013A0FF001397FF001397FF0013
+ A0FF000F7AFF000840FF000000000000000000000000000D6CFF000D6CFF000C
+ 5DFF000A51FF000A4FFF000A4FFF000A4FFF000A4FFF000A4FFF000A4FFF000A
+ 4FFF000840FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000001DEEFF092DFFFF0F35
+ FFFF092DFFFF0528FFFF0224FFFF001DEEFF001BD9FF001AD1FF0019CCFF0019
+ CCFF0017B9FF0000000000000000000000000019CCFF5877FFFF7F98FFFF839C
+ FFFF7690FFFF6681F8FF4D6DFFFF294DFFFF0F35FFFF001FFFFF001FFFFF001F
+ FFFF001BD9FF0013A0FF00000000000000000019CCFF7F98FFFF728CFFFF5676
+ FFFF4163FFFF3559FFFF2449FFFF193FFFFF0224FFFF0224FFFF001EF0FF001E
+ F0FF001BD9FF0013A0FF00000000000000000019CCFF7690FFFF4163FFFF193F
+ FFFF163BFFFF092DFFFF0528FFFF0224FFFF1C41FFFFEAEEFAFFC1CCFBFF001C
+ E2FF0019CCFF001187FF00000000000000000019CCFF6681F8FF2D51FFFF163B
+ FFFF0F35FFFF0224FFFF001FFFFF0528FFFFEAEEFAFFFFFFFFFFEAEEFAFF001B
+ D9FF0017B9FF000F7AFF00000000000000000019CCFF5A79FFFF2146FFFF092D
+ FFFF294DFFFF6681F8FF4565F4FFC1CCFBFFFFFFFFFFEAEEFAFF1C3BD5FF0019
+ CCFF0016B5FF000D6CFF00000000000000000019CCFF4D6DFFFF193FFFFF4D6D
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEEFAFF1C3BD5FF0018C6FF0017
+ B9FF0015AAFF000A51FF00000000000000000019CCFF3559FFFF0F35FFFFFFFF
+ FFFFFFFFFFFF768FF3FFEAEEFAFFFFFFFFFF889CEBFF0018C6FF0016B5FF0016
+ B5FF0013A0FF000A4FFF00000000000000000019CCFF163BFFFF0528FFFFFFFF
+ FFFF768FF3FF001AD1FF3654DEFFFFFFFFFFADBBEEFF0016B5FF0015AAFF0016
+ B5FF001397FF000A4FFF00000000000000000019CCFF0224FFFF001EF0FF9AAC
+ F6FF0624D7FF0019CCFF9AAAEBFFFFFFFFFF8899E0FF0015AAFF0015AAFF0015
+ AAFF0013A0FF000A4FFF00000000000000000018C6FF001EF0FF001CE2FF001A
+ D1FF0018C6FF3653D3FFEAEEFAFF8899E0FF061FAFFF0013A0FF0015AAFF0015
+ AAFF0013A0FF000A4FFF00000000000000000017B9FF001CE2FF001AD1FF0019
+ CCFF0018C6FF0016B5FF0016B5FF0015AAFF0015AAFF0016B5FF0015AAFF0016
+ B5FF0013A0FF000A4FFF0000000000000000001397FF0017B9FF0016B5FF0015
+ AAFF0013A0FF0013A0FF001397FF001397FF0013A0FF001397FF001397FF0013
+ A0FF000F7AFF000840FF000000000000000000000000000D6CFF000D6CFF000C
+ 5DFF000A51FF000A4FFF000A4FFF000A4FFF000A4FFF000A4FFF000A4FFF000A
+ 4FFF000840FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000001DEEFF092DFFFF0F35
+ FFFF092DFFFF0528FFFF0224FFFF001DEEFF001CDEFF001AD5FF0018CAFF001A
+ D5FF0016B5FF0000000000000000000000000018CAFF5877FFFF7F98FFFF839C
+ FFFF7690FFFF6682FFFF4E6EFFFF284CFFFF0F35FFFF0224FFFF001FFFFF001D
+ EEFF001CE2FF0013A0FF00000000000000000018CAFF7F98FFFF728CFFFF5676
+ FFFF4163FFFF3559FFFF284CFFFF163BFFFF0224FFFF001FFFFF001DEEFF001D
+ EEFF001CDEFF001397FF00000000000000000018CAFF7690FFFF4163FFFF193F
+ FFFF163BFFFF092DFFFF0528FFFF0224FFFF0224FFFF001DEEFF001DEEFF001C
+ E2FF0018C6FF001187FF00000000000000000018CAFF6682FFFF2D51FFFF163B
+ FFFF0F35FFFF0224FFFF001FFFFF001EF0FF001EF0FF001DEEFF001CDEFF001C
+ DEFF0017B9FF000F7AFF00000000000000000018CAFF5A79FFFF2146FFFF092D
+ FFFF0224FFFF001EF0FF001DEEFF001DEEFF001CE2FF001AD5FF0018CAFF0018
+ CAFF0016B5FF000D6CFF00000000000000000018CAFF4E6EFFFF193FFFFF0224
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0018C6FF0018
+ C6FF00139DFF000C5DFF00000000000000000018CAFF3559FFFF0F35FFFF0224
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0017B9FF0016
+ B5FF0013A0FF000A4FFF00000000000000000018CAFF163BFFFF0528FFFF001E
+ F0FF001CE2FF001AD5FF0018CAFF0018CAFF0017B9FF0016B5FF0015AAFF0015
+ AAFF0013A0FF000A4FFF00000000000000000018CAFF0224FFFF001EF0FF001C
+ E2FF001AD5FF0018CAFF0018C6FF0016B5FF0016B5FF0015AAFF0013A0FF0017
+ B9FF001397FF000A4FFF00000000000000000018C6FF001EF0FF001CE2FF001A
+ D5FF0018C6FF0018C6FF0016B5FF0016B5FF0015AAFF0013A0FF0015AAFF0015
+ AAFF0013A0FF000A4FFF00000000000000000017B9FF001CE2FF001AD5FF0018
+ CAFF0018C6FF0016B5FF0016B5FF0015AAFF0015AAFF0016B5FF0015AAFF0016
+ B5FF0013A0FF000A4FFF0000000000000000001397FF0017B9FF0016B5FF0015
+ AAFF0013A0FF0013A0FF001397FF001397FF0013A0FF001397FF001397FF0013
+ A0FF000F7AFF000840FF000000000000000000000000000D6CFF000D6CFF000C
+ 5DFF000A51FF000A4FFF000A4FFF000A4FFF000A4FFF000A4FFF000A4FFF000A
+ 4FFF000840FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000
+ }
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.lrs
new file mode 100644
index 0000000..bb7bcf8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.lrs
@@ -0,0 +1,249 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TReconcileDialogForm','FORMDATA',[
+ 'TPF0'#20'TReconcileDialogForm'#19'ReconcileDialogForm'#4'Left'#3'G'#1#6'Heig'
+ +'ht'#3'e'#1#3'Top'#3#206#0#5'Width'#3#3#2#13'ActiveControl'#7#8'TreeView'#11
+ +'BorderStyle'#7#8'bsDialog'#7'Caption'#6'4One or more updates failed to appl'
+ +'y on the server...'#12'ClientHeight'#3'e'#1#11'ClientWidth'#3#3#2#11'Font.H'
+ +'eight'#2#245#9'Font.Name'#6#6'Tahoma'#8'OnCreate'#7#10'FormCreate'#9'OnDest'
+ +'roy'#7#11'FormDestroy'#8'Position'#7#17'poOwnerFormCenter'#10'LCLVersion'#6
+ +#6'0.9.29'#0#6'TLabel'#6'Label1'#4'Left'#3#8#1#6'Height'#2'('#3'Top'#3#154#0
+ +#5'Width'#3#239#0#7'Caption'#6#143'Skip over this change and ignore the erro'
+ +'r. You can try and correct the problem by modifying data, or reapply the ch'
+ +'ange again at a later time.'#11'ParentColor'#8#8'WordWrap'#9#0#0#6'TLabel'#6
+ +'Label2'#4'Left'#3#8#1#6'Height'#2#27#3'Top'#3#210#0#5'Width'#3#210#0#7'Capt'
+ +'ion'#6'LCancel the changes you made and restore the record to it''s origin'
+ +'al values.'#11'ParentColor'#8#8'WordWrap'#9#0#0#6'TLabel'#6'Label3'#4'Left'
+ +#3#8#1#6'Height'#2'('#3'Top'#3#10#1#5'Width'#3#231#0#7'Caption'#6'wShow a di'
+ +'alog with details of the changes made to the record since it was last retri'
+ +'eved from or applied to the server.'#11'ParentColor'#8#8'WordWrap'#9#0#0#7
+ +'TButton'#10'SkipButton'#4'Left'#3#161#0#6'Height'#2#25#3'Top'#3#154#0#5'Wid'
+ +'th'#2'`'#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#12'&Skip Change'#7
+ +'OnClick'#7#15'SkipButtonClick'#8'TabOrder'#2#3#0#0#7'TButton'#12'CancelButt'
+ +'on'#4'Left'#3#161#0#6'Height'#2#25#3'Top'#3#210#0#5'Width'#2'`'#25'BorderSp'
+ +'acing.InnerBorder'#2#4#7'Caption'#6#14'&Cancel Change'#7'OnClick'#7#17'Canc'
+ +'elButtonClick'#8'TabOrder'#2#4#0#0#7'TButton'#13'SkipAllButton'#4'Left'#2#0
+ +#6'Height'#2#25#3'Top'#3'L'#1#5'Width'#2'K'#7'Anchors'#11#6'akLeft'#8'akBott'
+ +'om'#0#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#9'Skip &All'#7'OnClick'
+ +#7#18'SkipAllButtonClick'#8'TabOrder'#2#1#0#0#7'TButton'#15'CancelAllButton'
+ +#4'Left'#2'P'#6'Height'#2#25#3'Top'#3'L'#1#5'Width'#2'K'#7'Anchors'#11#6'akL'
+ +'eft'#8'akBottom'#0#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#11'Cancel'
+ +' A&ll'#7'OnClick'#7#20'CancelAllButtonClick'#8'TabOrder'#2#2#0#0#7'TButton'
+ +#16'ShowDetailButton'#4'Left'#3#161#0#6'Height'#2#25#3'Top'#3#10#1#5'Width'#2
+ +'`'#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#13'Show &Details'#7'OnCli'
+ +'ck'#7#21'ShowDetailButtonClick'#8'TabOrder'#2#5#0#0#9'TTreeView'#8'TreeView'
+ +#4'Left'#2#0#6'Height'#3'G'#1#3'Top'#2#0#5'Width'#3#155#0#7'Anchors'#11#5'ak'
+ +'Top'#6'akLeft'#8'akBottom'#0#17'DefaultItemHeight'#2#16#13'HideSelection'#8
+ +#6'Indent'#2#20#16'RightClickSelect'#9#9'RowSelect'#9#11'ShowButtons'#8#9'Sh'
+ +'owLines'#8#8'ShowRoot'#8#11'StateImages'#7#9'ImageList'#8'TabOrder'#2#0#7'O'
+ +'nClick'#7#12'ListBoxClick'#7'Options'#11#17'tvoAutoItemHeight'#21'tvoKeepCo'
+ +'llapsedNodes'#19'tvoRightClickSelect'#12'tvoRowSelect'#11'tvoToolTips'#0#0#0
+ +#7'TButton'#10'btn_Cancel'#4'Left'#3#184#1#6'Height'#2#25#3'Top'#3'L'#1#5'Wi'
+ +'dth'#2'K'#7'Anchors'#11#7'akRight'#8'akBottom'#0#25'BorderSpacing.InnerBord'
+ +'er'#2#4#6'Cancel'#9#7'Caption'#6#6'Cancel'#11'ModalResult'#2#2#8'TabOrder'#2
+ +#6#0#0#5'TMemo'#15'memMessageError'#4'Left'#3#161#0#6'Height'#3#146#0#3'Top'
+ +#2#0#5'Width'#3'V'#1#5'Color'#7#9'clBtnFace'#10'ScrollBars'#7#14'ssAutoVerti'
+ +'cal'#8'TabOrder'#2#7#7'TabStop'#8#0#0#10'TImageList'#9'ImageList'#4'left'#2
+ +';'#3'top'#2'|'#6'Bitmap'#10#14#20#0#0'Li'#5#0#0#0#16#0#0#0#16#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#184#0#255#0#182#0#255#0#174#0#255#0#173#0
+ +#255#0#166#1#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#184#0#255'G'#203'I'#255#132#218#145#255#140#220#166#255'j'#211
+ +#145#255'N'#203#127#255'-'#191'a'#255#23#177'6'#255#4#156#10#255#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#188#16#255'w'#215#128#255#152#224#173
+ +#255'v'#215#152#255'Z'#206#134#255':'#197's'#255'.'#194'k'#255'.'#194'k'#255
+ +'.'#194'k'#255'('#189'^'#255#9#152#23#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#183#0#255'u'#214#131#255#130#218#160#255'f'#210#142#255'D'#200'y'#255':'#197
+ +'s'#255'.'#194'k'#255'.'#194'k'#255'.'#194'k'#255'('#189'^'#255'+'#191'd'#255
+ +'+'#191'd'#255#3#135#10#255#0#0#0#0#0#0#0#0#0#0#0#0'1'#190'<'#255'r'#213#149
+ +#255'R'#204#130#255'5'#196'p'#255':'#197's'#255'.'#194'k'#255'.'#194'k'#255
+ +'.'#194'k'#255'.'#194'k'#255#255#255#255#255'+'#191'd'#255'-'#194'j'#255#26
+ +#167'>'#255#0#0#0#0#0#0#0#0#0#173#0#255'D'#198'e'#255'?'#199'v'#255'.'#194'k'
+ +#255':'#197's'#255'.'#194'k'#255'.'#194'k'#255'.'#194'k'#255'.'#194'k'#255
+ +#255#255#255#255#255#255#255#255'+'#191'd'#255'%'#191'Z'#255'#'#190'W'#255#4
+ +'~'#13#255#0#0#0#0#0#164#1#255'3'#195'n'#255'.'#194'k'#255'.'#194'k'#255#255
+ +#255#255#255'.'#194'k'#255'.'#194'k'#255'.'#194'k'#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255'+'#191'd'#255'!'#189'Q'#255#28#186'E'#255#7#127
+ +#19#255#0#0#0#0#0#160#1#255'.'#194'k'#255'.'#194'k'#255'.'#194'k'#255#255#255
+ +#255#255#255#255#255#255'.'#194'k'#255#255#255#255#255#255#255#255#255#255
+ ,#255#255#255#26#186'C'#255#26#186'C'#255#27#186'D'#255#23#184':'#255#10#141
+ +#27#255#0#0#0#0#0#151#1#255'.'#194'k'#255'.'#194'k'#255'.'#194'k'#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#26
+ +#186'C'#255#26#186'C'#255#14#180'&'#255#20#183'4'#255#17#182'/'#255#5'w'#16
+ +#255#0#0#0#0#0#145#2#255'('#187'^'#255'.'#194'k'#255'.'#194'k'#255'.'#194'k'
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#26#186'C'#255#26#186'C'
+ +#255#21#184'8'#255#18#182'0'#255#15#181'*'#255#10#178#29#255#2'g'#8#255#0#0#0
+ +#0#0#0#0#0#23#164'7'#255'.'#194'k'#255','#193'f'#255'%'#191'Z'#255'!'#189'Q'
+ +#255#255#255#255#255#26#186'C'#255#18#182'0'#255#19#182'1'#255#17#182'.'#255
+ +#11#179'!'#255#9#178#28#255#5#151#18#255#0#0#0#0#0#0#0#0#0#0#0#0#4#134#11#255
+ +'#'#183'S'#255'$'#190'X'#255'!'#189'Q'#255#28#186'E'#255#26#186'C'#255#18#182
+ +'0'#255#14#180'&'#255#14#180'&'#255#10#178#29#255#7#177#24#255#2#174#13#255#0
+ +'_'#4#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7#132#20#255#28#182'E'#255#27#186
+ +'D'#255#23#184':'#255#18#182'0'#255#14#180'&'#255#26#183'-'#255#8#178#27#255
+ +#4#175#17#255#0#173#9#255#0'g'#5#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#2'q'#8#255#12#152'"'#255#17#182'/'#255#13#180'%'#255#9#178#28#255#6
+ +#176#22#255#1#174#11#255#0#145#7#255#0'['#4#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'_'#5#255#2'i'#9#255#2'd'#7#255#0
+ +'^'#4#255#0'M'#3#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0'11'#251#255'11'#251#255'11'#251#255'11'#251#255'11'#251#255#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'11'#251#255
+ +'11'#251#255'ii'#254#255#135#135#255#255#146#146#255#255'vv'#255#255'SS'#255
+ +#255'QQ'#243#255'11'#251#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +'11'#251#255'II'#253#255'nn'#255#255#145#145#255#255#147#147#255#255#132#132
+ +#255#255'vv'#255#255'gg'#255#255'QQ'#255#255'11'#251#255'11'#251#255#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0'11'#251#255'>>'#251#255'SS'#255#255'hh'#239#255'WW'
+ +#249#255'88'#255#255'%%'#253#255'))'#255#255'88'#252#255'BB'#235#255'22'#255
+ +#255#31#31#233#255'11'#251#255#0#0#0#0#0#0#0#0#0#0#0#0'11'#251#255'22'#255
+ +#255'RR'#237#255#179#179#194#255'ww'#202#255#0#0#234#255#0#0#236#255#0#0#232
+ +#255'RR'#180#255#173#173#176#255'MM'#225#255#24#24#237#255#24#24#177#255#0#0
+ +#0#0#0#0#0#0'KK'#211#255'&&'#229#255'""'#251#255'??'#233#255#220#220#229#255
+ +#253#253#238#255'ss'#197#255#3#3#215#255'QQ'#176#255#227#227#214#255#255#255
+ +#254#255'aa'#229#255#8#8#219#255#15#15#202#255#18#18'y'#255#0#0#0#0'KK'#211
+ +#255#20#20#216#255#23#23#234#255#11#11#241#255'CC'#219#255#228#228#234#255
+ +#253#253#245#255#186#186#212#255#234#234#232#255#254#254#255#255'cc'#229#255
+ +#3#3#215#255#10#10#207#255#10#10#195#255'!!'#127#255#0#0#0#0'KK'#211#255#12
+ +#12#201#255#13#13#216#255#11#11#220#255#0#0#214#255'<='#206#255#238#239#237
+ +#255#255#255#255#255#255#255#253#255'XX'#219#255#0#0#202#255#3#3#203#255#6#6
+ +#197#255#6#6#184#255#18#18'y'#255#0#0#0#0'KK'#211#255#8#8#187#255#7#7#200#255
+ +#5#5#209#255#0#0#200#255'SS'#182#255#242#242#237#255#255#255#255#255#255#255
+ +#252#255'uu'#201#255#0#0#190#255#1#1#195#255#3#3#184#255#3#3#172#255#16#16'o'
+ +#255#0#0#0#0'KK'#211#255#7#7#177#255#3#3#185#255#0#0#194#255'LL'#167#255#230
+ +#230#217#255#252#252#255#255#158#158#230#255#232#233#244#255#255#255#241#255
+ +'uu'#185#255#6#6#177#255#1#1#171#255#2#2#160#255#19#20']'#255#0#0#0#0#0#0#0#0
+ +'))'#172#255#0#0#171#255'(('#163#255#222#222#210#255#254#254#255#255'dd'#212
+ +#255#0#0#179#255'FF'#192#255#231#231#236#255#255#255#247#255'^^'#183#255#0#0
+ +#154#255#2#2#135#255#0#0#0#0#0#0#0#0#0#0#0#0'))'#172#255#1#1#163#255#8#8#158
+ +#255#153#153#212#255'hh'#208#255#0#0#172#255#0#0#174#255#0#0#169#255'HH'#184
+ +#255#183#183#227#255''''''#165#255#0#0#140#255#1#1'R'#255#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0'))'#172#255#0#0#150#255#0#0#151#255#0#0#155#255#0#0#159#255#0#0
+ +#160#255#0#0#157#255#0#0#151#255#0#0#143#255#0#0#136#255#0#0'b'#255#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'))'#172#255#0#0#132#255#0#0#142#255#0
+ +#0#142#255#0#0#143#255#0#0#140#255#0#0#136#255#0#0#129#255#1#1'T'#255#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0',,l'#255#5#5
+ +'c'#255#0#0'e'#255#0#0'`'#255#0#0'O'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#29#238#255#9'-'
+ +#255#255#15'5'#255#255#9'-'#255#255#5'('#255#255#2'$'#255#255#0#29#238#255#0
+ +#27#217#255#0#26#213#255#0#24#202#255#0#26#213#255#0#22#181#255#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#24#202#255'Xw'#255#255#127#152#255#255#131#156#255#255'v'#144
+ ,#255#255'f'#130#255#255'Nn'#255#255'(L'#255#255#15'5'#255#255#2'$'#255#255#0
+ +#31#249#255#0#31#249#255#0#28#226#255#0#19#160#255#0#0#0#0#0#0#0#0#0#24#202
+ +#255#127#152#255#255'r'#140#255#255'Vv'#255#255'Ac'#255#255'5Y'#255#255'(L'
+ +#255#255#22';'#255#255#2'$'#255#255#0#31#249#255#0#29#238#255#0#30#240#255#0
+ +#27#217#255#0#19#160#255#0#0#0#0#0#0#0#0#0#24#202#255'v'#144#255#255'Ac'#255
+ +#255#25'?'#255#255#22';'#255#255#9'-'#255#255#5'('#255#255#2'$'#255#255#2'$'
+ +#255#255#0#30#240#255#0#29#238#255#0#28#226#255#0#24#202#255#0#17#135#255#0#0
+ +#0#0#0#0#0#0#0#24#202#255'f'#130#255#255'-Q'#255#255#22';'#255#255#15'5'#255
+ +#255#2'$'#255#255#255#255#255#255#255#255#255#255#0#29#238#255#0#28#226#255#0
+ +#28#226#255#0#27#217#255#0#23#185#255#0#15'z'#255#0#0#0#0#0#0#0#0#0#24#202
+ +#255'Zy'#255#255'!F'#255#255#9'-'#255#255#2'$'#255#255#0#30#240#255#255#255
+ +#255#255#255#255#255#255#0#28#226#255#0#27#217#255#0#24#202#255#0#24#202#255
+ +#0#22#181#255#0#13'l'#255#0#0#0#0#0#0#0#0#0#24#202#255'Nn'#255#255#25'?'#255
+ +#255#2'$'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#0#24#198#255#0#24#198#255#0#19#160#255#0
+ +#10'Q'#255#0#0#0#0#0#0#0#0#0#24#202#255'5Y'#255#255#15'5'#255#255#2'$'#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#0#23#185#255#0#22#181#255#0#19#160#255#0#10'O'#255#0
+ +#0#0#0#0#0#0#0#0#24#202#255#22';'#255#255#5'('#255#255#0#30#240#255#0#28#226
+ +#255#0#27#217#255#255#255#255#255#255#255#255#255#0#23#185#255#0#22#181#255#0
+ +#21#170#255#0#21#170#255#0#19#160#255#0#10'O'#255#0#0#0#0#0#0#0#0#0#24#202
+ +#255#2'$'#255#255#0#30#240#255#0#28#226#255#0#26#213#255#0#24#198#255#255#255
+ +#255#255#244#247#255#255#0#22#181#255#0#21#170#255#0#19#160#255#0#23#185#255
+ +#0#19#151#255#0#10'O'#255#0#0#0#0#0#0#0#0#0#24#198#255#0#30#240#255#0#28#226
+ +#255#0#26#213#255#0#24#198#255#0#24#198#255#0#22#181#255#0#22#181#255#0#21
+ +#170#255#0#19#160#255#0#21#170#255#0#21#170#255#0#19#160#255#0#10'O'#255#0#0
+ +#0#0#0#0#0#0#0#23#185#255#0#28#226#255#0#26#213#255#0#24#202#255#0#24#198#255
+ +#0#22#181#255#0#22#181#255#0#21#170#255#0#21#170#255#0#22#181#255#0#21#170
+ +#255#0#22#181#255#0#19#160#255#0#10'O'#255#0#0#0#0#0#0#0#0#0#19#151#255#0#23
+ +#185#255#0#22#181#255#0#21#170#255#0#19#160#255#0#19#160#255#0#19#151#255#0
+ +#19#151#255#0#19#160#255#0#19#151#255#0#19#151#255#0#19#160#255#0#15'z'#255#0
+ +#8'@'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#13'l'#255#0#13'l'#255#0#12']'#255#0#10'Q'
+ +#255#0#10'O'#255#0#10'O'#255#0#10'O'#255#0#10'O'#255#0#10'O'#255#0#10'O'#255
+ +#0#10'O'#255#0#8'@'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#29#238#255#9'-'#255#255#15'5'#255#255#9'-'#255#255#5'('#255#255#2'$'
+ +#255#255#0#29#238#255#0#27#217#255#0#26#209#255#0#25#204#255#0#25#204#255#0
+ +#23#185#255#0#0#0#0#0#0#0#0#0#0#0#0#0#25#204#255'Xw'#255#255#127#152#255#255
+ +#131#156#255#255'v'#144#255#255'f'#129#248#255'Mm'#255#255')M'#255#255#15'5'
+ +#255#255#0#31#255#255#0#31#255#255#0#31#255#255#0#27#217#255#0#19#160#255#0#0
+ +#0#0#0#0#0#0#0#25#204#255#127#152#255#255'r'#140#255#255'Vv'#255#255'Ac'#255
+ +#255'5Y'#255#255'$I'#255#255#25'?'#255#255#2'$'#255#255#2'$'#255#255#0#30#240
+ +#255#0#30#240#255#0#27#217#255#0#19#160#255#0#0#0#0#0#0#0#0#0#25#204#255'v'
+ +#144#255#255'Ac'#255#255#25'?'#255#255#22';'#255#255#9'-'#255#255#5'('#255
+ +#255#2'$'#255#255#28'A'#255#255#234#238#250#255#193#204#251#255#0#28#226#255
+ +#0#25#204#255#0#17#135#255#0#0#0#0#0#0#0#0#0#25#204#255'f'#129#248#255'-Q'
+ +#255#255#22';'#255#255#15'5'#255#255#2'$'#255#255#0#31#255#255#5'('#255#255
+ +#234#238#250#255#255#255#255#255#234#238#250#255#0#27#217#255#0#23#185#255#0
+ +#15'z'#255#0#0#0#0#0#0#0#0#0#25#204#255'Zy'#255#255'!F'#255#255#9'-'#255#255
+ +')M'#255#255'f'#129#248#255'Ee'#244#255#193#204#251#255#255#255#255#255#234
+ +#238#250#255#28';'#213#255#0#25#204#255#0#22#181#255#0#13'l'#255#0#0#0#0#0#0
+ +#0#0#0#25#204#255'Mm'#255#255#25'?'#255#255'Mm'#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#234#238#250#255#28';'#213#255#0
+ +#24#198#255#0#23#185#255#0#21#170#255#0#10'Q'#255#0#0#0#0#0#0#0#0#0#25#204
+ +#255'5Y'#255#255#15'5'#255#255#255#255#255#255#255#255#255#255'v'#143#243#255
+ +#234#238#250#255#255#255#255#255#136#156#235#255#0#24#198#255#0#22#181#255#0
+ +#22#181#255#0#19#160#255#0#10'O'#255#0#0#0#0#0#0#0#0#0#25#204#255#22';'#255
+ +#255#5'('#255#255#255#255#255#255'v'#143#243#255#0#26#209#255'6T'#222#255#255
+ +#255#255#255#173#187#238#255#0#22#181#255#0#21#170#255#0#22#181#255#0#19#151
+ +#255#0#10'O'#255#0#0#0#0#0#0#0#0#0#25#204#255#2'$'#255#255#0#30#240#255#154
+ +#172#246#255#6'$'#215#255#0#25#204#255#154#170#235#255#255#255#255#255#136
+ +#153#224#255#0#21#170#255#0#21#170#255#0#21#170#255#0#19#160#255#0#10'O'#255
+ ,#0#0#0#0#0#0#0#0#0#24#198#255#0#30#240#255#0#28#226#255#0#26#209#255#0#24#198
+ +#255'6S'#211#255#234#238#250#255#136#153#224#255#6#31#175#255#0#19#160#255#0
+ +#21#170#255#0#21#170#255#0#19#160#255#0#10'O'#255#0#0#0#0#0#0#0#0#0#23#185
+ +#255#0#28#226#255#0#26#209#255#0#25#204#255#0#24#198#255#0#22#181#255#0#22
+ +#181#255#0#21#170#255#0#21#170#255#0#22#181#255#0#21#170#255#0#22#181#255#0
+ +#19#160#255#0#10'O'#255#0#0#0#0#0#0#0#0#0#19#151#255#0#23#185#255#0#22#181
+ +#255#0#21#170#255#0#19#160#255#0#19#160#255#0#19#151#255#0#19#151#255#0#19
+ +#160#255#0#19#151#255#0#19#151#255#0#19#160#255#0#15'z'#255#0#8'@'#255#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#13'l'#255#0#13'l'#255#0#12']'#255#0#10'Q'#255#0#10'O'
+ +#255#0#10'O'#255#0#10'O'#255#0#10'O'#255#0#10'O'#255#0#10'O'#255#0#10'O'#255
+ +#0#8'@'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#29
+ +#238#255#9'-'#255#255#15'5'#255#255#9'-'#255#255#5'('#255#255#2'$'#255#255#0
+ +#29#238#255#0#28#222#255#0#26#213#255#0#24#202#255#0#26#213#255#0#22#181#255
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#24#202#255'Xw'#255#255#127#152#255#255#131#156#255
+ +#255'v'#144#255#255'f'#130#255#255'Nn'#255#255'(L'#255#255#15'5'#255#255#2'$'
+ +#255#255#0#31#255#255#0#29#238#255#0#28#226#255#0#19#160#255#0#0#0#0#0#0#0#0
+ +#0#24#202#255#127#152#255#255'r'#140#255#255'Vv'#255#255'Ac'#255#255'5Y'#255
+ +#255'(L'#255#255#22';'#255#255#2'$'#255#255#0#31#255#255#0#29#238#255#0#29
+ +#238#255#0#28#222#255#0#19#151#255#0#0#0#0#0#0#0#0#0#24#202#255'v'#144#255
+ +#255'Ac'#255#255#25'?'#255#255#22';'#255#255#9'-'#255#255#5'('#255#255#2'$'
+ +#255#255#2'$'#255#255#0#29#238#255#0#29#238#255#0#28#226#255#0#24#198#255#0
+ +#17#135#255#0#0#0#0#0#0#0#0#0#24#202#255'f'#130#255#255'-Q'#255#255#22';'#255
+ +#255#15'5'#255#255#2'$'#255#255#0#31#255#255#0#30#240#255#0#30#240#255#0#29
+ +#238#255#0#28#222#255#0#28#222#255#0#23#185#255#0#15'z'#255#0#0#0#0#0#0#0#0#0
+ +#24#202#255'Zy'#255#255'!F'#255#255#9'-'#255#255#2'$'#255#255#0#30#240#255#0
+ +#29#238#255#0#29#238#255#0#28#226#255#0#26#213#255#0#24#202#255#0#24#202#255
+ +#0#22#181#255#0#13'l'#255#0#0#0#0#0#0#0#0#0#24#202#255'Nn'#255#255#25'?'#255
+ +#255#2'$'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#0#24#198#255#0#24#198#255#0#19#157#255#0
+ +#12']'#255#0#0#0#0#0#0#0#0#0#24#202#255'5Y'#255#255#15'5'#255#255#2'$'#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#0#23#185#255#0#22#181#255#0#19#160#255#0#10'O'#255#0
+ +#0#0#0#0#0#0#0#0#24#202#255#22';'#255#255#5'('#255#255#0#30#240#255#0#28#226
+ +#255#0#26#213#255#0#24#202#255#0#24#202#255#0#23#185#255#0#22#181#255#0#21
+ +#170#255#0#21#170#255#0#19#160#255#0#10'O'#255#0#0#0#0#0#0#0#0#0#24#202#255#2
+ +'$'#255#255#0#30#240#255#0#28#226#255#0#26#213#255#0#24#202#255#0#24#198#255
+ +#0#22#181#255#0#22#181#255#0#21#170#255#0#19#160#255#0#23#185#255#0#19#151
+ +#255#0#10'O'#255#0#0#0#0#0#0#0#0#0#24#198#255#0#30#240#255#0#28#226#255#0#26
+ +#213#255#0#24#198#255#0#24#198#255#0#22#181#255#0#22#181#255#0#21#170#255#0
+ +#19#160#255#0#21#170#255#0#21#170#255#0#19#160#255#0#10'O'#255#0#0#0#0#0#0#0
+ +#0#0#23#185#255#0#28#226#255#0#26#213#255#0#24#202#255#0#24#198#255#0#22#181
+ +#255#0#22#181#255#0#21#170#255#0#21#170#255#0#22#181#255#0#21#170#255#0#22
+ +#181#255#0#19#160#255#0#10'O'#255#0#0#0#0#0#0#0#0#0#19#151#255#0#23#185#255#0
+ +#22#181#255#0#21#170#255#0#19#160#255#0#19#160#255#0#19#151#255#0#19#151#255
+ +#0#19#160#255#0#19#151#255#0#19#151#255#0#19#160#255#0#15'z'#255#0#8'@'#255#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#13'l'#255#0#13'l'#255#0#12']'#255#0#10'Q'#255#0#10
+ +'O'#255#0#10'O'#255#0#10'O'#255#0#10'O'#255#0#10'O'#255#0#10'O'#255#0#10'O'
+ +#255#0#8'@'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.pas
new file mode 100644
index 0000000..3c99136
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialog.pas
@@ -0,0 +1,391 @@
+unit uDAReconcileDialog;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ {$IFDEF MSWINDOWS} Windows,{$ENDIF} SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ {$IFDEF FPC} buttons,LResources,LCLType,{$ENDIF}
+ Dialogs, StdCtrls, ComCtrls, ImgList,
+ uDAInterfaces,uDADelta, uDADatatable, uDADataAdapter;
+
+type
+ TReconcileDialogForm = class(TForm)
+ SkipButton: TButton;
+ CancelButton: TButton;
+ SkipAllButton: TButton;
+ CancelAllButton: TButton;
+ ShowDetailButton: TButton;
+ TreeView: TTreeView;
+ ImageList: TImageList;
+ Label1: TLabel;
+ Label2: TLabel;
+ Label3: TLabel;
+ btn_Cancel: TButton;
+ memMessageError: TMemo;
+ procedure SkipButtonClick(Sender: TObject);
+ procedure CancelButtonClick(Sender: TObject);
+ procedure SkipAllButtonClick(Sender: TObject);
+ procedure CancelAllButtonClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure ShowDetailButtonClick(Sender: TObject);
+ procedure ListBoxClick(Sender: TObject);
+ private
+ { Private declarations }
+ ChangeList: TList;
+ TableList: TList;
+ RDA: TDABaseDataAdapter;
+ procedure CancelChange(aNode: TTreeNode);
+ procedure SkipChange(aNode: TTreeNode);
+ procedure SkipAllChanges;
+ procedure CancelAllChanges;
+ procedure Setup;
+ function FindDatatable(ADelta: IDADelta): TDADatatable;
+ procedure DeleteNodeFromTreeView(aNode: TTreeNode);
+ end;
+
+var
+ ReconcileDialogForm: TReconcileDialogForm;
+
+procedure ReconcileDialog(RemoteDataAdapter: TDABaseDataAdapter; var AFailedDeltaList: TList; aTableList: TList);
+
+implementation
+
+uses
+ uDAReconcileDialogDetails, uROBinaryHelpers;
+
+{$IFNDEF FPC}
+ {$R *.dfm}
+{$ENDIF}
+
+
+function GenerateNodeCaption(aChange: TDADeltaChange): String;
+
+ function _VarToStr(AValue: variant; ADataType: TDADataType): string;
+ begin
+ if ADataType = datDecimal then
+ Result := DecimalVariantToString(AValue)
+ else
+ Result := VarToStr(AValue)
+ end;
+
+var
+ j: integer;
+begin
+ Result := aChange.Delta.LogicalName + ':';
+ for j := 0 to aChange.Delta.KeyFieldCount - 1 do begin
+ if j > 0 then Result := Result + ';';
+ if aChange.ChangeType = ctDelete then
+ Result := Result + _VarToStr(aChange.OldValueByName[aChange.Delta.KeyFieldNames[j]], aChange.Delta.LoggedFieldTypes[j])
+ else
+ Result := Result + _VarToStr(aChange.NewValueByName[aChange.Delta.KeyFieldNames[j]], aChange.Delta.LoggedFieldTypes[j]);
+ end;
+end;
+
+type
+ THackDataTable = class(TDADataTable)
+
+ end;
+
+procedure ReconcileDialog_ruoOnPost(RemoteDataAdapter: TDABaseDataAdapter; aChange: TDADeltaChange; aTable: TDADataTable);
+var
+ lAction: TDAReconcileDialogAction;
+ lHandled: Boolean;
+begin
+ lAction := rdlgRevert;
+ lHandled:=False;
+ if Assigned(RemoteDataAdapter) and Assigned(RemoteDataAdapter.OnShowReconcileRecordInAppUI) then
+ RemoteDataAdapter.OnShowReconcileRecordInAppUI(RemoteDataAdapter, aChange, aTable, lHandled,lAction);
+ if not lHandled then begin
+ if (aChange.ChangeType = ctInsert) and not (RemoteDataAdapter.FailureBehavior in [fbRaiseException,fbBoth]) then
+ // we can't call Table.Cancel inside Table.Post so just raise Exception
+ raise Exception.Create(aChange.Message)
+ else
+ ReconcileDialogShowDetails(aChange, aTable, GenerateNodeCaption(aChange), lAction);
+ end;
+ case lAction of
+ rdlgSkip: Raise Exception.Create('rdlgSkip can''t be used for tables in the ruoOnPost mode.');
+ rdlgCancel: Raise Exception.Create('rdlgCancel can''t be used for tables in the ruoOnPost mode.');
+ rdlgNone: Raise Exception.Create('rdlgNone can''t be used for tables in the ruoOnPost mode.');
+ rdlgRepost: begin
+ aChange.Status := csPending;
+ THackDataTable(aTable).InternalApplyUpdates();
+ end;
+ rdlgRevert: begin
+ aTable.CancelUpdateChange(aChange);
+ end;
+ end;
+end;
+
+procedure ReconcileDialog(RemoteDataAdapter: TDABaseDataAdapter; var AFailedDeltaList: TList; aTableList: TList);
+begin
+ if (AFailedDeltaList.Count = 1) and (aTableList.Count = 1) and
+ (AnsiSameText(TDADeltaChange(AFailedDeltaList[0]).Delta.LogicalName, TDADataTable(aTableList[0]).LogicalName)) and
+ (ruoOnPost in TDADataTable(aTableList[0]).RemoteUpdatesOptions) then begin
+ ReconcileDialog_ruoOnPost(RemoteDataAdapter,TDADeltaChange(AFailedDeltaList[0]), TDADataTable(aTableList[0]));
+ AFailedDeltaList.Clear;
+ end
+ else begin
+ with TReconcileDialogForm.Create(Application) do try
+ RDA:=RemoteDataAdapter;
+ ChangeList.Assign(AFailedDeltaList);
+ TableList.Assign(aTableList);
+ Setup;
+ ShowModal;
+ AFailedDeltaList.Assign(ChangeList);
+ finally
+ Release;
+ end;
+ end;
+end;
+
+procedure TReconcileDialogForm.SkipButtonClick(Sender: TObject);
+begin
+ SkipChange(TreeView.Selected);
+end;
+
+procedure TReconcileDialogForm.CancelButtonClick(Sender: TObject);
+begin
+ CancelChange(TreeView.Selected);
+end;
+
+procedure TReconcileDialogForm.SkipAllButtonClick(Sender: TObject);
+begin
+ SkipAllChanges;
+end;
+
+procedure TReconcileDialogForm.CancelAllButtonClick(Sender: TObject);
+begin
+ CancelAllChanges;
+end;
+
+procedure TReconcileDialogForm.CancelAllChanges;
+begin
+ if Application.MessageBox('Do you want cancel all changes?', 'Cancel All', MB_YESNO) = IDYES then begin
+ while TreeView.Items.Count > 0 do
+ CancelChange(TreeView.Items[0]);
+ ModalResult := mrOk;
+ end;
+end;
+
+procedure TReconcileDialogForm.SkipAllChanges;
+begin
+ if Application.MessageBox('Do you want skip all changes?', 'Skip All', MB_YESNO) = IDYES then
+ ModalResult := mrOk;
+end;
+
+procedure TReconcileDialogForm.FormCreate(Sender: TObject);
+begin
+ inherited;
+ ChangeList := TList.Create;
+ TableList := TList.Create;
+end;
+
+procedure TReconcileDialogForm.FormDestroy(Sender: TObject);
+begin
+ ChangeList.Free;
+ TableList.Free;
+ inherited;
+end;
+
+procedure TReconcileDialogForm.ShowDetailButtonClick(Sender: TObject);
+var
+ lChange: TDADeltaChange;
+ lHandled: Boolean;
+ lAction: TDAReconcileDialogAction;
+begin
+ lChange := TDADeltaChange(Treeview.Selected.Data);
+ Hide;
+ try
+ lAction:= rdlgNone;
+ lHandled:=False;
+ if Assigned(rda) and Assigned(rda.OnShowReconcileRecordInAppUI) then
+ rda.OnShowReconcileRecordInAppUI(RDA, lChange, FindDatatable(lChange.Delta),lHandled,lAction);
+ if not lHandled then
+ ReconcileDialogShowDetails(lChange, FindDatatable(lChange.Delta), Treeview.Selected.Text, lAction);
+ finally
+ Show;
+ end;
+ case lAction of
+ rdlgSkip: SkipButton.Click;
+ rdlgCancel: CancelButton.Click;
+ rdlgRepost: Raise Exception.Create('rdlgRepost can be used only for tables in the ruoOnPost mode.');
+ rdlgRevert: Raise Exception.Create('rdlgRevert can be used only for tables in the ruoOnPost mode.');
+ end;
+end;
+
+procedure TReconcileDialogForm.Setup;
+var
+ i: integer;
+ change: TDADeltaChange;
+ anode: TTreeNode;
+begin
+ TreeView.Items.Clear;
+ for i := 0 to ChangeList.Count - 1 do begin
+ change := TDADeltaChange(ChangeList[i]);
+ anode := TreeView.Items.AddChildObject(nil, GenerateNodeCaption(Change), Change);
+ case Change.ChangeType of
+ ctInsert: aNode.StateIndex := 2;
+ ctUpdate: aNode.StateIndex := 3;
+ ctDelete: aNode.StateIndex := 4;
+ end;
+ end;
+ if TreeView.Items.Count > 0 then begin
+ TreeView.Items[0].Selected := True;
+ ListBoxClick(TreeView);
+ end;
+end;
+
+procedure TReconcileDialogForm.CancelChange(aNode: TTreeNode);
+
+ procedure DeleteChangeFromTreeView(aChange: TDADeltaChange);
+ var
+ i: integer;
+ begin
+ for i := TreeView.Items.Count - 1 downto 0 do
+ if TreeView.Items[i].Data = aChange then begin
+ TreeView.Items[i].Delete;
+ Break;
+ end;
+ end;
+
+var
+ lTable: TDADatatable;
+ details: TList;
+ detailChange: TDADeltaChange;
+ i, j, k: integer;
+ ChangePKValueArray: array of Variant;
+ lNeedDeleteChange: boolean;
+ keyvalue: variant;
+ aChange: TDADeltaChange;
+begin
+ aChange := TDADeltaChange(ANode.Data);
+ if aChange <> nil then begin
+ ChangeList.Remove(aChange);
+ lTable := FindDatatable(aChange.Delta);
+ if lTable <> nil then begin
+ // remove changes for detail tables
+ details := lTable.GetDetailTablesforApplyUpdate;
+ try
+ if Details.Count > 0 then begin
+ SetLength(ChangePKValueArray, aChange.Delta.KeyFieldCount);
+ for i := 1 to aChange.Delta.KeyFieldCount do begin
+ if aChange.ChangeType = ctInsert then
+ keyvalue := aChange.NewValueByName[aChange.Delta.KeyFieldNames[i - 1]]
+ else
+ keyvalue := aChange.OldValueByName[aChange.Delta.KeyFieldNames[i - 1]];
+ ChangePKValueArray[0] := keyvalue;
+ end;
+
+ for i := 0 to details.Count - 1 do begin
+ for j := 0 to TDADataTable(details[i]).Delta.Count - 1 do begin
+ detailChange := TDADataTable(details[i]).Delta.Changes[j];
+ if detailChange.Status <> csResolved then begin
+ lNeedDeleteChange := True;
+ for k := 0 to aChange.Delta.KeyFieldCount - 1 do begin
+ if detailChange.ChangeType = ctInsert then
+ keyvalue := detailChange.NewValueByName[aChange.Delta.KeyFieldNames[k]]
+ else
+ keyvalue := detailChange.oldValueByName[aChange.Delta.KeyFieldNames[k]];
+ if not VarSameValue(keyValue, ChangePKValueArray[k]) then begin
+ lNeedDeleteChange := False;
+ Break;
+ end;
+ end;
+ if lNeedDeleteChange then DeleteChangeFromTreeView(detailChange);
+ end;
+ end;
+ end;
+ end;
+ finally
+ details.Free;
+ end;
+ DeleteNodeFromTreeView(aNode);
+ lTable.CancelUpdateChange(aChange);
+ end;
+ end;
+ if Treeview.Items.Count = 0 then ModalResult := MrOk;
+end;
+
+procedure TReconcileDialogForm.SkipChange(aNode: TTreeNode);
+begin
+ DeleteNodeFromTreeView(ANode);
+ if Treeview.Items.Count = 0 then ModalResult := MrOk;
+end;
+
+procedure TReconcileDialogForm.ListBoxClick(Sender: TObject);
+
+ function _VarToStr(AValue: variant; ADataType: TDADataType): string;
+ begin
+ if ADataType = datDecimal then
+ Result := DecimalVariantToString(AValue)
+ else
+ Result := VarToStr(AValue)
+ end;
+
+var
+ s: string;
+ change: TDADeltaChange;
+ i: integer;
+begin
+ if Treeview.Selected <> nil then begin
+ change := TDADeltaChange(Treeview.Selected.Data);
+ s := 'A problem occured while ';
+ case change.ChangeType of
+ ctInsert: s := s + 'inserting';
+ ctUpdate: s := s + 'updating';
+ ctDelete: s := s + 'deleting';
+ end;
+ s := s + ' a record in table "' + change.Delta.LogicalName + '", record "';
+ for i := 1 to Change.Delta.KeyFieldCount do begin
+ if i <> 1 then s := s + ';';
+ if Change.ChangeType = ctInsert then
+ s := s + _VarToStr(Change.NewValueByName[Change.Delta.KeyFieldNames[i - 1]],Change.Delta.LoggedFieldTypes[i-1])
+ else
+ s := s + _VarToStr(Change.OldValueByName[Change.Delta.KeyFieldNames[i - 1]],Change.Delta.LoggedFieldTypes[i-1]);
+ end;
+ s := s + '"'+ sLineBreak + sLineBreak + change.Message;
+ if Assigned(RDA) and Assigned(RDA.OnGenerateRecordMessage) then RDA.OnGenerateRecordMessage(RDA, change,FindDatatable(change.Delta),s);
+ //lMessageError.Caption:=s;
+ memMessageError.Lines.Text := s;
+ end;
+end;
+
+function TReconcileDialogForm.FindDatatable(ADelta: IDADelta): TDADatatable;
+var
+ i: integer;
+begin
+ Result := nil;
+ for i := 0 to TableList.Count - 1 do
+ if AnsiSameText(ADelta.LogicalName, TDADatatable(TableList[i]).LogicalName) then begin
+ Result := TDADatatable(TableList[i]);
+ Break;
+ end;
+end;
+
+procedure TReconcileDialogForm.DeleteNodeFromTreeView(aNode: TTreeNode);
+begin
+ aNode.Delete;
+ ListBoxClick(TreeView);
+end;
+
+{$IFDEF FPC}
+initialization
+ {$I uDAReconcileDialog.lrs}
+{$ENDIF}
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.dfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.dfm
new file mode 100644
index 0000000..4508539
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.dfm
@@ -0,0 +1,95 @@
+object ReconcileDialogDetailsForm: TReconcileDialogDetailsForm
+ Left = 358
+ Top = 218
+ Width = 500
+ Height = 299
+ BorderIcons = [biSystemMenu]
+ Caption = 'Details for Change to '#39'%s'#39
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poOwnerFormCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object ScrollBox: TScrollBox
+ Left = 0
+ Top = 49
+ Width = 484
+ Height = 179
+ Align = alClient
+ BevelInner = bvNone
+ BevelOuter = bvNone
+ BorderStyle = bsNone
+ TabOrder = 0
+ end
+ object BottomPanel: TPanel
+ Left = 0
+ Top = 228
+ Width = 484
+ Height = 35
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 1
+ DesignSize = (
+ 484
+ 35)
+ object OkButton: TButton
+ Left = 185
+ Top = 5
+ Width = 95
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = '&Skip Change'
+ Default = True
+ ModalResult = 1
+ TabOrder = 0
+ end
+ object CloseButton: TButton
+ Left = 385
+ Top = 5
+ Width = 95
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Cancel = True
+ Caption = 'Close'
+ ModalResult = 7
+ TabOrder = 1
+ end
+ object CancelButton: TButton
+ Left = 285
+ Top = 5
+ Width = 95
+ Height = 25
+ Anchors = [akLeft, akBottom]
+ Caption = '&Cancel Change'
+ ModalResult = 2
+ TabOrder = 2
+ end
+ end
+ object TopPanel: TPanel
+ Left = 0
+ Top = 0
+ Width = 484
+ Height = 49
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 2
+ DesignSize = (
+ 484
+ 49)
+ object memMessageError: TMemo
+ Left = 0
+ Top = 0
+ Width = 484
+ Height = 49
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ BevelInner = bvNone
+ BevelOuter = bvNone
+ BorderStyle = bsNone
+ Color = clBtnFace
+ ScrollBars = ssVertical
+ TabOrder = 0
+ end
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.lfm b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.lfm
new file mode 100644
index 0000000..fca88ab
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.lfm
@@ -0,0 +1,92 @@
+object ReconcileDialogDetailsForm: TReconcileDialogDetailsForm
+ Left = 383
+ Height = 300
+ Top = 266
+ Width = 500
+ ActiveControl = OkButton
+ BorderIcons = [biSystemMenu]
+ Caption = 'Details for Change ''%s'''
+ ClientHeight = 300
+ ClientWidth = 500
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ OnCreate = FormCreate
+ Position = poOwnerFormCenter
+ LCLVersion = '0.9.29'
+ object ScrollBox: TScrollBox
+ Left = 0
+ Height = 216
+ Top = 49
+ Width = 500
+ Align = alClient
+ TabOrder = 0
+ end
+ object BottomPanel: TPanel
+ Left = 0
+ Height = 35
+ Top = 265
+ Width = 500
+ Align = alBottom
+ BevelOuter = bvNone
+ ClientHeight = 35
+ ClientWidth = 500
+ TabOrder = 1
+ object OkButton: TButton
+ Left = 240
+ Height = 25
+ Top = 5
+ Width = 75
+ Anchors = [akRight, akBottom]
+ BorderSpacing.InnerBorder = 4
+ Caption = '&Ok'
+ Default = True
+ ModalResult = 1
+ TabOrder = 0
+ end
+ object CloseButton: TButton
+ Left = 420
+ Height = 25
+ Top = 5
+ Width = 75
+ Anchors = [akRight, akBottom]
+ BorderSpacing.InnerBorder = 4
+ Cancel = True
+ Caption = 'Close'
+ ModalResult = 7
+ TabOrder = 1
+ end
+ object CancelButton: TButton
+ Left = 320
+ Height = 25
+ Top = 5
+ Width = 95
+ Anchors = [akRight, akBottom]
+ BorderSpacing.InnerBorder = 4
+ Caption = '&Cancel Change'
+ ModalResult = 2
+ TabOrder = 2
+ end
+ end
+ object TopPanel: TPanel
+ Left = 0
+ Height = 49
+ Top = 0
+ Width = 500
+ Align = alTop
+ BevelOuter = bvNone
+ ClientHeight = 49
+ ClientWidth = 500
+ TabOrder = 2
+ object memMessageError: TMemo
+ Left = 0
+ Height = 42
+ Top = 1
+ Width = 498
+ Color = clBtnFace
+ ReadOnly = True
+ ScrollBars = ssAutoVertical
+ TabOrder = 0
+ TabStop = False
+ end
+ end
+end
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.lrs b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.lrs
new file mode 100644
index 0000000..d1b20bf
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.lrs
@@ -0,0 +1,29 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TReconcileDialogDetailsForm','FORMDATA',[
+ 'TPF0'#27'TReconcileDialogDetailsForm'#26'ReconcileDialogDetailsForm'#4'Left'
+ +#3#127#1#6'Height'#3','#1#3'Top'#3#10#1#5'Width'#3#244#1#13'ActiveControl'#7
+ +#8'OkButton'#11'BorderIcons'#11#12'biSystemMenu'#0#7'Caption'#6#23'Details f'
+ +'or Change ''%s'''#12'ClientHeight'#3','#1#11'ClientWidth'#3#244#1#11'Font.H'
+ +'eight'#2#245#9'Font.Name'#6#6'Tahoma'#8'OnCreate'#7#10'FormCreate'#8'Positi'
+ +'on'#7#17'poOwnerFormCenter'#10'LCLVersion'#6#6'0.9.29'#0#10'TScrollBox'#9'S'
+ +'crollBox'#4'Left'#2#0#6'Height'#3#216#0#3'Top'#2'1'#5'Width'#3#244#1#5'Alig'
+ +'n'#7#8'alClient'#8'TabOrder'#2#0#0#0#6'TPanel'#11'BottomPanel'#4'Left'#2#0#6
+ +'Height'#2'#'#3'Top'#3#9#1#5'Width'#3#244#1#5'Align'#7#8'alBottom'#10'BevelO'
+ +'uter'#7#6'bvNone'#12'ClientHeight'#2'#'#11'ClientWidth'#3#244#1#8'TabOrder'
+ +#2#1#0#7'TButton'#8'OkButton'#4'Left'#3#240#0#6'Height'#2#25#3'Top'#2#5#5'Wi'
+ +'dth'#2'K'#7'Anchors'#11#7'akRight'#8'akBottom'#0#25'BorderSpacing.InnerBord'
+ +'er'#2#4#7'Caption'#6#3'&Ok'#7'Default'#9#11'ModalResult'#2#1#8'TabOrder'#2#0
+ +#0#0#7'TButton'#11'CloseButton'#4'Left'#3#164#1#6'Height'#2#25#3'Top'#2#5#5
+ +'Width'#2'K'#7'Anchors'#11#7'akRight'#8'akBottom'#0#25'BorderSpacing.InnerBo'
+ +'rder'#2#4#6'Cancel'#9#7'Caption'#6#5'Close'#11'ModalResult'#2#7#8'TabOrder'
+ +#2#1#0#0#7'TButton'#12'CancelButton'#4'Left'#3'@'#1#6'Height'#2#25#3'Top'#2#5
+ +#5'Width'#2'_'#7'Anchors'#11#7'akRight'#8'akBottom'#0#25'BorderSpacing.Inner'
+ +'Border'#2#4#7'Caption'#6#14'&Cancel Change'#11'ModalResult'#2#2#8'TabOrder'
+ +#2#2#0#0#0#6'TPanel'#8'TopPanel'#4'Left'#2#0#6'Height'#2'1'#3'Top'#2#0#5'Wid'
+ +'th'#3#244#1#5'Align'#7#5'alTop'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'
+ +#2'1'#11'ClientWidth'#3#244#1#8'TabOrder'#2#2#0#5'TMemo'#15'memMessageError'
+ +#4'Left'#2#0#6'Height'#2'*'#3'Top'#2#1#5'Width'#3#242#1#5'Color'#7#9'clBtnFa'
+ +'ce'#8'ReadOnly'#9#10'ScrollBars'#7#14'ssAutoVertical'#8'TabOrder'#2#0#7'Tab'
+ +'Stop'#8#0#0#0#0
+]);
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.pas
new file mode 100644
index 0000000..69740a2
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAReconcileDialogDetails.pas
@@ -0,0 +1,288 @@
+unit uDAReconcileDialogDetails;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+uses
+ SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, ExtCtrls, uDADelta, uDADataTable, DB,
+ {$IFDEF FPC} buttons,LResources,{$ENDIF}
+ uDADataAdapter, uDARemoteDataAdapter;
+
+type
+ TReconcileDialogDetailsForm = class(TForm)
+ ScrollBox: TScrollBox;
+ BottomPanel: TPanel;
+ OkButton: TButton;
+ CloseButton: TButton;
+ TopPanel: TPanel;
+ CancelButton: TButton;
+ memMessageError: TMemo;
+ procedure FormCreate(Sender: TObject);
+ private
+ { Private declarations }
+ dbeditHeight, labelheight: integer;
+ FChange: TDADeltaChange;
+ Datasource: TDADataSource;
+ procedure Setup;
+ procedure GenerateControls;
+ procedure OnFieldValueChanged(Sender: TObject);
+ public
+ { Public declarations }
+
+ end;
+
+var
+ ReconcileDialogDetailsForm: TReconcileDialogDetailsForm;
+
+procedure ReconcileDialogShowDetails(AChange: TDADeltaChange; aTable: TDADataTable; aCaption: string; var AAction: TDAReconcileDialogAction);
+implementation
+uses
+ uDAInterfaces, uROClasses, dbCtrls, uROBinaryHelpers;
+
+{$IFNDEF FPC}
+ {$R *.dfm}
+{$ENDIF}
+
+const
+ labelWidth = 100;
+ editWidth = 200;
+ c_Color: TColor = clMoneyGreen;
+
+procedure ReconcileDialogShowDetails(AChange: TDADeltaChange; aTable: TDADataTable; aCaption: string; var AAction: TDAReconcileDialogAction);
+var
+ FFiltered: Boolean;
+ FMasterDS: TDADataSource;
+ FRemoteFetchEnabled: Boolean;
+ FMasterFields: string;
+ r: integer;
+begin
+ with TReconcileDialogDetailsForm.Create(Application) do try
+ Caption := Format(Caption, [aCaption]);
+ FChange := AChange;
+ FFiltered := ATable.Filtered;
+ FMasterDS := aTable.MasterSource;
+ FMasterFields := aTable.MasterFields;
+ FRemoteFetchEnabled := aTable.RemoteFetchEnabled;
+ try
+ ATable.Filtered := False;
+ aTable.MasterSource := nil;
+ aTable.MasterFields := '';
+ aTable.RemoteFetchEnabled := False;
+ DataSource.DataTable := aTable;
+ Setup;
+ r := ShowModal;
+ if (ruoOnPost in aTable.RemoteUpdatesOptions) then begin
+ case r of
+ mrOk: AAction := rdlgRepost;
+ mrCancel: AAction := rdlgRevert;
+ end;
+ if FChange.ChangeType = ctUpdate then DataSource.DataTable.Delta.EndChange(DataSource.DataTable);
+ end
+ else begin
+ case r of
+ mrOk: AAction := rdlgSkip;
+ mrCancel: AAction := rdlgCancel;
+ else AAction := rdlgNone;
+ end;
+ if DataSource.DataTable.State in [dsEdit, dsInsert] then DataSource.DataTable.Post;
+ end;
+ finally
+ aTable.RemoteFetchEnabled := FRemoteFetchEnabled;
+ aTable.Filtered := FFiltered;
+ aTable.MasterSource := FMasterDS;
+ aTable.MasterFields := FMasterFields
+ end;
+ finally
+ Release;
+ end;
+end;
+
+{ TShowDetailsForm }
+
+procedure TReconcileDialogDetailsForm.Setup;
+begin
+ if FChange.ChangeType <> ctDelete then
+ with DataSource.DataTable do
+ if not (ruoOnPost in RemoteUpdatesOptions) and not Locate(RecIDFieldName, FChange.RecID, []) then RaiseError('Couldn''t find record #' + FormatRecIDString(FChange.RecID));
+ GenerateControls;
+ memMessageError.Lines.Text := FChange.Message;
+
+ if (ruoOnPost in DataSource.DataTable.RemoteUpdatesOptions) then begin
+ OkButton.Left := CancelButton.Left;
+ OkButton.Enabled := False;
+ OkButton.Visible := FChange.ChangeType <> ctDelete ;
+ OkButton.Caption := 'Update';
+ CancelButton.Left := CloseButton.Left;
+ CancelButton.Caption := 'Revert';
+ CloseButton.Visible := False;
+ CloseButton.Enabled := False;
+ ActiveControl := CancelButton;
+ if FChange.ChangeType = ctUpdate then DataSource.DataTable.Delta.StartChange(ctUpdate,DataSource.DataTable)
+ end;
+end;
+
+procedure TReconcileDialogDetailsForm.OnFieldValueChanged(Sender: TObject);
+begin
+ OkButton.Enabled := True;
+ OkButton.Caption := 'Update';
+end;
+
+procedure TReconcileDialogDetailsForm.GenerateControls;
+
+ function _VarToStr(AValue: variant; ADataType: TDADataType): string;
+ begin
+ if ADataType = datDecimal then
+ Result := DecimalVariantToString(AValue)
+ else
+ Result := VarToStr(AValue)
+ end;
+
+var
+ i: integer;
+ aField: string;
+ aField2: string;
+ aTop, aleft: integer;
+ FLabel: TLabel;
+ FdbEdit: TDBEdit;
+ FEdit: TEdit;
+begin
+ aleft := 7;
+ aTop := 7;
+ for i := 0 to FChange.Delta.LoggedFieldCount - 1 do begin
+ aField := FChange.Delta.LoggedFieldNames[i];
+ aField2 := StringReplace(aField,'@','___replaced___',[rfReplaceAll]); // it should be unique
+ aTop := 7 + (3 + dbeditHeight) * i;
+ aleft := 7;
+
+ FLabel := TLabel.Create(Self);
+ with FLabel do begin
+ Parent := ScrollBox;
+ Name := 'l_' + aField2;
+ Caption := aField;
+ Left := aleft;
+ Top := (dbeditHeight - Height) div 2 + aTop + 1;
+ Width := labelWidth;
+ aleft := aleft + 7 + labelWidth;
+ Font.Name := 'Tahoma';
+ end;
+
+ if FChange.ChangeType in [ctInsert, ctUpdate] then begin
+ if Self.DataSource.DataTable.FieldByName(aField).DataType = datBlob then begin
+ FEdit := TEdit.Create(Self);
+ with FEdit do begin
+ Name := 'dbe_' + aField2;
+ Parent := ScrollBox;
+ Left := aleft;
+ aleft := aleft + 7 + editWidth;
+ Top := aTop;
+ Width := editWidth;
+ ReadOnly := True;
+ Text := '[blob]';
+ Font.Name := 'Tahoma';
+ end;
+ end
+ else begin
+ FdbEdit := TDBEdit.Create(Self);
+ with FdbEdit do begin
+ Name := 'dbe_' + aField2;
+ DataSource := Self.DataSource;
+ Parent := ScrollBox;
+ DataField := aField;
+ Left := aleft;
+ Top := aTop;
+ Width := editWidth;
+ aleft := aleft + 7 + editWidth;
+ OnChange := OnFieldValueChanged;
+ if (FChange.ChangeType = ctUpdate) and
+ not ROVariantsEqual(FChange.OldValues[i], FChange.NewValues[i]) then
+ Color := c_Color;
+ Font.Name := 'Tahoma';
+ end;
+ end;
+ end;
+
+ if FChange.ChangeType in [ctUpdate, ctDelete] then begin
+ FEdit := TEdit.Create(Self);
+ with FEdit do begin
+ Name := 'e_' + aField2;
+ Parent := ScrollBox;
+ Left := aleft;
+ aleft := aleft + 7 + editWidth;
+ Top := aTop;
+ Width := editWidth;
+ ReadOnly := True;
+ Color := clBtnFace;
+ Font.Name := 'Tahoma';
+ if Self.DataSource.DataTable.FieldByName(aField).DataType = datBlob then begin
+ Text := '[blob]'
+ end
+ else begin
+ case FChange.ChangeType of
+ ctDelete: text := _VarToStr(FChange.OldValues[i],FChange.Delta.LoggedFieldTypes[i]);
+ ctUpdate: begin
+ if not Self.DataSource.DataTable.HasReducedDelta then
+ text := _VarToStr(FChange.OldValues[i],FChange.Delta.LoggedFieldTypes[i])
+ else
+ if not VarIsEmpty(FChange.OldValues[i]) then
+ text := _VarToStr(FChange.OldValues[i],FChange.Delta.LoggedFieldTypes[i])
+ else text := Self.DataSource.DataTable.FieldByName(aField).AsString;
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ inc(aTop, 20);
+ inc(aLeft, 7);
+ //ScrollBox.HorzScrollBar.Range := aleft;
+ Self.ClientWidth := aleft + ScrollBox.VertScrollBar.Size + 2;
+ Self.Constraints.MinWidth := Self.Width;
+ Self.Constraints.MaxWidth := Self.Width;
+
+
+ CloseButton.left := Self.ClientWidth - 7 - CloseButton.Width;
+ CancelButton.Left := CloseButton.left - 5 - CancelButton.Width;
+ OkButton.Left := CancelButton.left - 5 - OkButton.Width;
+
+ ScrollBox.VertScrollBar.Range := aTop;
+ if Screen.Height > Self.Height + (aTop - ScrollBox.Height) then
+ Self.Height := Self.Height + (aTop - ScrollBox.Height)
+ else
+ Self.Height := Screen.Height;
+end;
+
+procedure TReconcileDialogDetailsForm.FormCreate(Sender: TObject);
+begin
+ inherited;
+ with TDBEdit.Create(Self) do try
+ dbeditHeight := Height;
+ finally
+ free;
+ end;
+ with TLabel.Create(Self) do try
+ labelheight := Height;
+ finally
+ free;
+ end;
+ Datasource := TDADataSource.Create(Self);
+end;
+
+{$IFDEF FPC}
+initialization
+ {$I uDAReconcileDialogDetails.lrs}
+{$ENDIF}
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARegExpr.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARegExpr.pas
new file mode 100644
index 0000000..697ae22
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARegExpr.pas
@@ -0,0 +1,4287 @@
+unit uDARegExpr;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright 1999-2000 by Andrey V. Sorokin }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Please see the comments below for licensing issues of this source file. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+{$B-}
+
+(*
+ TRegExpr library
+ Regular Expressions for Delphi
+
+ Author:
+ Andrey V. Sorokin
+ St-Petersburg
+ Russia
+ anso@mail.ru, anso@usa.net
+ http://anso.da.ru
+ http://anso.virtualave.net
+
+This library is derived from Henry Spencer sources.
+I translated the C sources into Object Pascal,
+implemented object wrapper and some new features.
+Many features suggested or partially implemented
+by TRegExpr's users (see Gratitude below).
+
+---------------------------------------------------------------
+ Legal issues
+---------------------------------------------------------------
+ Copyright (c) 1999-00 by Andrey V. Sorokin
+
+ This software is provided as it is, without any kind of warranty
+ given. Use it at your own risk.
+
+ You may use this software in any kind of development, including
+ comercial, redistribute, and modify it freely, under the
+ following restrictions :
+ 1. The origin of this software may not be mispresented, you must
+ not claim that you wrote the original software. If you use
+ this software in any kind of product, it would be appreciated
+ that there in a information box, or in the documentation would
+ be an acknowledgmnent like this
+ Partial Copyright (c) 2000 by Andrey V. Sorokin
+ 2. You may not have any income from distributing this source
+ to other developers. When you use this product in a comercial
+ package, the source may not be charged seperatly.
+
+
+---------------------------------------------------------------
+ Legal issues for the original C sources:
+---------------------------------------------------------------
+ * Copyright (c) 1986 by University of Toronto.
+ * Written by Henry Spencer. Not derived from licensed software.
+ *
+ * Permission is granted to anyone to use this software for any
+ * purpose on any computer system, and to redistribute it freely,
+ * subject to the following restrictions:
+ * 1. The author is not responsible for the consequences of use of
+ * this software, no matter how awful, even if they arise
+ * from defects in it.
+ * 2. The origin of this software must not be misrepresented, either
+ * by explicit claim or by omission.
+ * 3. Altered versions must be plainly marked as such, and must not
+ * be misrepresented as being the original software.
+
+
+---------------------------------------------------------------
+ Gratitudes
+---------------------------------------------------------------
+ Guido Muehlwitz
+ found and fixed ugly bug in big string processing
+ Stephan Klimek
+ testing in CPPB and suggesting/implementing many features
+ Steve Mudford
+ implemented Offset parameter
+ Martin Baur
+ usefull suggetions, help translation into German
+ Yury Finkel
+ Implemented UniCode support, found and fixed some bugs
+ Ralf Junker
+ Implemented some features, many optimization suggestions
+ Filip Jirsák and Matthew Winter (wintermi@yahoo.com)
+ Help in Implementation non-greedy mode
+ Kit Eason
+ many examples for introduction help section
+ Juergen Schroth
+ bug hunting and usefull suggestions
+ Simeon Lilov
+ help translation into Bulgarian
+ Martin Ledoux
+ help translation into French
+ Diego Calp (mail@diegocalp.com), Argentina
+ help translation into Spanish
+
+ And many others - for big work of bug hunting !
+
+I am still looking for person who can help me to translate
+this documentation into other languages (especially German)
+
+
+---------------------------------------------------------------
+ To do
+---------------------------------------------------------------
+
+-=- VCL-version of TRegExpr - for dummies ;) and TRegExprEdit
+(replacement for TMaskEdit).
+Actually, I am writing non-VCL aplications (with web-based
+interfaces), so I don't need VCL's TRegExpr for myself.
+Will it be really usefull ?
+
+-=- working with pascal-style string.
+Now pascal-strings converted into PChar, so
+you can't find r.e. in strings with #0 -chars.
+(suggested by Pavel O).
+
+-=- put precalculated lengths into EXACTLY[CI] !
+
+-=- fInputString as string (suggested by Ralf Junker)
+
+-=- Add regstart optimization for case-insensitive mode ?
+ Or complitely remove because FirstCharSet is faster ?
+
+-=- "Russian Ranges" --> National ranges (use property WordChars ?
+for ordering letters in ranges by its order in WirdsChars if modifier /r is On)
+
+-=- FirstCharSet as array [#0 .. #255] of REChar ?
+(2x faster then set of REChar)
+
+-=- p-code optimization (remove BRANCH-to-EEND, COMMENT, BACK(?)
+ merge EXACTLY etc).
+
+-=- !!!!!!!! bug found by Lars Karlslund
+ "If I do '(something|^$)' on '' I get false (which is wrong ...)."
+
+-=- There are no special command for files (Johan Smit).
+
+I need your suggestions !
+What are more importent in this list ?
+Did I forget anything ?
+
+
+---------------------------------------------------------------
+ History
+---------------------------------------------------------------
+Legend:
+ (+) added feature
+ (-) fixed bug
+ (^) upgraded implementation
+
+ v. 0.947 2001.10.03
+ -=- (+) Word boundary (\b & \B) metachar
+ -=- (-) Bug in processing predefined char.classes in non-UseSetOfChar mode
+ -=- (+) Spanish help - translated by Diego Calp (mail@diegocalp.com), Argentina
+ -=- (+) VersionMajor/Minor class method of TRegExpr ;)
+ -=- (-) Bug in CompileRegExpr, Thanks to Oleg Orlov
+ -=- (^) Method RegExprSubExpressions wasn't compatible with D2-D3.
+ Thanks to Eugene Tarasov for bug report.
+ -=- (+) Method Replace can now do substitution as well (see documentation)
+ Thanks to Warren Bare, Ken Friesen and many others who suggested it.
+ -=- (+) Updated ReplaceRegExpr to use new Replace method functionality
+ -=- (^) Restored UniCode compatibility lost in some previous version
+ Thanks to Stephan Klimek for bug report
+ -=- (^) Updated TestRE project, new examples for Replace with substitution
+ included.
+
+ v. 0.942+ 2001.03.01
+ -=- (+) Published French help for TRegExpr,
+ translated by Martin Ledoux
+
+ v. 0.942 2001.02.12
+ -=- (-) Range-check error in DEMO-project (due to bug in
+ RegExprSubExpressions), Thanks to Juergen Schroth
+ -=- (^) RegExprSubExpressions - added error codes for "unclosed "[" error
+ -=- (^) Help file bug fixing
+
+ v. 0.941 2001.02.01
+ -=- (^) Attension! Behaviour of '\w', '\W' was changed! Now it really
+ match alphanum characters and '_' as described in documentation,
+ not only alpha as it was before. Thanks to Vadim Alexandrov.
+ If You want to restore previous behaviour, reassign
+ RegExprWordChars (exclude '0123456789' from it).
+ -=- (+) Full compatible with recommended at unicode.org implementation
+ of modifier /m, including DOS-styled line separators (\r\n) mixed
+ with Unix styled (\n) - see properties LineSeparators, LinePairedSeparator
+ -=- (^) Attension! Behaviour of '.' was changed! Now if modifier /s is off
+ it doesn't match all chars from LineSeparators and LinePairedSeparator (by
+ default \r and \n)
+ -=- (^) Attension! To prevent unneeded recompilation of r.e., now assignment
+ to Expression or changing modifiers doesn't cause immidiate [re]compilation.
+ So, now You don't get exception while assigning wrong expression, but can
+ get exception while calling Exec[Next], Substitute, Dump, etc if there
+ are errors in Expression or other properties.
+ -=- (+) Non-greedy style iterators (like '*?'), modifier /g.
+ Implemented with help from Matthew Winter and Filip Jirsák
+ -=- (+) /x modifier (eXtended syntax - allow formating r.e., see description
+ in the help)
+ -=- (+) Procedure Compile to [re]compile r.e. Usefull for GUI r.e. editors
+ and so on (to check all properties validity).
+ -=- (+) FAQ in documentation. I am too lazy to answer to the same
+ questions again and again :( Please, read the FAQ before sending
+ question to me!
+ -=- (^) DEMO project have been significantly improved. Now this is the
+ real r.e. debugger! Thanks to Jon Smith for his ideas.
+ -=- (+) function RegExprSubExpressions, usefull for GUI editors of
+ r.e. (see example of using in TestRExp.dpr project)
+ -=- (+) HyperLinkDecorator unit - practical example of TRegExpr
+ using (see description in the help file)
+ -=- (-) Range checking error in some cases if ComplexBraces defined
+ Thanks to Juergen Schroth
+ -=- (^) 'ComplexBraces' now is defined by default
+ -=- (+) Kit Eason sent to me many examples for 'Syntax' help section
+ and I decided to complitely rewrite this section. I hope, You'll enjoy
+ the results ;)
+ -=- (+) The \A and \Z metacharacters are just like "^" and "$", except
+ that they won't match multiple times when the modifier /m is used
+
+ v. 0.939 2000.10.04
+ -=- (-) Bug in Substitute method ($10.. didn't work properly)
+ Thanks to Serge S Klochkovski
+
+ v. 0.938 2000.07.23
+ -=- (^) Exeptions now jump to appropriate source line, not
+ to Error procedure (I am not quite sure this is safe for
+ all compiler versions. You can turn it off - remove
+ reRealExceptionAddr definition below).
+ -=- (^) Forgotten BSUBEXP[CI] in FillFirstCharSet caused
+ exeption 'memory corruption' in case if back reference can
+ be first op, like this: (a)*\1 (first subexpression can be
+ skipped and we'll start matching with back reference..).
+
+ v. 0.937 2000.06.12
+ -=- (-) Bug in optimization engine (since v.0.934). In some cases
+ TRegExpr didn't catch right strings.
+ Thanks to Matthias Fichtner
+
+ v. 0.936 2000.04.22
+ -=- (+) Back references, like , see
+ manual for details
+ -=- (+) Wide hex char support, like '\x{263a}'
+
+ v. 0.935 2000.04.19 (by Yury Finkel)
+ -=- (-) fInvertCase now isn't readonly ;)
+ -=- (-) UniCode mode compiling errors
+
+ v. 0.934 2000.04.17
+ -=- (^) New ranges implementation (range matching now is very fast
+ - uses one(!) CPU instruction)
+ -=- (^) Internal p-code structure converted into 32-bits - works
+ faster and now there is no 64K limit for compiled r.e.
+ -=- (^) '{m,n}' now use 32-bits arguments (up to 2147483646) - specially
+ for Dmitry Veprintsev ;)
+ -=- (^) Ranges now support metachars: [\n-\x0D] -> #10,#11,#12,#13;
+ Changed '-' processing, now it's like in Perl:
+ [\d-t] -> '0'..'9','-','t'; []-a] -> ']'..'a'
+ -=- (-) Bug with \t and etc macro (they worked only in ranges)
+ Thanks to Yury Finkel
+ -=- (^) Added new preprocessing optimization (see FirstCharSet).
+ Incredible fast (!). But be carefull it isn's properly tested.
+ You can switch it Off - remove UseFirstCharSet definition.
+ -=- (^) Many other speed optimizations
+ -=- (-) Case-insensitive mode now support system-defined national
+ charset (due to bug in v.0.90 .. 0.926 supported only english one)
+ -=- (^) Case-insensitive mode implemented with InvertCase (param &
+ result of REChar type) - works 10 .. 100 times faster.
+ -=- (^) Match and ExecNext interfaces optimized, added IsProgrammOk
+ by Ralf Junker
+ -=- (^) Increased NSUBEXP (now 15) and fixed code for this, now you
+ can simply increase NSUBEXP constant by yourself.
+ Suggested by Alexander V. Akimov.
+ -=- (^+) Substitute adapted for NSUBEXP > 10 and significant (!)
+ optimized, improved error checking.
+ ATTENTION! Read new Substitute description - syntax was changed !
+ -=- (+) SpaceChars & WordChars property - now you may change chars
+ treated as \s & \w. By defauled assigned RegExprSpaceChars/WordChars
+ -=- (+) Now \s and \w supported in ranges
+ -=- (-) Infinite loop if end of range=#$FF
+ Thanks to Andrey Kolegov
+ -=- (+) Function QuoteRegExprMetaChars (see description)
+ -=- (+) UniCode support - sorry, works VERY slow (remove '.' from
+ {.$DEFINE UniCode} after this comment for unicode version).
+ Implemented by Yury Finkel
+
+ v. 0.926 2000.02.26
+ -=- (-) Old bug derived from H.Spencer sources - SPSTART was
+ set for '?' and '*' instead of '*', '{m,n}' and '+'.
+ -=- (-^) Now {m,n} works like Perl's one - error occures only
+ if m > n or n > BracesMax (BracesMax = 255 in this version).
+ In other cases (no m or nondigit symbols in m or n values,
+ or no '}') symbol '{' will be compiled as literal.
+ Note: so, you must include m value (use {0,n} instead of {,n}).
+ Note: {m,} will be compiled as {m,BracesMax}.
+ -=- (-^) CaseInsensitive mode now support ranges
+ '(?i)[a]' == '[aA]'
+ -=- (^) Roman-number template in TestRExp ;)
+ -=- (+^) Beta version of complex-braces - like ((abc){1,2}|d){3}
+ By default its turned off. If you want take part in beta-testing,
+ please, remove '.' from {.$DEFINE ComplexBraces} below this comments.
+ -=- (-^) Removed \b metachar (in Perl it isn't BS as in my implementation,
+ but word bound)
+ -=- (+) Add /s modifier. Bu I am not sure that it's ok for Windows.
+ I implemented it as [^\n] for '.' metachar in non-/s mode.
+ But lines separated by \n\r in windows. I need you suggestions !
+ -=- (^) Sorry, but I had to rename Modifiers to ModifierStr
+ (ModifierS uses for /s now)
+
+ v. 0.91 2000.02.02
+ -=- (^) some changes in documentation and demo-project.
+
+ v. 0.90 2000.01.31
+ -=- (+) implemented braces repetitions {min,max}.
+ Sorry - only simple cases now - like '\d{2,3}'
+ or '[a-z1-9]{,7}', but not (abc){2,3} ..
+ I still too short in time.
+ Wait for future versions of TRegExpr or
+ implement it by youself and share with me ;)
+ -=- (+) implemented case-insensitive modifier and way
+ to work with other modifiers - see properties
+ Modifiers, Modifier, ModifierI
+ and (?ismx-ismx) Perl extension.
+ You may use global variables RegExpr* for assigning
+ default modifier values.
+ -=- (+) property ExtSyntaxEnabled changed to 'r'-modifier
+ (russian extensions - see documentation)
+ -=- (+) implemented (?#comment) Perl extension - very hard
+ and usefull work ;)
+ -=- (^) property MatchCount renamed to SubExprMatchCount.
+ Sorry for any inconvenients, but it's because new
+ version works slightly different and if you used
+ MatchCount in your programms you have to rethink
+ it ! (see comments to this property)
+ -=- (+) add InputString property - stores input string
+ from last Exec call. You may directly assign values
+ to this property for using in ExecPos method.
+ -=- (+) add ExecPos method - for working with assigned
+ to InputString property. You may use it like this
+ InputString := AString;
+ ExecPos;
+ or this
+ InputString := AString;
+ ExecPos (AOffset);
+ Note: ExecPos without parameter works only in
+ Delphi 4 or higher.
+ -=- (+) add ExecNext method - simple and fast (!) way to finding
+ multiple occurences of r.e. in big input string.
+ -=- (^) Offset parameter removed from Exec method, if you
+ used it in your programs, please replace all
+ Exec (AString, AOffset)
+ with combination
+ InputString := AString; ExecPos (AOffset)
+ Sorry for any inconvenients, but old design
+ (see v.0.81) was too ugly :(
+ In addition, multiple Exec calls with same input
+ string produce fool overhead because each Exec
+ reallocate input string buffer.
+ -=- (^) optimized implementation of Substitution,
+ Replace and Split methods
+ -=- (-) fixed minor bug - if r.e. compilation raise error
+ during second pass (!!! I think it's impossible
+ in really practice), TRegExpr stayed in 'compiled'
+ state.
+ -=- (-) fixed bug - Dump method didn't check program existance
+ and raised 'access violation' if previouse Exec
+ was finished with error.
+ -=- (+) changed error handling (see functions Error, ErrorMsg,
+ LastError, property CompilerErrorPos, type ERegExpr).
+ -=- (-^) TRegExpr.Replace, Split and ExecNext made a infinite
+ loop in case of r.e. match empty-string.
+ Now ExecNext moves by MatchLen if MatchLen <> 0
+ and by +1 if MatchLen = 0
+ Thanks to Jon Smith and George Tasker for bugreports.
+ -=- (-) While playing with null-matchs I discovered, that
+ null-match at tail of input string is never found.
+ Well, I fixed this, but I am not sure this is safe
+ (MatchPos[0]=length(AInputString)+1, MatchLen = 0).
+ Any suggetions are very appreciated.
+ -=- (^) Demo project and documentation was upgraded
+ -=- (^) Documentation and this version was published on my home page
+ http://anso.da.ru
+
+
+ v. 0.81 1999.12.25 // Merry Christmas ! :)
+ -=- added \s (AnySpace) and \S (NotSpace) meta-symbols
+ - implemented by Stephan Klimek with minor fixes by AVS
+ -=- added \f, \a and \b chars (translates into FF, BEL, BS)
+ -=- removed meta-symbols 'ö' & 'Ö' - sorry for any inconvenients
+ -=- added Match property (== copy (InputStr, MatchPos [Idx], MatchLen [Idx]))
+ -=- added extra parameter Offset to Exec method
+ (thanks to Steve Mudford)
+
+ v. 0.7 1999.08.22
+ -=- fixed bug - in some cases the r.e. [^...]
+ incorrectly processed (as any symbol)
+ (thanks to Jan Korycan)
+ -=- Some changes and improvements in TestRExp.dpr
+
+ v. 0.6 1999.08.13 (Friday 13 !)
+ -=- changed header of TRegExpr.Substitute
+ -=- added Split, Replace & appropriate
+ global wrappers (thanks to Stephan Klimek for suggetions)
+
+ v. 0.5 1999.08.12
+ -=- TRegExpr.Substitute routine added
+ -=- Some changes and improvements in TestRExp.dpr
+ -=- Fixed bug in english version of documentation
+ (Thanks to Jon Buckheit)
+
+ v. 0.4 1999.07.20
+ -=- Fixed bug with parsing of strings longer then 255 bytes
+ (thanks to Guido Muehlwitz)
+ -=- Fixed bug in RegMatch - mathes only first occurence of r.e.
+ (thanks to Stephan Klimek)
+
+ v. 0.3 1999.06.13
+ -=- ExecRegExpr function
+
+ v. 0.2 1999.06.10
+ -=- packed into object-pascal class
+ -=- code slightly rewriten for pascal
+ -=- now macro correct proceeded in ranges
+ -=- r.e.ranges syntax extended for russian letters ranges:
+ à-ÿ - replaced with all small russian letters (Win1251)
+ À-ß - replaced with all capital russian letters (Win1251)
+ à-ß - replaced with all russian letters (Win1251)
+ -=- added macro '\d' (opcode ANYDIGIT) - match any digit
+ -=- added macro '\D' (opcode NOTDIGIT) - match not digit
+ -=- added macro '\w' (opcode ANYLETTER) - match any english letter or '_'
+ -=- added macro '\W' (opcode NOTLETTER) - match not english letter or '_'
+ (all r.e.syntax extensions may be turned off by flag ExtSyntax)
+
+ v. 0.1 1999.06.09
+ first version, with bugs, without help => must die :(
+
+*)
+
+interface
+
+{$DEFINE DebugRegExpr} // define for dump/trace enabling
+
+{$IFNDEF cpu64}
+{$DEFINE reRealExceptionAddr} // if defined then exceptions will
+// jump to appropriate source line, not to Error procedure
+{$ENDIF}
+
+{$DEFINE ComplexBraces} // define for beta-version of braces
+// (in stable version it works only for simple cases)
+
+{.$DEFINE UniCode} // define for Unicode support
+
+{$IFNDEF UniCode} // optionts applicable only for non-UniCode
+ {$DEFINE UseSetOfChar} // Significant optimization by using set of char
+{$ENDIF}
+
+{$IFDEF UseSetOfChar}
+ {$DEFINE UseFirstCharSet} // Significant optimization inm some cases
+{$ENDIF}
+
+// Determine version (for using 'params by default')
+{$IFNDEF FPC}
+ {$IFNDEF VER80} { Delphi 1.0}
+ {$IFNDEF VER90} { Delphi 2.0}
+ {$IFNDEF VER93} { C++Builder 1.0}
+ {$IFNDEF VER100} { Borland Delphi 3.0}
+ {$DEFINE D4_} { Delphi 4.0 or higher}
+ {$ENDIF}
+ {$ENDIF}
+ {$ENDIF}
+ {$ENDIF}
+{$ENDIF}
+{.$IFNDEF VER110} { Borland C++Builder 3.0}
+{.$IFNDEF VER120} {Borland Delphi 4.0}
+
+
+uses
+ Classes, // TStrings in Split method
+ SysUtils; // Exception
+
+type
+ {$IFDEF UniCode}
+ PRegExprChar = PWideChar;
+ RegExprString = WideString;
+ REChar = WideChar;
+ {$ELSE}
+ PRegExprChar = PChar;
+ RegExprString = string;
+ REChar = Char;
+ {$ENDIF}
+ TREOp = REChar; // internal p-code type //###0.933
+ PREOp = ^TREOp;
+ TRENextOff = integer; // internal Next "pointer" (offset to current p-code) //###0.933
+ PRENextOff = ^TRENextOff; // used for extracting Next "pointers" from compiled r.e. //###0.933
+ TREBracesArg = integer; // type of {m,n} arguments
+ PREBracesArg = ^TREBracesArg;
+
+const
+ REOpSz = SizeOf (TREOp) div SizeOf (REChar); // size of p-code in RegExprString units
+ RENextOffSz = SizeOf (TRENextOff) div SizeOf (REChar); // size of Next 'pointer' -"-
+ REBracesArgSz = SizeOf (TREBracesArg) div SizeOf (REChar); // size of BRACES arguments -"-
+
+type
+ TRegExprInvertCaseFunction = function (const Ch : REChar) : REChar
+ of object;
+
+const
+ RegExprModifierI : boolean = False; // default value for ModifierI
+ RegExprModifierR : boolean = True; // default value for ModifierR
+ RegExprModifierS : boolean = True; // default value for ModifierS
+ RegExprModifierG : boolean = True; // default value for ModifierG
+ RegExprModifierM : boolean = False; // default value for ModifierM
+ RegExprModifierX : boolean = False; // default value for ModifierX
+ RegExprSpaceChars : RegExprString = // default value for SpaceChars
+ ' '#$9#$A#$D#$C;
+ RegExprWordChars : RegExprString = // default value for WordChars
+ '0123456789' //###0.940
+ + 'abcdefghijklmnopqrstuvwxyz'
+ + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_';
+ RegExprLineSeparators : RegExprString =// default value for LineSeparators
+ #$d#$a{$IFDEF UniCode}+#$b#$c#$2028#$2029#$85{$ENDIF}; //###0.947
+ RegExprLinePairedSeparator : RegExprString =// default value for LinePairedSeparator
+ #$d#$a;
+ { if You need Unix-styled line separators (only \n), then use:
+ RegExprLineSeparators = #$a;
+ RegExprLinePairedSeparator = '';
+ }
+
+
+const
+ NSUBEXP = 15; // max number of subexpression //###0.929
+ // Cannot be more than NSUBEXPMAX
+ // Be carefull - don't use values which overflow CLOSE opcode
+ // (in this case you'll get compiler erorr).
+ // Big NSUBEXP will cause more slow work and more stack required
+ NSUBEXPMAX = 255; // Max possible value for NSUBEXP. //###0.945
+ // Don't change it! It's defined by internal TRegExpr design.
+
+ MaxBracesArg = $7FFFFFFF - 1; // max value for {n,m} arguments //###0.933
+
+ {$IFDEF ComplexBraces}
+ LoopStackMax = 10; // max depth of loops stack //###0.925
+ {$ENDIF}
+
+ TinySetLen = 3;
+ // if range includes more then TinySetLen chars, //###0.934
+ // then use full (32 bytes) ANYOFFULL instead of ANYOF[BUT]TINYSET
+ // !!! Attension ! If you change TinySetLen, you must
+ // change code marked as "//!!!TinySet"
+
+
+type
+
+{$IFDEF UseSetOfChar}
+ PSetOfREChar = ^TSetOfREChar;
+ TSetOfREChar = set of REChar;
+{$ENDIF}
+
+ TRegExpr = class
+ private
+ startp : array [0 .. NSUBEXP - 1] of PRegExprChar; // founded expr starting points
+ endp : array [0 .. NSUBEXP - 1] of PRegExprChar; // founded expr end points
+
+ {$IFDEF ComplexBraces}
+ LoopStack : array [1 .. LoopStackMax] of integer; // state before entering loop
+ LoopStackIdx : integer; // 0 - out of all loops
+ {$ENDIF}
+
+ // The "internal use only" fields to pass info from compile
+ // to execute that permits the execute phase to run lots faster on
+ // simple cases.
+ regstart : REChar; // char that must begin a match; '\0' if none obvious
+ reganch : REChar; // is the match anchored (at beginning-of-line only)?
+ regmust : PRegExprChar; // string (pointer into program) that match must include, or nil
+ regmlen : integer; // length of regmust string
+ // Regstart and reganch permit very fast decisions on suitable starting points
+ // for a match, cutting down the work a lot. Regmust permits fast rejection
+ // of lines that cannot possibly match. The regmust tests are costly enough
+ // that regcomp() supplies a regmust only if the r.e. contains something
+ // potentially expensive (at present, the only such thing detected is * or +
+ // at the start of the r.e., which can involve a lot of backup). Regmlen is
+ // supplied because the test in regexec() needs it and regcomp() is computing
+ // it anyway.
+ {$IFDEF UseFirstCharSet} //###0.929
+ FirstCharSet : TSetOfREChar;
+ {$ENDIF}
+
+ // work variables for Exec's routins - save stack in recursion}
+ reginput : PRegExprChar; // String-input pointer.
+ fInputStart : PRegExprChar; // Pointer to first char of input string.
+ fInputEnd : PRegExprChar; // Pointer to char AFTER last char of input string
+
+ // work variables for compiler's routines
+ regparse : PRegExprChar; // Input-scan pointer.
+ regnpar : integer; // count.
+ regdummy : char;
+ regcode : PRegExprChar; // Code-emit pointer; @regdummy = don't.
+ regsize : integer; // Code size.
+
+ regexpbeg : PRegExprChar; // only for error handling. Contains
+ // pointer to beginning of r.e. while compiling
+ fExprIsCompiled : boolean; // true if r.e. successfully compiled
+
+ // programm is essentially a linear encoding
+ // of a nondeterministic finite-state machine (aka syntax charts or
+ // "railroad normal form" in parsing technology). Each node is an opcode
+ // plus a "next" pointer, possibly plus an operand. "Next" pointers of
+ // all nodes except BRANCH implement concatenation; a "next" pointer with
+ // a BRANCH on both ends of it is connecting two alternatives. (Here we
+ // have one of the subtle syntax dependencies: an individual BRANCH (as
+ // opposed to a collection of them) is never concatenated with anything
+ // because of operator precedence.) The operand of some types of node is
+ // a literal string; for others, it is a node leading into a sub-FSM. In
+ // particular, the operand of a BRANCH node is the first node of the branch.
+ // (NB this is *not* a tree structure: the tail of the branch connects
+ // to the thing following the set of BRANCHes.) The opcodes are:
+ programm : PRegExprChar; // Unwarranted chumminess with compiler.
+
+ fExpression : PRegExprChar; // source of compiled r.e.
+ fInputString : PRegExprChar; // input string
+
+ fLastError : integer; // see Error, LastError
+
+ fModifiers : integer; // modifiers
+ fCompModifiers : integer; // compiler's copy of modifiers
+ fProgModifiers : integer; // modifiers values from last programm compilation
+
+ fSpaceChars : RegExprString; //###0.927
+ fWordChars : RegExprString; //###0.929
+ fInvertCase : TRegExprInvertCaseFunction; //###0.927
+
+ fLineSeparators : RegExprString; //###0.941
+ fLinePairedSeparatorAssigned : boolean;
+ fLinePairedSeparatorHead,
+ fLinePairedSeparatorTail : REChar;
+ {$IFNDEF UniCode}
+ fLineSeparatorsSet : set of REChar;
+ {$ENDIF}
+
+ procedure InvalidateProgramm;
+ // Mark programm as have to be [re]compiled
+
+ function IsProgrammOk : boolean; //###0.941
+ // Check if we can use precompiled r.e. or
+ // [re]compile it if something changed
+
+ function GetExpression : RegExprString;
+ procedure SetExpression (const s : RegExprString);
+
+ function GetModifierStr : RegExprString;
+ class function ParseModifiersStr (const AModifiers : RegExprString;
+ var AModifiersInt : integer) : boolean; //###0.941 class function now
+ // Parse AModifiers string and return true and set AModifiersInt
+ // if it's in format 'ismxrg-ismxrg'.
+ procedure SetModifierStr (const AModifiers : RegExprString);
+
+ function GetModifier (AIndex : integer) : boolean;
+ procedure SetModifier (AIndex : integer; ASet : boolean);
+
+ procedure Error (AErrorID : integer); virtual; // error handler.
+ // Default handler raise exception ERegExpr with
+ // Message = ErrorMsg (AErrorID), ErrorCode = AErrorID
+ // and CompilerErrorPos = value of property CompilerErrorPos.
+
+
+ {==================== Compiler section ===================}
+ function CompileRegExpr (exp : PRegExprChar) : boolean;
+ // compile a regular expression into internal code
+
+ procedure Tail (p : PRegExprChar; val : PRegExprChar);
+ // set the next-pointer at the end of a node chain
+
+ procedure OpTail (p : PRegExprChar; val : PRegExprChar);
+ // regoptail - regtail on operand of first argument; nop if operandless
+
+ function EmitNode (op : TREOp) : PRegExprChar;
+ // regnode - emit a node, return location
+
+ procedure EmitC (b : REChar);
+ // emit (if appropriate) a byte of code
+
+ procedure InsertOperator (op : TREOp; opnd : PRegExprChar; sz : integer); //###0.90
+ // insert an operator in front of already-emitted operand
+ // Means relocating the operand.
+
+ function ParseReg (paren : integer; var flagp : integer) : PRegExprChar;
+ // regular expression, i.e. main body or parenthesized thing
+
+ function ParseBranch (var flagp : integer) : PRegExprChar;
+ // one alternative of an | operator
+
+ function ParsePiece (var flagp : integer) : PRegExprChar;
+ // something followed by possible [*+?]
+
+ function ParseAtom (var flagp : integer) : PRegExprChar;
+ // the lowest level
+
+ function GetCompilerErrorPos : integer;
+ // current pos in r.e. - for error hanling
+
+ {$IFDEF UseFirstCharSet} //###0.929
+ procedure FillFirstCharSet (prog : PRegExprChar);
+ {$ENDIF}
+
+ {===================== Mathing section ===================}
+ function regrepeat (p : PRegExprChar; AMax : integer) : integer;
+ // repeatedly match something simple, report how many
+
+ function regnext (p : PRegExprChar) : PRegExprChar;
+ // dig the "next" pointer out of a node
+
+ function MatchPrim (prog : PRegExprChar) : boolean;
+ // recursively matching routine
+
+ function RegMatch (str : PRegExprChar) : boolean;
+ // try match at specific point, uses MatchPrim for real work
+
+ function ExecPrim (AOffset: integer) : boolean;
+ // Exec for stored InputString
+
+ {$IFDEF DebugRegExpr}
+ function DumpOp (op : REChar) : RegExprString;
+ {$ENDIF}
+
+ function GetSubExprMatchCount : integer;
+ function GetMatchPos (Idx : integer) : integer;
+ function GetMatchLen (Idx : integer) : integer;
+ function GetMatch (Idx : integer) : RegExprString;
+
+ function GetInputString : RegExprString;
+ procedure SetInputString (const AInputString : RegExprString);
+
+ {$IFNDEF UseSetOfChar}
+ function StrScanCI (s : PRegExprChar; ch : REChar) : PRegExprChar; //###0.928
+ {$ENDIF}
+
+ procedure SetLineSeparators (const AStr : RegExprString);
+ procedure SetLinePairedSeparator (const AStr : RegExprString);
+ function GetLinePairedSeparator : RegExprString;
+
+ public
+ constructor Create;
+ destructor Destroy; override;
+
+ class function VersionMajor : integer; //###0.944
+ class function VersionMinor : integer; //###0.944
+
+ property Expression : RegExprString read GetExpression write SetExpression;
+ // Regular expression.
+ // For optimization, TRegExpr will automatically compiles it into 'P-code'
+ // (You can see it with help of Dump method) and stores in internal
+ // structures. Real [re]compilation occures only when it really needed -
+ // while calling Exec[Next], Substitute, Dump, etc
+ // and only if Expression or other P-code affected properties was changed
+ // after last [re]compilation.
+ // If any errors while [re]compilation occures, Error method is called
+ // (by default Error raises exception - see below)
+
+ property ModifierStr : RegExprString read GetModifierStr write SetModifierStr;
+ // Set/get default values of r.e.syntax modifiers. Modifiers in
+ // r.e. (?ismx-ismx) will replace this default values.
+ // If you try to set unsupported modifier, Error will be called
+ // (by defaul Error raises exception ERegExpr).
+
+ property ModifierI : boolean index 1 read GetModifier write SetModifier;
+ // Modifier /i - caseinsensitive, initialized from RegExprModifierI
+
+ property ModifierR : boolean index 2 read GetModifier write SetModifier;
+ // Modifier /r - use r.e.syntax extended for russian,
+ // (was property ExtSyntaxEnabled in previous versions)
+ // If true, then à-ÿ additional include russian letter '¸',
+ // À-ß additional include '¨', and à-ß include all russian symbols.
+ // You have to turn it off if it may interfere with you national alphabet.
+ // , initialized from RegExprModifierR
+
+ property ModifierS : boolean index 3 read GetModifier write SetModifier;
+ // Modifier /s - '.' works as any char (else as [^\n]),
+ // , initialized from RegExprModifierS
+
+ property ModifierG : boolean index 4 read GetModifier write SetModifier;
+ // Switching off modifier /g switchs all operators in
+ // non-greedy style, so if ModifierG = False, then
+ // all '*' works as '*?', all '+' as '+?' and so on.
+ // , initialized from RegExprModifierG
+
+ property ModifierM : boolean index 5 read GetModifier write SetModifier;
+ // Treat string as multiple lines. That is, change `^' and `$' from
+ // matching at only the very start or end of the string to the start
+ // or end of any line anywhere within the string.
+ // , initialized from RegExprModifierM
+
+ property ModifierX : boolean index 6 read GetModifier write SetModifier;
+ // Modifier /x - eXtended syntax, allow r.e. text formatting,
+ // see description in the help. Initialized from RegExprModifierX
+
+ function Exec (const AInputString : RegExprString) : boolean;
+ // match a programm against a string AInputString
+ // !!! Exec store AInputString into InputString property
+
+ function ExecNext : boolean;
+ // find next match:
+ // Exec (AString); ExecNext;
+ // works same as
+ // Exec (AString);
+ // if MatchLen [0] = 0 then ExecPos (MatchPos [0] + 1)
+ // else ExecPos (MatchPos [0] + MatchLen [0]);
+ // but it's more simpler !
+
+ function ExecPos (AOffset: integer {$IFDEF D4_}= 1{$ENDIF}) : boolean;
+ // find match for InputString starting from AOffset position
+ // (AOffset=1 - first char of InputString)
+
+ property InputString : RegExprString read GetInputString write SetInputString;
+ // returns current input string (from last Exec call or last assign
+ // to this property).
+ // Any assignment to this property clear Match* properties !
+
+ function Substitute (const ATemplate : RegExprString) : RegExprString;
+ // Returns ATemplate with '$&' or '$0' replaced by whole r.e.
+ // occurence and '$n' replaced by occurence of subexpression #n.
+ // Since v.0.929 '$' used instead of '\' (for future extensions
+ // and for more Perl-compatibility) and accept more then one digit.
+ // If you want place into template raw '$' or '\', use prefix '\'
+ // Example: '1\$ is $2\\rub\\' -> '1$ is \rub\'
+ // If you want to place raw digit after '$n' you must delimit
+ // n with curly braces '{}'.
+ // Example: 'a$12bc' -> 'abc'
+ // 'a${1}2bc' -> 'a2bc'.
+
+ procedure Split (AInputStr : RegExprString; APieces : TStrings);
+ // Split AInputStr into APieces by r.e. occurencies
+ // Internally calls Exec[Next]
+
+ function Replace (AInputStr : RegExprString;
+ const AReplaceStr : RegExprString;
+ AUseSubstitution : boolean{$IFDEF D4_}= False{$ENDIF}) //###0.946
+ : RegExprString;
+ // Returns AInputStr with r.e. occurencies replaced by AReplaceStr
+ // If AUseSubstitution is true, then AReplaceStr will be used
+ // as template for Substitution methods.
+ // For example:
+ // Expression := '({-i}block|var)\s*\(\s*([^ ]*)\s*\)\s*';
+ // Replace ('BLOCK( test1)', 'def "$1" value "$2"', True);
+ // will return: def 'BLOCK' value 'test1'
+ // Replace ('BLOCK( test1)', 'def "$1" value "$2"')
+ // will return: def "$1" value "$2"
+ // Internally calls Exec[Next]
+
+ property SubExprMatchCount : integer read GetSubExprMatchCount;
+ // Number of subexpressions has been found in last Exec* call.
+ // If there are no subexpr. but whole expr was found (Exec* returned True),
+ // then SubExprMatchCount=0, if no subexpressions nor whole
+ // r.e. found (Exec* returned false) then SubExprMatchCount=-1.
+ // Note, that some subexpr. may be not found and for such
+ // subexpr. MathPos=MatchLen=-1 and Match=''.
+ // For example: Expression := '(1)?2(3)?';
+ // Exec ('123'): SubExprMatchCount=2, Match[0]='123', [1]='1', [2]='3'
+ // Exec ('12'): SubExprMatchCount=1, Match[0]='12', [1]='1'
+ // Exec ('23'): SubExprMatchCount=2, Match[0]='23', [1]='', [2]='3'
+ // Exec ('2'): SubExprMatchCount=0, Match[0]='2'
+ // Exec ('7') - return False: SubExprMatchCount=-1
+
+ property MatchPos [Idx : integer] : integer read GetMatchPos;
+ // pos of entrance subexpr. #Idx into tested in last Exec*
+ // string. First subexpr. have Idx=1, last - MatchCount,
+ // whole r.e. have Idx=0.
+ // Returns -1 if in r.e. no such subexpr. or this subexpr.
+ // not found in input string.
+
+ property MatchLen [Idx : integer] : integer read GetMatchLen;
+ // len of entrance subexpr. #Idx r.e. into tested in last Exec*
+ // string. First subexpr. have Idx=1, last - MatchCount,
+ // whole r.e. have Idx=0.
+ // Returns -1 if in r.e. no such subexpr. or this subexpr.
+ // not found in input string.
+ // Remember - MatchLen may be 0 (if r.e. match empty string) !
+
+ property Match [Idx : integer] : RegExprString read GetMatch;
+ // == copy (InputString, MatchPos [Idx], MatchLen [Idx])
+ // Returns '' if in r.e. no such subexpr. or this subexpr.
+ // not found in input string.
+
+ function LastError : integer;
+ // Returns ID of last error, 0 if no errors (unusable if
+ // Error method raises exception) and clear internal status
+ // into 0 (no errors).
+
+ function ErrorMsg (AErrorID : integer) : RegExprString; virtual;
+ // Returns Error message for error with ID = AErrorID.
+
+ property CompilerErrorPos : integer read GetCompilerErrorPos;
+ // Returns pos in r.e. there compiler stopped.
+ // Usefull for error diagnostics
+
+ property SpaceChars : RegExprString read fSpaceChars write fSpaceChars; //###0.927
+ // Contains chars, treated as /s (initially filled with RegExprSpaceChars
+ // global constant)
+
+ property WordChars : RegExprString read fWordChars write fWordChars; //###0.929
+ // Contains chars, treated as /w (initially filled with RegExprWordChars
+ // global constant)
+
+ property LineSeparators : RegExprString read fLineSeparators write SetLineSeparators; //###0.941
+ // line separators (like \n in Unix)
+
+ property LinePairedSeparator : RegExprString read GetLinePairedSeparator write SetLinePairedSeparator; //###0.941
+ // paired line separator (like \r\n in DOS and Windows).
+ // must contain exactly two chars or no chars at all
+
+ class function InvertCaseFunction (const Ch : REChar) : REChar;
+ // Converts Ch into upper case if it in lower case or in lower
+ // if it in upper (uses current system local setings)
+
+ property InvertCase : TRegExprInvertCaseFunction read fInvertCase write fInvertCase; //##0.935
+ // Set this property if you want to override case-insensitive functionality.
+ // Create set it to RegExprInvertCaseFunction (InvertCaseFunction by default)
+
+ procedure Compile; //###0.941
+ // [Re]compile r.e. Usefull for example for GUI r.e. editors (to check
+ // all properties validity).
+
+ {$IFDEF DebugRegExpr}
+ function Dump : RegExprString;
+ // dump a compiled regexp in vaguely comprehensible form
+ {$ENDIF}
+ end;
+
+ ERegExpr = class (Exception)
+ public
+ ErrorCode : integer;
+ CompilerErrorPos : integer;
+ end;
+
+const
+ RegExprInvertCaseFunction : TRegExprInvertCaseFunction = nil;//TRegExpr.InvertCaseFunction;
+ // defaul for InvertCase property
+
+function ExecRegExpr (const ARegExpr, AInputStr : RegExprString) : boolean;
+// true if string AInputString match regular expression ARegExpr
+// ! will raise exeption if syntax errors in ARegExpr
+
+procedure SplitRegExpr (const ARegExpr, AInputStr : RegExprString; APieces : TStrings);
+// Split AInputStr into APieces by r.e. ARegExpr occurencies
+
+function ReplaceRegExpr (const ARegExpr, AInputStr, AReplaceStr : RegExprString;
+ AUseSubstitution : boolean{$IFDEF D4_}= False{$ENDIF}) : RegExprString; //###0.947
+// Returns AInputStr with r.e. occurencies replaced by AReplaceStr
+// If AUseSubstitution is true, then AReplaceStr will be used
+// as template for Substitution methods.
+// For example:
+// ReplaceRegExpr ('({-i}block|var)\s*\(\s*([^ ]*)\s*\)\s*',
+// 'BLOCK( test1)', 'def "$1" value "$2"', True)
+// will return: def 'BLOCK' value 'test1'
+// ReplaceRegExpr ('({-i}block|var)\s*\(\s*([^ ]*)\s*\)\s*',
+// 'BLOCK( test1)', 'def "$1" value "$2"')
+// will return: def "$1" value "$2"
+
+function QuoteRegExprMetaChars (const AStr : RegExprString) : RegExprString;
+// Replace all metachars with its safe representation,
+// for example 'abc$cd.(' converts into 'abc\$cd\.\('
+// This function usefull for r.e. autogeneration from
+// user input
+
+function RegExprSubExpressions (const ARegExpr : string;
+ ASubExprs : TStrings; AExtendedSyntax : boolean{$IFDEF D4_}= False{$ENDIF}) : integer;
+// Makes list of subexpressions found in ARegExpr r.e.
+// In ASubExps every item represent subexpression,
+// from first to last, in format:
+// String - subexpression text (without '()')
+// low word of Object - starting position in ARegExpr, including '('
+// if exists! (first position is 1)
+// high word of Object - length, including starting '(' and ending ')'
+// if exist!
+// AExtendedSyntax - must be True if modifier /m will be On while
+// using the r.e.
+// Usefull for GUI editors of r.e. etc (You can find example of using
+// in TestRExp.dpr project)
+// Returns
+// 0 Success. No unbalanced brackets was found;
+// -1 There are not enough closing brackets ')';
+// -(n+1) At position n was found opening '[' without //###0.942
+// corresponding closing ']';
+// n At position n was found closing bracket ')' without
+// corresponding opening '('.
+// If Result <> 0, then ASubExpr can contain empty items or illegal ones
+
+
+implementation
+
+uses
+ uROClasses;
+
+const
+ TRegExprVersionMajor : integer = 0;
+ TRegExprVersionMinor : integer = 947;
+ // don't use this const directly, use TRegExpr.VersionXXX instead
+
+ MaskModI = 1; // modifier /i bit in fModifiers
+ MaskModR = 2; // -"- /r
+ MaskModS = 4; // -"- /s
+ MaskModG = 8; // -"- /g
+ MaskModM = 16; // -"- /m
+ MaskModX = 32; // -"- /x
+
+ {$IFDEF UniCode}
+ XIgnoredChars = ' '#9#$d#$a;
+ {$ELSE}
+ XIgnoredChars = [' ', #9, #$d, #$a];
+ {$ENDIF}
+
+{=============================================================}
+{=================== WideString functions ====================}
+{=============================================================}
+
+{$IFDEF UniCode}
+
+function StrPCopy (Dest: PRegExprChar; const Source: RegExprString): PRegExprChar;
+ var
+ i, Len : Integer;
+ begin
+ Len := length (Source); //###0.932
+ for i := 1 to Len do
+ Dest [i - 1] := Source [i];
+ Dest [Len] := #0;
+ Result := Dest;
+ end; { of function StrPCopy
+--------------------------------------------------------------}
+
+function StrLCopy (Dest, Source: PRegExprChar; MaxLen: Cardinal): PRegExprChar;
+ var i: Integer;
+ begin
+ for i := 0 to MaxLen - 1 do
+ Dest [i] := Source [i];
+ Result := Dest;
+ end; { of function StrLCopy
+--------------------------------------------------------------}
+
+function StrLen (Str: PRegExprChar): Cardinal;
+ begin
+ Result:=0;
+ while Str [result] <> #0
+ do Inc (Result);
+ end; { of function StrLen
+--------------------------------------------------------------}
+
+function StrPos (Str1, Str2: PRegExprChar): PRegExprChar;
+ var n: Integer;
+ begin
+ Result := nil;
+ n := Pos (RegExprString (Str2), RegExprString (Str1));
+ if n = 0
+ then EXIT;
+ Result := Str1 + n - 1;
+ end; { of function StrPos
+--------------------------------------------------------------}
+
+function StrLComp (Str1, Str2: PRegExprChar; MaxLen: Cardinal): Integer;
+ var S1, S2: RegExprString;
+ begin
+ S1 := Str1;
+ S2 := Str2;
+ if Copy (S1, 1, MaxLen) > Copy (S2, 1, MaxLen)
+ then Result := 1
+ else
+ if Copy (S1, 1, MaxLen) < Copy (S2, 1, MaxLen)
+ then Result := -1
+ else Result := 0;
+ end; { function StrLComp
+--------------------------------------------------------------}
+
+function StrScan (Str: PRegExprChar; Chr: WideChar): PRegExprChar;
+ begin
+ Result := nil;
+ while (Str^ <> #0) and (Str^ <> Chr)
+ do Inc (Str);
+ if (Str^ <> #0)
+ then Result := Str;
+ end; { of function StrScan
+--------------------------------------------------------------}
+
+{$ENDIF}
+
+
+{=============================================================}
+{===================== Global functions ======================}
+{=============================================================}
+
+function ExecRegExpr (const ARegExpr, AInputStr : RegExprString) : boolean;
+ var r : TRegExpr;
+ begin
+ r := TRegExpr.Create;
+ try
+ r.Expression := ARegExpr;
+ Result := r.Exec (AInputStr);
+ finally r.Free;
+ end;
+ end; { of function ExecRegExpr
+--------------------------------------------------------------}
+
+procedure SplitRegExpr (const ARegExpr, AInputStr : RegExprString; APieces : TStrings);
+ var r : TRegExpr;
+ begin
+ APieces.Clear;
+ r := TRegExpr.Create;
+ try
+ r.Expression := ARegExpr;
+ r.Split (AInputStr, APieces);
+ finally r.Free;
+ end;
+ end; { of procedure SplitRegExpr
+--------------------------------------------------------------}
+
+function ReplaceRegExpr (const ARegExpr, AInputStr, AReplaceStr : RegExprString;
+ AUseSubstitution : boolean{$IFDEF D4_}= False{$ENDIF}) : RegExprString;
+ var r : TRegExpr;
+ begin
+ r := TRegExpr.Create;
+ try
+ r.Expression := ARegExpr;
+ Result := r.Replace (AInputStr, AReplaceStr, AUseSubstitution); //###0.947
+ finally r.Free;
+ end;
+ end; { of function ReplaceRegExpr
+--------------------------------------------------------------}
+
+function QuoteRegExprMetaChars (const AStr : RegExprString) : RegExprString;
+ const
+ RegExprMetaSet : RegExprString = '^$.[()|?+*\{'
+ + ']}'; // - this last are additional to META.
+ // Very similar to META array, but slighly changed.
+ // !Any changes in META array must be synchronized with this set.
+ var
+ i, i0, Len : integer;
+ begin
+ Result := '';
+ Len := length (AStr);
+ i := 1;
+ i0 := i;
+ while i <= Len do begin
+ if Pos (AStr [i], RegExprMetaSet) > 0 then begin
+ Result := Result + System.Copy (AStr, i0, i - i0)
+ + '\' + AStr [i];
+ i0 := i + 1;
+ end;
+ inc (i);
+ end;
+ Result := Result + System.Copy (AStr, i0, MaxInt); // Tail
+ end; { of function QuoteRegExprMetaChars
+--------------------------------------------------------------}
+
+function RegExprSubExpressions (const ARegExpr : string;
+ ASubExprs : TStrings; AExtendedSyntax : boolean{$IFDEF D4_}= False{$ENDIF}) : integer;
+ type
+ TStackItemRec = record //###0.945
+ SubExprIdx : integer;
+ StartPos : integer;
+ end;
+ TStackArray = packed array [0 .. NSUBEXPMAX - 1] of TStackItemRec;
+ var
+ Len, SubExprLen : integer;
+ i, i0 : integer;
+ Modif : integer;
+ Stack : ^TStackArray; //###0.945
+ StackIdx, StackSz : integer;
+ begin
+ Result := 0; // no unbalanced brackets found at this very moment
+
+ ASubExprs.Clear; // I don't think that adding to non empty list
+ // can be usefull, so I simplified algorithm to work only with empty list
+
+ Len := length (ARegExpr); // some optimization tricks
+
+ // first we have to calculate number of subexpression to reserve
+ // space in Stack array (may be we'll reserve more then need, but
+ // it's faster then memory reallocation during parsing)
+ StackSz := 1; // add 1 for entire r.e.
+ for i := 1 to Len do
+ if ARegExpr [i] = '('
+ then inc (StackSz);
+// SetLength (Stack, StackSz); //###0.945
+ GetMem (Stack, SizeOf (TStackItemRec) * StackSz);
+ try
+
+ StackIdx := 0;
+ i := 1;
+ while (i <= Len) do begin
+ case ARegExpr [i] of
+ '(': begin
+ if (i < Len) and (ARegExpr [i + 1] = '?') then begin
+ // this is not subexpression, but comment or other
+ // Perl extension. We must check is it (?ismxrg-ismxrg)
+ // and change AExtendedSyntax if /x is changed.
+ inc (i, 2); // skip '(?'
+ i0 := i;
+ while (i <= Len) and (ARegExpr [i] <> ')')
+ do inc (i);
+ if i > Len
+ then Result := -1 // unbalansed '('
+ else
+ if TRegExpr.ParseModifiersStr (System.Copy (ARegExpr, i, i - i0), Modif)
+ then AExtendedSyntax := (Modif and MaskModX) <> 0;
+ end
+ else begin // subexpression starts
+ ASubExprs.Add (''); // just reserve space
+ with Stack [StackIdx] do begin
+ SubExprIdx := ASubExprs.Count - 1;
+ StartPos := i;
+ end;
+ inc (StackIdx);
+ end;
+ end;
+ ')': begin
+ if StackIdx = 0
+ then Result := i // unbalanced ')'
+ else begin
+ dec (StackIdx);
+ with Stack [StackIdx] do begin
+ SubExprLen := i - StartPos + 1;
+ ASubExprs.Objects [SubExprIdx] :=
+ TObject (StartPos or (SubExprLen ShL 16));
+ ASubExprs [SubExprIdx] := System.Copy (
+ ARegExpr, StartPos + 1, SubExprLen - 2); // add without brackets
+ end;
+ end;
+ end;
+ '\': inc (i); // skip quoted symbol
+ '[': begin
+ // we have to skip character ranges at once, because they can
+ // contain '#', and '#' in it must NOT be recognized as eXtended
+ // comment beginning!
+ i0 := i;
+ inc (i);
+ if ARegExpr [i] = ']' // cannot be 'emty' ranges - this interpretes
+ then inc (i); // as ']' by itself
+ while (i <= Len) and (ARegExpr [i] <> ']') do
+ if ARegExpr [i] = '\' //###0.942
+ then inc (i, 2) // skip 'escaped' char to prevent stopping at '\]'
+ else inc (i);
+ if (i > Len) or (ARegExpr [i] <> ']') //###0.942
+ then Result := - (i0 + 1); // unbalansed '[' //###0.942
+ end;
+ '#': if AExtendedSyntax then begin
+ // skip eXtended comments
+ while (i <= Len) and (ARegExpr [i] <> #$d) and (ARegExpr [i] <> #$a)
+ // do not use [#$d, #$a] due to UniCode compatibility
+ do inc (i);
+ while (i + 1 <= Len) and ((ARegExpr [i + 1] = #$d) or (ARegExpr [i + 1] = #$a))
+ do inc (i); // attempt to work with different kinds of line separators
+ // now we are at the line separator that must be skipped.
+ end;
+ // here is no 'else' clause - we simply skip ordinary chars
+ end; // of case
+ inc (i); // skip scanned char
+ // ! can move after Len due to skipping quoted symbol
+ end;
+
+ // check brackets balance
+ if StackIdx <> 0
+ then Result := -1; // unbalansed '('
+
+ // check if entire r.e. added
+ if (ASubExprs.Count = 0)
+ or ((integer (ASubExprs.Objects [0]) and $FFFF) <> 1)
+ or (((integer (ASubExprs.Objects [0]) ShR 16) and $FFFF) <> Len)
+ // whole r.e. wasn't added because it isn't bracketed
+ // well, we add it now:
+ then ASubExprs.InsertObject (0, ARegExpr, TObject ((Len ShL 16) or 1));
+
+ finally FreeMem (Stack);
+ end;
+ end; { of function RegExprSubExpressions
+--------------------------------------------------------------}
+
+
+
+const
+ MAGIC = TREOp (216);// programm signature
+
+// name opcode opnd? meaning
+ EEND = TREOp (0); // - End of program
+ BOL = TREOp (1); // - Match "" at beginning of line
+ EOL = TREOp (2); // - Match "" at end of line
+ ANY = TREOp (3); // - Match any one character
+ ANYOF = TREOp (4); // Str Match any character in string Str
+ ANYBUT = TREOp (5); // Str Match any char. not in string Str
+ BRANCH = TREOp (6); // Node Match this alternative, or the next
+ BACK = TREOp (7); // - Jump backward (Next < 0)
+ EXACTLY = TREOp (8); // Str Match string Str
+ NOTHING = TREOp (9); // - Match empty string
+ STAR = TREOp (10); // Node Match this (simple) thing 0 or more times
+ PLUS = TREOp (11); // Node Match this (simple) thing 1 or more times
+ ANYDIGIT = TREOp (12); // - Match any digit (equiv [0-9])
+ NOTDIGIT = TREOp (13); // - Match not digit (equiv [0-9])
+ ANYLETTER = TREOp (14); // - Match any letter from property WordChars
+ NOTLETTER = TREOp (15); // - Match not letter from property WordChars
+ ANYSPACE = TREOp (16); // - Match any space char (see property SpaceChars)
+ NOTSPACE = TREOp (17); // - Match not space char (see property SpaceChars)
+ BRACES = TREOp (18); // Node,Min,Max Match this (simple) thing from Min to Max times.
+ // Min and Max are TREBracesArg
+ COMMENT = TREOp (19); // - Comment ;)
+ EXACTLYCI = TREOp (20); // Str Match string Str case insensitive
+ ANYOFCI = TREOp (21); // Str Match any character in string Str, case insensitive
+ ANYBUTCI = TREOp (22); // Str Match any char. not in string Str, case insensitive
+ LOOPENTRY = TREOp (23); // Node Start of loop (Node - LOOP for this loop)
+ LOOP = TREOp (24); // Node,Min,Max,LoopEntryJmp - back jump for LOOPENTRY.
+ // Min and Max are TREBracesArg
+ // Node - next node in sequence,
+ // LoopEntryJmp - associated LOOPENTRY node addr
+ ANYOFTINYSET= TREOp (25); // Chrs Match any one char from Chrs (exactly TinySetLen chars)
+ ANYBUTTINYSET=TREOp (26); // Chrs Match any one char not in Chrs (exactly TinySetLen chars)
+ ANYOFFULLSET= TREOp (27); // Set Match any one char from set of char
+ // - very fast (one CPU instruction !) but takes 32 bytes of p-code
+ BSUBEXP = TREOp (28); // Idx Match previously matched subexpression #Idx (stored as REChar) //###0.936
+ BSUBEXPCI = TREOp (29); // Idx -"- in case-insensitive mode
+
+ // Non-Greedy Style Ops //###0.940
+ STARNG = TREOp (30); // Same as START but in non-greedy mode
+ PLUSNG = TREOp (31); // Same as PLUS but in non-greedy mode
+ BRACESNG = TREOp (32); // Same as BRACES but in non-greedy mode
+ LOOPNG = TREOp (33); // Same as LOOP but in non-greedy mode
+
+ // Multiline mode \m
+ BOLML = TREOp (34); // - Match "" at beginning of line
+ EOLML = TREOp (35); // - Match "" at end of line
+ ANYML = TREOp (36); // - Match any one character
+
+ // Word boundary
+ BOUND = TREOp (37); // Match "" between words //###0.943
+ NOTBOUND = TREOp (38); // Match "" not between words //###0.943
+
+ // !!! Change OPEN value if you add new opcodes !!!
+
+ OPEN = TREOp (39); // - Mark this point in input as start of \n
+ // OPEN + 1 is \1, etc.
+ CLOSE = TREOp (ord (OPEN) + NSUBEXP);
+ // - Analogous to OPEN.
+
+ // !!! Don't add new OpCodes after CLOSE !!!
+
+// We work with p-code thru pointers, compatible with PRegExprChar.
+// Note: all code components (TRENextOff, TREOp, TREBracesArg, etc)
+// must have lengths that can be divided by SizeOf (REChar) !
+// A node is TREOp of opcode followed Next "pointer" of TRENextOff type.
+// The Next is a offset from the opcode of the node containing it.
+// An operand, if any, simply follows the node. (Note that much of
+// the code generation knows about this implicit relationship!)
+// Using TRENextOff=integer speed up p-code processing.
+
+// Opcodes description:
+//
+// BRANCH The set of branches constituting a single choice are hooked
+// together with their "next" pointers, since precedence prevents
+// anything being concatenated to any individual branch. The
+// "next" pointer of the last BRANCH in a choice points to the
+// thing following the whole choice. This is also where the
+// final "next" pointer of each individual branch points; each
+// branch starts with the operand node of a BRANCH node.
+// BACK Normal "next" pointers all implicitly point forward; BACK
+// exists to make loop structures possible.
+// STAR,PLUS,BRACES '?', and complex '*' and '+', are implemented as
+// circular BRANCH structures using BACK. Complex '{min,max}'
+// - as pair LOOPENTRY-LOOP (see below). Simple cases (one
+// character per match) are implemented with STAR, PLUS and
+// BRACES for speed and to minimize recursive plunges.
+// LOOPENTRY,LOOP {min,max} are implemented as special pair
+// LOOPENTRY-LOOP. Each LOOPENTRY initialize loopstack for
+// current level.
+// OPEN,CLOSE are numbered at compile time.
+
+
+{=============================================================}
+{================== Error handling section ===================}
+{=============================================================}
+
+const
+ reeOk = 0;
+ reeCompNullArgument = 100;
+ reeCompRegexpTooBig = 101;
+ reeCompParseRegTooManyBrackets = 102;
+ reeCompParseRegUnmatchedBrackets = 103;
+ reeCompParseRegUnmatchedBrackets2 = 104;
+ reeCompParseRegJunkOnEnd = 105;
+ reePlusStarOperandCouldBeEmpty = 106;
+ reeNestedSQP = 107;
+ reeBadHexDigit = 108;
+ reeInvalidRange = 109;
+ reeParseAtomTrailingBackSlash = 110;
+ reeNoHexCodeAfterBSlashX = 111;
+ reeHexCodeAfterBSlashXTooBig = 112;
+ reeUnmatchedSqBrackets = 113;
+ reeInternalUrp = 114;
+ reeQPSBFollowsNothing = 115;
+ reeTrailingBackSlash = 116;
+ reeRarseAtomInternalDisaster = 119;
+ reeBRACESArgTooBig = 122;
+ reeBracesMinParamGreaterMax = 124;
+ reeUnclosedComment = 125;
+ reeComplexBracesNotImplemented = 126;
+ reeUrecognizedModifier = 127;
+ reeBadLinePairedSeparator = 128;
+ reeRegRepeatCalledInappropriately = 1000;
+ reeMatchPrimMemoryCorruption = 1001;
+ reeMatchPrimCorruptedPointers = 1002;
+ reeNoExpression = 1003;
+ reeCorruptedProgram = 1004;
+ reeNoInpitStringSpecified = 1005;
+ reeOffsetMustBeGreaterThen0 = 1006;
+ reeExecNextWithoutExec = 1007;
+ reeGetInputStringWithoutInputString = 1008;
+ reeDumpCorruptedOpcode = 1011;
+ reeModifierUnsupported = 1013;
+ reeLoopStackExceeded = 1014;
+ reeLoopWithoutEntry = 1015;
+
+function TRegExpr.ErrorMsg (AErrorID : integer) : RegExprString;
+ begin
+ case AErrorID of
+ reeOk: Result := 'No errors';
+ reeCompNullArgument: Result := 'TRegExpr(comp): Null Argument';
+ reeCompRegexpTooBig: Result := 'TRegExpr(comp): Regexp Too Big';
+ reeCompParseRegTooManyBrackets: Result := 'TRegExpr(comp): ParseReg Too Many ()';
+ reeCompParseRegUnmatchedBrackets: Result := 'TRegExpr(comp): ParseReg Unmatched ()';
+ reeCompParseRegUnmatchedBrackets2: Result := 'TRegExpr(comp): ParseReg Unmatched ()';
+ reeCompParseRegJunkOnEnd: Result := 'TRegExpr(comp): ParseReg Junk On End';
+ reePlusStarOperandCouldBeEmpty: Result := 'TRegExpr(comp): *+ Operand Could Be Empty';
+ reeNestedSQP: Result := 'TRegExpr(comp): Nested *?+';
+ reeBadHexDigit: Result := 'TRegExpr(comp): Bad Hex Digit';
+ reeInvalidRange: Result := 'TRegExpr(comp): Invalid [] Range';
+ reeParseAtomTrailingBackSlash: Result := 'TRegExpr(comp): Parse Atom Trailing \';
+ reeNoHexCodeAfterBSlashX: Result := 'TRegExpr(comp): No Hex Code After \x';
+ reeHexCodeAfterBSlashXTooBig: Result := 'TRegExpr(comp): Hex Code After \x Is Too Big';
+ reeUnmatchedSqBrackets: Result := 'TRegExpr(comp): Unmatched []';
+ reeInternalUrp: Result := 'TRegExpr(comp): Internal Urp';
+ reeQPSBFollowsNothing: Result := 'TRegExpr(comp): ?+*{ Follows Nothing';
+ reeTrailingBackSlash: Result := 'TRegExpr(comp): Trailing \';
+ reeRarseAtomInternalDisaster: Result := 'TRegExpr(comp): RarseAtom Internal Disaster';
+ reeBRACESArgTooBig: Result := 'TRegExpr(comp): BRACES Argument Too Big';
+ reeBracesMinParamGreaterMax: Result := 'TRegExpr(comp): BRACE Min Param Greater then Max';
+ reeUnclosedComment: Result := 'TRegExpr(comp): Unclosed (?#Comment)';
+ reeComplexBracesNotImplemented: Result := 'TRegExpr(comp): If you want take part in beta-testing BRACES ''{min,max}'' and non-greedy ops ''*?'', ''+?'', ''??'' for complex cases - remove ''.'' from {.$DEFINE ComplexBraces}';
+ reeUrecognizedModifier: Result := 'TRegExpr(comp): Urecognized Modifier';
+ reeBadLinePairedSeparator: Result := 'TRegExpr(comp): LinePairedSeparator must countain two different chars or no chars at all';
+
+ reeRegRepeatCalledInappropriately: Result := 'TRegExpr(exec): RegRepeat Called Inappropriately';
+ reeMatchPrimMemoryCorruption: Result := 'TRegExpr(exec): MatchPrim Memory Corruption';
+ reeMatchPrimCorruptedPointers: Result := 'TRegExpr(exec): MatchPrim Corrupted Pointers';
+ reeNoExpression: Result := 'TRegExpr(exec): Not Assigned Expression Property';
+ reeCorruptedProgram: Result := 'TRegExpr(exec): Corrupted Program';
+ reeNoInpitStringSpecified: Result := 'TRegExpr(exec): No Inpit String Specified';
+ reeOffsetMustBeGreaterThen0: Result := 'TRegExpr(exec): Offset Must Be Greater Then 0';
+ reeExecNextWithoutExec: Result := 'TRegExpr(exec): ExecNext Without Exec[Pos]';
+ reeGetInputStringWithoutInputString: Result := 'TRegExpr(exec): GetInputString Without InputString';
+ reeDumpCorruptedOpcode: Result := 'TRegExpr(dump): Corrupted Opcode';
+ reeLoopStackExceeded: Result := 'TRegExpr(exec): Loop Stack Exceeded';
+ reeLoopWithoutEntry: Result := 'TRegExpr(exec): Loop Without LoopEntry !';
+ else Result := 'Unknown error';
+ end;
+ end; { of procedure TRegExpr.Error
+--------------------------------------------------------------}
+
+function TRegExpr.LastError : integer;
+ begin
+ Result := fLastError;
+ fLastError := reeOk;
+ end; { of function TRegExpr.LastError
+--------------------------------------------------------------}
+
+
+{=============================================================}
+{===================== Common section ========================}
+{=============================================================}
+
+class function TRegExpr.VersionMajor : integer; //###0.944
+ begin
+ Result := TRegExprVersionMajor;
+ end; { of class function TRegExpr.VersionMajor
+--------------------------------------------------------------}
+
+class function TRegExpr.VersionMinor : integer; //###0.944
+ begin
+ Result := TRegExprVersionMinor;
+ end; { of class function TRegExpr.VersionMinor
+--------------------------------------------------------------}
+
+constructor TRegExpr.Create;
+ begin
+ inherited;
+ programm := nil;
+ fExpression := nil;
+ fInputString := nil;
+
+ regexpbeg := nil;
+ fExprIsCompiled := false;
+
+ ModifierI := RegExprModifierI;
+ ModifierR := RegExprModifierR;
+ ModifierS := RegExprModifierS;
+ ModifierG := RegExprModifierG;
+ ModifierM := RegExprModifierM; //###0.940
+
+ SpaceChars := RegExprSpaceChars; //###0.927
+ WordChars := RegExprWordChars; //###0.929
+ fInvertCase := RegExprInvertCaseFunction; //###0.927
+
+ fLineSeparators := RegExprLineSeparators; //###0.941
+ LinePairedSeparator := RegExprLinePairedSeparator; //###0.941
+ end; { of constructor TRegExpr.Create
+--------------------------------------------------------------}
+
+destructor TRegExpr.Destroy;
+ begin
+ if programm <> nil
+ then FreeMem (programm);
+ if fExpression <> nil
+ then FreeMem (fExpression);
+ if fInputString <> nil
+ then FreeMem (fInputString);
+ end; { of destructor TRegExpr.Destroy
+--------------------------------------------------------------}
+
+function LoCase (ch: Char): Char;
+begin
+ if CharInSet(ch, ['A'..'Z']) then
+ LoCase := chr(ord(ch) xor 32)
+ else
+ LoCase := ch
+end; { LoCase }
+
+class function TRegExpr.InvertCaseFunction (const Ch : REChar) : REChar;
+ begin
+ {$IFDEF UniCode}
+ if Ch >= #128
+ then Result := Ch
+ else
+ {$ENDIF}
+ begin
+ Result := REChar (UpCase(Ch));
+ if Result = Ch
+ then Result := REChar (LoCase(Ch));
+ end;
+ end; { of function TRegExpr.InvertCaseFunction
+--------------------------------------------------------------}
+
+function TRegExpr.GetExpression : RegExprString;
+ begin
+ if fExpression <> nil
+ then Result := fExpression
+ else Result := '';
+ end; { of function TRegExpr.GetExpression
+--------------------------------------------------------------}
+
+procedure TRegExpr.SetExpression (const s : RegExprString);
+ begin
+ if (s <> fExpression) or not fExprIsCompiled then begin
+ fExprIsCompiled := false;
+ if fExpression <> nil then begin
+ FreeMem (fExpression);
+ fExpression := nil;
+ end;
+ if s <> '' then begin
+ GetMem (fExpression, (length (s) + 1) * SizeOf (REChar));
+ StrPCopy (fExpression, s);
+ InvalidateProgramm; //###0.941
+ end;
+ end;
+ end; { of procedure TRegExpr.SetExpression
+--------------------------------------------------------------}
+
+function TRegExpr.GetSubExprMatchCount : integer;
+ begin
+ if Assigned (fInputString) then begin
+ Result := NSUBEXP - 1;
+ while (Result > 0) and ((startp [Result] = nil)
+ or (endp [Result] = nil))
+ do dec (Result);
+ end
+ else Result := -1;
+ end; { of function TRegExpr.GetSubExprMatchCount
+--------------------------------------------------------------}
+
+function TRegExpr.GetMatchPos (Idx : integer) : integer;
+ begin
+ if (Idx >= 0) and (Idx < NSUBEXP) and Assigned (fInputString)
+ and Assigned (startp [Idx]) and Assigned (endp [Idx]) then begin
+ Result := (startp [Idx] - fInputString) + 1;
+ end
+ else Result := -1;
+ end; { of function TRegExpr.GetMatchPos
+--------------------------------------------------------------}
+
+function TRegExpr.GetMatchLen (Idx : integer) : integer;
+ begin
+ if (Idx >= 0) and (Idx < NSUBEXP) and Assigned (fInputString)
+ and Assigned (startp [Idx]) and Assigned (endp [Idx]) then begin
+ Result := endp [Idx] - startp [Idx];
+ end
+ else Result := -1;
+ end; { of function TRegExpr.GetMatchLen
+--------------------------------------------------------------}
+
+function TRegExpr.GetMatch (Idx : integer) : RegExprString;
+ begin
+ if (Idx >= 0) and (Idx < NSUBEXP) and Assigned (fInputString)
+ and Assigned (startp [Idx]) and Assigned (endp [Idx])
+ //then Result := copy (fInputString, MatchPos [Idx], MatchLen [Idx]) //###0.929
+ then SetString (Result, startp [idx], endp [idx] - startp [idx])
+ else Result := '';
+ end; { of function TRegExpr.GetMatch
+--------------------------------------------------------------}
+
+function TRegExpr.GetModifierStr : RegExprString;
+ begin
+ Result := '-';
+
+ if ModifierI
+ then Result := 'i' + Result
+ else Result := Result + 'i';
+ if ModifierR
+ then Result := 'r' + Result
+ else Result := Result + 'r';
+ if ModifierS
+ then Result := 's' + Result
+ else Result := Result + 's';
+ if ModifierG
+ then Result := 'g' + Result
+ else Result := Result + 'g';
+ if ModifierM
+ then Result := 'm' + Result
+ else Result := Result + 'm';
+ if ModifierX
+ then Result := 'x' + Result
+ else Result := Result + 'x';
+
+ if Result [length (Result)] = '-' // remove '-' if all modifiers are 'On'
+ then System.Delete (Result, length (Result), 1);
+ end; { of function TRegExpr.GetModifierStr
+--------------------------------------------------------------}
+
+class function TRegExpr.ParseModifiersStr (const AModifiers : RegExprString;
+var AModifiersInt : integer) : boolean;
+// !!! Be carefull - this is class function and must not use object instance fields
+ var
+ i : integer;
+ IsOn : boolean;
+ Mask : integer;
+ begin
+ Result := true;
+ IsOn := true;
+ Mask := 0; // prevent compiler warning
+ for i := 1 to length (AModifiers) do
+ if AModifiers [i] = '-'
+ then IsOn := false
+ else begin
+ if Pos (AModifiers [i], 'iI') > 0
+ then Mask := MaskModI
+ else if Pos (AModifiers [i], 'rR') > 0
+ then Mask := MaskModR
+ else if Pos (AModifiers [i], 'sS') > 0
+ then Mask := MaskModS
+ else if Pos (AModifiers [i], 'gG') > 0
+ then Mask := MaskModG
+ else if Pos (AModifiers [i], 'mM') > 0
+ then Mask := MaskModM
+ else if Pos (AModifiers [i], 'xX') > 0
+ then Mask := MaskModX
+ else begin
+ Result := false;
+ EXIT;
+ end;
+ if IsOn
+ then AModifiersInt := AModifiersInt or Mask
+ else AModifiersInt := AModifiersInt and not Mask;
+ end;
+ end; { of function TRegExpr.ParseModifiersStr
+--------------------------------------------------------------}
+
+procedure TRegExpr.SetModifierStr (const AModifiers : RegExprString);
+ begin
+ if not ParseModifiersStr (AModifiers, fModifiers)
+ then Error (reeModifierUnsupported);
+ end; { of procedure TRegExpr.SetModifierStr
+--------------------------------------------------------------}
+
+function TRegExpr.GetModifier (AIndex : integer) : boolean;
+ var
+ Mask : integer;
+ begin
+ Result := false;
+ case AIndex of
+ 1: Mask := MaskModI;
+ 2: Mask := MaskModR;
+ 3: Mask := MaskModS;
+ 4: Mask := MaskModG;
+ 5: Mask := MaskModM;
+ 6: Mask := MaskModX;
+ else begin
+ Error (reeModifierUnsupported);
+ EXIT;
+ end;
+ end;
+ Result := (fModifiers and Mask) <> 0;
+ end; { of function TRegExpr.GetModifier
+--------------------------------------------------------------}
+
+procedure TRegExpr.SetModifier (AIndex : integer; ASet : boolean);
+ var
+ Mask : integer;
+ begin
+ case AIndex of
+ 1: Mask := MaskModI;
+ 2: Mask := MaskModR;
+ 3: Mask := MaskModS;
+ 4: Mask := MaskModG;
+ 5: Mask := MaskModM;
+ 6: Mask := MaskModX;
+ else begin
+ Error (reeModifierUnsupported);
+ EXIT;
+ end;
+ end;
+ if ASet
+ then fModifiers := fModifiers or Mask
+ else fModifiers := fModifiers and not Mask;
+ end; { of procedure TRegExpr.SetModifier
+--------------------------------------------------------------}
+
+
+{=============================================================}
+{==================== Compiler section =======================}
+{=============================================================}
+
+procedure TRegExpr.InvalidateProgramm;
+ begin
+ if programm <> nil then begin
+ FreeMem (programm);
+ programm := nil;
+ end;
+ end; { of procedure TRegExpr.InvalidateProgramm
+--------------------------------------------------------------}
+
+procedure TRegExpr.Compile; //###0.941
+ begin
+ if fExpression = nil then begin // No Expression assigned
+ Error (reeNoExpression);
+ EXIT;
+ end;
+ CompileRegExpr (fExpression);
+ end; { of procedure TRegExpr.Compile
+--------------------------------------------------------------}
+
+function TRegExpr.IsProgrammOk : boolean;
+ {$IFNDEF UniCode}
+ var
+ i : integer;
+ {$ENDIF}
+ begin
+ Result := false;
+
+ // check modifiers
+ if fModifiers <> fProgModifiers //###0.941
+ then InvalidateProgramm;
+
+ // can we optimize line separators by using sets?
+ {$IFNDEF UniCode}
+ fLineSeparatorsSet := [];
+ for i := 1 to length (fLineSeparators)
+ do System.Include (fLineSeparatorsSet, fLineSeparators [i]);
+ {$ENDIF}
+
+ // [Re]compile if needed
+ if programm = nil
+ then Compile; //###0.941
+
+ // check [re]compiled programm
+ if programm = nil
+ then EXIT // error was set/raised by Compile (was reeExecAfterCompErr)
+ else if programm [0] <> MAGIC // Program corrupted.
+ then Error (reeCorruptedProgram)
+ else Result := true;
+ end; { of function TRegExpr.IsProgrammOk
+--------------------------------------------------------------}
+
+procedure TRegExpr.Tail (p : PRegExprChar; val : PRegExprChar);
+// set the next-pointer at the end of a node chain
+ var
+ scan : PRegExprChar;
+ temp : PRegExprChar;
+ begin
+ if p = @regdummy
+ then EXIT;
+ // Find last node.
+ scan := p;
+ REPEAT
+ temp := regnext (scan);
+ if temp = nil
+ then BREAK;
+ scan := temp;
+ UNTIL false;
+ // Set Next 'pointer'
+ PRENextOff (scan + REOpSz)^ := val - scan; //###0.933
+ end; { of procedure TRegExpr.Tail
+--------------------------------------------------------------}
+
+procedure TRegExpr.OpTail (p : PRegExprChar; val : PRegExprChar);
+// regtail on operand of first argument; nop if operandless
+ begin
+ // "Operandless" and "op != BRANCH" are synonymous in practice.
+ if (p = nil) or (p = @regdummy) or (PREOp (p)^ <> BRANCH)
+ then EXIT;
+ Tail (p + REOpSz + RENextOffSz, val); //###0.933
+ end; { of procedure TRegExpr.OpTail
+--------------------------------------------------------------}
+
+function TRegExpr.EmitNode (op : TREOp) : PRegExprChar; //###0.933
+// emit a node, return location
+ begin
+ Result := regcode;
+ if Result <> @regdummy then begin
+ PREOp (regcode)^ := op;
+ inc (regcode, REOpSz);
+ PRENextOff (regcode)^ := 0; // Next "pointer" := nil
+ inc (regcode, RENextOffSz);
+ end
+ else inc (regsize, REOpSz + RENextOffSz); // compute code size without code generation
+ end; { of function TRegExpr.EmitNode
+--------------------------------------------------------------}
+
+procedure TRegExpr.EmitC (b : REChar);
+// emit a byte to code
+ begin
+ if regcode <> @regdummy then begin
+ regcode^ := b;
+ inc (regcode);
+ end
+ else inc (regsize); // Type of p-code pointer always is ^REChar
+ end; { of procedure TRegExpr.EmitC
+--------------------------------------------------------------}
+
+procedure TRegExpr.InsertOperator (op : TREOp; opnd : PRegExprChar; sz : integer);
+// insert an operator in front of already-emitted operand
+// Means relocating the operand.
+ var
+ src, dst, place : PRegExprChar;
+ i : integer;
+ begin
+ if regcode = @regdummy then begin
+ inc (regsize, sz);
+ EXIT;
+ end;
+ src := regcode;
+ inc (regcode, sz);
+ dst := regcode;
+ while src > opnd do begin
+ dec (dst);
+ dec (src);
+ dst^ := src^;
+ end;
+ place := opnd; // Op node, where operand used to be.
+ PREOp (place)^ := op;
+ inc (place, REOpSz);
+ for i := 1 + REOpSz to sz do begin
+ place^ := #0;
+ inc (place);
+ end;
+ end; { of procedure TRegExpr.InsertOperator
+--------------------------------------------------------------}
+
+function strcspn (s1 : PRegExprChar; s2 : PRegExprChar) : integer;
+// find length of initial segment of s1 consisting
+// entirely of characters not from s2
+ var scan1, scan2 : PRegExprChar;
+ begin
+ Result := 0;
+ scan1 := s1;
+ while scan1^ <> #0 do begin
+ scan2 := s2;
+ while scan2^ <> #0 do
+ if scan1^ = scan2^
+ then EXIT
+ else inc (scan2);
+ inc (Result);
+ inc (scan1)
+ end;
+ end; { of function strcspn
+--------------------------------------------------------------}
+
+const
+// Flags to be passed up and down.
+ HASWIDTH = 01; // Known never to match nil string.
+ SIMPLE = 02; // Simple enough to be STAR/PLUS/BRACES operand.
+ SPSTART = 04; // Starts with * or +.
+ WORST = 0; // Worst case.
+ META : array [0 .. 12] of REChar = (
+ '^', '$', '.', '[', '(', ')', '|', '?', '+', '*', '\', '{', #0);
+ // Any modification must be synchronized with QuoteRegExprMetaChars !!!
+
+{$IFDEF UniCode}
+ RusRangeLo : array [0 .. 33] of REChar =
+ (#$430,#$431,#$432,#$433,#$434,#$435,#$451,#$436,#$437,
+ #$438,#$439,#$43A,#$43B,#$43C,#$43D,#$43E,#$43F,
+ #$440,#$441,#$442,#$443,#$444,#$445,#$446,#$447,
+ #$448,#$449,#$44A,#$44B,#$44C,#$44D,#$44E,#$44F,#0);
+ RusRangeHi : array [0 .. 33] of REChar =
+ (#$410,#$411,#$412,#$413,#$414,#$415,#$401,#$416,#$417,
+ #$418,#$419,#$41A,#$41B,#$41C,#$41D,#$41E,#$41F,
+ #$420,#$421,#$422,#$423,#$424,#$425,#$426,#$427,
+ #$428,#$429,#$42A,#$42B,#$42C,#$42D,#$42E,#$42F,#0);
+ RusRangeLoLow = #$430{'à'};
+ RusRangeLoHigh = #$44F{'ÿ'};
+ RusRangeHiLow = #$410{'À'};
+ RusRangeHiHigh = #$42F{'ß'};
+{$ELSE}
+ RusRangeLo = 'àáâãä叿çèéêëìíîïðñòóôõö÷øùúûüýþÿ';
+ RusRangeHi = 'ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß';
+ RusRangeLoLow = 'à';
+ RusRangeLoHigh = 'ÿ';
+ RusRangeHiLow = 'À';
+ RusRangeHiHigh = 'ß';
+{$ENDIF}
+
+function TRegExpr.CompileRegExpr (exp : PRegExprChar) : boolean;
+// compile a regular expression into internal code
+// We can't allocate space until we know how big the compiled form will be,
+// but we can't compile it (and thus know how big it is) until we've got a
+// place to put the code. So we cheat: we compile it twice, once with code
+// generation turned off and size counting turned on, and once "for real".
+// This also means that we don't allocate space until we are sure that the
+// thing really will compile successfully, and we never have to move the
+// code and thus invalidate pointers into it. (Note that it has to be in
+// one piece because free() must be able to free it all.)
+// Beware that the optimization-preparation code in here knows about some
+// of the structure of the compiled regexp.
+ var
+ scan, longest : PRegExprChar;
+ len : cardinal;
+ flags : integer;
+ begin
+ Result := false; // life too dark
+
+ regparse := nil; // for correct error handling
+ regexpbeg := exp;
+ try
+
+ if programm <> nil then begin
+ FreeMem (programm);
+ programm := nil;
+ end;
+
+ if exp = nil then begin
+ Error (reeCompNullArgument);
+ EXIT;
+ end;
+
+ fProgModifiers := fModifiers;
+ // well, may it's paranoia. I'll check it later... !!!!!!!!
+
+ // First pass: determine size, legality.
+ fCompModifiers := fModifiers;
+ regparse := exp;
+ regnpar := 1;
+ regsize := 0;
+ regcode := @regdummy;
+ EmitC (MAGIC);
+ if ParseReg (0, flags) = nil
+ then EXIT;
+
+ // Small enough for 2-bytes programm pointers ?
+ // ###0.933 no real p-code length limits now :)))
+// if regsize >= 64 * 1024 then begin
+// Error (reeCompRegexpTooBig);
+// EXIT;
+// end;
+
+ // Allocate space.
+ GetMem (programm, regsize * SizeOf (REChar));
+
+ // Second pass: emit code.
+ fCompModifiers := fModifiers;
+ regparse := exp;
+ regnpar := 1;
+ regcode := programm;
+ EmitC (MAGIC);
+ if ParseReg (0, flags) = nil
+ then EXIT;
+
+ // Dig out information for optimizations.
+ {$IFDEF UseFirstCharSet} //###0.929
+ FirstCharSet := [];
+ FillFirstCharSet (programm + REOpSz);
+ {$ENDIF}
+ regstart := #0; // Worst-case defaults.
+ reganch := #0;
+ regmust := nil;
+ regmlen := 0;
+ scan := programm + REOpSz; // First BRANCH.
+ if PREOp (regnext (scan))^ = EEND then begin // Only one top-level choice.
+ scan := scan + REOpSz + RENextOffSz;
+
+ // Starting-point info.
+ if PREOp (scan)^ = EXACTLY
+ then regstart := (scan + REOpSz + RENextOffSz)^
+ else if PREOp (scan)^ = BOL
+ then inc (reganch);
+
+ // If there's something expensive in the r.e., find the longest
+ // literal string that must appear and make it the regmust. Resolve
+ // ties in favor of later strings, since the regstart check works
+ // with the beginning of the r.e. and avoiding duplication
+ // strengthens checking. Not a strong reason, but sufficient in the
+ // absence of others.
+ if (flags and SPSTART) <> 0 then begin
+ longest := nil;
+ len := 0;
+ while scan <> nil do begin
+ if (PREOp (scan)^ = EXACTLY)
+ and (strlen (scan + REOpSz + RENextOffSz) >= len) then begin
+ longest := scan + REOpSz + RENextOffSz;
+ len := strlen (longest);
+ end;
+ scan := regnext (scan);
+ end;
+ regmust := longest;
+ regmlen := len;
+ end;
+ end;
+
+ Result := true;
+
+ finally begin
+ if not Result
+ then InvalidateProgramm;
+ regexpbeg := nil;
+ fExprIsCompiled := Result; //###0.944
+ end;
+ end;
+
+ end; { of function TRegExpr.CompileRegExpr
+--------------------------------------------------------------}
+
+function TRegExpr.ParseReg (paren : integer; var flagp : integer) : PRegExprChar;
+// regular expression, i.e. main body or parenthesized thing
+// Caller must absorb opening parenthesis.
+// Combining parenthesis handling with the base level of regular expression
+// is a trifle forced, but the need to tie the tails of the branches to what
+// follows makes it hard to avoid.
+ var
+ ret, br, ender : PRegExprChar;
+ parno : integer;
+ flags : integer;
+ SavedModifiers : integer;
+ begin
+ Result := nil;
+ flagp := HASWIDTH; // Tentatively.
+ parno := 0; // eliminate compiler stupid warning
+ SavedModifiers := fCompModifiers;
+
+ // Make an OPEN node, if parenthesized.
+ if paren <> 0 then begin
+ if regnpar >= NSUBEXP then begin
+ Error (reeCompParseRegTooManyBrackets);
+ EXIT;
+ end;
+ parno := regnpar;
+ inc (regnpar);
+ ret := EmitNode (TREOp (ord (OPEN) + parno));
+ end
+ else ret := nil;
+
+ // Pick up the branches, linking them together.
+ br := ParseBranch (flags);
+ if br = nil then begin
+ Result := nil;
+ EXIT;
+ end;
+ if ret <> nil
+ then Tail (ret, br) // OPEN -> first.
+ else ret := br;
+ if (flags and HASWIDTH) = 0
+ then flagp := flagp and not HASWIDTH;
+ flagp := flagp or flags and SPSTART;
+ while (regparse^ = '|') do begin
+ inc (regparse);
+ br := ParseBranch (flags);
+ if br = nil then begin
+ Result := nil;
+ EXIT;
+ end;
+ Tail (ret, br); // BRANCH -> BRANCH.
+ if (flags and HASWIDTH) = 0
+ then flagp := flagp and not HASWIDTH;
+ flagp := flagp or flags and SPSTART;
+ end;
+
+ // Make a closing node, and hook it on the end.
+ if paren <> 0
+ then ender := EmitNode (TREOp (ord (CLOSE) + parno))
+ else ender := EmitNode (EEND);
+ Tail (ret, ender);
+
+ // Hook the tails of the branches to the closing node.
+ br := ret;
+ while br <> nil do begin
+ OpTail (br, ender);
+ br := regnext (br);
+ end;
+
+ // Check for proper termination.
+ if paren <> 0 then
+ if regparse^ <> ')' then begin
+ Error (reeCompParseRegUnmatchedBrackets);
+ EXIT;
+ end
+ else inc (regparse); // skip trailing ')'
+ if (paren = 0) and (regparse^ <> #0) then begin
+ if regparse^ = ')'
+ then Error (reeCompParseRegUnmatchedBrackets2)
+ else Error (reeCompParseRegJunkOnEnd);
+ EXIT;
+ end;
+ fCompModifiers := SavedModifiers; // restore modifiers of parent
+ Result := ret;
+ end; { of function TRegExpr.ParseReg
+--------------------------------------------------------------}
+
+function TRegExpr.ParseBranch (var flagp : integer) : PRegExprChar;
+// one alternative of an | operator
+// Implements the concatenation operator.
+ var
+ ret, chain, latest : PRegExprChar;
+ flags : integer;
+ begin
+ flagp := WORST; // Tentatively.
+
+ ret := EmitNode (BRANCH);
+ chain := nil;
+ while (regparse^ <> #0) and (regparse^ <> '|')
+ and (regparse^ <> ')') do begin
+ latest := ParsePiece (flags);
+ if latest = nil then begin
+ Result := nil;
+ EXIT;
+ end;
+ flagp := flagp or flags and HASWIDTH;
+ if chain = nil // First piece.
+ then flagp := flagp or flags and SPSTART
+ else Tail (chain, latest);
+ chain := latest;
+ end;
+ if chain = nil // Loop ran zero times.
+ then EmitNode (NOTHING);
+ Result := ret;
+ end; { of function TRegExpr.ParseBranch
+--------------------------------------------------------------}
+
+function TRegExpr.ParsePiece (var flagp : integer) : PRegExprChar;
+// something followed by possible [*+?{]
+// Note that the branching code sequences used for ? and the general cases
+// of * and + and { are somewhat optimized: they use the same NOTHING node as
+// both the endmarker for their branch list and the body of the last branch.
+// It might seem that this node could be dispensed with entirely, but the
+// endmarker role is not redundant.
+ function parsenum (AStart, AEnd : PRegExprChar) : TREBracesArg;
+ begin
+ Result := 0;
+ if AEnd - AStart + 1 > 8 then begin // prevent stupid scanning
+ Error (reeBRACESArgTooBig);
+ EXIT;
+ end;
+ while AStart <= AEnd do begin
+ Result := Result * 10 + (ord (AStart^) - ord ('0'));
+ inc (AStart);
+ end;
+ if (Result > MaxBracesArg) or (Result < 0) then begin
+ Error (reeBRACESArgTooBig);
+ EXIT;
+ end;
+ end;
+
+ var
+ op : REChar;
+ NonGreedyOp, NonGreedyCh : boolean; //###0.940
+ TheOp : TREOp; //###0.940
+ NextNode : PRegExprChar;
+ flags : integer;
+ BracesMin, Bracesmax : TREBracesArg;
+ p, savedparse : PRegExprChar;
+
+ procedure EmitComplexBraces (ABracesMin, ABracesMax : TREBracesArg;
+ ANonGreedyOp : boolean); //###0.940
+ {$IFDEF ComplexBraces}
+ var
+ off : integer;
+ {$ENDIF}
+ begin
+ {$IFNDEF ComplexBraces}
+ Error (reeComplexBracesNotImplemented);
+ {$ELSE}
+ if ANonGreedyOp
+ then TheOp := LOOPNG
+ else TheOp := LOOP;
+ InsertOperator (LOOPENTRY, Result, REOpSz + RENextOffSz);
+ NextNode := EmitNode (TheOp);
+ if regcode <> @regdummy then begin
+ off := (Result + REOpSz + RENextOffSz)
+ - (regcode - REOpSz - RENextOffSz); // back to Atom after LOOPENTRY
+ PREBracesArg (regcode)^ := ABracesMin;
+ inc (regcode, REBracesArgSz);
+ PREBracesArg (regcode)^ := ABracesMax;
+ inc (regcode, REBracesArgSz);
+ PRENextOff (regcode)^ := off;
+ inc (regcode, RENextOffSz);
+ end
+ else inc (regsize, REBracesArgSz * 2 + RENextOffSz);
+ Tail (Result, NextNode); // LOOPENTRY -> LOOP
+ if regcode <> @regdummy then
+ Tail (Result + REOpSz + RENextOffSz, NextNode); // Atom -> LOOP
+ {$ENDIF}
+ end;
+
+ procedure EmitSimpleBraces (ABracesMin, ABracesMax : TREBracesArg;
+ ANonGreedyOp : boolean); //###0.940
+ begin
+ if ANonGreedyOp //###0.940
+ then TheOp := BRACESNG
+ else TheOp := BRACES;
+ InsertOperator (TheOp, Result, REOpSz + RENextOffSz + REBracesArgSz * 2);
+ if regcode <> @regdummy then begin
+ PREBracesArg (Result + REOpSz + RENextOffSz)^ := ABracesMin;
+ PREBracesArg (Result + REOpSz + RENextOffSz + REBracesArgSz)^ := ABracesMax;
+ end;
+ end;
+
+ begin
+ Result := ParseAtom (flags);
+ if Result = nil
+ then EXIT;
+
+ op := regparse^;
+ if not ((op = '*') or (op = '+') or (op = '?') or (op = '{')) then begin
+ flagp := flags;
+ EXIT;
+ end;
+ if ((flags and HASWIDTH) = 0) and (op <> '?') then begin
+ Error (reePlusStarOperandCouldBeEmpty);
+ EXIT;
+ end;
+
+ case op of
+ '*': begin
+ flagp := WORST or SPSTART;
+ NonGreedyCh := (regparse + 1)^ = '?'; //###0.940
+ NonGreedyOp := NonGreedyCh or ((fCompModifiers and MaskModG) = 0); //###0.940
+ if (flags and SIMPLE) = 0 then begin
+ if NonGreedyOp //###0.940
+ then EmitComplexBraces (0, MaxBracesArg, NonGreedyOp)
+ else begin // Emit x* as (x&|), where & means "self".
+ InsertOperator (BRANCH, Result, REOpSz + RENextOffSz); // Either x
+ OpTail (Result, EmitNode (BACK)); // and loop
+ OpTail (Result, Result); // back
+ Tail (Result, EmitNode (BRANCH)); // or
+ Tail (Result, EmitNode (NOTHING)); // nil.
+ end
+ end
+ else begin // Simple
+ if NonGreedyOp //###0.940
+ then TheOp := STARNG
+ else TheOp := STAR;
+ InsertOperator (TheOp, Result, REOpSz + RENextOffSz);
+ end;
+ if NonGreedyCh //###0.940
+ then inc (regparse); // Skip extra char ('?')
+ end; { of case '*'}
+ '+': begin
+ flagp := WORST or SPSTART or HASWIDTH;
+ NonGreedyCh := (regparse + 1)^ = '?'; //###0.940
+ NonGreedyOp := NonGreedyCh or ((fCompModifiers and MaskModG) = 0); //###0.940
+ if (flags and SIMPLE) = 0 then begin
+ if NonGreedyOp //###0.940
+ then EmitComplexBraces (1, MaxBracesArg, NonGreedyOp)
+ else begin // Emit x+ as x(&|), where & means "self".
+ NextNode := EmitNode (BRANCH); // Either
+ Tail (Result, NextNode);
+ Tail (EmitNode (BACK), Result); // loop back
+ Tail (NextNode, EmitNode (BRANCH)); // or
+ Tail (Result, EmitNode (NOTHING)); // nil.
+ end
+ end
+ else begin // Simple
+ if NonGreedyOp //###0.940
+ then TheOp := PLUSNG
+ else TheOp := PLUS;
+ InsertOperator (TheOp, Result, REOpSz + RENextOffSz);
+ end;
+ if NonGreedyCh //###0.940
+ then inc (regparse); // Skip extra char ('?')
+ end; { of case '+'}
+ '?': begin
+ flagp := WORST;
+ NonGreedyCh := (regparse + 1)^ = '?'; //###0.940
+ NonGreedyOp := NonGreedyCh or ((fCompModifiers and MaskModG) = 0); //###0.940
+ if NonGreedyOp then begin //###0.940 // We emit x?? as x{0,1}?
+ if (flags and SIMPLE) = 0
+ then EmitComplexBraces (0, 1, NonGreedyOp)
+ else EmitSimpleBraces (0, 1, NonGreedyOp);
+ end
+ else begin // greedy '?'
+ InsertOperator (BRANCH, Result, REOpSz + RENextOffSz); // Either x
+ Tail (Result, EmitNode (BRANCH)); // or
+ NextNode := EmitNode (NOTHING); // nil.
+ Tail (Result, NextNode);
+ OpTail (Result, NextNode);
+ end;
+ if NonGreedyCh //###0.940
+ then inc (regparse); // Skip extra char ('?')
+ end; { of case '?'}
+ '{': begin
+ savedparse := regparse;
+ // !!!!!!!!!!!!
+ // Filip Jirsak's note - what will happen, when we are at the end of regparse?
+ inc (regparse);
+ p := regparse;
+ while Pos (regparse^, '0123456789') > 0 // MUST appear
+ do inc (regparse);
+ if (regparse^ <> '}') and (regparse^ <> ',') or (p = regparse) then begin
+ regparse := savedparse;
+ flagp := flags;
+ EXIT;
+ end;
+ BracesMin := parsenum (p, regparse - 1);
+ if regparse^ = ',' then begin
+ inc (regparse);
+ p := regparse;
+ while Pos (regparse^, '0123456789') > 0
+ do inc (regparse);
+ if regparse^ <> '}' then begin
+ regparse := savedparse;
+ EXIT;
+ end;
+ if p = regparse
+ then BracesMax := MaxBracesArg
+ else BracesMax := parsenum (p, regparse - 1);
+ end
+ else BracesMax := BracesMin; // {n} == {n,n}
+ if BracesMin > BracesMax then begin
+ Error (reeBracesMinParamGreaterMax);
+ EXIT;
+ end;
+ if BracesMin > 0
+ then flagp := WORST;
+ if BracesMax > 0
+ then flagp := flagp or HASWIDTH or SPSTART;
+
+ NonGreedyCh := (regparse + 1)^ = '?'; //###0.940
+ NonGreedyOp := NonGreedyCh or ((fCompModifiers and MaskModG) = 0); //###0.940
+ if (flags and SIMPLE) <> 0
+ then EmitSimpleBraces (BracesMin, BracesMax, NonGreedyOp)
+ else EmitComplexBraces (BracesMin, BracesMax, NonGreedyOp);
+ if NonGreedyCh //###0.940
+ then inc (regparse); // Skip extra char '?'
+ end; // of case '{'
+// else // here we can't be
+ end; { of case op}
+
+ inc (regparse);
+ if (regparse^ = '*') or (regparse^ = '+') or (regparse^ = '?') or (regparse^ = '{') then begin
+ Error (reeNestedSQP);
+ EXIT;
+ end;
+ end; { of function TRegExpr.ParsePiece
+--------------------------------------------------------------}
+
+function TRegExpr.ParseAtom (var flagp : integer) : PRegExprChar;
+// the lowest level
+// Optimization: gobbles an entire sequence of ordinary characters so that
+// it can turn them into a single node, which is smaller to store and
+// faster to run. Backslashed characters are exceptions, each becoming a
+// separate node; the code is simpler that way and it's not worth fixing.
+ var
+ ret : PRegExprChar;
+ flags : integer;
+ RangeBeg, RangeEnd : REChar;
+ CanBeRange : boolean;
+ len : integer;
+ ender : REChar;
+ begmodfs : PRegExprChar;
+
+ {$IFDEF UseSetOfChar} //###0.930
+ RangePCodeBeg : PRegExprChar;
+ RangePCodeIdx : integer;
+ RangeIsCI : boolean;
+ RangeSet : TSetOfREChar;
+ RangeLen : integer;
+ RangeChMin, RangeChMax : REChar;
+ {$ENDIF}
+
+ procedure EmitExactly (ch : REChar);
+ begin
+ if (fCompModifiers and MaskModI) <> 0
+ then ret := EmitNode (EXACTLYCI)
+ else ret := EmitNode (EXACTLY);
+ EmitC (ch);
+ EmitC (#0);
+ flagp := flagp or HASWIDTH or SIMPLE;
+ end;
+
+ procedure EmitStr (const s : RegExprString);
+ var i : integer;
+ begin
+ for i := 1 to length (s)
+ do EmitC (s [i]);
+ end;
+
+ function HexDig (ch : REChar) : integer;
+ begin
+ Result := 0;
+ if (ch >= 'a') and (ch <= 'f')
+ then ch := REChar (ord (ch) - (ord ('a') - ord ('A')));
+ if (ch < '0') or (ch > 'F') or ((ch > '9') and (ch < 'A')) then begin
+ Error (reeBadHexDigit);
+ EXIT;
+ end;
+ Result := ord (ch) - ord ('0');
+ if ch >= 'A'
+ then Result := Result - (ord ('A') - ord ('9') - 1);
+ end;
+
+ function EmitRange (AOpCode : REChar) : PRegExprChar;
+ begin
+ {$IFDEF UseSetOfChar}
+ case AOpCode of
+ ANYBUTCI, ANYBUT:
+ Result := EmitNode (ANYBUTTINYSET);
+ else // ANYOFCI, ANYOF
+ Result := EmitNode (ANYOFTINYSET);
+ end;
+ case AOpCode of
+ ANYBUTCI, ANYOFCI:
+ RangeIsCI := True;
+ else // ANYBUT, ANYOF
+ RangeIsCI := False;
+ end;
+ RangePCodeBeg := regcode;
+ RangePCodeIdx := regsize;
+ RangeLen := 0;
+ RangeSet := [];
+ RangeChMin := #255;
+ RangeChMax := #0;
+ {$ELSE}
+ Result := EmitNode (AOpCode);
+ // ToDo:
+ // !!!!!!!!!!!!! Implement ANYOF[BUT]TINYSET generation for UniCode !!!!!!!!!!
+ {$ENDIF}
+ end;
+
+{$IFDEF UseSetOfChar}
+ procedure EmitRangeCPrim (b : REChar); //###0.930
+ begin
+ if b in RangeSet
+ then EXIT;
+ inc (RangeLen);
+ if b < RangeChMin
+ then RangeChMin := b;
+ if b > RangeChMax
+ then RangeChMax := b;
+ Include (RangeSet, b);
+ end;
+ {$ENDIF}
+
+ procedure EmitRangeC (b : REChar);
+ {$IFDEF UseSetOfChar}
+ var
+ Ch : REChar;
+ {$ENDIF}
+ begin
+ CanBeRange := false;
+ {$IFDEF UseSetOfChar}
+ if b <> #0 then begin
+ EmitRangeCPrim (b); //###0.930
+ if RangeIsCI
+ then EmitRangeCPrim (InvertCase (b)); //###0.930
+ end
+ else begin
+ Assert (RangeLen > 0, 'TRegExpr.ParseAtom(subroutine EmitRangeC): empty range'); // impossible, but who knows..
+ Assert (RangeChMin <= RangeChMax, 'TRegExpr.ParseAtom(subroutine EmitRangeC): RangeChMin > RangeChMax'); // impossible, but who knows..
+ if RangeLen <= TinySetLen then begin // emit "tiny set"
+ if regcode = @regdummy then begin
+ regsize := RangePCodeIdx + TinySetLen; // RangeChMin/Max !!!
+ EXIT;
+ end;
+ regcode := RangePCodeBeg;
+ for Ch := RangeChMin to RangeChMax do //###0.930
+ if Ch in RangeSet then begin
+ regcode^ := Ch;
+ inc (regcode);
+ end;
+ // fill rest:
+ while regcode < RangePCodeBeg + TinySetLen do begin
+ regcode^ := RangeChMax;
+ inc (regcode);
+ end;
+ end
+ else begin
+ if regcode = @regdummy then begin
+ regsize := RangePCodeIdx + SizeOf (TSetOfREChar);
+ EXIT;
+ end;
+ if (RangePCodeBeg - REOpSz - RENextOffSz)^ = ANYBUTTINYSET
+ then RangeSet := [#0 .. #255] - RangeSet;
+ PREOp (RangePCodeBeg - REOpSz - RENextOffSz)^ := ANYOFFULLSET;
+ regcode := RangePCodeBeg;
+ Move (RangeSet, regcode^, SizeOf (TSetOfREChar));
+ inc (regcode, SizeOf (TSetOfREChar));
+ end;
+ end;
+ {$ELSE}
+ EmitC (b);
+ {$ENDIF}
+ end;
+
+ procedure EmitSimpleRangeC (b : REChar);
+ begin
+ RangeBeg := b;
+ EmitRangeC (b);
+ CanBeRange := true;
+ end;
+
+ procedure EmitRangeStr (const s : RegExprString);
+ var i : integer;
+ begin
+ for i := 1 to length (s)
+ do EmitRangeC (s [i]);
+ end;
+
+ function UnQuoteChar (var APtr : PRegExprChar) : REChar; //###0.934
+ begin
+ case APtr^ of
+ 't': Result := #$9; // tab (HT/TAB)
+ 'n': Result := #$a; // newline (NL)
+ 'r': Result := #$d; // car.return (CR)
+ 'f': Result := #$c; // form feed (FF)
+ 'a': Result := #$7; // alarm (bell) (BEL)
+ 'e': Result := #$1b; // escape (ESC)
+ 'x': begin // hex char
+ Result := #0;
+ inc (APtr);
+ if APtr^ = #0 then begin
+ Error (reeNoHexCodeAfterBSlashX);
+ EXIT;
+ end;
+ if APtr^ = '{' then begin // \x{nnnn} //###0.936
+ REPEAT
+ inc (APtr);
+ if APtr^ = #0 then begin
+ Error (reeNoHexCodeAfterBSlashX);
+ EXIT;
+ end;
+ if APtr^ <> '}' then begin
+ if (Ord (Result)
+ ShR (SizeOf (REChar) * 8 - 4)) and $F <> 0 then begin
+ Error (reeHexCodeAfterBSlashXTooBig);
+ EXIT;
+ end;
+ Result := REChar ((Ord (Result) ShL 4) or HexDig (APtr^));
+ // HexDig will cause Error if bad hex digit found
+ end
+ else BREAK;
+ UNTIL False;
+ end
+ else begin
+ Result := REChar (HexDig (APtr^));
+ // HexDig will cause Error if bad hex digit found
+ inc (APtr);
+ if APtr^ = #0 then begin
+ Error (reeNoHexCodeAfterBSlashX);
+ EXIT;
+ end;
+ Result := REChar ((Ord (Result) ShL 4) or HexDig (APtr^));
+ // HexDig will cause Error if bad hex digit found
+ end;
+ end;
+ else Result := APtr^;
+ end;
+ end;
+
+ begin
+ Result := nil;
+ flagp := WORST; // Tentatively.
+
+ inc (regparse);
+ case (regparse - 1)^ of
+ '^': if ((fCompModifiers and MaskModM) = 0)
+ or ((fLineSeparators = '') and not fLinePairedSeparatorAssigned)
+ then ret := EmitNode (BOL)
+ else ret := EmitNode (BOLML);
+ '$': if ((fCompModifiers and MaskModM) = 0)
+ or ((fLineSeparators = '') and not fLinePairedSeparatorAssigned)
+ then ret := EmitNode (EOL)
+ else ret := EmitNode (EOLML);
+ '.':
+ if (fCompModifiers and MaskModS) <> 0 then begin
+ ret := EmitNode (ANY);
+ flagp := flagp or HASWIDTH or SIMPLE;
+ end
+ else begin // not /s, so emit [^:LineSeparators:]
+ ret := EmitNode (ANYML);
+ flagp := flagp or HASWIDTH; // not so simple ;)
+// ret := EmitRange (ANYBUT);
+// EmitRangeStr (LineSeparators); //###0.941
+// EmitRangeStr (LinePairedSeparator); // !!! isn't correct if have to accept only paired
+// EmitRangeC (#0);
+// flagp := flagp or HASWIDTH or SIMPLE;
+ end;
+ '[': begin
+ if regparse^ = '^' then begin // Complement of range.
+ if (fCompModifiers and MaskModI) <> 0
+ then ret := EmitRange (ANYBUTCI)
+ else ret := EmitRange (ANYBUT);
+ inc (regparse);
+ end
+ else
+ if (fCompModifiers and MaskModI) <> 0
+ then ret := EmitRange (ANYOFCI)
+ else ret := EmitRange (ANYOF);
+
+ CanBeRange := false;
+
+ if (regparse^ = ']') then begin
+ EmitSimpleRangeC (regparse^); // []-a] -> ']' .. 'a'
+ inc (regparse);
+ end;
+
+ while (regparse^ <> #0) and (regparse^ <> ']') do begin
+ if (regparse^ = '-')
+ and ((regparse + 1)^ <> #0) and ((regparse + 1)^ <> ']')
+ and CanBeRange then begin
+ inc (regparse);
+ RangeEnd := regparse^;
+ if RangeEnd = '\' then begin
+// Eugene: 20080407
+// {$IFDEF UniCode} //###0.935
+// if (ord ((regparse + 1)^) < 256)
+// and (char ((regparse + 1)^) in ['d', 'D', 's', 'S', 'w', 'W']) then begin
+// {$ELSE}
+ if CharInSet((regparse + 1)^ , ['d', 'D', 's', 'S', 'w', 'W']) then begin
+// {$ENDIF}
+ EmitRangeC ('-'); // or treat as error ?!!
+ CONTINUE;
+ end;
+ inc (regparse);
+ RangeEnd := UnQuoteChar (regparse);
+ end;
+
+ // r.e.ranges extension for russian
+ if ((fCompModifiers and MaskModR) <> 0)
+ and (RangeBeg = RusRangeLoLow) and (RangeEnd = RusRangeLoHigh) then begin
+ EmitRangeStr (RusRangeLo);
+ end
+ else if ((fCompModifiers and MaskModR) <> 0)
+ and (RangeBeg = RusRangeHiLow) and (RangeEnd = RusRangeHiHigh) then begin
+ EmitRangeStr (RusRangeHi);
+ end
+ else if ((fCompModifiers and MaskModR) <> 0)
+ and (RangeBeg = RusRangeLoLow) and (RangeEnd = RusRangeHiHigh) then begin
+ EmitRangeStr (RusRangeLo);
+ EmitRangeStr (RusRangeHi);
+ end
+ else begin // standard r.e. handling
+ if RangeBeg > RangeEnd then begin
+ Error (reeInvalidRange);
+ EXIT;
+ end;
+ inc (RangeBeg);
+ EmitRangeC (RangeEnd); // prevent infinite loop if RangeEnd=$ff
+ while RangeBeg < RangeEnd do begin //###0.929
+ EmitRangeC (RangeBeg);
+ inc (RangeBeg);
+ end;
+ end;
+ inc (regparse);
+ end
+ else begin
+ if regparse^ = '\' then begin
+ inc (regparse);
+ if regparse^ = #0 then begin
+ Error (reeParseAtomTrailingBackSlash);
+ EXIT;
+ end;
+ case regparse^ of // r.e.extensions
+ 'd': EmitRangeStr ('0123456789');
+ 'w': EmitRangeStr (WordChars);
+ 's': EmitRangeStr (SpaceChars);
+ else EmitSimpleRangeC (UnQuoteChar (regparse));
+ end; { of case}
+ end
+ else EmitSimpleRangeC (regparse^);
+ inc (regparse);
+ end;
+ end; { of while}
+ EmitRangeC (#0);
+ if regparse^ <> ']' then begin
+ Error (reeUnmatchedSqBrackets);
+ EXIT;
+ end;
+ inc (regparse);
+ flagp := flagp or HASWIDTH or SIMPLE;
+ end;
+ '(': begin
+ if regparse^ = '?' then begin
+ // check for extended Perl syntax : (?..)
+ if (regparse + 1)^ = '#' then begin // (?#comment)
+ inc (regparse, 2); // find closing ')'
+ while (regparse^ <> #0) and (regparse^ <> ')')
+ do inc (regparse);
+ if regparse^ <> ')' then begin
+ Error (reeUnclosedComment);
+ EXIT;
+ end;
+ inc (regparse); // skip ')'
+ ret := EmitNode (COMMENT); // comment
+ end
+ else begin // modifiers ?
+ inc (regparse); // skip '?'
+ begmodfs := regparse;
+ while (regparse^ <> #0) and (regparse^ <> ')')
+ do inc (regparse);
+ if (regparse^ <> ')')
+ or not ParseModifiersStr (copy (begmodfs, 1, (regparse - begmodfs)), fCompModifiers) then begin
+ Error (reeUrecognizedModifier);
+ EXIT;
+ end;
+ inc (regparse); // skip ')'
+ ret := EmitNode (COMMENT); // comment
+// Error (reeQPSBFollowsNothing);
+// EXIT;
+ end;
+ end
+ else begin
+ ret := ParseReg (1, flags);
+ if ret = nil then begin
+ Result := nil;
+ EXIT;
+ end;
+ flagp := flagp or flags and (HASWIDTH or SPSTART);
+ end;
+ end;
+ #0, '|', ')': begin // Supposed to be caught earlier.
+ Error (reeInternalUrp);
+ EXIT;
+ end;
+ '?', '+', '*': begin
+ Error (reeQPSBFollowsNothing);
+ EXIT;
+ end;
+ '\': begin
+ if regparse^ = #0 then begin
+ Error (reeTrailingBackSlash);
+ EXIT;
+ end;
+ case regparse^ of // r.e.extensions
+ 'b': ret := EmitNode (BOUND); //###0.943
+ 'B': ret := EmitNode (NOTBOUND); //###0.943
+ 'A': ret := EmitNode (BOL); //###0.941
+ 'Z': ret := EmitNode (EOL); //###0.941
+ 'd': begin // r.e.extension - any digit ('0' .. '9')
+ ret := EmitNode (ANYDIGIT);
+ flagp := flagp or HASWIDTH or SIMPLE;
+ end;
+ 'D': begin // r.e.extension - not digit ('0' .. '9')
+ ret := EmitNode (NOTDIGIT);
+ flagp := flagp or HASWIDTH or SIMPLE;
+ end;
+ 's': begin // r.e.extension - any space char
+ {$IFDEF UseSetOfChar}
+ ret := EmitRange (ANYOF);
+ EmitRangeStr (SpaceChars);
+ EmitRangeC (#0);
+ {$ELSE}
+ ret := EmitNode (ANYSPACE);
+ {$ENDIF}
+ flagp := flagp or HASWIDTH or SIMPLE;
+ end;
+ 'S': begin // r.e.extension - not space char
+ {$IFDEF UseSetOfChar}
+ ret := EmitRange (ANYBUT);
+ EmitRangeStr (SpaceChars);
+ EmitRangeC (#0);
+ {$ELSE}
+ ret := EmitNode (NOTSPACE);
+ {$ENDIF}
+ flagp := flagp or HASWIDTH or SIMPLE;
+ end;
+ 'w': begin // r.e.extension - any english char / digit / '_'
+ {$IFDEF UseSetOfChar}
+ ret := EmitRange (ANYOF);
+ EmitRangeStr (WordChars);
+ EmitRangeC (#0);
+ {$ELSE}
+ ret := EmitNode (ANYLETTER);
+ {$ENDIF}
+ flagp := flagp or HASWIDTH or SIMPLE;
+ end;
+ 'W': begin // r.e.extension - not english char / digit / '_'
+ {$IFDEF UseSetOfChar}
+ ret := EmitRange (ANYBUT);
+ EmitRangeStr (WordChars);
+ EmitRangeC (#0);
+ {$ELSE}
+ ret := EmitNode (NOTLETTER);
+ {$ENDIF}
+ flagp := flagp or HASWIDTH or SIMPLE;
+ end;
+ '1' .. '9': begin //###0.936
+ if (fCompModifiers and MaskModI) <> 0
+ then ret := EmitNode (BSUBEXPCI)
+ else ret := EmitNode (BSUBEXP);
+ EmitC (REChar (ord (regparse^) - ord ('0')));
+ flagp := flagp or HASWIDTH or SIMPLE;
+ end;
+ else EmitExactly (UnQuoteChar (regparse));
+ end; { of case}
+ inc (regparse);
+ end;
+ else begin
+ dec (regparse);
+ if ((fCompModifiers and MaskModX) <> 0) and // check for eXtended syntax
+ ((regparse^ = '#')
+ or ({$IFDEF UniCode}StrScan (XIgnoredChars, regparse^) <> nil //###0.947
+ {$ELSE}regparse^ in XIgnoredChars{$ENDIF})) then begin //###0.941 \x
+ if regparse^ = '#' then begin // Skip eXtended comment
+ // find comment terminator (group of \n and/or \r)
+ while (regparse^ <> #0) and (regparse^ <> #$d) and (regparse^ <> #$a)
+ do inc (regparse);
+ while (regparse^ = #$d) or (regparse^ = #$a) // skip comment terminator
+ do inc (regparse); // attempt to support different type of line separators
+ end
+ else begin // Skip the blanks!
+ while {$IFDEF UniCode}StrScan (XIgnoredChars, regparse^) <> nil //###0.947
+ {$ELSE}regparse^ in XIgnoredChars{$ENDIF}
+ do inc (regparse);
+ end;
+ ret := EmitNode (COMMENT); // comment
+ end
+ else begin
+ len := strcspn (regparse, META);
+ if len <= 0 then
+ if regparse^ <> '{' then begin
+ Error (reeRarseAtomInternalDisaster);
+ EXIT;
+ end
+ else len := strcspn (regparse + 1, META) + 1; // bad {n,m} - compile as EXATLY
+ ender := (regparse + len)^;
+ if (len > 1)
+ and ((ender = '*') or (ender = '+') or (ender = '?') or (ender = '{'))
+ then dec (len); // Back off clear of ?+*{ operand.
+ flagp := flagp or HASWIDTH;
+ if len = 1
+ then flagp := flagp or SIMPLE;
+ if (fCompModifiers and MaskModI) <> 0
+ then ret := EmitNode (EXACTLYCI)
+ else ret := EmitNode (EXACTLY);
+ while (len > 0)
+ and (((fCompModifiers and MaskModX) = 0) or (regparse^ <> '#')) do begin
+ if ((fCompModifiers and MaskModX) = 0) or not ( //###0.941
+ {$IFDEF UniCode}StrScan (XIgnoredChars, regparse^) <> nil //###0.947
+ {$ELSE}regparse^ in XIgnoredChars{$ENDIF} )
+ then EmitC (regparse^);
+ inc (regparse);
+ dec (len);
+ end;
+ EmitC (#0);
+ end; { of if not comment}
+ end; { of case else}
+ end; { of case}
+
+ Result := ret;
+ end; { of function TRegExpr.ParseAtom
+--------------------------------------------------------------}
+
+function TRegExpr.GetCompilerErrorPos : integer;
+ begin
+ Result := 0;
+ if (regexpbeg = nil) or (regparse = nil)
+ then EXIT; // not in compiling mode ?
+ Result := regparse - regexpbeg;
+ end; { of function TRegExpr.GetCompilerErrorPos
+--------------------------------------------------------------}
+
+
+{=============================================================}
+{===================== Matching section ======================}
+{=============================================================}
+
+{$IFNDEF UseSetOfChar}
+function TRegExpr.StrScanCI (s : PRegExprChar; ch : REChar) : PRegExprChar; //###0.928 - now method of TRegExpr
+ begin
+ while (s^ <> #0) and (s^ <> ch) and (s^ <> InvertCase (ch))
+ do inc (s);
+ if s^ <> #0
+ then Result := s
+ else Result := nil;
+ end; { of function TRegExpr.StrScanCI
+--------------------------------------------------------------}
+{$ENDIF}
+
+function TRegExpr.regrepeat (p : PRegExprChar; AMax : integer) : integer;
+// repeatedly match something simple, report how many
+ var
+ scan : PRegExprChar;
+ opnd : PRegExprChar;
+ TheMax : integer;
+ {Ch,} InvCh : REChar; //###0.931
+ sestart, seend : PRegExprChar; //###0.936
+ begin
+ Result := 0;
+ scan := reginput;
+ opnd := p + REOpSz + RENextOffSz; //OPERAND
+ TheMax := fInputEnd - scan;
+ if TheMax > AMax
+ then TheMax := AMax;
+ case PREOp (p)^ of
+ ANY: begin
+ // note - ANYML cannot be proceeded in regrepeat because can skip
+ // more than one char at once
+ Result := TheMax;
+ inc (scan, Result);
+ end;
+ EXACTLY: begin // in opnd can be only ONE char !!!
+// Ch := opnd^; // store in register //###0.931
+ while (Result < TheMax) and (opnd^ = scan^) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ end;
+ EXACTLYCI: begin // in opnd can be only ONE char !!!
+// Ch := opnd^; // store in register //###0.931
+ while (Result < TheMax) and (opnd^ = scan^) do begin // prevent unneeded InvertCase //###0.931
+ inc (Result);
+ inc (scan);
+ end;
+ if Result < TheMax then begin //###0.931
+ InvCh := InvertCase (opnd^); // store in register
+ while (Result < TheMax) and
+ ((opnd^ = scan^) or (InvCh = scan^)) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ end;
+ end;
+ BSUBEXP: begin //###0.936
+ sestart := startp [ord (opnd^)];
+ if sestart = nil
+ then EXIT;
+ seend := endp [ord (opnd^)];
+ if seend = nil
+ then EXIT;
+ REPEAT
+ opnd := sestart;
+ while opnd < seend do begin
+ if (scan >= fInputEnd) or (scan^ <> opnd^)
+ then EXIT;
+ inc (scan);
+ inc (opnd);
+ end;
+ inc (Result);
+ reginput := scan;
+ UNTIL Result >= AMax;
+ end;
+ BSUBEXPCI: begin //###0.936
+ sestart := startp [ord (opnd^)];
+ if sestart = nil
+ then EXIT;
+ seend := endp [ord (opnd^)];
+ if seend = nil
+ then EXIT;
+ REPEAT
+ opnd := sestart;
+ while opnd < seend do begin
+ if (scan >= fInputEnd) or
+ ((scan^ <> opnd^) and (scan^ <> InvertCase (opnd^)))
+ then EXIT;
+ inc (scan);
+ inc (opnd);
+ end;
+ inc (Result);
+ reginput := scan;
+ UNTIL Result >= AMax;
+ end;
+ ANYDIGIT:
+ while (Result < TheMax) and
+ (scan^ >= '0') and (scan^ <= '9') do begin
+ inc (Result);
+ inc (scan);
+ end;
+ NOTDIGIT:
+ while (Result < TheMax) and
+ ((scan^ < '0') or (scan^ > '9')) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ {$IFNDEF UseSetOfChar} //###0.929
+ ANYLETTER:
+ while (Result < TheMax) and
+ (Pos (scan^, fWordChars) > 0) //###0.940
+ { ((scan^ >= 'a') and (scan^ <= 'z') !! I've forgotten (>='0') and (<='9')
+ or (scan^ >= 'A') and (scan^ <= 'Z') or (scan^ = '_'))} do begin
+ inc (Result);
+ inc (scan);
+ end;
+ NOTLETTER:
+ while (Result < TheMax) and
+ (Pos (scan^, fWordChars) <= 0) //###0.940
+ { not ((scan^ >= 'a') and (scan^ <= 'z') !! I've forgotten (>='0') and (<='9')
+ or (scan^ >= 'A') and (scan^ <= 'Z')
+ or (scan^ = '_'))} do begin
+ inc (Result);
+ inc (scan);
+ end;
+ ANYSPACE:
+ while (Result < TheMax) and
+ (Pos (scan^, fSpaceChars) > 0) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ NOTSPACE:
+ while (Result < TheMax) and
+ (Pos (scan^, fSpaceChars) <= 0) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ {$ENDIF}
+ ANYOFTINYSET: begin
+ while (Result < TheMax) and //!!!TinySet
+ ((scan^ = opnd^) or (scan^ = (opnd + 1)^)
+ or (scan^ = (opnd + 2)^)) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ end;
+ ANYBUTTINYSET: begin
+ while (Result < TheMax) and //!!!TinySet
+ (scan^ <> opnd^) and (scan^ <> (opnd + 1)^)
+ and (scan^ <> (opnd + 2)^) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ end;
+ {$IFDEF UseSetOfChar} //###0.929
+ ANYOFFULLSET: begin
+ while (Result < TheMax) and
+ (scan^ in PSetOfREChar (opnd)^) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ end;
+ {$ELSE}
+ ANYOF:
+ while (Result < TheMax) and
+ (StrScan (opnd, scan^) <> nil) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ ANYBUT:
+ while (Result < TheMax) and
+ (StrScan (opnd, scan^) = nil) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ ANYOFCI:
+ while (Result < TheMax) and (StrScanCI (opnd, scan^) <> nil) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ ANYBUTCI:
+ while (Result < TheMax) and (StrScanCI (opnd, scan^) = nil) do begin
+ inc (Result);
+ inc (scan);
+ end;
+ {$ENDIF}
+ else begin // Oh dear. Called inappropriately.
+ Result := 0; // Best compromise.
+ Error (reeRegRepeatCalledInappropriately);
+ EXIT;
+ end;
+ end; { of case}
+ reginput := scan;
+ end; { of function TRegExpr.regrepeat
+--------------------------------------------------------------}
+
+function TRegExpr.regnext (p : PRegExprChar) : PRegExprChar;
+// dig the "next" pointer out of a node
+ var offset : TRENextOff;
+ begin
+ if p = @regdummy then begin
+ Result := nil;
+ EXIT;
+ end;
+ offset := PRENextOff (p + REOpSz)^; //###0.933 inlined NEXT
+ if offset = 0
+ then Result := nil
+ else Result := p + offset;
+ end; { of function TRegExpr.regnext
+--------------------------------------------------------------}
+
+function TRegExpr.MatchPrim (prog : PRegExprChar) : boolean;
+// recursively matching routine
+// Conceptually the strategy is simple: check to see whether the current
+// node matches, call self recursively to see whether the rest matches,
+// and then act accordingly. In practice we make some effort to avoid
+// recursion, in particular by going through "ordinary" nodes (that don't
+// need to know whether the rest of the match failed) by a loop instead of
+// by recursion.
+ var
+ scan : PRegExprChar; // Current node.
+ next : PRegExprChar; // Next node.
+ len : integer;
+ opnd : PRegExprChar;
+ no : integer;
+ save : PRegExprChar;
+ nextch : REChar;
+ BracesMin, BracesMax : integer; // we use integer instead of TREBracesArg for better support */+
+ {$IFDEF ComplexBraces}
+ SavedLoopStack : array [1 .. LoopStackMax] of integer; // :(( very bad for recursion
+ SavedLoopStackIdx : integer; //###0.925
+ {$ENDIF}
+ begin
+ Result := false;
+ scan := prog;
+
+ while scan <> nil do begin
+ len := PRENextOff (scan + 1)^; //###0.932 inlined regnext
+ if len = 0
+ then next := nil
+ else next := scan + len;
+
+ case scan^ of
+ NOTBOUND, //###0.943 //!!! think about UseSetOfChar !!!
+ BOUND:
+ if (scan^ = BOUND)
+ xor (
+ ((reginput = fInputStart) or (Pos ((reginput - 1)^, fWordChars) <= 0))
+ and (reginput^ <> #0) and (Pos (reginput^, fWordChars) > 0)
+ or
+ (reginput <> fInputStart) and (Pos ((reginput - 1)^, fWordChars) > 0)
+ and ((reginput^ = #0) or (Pos (reginput^, fWordChars) <= 0)))
+ then EXIT;
+
+ BOL: if reginput <> fInputStart
+ then EXIT;
+ EOL: if reginput^ <> #0
+ then EXIT;
+ BOLML: if reginput > fInputStart then begin
+ nextch := (reginput - 1)^;
+ if (nextch <> fLinePairedSeparatorTail)
+ or ((reginput - 1) <= fInputStart)
+ or ((reginput - 2)^ <> fLinePairedSeparatorHead)
+ then begin
+ if (nextch = fLinePairedSeparatorHead)
+ and (reginput^ = fLinePairedSeparatorTail)
+ then EXIT; // don't stop between paired separator
+ if
+ {$IFNDEF UniCode}
+ not (nextch in fLineSeparatorsSet)
+ {$ELSE}
+ (pos (nextch, fLineSeparators) <= 0)
+ {$ENDIF}
+ then EXIT;
+ end;
+ end;
+ EOLML: if reginput^ <> #0 then begin
+ nextch := reginput^;
+ if (nextch <> fLinePairedSeparatorHead)
+ or ((reginput + 1)^ <> fLinePairedSeparatorTail)
+ then begin
+ if (nextch = fLinePairedSeparatorTail)
+ and (reginput > fInputStart)
+ and ((reginput - 1)^ = fLinePairedSeparatorHead)
+ then EXIT; // don't stop between paired separator
+ if
+ {$IFNDEF UniCode}
+ not (nextch in fLineSeparatorsSet)
+ {$ELSE}
+ (pos (nextch, fLineSeparators) <= 0)
+ {$ENDIF}
+ then EXIT;
+ end;
+ end;
+ ANY: begin
+ if reginput^ = #0
+ then EXIT;
+ inc (reginput);
+ end;
+ ANYML: begin //###0.941
+ if (reginput^ = #0)
+ or ((reginput^ = fLinePairedSeparatorHead)
+ and ((reginput + 1)^ = fLinePairedSeparatorTail))
+ or {$IFNDEF UniCode} (reginput^ in fLineSeparatorsSet)
+ {$ELSE} (pos (reginput^, fLineSeparators) > 0) {$ENDIF}
+ then EXIT;
+ inc (reginput);
+ end;
+ ANYDIGIT: begin
+ if (reginput^ = #0) or (reginput^ < '0') or (reginput^ > '9')
+ then EXIT;
+ inc (reginput);
+ end;
+ NOTDIGIT: begin
+ if (reginput^ = #0) or ((reginput^ >= '0') and (reginput^ <= '9'))
+ then EXIT;
+ inc (reginput);
+ end;
+ {$IFNDEF UseSetOfChar} //###0.929
+ ANYLETTER: begin
+ if (reginput^ = #0) or (Pos (reginput^, fWordChars) <= 0) //###0.943
+ then EXIT;
+ inc (reginput);
+ end;
+ NOTLETTER: begin
+ if (reginput^ = #0) or (Pos (reginput^, fWordChars) > 0) //###0.943
+ then EXIT;
+ inc (reginput);
+ end;
+ ANYSPACE: begin
+ if (reginput^ = #0) or not (Pos (reginput^, fSpaceChars) > 0) //###0.943
+ then EXIT;
+ inc (reginput);
+ end;
+ NOTSPACE: begin
+ if (reginput^ = #0) or (Pos (reginput^, fSpaceChars) > 0) //###0.943
+ then EXIT;
+ inc (reginput);
+ end;
+ {$ENDIF}
+ EXACTLYCI: begin
+ opnd := scan + REOpSz + RENextOffSz; // OPERAND
+ // Inline the first character, for speed.
+ if (opnd^ <> reginput^)
+ and (InvertCase (opnd^) <> reginput^)
+ then EXIT;
+ len := strlen (opnd);
+ //###0.929 begin
+ no := len;
+ save := reginput;
+ while no > 1 do begin
+ inc (save);
+ inc (opnd);
+ if (opnd^ <> save^)
+ and (InvertCase (opnd^) <> save^)
+ then EXIT;
+ dec (no);
+ end;
+ //###0.929 end
+ inc (reginput, len);
+ end;
+ EXACTLY: begin
+ opnd := scan + REOpSz + RENextOffSz; // OPERAND
+ // Inline the first character, for speed.
+ if opnd^ <> reginput^
+ then EXIT;
+ len := strlen (opnd);
+ //###0.929 begin
+ no := len;
+ save := reginput;
+ while no > 1 do begin
+ inc (save);
+ inc (opnd);
+ if opnd^ <> save^
+ then EXIT;
+ dec (no);
+ end;
+ //###0.929 end
+ inc (reginput, len);
+ end;
+ BSUBEXP: begin //###0.936
+ no := ord ((scan + REOpSz + RENextOffSz)^);
+ if startp [no] = nil
+ then EXIT;
+ if endp [no] = nil
+ then EXIT;
+ save := reginput;
+ opnd := startp [no];
+ while opnd < endp [no] do begin
+ if (save >= fInputEnd) or (save^ <> opnd^)
+ then EXIT;
+ inc (save);
+ inc (opnd);
+ end;
+ reginput := save;
+ end;
+ BSUBEXPCI: begin //###0.936
+ no := ord ((scan + REOpSz + RENextOffSz)^);
+ if startp [no] = nil
+ then EXIT;
+ if endp [no] = nil
+ then EXIT;
+ save := reginput;
+ opnd := startp [no];
+ while opnd < endp [no] do begin
+ if (save >= fInputEnd) or
+ ((save^ <> opnd^) and (save^ <> InvertCase (opnd^)))
+ then EXIT;
+ inc (save);
+ inc (opnd);
+ end;
+ reginput := save;
+ end;
+ ANYOFTINYSET: begin
+ if (reginput^ = #0) or //!!!TinySet
+ ((reginput^ <> (scan + REOpSz + RENextOffSz)^)
+ and (reginput^ <> (scan + REOpSz + RENextOffSz + 1)^)
+ and (reginput^ <> (scan + REOpSz + RENextOffSz + 2)^))
+ then EXIT;
+ inc (reginput);
+ end;
+ ANYBUTTINYSET: begin
+ if (reginput^ = #0) or //!!!TinySet
+ (reginput^ = (scan + REOpSz + RENextOffSz)^)
+ or (reginput^ = (scan + REOpSz + RENextOffSz + 1)^)
+ or (reginput^ = (scan + REOpSz + RENextOffSz + 2)^)
+ then EXIT;
+ inc (reginput);
+ end;
+ {$IFDEF UseSetOfChar} //###0.929
+ ANYOFFULLSET: begin
+ if (reginput^ = #0)
+ or not (reginput^ in PSetOfREChar (scan + REOpSz + RENextOffSz)^)
+ then EXIT;
+ inc (reginput);
+ end;
+ {$ELSE}
+ ANYOF: begin
+ if (reginput^ = #0) or (StrScan (scan + REOpSz + RENextOffSz, reginput^) = nil)
+ then EXIT;
+ inc (reginput);
+ end;
+ ANYBUT: begin
+ if (reginput^ = #0) or (StrScan (scan + REOpSz + RENextOffSz, reginput^) <> nil)
+ then EXIT;
+ inc (reginput);
+ end;
+ ANYOFCI: begin
+ if (reginput^ = #0) or (StrScanCI (scan + REOpSz + RENextOffSz, reginput^) = nil)
+ then EXIT;
+ inc (reginput);
+ end;
+ ANYBUTCI: begin
+ if (reginput^ = #0) or (StrScanCI (scan + REOpSz + RENextOffSz, reginput^) <> nil)
+ then EXIT;
+ inc (reginput);
+ end;
+ {$ENDIF}
+ NOTHING: ;
+ COMMENT: ;
+ BACK: ;
+ Succ (OPEN) .. TREOp (Ord (OPEN) + NSUBEXP - 1) : begin //###0.929
+ no := ord (scan^) - ord (OPEN);
+// save := reginput;
+ save := startp [no]; //###0.936
+ startp [no] := reginput; //###0.936
+ Result := MatchPrim (next);
+ if not Result //###0.936
+ then startp [no] := save;
+// if Result and (startp [no] = nil)
+// then startp [no] := save;
+ // Don't set startp if some later invocation of the same
+ // parentheses already has.
+ EXIT;
+ end;
+ Succ (CLOSE) .. TREOp (Ord (CLOSE) + NSUBEXP - 1): begin //###0.929
+ no := ord (scan^) - ord (CLOSE);
+// save := reginput;
+ save := endp [no]; //###0.936
+ endp [no] := reginput; //###0.936
+ Result := MatchPrim (next);
+ if not Result //###0.936
+ then endp [no] := save;
+// if Result and (endp [no] = nil)
+// then endp [no] := save;
+ // Don't set endp if some later invocation of the same
+ // parentheses already has.
+ EXIT;
+ end;
+ BRANCH: begin
+ if (next^ <> BRANCH) // No choice.
+ then next := scan + REOpSz + RENextOffSz // Avoid recursion
+ else begin
+ REPEAT
+ save := reginput;
+ Result := MatchPrim (scan + REOpSz + RENextOffSz);
+ if Result
+ then EXIT;
+ reginput := save;
+ scan := regnext (scan);
+ UNTIL (scan = nil) or (scan^ <> BRANCH);
+ EXIT;
+ end;
+ end;
+ {$IFDEF ComplexBraces}
+ LOOPENTRY: begin //###0.925
+ no := LoopStackIdx;
+ inc (LoopStackIdx);
+ if LoopStackIdx > LoopStackMax then begin
+ Error (reeLoopStackExceeded);
+ EXIT;
+ end;
+ save := reginput;
+ LoopStack [LoopStackIdx] := 0; // init loop counter
+ Result := MatchPrim (next); // execute LOOP
+ LoopStackIdx := no; // cleanup
+ if Result
+ then EXIT;
+ reginput := save;
+ EXIT;
+ end;
+ LOOP, LOOPNG: begin //###0.940
+ if LoopStackIdx <= 0 then begin
+ Error (reeLoopWithoutEntry);
+ EXIT;
+ end;
+ opnd := scan + PRENextOff (scan + REOpSz + RENextOffSz + 2 * REBracesArgSz)^;
+ BracesMin := PREBracesArg (scan + REOpSz + RENextOffSz)^;
+ BracesMax := PREBracesArg (scan + REOpSz + RENextOffSz + REBracesArgSz)^;
+ save := reginput;
+ if LoopStack [LoopStackIdx] >= BracesMin then begin // Min alredy matched - we can work
+ if scan^ = LOOP then begin
+ // greedy way - first try to max deep of greed ;)
+ if LoopStack [LoopStackIdx] < BracesMax then begin
+ inc (LoopStack [LoopStackIdx]);
+ no := LoopStackIdx;
+ Result := MatchPrim (opnd);
+ LoopStackIdx := no;
+ if Result
+ then EXIT;
+ reginput := save;
+ end;
+ dec (LoopStackIdx); // Fail. May be we are too greedy? ;)
+ Result := MatchPrim (next);
+ if not Result
+ then reginput := save;
+ EXIT;
+ end
+ else begin
+ // non-greedy - try just now
+ Result := MatchPrim (next);
+ if Result
+ then EXIT
+ else reginput := save; // failed - move next and try again
+ if LoopStack [LoopStackIdx] < BracesMax then begin
+ inc (LoopStack [LoopStackIdx]);
+ no := LoopStackIdx;
+ Result := MatchPrim (opnd);
+ LoopStackIdx := no;
+ if Result
+ then EXIT;
+ reginput := save;
+ end;
+ dec (LoopStackIdx); // Failed - back up
+ EXIT;
+ end
+ end
+ else begin // first match a min_cnt times
+ inc (LoopStack [LoopStackIdx]);
+ no := LoopStackIdx;
+ Result := MatchPrim (opnd);
+ LoopStackIdx := no;
+ if Result
+ then EXIT;
+ dec (LoopStack [LoopStackIdx]);
+ reginput := save;
+ EXIT;
+ end;
+ end;
+ {$ENDIF}
+ STAR, PLUS, BRACES, STARNG, PLUSNG, BRACESNG: begin
+ // Lookahead to avoid useless match attempts when we know
+ // what character comes next.
+ nextch := #0;
+ if next^ = EXACTLY
+ then nextch := (next + REOpSz + RENextOffSz)^;
+ BracesMax := MaxInt; // infinite loop for * and + //###0.92
+ if (scan^ = STAR) or (scan^ = STARNG)
+ then BracesMin := 0 // STAR
+ else if (scan^ = PLUS) or (scan^ = PLUSNG)
+ then BracesMin := 1 // PLUS
+ else begin // BRACES
+ BracesMin := PREBracesArg (scan + REOpSz + RENextOffSz)^;
+ BracesMax := PREBracesArg (scan + REOpSz + RENextOffSz + REBracesArgSz)^;
+ end;
+ save := reginput;
+ opnd := scan + REOpSz + RENextOffSz;
+ if (scan^ = BRACES) or (scan^ = BRACESNG)
+ then inc (opnd, 2 * REBracesArgSz);
+
+ if (scan^ = PLUSNG) or (scan^ = STARNG) or (scan^ = BRACESNG) then begin
+ // non-greedy mode
+ BracesMax := regrepeat (opnd, BracesMax); // don't repeat more than BracesMax
+ // Now we know real Max limit to move forward (for recursion 'back up')
+ // In some cases it can be faster to check only Min positions first,
+ // but after that we have to check every position separtely instead
+ // of fast scannig in loop.
+ no := BracesMin;
+ while no <= BracesMax do begin
+ reginput := save + no;
+ // If it could work, try it.
+ if (nextch = #0) or (reginput^ = nextch) then begin
+ {$IFDEF ComplexBraces}
+ System.Move (LoopStack, SavedLoopStack, SizeOf (LoopStack)); //###0.925
+ SavedLoopStackIdx := LoopStackIdx;
+ {$ENDIF}
+ if MatchPrim (next) then begin
+ Result := true;
+ EXIT;
+ end;
+ {$IFDEF ComplexBraces}
+ System.Move (SavedLoopStack, LoopStack, SizeOf (LoopStack));
+ LoopStackIdx := SavedLoopStackIdx;
+ {$ENDIF}
+ end;
+ inc (no); // Couldn't or didn't - move forward.
+ end; { of while}
+ EXIT;
+ end
+ else begin // greedy mode
+ no := regrepeat (opnd, BracesMax); // don't repeat more than max_cnt
+ while no >= BracesMin do begin
+ // If it could work, try it.
+ if (nextch = #0) or (reginput^ = nextch) then begin
+ {$IFDEF ComplexBraces}
+ System.Move (LoopStack, SavedLoopStack, SizeOf (LoopStack)); //###0.925
+ SavedLoopStackIdx := LoopStackIdx;
+ {$ENDIF}
+ if MatchPrim (next) then begin
+ Result := true;
+ EXIT;
+ end;
+ {$IFDEF ComplexBraces}
+ System.Move (SavedLoopStack, LoopStack, SizeOf (LoopStack));
+ LoopStackIdx := SavedLoopStackIdx;
+ {$ENDIF}
+ end;
+ dec (no); // Couldn't or didn't - back up.
+ reginput := save + no;
+ end; { of while}
+ EXIT;
+ end;
+ end;
+ EEND: begin
+ Result := true; // Success!
+ EXIT;
+ end;
+ else begin
+ Error (reeMatchPrimMemoryCorruption);
+ EXIT;
+ end;
+ end; { of case scan^}
+ scan := next;
+ end; { of while scan <> nil}
+
+ // We get here only if there's trouble -- normally "case EEND" is the
+ // terminating point.
+ Error (reeMatchPrimCorruptedPointers);
+ end; { of function TRegExpr.MatchPrim
+--------------------------------------------------------------}
+
+{$IFDEF UseFirstCharSet} //###0.929
+procedure TRegExpr.FillFirstCharSet (prog : PRegExprChar);
+ var
+ scan : PRegExprChar; // Current node.
+ next : PRegExprChar; // Next node.
+ opnd : PRegExprChar;
+ min_cnt : integer;
+ begin
+ scan := prog;
+ while scan <> nil do begin
+ next := regnext (scan);
+ case PREOp (scan)^ of
+ BSUBEXP, BSUBEXPCI: begin //###0.938
+ FirstCharSet := [#0 .. #255]; // :((( we cannot
+ // optimize r.e. if it starts with back reference
+ EXIT;
+ end;
+ BOL, BOLML: ; // EXIT; //###0.937
+ EOL, EOLML: ; // EXIT; //###0.937
+ BOUND, NOTBOUND: ; //###0.943 ?!!
+ ANY, ANYML: begin // we can better define ANYML !!!
+ FirstCharSet := [#0 .. #255]; //###0.930
+ EXIT;
+ end;
+ ANYDIGIT: begin
+ FirstCharSet := FirstCharSet + ['0' .. '9'];
+ EXIT;
+ end;
+ NOTDIGIT: begin
+ FirstCharSet := [#0 .. #255] - ['0' .. '9'];
+ EXIT;
+ end;
+ EXACTLYCI: begin
+ Include (FirstCharSet, (scan + REOpSz + RENextOffSz)^);
+ Include (FirstCharSet, InvertCase ((scan + REOpSz + RENextOffSz)^));
+ EXIT;
+ end;
+ EXACTLY: begin
+ Include (FirstCharSet, (scan + REOpSz + RENextOffSz)^);
+ EXIT;
+ end;
+ ANYOFFULLSET: begin
+ FirstCharSet := FirstCharSet + PSetOfREChar (scan + REOpSz + RENextOffSz)^;
+ EXIT;
+ end;
+ ANYOFTINYSET: begin
+ //!!!TinySet
+ Include (FirstCharSet, (scan + REOpSz + RENextOffSz)^);
+ Include (FirstCharSet, (scan + REOpSz + RENextOffSz + 1)^);
+ Include (FirstCharSet, (scan + REOpSz + RENextOffSz + 2)^);
+ // ... // up to TinySetLen
+ EXIT;
+ end;
+ ANYBUTTINYSET: begin
+ //!!!TinySet
+ FirstCharSet := [#0 .. #255];
+ Exclude (FirstCharSet, (scan + REOpSz + RENextOffSz)^);
+ Exclude (FirstCharSet, (scan + REOpSz + RENextOffSz + 1)^);
+ Exclude (FirstCharSet, (scan + REOpSz + RENextOffSz + 2)^);
+ // ... // up to TinySetLen
+ EXIT;
+ end;
+ NOTHING: ;
+ COMMENT: ;
+ BACK: ;
+ Succ (OPEN) .. TREOp (Ord (OPEN) + NSUBEXP - 1) : begin //###0.929
+ FillFirstCharSet (next);
+ EXIT;
+ end;
+ Succ (CLOSE) .. TREOp (Ord (CLOSE) + NSUBEXP - 1): begin //###0.929
+ FillFirstCharSet (next);
+ EXIT;
+ end;
+ BRANCH: begin
+ if (PREOp (next)^ <> BRANCH) // No choice.
+ then next := scan + REOpSz + RENextOffSz // Avoid recursion.
+ else begin
+ REPEAT
+ FillFirstCharSet (scan + REOpSz + RENextOffSz);
+ scan := regnext (scan);
+ UNTIL (scan = nil) or (PREOp (scan)^ <> BRANCH);
+ EXIT;
+ end;
+ end;
+ {$IFDEF ComplexBraces}
+ LOOPENTRY: begin //###0.925
+// LoopStack [LoopStackIdx] := 0; //###0.940 line removed
+ FillFirstCharSet (next); // execute LOOP
+ EXIT;
+ end;
+ LOOP, LOOPNG: begin //###0.940
+ opnd := scan + PRENextOff (scan + REOpSz + RENextOffSz + REBracesArgSz * 2)^;
+ min_cnt := PREBracesArg (scan + REOpSz + RENextOffSz)^;
+ FillFirstCharSet (opnd);
+ if min_cnt = 0
+ then FillFirstCharSet (next);
+ EXIT;
+ end;
+ {$ENDIF}
+ STAR, STARNG: //###0.940
+ FillFirstCharSet (scan + REOpSz + RENextOffSz);
+ PLUS, PLUSNG: begin //###0.940
+ FillFirstCharSet (scan + REOpSz + RENextOffSz);
+ EXIT;
+ end;
+ BRACES, BRACESNG: begin //###0.940
+ opnd := scan + REOpSz + RENextOffSz + REBracesArgSz * 2;
+ min_cnt := PREBracesArg (scan + REOpSz + RENextOffSz)^; // BRACES
+ FillFirstCharSet (opnd);
+ if min_cnt > 0
+ then EXIT;
+ end;
+ EEND: begin
+ EXIT;
+ end;
+ else begin
+ Error (reeMatchPrimMemoryCorruption);
+ EXIT;
+ end;
+ end; { of case scan^}
+ scan := next;
+ end; { of while scan <> nil}
+ end; { of procedure FillFirstCharSet;
+--------------------------------------------------------------}
+{$ENDIF}
+
+function TRegExpr.RegMatch (str : PRegExprChar) : boolean;
+// try match at specific point
+ var i : integer;
+ begin
+ for i := 0 to NSUBEXP - 1 do begin
+ startp [i] := nil;
+ endp [i] := nil;
+ end;
+ reginput := str;
+ Result := MatchPrim (programm + REOpSz);
+ if Result then begin
+ startp [0] := str;
+ endp [0] := reginput;
+ end;
+ end; { of function TRegExpr.RegMatch
+--------------------------------------------------------------}
+
+function TRegExpr.Exec (const AInputString : RegExprString) : boolean;
+ begin
+ InputString := AInputString;
+ Result := ExecPrim (1);
+ end; { of function TRegExpr.Exec
+--------------------------------------------------------------}
+
+function TRegExpr.ExecPrim (AOffset: integer) : boolean;
+ var
+ s : PRegExprChar;
+ StartPtr: PRegExprChar;
+ InputLen : integer;
+ begin
+ Result := false; // Be paranoid...
+
+ if not IsProgrammOk //###0.929
+ then EXIT;
+
+ // Check InputString presence
+ if not Assigned (fInputString) then begin
+ Error (reeNoInpitStringSpecified);
+ EXIT;
+ end;
+
+ InputLen := length (fInputString);
+
+ //Check that the start position is not negative
+ if AOffset < 1 then begin
+ Error (reeOffsetMustBeGreaterThen0);
+ EXIT;
+ end;
+ // Check that the start position is not longer than the line
+ // If so then exit with nothing found
+ if AOffset > (InputLen + 1) // for matching empty string after last char.
+ then EXIT;
+
+ StartPtr := fInputString + AOffset - 1;
+
+ // If there is a "must appear" string, look for it.
+ if regmust <> nil then begin
+ s := StartPtr;
+ REPEAT
+ s := StrScan (s, regmust [0]);
+ if s <> nil then begin
+ if StrLComp (s, regmust, regmlen) = 0
+ then BREAK; // Found it.
+ inc (s);
+ end;
+ UNTIL s = nil;
+ if s = nil // Not present.
+ then EXIT;
+ end;
+
+ // Mark beginning of line for ^ .
+ fInputStart := fInputString;
+
+ // Pointer to end of input stream - for
+ // pascal-style string processing (may include #0)
+ fInputEnd := fInputString + InputLen;
+
+ {$IFDEF ComplexBraces}
+ // no loops started
+ LoopStackIdx := 0; //###0.925
+ {$ENDIF}
+
+ // Simplest case: anchored match need be tried only once.
+ if reganch <> #0 then begin
+ Result := RegMatch (StartPtr);
+ EXIT;
+ end;
+
+ // Messy cases: unanchored match.
+ s := StartPtr;
+ if regstart <> #0 then // We know what char it must start with.
+ REPEAT
+ s := StrScan (s, regstart);
+ if s <> nil then begin
+ Result := RegMatch (s);
+ if Result
+ then EXIT;
+ inc (s);
+ end;
+ UNTIL s = nil
+ else begin // We don't - general case.
+ {$IFDEF UseFirstCharSet} //###0.929
+ while s^ <> #0 do begin
+ if s^ in FirstCharSet
+ then Result := RegMatch (s);
+ if Result
+ then EXIT;
+ inc (s);
+ end;
+ {$ELSE}
+ REPEAT
+ Result := RegMatch (s);
+ if Result
+ then EXIT;
+ inc (s);
+ UNTIL s^ = #0;
+ {$ENDIF}
+ end;
+ // Failure
+ end; { of function TRegExpr.ExecPrim
+--------------------------------------------------------------}
+
+function TRegExpr.ExecNext : boolean;
+ var offset : integer;
+ begin
+ Result := false;
+ if not Assigned (startp[0]) or not Assigned (endp[0]) then begin
+ Error (reeExecNextWithoutExec);
+ EXIT;
+ end;
+// Offset := MatchPos [0] + MatchLen [0];
+// if MatchLen [0] = 0
+ Offset := endp [0] - fInputString + 1; //###0.929
+ if endp [0] = startp [0] //###0.929
+ then inc (Offset); // prevent infinite looping if empty string match r.e.
+ Result := ExecPrim (Offset);
+ end; { of function TRegExpr.ExecNext
+--------------------------------------------------------------}
+
+function TRegExpr.ExecPos (AOffset: integer {$IFDEF D4_}= 1{$ENDIF}) : boolean;
+ begin
+ Result := ExecPrim (AOffset);
+ end; { of function TRegExpr.ExecPos
+--------------------------------------------------------------}
+
+function TRegExpr.GetInputString : RegExprString;
+ begin
+ if not Assigned (fInputString) then begin
+ Error (reeGetInputStringWithoutInputString);
+ EXIT;
+ end;
+ Result := fInputString;
+ end; { of function TRegExpr.GetInputString
+--------------------------------------------------------------}
+
+procedure TRegExpr.SetInputString (const AInputString : RegExprString);
+ var
+ Len : integer;
+ i : integer;
+ begin
+ // clear Match* - before next Exec* call it's undefined
+ for i := 0 to NSUBEXP - 1 do begin
+ startp [i] := nil;
+ endp [i] := nil;
+ end;
+
+ // need reallocation of input string buffer ?
+ Len := length (AInputString);
+ if Assigned (fInputString) and (Length (fInputString) <> Len) then begin
+ FreeMem (fInputString);
+ fInputString := nil;
+ end;
+ // buffer [re]allocation
+ if not Assigned (fInputString)
+ then GetMem (fInputString, (Len + 1) * SizeOf (REChar));
+
+ // copy input string into buffer
+ {$IFDEF UniCode}
+ StrPCopy (fInputString, Copy (AInputString, 1, Len)); //###0.927
+ {$ELSE}
+ StrLCopy (fInputString, PRegExprChar (AInputString), Len);
+ {$ENDIF}
+
+ {
+ fInputString : string;
+ fInputStart, fInputEnd : PRegExprChar;
+
+ SetInputString:
+ fInputString := AInputString;
+ UniqueString (fInputString);
+ fInputStart := PChar (fInputString);
+ Len := length (fInputString);
+ fInputEnd := PRegExprChar (integer (fInputStart) + Len); ??
+ !! startp/endp âñå ðàâíî áóäåò îïàñíî èñïîëüçîâàòü ?
+ }
+ end; { of procedure TRegExpr.SetInputString
+--------------------------------------------------------------}
+
+procedure TRegExpr.SetLineSeparators (const AStr : RegExprString);
+ begin
+ if AStr <> fLineSeparators then begin
+ fLineSeparators := AStr;
+ InvalidateProgramm;
+ end;
+ end; { of procedure TRegExpr.SetLineSeparators
+--------------------------------------------------------------}
+
+procedure TRegExpr.SetLinePairedSeparator (const AStr : RegExprString);
+ begin
+ if length (AStr) = 2 then begin
+ if AStr [1] = AStr [2] then begin
+ // it's impossible for our 'one-point' checking to support
+ // two chars separator for identical chars
+ Error (reeBadLinePairedSeparator);
+ EXIT;
+ end;
+ if not fLinePairedSeparatorAssigned
+ or (AStr [1] <> fLinePairedSeparatorHead)
+ or (AStr [2] <> fLinePairedSeparatorTail) then begin
+ fLinePairedSeparatorAssigned := true;
+ fLinePairedSeparatorHead := AStr [1];
+ fLinePairedSeparatorTail := AStr [2];
+ InvalidateProgramm;
+ end;
+ end
+ else if length (AStr) = 0 then begin
+ if fLinePairedSeparatorAssigned then begin
+ fLinePairedSeparatorAssigned := false;
+ InvalidateProgramm;
+ end;
+ end
+ else Error (reeBadLinePairedSeparator);
+ end; { of procedure TRegExpr.SetLinePairedSeparator
+--------------------------------------------------------------}
+
+function TRegExpr.GetLinePairedSeparator : RegExprString;
+ begin
+ if fLinePairedSeparatorAssigned then begin
+ {$IFDEF UniCode}
+ // Here is some UniCode 'magic'
+ // If You do know better decision to concatenate
+ // two WideChars, please, let me know!
+ Result := fLinePairedSeparatorHead; //###0.947
+ Result := Result + fLinePairedSeparatorTail;
+ {$ELSE}
+ Result := fLinePairedSeparatorHead + fLinePairedSeparatorTail;
+ {$ENDIF}
+ end
+ else Result := '';
+ end; { of function TRegExpr.GetLinePairedSeparator
+--------------------------------------------------------------}
+
+function TRegExpr.Substitute (const ATemplate : RegExprString) : RegExprString;
+// perform substitutions after a regexp match
+// completely rewritten in 0.929
+ var
+ TemplateLen : integer;
+ TemplateBeg, TemplateEnd : PRegExprChar;
+ p, p0, ResultPtr : PRegExprChar;
+ ResultLen : integer;
+ n : integer;
+ Ch : REChar;
+ function ParseVarName (var APtr : PRegExprChar) : integer;
+ // extract name of variable (digits, may be enclosed with
+ // curly braces) from APtr^, uses TemplateEnd !!!
+ const
+ Digits = ['0' .. '9'];
+ var
+ p : PRegExprChar;
+ Delimited : boolean;
+ begin
+ Result := 0;
+ p := APtr;
+ Delimited := (p < TemplateEnd) and (p^ = '{');
+ if Delimited
+ then inc (p); // skip left curly brace
+ if (p < TemplateEnd) and (p^ = '&')
+ then inc (p) // this is '$&' or '${&}'
+ else
+ while (p < TemplateEnd) and
+// Eugene: 20080407
+// {$IFDEF UniCode} //###0.935
+// (ord (p^) < 256) and (char (p^) in Digits)
+// {$ELSE}
+ CharInSet(p^ , Digits)
+// {$ENDIF}
+ do begin
+ Result := Result * 10 + (ord (p^) - ord ('0')); //###0.939
+ inc (p);
+ end;
+ if Delimited then
+ if (p < TemplateEnd) and (p^ = '}')
+ then inc (p) // skip right curly brace
+ else p := APtr; // isn't properly terminated
+ if p = APtr
+ then Result := -1; // no valid digits found or no right curly brace
+ APtr := p;
+ end;
+ begin
+ // Check programm and input string
+ if not IsProgrammOk
+ then EXIT;
+ if not Assigned (fInputString) then begin
+ Error (reeNoInpitStringSpecified);
+ EXIT;
+ end;
+ // Prepare for working
+ TemplateLen := length (ATemplate);
+ if TemplateLen = 0 then begin // prevent nil pointers
+ Result := '';
+ EXIT;
+ end;
+ TemplateBeg := pointer (ATemplate);
+ TemplateEnd := TemplateBeg + TemplateLen;
+ // Count result length for speed optimization.
+ ResultLen := 0;
+ p := TemplateBeg;
+ while p < TemplateEnd do begin
+ Ch := p^;
+ inc (p);
+ if Ch = '$'
+ then n := ParseVarName (p)
+ else n := -1;
+ if n >= 0 then begin
+ if (n < NSUBEXP) and Assigned (startp [n]) and Assigned (endp [n])
+ then inc (ResultLen, endp [n] - startp [n]);
+ end
+ else begin
+ if (Ch = '\') and (p < TemplateEnd)
+ then inc (p); // quoted or special char followed
+ inc (ResultLen);
+ end;
+ end;
+ // Get memory. We do it once and it significant speed up work !
+ if ResultLen = 0 then begin
+ Result := '';
+ EXIT;
+ end;
+ SetString (Result, nil, ResultLen);
+ // Fill Result
+ ResultPtr := pointer (Result);
+ p := TemplateBeg;
+ while p < TemplateEnd do begin
+ Ch := p^;
+ inc (p);
+ if Ch = '$'
+ then n := ParseVarName (p)
+ else n := -1;
+ if n >= 0 then begin
+ p0 := startp [n];
+ if (n < NSUBEXP) and Assigned (p0) and Assigned (endp [n]) then
+ while p0 < endp [n] do begin
+ ResultPtr^ := p0^;
+ inc (ResultPtr);
+ inc (p0);
+ end;
+ end
+ else begin
+ if (Ch = '\') and (p < TemplateEnd) then begin // quoted or special char followed
+ Ch := p^;
+ inc (p);
+ end;
+ ResultPtr^ := Ch;
+ inc (ResultPtr);
+ end;
+ end;
+ end; { of function TRegExpr.Substitute
+--------------------------------------------------------------}
+
+procedure TRegExpr.Split (AInputStr : RegExprString; APieces : TStrings);
+ var PrevPos : integer;
+ begin
+ PrevPos := 1;
+ if Exec (AInputStr) then
+ REPEAT
+ APieces.Add (System.Copy (AInputStr, PrevPos, MatchPos [0] - PrevPos));
+ PrevPos := MatchPos [0] + MatchLen [0];
+ UNTIL not ExecNext;
+ APieces.Add (System.Copy (AInputStr, PrevPos, MaxInt)); // Tail
+ end; { of procedure TRegExpr.Split
+--------------------------------------------------------------}
+
+function TRegExpr.Replace (AInputStr : RegExprString; const AReplaceStr : RegExprString;
+ AUseSubstitution : boolean{$IFDEF D4_}= False{$ENDIF}) : RegExprString;
+ var PrevPos : integer;
+ begin
+ Result := '';
+ PrevPos := 1;
+ if Exec (AInputStr) then
+ REPEAT
+ Result := Result + System.Copy (AInputStr, PrevPos,
+ MatchPos [0] - PrevPos);
+ if AUseSubstitution //###0.946
+ then Result := Result + Substitute (AReplaceStr)
+ else Result := Result + AReplaceStr;
+ PrevPos := MatchPos [0] + MatchLen [0];
+ UNTIL not ExecNext;
+ Result := Result + System.Copy (AInputStr, PrevPos, MaxInt); // Tail
+ end; { of function TRegExpr.Replace
+--------------------------------------------------------------}
+
+
+{=============================================================}
+{====================== Debug section ========================}
+{=============================================================}
+
+{$IFDEF DebugRegExpr}
+function TRegExpr.DumpOp (op : TREOp) : RegExprString;
+// printable representation of opcode
+ begin
+ case op of
+ BOL: Result := 'BOL';
+ EOL: Result := 'EOL';
+ BOLML: Result := 'BOLML';
+ EOLML: Result := 'EOLML';
+ BOUND: Result := 'BOUND'; //###0.943
+ NOTBOUND: Result := 'NOTBOUND'; //###0.943
+ ANY: Result := 'ANY';
+ ANYML: Result := 'ANYML'; //###0.941
+ ANYLETTER: Result := 'ANYLETTER';
+ NOTLETTER: Result := 'NOTLETTER';
+ ANYDIGIT: Result := 'ANYDIGIT';
+ NOTDIGIT: Result := 'NOTDIGIT';
+ ANYSPACE: Result := 'ANYSPACE';
+ NOTSPACE: Result := 'NOTSPACE';
+ ANYOF: Result := 'ANYOF';
+ ANYBUT: Result := 'ANYBUT';
+ ANYOFCI: Result := 'ANYOF/CI';
+ ANYBUTCI: Result := 'ANYBUT/CI';
+ BRANCH: Result := 'BRANCH';
+ EXACTLY: Result := 'EXACTLY';
+ EXACTLYCI: Result := 'EXACTLY/CI';
+ NOTHING: Result := 'NOTHING';
+ COMMENT: Result := 'COMMENT';
+ BACK: Result := 'BACK';
+ EEND: Result := 'END';
+ BSUBEXP: Result := 'BSUBEXP';
+ BSUBEXPCI: Result := 'BSUBEXP/CI';
+ Succ (OPEN) .. TREOp (Ord (OPEN) + NSUBEXP - 1): //###0.929
+ Result := Format ('OPEN[%d]', [ord (op) - ord (OPEN)]);
+ Succ (CLOSE) .. TREOp (Ord (CLOSE) + NSUBEXP - 1): //###0.929
+ Result := Format ('CLOSE[%d]', [ord (op) - ord (CLOSE)]);
+ STAR: Result := 'STAR';
+ PLUS: Result := 'PLUS';
+ BRACES: Result := 'BRACES';
+ {$IFDEF ComplexBraces}
+ LOOPENTRY: Result := 'LOOPENTRY'; //###0.925
+ LOOP: Result := 'LOOP'; //###0.925
+ LOOPNG: Result := 'LOOPNG'; //###0.940
+ {$ENDIF}
+ ANYOFTINYSET: Result:= 'ANYOFTINYSET';
+ ANYBUTTINYSET:Result:= 'ANYBUTTINYSET';
+ {$IFDEF UseSetOfChar} //###0.929
+ ANYOFFULLSET: Result:= 'ANYOFFULLSET';
+ {$ENDIF}
+ STARNG: Result := 'STARNG'; //###0.940
+ PLUSNG: Result := 'PLUSNG'; //###0.940
+ BRACESNG: Result := 'BRACESNG'; //###0.940
+ else Error (reeDumpCorruptedOpcode);
+ end; {of case op}
+ Result := ':' + Result;
+ end; { of function TRegExpr.DumpOp
+--------------------------------------------------------------}
+
+function TRegExpr.Dump : RegExprString;
+// dump a regexp in vaguely comprehensible form
+ var
+ s : PRegExprChar;
+ op : TREOp; // Arbitrary non-END op.
+ next : PRegExprChar;
+ i : integer;
+{$IFDEF UseSetOfChar} //###0.929
+ Ch : REChar;
+{$ENDIF}
+ begin
+ if not IsProgrammOk //###0.929
+ then EXIT;
+
+ op := EXACTLY;
+ Result := '';
+ s := programm + REOpSz;
+ while op <> EEND do begin // While that wasn't END last time...
+ op := s^;
+ Result := Result + Format ('%2d%s', [s - programm, DumpOp (s^)]); // Where, what.
+ next := regnext (s);
+ if next = nil // Next ptr.
+ then Result := Result + ' (0)'
+ else Result := Result + Format (' (%d) ', [(s - programm) + (next - s)]);
+ inc (s, REOpSz + RENextOffSz);
+ if (op = ANYOF) or (op = ANYOFCI) or (op = ANYBUT) or (op = ANYBUTCI)
+ or (op = EXACTLY) or (op = EXACTLYCI) then begin
+ // Literal string, where present.
+ while s^ <> #0 do begin
+ Result := Result + s^;
+ inc (s);
+ end;
+ inc (s);
+ end;
+ if (op = ANYOFTINYSET) or (op = ANYBUTTINYSET) then begin
+ for i := 1 to TinySetLen do begin
+ Result := Result + s^;
+ inc (s);
+ end;
+ end;
+ if (op = BSUBEXP) or (op = BSUBEXPCI) then begin
+ Result := Result + ' \' + IntToStr (Ord (s^));
+ inc (s);
+ end;
+ {$IFDEF UseSetOfChar} //###0.929
+ if op = ANYOFFULLSET then begin
+ for Ch := #0 to #255 do
+ if Ch in PSetOfREChar (s)^ then
+ if Ch < ' '
+ then Result := Result + '#' + IntToStr (Ord (Ch)) //###0.936
+ else Result := Result + Ch;
+ inc (s, SizeOf (TSetOfREChar));
+ end;
+ {$ENDIF}
+ if (op = BRACES) or (op = BRACESNG) then begin //###0.941
+ // show min/max argument of BRACES operator
+ Result := Result + Format ('{%d,%d}', [PREBracesArg (s)^, PREBracesArg (s + REBracesArgSz)^]);
+ inc (s, REBracesArgSz * 2);
+ end;
+ {$IFDEF ComplexBraces}
+ if (op = LOOP) or (op = LOOPNG) then begin //###0.940
+ Result := Result + Format (' -> (%d) {%d,%d}', [
+ (s - programm - (REOpSz + RENextOffSz)) + PRENextOff (s + 2 * REBracesArgSz)^,
+ PREBracesArg (s)^, PREBracesArg (s + REBracesArgSz)^]);
+ inc (s, 2 * REBracesArgSz + RENextOffSz);
+ end;
+ {$ENDIF}
+ Result := Result + #$d#$a;
+ end; { of while}
+
+ // Header fields of interest.
+
+ if regstart <> #0
+ then Result := Result + 'start ' + regstart;
+ if reganch <> #0
+ then Result := Result + 'anchored ';
+ if regmust <> nil
+ then Result := Result + 'must have ' + regmust;
+ {$IFDEF UseFirstCharSet} //###0.929
+ Result := Result + #$d#$a'FirstCharSet:';
+ for Ch := #0 to #255 do
+ if Ch in FirstCharSet
+ then Result := Result + Ch;
+ {$ENDIF}
+ Result := Result + #$d#$a;
+ end; { of function TRegExpr.Dump
+--------------------------------------------------------------}
+{$ENDIF}
+
+{$IFDEF reRealExceptionAddr}
+{$OPTIMIZATION ON}
+// ReturnAddr works correctly only if compiler optimization is ON
+// I placed this method at very end of unit because there are no
+// way to restore compiler optimization flag ...
+{$ENDIF}
+procedure TRegExpr.Error (AErrorID : integer);
+{$IFDEF reRealExceptionAddr}
+ function ReturnAddr : pointer; //###0.938
+ asm
+ mov eax,[ebp+4]
+ end;
+{$ENDIF}
+ var
+ e : ERegExpr;
+ begin
+ fLastError := AErrorID; // dummy stub - useless because will raise exception
+ if AErrorID < 1000 // compilation error ?
+ then e := ERegExpr.Create (ErrorMsg (AErrorID) // yes - show error pos
+ + ' (pos ' + IntToStr (CompilerErrorPos) + ')')
+ else e := ERegExpr.Create (ErrorMsg (AErrorID));
+ e.ErrorCode := AErrorID;
+ e.CompilerErrorPos := CompilerErrorPos;
+ raise e
+ {$IFDEF reRealExceptionAddr}
+ At ReturnAddr; //###0.938
+ {$ENDIF}
+ end; { of procedure TRegExpr.Error
+--------------------------------------------------------------}
+
+// be carefull - placed here code will be always compiled with
+// compiler optimization flag
+initialization
+ RegExprInvertCaseFunction := TRegExpr.InvertCaseFunction;
+end.
+
+
+
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARemoteCommand.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARemoteCommand.pas
new file mode 100644
index 0000000..f2b977f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARemoteCommand.pas
@@ -0,0 +1,195 @@
+unit uDARemoteCommand;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, uRORemoteService, DataAbstract4_Intf,
+ uDAInterfaces, uRODynamicRequest, uROClasses, uROClient;
+
+type
+ { TRORemoteCommandRequest }
+ TRORemoteCommandRequest = class(TRODynamicRequest)
+ private
+ fOutgoingCommandNameParameter: string;
+ fOutgoingParametersParameter: string;
+ fIncomingAffectedRowsParameter: string;
+ fIncomingParametersParameter: string;
+ public
+ constructor Create(aOwner : TComponent); override;
+ procedure Assign(Source: TPersistent); override;
+ procedure SetupDefaultRequest; virtual;
+ published
+ property OutgoingCommandNameParameter: string read fOutgoingCommandNameParameter write fOutgoingCommandNameParameter;
+ property OutgoingParametersParameter: string read fOutgoingParametersParameter write fOutgoingParametersParameter;
+ property IncomingAffectedRowsParameter: string read fIncomingAffectedRowsParameter write fIncomingAffectedRowsParameter;
+ property IncomingParametersParameter: string read fIncomingParametersParameter write fIncomingParametersParameter;
+ end;
+
+ { TDARemoteCommand }
+ TDARemoteCommand = class(TROComponent)
+ private
+ fRemoteService: TRORemoteService;
+ fExecuteCall: TRORemoteCommandRequest;
+ procedure SetRemoteService(const Value: TRORemoteService);
+ procedure FillCommandParams(aDataParameterArray: DataParameterArray; aCommandParam: TRORequestParam);
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ function Execute(aCommandName: string; aInputParameters: DataParameterArray): integer; overload;
+ function Execute(aCommandName: string; aParamNames: array of string; aParamValues: array of variant): integer; overload;
+ published
+ property RemoteService: TRORemoteService read fRemoteService write SetRemoteService;
+ property ExecuteCall: TRORemoteCommandRequest read fExecuteCall write fExecuteCall;
+ end;
+
+implementation
+
+uses
+ SysUtils, Dialogs, uRODL;
+
+{ TRORemoteCommandRequest }
+procedure TRORemoteCommandRequest.Assign(Source: TPersistent);
+var
+ lSource: TRORemoteCommandRequest;
+begin
+ inherited;
+ if Source is TRORemoteCommandRequest then begin
+ lSource := TRORemoteCommandRequest(Source);
+
+ IncomingAffectedRowsParameter := lSource.IncomingAffectedRowsParameter;
+ IncomingParametersParameter := lSource.IncomingParametersParameter;
+ OutgoingCommandNameParameter := lSource.OutgoingCommandNameParameter;
+ OutgoingParametersParameter := lSource.OutgoingParametersParameter;
+ end;
+end;
+
+constructor TRORemoteCommandRequest.Create(aOwner : TComponent);
+begin
+ inherited;
+ Self.SetupDefaultRequest();
+end;
+
+procedure TRORemoteCommandRequest.SetupDefaultRequest;
+begin
+ Params.Clear();
+ OutgoingCommandNameParameter := Params.Add('aCommandName', rtString, fIn).Name;
+ OutgoingParametersParameter := Params.Add('aParameterArray', rtUserDefined, fIn, 'DataParameterArray').Name;
+ IncomingAffectedRowsParameter := Params.Add('Result', rtInteger, fResult).Name;
+ IncomingParametersParameter := '';
+
+ MethodName := 'ExecuteCommand';
+end;
+
+{ TDARemoteCommand }
+procedure TDARemoteCommand.Assign(Source: TPersistent);
+var
+ lSource: TDARemoteCommand;
+begin
+ inherited;
+ if Source is TDARemoteCommand then begin
+ lSource := TDARemoteCommand(Source);
+
+ ExecuteCall := lSource.ExecuteCall;
+ RemoteService := lSource.RemoteService;
+ end;
+end;
+
+constructor TDARemoteCommand.Create(aOwner: TComponent);
+begin
+ inherited;
+ fExecuteCall := TRORemoteCommandRequest.Create(Self);
+ fExecuteCall.Name := 'RemoteCommandRequest';
+end;
+
+destructor TDARemoteCommand.Destroy;
+begin
+ RemoteService := nil;
+ if Assigned(fExecuteCall) then fExecuteCall.Free();
+ inherited;
+end;
+
+procedure TDARemoteCommand.SetRemoteService(const Value: TRORemoteService);
+begin
+ if Value <> fRemoteService then begin
+ if assigned(fRemoteService) then fRemoteService.RORemoveFreeNotification(self);
+ fRemoteService := Value;
+ if assigned(fRemoteService) then fRemoteService.ROFreeNotification(self);
+ fExecuteCall.RemoteService := fRemoteService;
+ end;
+end;
+
+function TDARemoteCommand.Execute(aCommandName: string; aInputParameters: DataParameterArray): integer;
+var
+ lParam : TRORequestParam;
+begin
+ result := 0;
+ if not Assigned(fExecuteCall) then raise Exception.Create('ExecuteCall is unassigned');
+ if (Length(fExecuteCall.OutgoingCommandNameParameter)>0) then
+ fExecuteCall.ParamByName(fExecuteCall.OutgoingCommandNameParameter).Value := aCommandName;
+ if (Length(fExecuteCall.OutgoingParametersParameter)>0) then begin
+ lParam := fExecuteCall.Params.FindParam(fExecuteCall.OutgoingParametersParameter);
+ if Assigned(lParam) then FillCommandParams(aInputParameters, lparam);
+ end;
+
+ fExecuteCall.Execute();
+
+ if (Length(fExecuteCall.IncomingAffectedRowsParameter)>0) then
+ result := Integer(fExecuteCall.ParamByName(fExecuteCall.IncomingAffectedRowsParameter).Value);
+end;
+
+function TDARemoteCommand.Execute(aCommandName: string; aParamNames: array of string; aParamValues: array of variant): integer;
+var
+ i, idx: Integer;
+ lInputParameters: DataParameterArray;
+begin
+ lInputParameters := DataParameterArray.Create();
+ if (High(aParamNames) <> High(aParamValues)) then raise Exception.Create('Error in parameters. Count of parameter values doesn''t correspond to count of parameters');
+
+ for i := Low(aParamNames) to High(aParamNames) do begin
+ idx := lInputParameters.Add(DataParameter.Create());
+ lInputParameters[idx].Name := UTF8Encode(aParamNames[i]);
+ lInputParameters[idx].Value := aParamValues[i];
+ end;
+ try
+ result := Self.Execute(aCommandName, lInputParameters);
+ finally
+ lInputParameters.Free;
+ end;
+end;
+
+procedure TDARemoteCommand.FillCommandParams(aDataParameterArray: DataParameterArray; aCommandParam: TRORequestParam);
+var
+ lArray: DataParameterArray;
+ lParam: DataParameter;
+ i: integer;
+begin
+ if (aCommandParam.DataType <> rtUserDefined) or (aCommandParam.TypeName <> 'DataParameterArray') then exit;
+
+ lArray := DataParameterArray.Create();
+
+ for i := 0 to aDataParameterArray.Count - 1 do begin
+ lParam := lArray.Add();
+ lParam.Name := aDataParameterArray[i].Name;
+ lParam.Value := aDataParameterArray[i].Value;
+ end;
+
+ aCommandParam.AsComplexType := lArray;
+ aCommandParam.OwnsComplexType := true;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARemoteDataAdapter.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARemoteDataAdapter.pas
new file mode 100644
index 0000000..261fee8
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARemoteDataAdapter.pas
@@ -0,0 +1,544 @@
+unit uDARemoteDataAdapter;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes,
+ uRODynamicRequest, uROClasses, uRORemoteService,
+ DataAbstract4_Intf, uDADataAdapter, uDADataTable,
+ uDARemoteDataAdapterRequests,uDADataStreamer;
+
+const
+ // from uDADataAdapter
+ fbNone = uDADataAdapter.fbNone;
+ fbRaiseException = uDADataAdapter.fbRaiseException;
+ fbShowReconcile = uDADataAdapter.fbShowReconcile;
+ fbBoth = uDADataAdapter.fbBoth;
+type
+ TDAReconcileDialogAction = uDADataAdapter.TDAReconcileDialogAction;
+
+type
+ TDARequestEvent = procedure(Sender: TObject; Request: TRODynamicRequest) of object;
+
+ { TDARemoteDataAdapter }
+ TDARemoteDataAdapter = class(TDABaseDataAdapter)
+ private
+ fGetDataCall: TDAGetDataRequest;
+ fGetSchemaCall: TDAGetSchemaRequest;
+ fUpdateDataCall: TDAUpdateDataRequest;
+ fGetScriptsCall: TDAGetScriptsRequest;
+ fRemoteService: TRORemoteService;
+ fBeforeGetDataCall, fAfterGetDataCall,
+ fBeforeGetSchemaCall, fAfterGetSchemaCall,
+ fBeforeGetScriptsCall, fAfterGetScriptsCall,
+ fBeforeUpdateDataCall, fAfterUpdateDataCall: TDARequestEvent;
+ procedure DoGetSchemaCall;
+ procedure FillTableNamesParam(aTables: array of TDADataTable; aParam: TRORequestParam);
+ procedure SetRemoteService(const Value: TRORemoteService);
+ procedure FillTableParams(aTables: array of TDADataTable; aParam: TRORequestParam);
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure Loaded; override;
+
+ function InternalFillSchema(var aStream: TROBinaryMemoryStream): TRODataType; override;
+ procedure InternalApplyUpdates(aTables,aTablesWithDetails: array of TDADataTable); override;
+ function InternalFillScripts(aTables: array of TDADataTable): UTF8String; override;
+ function InternalReadSchema: UTF8String; override;
+ procedure InternalFill(aTableArray: array of TDADataTable; aArray: TableRequestInfoArray; const aIncludeSchema, aAppendMode: boolean; aSavedOptions: TDATableOptionsArray);override;
+
+ { backward compatibility: to provide access to these in the legacy events in TDADataTable}
+ function Get_GetSchemaCall: TDARemoteRequest; override;
+ function Get_GetDataCall: TDARemoteRequest; override;
+ function Get_UpdateDataCall: TDARemoteRequest; override;
+ function Get_GetScriptsCall: TDARemoteRequest; override;
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure SetupDefaultRequestV3;
+ procedure SetupDefaultRequest;
+ procedure CheckProperties; override;
+ published
+ property GetSchemaCall: TDAGetSchemaRequest read fGetSchemaCall;
+ property GetDataCall: TDAGetDataRequest read fGetDataCall;
+ property UpdateDataCall: TDAUpdateDataRequest read fUpdateDataCall;
+ property GetScriptsCall: TDAGetScriptsRequest read fGetScriptsCall;
+ property RemoteService: TRORemoteService read fRemoteService write SetRemoteService;
+ property CacheSchema;
+ property DataStreamer;
+
+ property BeforeGetDataCall: TDARequestEvent read fBeforeGetDataCall write fBeforeGetDataCall;
+ property AfterGetDataCall: TDARequestEvent read fAfterGetDataCall write fAfterGetDataCall;
+ property BeforeGetSchemaCall: TDARequestEvent read fBeforeGetSchemaCall write fBeforeGetSchemaCall;
+ property AfterGetSchemaCall: TDARequestEvent read fAfterGetSchemaCall write fAfterGetSchemaCall;
+ property BeforeGetScriptsCall: TDARequestEvent read fBeforeGetScriptsCall write fBeforeGetScriptsCall;
+ property AfterGetScriptsCall: TDARequestEvent read fAfterGetScriptsCall write fAfterGetScriptsCall;
+ property BeforeUpdateDataCall: TDARequestEvent read fBeforeUpdateDataCall write fBeforeUpdateDataCall;
+ property AfterUpdateDataCall: TDARequestEvent read fAfterUpdateDataCall write fAfterUpdateDataCall;
+ end;
+
+implementation
+
+uses
+ SysUtils;
+
+{ TDARemoteDataAdapter }
+
+procedure TDARemoteDataAdapter.FillTableNamesParam(aTables: array of TDADataTable; aParam: TRORequestParam);
+var
+ lArray: StringArray;
+ i: integer;
+begin
+ case aParam.DataType of
+ rtString: begin // v3 style string
+ if Length(aTables) <> 1 then
+ raise Exception.Create('The current GetDataCall configuration does not allow fetching multiple data tables at once.');
+ aParam.AsString := aTables[Low(aTables)].LogicalName;
+ end;
+ rtUserDefined: begin // v4 style string array
+ lArray := StringArray.Create();
+ lArray.Resize(Length(aTables));
+ for i := Low(aTables) to High(aTables) do
+ lArray[i-Low(aTables)] := UTF8Encode(aTables[i].LogicalName);
+ aParam.AsComplexType := lArray;
+ aParam.OwnsComplexType := true;
+ end;
+ rtUTF8String: aParam.AsUTF8String := GetTableNamesAsCommaText(aTables);
+ end;
+end;
+
+procedure TDARemoteDataAdapter.FillTableParams(
+ aTables: array of TDADataTable; aParam: TRORequestParam);
+var
+ lArray: DataParameterArray;
+ lParam: DataParameter;
+ lTable: TDADataTable;
+ j: integer;
+ lList: TStringList;
+begin
+ lArray:=nil; // prevert "W1036 Variable 'lArray' might not have been initialized"
+ case aParam.DataType of
+ rtString: begin // v3 style string
+ if Length(aTables) <> 1 then raise Exception.Create('The current GetDataCall configuration does not allow fetching multiple data tables');
+ with aTables[Low(aTables)].Params do begin
+ if Count<>0 then begin
+ lList:= TStringList.Create;
+ try
+ for j := 0 to Count - 1 do
+ lList.Values[Params[j].Name]:=Params[j].AsString;
+ aParam.AsString:= lList.Text;
+ finally
+ lList.Free;
+ end;
+ end;
+ end;
+ end;
+ rtUserDefined: begin
+ if aParam.TypeName = 'DataParameterArray' then
+ lArray := DataParameterArray.Create();
+
+ lTable := aTables[Low(aTables)];
+ for j := 0 to lTable.Params.Count-1 do begin
+ lParam := lArray.Add();
+ lParam.Name := AnsiToUtf8(lTable.Params[j].Name);
+ lParam.Value := lTable.Params[j].Value;
+ end;
+
+ aParam.AsComplexType := lArray;
+ aParam.OwnsComplexType := true;
+ end;
+ end;
+end;
+
+procedure TDARemoteDataAdapter.DoGetSchemaCall;
+begin
+ //ToDo: handle aFilter parameter?
+ if Assigned(fBeforeGetSchemaCall) then fBeforeGetSchemaCall(Self, GetSchemaCall);
+ GetSchemaCall.Execute();
+ if Assigned(fAfterGetSchemaCall) then fAfterGetSchemaCall(Self, GetSchemaCall);
+end;
+
+function TDARemoteDataAdapter.InternalFillScripts(aTables: array of TDADataTable): UTF8String;
+var
+ lParam: TDARemoteRequestParam;
+ lResultParam: TRORequestParam;
+begin
+ if GetScriptsCall.MethodName = '' then
+ raise Exception.Create('GetScriptsCall.MethodName must be configured to retrieve scripts.');
+ try
+ lParam := GetScriptsCall.Params.FindParam(GetScriptsCall.OutgoingTableNamesParameter);
+ if assigned(lParam) then FillTableNamesParam(aTables, lParam);
+
+ GetScriptsCall.Execute();
+
+ lResultParam := GetScriptsCall.Params.FindParam(GetScriptsCall.IncomingScriptParameter);
+
+ if not assigned(lResultParam) or not (lResultParam.DataType in [rtUTF8String, rtString]) then
+ raise Exception.Create('Result parameter of GetScriptsCall is not properly defined.');
+
+ if Assigned(fBeforeGetScriptsCall) then fBeforeGetScriptsCall(Self, GetScriptsCall);
+ GetScriptsCall.Execute();
+ if Assigned(fAfterGetScriptsCall) then fAfterGetScriptsCall(Self, GetScriptsCall);
+ Result := UTF8String(lResultParam.AsAnsiString); { TODO : .AsUtf8String ? }
+ finally
+ lParam := GetScriptsCall.Params.FindParam(GetScriptsCall.OutgoingTableNamesParameter);
+ if assigned(lParam) then lParam.ClearValue;
+ lParam := GetScriptsCall.Params.FindParam(GetScriptsCall.IncomingScriptParameter);
+ if assigned(lParam) then lParam.ClearValue;
+ end;
+end;
+
+
+function TDARemoteDataAdapter.InternalReadSchema: UTF8String;
+var
+ lResultParam: TRORequestParam;
+begin
+ CheckProperties;
+ lResultParam := GetSchemaCall.Params.FindParam(GetSchemaCall.IncomingSchemaParameter);
+ try
+ if not assigned(lResultParam) then
+ raise Exception.Create('Result parameter of GetSchemaCall is not defined.');
+ if not (lResultParam.DataType in [rtUTF8String,rtString]) then
+ raise Exception.Create('Result parameter of GetSchemaCall is not properly defined as String.');
+ DoGetSchemaCall();
+ Result := UTF8String(lResultParam.AsAnsiString); //{ TODO : .ASUtf8String ? }
+ finally
+ if Assigned(lResultParam) then lResultParam.ClearValue;
+ end;
+end;
+
+{$IFDEF FPC}
+procedure List_Union(List1,List2: TList);
+var
+ i: integer;
+begin
+ if List1 = List2 then Exit;
+ for i := 0 to List2.Count-1 do
+ if List1.IndexOf(List2[i])=-1 then
+ List1.Add(List2[i]);
+end;
+{$ENDIF}
+
+procedure TDARemoteDataAdapter.InternalApplyUpdates(aTables,aTablesWithDetails: array of TDADataTable);
+var
+ i: integer;
+ lParam, lResultparam: TRORequestParam;
+begin
+ try
+ { Fill Input Parameters }
+ lParam := UpdateDataCall.Params.FindParam(UpdateDataCall.OutgoingDeltaParameter);
+ if not assigned(lParam) or (lParam.DataType <> rtBinary) then
+ raise Exception.Create('OutgoingDeltaParameter parameter of UpdateDataCall is not properly defined.');
+ lParam.ClearValue();
+
+ DataStreamer.Initialize(lParam.AsBinary, aiWrite);
+ try
+ for i := Low(aTables) to High(aTables) do
+ aTables[i].WriteDeltaToStream(DataStreamer);
+ finally
+ DataStreamer.Finalize;
+ end;
+
+ { Make call }
+ if DataStreamer.DeltaCount > 0 then begin
+ if Assigned(fBeforeUpdateDataCall) then fBeforeUpdateDataCall(Self, UpdateDataCall);
+ UpdateDataCall.Execute();
+ if Assigned(fAfterUpdateDataCall) then fAfterUpdateDataCall(Self, UpdateDataCall);
+
+ { Get Output Parameters }
+ if UpdateDataCall.IncomingDeltaParameter <> '' then begin // If the result parameter isn't set, we shouldn't check for a result.
+
+ lResultParam := UpdateDataCall.Params.FindParam(UpdateDataCall.IncomingDeltaParameter);
+ if not assigned(lResultParam) or (lResultParam.DataType <> rtBinary) then
+ raise Exception.Create('IncomingDeltaParameter parameter of UpdateDataCall is not properly defined.');
+
+ // Reads the incoming delta, including the details
+ if assigned(lResultParam.AsBinary) and (lResultParam.AsBinary.Size > 0) then begin
+ DataStreamer.Initialize(lResultParam.AsBinary, aiReadFromBeginning);
+ try
+ for i := Low(aTables) to High(aTables) do
+ aTables[i].ReadDeltaFromStream(DataStreamer);
+ finally
+ DataStreamer.Finalize;
+ end;
+ end;
+ end;
+ end;
+ finally
+ lResultParam := UpdateDataCall.Params.FindParam(UpdateDataCall.IncomingDeltaParameter);
+ if assigned(lResultParam) then lResultParam.ClearValue;
+ lParam := UpdateDataCall.Params.FindParam(UpdateDataCall.OutgoingDeltaParameter);
+ if assigned(lParam) then lParam.ClearValue;
+ end;
+end;
+
+constructor TDARemoteDataAdapter.Create(aOwner: TComponent);
+begin
+ inherited;
+ fGetSchemaCall := TDAGetSchemaRequest.Create(self);
+ fGetDataCall := TDAGetDataRequest.Create(self);
+ fUpdateDataCall := TDAUpdateDataRequest.Create(self);
+ fGetScriptsCall := TDAGetScriptsRequest.Create(self);
+
+ fGetSchemaCall.Name := 'GetSchemaCall';
+ fGetDataCall.Name := 'GetDataCall';
+ fUpdateDataCall.Name := 'UpdateDataCall';
+ fGetScriptsCall.Name := 'GetScriptsCall';
+ SetupDefaultRequest;
+end;
+
+destructor TDARemoteDataAdapter.Destroy;
+begin
+ RemoteService := nil;
+ FreeAndNil(fGetSchemaCall);
+ FreeAndNil(fGetDataCall);
+ FreeAndNil(fUpdateDataCall);
+ FreeAndNil(fGetScriptsCall);
+ inherited;
+end;
+
+procedure TDARemoteDataAdapter.Notification(AComponent: TComponent; Operation: TOperation);
+begin
+ inherited;
+ if (Operation = opRemove) and (AComponent = RemoteService) then fRemoteService := nil;
+end;
+
+
+procedure TDARemoteDataAdapter.SetRemoteService(const Value: TRORemoteService);
+begin
+ if Value <> fRemoteService then begin
+ if assigned(fRemoteService) then fRemoteService.RORemoveFreeNotification(self);
+ fRemoteService := Value;
+ GetSchemaCall.RemoteService := fRemoteService;
+ GetDataCall.RemoteService := fRemoteService;
+ UpdateDataCall.RemoteService := fRemoteService;
+ GetScriptsCall.RemoteService := fRemoteService;
+ if assigned(fRemoteService) then fRemoteService.ROFreeNotification(self);
+ end;
+end;
+
+{ Schema }
+function TDARemoteDataAdapter.Get_GetDataCall: TDARemoteRequest;
+begin
+ result := GetDataCall;
+end;
+
+function TDARemoteDataAdapter.Get_GetSchemaCall: TDARemoteRequest;
+begin
+ result := GetSchemaCall;
+end;
+
+function TDARemoteDataAdapter.Get_GetScriptsCall: TDARemoteRequest;
+begin
+ result := GetScriptsCall;
+end;
+
+function TDARemoteDataAdapter.Get_UpdateDataCall: TDARemoteRequest;
+begin
+ result := UpdateDataCall;
+end;
+
+procedure TDARemoteDataAdapter.SetupDefaultRequest;
+begin
+ GetSchemaCall.SetupDefaultRequest();
+ GetDataCall.SetupDefaultRequest();
+ UpdateDataCall.SetupDefaultRequest();
+ GetScriptsCall.SetupDefaultRequest();
+end;
+
+procedure TDARemoteDataAdapter.SetupDefaultRequestV3;
+begin
+ GetSchemaCall.SetupDefaultRequestV3();
+ GetDataCall.SetupDefaultRequestV3();
+ UpdateDataCall.SetupDefaultRequestV3();
+ GetScriptsCall.SetupDefaultRequestV3();
+end;
+
+procedure TDARemoteDataAdapter.Assign(Source: TPersistent);
+var
+ lSource: TDARemoteDataAdapter;
+begin
+ inherited;
+ if Source is TDARemoteDataAdapter then begin
+ lSource := TDARemoteDataAdapter(Source);
+
+ AfterGetDataCall := lSource.AfterGetDataCall;
+ AfterGetSchemaCall := lSource.AfterGetSchemaCall;
+ AfterGetScriptsCall := lSource.AfterGetScriptsCall;
+ AfterUpdateDataCall := lSource.AfterUpdateDataCall;
+ BeforeGetDataCall := lSource.BeforeGetDataCall;
+ BeforeGetSchemaCall := lSource.BeforeGetSchemaCall;
+ BeforeGetScriptsCall := lSource.BeforeGetScriptsCall;
+ BeforeUpdateDataCall := lSource.BeforeUpdateDataCall;
+ GetDataCall.Assign(lSource.GetDataCall);
+ GetSchemaCall.Assign(lSource.GetSchemaCall);
+ GetScriptsCall.Assign(lSource.GetScriptsCall);
+ RemoteService := lSource.RemoteService;
+ UpdateDataCall.Assign(lSource.UpdateDataCall);
+ end;
+end;
+
+procedure TDARemoteDataAdapter.CheckProperties;
+begin
+ inherited;
+ Check(not assigned(DataStreamer), Name + '.DataStreamer must be assigned.');
+ Check(not assigned(RemoteService), Name + '.RemoteService must be assigned.');
+ RemoteService.CheckProperties();
+end;
+
+procedure TDARemoteDataAdapter.Loaded;
+begin
+ inherited;
+ {$IFDEF DELPHI6}
+ // Delphi 6 doesn't call Loaded of any of the sub components.
+ fGetDataCall.Loaded;
+ fGetSchemaCall.Loaded;
+ fUpdateDataCall.Loaded;
+ fGetScriptsCall.Loaded;
+ {$ENDIF}
+end;
+
+
+procedure TDARemoteDataAdapter.InternalFill(aTableArray: array of TDADataTable;
+ aArray: TableRequestInfoArray; const aIncludeSchema, aAppendMode: boolean; aSavedOptions: TDATableOptionsArray);
+var
+ lParam, lResultParam: TRORequestParam;
+ lHasTableNamesParameter: Boolean;
+ i: integer;
+ ltbl: TDADataTable;
+ lLogicalName: string;
+begin
+ try
+ lParam := GetDataCall.Params.FindParam(GetDataCall.OutgoingTableNamesParameter);
+ lHasTableNamesParameter := assigned(lParam);
+ if lHasTableNamesParameter then
+ FillTableNamesParam(aTableArray, lParam)
+ else if Length(aTableArray) <> 1 then
+ raise Exception.Create('The current GetDataCall configuration does not allow fetching multiple data tables');
+
+ if Length(GetDataCall.OutgoingTableRequestInfosParameter) > 0 then begin
+ lParam := GetDataCall.Params.FindParam(GetDataCall.OutgoingTableRequestInfosParameter);
+ if Assigned(lParam) then begin
+ if (lParam.DataType = rtUserDefined) and (lParam.TypeName = 'TableRequestInfoArray') then begin
+ lParam.AsComplexType := aArray;
+ end;
+ end;
+ end;
+
+ if (GetDataCall.OutgoingParamsParameter <> '') then begin // v3 style call
+ lParam := GetDataCall.Params.FindParam(GetDataCall.OutgoingParamsParameter);
+ if Assigned(lParam) then
+ FillTableParams(aTableArray, lParam);
+ end;
+
+ if (GetDataCall.OutgoingMaxRecordsParameter <> '') then begin // v3 style call
+ if Length(aTableArray) <> 1 then
+ for i := 0 to High(aTableArray) do
+ if aTableArray[i].MaxRecords <> -1 then
+ raise Exception.Create('The current GetDataCall configuration does not allow fetching multiple data tables with a limited record count.');
+ lParam := GetDataCall.Params.FindParam(GetDataCall.OutgoingMaxRecordsParameter);
+ if Assigned(lParam) and (Length(aTableArray) > 0) then lParam.AsInteger := aTableArray[0].MaxRecords;
+ end;
+
+ if (GetDataCall.OutgoingIncludeSchemaParameter <> '') then begin // v3 style call
+ lParam := GetDataCall.Params.FindParam(GetDataCall.OutgoingIncludeSchemaParameter);
+ if Assigned(lParam) then lParam.AsBoolean := aIncludeSchema;
+ end;
+
+ if Assigned(fBeforeGetDataCall) then fBeforeGetDataCall(Self, GetDataCall);
+
+ GetDataCall.Execute();
+ lResultParam := GetDataCall.Params.FindParam(GetDataCall.IncomingDataParameter);
+
+ if Assigned(fAfterGetDataCall) then fAfterGetDataCall(Self, GetDataCall);
+
+ if not assigned(lResultParam) or (lResultParam.DataType <> rtBinary) then
+ raise Exception.Create('Result parameter of GetDataCall is not properly defined.');
+
+ if not assigned(lResultParam.AsBinary) then raise Exception.Create('The server returned a nil buffer.');
+
+ // Reads the data
+ DataStreamer.Initialize(lResultParam.AsBinary, aiRead);
+ try
+ // part 1 - reading schema
+ for i := Low(aTableArray) to High(aTableArray) do
+ begin
+ ltbl:= aTableArray[i];
+ if aArray[i].IncludeSchema and not (soIgnoreStreamSchema in ltbl.StreamingOptions) then begin
+ aSavedOptions[i].AppendMode := False;
+ if not lHasTableNamesParameter and (DataStreamer.DatasetCount = 1) then
+ DataStreamer.ReadDataset(DataStreamer.DatasetNames[0], ltbl, true, false)
+ else
+ DataStreamer.ReadDataset(ltbl.LogicalName, ltbl, true, false);
+ end;
+ if not ltbl.Active then ltbl.InitializeDataTable;
+ //end;
+ end;
+ if AutoFillScripts then FillScripts(aTableArray);
+ // part 2 - reading data
+ for i := Low(aTableArray) to High(aTableArray) do begin
+ ltbl:= aTableArray[i];
+
+ if not lHasTableNamesParameter and (DataStreamer.DatasetCount = 1) then
+ lLogicalName:=DataStreamer.DatasetNames[0]
+ else
+ lLogicalName:=ltbl.LogicalName;
+
+ DataStreamer.ReadDataset(lLogicalName, ltbl, false, true, aSavedOptions[i].AppendMode);
+ if not aAppendMode and (moAllInOneFetch in ltbl.MasterOptions) then ltbl.DoCascadeOperation(DataStreamer, moAllInOneFetch);
+ end;
+ finally
+ DataStreamer.Finalize;
+ end;
+
+
+ finally
+ lParam := GetDataCall.Params.FindParam(GetDataCall.OutgoingTableRequestInfosParameter);
+ if Assigned(lParam) then lParam.ClearValue;
+ lParam := GetDataCall.Params.FindParam(GetDataCall.OutgoingParamsParameter);
+ if Assigned(lParam) then lParam.ClearValue;
+ lParam := GetDataCall.Params.FindParam(GetDataCall.IncomingDataParameter);
+ if Assigned(lParam) then lParam.ClearValue;
+ end;
+end;
+
+function TDARemoteDataAdapter.InternalFillSchema(var aStream: TROBinaryMemoryStream): TRODataType;
+var
+ lResultParam: TRORequestParam;
+begin
+ lResultParam := GetSchemaCall.Params.FindParam(GetSchemaCall.IncomingSchemaParameter);
+ if not assigned(lResultParam) then raise Exception.Create('Result parameter of GetSchemaCall is not defined.');
+ Result := lResultParam.DataType;
+ try
+ case Result of
+ rtBinary:begin
+ DoGetSchemaCall();
+ if not assigned(lResultParam.AsBinary) or (lResultParam.AsBinary.Size = 0 ) then
+ raise Exception.Create('Server returned an empty buffer for schema.');
+ aStream := TROBinaryMemoryStream.Create;
+ aStream.CopyFrom(lResultParam.AsBinary,0);
+ end;
+ rtString, rtUTF8String: begin
+ Schema;
+ end;
+ end;
+ finally
+ if Assigned(lResultParam) then lResultParam.ClearValue;
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARemoteDataAdapterRequests.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARemoteDataAdapterRequests.pas
new file mode 100644
index 0000000..5e2b236
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARemoteDataAdapterRequests.pas
@@ -0,0 +1,390 @@
+unit uDARemoteDataAdapterRequests;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes,
+ uRODynamicRequest;
+
+type
+ { TDARemoteDataAdapterRequest }
+ TDARemoteDataAdapterRequest = class(TRODynamicRequest)
+ private
+ fDefault: boolean;
+ procedure SetDefault(const Value: boolean);
+ protected
+ function IsNotDefault: boolean;
+ procedure MethodNameChanged; override;
+ public
+ procedure Loaded; override;
+ constructor Create(aOwner: TComponent); override;
+ procedure Assign(Source: TPersistent); override;
+ procedure SetupDefaultRequestV3; virtual; abstract;
+ procedure SetupDefaultRequest; virtual;
+ published
+ property Default: boolean read fDefault write SetDefault default true;
+ property Params stored IsNotDefault;
+ property MethodName stored IsNotDefault;
+ end;
+
+ TDAGetSchemaRequest = class(TDARemoteDataAdapterRequest)
+ private
+ fIncomingSchemaParameter: string;
+ fOutgoingFilterParameter: string;
+ procedure SetIncomingSchemaParameter(const Value: string);
+ procedure SetOutgoingFilterParameter(const Value: string);
+ public
+ procedure Assign(Source: TPersistent); override;
+ procedure SetupDefaultRequestV3; override;
+ procedure SetupDefaultRequest; override;
+ published
+ property IncomingSchemaParameter: string read fIncomingSchemaParameter write SetIncomingSchemaParameter stored IsNotDefault;
+ property OutgoingFilterParameter: string read fOutgoingFilterParameter write SetOutgoingFilterParameter stored IsNotDefault;
+ end;
+
+ TDAGetDataRequest = class(TDARemoteDataAdapterRequest)
+ private
+ fIncomingDataParameter: string;
+ fOutgoingTableNamesParameter: string;
+ fOutgoingIncludeSchemaParameter: string;
+ fOutgoingMaxRecordsParameter: string;
+ fOutgoingParamsParameter: string;
+ fOutgoingTableRequestInfosParameter: string;
+ procedure SetIncomingDataParameter(const Value: string);
+ procedure SetOutgoingIncludeSchemaParameter(const Value: string);
+ procedure SetOutgoingMaxRecordsParameter(const Value: string);
+ procedure SetOutgoingParamsParameter(const Value: string);
+ procedure SetOutgoingTableNamesParameter(const Value: string);
+ procedure SetOutgoingTableRequestInfosParameter(const Value: string);
+ public
+ procedure Assign(Source: TPersistent); override;
+ procedure SetupDefaultRequestV3; override;
+ procedure SetupDefaultRequest; override;
+ published
+ property OutgoingTableNamesParameter: string read fOutgoingTableNamesParameter write SetOutgoingTableNamesParameter stored IsNotDefault;
+ property OutgoingTableRequestInfosParameter: string read fOutgoingTableRequestInfosParameter write SetOutgoingTableRequestInfosParameter stored IsNotDefault;
+ property IncomingDataParameter: string read fIncomingDataParameter write SetIncomingDataParameter stored IsNotDefault;
+
+ property OutgoingParamsParameter: string read fOutgoingParamsParameter write SetOutgoingParamsParameter stored IsNotDefault;
+ property OutgoingIncludeSchemaParameter: string read fOutgoingIncludeSchemaParameter write SetOutgoingIncludeSchemaParameter stored IsNotDefault;
+ property OutgoingMaxRecordsParameter: string read fOutgoingMaxRecordsParameter write SetOutgoingMaxRecordsParameter stored IsNotDefault;
+
+ end;
+
+ TDAUpdateDataRequest = class(TDARemoteDataAdapterRequest)
+ private
+ fOutgoingDeltaParameter: string;
+ fIncomingDeltaParameter: string;
+ procedure SetIncomingDeltaParameter(const Value: string);
+ procedure SetOutgoingDeltaParameter(const Value: string);
+ public
+ procedure Assign(Source: TPersistent); override;
+ procedure SetupDefaultRequestV3; override;
+ procedure SetupDefaultRequest; override;
+ published
+ property OutgoingDeltaParameter: string read fOutgoingDeltaParameter write SetOutgoingDeltaParameter stored IsNotDefault;
+ property IncomingDeltaParameter: string read fIncomingDeltaParameter write SetIncomingDeltaParameter stored IsNotDefault;
+ end;
+
+ TDAGetScriptsRequest = class(TDARemoteDataAdapterRequest)
+ private
+ fIncomingScriptParameter: string;
+ fOutgoingTableNamesParameter: string;
+ procedure SetIncomingScriptParameter(const Value: string);
+ procedure SetOutgoingTableNamesParameter(const Value: string);
+ public
+ procedure Assign(Source: TPersistent); override;
+ procedure SetupDefaultRequestV3; override;
+ procedure SetupDefaultRequest; override;
+ published
+ property OutgoingTableNamesParameter: string read fOutgoingTableNamesParameter write SetOutgoingTableNamesParameter stored IsNotDefault;
+ property IncomingScriptParameter: string read fIncomingScriptParameter write SetIncomingScriptParameter stored IsNotDefault;
+ end;
+
+implementation
+
+uses
+ uRODL, uROClasses;
+
+{ TDARemoteDataAdapterRequest }
+
+procedure TDARemoteDataAdapterRequest.Assign(Source: TPersistent);
+var
+ lSource: TDARemoteDataAdapterRequest;
+begin
+ inherited;
+ if Source is TDARemoteDataAdapterRequest then begin
+ lSource := TDARemoteDataAdapterRequest(Source);
+
+ Default := lSource.Default;
+ end;
+end;
+
+constructor TDARemoteDataAdapterRequest.Create(aOwner: TComponent);
+begin
+ inherited;
+ SetSubComponent(true);
+ fDefault := true;
+end;
+
+function TDARemoteDataAdapterRequest.IsNotDefault: boolean;
+begin
+ result := not fDefault;
+end;
+
+procedure TDARemoteDataAdapterRequest.Loaded;
+begin
+ inherited;
+ if Default then
+ SetupDefaultRequest();
+end;
+
+procedure TDARemoteDataAdapterRequest.MethodNameChanged;
+begin
+ inherited;
+ Default := false;
+end;
+
+procedure TDARemoteDataAdapterRequest.SetDefault(const Value: boolean);
+begin
+ if fDefault <> Value then begin
+ fDefault := Value;
+ if fDefault then SetupDefaultRequest;
+ end;
+end;
+
+procedure TDARemoteDataAdapterRequest.SetupDefaultRequest;
+begin
+ fDefault := true;
+end;
+
+{ TDAGetSchemaRequest }
+
+procedure TDAGetSchemaRequest.Assign(Source: TPersistent);
+var
+ lSource: TDAGetSchemaRequest;
+begin
+ inherited;
+ if Source is TDAGetSchemaRequest then begin
+ lSource := TDAGetSchemaRequest(Source);
+
+ IncomingSchemaParameter := lSource.IncomingSchemaParameter;
+ OutgoingFilterParameter := lSource.OutgoingFilterParameter;
+ end;
+end;
+
+procedure TDAGetSchemaRequest.SetIncomingSchemaParameter(const Value: string);
+begin
+ fIncomingSchemaParameter := Value;
+ Default := false;
+end;
+
+procedure TDAGetSchemaRequest.SetOutgoingFilterParameter(const Value: string);
+begin
+ fOutgoingFilterParameter := Value;
+ Default := false;
+end;
+
+procedure TDAGetSchemaRequest.SetupDefaultRequest;
+begin
+ Params.Clear();
+ OutgoingFilterParameter := Params.Add('aFilter', rtUTF8String, fIn).Name;
+ IncomingSchemaParameter := Params.Add('Result', rtUTF8String, fResult).Name;
+ MethodName := 'GetSchema';
+ inherited;
+end;
+
+procedure TDAGetSchemaRequest.SetupDefaultRequestV3;
+begin
+ Params.Clear();
+ OutgoingFilterParameter := '';
+ IncomingSchemaParameter := Params.Add('Result', rtString, fResult).Name;
+ MethodName := 'GetSchemaAsXML';
+ Default := false;
+end;
+
+{ TDAGetDataRequest }
+
+procedure TDAGetDataRequest.Assign(Source: TPersistent);
+var
+ lSource: TDAGetDataRequest;
+begin
+ inherited;
+ if Source is TDAGetDataRequest then begin
+ lSource := TDAGetDataRequest(Source);
+
+ IncomingDataParameter := lSource.IncomingDataParameter;
+ OutgoingIncludeSchemaParameter := lSource.OutgoingIncludeSchemaParameter;
+ OutgoingMaxRecordsParameter := lSource.OutgoingMaxRecordsParameter;
+ OutgoingParamsParameter := lSource.OutgoingParamsParameter;
+ OutgoingTableNamesParameter := lSource.OutgoingTableNamesParameter;
+ OutgoingTableRequestInfosParameter := lSource.OutgoingTableRequestInfosParameter;
+ end;
+end;
+
+procedure TDAGetDataRequest.SetIncomingDataParameter(const Value: string);
+begin
+ fIncomingDataParameter := Value;
+ Default := false;
+end;
+
+procedure TDAGetDataRequest.SetOutgoingIncludeSchemaParameter(const Value: string);
+begin
+ fOutgoingIncludeSchemaParameter := Value;
+ Default := false;
+end;
+
+procedure TDAGetDataRequest.SetOutgoingMaxRecordsParameter(const Value: string);
+begin
+ fOutgoingMaxRecordsParameter := Value;
+ Default := false;
+end;
+
+procedure TDAGetDataRequest.SetOutgoingParamsParameter(const Value: string);
+begin
+ fOutgoingParamsParameter := Value;
+ Default := false;
+end;
+
+procedure TDAGetDataRequest.SetOutgoingTableNamesParameter(const Value: string);
+begin
+ fOutgoingTableNamesParameter := Value;
+ Default := false;
+end;
+
+procedure TDAGetDataRequest.SetOutgoingTableRequestInfosParameter(const Value: string);
+begin
+ fOutgoingTableRequestInfosParameter := Value;
+ Default := false;
+end;
+
+procedure TDAGetDataRequest.SetupDefaultRequest;
+begin
+ Params.Clear();
+ OutgoingTableNamesParameter := Params.Add('aTableNameArray', rtUserDefined, fIn, 'StringArray').Name;
+ OutgoingTableRequestInfosParameter := Params.Add('aTableRequestInfoArray', rtUserDefined, fIn, 'TableRequestInfoArray').Name;
+ OutgoingParamsParameter := '';
+ OutgoingIncludeSchemaParameter := '';
+ OutgoingMaxRecordsParameter := '';
+ IncomingDataParameter := Params.Add('Result', rtBinary, fResult).Name;
+ MethodName := 'GetData';
+ inherited;
+end;
+
+procedure TDAGetDataRequest.SetupDefaultRequestV3;
+begin
+ Params.Clear();
+ OutgoingTableNamesParameter := Params.Add('DatasetName', rtString, fIn).Name;
+ OutgoingParamsParameter := Params.Add('Params', rtString, fIn).Name;
+ OutgoingIncludeSchemaParameter := Params.Add('IncludeSchema', rtBoolean, fIn).Name;
+ OutgoingMaxRecordsParameter := Params.Add('MaxRecords', rtInteger, fIn).Name;
+ IncomingDataParameter := Params.Add('Result', rtBinary, fResult).Name;
+ MethodName := 'GetDatasetData';
+ Default := false;
+end;
+
+{ TDAUpdateDataRequest }
+
+procedure TDAUpdateDataRequest.Assign(Source: TPersistent);
+var
+ lSource: TDAUpdateDataRequest;
+begin
+ inherited;
+ if Source is TDAUpdateDataRequest then begin
+ lSource := TDAUpdateDataRequest(Source);
+
+ IncomingDeltaParameter := lSource.IncomingDeltaParameter;
+ OutgoingDeltaParameter := lSource.OutgoingDeltaParameter;
+ end;
+end;
+
+procedure TDAUpdateDataRequest.SetIncomingDeltaParameter(const Value: string);
+begin
+ fIncomingDeltaParameter := Value;
+ Default := false;
+end;
+
+procedure TDAUpdateDataRequest.SetOutgoingDeltaParameter(const Value: string);
+begin
+ fOutgoingDeltaParameter := Value;
+ Default := false;
+end;
+
+procedure TDAUpdateDataRequest.SetupDefaultRequest;
+begin
+ Params.Clear();
+ OutgoingDeltaParameter := Params.Add('aDelta', rtBinary, fIn).Name;
+ IncomingDeltaParameter := Params.Add('Result', rtBinary, fResult).Name;
+ MethodName := 'UpdateData';
+ inherited;
+end;
+
+procedure TDAUpdateDataRequest.SetupDefaultRequestV3;
+begin
+ Params.Clear();
+ OutgoingDeltaParameter := Params.Add('Delta', rtBinary, fIn).Name;
+ IncomingDeltaParameter := Params.Add('Result', rtBinary, fResult).Name;
+ MethodName := 'UpdateData';
+ Default := false;
+end;
+
+{ TDAGetScriptsRequest }
+
+procedure TDAGetScriptsRequest.Assign(Source: TPersistent);
+var
+ lSource: TDAGetScriptsRequest;
+begin
+ inherited;
+ if Source is TDAGetScriptsRequest then begin
+ lSource := TDAGetScriptsRequest(Source);
+
+ IncomingScriptParameter := lSource.IncomingScriptParameter;
+ OutgoingTableNamesParameter := lSource.OutgoingTableNamesParameter;
+ end;
+end;
+
+procedure TDAGetScriptsRequest.SetIncomingScriptParameter(const Value: string);
+begin
+ fIncomingScriptParameter := Value;
+ Default := false;
+end;
+
+procedure TDAGetScriptsRequest.SetOutgoingTableNamesParameter(const Value: string);
+begin
+ fOutgoingTableNamesParameter := Value;
+ Default := false;
+end;
+
+procedure TDAGetScriptsRequest.SetupDefaultRequest;
+begin
+ Params.Clear();
+ OutgoingTableNamesParameter := Params.Add('DatasetNames', rtUTF8String, fIn).Name;
+ IncomingScriptParameter := Params.Add('Result', rtUTF8String, fResult).Name;
+ MethodName := 'GetDatasetScripts';
+ inherited;
+end;
+
+procedure TDAGetScriptsRequest.SetupDefaultRequestV3;
+begin
+ Params.Clear();
+ OutgoingTableNamesParameter := Params.Add('DatasetNames', rtString, fIn).Name;
+ IncomingScriptParameter := Params.Add('Result', rtString, fResult).Name;
+ MethodName := 'GetDatasetScripts';
+ Default := false;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARes.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARes.pas
new file mode 100644
index 0000000..18a745f
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDARes.pas
@@ -0,0 +1,99 @@
+unit uDARes;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+//uses uDAInterfaces;
+
+resourcestring
+ err_ChangeLogAlreadyStarted = 'StartChange has already been called; cannot log more than one change at a time.';
+ err_NotAttachedToDataTable = 'Delta is not attached to a DataTable';
+ err_DeltaAttachedToDataTable = 'Cannot perform this operation on a delta that is attached to a DataTable';
+ err_DriverProcAlreadyRegistered = 'DriverProc 0x%0.8x is already registered';
+ err_DriverManagerNotCreated = 'A Data Abstract DriverManager is not currently instantiated';
+ err_DriverManagerAlreadyCreated = 'An instance of a TDADriverManager was already initialized. Only one driver manager per module is allowed';
+ err_DatasetNotAssigned = 'Dataset is not assigned';
+ err_VariantNotSupported = 'Variant type %d is not supported';
+ err_InvalidDestination = 'Invalid destination';
+ err_DriverManagerNotAssigned = 'Driver Manager is not assigned';
+ err_ConnectionManagerNotAssigned = 'Connection Manager is not assigned';
+ err_FieldTypeNotSupported = 'FieldType %s (%d) is not supported';
+ err_NotSupported = 'Not supported';
+ err_DataTypeNotSupportedByRemoteRequest = 'DataType is not supported by RemoteRequest';
+ err_InvalidDataset = 'Invalid or NIL dataset';
+ err_CannotMakeNILDefault = 'Cannot set NIL';
+ err_DifferentOwnerCollection = 'The connection definition is not owned by this collection';
+ err_CannotFindItem = 'Cannot find %s "%s" in collection of type %s';
+ err_InvalidCollectionType = 'Invalid collection type';
+ err_InvalidOwner = 'Invalid owner';
+ err_DriverAlreadyLoaded = 'Driver %s is already loaded';
+ err_DriverIsNotLoaded = 'Driver %s was not loaded';
+ err_InvalidDLL = '%s is not a valid Data Abstract driver';
+ err_UnknownDriver = 'Unknown driver %s';
+ err_UnknownParameter = 'Unknown parameter %s';
+ err_FieldIsNotBound = 'Field is not bound';
+ err_CannotFindField = 'Cannot find field %s';
+ err_LoadPackageFailed = 'LoadPackage failed for file %s';
+ err_InvalidDriverReference = 'The driver in %s could not be loaded';
+ err_CannotFindStatement = 'Cannot find statement %s for connection %s';
+ err_CannotFindDefaultItem = 'Cannot find default %s';
+ err_PoolIsNotEmpty = 'Cannot perform this operation when connections are pooled';
+ err_MaxPoolSizeReached = 'Maximum pool size reached. Cannot create a new connection';
+ err_CannotAccessThisProperty = 'Cannot access this property with the current DataType value';
+ err_LAMEDataset = '%s does not implement IProviderSupport or implements it incorrectly';
+ err_HETConnectionNotSupportedInV3 = 'HET Connections are not supported by te legacy v3 DARemoteService';
+ err_DARDMInvalidSchema = 'Schema must be assigned and must point to a ConnectionManager';
+ err_DARDMMissingConnectionName = 'Cannot acquire a connection without a ConnectionName or a OnBeforeAcquireConnection event handler';
+ err_DARDMUnassignedAdapter = 'DataAdapter is not assigned';
+ err_DARDMConnectionIsNotAssigned = 'Connection is not assigned';
+ err_DARDMCannotFindProxessorForDelta = 'Cannot find a business processor for delta "%s"';
+
+ err_NeedShareMem = 'To use dynamically loaded drivers, you must build your application with ShareMem.';
+
+ err_ExecuteSQLCommandNotAllowed = 'ExecuteSQLCommand is not enabled for this server.';
+
+ err_DatasetNotAccessible = 'Access to dataset %s has not been permitted.';
+ err_CommandNotAccessible = 'executon of command %s has not been permitted.';
+ err_SQLNotPermitted = 'Execution of the specified SQL statement has not been permitted.';
+ err_UTF8DecodeError = 'Can''t decode UTF8 string: "%s"';
+
+const
+ // Connection strings
+ ds_Separator = '?';
+ ds_Database = 'Database';
+ ds_UserID = 'UserID';
+ ds_Password = 'Password';
+ ds_Server = 'Server';
+ ds_AuxDriver = 'AuxDriver';
+
+ // IDE
+ DAPalettePageName = 'RemObjects Data Abstract';
+
+ // Driver access
+ DAFileExtDriver = '.dad';
+ drv_AllDrivers = 'DA*Drv' + DAFileExtDriver; // Driver names are in the format DAxxxxDrv.dad
+
+ // Schema Modeler related
+ DAFileExtSchemaFile = '.daSchema';
+ DAFileExtConnectionMgrFile = '.daConnections';
+ DAFileExtDataDictionaryFile = '.daDictionary';
+ DAFileExtDiagramsFile = '.daDiagrams';
+ DAFileExtConfigFile = '.daConfig';
+
+implementation
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASQL92Interfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASQL92Interfaces.pas
new file mode 100644
index 0000000..80ca567
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASQL92Interfaces.pas
@@ -0,0 +1,269 @@
+unit uDASQL92Interfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Driver Library }
+{ }
+{ compiler: Delphi 6 and up }
+{ platform: Win32 }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+function SQL92_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+
+implementation
+uses
+ SysUtils, uDAEngine;
+
+var
+ sql92_reservedwords : array of string;
+
+function SQL92_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+begin
+ Result := (pos('.', iIdentifier) > 0) or TestIdentifier(iIdentifier,sql92_reservedwords);
+end;
+
+procedure SQL92_InitializeReservedWords;
+begin
+ SetLength(sql92_reservedwords, 225);
+ // sorted with TStringList.Sort (bds2007)
+ sql92_reservedwords[0] := 'ABSOLUTE';
+ sql92_reservedwords[1] := 'ACTION';
+ sql92_reservedwords[2] := 'ADD';
+ sql92_reservedwords[3] := 'ALL';
+ sql92_reservedwords[4] := 'ALLOCATE';
+ sql92_reservedwords[5] := 'ALTER';
+ sql92_reservedwords[6] := 'AND';
+ sql92_reservedwords[7] := 'ANY';
+ sql92_reservedwords[8] := 'ARE';
+ sql92_reservedwords[9] := 'AS';
+ sql92_reservedwords[10] := 'ASC';
+ sql92_reservedwords[11] := 'ASSERTION';
+ sql92_reservedwords[12] := 'AT';
+ sql92_reservedwords[13] := 'AUTHORIZATION';
+ sql92_reservedwords[14] := 'AVG';
+ sql92_reservedwords[15] := 'BEGIN';
+ sql92_reservedwords[16] := 'BETWEEN';
+ sql92_reservedwords[17] := 'BIT';
+ sql92_reservedwords[18] := 'BIT_LENGTH';
+ sql92_reservedwords[19] := 'BOTH';
+ sql92_reservedwords[20] := 'BY';
+ sql92_reservedwords[21] := 'CASCADE';
+ sql92_reservedwords[22] := 'CASCADED';
+ sql92_reservedwords[23] := 'CASE';
+ sql92_reservedwords[24] := 'CAST';
+ sql92_reservedwords[25] := 'CATALOG';
+ sql92_reservedwords[26] := 'CHAR';
+ sql92_reservedwords[27] := 'CHAR_LENGTH';
+ sql92_reservedwords[28] := 'CHARACTER';
+ sql92_reservedwords[29] := 'CHARACTER_LENGTH';
+ sql92_reservedwords[30] := 'CHECK';
+ sql92_reservedwords[31] := 'CLOSE';
+ sql92_reservedwords[32] := 'COALESCE';
+ sql92_reservedwords[33] := 'COLLATE';
+ sql92_reservedwords[34] := 'COLLATION';
+ sql92_reservedwords[35] := 'COLUMN';
+ sql92_reservedwords[36] := 'COMMIT';
+ sql92_reservedwords[37] := 'CONNECT';
+ sql92_reservedwords[38] := 'CONNECTION';
+ sql92_reservedwords[39] := 'CONSTRAINT';
+ sql92_reservedwords[40] := 'CONSTRAINTS';
+ sql92_reservedwords[41] := 'CONTINUE';
+ sql92_reservedwords[42] := 'CONVERT';
+ sql92_reservedwords[43] := 'CORRESPONDING';
+ sql92_reservedwords[44] := 'COUNT';
+ sql92_reservedwords[45] := 'CREATE';
+ sql92_reservedwords[46] := 'CROSS';
+ sql92_reservedwords[47] := 'CURRENT';
+ sql92_reservedwords[48] := 'CURRENT_DATE';
+ sql92_reservedwords[49] := 'CURRENT_TIME';
+ sql92_reservedwords[50] := 'CURRENT_TIMESTAMP';
+ sql92_reservedwords[51] := 'CURRENT_USER';
+ sql92_reservedwords[52] := 'DATE';
+ sql92_reservedwords[53] := 'DAY';
+ sql92_reservedwords[54] := 'DEALLOCATE';
+ sql92_reservedwords[55] := 'DEC';
+ sql92_reservedwords[56] := 'DECIMAL';
+ sql92_reservedwords[57] := 'DECLARE';
+ sql92_reservedwords[58] := 'DEFAULT';
+ sql92_reservedwords[59] := 'DEFERRABLE';
+ sql92_reservedwords[60] := 'DEFERRED';
+ sql92_reservedwords[61] := 'DELETE';
+ sql92_reservedwords[62] := 'DESC';
+ sql92_reservedwords[63] := 'DESCRIBE';
+ sql92_reservedwords[64] := 'DESCRIPTOR';
+ sql92_reservedwords[65] := 'DIAGNOSTICS';
+ sql92_reservedwords[66] := 'DISCONNECT';
+ sql92_reservedwords[67] := 'DISTINCT';
+ sql92_reservedwords[68] := 'DOMAIN';
+ sql92_reservedwords[69] := 'DOUBLE';
+ sql92_reservedwords[70] := 'DROP';
+ sql92_reservedwords[71] := 'ELSE';
+ sql92_reservedwords[72] := 'END';
+ sql92_reservedwords[73] := 'END-EXEC';
+ sql92_reservedwords[74] := 'ESCAPE';
+ sql92_reservedwords[75] := 'EXCEPT';
+ sql92_reservedwords[76] := 'EXCEPTION';
+ sql92_reservedwords[77] := 'EXEC';
+ sql92_reservedwords[78] := 'EXECUTE';
+ sql92_reservedwords[79] := 'EXISTS';
+ sql92_reservedwords[80] := 'EXTERNAL';
+ sql92_reservedwords[81] := 'EXTRACT';
+ sql92_reservedwords[82] := 'FALSE';
+ sql92_reservedwords[83] := 'FETCH';
+ sql92_reservedwords[84] := 'FLOAT';
+ sql92_reservedwords[85] := 'FOR';
+ sql92_reservedwords[86] := 'FOREIGN';
+ sql92_reservedwords[87] := 'FOUND';
+ sql92_reservedwords[88] := 'FROM';
+ sql92_reservedwords[89] := 'FULL';
+ sql92_reservedwords[90] := 'GET';
+ sql92_reservedwords[91] := 'GLOBAL';
+ sql92_reservedwords[92] := 'GO';
+ sql92_reservedwords[93] := 'GOTO';
+ sql92_reservedwords[94] := 'GRANT';
+ sql92_reservedwords[95] := 'GROUP';
+ sql92_reservedwords[96] := 'HAVING';
+ sql92_reservedwords[97] := 'HOUR';
+ sql92_reservedwords[98] := 'IDENTITY';
+ sql92_reservedwords[99] := 'IMMEDIATE';
+ sql92_reservedwords[100] := 'IN';
+ sql92_reservedwords[101] := 'INDICATOR';
+ sql92_reservedwords[102] := 'INITIALLY';
+ sql92_reservedwords[103] := 'INNER';
+ sql92_reservedwords[104] := 'INPUT';
+ sql92_reservedwords[105] := 'INSENSITIVE';
+ sql92_reservedwords[106] := 'INSERT';
+ sql92_reservedwords[107] := 'INT';
+ sql92_reservedwords[108] := 'INTEGER';
+ sql92_reservedwords[109] := 'INTERSECT';
+ sql92_reservedwords[110] := 'INTERVAL';
+ sql92_reservedwords[111] := 'INTO';
+ sql92_reservedwords[112] := 'IS';
+ sql92_reservedwords[113] := 'ISOLATION';
+ sql92_reservedwords[114] := 'JOIN';
+ sql92_reservedwords[115] := 'KEY';
+ sql92_reservedwords[116] := 'LANGUAGE';
+ sql92_reservedwords[117] := 'LAST';
+ sql92_reservedwords[118] := 'LEADING';
+ sql92_reservedwords[119] := 'LEFT';
+ sql92_reservedwords[120] := 'LEVEL';
+ sql92_reservedwords[121] := 'LIKE';
+ sql92_reservedwords[122] := 'LOCAL';
+ sql92_reservedwords[123] := 'LOWER';
+ sql92_reservedwords[124] := 'MATCH';
+ sql92_reservedwords[125] := 'MAX';
+ sql92_reservedwords[126] := 'MIN';
+ sql92_reservedwords[127] := 'MINUTE';
+ sql92_reservedwords[128] := 'MODULE';
+ sql92_reservedwords[129] := 'MONTH';
+ sql92_reservedwords[130] := 'NAMES';
+ sql92_reservedwords[131] := 'NATIONAL';
+ sql92_reservedwords[132] := 'NATURAL';
+ sql92_reservedwords[133] := 'NCHAR';
+ sql92_reservedwords[134] := 'NEXT';
+ sql92_reservedwords[135] := 'NO';
+ sql92_reservedwords[136] := 'NOT';
+ sql92_reservedwords[137] := 'NULL';
+ sql92_reservedwords[138] := 'NULLIF';
+ sql92_reservedwords[139] := 'NUMERIC';
+ sql92_reservedwords[140] := 'OCTET_LENGTH';
+ sql92_reservedwords[141] := 'OF';
+ sql92_reservedwords[142] := 'ON';
+ sql92_reservedwords[143] := 'ONLY';
+ sql92_reservedwords[144] := 'OPEN';
+ sql92_reservedwords[145] := 'OPTION';
+ sql92_reservedwords[146] := 'OR';
+ sql92_reservedwords[147] := 'ORDER';
+ sql92_reservedwords[148] := 'OUTER';
+ sql92_reservedwords[149] := 'OUTPUT';
+ sql92_reservedwords[150] := 'OVERLAPS';
+ sql92_reservedwords[151] := 'PAD';
+ sql92_reservedwords[152] := 'PARTIAL';
+ sql92_reservedwords[153] := 'POSITION';
+ sql92_reservedwords[154] := 'PRECISION';
+ sql92_reservedwords[155] := 'PREPARE';
+ sql92_reservedwords[156] := 'PRESERVE';
+ sql92_reservedwords[157] := 'PRIMARY';
+ sql92_reservedwords[158] := 'PRIOR';
+ sql92_reservedwords[159] := 'PRIVILEGES';
+ sql92_reservedwords[160] := 'PROCEDURE';
+ sql92_reservedwords[161] := 'PUBLIC';
+ sql92_reservedwords[162] := 'READ';
+ sql92_reservedwords[163] := 'REAL';
+ sql92_reservedwords[164] := 'REFERENCES';
+ sql92_reservedwords[165] := 'RELATIVE';
+ sql92_reservedwords[166] := 'RESTRICT';
+ sql92_reservedwords[167] := 'REVOKE';
+ sql92_reservedwords[168] := 'RIGHT';
+ sql92_reservedwords[169] := 'ROLLBACK';
+ sql92_reservedwords[170] := 'ROWS';
+ sql92_reservedwords[171] := 'SCHEMA';
+ sql92_reservedwords[172] := 'SCROLL';
+ sql92_reservedwords[173] := 'SECTION';
+ sql92_reservedwords[174] := 'SELECT';
+ sql92_reservedwords[175] := 'SESSION';
+ sql92_reservedwords[176] := 'SESSION_USER';
+ sql92_reservedwords[177] := 'SET';
+ sql92_reservedwords[178] := 'SIZE';
+ sql92_reservedwords[179] := 'SMALLINT';
+ sql92_reservedwords[180] := 'SOME';
+ sql92_reservedwords[181] := 'SPACE';
+ sql92_reservedwords[182] := 'SQL';
+ sql92_reservedwords[183] := 'SQLCODE';
+ sql92_reservedwords[184] := 'SQLERROR';
+ sql92_reservedwords[185] := 'SQLSTATE';
+ sql92_reservedwords[186] := 'SQLWARNING';
+ sql92_reservedwords[187] := 'SUBSTRING';
+ sql92_reservedwords[188] := 'SUM';
+ sql92_reservedwords[189] := 'SYSTEM_USER';
+ sql92_reservedwords[190] := 'TABLE';
+ sql92_reservedwords[191] := 'TEMPORARY';
+ sql92_reservedwords[192] := 'THEN';
+ sql92_reservedwords[193] := 'TIME';
+ sql92_reservedwords[194] := 'TIMESTAMP';
+ sql92_reservedwords[195] := 'TIMEZONE_HOUR';
+ sql92_reservedwords[196] := 'TIMEZONE_MINUTE';
+ sql92_reservedwords[197] := 'TO';
+ sql92_reservedwords[198] := 'TRAILING';
+ sql92_reservedwords[199] := 'TRANSACTION';
+ sql92_reservedwords[200] := 'TRANSLATE';
+ sql92_reservedwords[201] := 'TRANSLATION';
+ sql92_reservedwords[202] := 'TRIM';
+ sql92_reservedwords[203] := 'TRUE';
+ sql92_reservedwords[204] := 'UNION';
+ sql92_reservedwords[205] := 'UNIQUE';
+ sql92_reservedwords[206] := 'UNKNOWN';
+ sql92_reservedwords[207] := 'UPDATE';
+ sql92_reservedwords[208] := 'UPPER';
+ sql92_reservedwords[209] := 'USAGE';
+ sql92_reservedwords[210] := 'USER';
+ sql92_reservedwords[211] := 'USING';
+ sql92_reservedwords[212] := 'VALUE';
+ sql92_reservedwords[213] := 'VALUES';
+ sql92_reservedwords[214] := 'VARCHAR';
+ sql92_reservedwords[215] := 'VARYING';
+ sql92_reservedwords[216] := 'VIEW';
+ sql92_reservedwords[217] := 'WHEN';
+ sql92_reservedwords[218] := 'WHENEVER';
+ sql92_reservedwords[219] := 'WHERE';
+ sql92_reservedwords[220] := 'WITH';
+ sql92_reservedwords[221] := 'WORK';
+ sql92_reservedwords[222] := 'WRITE';
+ sql92_reservedwords[223] := 'YEAR';
+ sql92_reservedwords[224] := 'ZONE';
+end;
+
+initialization
+ sql92_InitializeReservedWords;
+finalization
+ sql92_reservedwords := nil;
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASQL92QueryBuilder.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASQL92QueryBuilder.pas
new file mode 100644
index 0000000..8f290e7
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASQL92QueryBuilder.pas
@@ -0,0 +1,181 @@
+unit uDASQL92QueryBuilder;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes,
+ uDAInterfaces,
+ uDAWhere;
+
+type
+ TDASQL92WhereBuilder = class(TDASQLWhereBuilder)
+ protected
+ function ProcessBinaryExpression(AExpression: TDAWhereExpression): string; override;
+ function ProcessUnaryExpression(AExpression: TDAWhereExpression): string; override;
+ function ProcessNullExpression(AExpression: TDAWhereExpression): string; override;
+ end;
+
+ TDASQL92QueryBuilder = class(TDAQueryBuilder)
+ protected
+ function CreateWhereBuilder: TDASQLWhereBuilder; override;
+ function CreateTableClause: string; override;
+ function IdentifierNeedsQuoting(const iIdentifier: string):boolean;override;
+ function QuoteStringId(aValue: string): string;
+ end;
+
+implementation
+uses
+ SysUtils, uROXMLIntf, uDASQL92Interfaces;
+
+const
+ c_Indent = ' ';
+
+ { TDASQL92QueryBuilder }
+
+function TDASQL92QueryBuilder.CreateTableClause: string;
+var
+ i, j: integer;
+ s: string;
+begin
+ Result := QuoteIdentifierIfNeeded(MainTable.MasterTable);
+ for i := 0 to MainTable.JoinSourceTables.Count - 1 do
+ with TDAJoinSourceTable(MainTable.JoinSourceTables.Items[i]) do begin
+ if (JoinConditions.Count = 0) or (JoinType = jtCross) then
+ Result := Result + ',' + QuoteIdentifierIfNeeded(Name)
+ else begin
+ case JoinType of
+ jtInner: s := 'INNER';
+ jtLeftOuter: s := 'LEFT OUTER';
+ jtRightOuter: s := 'RIGHT OUTER';
+ jtFullOuter: s := 'FULL OUTER';
+ end;
+ Result := Result + #13#10 + c_Indent + Format('%s JOIN %s ON (', [s, QuoteIdentifierIfNeeded(Name)]);
+ for j := 0 to JoinConditions.Count - 1 do begin
+ if J > 0 then Result := Result + ' and ';
+ with TDAJoinCondition(JoinConditions.Items[j]) do begin
+ Result := Result + Format('(%s = %s)', [
+ GenerateFieldName(FromTableName, FromFieldName),
+ GenerateFieldName(ToTableName, ToFieldName)]);
+ end;
+ Result := Result + ')';
+ end;
+ end;
+ end;
+end;
+
+function TDASQL92QueryBuilder.CreateWhereBuilder: TDASQLWhereBuilder;
+begin
+ Result := TDASQL92WhereBuilder.Create(Self);
+end;
+
+function TDASQL92QueryBuilder.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result:= inherited IdentifierNeedsQuoting(iIdentifier) or SQL92_IdentifierNeedsQuoting(iIdentifier);
+end;
+
+function TDASQL92QueryBuilder.QuoteStringId(aValue: string): string;
+begin
+ Result:= AnsiQuotedStr(aValue,'''');
+end;
+
+{ TDASQL92WhereBuilder }
+
+function TDASQL92WhereBuilder.ProcessBinaryExpression(
+ AExpression: TDAWhereExpression): string;
+const
+ TDABinaryOperatorStr: array[TDABinaryOperator] of string =
+ ('AND', 'OR', '' {dboXor}, '<', '<=', '>', '>=', '<>', '=', 'LIKE', '' {dboIn}, '+', '-', '*', '/', '' {dboNotIn});
+
+ function ExpressionisNull(aExpr: TDAWhereExpression): boolean;
+ begin
+ result := (AExpr is TDANullExpression);
+ end;
+
+ function ExpressionisNotNull(aExpr: TDAWhereExpression): boolean;
+ begin
+ result :=
+ ((AExpr is TDAUnaryExpression) and
+ (TDAUnaryExpression(AExpr).Operator = duoNot) and
+ (TDAUnaryExpression(AExpr).Expression is TDANullExpression));
+ end;
+
+var
+ lLeft, lRight: string;
+ lLeftisNull, lRightisNull: boolean;
+ s,s1,s2: string;
+ s_Null: string;
+begin
+ Result := '';
+ With TDABinaryExpression(AExpression) do begin
+ lLeft := ProcessExpression(Left);
+ lRight := ProcessExpression(Right);
+ lRightisNull := ExpressionisNull(Right) or ExpressionisNotNull(Right);
+ lLeftisNull := ExpressionisNull(Left) or ExpressionisNotNull(Left);
+
+ if Operator = dboXor then
+ // A xor B = (A and not B) or (not A and B)
+ result := Format('((%s AND NOT %s) OR' + #13#10 + '(NOT %0:s AND %1:s))', [lLeft, lRight])
+ else if lRightisNull or lLeftisNull then begin
+ s_Null:= ProcessNullExpression(nil);
+ if lRightisNull then s2:= '%0:s' else s2:='%1:s';
+ if (lRightisNull and ExpressionisNotNull(Right)) or (lLeftisNull and ExpressionisNotNull(Left)) then begin
+ s := '('+s2+' IS NOT '+s_Null+')';
+ s1 := '('+s2+' IS '+s_Null+')';
+ end
+ else begin
+ s := '('+s2+' IS '+s_Null+')';
+ s1 := '('+s2+' IS NOT '+s_Null+')';
+ end;
+ if Operator in [dboNotEqual,dboLess,dboGreater] then
+ Result := Format(s1, [lLeft, lRight])
+ else
+ Result := Format(s, [lLeft, lRight]);
+ end
+ else case Operator of
+ dboIn: result := Format('(%s IN (%s))', [lLeft, lRight]);
+ dboNotIn: result := Format('(%s NOT IN (%s))', [lLeft, lRight]);
+ else
+ result := Format('(%s %s %s)', [lLeft, TDABinaryOperatorStr[Operator], lRight]);
+ end;
+ end;
+end;
+
+function TDASQL92WhereBuilder.ProcessNullExpression(
+ AExpression: TDAWhereExpression): string;
+begin
+ Result := 'NULL';
+end;
+
+function TDASQL92WhereBuilder.ProcessUnaryExpression(
+ AExpression: TDAWhereExpression): string;
+var
+ lExpr: string;
+begin
+ with TDAUnaryExpression(AExpression) do begin
+ lExpr := ProcessExpression(Expression);
+ case Operator of
+ duoNot: Result := 'NOT ' + lExpr;
+ duoMinus: Result := '-' + lExpr;
+ else
+ Result := '';
+ end;
+ end;
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASQLiteInterfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASQLiteInterfaces.pas
new file mode 100644
index 0000000..1e62831
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASQLiteInterfaces.pas
@@ -0,0 +1,283 @@
+unit uDASQLiteInterfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ uDAInterfaces, uDAEngine, uROClasses;
+
+type
+ { IDASQLiteConnection
+ For identification purposes Implemented by all SQLite connections }
+ IDASQLiteConnection = interface(IDAConnection)
+ ['{C6249278-7BBB-4E4F-849B-A9AA7C9ACD66}']
+ end;
+
+ TDASQLiteDriver = class(TDAEDriver)
+ protected
+ function GetDefaultConnectionType(const AuxDriver: string): string; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ function GetAvailableDriverOptions: TDAAvailableDriverOptions; override;{$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ // IDADriver40
+ function GetProviderDefaultCustomParameters(Provider: string): string; safecall;
+ end;
+
+ TDASQLiteConnection = class(TDAEConnection, IDAFileBasedDatabase, IDASQLiteConnection)
+ protected
+ procedure DoGetTableNames(out List: IROStrings); override;
+ procedure DoGetStoredProcedureNames(out List: IROStrings); override;
+ procedure DoGetViewNames(out List: IROStrings); override;
+ function IdentifierNeedsQuoting(const iIdentifier: string): boolean; override; {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ procedure GetForeignKeys(out ForeignKeys: TDADriverForeignKeyCollection); {$IFNDEF FPC_SAFECALL_BUG}safecall;{$ENDIF}
+ //IDAFileBasedDatabase
+ function GetFileExtensions: IROStrings;
+ public
+ end;
+
+
+function SQLite_GetFileExtensions: IROStrings;
+procedure SQLite_GetObjectNames(Query: IDADataset;AList: IROStrings; AObjectType: TDAObjecttype);
+function SQLite_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+Procedure SQLite_DoGetForeignKeys(Query: IDADataset;ForeignKeys: TDADriverForeignKeyCollection);
+
+const
+ SQLite_DriverType = 'SQLite';
+
+implementation
+uses
+ SysUtils;
+
+var
+ sqlite_reservedwords : array of string;
+
+function SQLite_GetFileExtensions: IROStrings;
+begin
+ Result := TROStrings.Create;
+ result.Add('*.SQB;*.DB3;*.DB;*.DBB;SQLite Database (*.sqb,*.db3,*.db,*.dbb)');
+ result.Add('*.*;All files (*.*)');
+end;
+
+procedure SQLite_GetObjectNames(Query: IDADataset;AList: IROStrings; AObjectType: TDAObjecttype);
+begin
+ try
+ case AObjectType of
+ dotTable: Query.SQL := 'SELECT name FROM sqlite_master WHERE type="table" ORDER BY name';
+ dotView: Query.SQL := 'SELECT name FROM sqlite_master WHERE type="view" ORDER BY name';
+ dotProcedure: Exit;
+ else
+ end;
+ Query.Open;
+ while not Query.EOF do begin
+ AList.Add(Trim(Query.Fields[0].AsString));
+ Query.Next;
+ end;
+ finally
+ Query:=nil;
+ end;
+end;
+
+function SQLite_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+begin
+ result := TestIdentifier(iIdentifier, sqlite_reservedwords);
+end;
+
+procedure SQLite_DoGetForeignKeys(Query: IDADataset;ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ ForeignKeys.Clear;
+ // SQLite isn't support FK yet
+end;
+{ TDASQLiteDriver }
+
+function TDASQLiteDriver.GetAvailableDriverOptions: TDAAvailableDriverOptions;
+begin
+ result := [doDatabaseName, doCustom];
+end;
+
+function TDASQLiteDriver.GetDefaultConnectionType(
+ const AuxDriver: string): string;
+begin
+ Result:= SQLite_DriverType;
+end;
+
+function TDASQLiteDriver.GetProviderDefaultCustomParameters(
+ Provider: string): string;
+begin
+ Result := '';
+end;
+
+{ TDASQLiteConnection }
+
+procedure TDASQLiteConnection.DoGetStoredProcedureNames(out List: IROStrings);
+begin
+ inherited;
+ SQLite_GetObjectNames(GetDatasetClass.Create(Self),List,dotProcedure);
+end;
+
+procedure TDASQLiteConnection.DoGetTableNames(out List: IROStrings);
+begin
+ inherited;
+ SQLite_GetObjectNames(GetDatasetClass.Create(Self),List,dotTable);
+end;
+
+procedure TDASQLiteConnection.DoGetViewNames(out List: IROStrings);
+begin
+ inherited;
+ SQLite_GetObjectNames(GetDatasetClass.Create(Self),List,dotView);
+end;
+
+function TDASQLiteConnection.GetFileExtensions: IROStrings;
+begin
+ Result:=SQLite_GetFileExtensions;
+end;
+
+procedure TDASQLiteConnection.GetForeignKeys(
+ out ForeignKeys: TDADriverForeignKeyCollection);
+begin
+ inherited;
+ SQLite_DoGetForeignKeys(GetDatasetClass.Create(Self),ForeignKeys);
+end;
+
+function TDASQLiteConnection.IdentifierNeedsQuoting(
+ const iIdentifier: string): boolean;
+begin
+ Result := inherited IdentifierNeedsQuoting(iIdentifier) or SQLite_IdentifierNeedsQuoting(iIdentifier);
+end;
+
+
+procedure sqlite_InitializeReservedWords;
+begin
+ SetLength(sqlite_reservedwords,113);
+ // sorted with TStringList.Sort (bds2007)
+ sqlite_reservedwords[0] := 'ABORT';
+ sqlite_reservedwords[1] := 'ADD';
+ sqlite_reservedwords[2] := 'AFTER';
+ sqlite_reservedwords[3] := 'ALL';
+ sqlite_reservedwords[4] := 'ALTER';
+ sqlite_reservedwords[5] := 'ANALYZE';
+ sqlite_reservedwords[6] := 'AND';
+ sqlite_reservedwords[7] := 'AS';
+ sqlite_reservedwords[8] := 'ASC';
+ sqlite_reservedwords[9] := 'ATTACH';
+ sqlite_reservedwords[10] := 'AUTOINCREMENT';
+ sqlite_reservedwords[11] := 'BEFORE';
+ sqlite_reservedwords[12] := 'BEGIN';
+ sqlite_reservedwords[13] := 'BETWEEN';
+ sqlite_reservedwords[14] := 'BY';
+ sqlite_reservedwords[15] := 'CASCADE';
+ sqlite_reservedwords[16] := 'CASE';
+ sqlite_reservedwords[17] := 'CAST';
+ sqlite_reservedwords[18] := 'CHECK';
+ sqlite_reservedwords[19] := 'COLLATE';
+ sqlite_reservedwords[20] := 'COMMIT';
+ sqlite_reservedwords[21] := 'CONFLICT';
+ sqlite_reservedwords[22] := 'CONSTRAINT';
+ sqlite_reservedwords[23] := 'CREATE';
+ sqlite_reservedwords[24] := 'CROSS';
+ sqlite_reservedwords[25] := 'CURRENT_DATE';
+ sqlite_reservedwords[26] := 'CURRENT_TIME';
+ sqlite_reservedwords[27] := 'CURRENT_TIMESTAMP';
+ sqlite_reservedwords[28] := 'DATABASE';
+ sqlite_reservedwords[29] := 'DEFAULT';
+ sqlite_reservedwords[30] := 'DEFERRABLE';
+ sqlite_reservedwords[31] := 'DEFERRED';
+ sqlite_reservedwords[32] := 'DELETE';
+ sqlite_reservedwords[33] := 'DESC';
+ sqlite_reservedwords[34] := 'DETACH';
+ sqlite_reservedwords[35] := 'DISTINCT';
+ sqlite_reservedwords[36] := 'DROP';
+ sqlite_reservedwords[37] := 'EACH';
+ sqlite_reservedwords[38] := 'ELSE';
+ sqlite_reservedwords[39] := 'END';
+ sqlite_reservedwords[40] := 'ESCAPE';
+ sqlite_reservedwords[41] := 'EXCEPT';
+ sqlite_reservedwords[42] := 'EXCLUSIVE';
+ sqlite_reservedwords[43] := 'EXPLAIN';
+ sqlite_reservedwords[44] := 'FAIL';
+ sqlite_reservedwords[45] := 'FOR';
+ sqlite_reservedwords[46] := 'FOREIGN';
+ sqlite_reservedwords[47] := 'FROM';
+ sqlite_reservedwords[48] := 'FULL';
+ sqlite_reservedwords[49] := 'GLOB';
+ sqlite_reservedwords[50] := 'GROUP';
+ sqlite_reservedwords[51] := 'HAVING';
+ sqlite_reservedwords[52] := 'IF';
+ sqlite_reservedwords[53] := 'IGNORE';
+ sqlite_reservedwords[54] := 'IMMEDIATE';
+ sqlite_reservedwords[55] := 'IN';
+ sqlite_reservedwords[56] := 'INDEX';
+ sqlite_reservedwords[57] := 'INITIALLY';
+ sqlite_reservedwords[58] := 'INNER';
+ sqlite_reservedwords[59] := 'INSERT';
+ sqlite_reservedwords[60] := 'INSTEAD';
+ sqlite_reservedwords[61] := 'INTERSECT';
+ sqlite_reservedwords[62] := 'INTO';
+ sqlite_reservedwords[63] := 'IS';
+ sqlite_reservedwords[64] := 'ISNULL';
+ sqlite_reservedwords[65] := 'JOIN';
+ sqlite_reservedwords[66] := 'KEY';
+ sqlite_reservedwords[67] := 'LEFT';
+ sqlite_reservedwords[68] := 'LIKE';
+ sqlite_reservedwords[69] := 'LIMIT';
+ sqlite_reservedwords[70] := 'MATCH';
+ sqlite_reservedwords[71] := 'NATURAL';
+ sqlite_reservedwords[72] := 'NOT';
+ sqlite_reservedwords[73] := 'NOTNULL';
+ sqlite_reservedwords[74] := 'NULL';
+ sqlite_reservedwords[75] := 'OF';
+ sqlite_reservedwords[76] := 'OFFSET';
+ sqlite_reservedwords[77] := 'ON';
+ sqlite_reservedwords[78] := 'OR';
+ sqlite_reservedwords[79] := 'ORDER';
+ sqlite_reservedwords[80] := 'OUTER';
+ sqlite_reservedwords[81] := 'PLAN';
+ sqlite_reservedwords[82] := 'PRAGMA';
+ sqlite_reservedwords[83] := 'PRIMARY';
+ sqlite_reservedwords[84] := 'QUERY';
+ sqlite_reservedwords[85] := 'RAISE';
+ sqlite_reservedwords[86] := 'REFERENCES';
+ sqlite_reservedwords[87] := 'REINDEX';
+ sqlite_reservedwords[88] := 'RENAME';
+ sqlite_reservedwords[89] := 'REPLACE';
+ sqlite_reservedwords[90] := 'RESTRICT';
+ sqlite_reservedwords[91] := 'RIGHT';
+ sqlite_reservedwords[92] := 'ROLLBACK';
+ sqlite_reservedwords[93] := 'ROW';
+ sqlite_reservedwords[94] := 'SELECT';
+ sqlite_reservedwords[95] := 'SET';
+ sqlite_reservedwords[96] := 'TABLE';
+ sqlite_reservedwords[97] := 'TEMP';
+ sqlite_reservedwords[98] := 'TEMPORARY';
+ sqlite_reservedwords[99] := 'THEN';
+ sqlite_reservedwords[100] := 'TO';
+ sqlite_reservedwords[101] := 'TRANSACTION';
+ sqlite_reservedwords[102] := 'TRIGGER';
+ sqlite_reservedwords[103] := 'UNION';
+ sqlite_reservedwords[104] := 'UNIQUE';
+ sqlite_reservedwords[105] := 'UPDATE';
+ sqlite_reservedwords[106] := 'USING';
+ sqlite_reservedwords[107] := 'VACUUM';
+ sqlite_reservedwords[108] := 'VALUES';
+ sqlite_reservedwords[109] := 'VIEW';
+ sqlite_reservedwords[110] := 'VIRTUAL';
+ sqlite_reservedwords[111] := 'WHEN';
+ sqlite_reservedwords[112] := 'WHERE';
+end;
+
+initialization
+ sqlite_InitializeReservedWords;
+finalization
+ sqlite_reservedwords := nil;
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAScriptingProvider.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAScriptingProvider.pas
new file mode 100644
index 0000000..c0671ac
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAScriptingProvider.pas
@@ -0,0 +1,150 @@
+unit uDAScriptingProvider;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, SysUtils, uROClient;
+
+type
+ TScriptableComponent = class;
+ TDAScriptingProvider = class(TROComponent)
+ private
+ FScriptableComponent: TScriptableComponent;
+ procedure SetScriptableComponent(const Value: TScriptableComponent);
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ public
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ published
+ property ScriptableComponent: TScriptableComponent read FScriptableComponent write SetScriptableComponent;
+ end;
+
+ IDAScriptingProvider = interface
+ ['{6D19A2F9-233A-4EE6-95EC-CDFCD7410C15}']
+ end;
+
+ EDAScriptError = class(Exception);
+ EDAScriptCompileError = class(EDAScriptError);
+
+ TScriptableComponent = class(TROComponent)
+ private
+ fScriptingProvider: TDAScriptingProvider;
+ procedure SetScriptingProvider(const Value: TDAScriptingProvider);
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ public
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ published
+ property ScriptingProvider: TDAScriptingProvider read fScriptingProvider write SetScriptingProvider;
+ end;
+
+
+
+implementation
+
+{ TScriptableComponent }
+
+procedure TScriptableComponent.Assign(Source: TPersistent);
+var
+ lSource: TScriptableComponent;
+begin
+ inherited;
+ if Source is TScriptableComponent then begin
+ lSource := TScriptableComponent(Source);
+
+ ScriptingProvider := lSource.ScriptingProvider;
+ end;
+end;
+
+destructor TScriptableComponent.Destroy;
+begin
+ ScriptingProvider := nil;
+ inherited;
+end;
+
+procedure TScriptableComponent.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ if (Operation = opRemove) then begin
+ if (AComponent = fScriptingProvider) then fScriptingProvider := nil;
+ end;
+ inherited;
+end;
+
+procedure TScriptableComponent.SetScriptingProvider(const Value: TDAScriptingProvider);
+begin
+ if fScriptingProvider <> Value then begin
+ if fScriptingProvider <> nil then begin
+ fScriptingProvider.RORemoveFreeNotification(self);
+ fScriptingProvider.ScriptableComponent:=nil;
+ end;
+ if Value <> nil then Value.ScriptableComponent := Self;
+ if Assigned(fScriptingProvider) then fScriptingProvider.ROFreeNotification(self);
+ end;
+end;
+
+{ TDAScriptingProvider }
+
+procedure TDAScriptingProvider.Assign(Source: TPersistent);
+var
+ lSource: TDAScriptingProvider;
+begin
+ inherited;
+ if Source is TDAScriptingProvider then begin
+ lSource := TDAScriptingProvider(Source);
+
+ ScriptableComponent := lSource.ScriptableComponent;
+ end;
+end;
+
+destructor TDAScriptingProvider.Destroy;
+begin
+ ScriptableComponent := nil;
+ inherited;
+end;
+
+procedure TDAScriptingProvider.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ if (Operation = opRemove) then begin
+ if (AComponent = FScriptableComponent) then begin
+ FScriptableComponent.fScriptingProvider:=nil;
+ FScriptableComponent := nil;
+ end;
+ end;
+ inherited;
+end;
+
+procedure TDAScriptingProvider.SetScriptableComponent(
+ const Value: TScriptableComponent);
+begin
+ if FScriptableComponent <> Value then begin
+ if FScriptableComponent <> nil then begin
+ FScriptableComponent.RORemoveFreeNotification(Self);
+ FScriptableComponent.fScriptingProvider:=nil;
+ end;
+ FScriptableComponent := Value;
+ if Assigned(FScriptableComponent) then begin
+ FScriptableComponent.fScriptingProvider := Self;
+ FScriptableComponent.ROFreeNotification(Self);
+ end;
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAServerLog.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAServerLog.pas
new file mode 100644
index 0000000..8f58c14
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAServerLog.pas
@@ -0,0 +1,632 @@
+unit uDAServerLog;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, Contnrs, SysUtils, uROSessions, SyncObjs, uROTypes, uDAInterfaces,
+ uROXMLIntf, uROXMLSerializer;
+
+const
+ EmptyGUID: TGUID = '{00000000-0000-0000-0000-000000000000}';
+
+type
+ TDAServerLog = class;
+
+ { TDALogItem }
+ TDALogItem = class(TROComplexType)
+ private
+ fServerLog: TDAServerLog;
+ fCreationTime: TDateTime;
+ fSessionID: TGUID;
+ function GetSessionIDAsString: string;
+
+ protected
+ procedure AssignSession(aSession: TROSession); virtual;
+
+ public
+ constructor Create(aServerLog: TDAServerLog; aSession: TROSession); reintroduce;
+ destructor Destroy; override;
+
+ property ServerLog: TDAServerLog read fServerLog;
+ {$IFDEF FPC}
+ property SessionID: TGUID read fSessionID;
+ {$ENDIF}
+
+ published
+ {$IFNDEF FPC}
+ property SessionID: TGUID read fSessionID;
+ {$ENDIF}
+ property SessionIDAsString: string read GetSessionIDAsString;
+ property CreationTime: TDateTime read fCreationTime;
+ end;
+
+ { TDASessionLog }
+ TDASessionLog = class(TDALogItem)
+ private
+ fLoginInfo: TROComplexType;
+
+ protected
+ procedure AssignLoginInfo(aLoginInfo: TROComplexType); virtual;
+
+ public
+ constructor Create(aServerLog: TDAServerLog; aSession: TROSession; aLoginInfo: TROComplexType);
+ destructor Destroy; override;
+
+ published
+ property LoginInfo: TROComplexType read fLoginInfo;
+ end;
+
+ TDASessionLogClass = class of TDASessionLog;
+
+ { TDASQLCommandLog }
+ TDASQLCommandLog = class(TDALogItem)
+ private
+ fActualSQLText: string;
+ fElapsedMilliseconds: Cardinal;
+ fOriginalSQLText: string;
+ fParams: TDAParamCollection;
+ protected
+ public
+ constructor Create(aServerLog: TDAServerLog; aSession: TROSession;
+ const aCommand: IDASQLCommand;
+ aActualSQLText: string; aElapsedMilliseconds: Cardinal);
+ destructor Destroy; override;
+
+ property Params: TDAParamCollection read fParams;
+
+ published
+
+ property OriginalSQLText: string read fOriginalSQLText;
+ property ActualSQLText: string read fActualSQLText;
+ property ElapsedMilliseconds: cardinal read fElapsedMilliseconds;
+ end;
+
+ TDASQLCommandLogClass = class of TDASQLCommandLog;
+
+ { TDASQLErrorLog }
+ TDASQLErrorLog = class(TDASQLCommandLog)
+ private
+ fErrorMessage: string;
+ protected
+ public
+ constructor Create(aServerLog: TDAServerLog; aSession: TROSession;
+ aError: Exception; const aCommand: IDASQLCommand;
+ aActualSQLText: string);
+
+ property ErrorMessage: string read fErrorMessage;
+ end;
+
+ TDASQLErrorLogClass = class of TDASQLErrorLog;
+
+ { Events }
+ TDASessionLogEvent = procedure(Sender: TDAServerLog; SessionLog: TDASessionLog) of object;
+ TDASessionLogRemoveEvent = procedure(Sender: TDAServerLog; SessionLog: TDASessionLog; var RemoveRelatedLogs: boolean) of object;
+ TDASQLCommandLogEvent = procedure(Sender: TDAServerLog; SQLCommandLog: TDASQLCommandLog) of object;
+ TDASQLErrorLogEvent = procedure(Sender: TDAServerLog; SQLErrorLog: TDASQLErrorLog) of object;
+ TDALogClassesDefinitionEvent = procedure(Sender: TDAServerLog;
+ var aSessionLogClass: TDASessionLogClass;
+ var aSQLCommandLogClass: TDASQLCommandLogClass;
+ var aSQLErrorLogClass: TDASQLErrorLogClass) of object;
+
+ { TDAServerLog }
+ TDAServerLog = class(TComponent)
+ private
+ fSessionsLogs: TStringList;
+ fSQLCommandLogs,
+ fSQLErrorsLogs: TObjectList;
+ fOnAddSQLCommandLog: TDASQLCommandLogEvent;
+ fOnAddSQLErrorLog: TDASQLErrorLogEvent;
+ fOnAddSessionLog: TDASessionLogEvent;
+ fActive: boolean;
+ fOnRemoveSessionLog: TDASessionLogRemoveEvent;
+
+ fCriticalSessions,
+ fCriticalSQLCommands,
+ fCriticalSQLErrors: TCriticalSection;
+ fOnLogClassesDefinition: TDALogClassesDefinitionEvent;
+
+ fSessionLogClass: TDASessionLogClass;
+ fSQLCommandLogClass: TDASQLCommandLogClass;
+ fSQLErrorLogClass: TDASQLErrorLogClass;
+
+ function GetSQLCommandLogsCount: integer;
+ function GetSQLCommandLogs(Index: integer): TDASQLCommandLog;
+ function GetSQLErrorLogs(Index: integer): TDASQLErrorLog;
+ function GetSessionLogsCount: integer;
+ function GetSessionLogs(Index: integer): TDASessionLog;
+ function GetSQLErrorLogsCount: integer;
+
+ protected
+ procedure RegisterLogServer;
+ procedure UnRegisterLogServer;
+
+ procedure Loaded; override;
+
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ procedure SaveToXML(aFileName: string); overload;
+ procedure SaveToXML(const aXMLDocument: IXMLDocument); overload; virtual;
+
+ { Session logs }
+ function FindSessionLog(aSession: TROSession): TDASessionLog; overload;
+ function FindSessionLog(aSessionID: TGUID): TDASessionLog; overload;
+
+ function AddSessionLog(aSession: TROSession; aLoginInfo: TROComplexType): TDASessionLog;
+ procedure RemoveSessionLog(aSessionID: TGUID; aRemoveRelatedLogs: boolean); overload;
+ procedure RemoveSessionLog(aSession: TROSession; aRemoveRelatedLogs: boolean); overload;
+ procedure ClearSessionLogs(aRemoveRelatedLogs: boolean);
+
+ { SQL command logs }
+ function AddSQLCommandLog(aSession: TROSession; const aCommand: IDASQLCommand;
+ anActualSQLText: string; aElapsedMilliseconds: Cardinal): TDASQLCommandLog;
+ procedure ClearSQLCommandLogs; overload;
+ procedure ClearSQLCommandLogs(aSessionID: TGUID); overload;
+
+ { SQL error logs }
+ function AddSQLErrorLog(aSession: TROSession; aError: Exception; const aCommand: IDASQLCommand;
+ aActualSQLText: string): TDASQLErrorLog;
+ procedure ClearSQLErrorLogs; overload;
+ procedure ClearSQLErrorLogs(aSessionID: TGUID); overload;
+
+ { Properties }
+ property SessionLogs[Index: integer]: TDASessionLog read GetSessionLogs;
+ property SessionLogsCount: integer read GetSessionLogsCount;
+
+ property SQLCommandLogs[Index: integer]: TDASQLCommandLog read GetSQLCommandLogs;
+ property SQLCommandLogsCount: integer read GetSQLCommandLogsCount;
+
+ property SQLErrorLogs[Index: integer]: TDASQLErrorLog read GetSQLErrorLogs;
+ property SQLErrorLogsCount: integer read GetSQLErrorLogsCount;
+
+ published
+ property Active: boolean read fActive write fActive;
+
+ property OnAddSessionLog: TDASessionLogEvent read fOnAddSessionLog write fOnAddSessionLog;
+ property OnRemoveSessionLog: TDASessionLogRemoveEvent read fOnRemoveSessionLog write fOnRemoveSessionLog;
+ property OnAddSQLCommandLog: TDASQLCommandLogEvent read fOnAddSQLCommandLog write fOnAddSQLCommandLog;
+ property OnAddSQLErrorLog: TDASQLErrorLogEvent read fOnAddSQLErrorLog write fOnAddSQLErrorLog;
+ property OnLogClassesDefinition: TDALogClassesDefinitionEvent read fOnLogClassesDefinition write fOnLogClassesDefinition;
+ end;
+
+function ServerLog: TDAServerLog;
+
+implementation
+
+var _ServerLog: TDAServerLog;
+
+function ServerLog: TDAServerLog;
+begin
+ if not Assigned(_ServerLog)
+ then raise Exception.Create('No TDAServerLog have been registered');
+
+ result := _ServerLog;
+end;
+
+{ TDALogItem }
+
+procedure TDALogItem.AssignSession(aSession: TROSession);
+begin
+ if Assigned(aSession)
+ then fSessionID := aSession.SessionID
+ else fSessionID := EmptyGUID;
+end;
+
+constructor TDALogItem.Create(aServerLog: TDAServerLog; aSession: TROSession);
+begin
+ fCreationTime := Now;
+ fServerLog := aServerLog;
+ AssignSession(aSession);
+end;
+
+destructor TDALogItem.Destroy;
+begin
+ inherited;
+end;
+
+function TDALogItem.GetSessionIDAsString: string;
+begin
+ result := GUIDToString(fSessionID)
+end;
+
+{ TDASessionLog }
+
+procedure TDASessionLog.AssignLoginInfo(aLoginInfo: TROComplexType);
+begin
+ fLoginInfo := TROComplexTypeClass(aLoginInfo.ClassType).Create;
+ fLoginInfo.Assign(aLoginInfo);
+end;
+
+constructor TDASessionLog.Create(aServerLog: TDAServerLog; aSession: TROSession; aLoginInfo: TROComplexType);
+begin
+ inherited Create(aServerLog, aSession);
+
+ AssignLoginInfo(aLoginInfo);
+end;
+
+destructor TDASessionLog.Destroy;
+begin
+ FreeAndNIL(fLoginInfo);
+ inherited;
+end;
+
+{ TDASQLCommandLog }
+
+constructor TDASQLCommandLog.Create(aServerLog: TDAServerLog; aSession: TROSession;
+ const aCommand: IDASQLCommand; aActualSQLText: string; aElapsedMilliseconds: Cardinal);
+begin
+ inherited Create(aServerLog, aSession);
+
+ fElapsedMilliseconds := aElapsedMilliseconds;
+ fOriginalSQLText := aCommand.SQL;
+ fActualSQLText := aActualSQLText;
+ fParams := TDAParamCollection.Create(NIL);
+ if (aCommand.Params.Count>0)
+ then fParams.Assign(aCommand.Params);
+end;
+
+destructor TDASQLCommandLog.Destroy;
+begin
+ FreeAndNIL(fParams);
+ inherited;
+end;
+
+{ TDASQLErrorLog }
+
+constructor TDASQLErrorLog.Create(aServerLog: TDAServerLog; aSession: TROSession;
+ aError: Exception; const aCommand: IDASQLCommand; aActualSQLText: string);
+begin
+ inherited Create(aServerLog, aSession, aCommand, aActualSQLText, 0);
+
+ fErrorMessage := aError.Message;
+end;
+
+{ TDAServerLog }
+constructor TDAServerLog.Create(aOwner: TComponent);
+begin
+ inherited;
+
+ fCriticalSessions := TCriticalSection.Create;
+ fCriticalSQLCommands := TCriticalSection.Create;
+ fCriticalSQLErrors := TCriticalSection.Create;
+
+ fSessionsLogs := TStringList.Create;
+ fSessionsLogs.Sorted := TRUE;
+
+ fSQLCommandLogs := TObjectList.Create;
+ fSQLErrorsLogs := TObjectList.Create;
+end;
+
+destructor TDAServerLog.Destroy;
+begin
+ if not (csDesigning in ComponentState) then UnRegisterLogServer;
+
+ ClearSessionLogs(FALSE);
+ FreeAndNIL(fSessionsLogs);
+
+ ClearSQLCommandLogs;
+ FreeAndNIL(fSQLCommandLogs);
+
+ ClearSQLErrorLogs;
+ FreeAndNIL(fSQLErrorsLogs);
+
+ FreeAndNIL(fCriticalSessions);
+ FreeAndNIL(fCriticalSQLCommands);
+ FreeAndNIL(fCriticalSQLErrors);
+
+ inherited;
+end;
+
+procedure TDAServerLog.Loaded;
+begin
+ if (csDesigning in ComponentState) then Exit;
+
+ RegisterLogServer;
+
+ fSessionLogClass := TDASessionLog;
+ fSQLCommandLogClass := TDASQLCommandLog;
+ fSQLErrorLogClass := TDASQLErrorLog;
+
+ if Assigned(fOnLogClassesDefinition)
+ then fOnLogClassesDefinition(Self, fSessionLogClass, fSQLCommandLogClass, fSQLErrorLogClass);
+end;
+
+function TDAServerLog.AddSQLCommandLog(aSession: TROSession; const aCommand: IDASQLCommand;
+ anActualSQLText: string; aElapsedMilliseconds: Cardinal): TDASQLCommandLog;
+begin
+ result := NIL;
+ if not Active then Exit;
+
+ result := fSQLCommandLogClass.Create(Self, aSession, aCommand, anActualSQLText, aElapsedMilliseconds);
+
+ fCriticalSQLCommands.Enter;
+ try
+ fSQLCommandLogs.Add(result);
+
+ if Assigned(fOnAddSQLCommandLog)
+ then fOnAddSQLCommandLog(Self, result);
+ finally
+ fCriticalSQLCommands.Leave;
+ end;
+end;
+
+function TDAServerLog.AddSQLErrorLog(aSession: TROSession; aError: Exception; const aCommand: IDASQLCommand;
+ aActualSQLText: string): TDASQLErrorLog;
+begin
+ result := NIL;
+ if not Active then Exit;
+
+ result := fSQLErrorLogClass.Create(Self, aSession, aError, aCommand, aActualSQLText);
+ fCriticalSQLErrors.Enter;
+ try
+ fSQLErrorsLogs.Add(result);
+
+ if Assigned(OnAddSQLErrorLog)
+ then OnAddSQLErrorLog(Self, result);
+ finally
+ fCriticalSQLErrors.Leave;
+ end;
+end;
+
+procedure TDAServerLog.Assign(Source: TPersistent);
+var
+ lSource: TDAServerLog;
+begin
+ inherited;
+ if Source is TDAServerLog then begin
+ lSource := TDAServerLog(Source);
+
+ Active := lSource.Active;
+ OnAddSessionLog := lSource.OnAddSessionLog;
+ OnAddSQLCommandLog := lSource.OnAddSQLCommandLog;
+ OnAddSQLErrorLog := lSource.OnAddSQLErrorLog;
+ OnLogClassesDefinition := lSource.OnLogClassesDefinition;
+ OnRemoveSessionLog := lSource.OnRemoveSessionLog;
+ end;
+end;
+
+function TDAServerLog.AddSessionLog(aSession: TROSession; aLoginInfo: TROComplexType): TDASessionLog;
+begin
+ result := NIL;
+ if not Active then Exit;
+
+ result := fSessionLogClass.Create(Self, aSession, aLoginInfo);
+
+ fCriticalSessions.Enter;
+ try
+ fSessionsLogs.AddObject(GUIDToString(aSession.SessionID), result);
+
+ if Assigned(fOnAddSessionLog)
+ then fOnAddSessionLog(Self, result);
+ finally
+ fCriticalSessions.Leave;
+ end;
+end;
+
+procedure TDAServerLog.RemoveSessionLog(aSessionID: TGUID; aRemoveRelatedLogs: boolean);
+var idx: integer;
+ removeRelated: boolean;
+begin
+ fCriticalSessions.Enter;
+ try
+ idx := fSessionsLogs.IndexOf(GUIDToString(aSessionID));
+ if (idx>=0) then begin
+ removeRelated := aRemoveRelatedLogs;
+
+ if Assigned(fOnRemoveSessionLog)
+ then fOnRemoveSessionLog(Self, TDASessionLog(fSessionsLogs.Objects[idx]), removeRelated);
+
+ fSessionsLogs.Objects[idx].Free;
+ fSessionsLogs.Delete(idx);
+
+ { Removes the entries associated to this session in the sql and errors lists }
+ if removeRelated then begin
+ ClearSQLCommandLogs(aSessionID);
+ ClearSQLErrorLogs(aSessionID);
+ end;
+ end;
+ finally
+ fCriticalSessions.Leave;
+ end;
+end;
+
+procedure TDAServerLog.RemoveSessionLog(aSession: TROSession; aRemoveRelatedLogs: boolean);
+begin
+ RemoveSessionLog(aSession.SessionID, aRemoveRelatedLogs);
+end;
+
+function TDAServerLog.GetSQLCommandLogsCount: integer;
+begin
+ result := fSQLCommandLogs.Count
+end;
+
+function TDAServerLog.GetSQLCommandLogs(Index: integer): TDASQLCommandLog;
+begin
+ result := TDASQLCommandLog(fSQLCommandLogs[Index])
+end;
+
+function TDAServerLog.GetSQLErrorLogsCount: integer;
+begin
+ result := fSQLErrorsLogs.Count
+end;
+
+function TDAServerLog.GetSQLErrorLogs(Index: integer): TDASQLErrorLog;
+begin
+ result := TDASQLErrorLog(fSQLErrorsLogs[Index])
+end;
+
+function TDAServerLog.GetSessionLogsCount: integer;
+begin
+ result := fSessionsLogs.Count
+end;
+
+function TDAServerLog.GetSessionLogs(Index: integer): TDASessionLog;
+begin
+ result := TDASessionLog(fSessionsLogs.Objects[Index])
+end;
+
+procedure TDAServerLog.RegisterLogServer;
+begin
+ if (_ServerLog<>NIL)
+ then raise Exception.Create('Only one instance of TDAServerLog is allowed');
+
+ _ServerLog := Self;
+end;
+
+procedure TDAServerLog.UnRegisterLogServer;
+begin
+ _ServerLog := NIL;
+end;
+
+procedure TDAServerLog.ClearSQLCommandLogs;
+begin
+ fCriticalSQLCommands.Enter;
+ try
+ fSQLCommandLogs.Clear;
+ finally
+ fCriticalSQLCommands.Leave;
+ end;
+end;
+
+procedure TDAServerLog.ClearSQLErrorLogs;
+begin
+ fCriticalSQLErrors.Enter;
+ try
+ fSQLErrorsLogs.Clear;
+ finally
+ fCriticalSQLErrors.Leave;
+ end;
+end;
+
+
+procedure TDAServerLog.ClearSQLCommandLogs(aSessionID: TGUID);
+var i: integer;
+begin
+ fCriticalSQLCommands.Enter;
+ try
+ for i := fSQLCommandLogs.Count-1 downto 0 do
+ if IsEqualGUID(TDASQLCommandLog(fSQLCommandLogs[i]).SessionID, aSessionID)
+ then fSQLCommandLogs.Delete(i);
+ finally
+ fCriticalSQLCommands.Leave;
+ end;
+end;
+
+procedure TDAServerLog.ClearSQLErrorLogs(aSessionID: TGUID);
+var i: integer;
+begin
+ fCriticalSQLErrors.Enter;
+ try
+ for i := fSQLErrorsLogs.Count-1 downto 0 do
+ if IsEqualGUID(TDASQLErrorLog(fSQLErrorsLogs[i]).SessionID, aSessionID)
+ then fSQLErrorsLogs.Delete(i);
+ finally
+ fCriticalSQLErrors.Leave;
+ end;
+end;
+
+procedure TDAServerLog.ClearSessionLogs(aRemoveRelatedLogs: boolean);
+var i: integer;
+ thisLog: TDASessionLog;
+begin
+ fCriticalSessions.Enter;
+ try
+ for i := 0 to (fSessionsLogs.Count-1) do begin
+ thisLog := TDASessionLog(fSessionsLogs.Objects[i]);
+
+ if aRemoveRelatedLogs then begin
+ ClearSQLCommandLogs(thisLog.SessionID);
+ ClearSQLErrorLogs(thisLog.SessionID);
+ end;
+
+ thisLog.Free;
+ end;
+
+ fSessionsLogs.Clear;
+ finally
+ fCriticalSessions.Leave;
+ end;
+end;
+
+
+function TDAServerLog.FindSessionLog(aSession: TROSession): TDASessionLog;
+begin
+ if (aSession<>NIL)
+ then result := FindSessionLog(aSession.SessionID)
+ else result := NIL;
+end;
+
+function TDAServerLog.FindSessionLog(aSessionID: TGUID): TDASessionLog;
+var idx: integer;
+begin
+ result := NIL;
+ idx := fSessionsLogs.IndexOf(GUIDToString(aSessionID));
+ if (idx>=0) then result := TDASessionLog(fSessionsLogs.Objects[idx]);
+end;
+
+procedure TDAServerLog.SaveToXML(aFileName: string);
+var doc: IXMLDocument;
+begin
+ doc := NewROXmlDocument;
+ doc.New('Log');
+ SaveToXML(doc);
+ doc.SaveToFile(aFileName);
+end;
+
+procedure TDAServerLog.SaveToXML(const aXMLDocument: IXMLDocument);
+var i: integer;
+ sessionLog: TDASessionLog;
+ sqlLog: TDASQLCommandLog;
+ errorLog: TDASQLErrorLog;
+begin
+ with TROXMLSerializer.Create(pointer(aXMLDocument.DocumentNode)) do try
+ SerializationOptions := [xsoSendUntyped];
+
+ for i := 0 to SessionLogsCount-1 do begin
+ sessionLog := SessionLogs[i];
+ Write(sessionLog.ClassName, sessionLog.ClassInfo, sessionLog);
+ end;
+
+ for i := 0 to SQLCommandLogsCount-1 do begin
+ sqlLog := SQLCommandLogs[i];
+ Write(sqlLog.ClassName, sqlLog.ClassInfo, sqlLog);
+ end;
+
+ for i := 0 to SQLErrorLogsCount-1 do begin
+ errorLog := SQLErrorLogs[i];
+ Write(errorLog.ClassName, errorLog.ClassInfo, errorLog);
+ end;
+
+ finally
+ Free;
+ end;
+end;
+
+initialization
+ RegisterROClass(TDASessionLog);
+ RegisterROClass(TDASQLCommandLog);
+ RegisterROClass(TDASQLErrorLog);
+
+finalization
+ FreeAndNIL(_ServerLog);
+
+ UnRegisterROClass(TDASessionLog);
+ UnRegisterROClass(TDASQLCommandLog);
+ UnRegisterROClass(TDASQLErrorLog);
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASupportClasses.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASupportClasses.pas
new file mode 100644
index 0000000..d848454
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASupportClasses.pas
@@ -0,0 +1,412 @@
+unit uDASupportClasses;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses Classes;
+
+type
+ { TCollectionEvents }
+ TCollectionNotificationEvent = procedure(Item: TCollectionItem; Action: TCollectionNotification) of object;
+
+ { TInterfacedCollectionItem }
+ TInterfacedCollectionItem = class(TCollectionItem, IUnknown)
+ protected
+ function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
+ function _AddRef: Integer; stdcall;
+ function _Release: Integer; stdcall;
+ end;
+
+ TDAItemRenamedEvent = procedure(aSender: TObject; const aOldName, aNewName: string) of object;
+ TDAItemRemovedEvent = procedure(aSender: TObject; const aName: string) of object;
+
+ { TSearcheableCollection }
+ TSearcheableCollection = class(TOwnedCollection)
+ private
+ fOnNotification: TCollectionNotificationEvent;
+ fOnItemRemoved: TDAItemRemovedEvent;
+ fOnItemRenamed: TDAItemRenamedEvent;
+
+ protected
+ FAllowEmptyName: Boolean;
+ function SetItemName(anItem: TCollectionItem; const aName: string): string; reintroduce; dynamic;
+ function GetItemName(anItem: TCollectionItem): string; reintroduce; dynamic;
+ function GetItemDefault(anItem: TCollectionItem): boolean; dynamic;
+
+ procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override;
+
+ function ItemName: string; virtual;
+
+ public
+ constructor Create(AOwner: TPersistent; ItemClass: TCollectionItemClass);
+ function ItemByName(const aName: string): TCollectionItem;
+ function FindItem(const aName: string): TCollectionItem; virtual;
+ function GetDefaultItem: TCollectionItem;
+
+ procedure TriggerOnItemRenamed(const iOldName, iNewName: string); virtual;
+ procedure TriggerOnItemRemoved(const iName: string); virtual;
+
+ function FindUniqueName(const iBaseName: string): string;
+ function FindUniqueNameEx(const iBaseName, iNumberedName: string): string;
+ function CloneItem(iIndex: integer): integer;
+
+ procedure MoveItem(iFromIndex, iToIndex: integer);
+
+ property OnNotification: TCollectionNotificationEvent read fOnNotification write fOnNotification;
+
+ property OnItemRenamed: TDAItemRenamedEvent read fOnItemRenamed write fOnItemRenamed;
+ property OnItemRemoved: TDAItemRemovedEvent read fOnItemRemoved write fOnItemRemoved;
+ end;
+
+ TSearcheableCollectionCached = class(TSearcheableCollection)
+ private
+ FNameList: TStringList;
+ fNeedRebuild: Boolean;
+ procedure RebuildList;
+ protected
+ procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override;
+ public
+ constructor Create(AOwner: TPersistent; ItemClass: TCollectionItemClass);
+ destructor Destroy; override;
+ procedure TriggerOnItemRenamed(const iOldName, iNewName: string); override;
+ procedure TriggerOnItemRemoved(const iName: string); override;
+ function FindItem(const aName: string): TCollectionItem; override;
+ end;
+
+ { TSearcheableInterfacedCollection }
+ TSearcheableInterfacedCollection = class(TSearcheableCollectionCached, IUnknown)
+ protected
+ function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
+ function _AddRef: Integer; stdcall;
+ function _Release: Integer; stdcall;
+
+ // Required by most interfaces
+ function GetCount: integer;
+
+ end;
+
+ { TSearcheableInterfacedCollection }
+ TInterfacedCollection = class(TOwnedCollection, IUnknown)
+ protected
+ function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
+ function _AddRef: Integer; stdcall;
+ function _Release: Integer; stdcall;
+
+ // Required by most interfaces
+ function GetCount: integer;
+
+ end;
+
+
+implementation
+
+uses uROClasses, uDARes, TypInfo, SysUtils;
+
+{ TInterfacedCollectionItem }
+
+function TInterfacedCollectionItem._AddRef: Integer;
+begin
+ result := -1;
+end;
+
+function TInterfacedCollectionItem._Release: Integer;
+begin
+ result := -1;
+end;
+
+function TInterfacedCollectionItem.QueryInterface(const IID: TGUID; out Obj): HResult;
+begin
+ if GetInterface(IID, Obj) then
+ Result := 0
+ else
+ Result := E_NOINTERFACE;
+end;
+
+{ TSearcheableInterfacedCollection }
+
+function TSearcheableInterfacedCollection._AddRef: Integer;
+begin
+ result := -1;
+end;
+
+function TSearcheableInterfacedCollection._Release: Integer;
+begin
+ result := -1;
+end;
+
+function TSearcheableInterfacedCollection.QueryInterface(const IID: TGUID;
+ out Obj): HResult;
+begin
+ if GetInterface(IID, Obj) then
+ Result := 0
+ else
+ Result := E_NOINTERFACE;
+end;
+
+function TSearcheableInterfacedCollection.GetCount: integer;
+begin
+ result := Count;
+end;
+
+{ TSearcheableCollection }
+
+function TSearcheableCollection.GetDefaultItem: TCollectionItem;
+var
+ i: integer;
+begin
+ result := nil;
+ for i := 0 to (Count - 1) do
+ if GetItemDefault(Items[i]) then begin
+ result := Items[i];
+ Exit;
+ end;
+
+ RaiseError(err_CannotFindDefaultItem,[ItemName]);
+end;
+
+function TSearcheableCollection.FindItem(
+ const aName: string): TCollectionItem;
+var
+ i: integer;
+ nme: string;
+begin
+ result := nil;
+ for i := 0 to (Count - 1) do begin
+ nme := GetItemName(Items[i]);
+ if SameText(nme, aName) then begin
+ result := Items[i];
+ Exit;
+ end;
+ end;
+end;
+
+function TSearcheableCollection.GetItemDefault(
+ anItem: TCollectionItem): boolean;
+begin
+ try
+ result := GetPropValue(anItem, 'Default', TRUE); // Defaul implementation. Not super-fast but for now's ok
+ except
+ on e: EPropertyError do
+ raise EPropertyError.CreateFmt('The %s collection doesn''t support Default items',[ClassName]);
+ else
+ raise;
+ end;
+end;
+
+function TSearcheableCollection.GetItemName(
+ anItem: TCollectionItem): string;
+begin
+ result := GetPropValue(anItem, 'Name', TRUE); // Defaul implementation. Not super-fast but for now's ok
+end;
+
+function TSearcheableCollection.ItemByName(
+ const aName: string): TCollectionItem;
+begin
+ { ToDo: This is not perfect, since not all collections will properly support GetDefaultItem. }
+ if (aName = '') then
+ result := GetDefaultItem
+ else
+ result := FindItem(aName);
+
+ Check(result = nil, err_CannotFindItem, [ItemName, aName, ClassName]);
+end;
+
+procedure TSearcheableCollection.Notify(Item: TCollectionItem;
+ Action: TCollectionNotification);
+begin
+ inherited;
+
+ if (not FAllowEmptyName) and (Action = cnAdded) then begin
+ if (GetItemName(Item) = '') then SetItemName(Item, 'Item' + IntToStr(Count));
+ end;
+
+ if Action = cnDeleting then
+ TriggerOnItemRemoved(GetItemName(Item));
+
+ if Assigned(fOnNotification) then fOnNotification(Item, Action);
+end;
+
+function TSearcheableCollection.SetItemName(anItem: TCollectionItem; const aName: string): string;
+begin
+ SetPropValue(anItem, 'Name', aName); // Defaul implementation. Not super-fast but for now's ok
+end;
+
+function TSearcheableCollection.CloneItem(iIndex: integer): integer;
+var
+ lOldItem, lNewItem: TCollectionItem;
+begin
+ lOldItem := Items[iIndex];
+ lNewItem := Add();
+ lNewItem.Assign(lOldItem);
+ lNewItem.DisplayName := FindUniqueNameEx('Copy of ' + lOldItem.DisplayName, 'Copy (%d) of ' + lOldItem.DisplayName);
+ result := lNewItem.Index;
+end;
+
+procedure TSearcheableCollection.MoveItem(iFromIndex, iToIndex: integer);
+var
+ lSave: TCollectionItem;
+ lOld: TCollectionItem;
+begin
+ if (iFromIndex < 0) or (iFromIndex >= Count) then raise ERangeError.CreateFmt('iFromIndex out of range (%d).', [iFromIndex]);
+ if (iToIndex < 0) or (iToIndex >= Count) then raise ERangeError.CreateFmt('iToIndex out of range (%d).', [iToIndex]);
+
+ lOld := Items[iFromIndex];
+
+ if iToIndex > iFromIndex then inc(iToIndex); //account for the old item that will be removed later
+
+ lSave := Insert(iToIndex);
+ lSave.Assign(lOld);
+ Delete(lOld.Index);
+end;
+
+function TSearcheableCollection.FindUniqueName(const iBaseName: string): string;
+var
+ lIndex: integer;
+begin
+ result := iBaseName;
+ lIndex := 0;
+ while Assigned(FindItem(result)) do begin
+ inc(lIndex);
+ result := iBaseName + IntToStr(lIndex);
+ end;
+end;
+
+function TSearcheableCollection.FindUniqueNameEx(const iBaseName, iNumberedName: string): string;
+var
+ lIndex: integer;
+begin
+ result := iBaseName;
+ lIndex := 0;
+ while Assigned(FindItem(result)) do begin
+ inc(lIndex);
+ result := Format(iNumberedName, [lIndex]);
+ end;
+end;
+
+function TSearcheableCollection.ItemName: string;
+begin
+ result := 'item';
+end;
+
+procedure TSearcheableCollection.TriggerOnItemRemoved(const iName: string);
+begin
+ if Assigned(OnItemRemoved) then OnItemRemoved(self, iName);
+end;
+
+procedure TSearcheableCollection.TriggerOnItemRenamed(const iOldName, iNewName: string);
+begin
+ if Assigned(OnItemRenamed) then OnItemRenamed(self, iOldName, iNewName);
+end;
+
+constructor TSearcheableCollection.Create(AOwner: TPersistent;
+ ItemClass: TCollectionItemClass);
+begin
+ inherited Create(AOwner,ItemClass);
+ FAllowEmptyName:=False;
+end;
+
+{ TInterfacedCollection }
+
+function TInterfacedCollection._AddRef: Integer;
+begin
+ result := -1;
+end;
+
+function TInterfacedCollection._Release: Integer;
+begin
+ result := -1;
+end;
+
+function TInterfacedCollection.GetCount: integer;
+begin
+ result := -1;
+end;
+
+function TInterfacedCollection.QueryInterface(const IID: TGUID;
+ out Obj): HResult;
+begin
+ if GetInterface(IID, Obj) then
+ Result := 0
+ else
+ Result := E_NOINTERFACE;
+end;
+
+{ TSearcheableCollectionCached }
+
+constructor TSearcheableCollectionCached.Create(AOwner: TPersistent;
+ ItemClass: TCollectionItemClass);
+begin
+ inherited Create(AOwner,ItemClass);
+ FNameList := TStringList.Create;
+ FNameList.CaseSensitive:=False;
+ fNeedRebuild := True;
+end;
+
+destructor TSearcheableCollectionCached.Destroy;
+begin
+ FNameList.Free;
+ inherited;
+end;
+
+function TSearcheableCollectionCached.FindItem(
+ const aName: string): TCollectionItem;
+var
+ i: integer;
+begin
+ if fNeedRebuild then RebuildList;
+ i := FNameList.IndexOf(aName);
+ if i = -1 then
+ Result := nil
+ else
+ Result := TCollectionItem(FNameList.Objects[i]);
+end;
+
+procedure TSearcheableCollectionCached.Notify(Item: TCollectionItem;
+ Action: TCollectionNotification);
+begin
+ fNeedRebuild := True;
+ inherited;
+end;
+
+procedure TSearcheableCollectionCached.RebuildList;
+var
+ i: integer;
+begin
+ FNameList.Sorted:=False;
+ FNameList.Clear;
+ FNameList.Capacity:= Self.Count;
+ for i := 0 to Count -1 do
+ FNameList.AddObject(GetItemName(Items[i]),Items[i]);
+ FNameList.Sorted:=True;
+ fNeedRebuild := False;
+end;
+
+procedure TSearcheableCollectionCached.TriggerOnItemRenamed(const iOldName,
+ iNewName: string);
+begin
+ fNeedRebuild := True;
+ inherited TriggerOnItemRenamed(iOldName, iNewName);
+end;
+
+procedure TSearcheableCollectionCached.TriggerOnItemRemoved(
+ const iName: string);
+begin
+ fNeedRebuild := True;
+ inherited TriggerOnItemRemoved(iName);
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASybaseInterfaces.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASybaseInterfaces.pas
new file mode 100644
index 0000000..247807b
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDASybaseInterfaces.pas
@@ -0,0 +1,801 @@
+unit uDASybaseInterfaces;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses uDAInterfaces, uDAEngine;
+
+type
+ { IDASybaseConnection
+ For identification purposes. Implemented by all Sybase connections }
+ IDASybaseConnection = interface(IDAConnection)
+ ['{901F16BC-4A56-4ADB-BFF9-87D23590C326}']
+ end;
+
+
+function Sybase_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+
+implementation
+uses
+ SysUtils;
+
+var
+ Sybase_reservedwords: array of string;
+
+function Sybase_IdentifierNeedsQuoting(const iIdentifier: string): boolean;
+begin
+ Result := TestIdentifier(iIdentifier, Sybase_reservedwords);
+end;
+
+procedure Sybase_InitializeReservedWords;
+begin
+// from http://publib.boulder.ibm.com/infocenter/Sybaseluw/v9r5/topic/com.ibm.Sybase.luw.sql.ref.doc/doc/r0001095.html
+ SetLength(Sybase_reservedwords, 747);
+ // sorted with TStringList.Sort (bds2007)
+ Sybase_reservedwords[0] := 'A';
+ Sybase_reservedwords[1] := 'ABORT';
+ Sybase_reservedwords[2] := 'ABS';
+ Sybase_reservedwords[3] := 'ABSOLUTE';
+ Sybase_reservedwords[4] := 'ACCESS';
+ Sybase_reservedwords[5] := 'ACOS';
+ Sybase_reservedwords[6] := 'ACQUIRE';
+ Sybase_reservedwords[7] := 'ACTION';
+ Sybase_reservedwords[8] := 'ACTIVATE';
+ Sybase_reservedwords[9] := 'ADA';
+ Sybase_reservedwords[10] := 'ADD';
+ Sybase_reservedwords[11] := 'ADDFORM';
+ Sybase_reservedwords[12] := 'ADMIN';
+ Sybase_reservedwords[13] := 'AFTER';
+ Sybase_reservedwords[14] := 'AGGREGATE';
+ Sybase_reservedwords[15] := 'ALIAS';
+ Sybase_reservedwords[16] := 'ALL';
+ Sybase_reservedwords[17] := 'ALLOCATE';
+ Sybase_reservedwords[18] := 'ALTER';
+ Sybase_reservedwords[19] := 'AN';
+ Sybase_reservedwords[20] := 'ANALYZE';
+ Sybase_reservedwords[21] := 'AND';
+ Sybase_reservedwords[22] := 'ANY';
+ Sybase_reservedwords[23] := 'APPEND';
+ Sybase_reservedwords[24] := 'ARCHIVE';
+ Sybase_reservedwords[25] := 'ARCHIVELOG';
+ Sybase_reservedwords[26] := 'ARE';
+ Sybase_reservedwords[27] := 'ARRAY';
+ Sybase_reservedwords[28] := 'ARRAYLEN';
+ Sybase_reservedwords[29] := 'AS';
+ Sybase_reservedwords[30] := 'ASC';
+ Sybase_reservedwords[31] := 'ASCII';
+ Sybase_reservedwords[32] := 'ASIN';
+ Sybase_reservedwords[33] := 'ASSERTION';
+ Sybase_reservedwords[34] := 'AT';
+ Sybase_reservedwords[35] := 'ATAN';
+ Sybase_reservedwords[36] := 'AUDIT';
+ Sybase_reservedwords[37] := 'AUTHORIZATION';
+ Sybase_reservedwords[38] := 'AVG';
+ Sybase_reservedwords[39] := 'AVGU';
+ Sybase_reservedwords[40] := 'BACKUP';
+ Sybase_reservedwords[41] := 'BECOME';
+ Sybase_reservedwords[42] := 'BEFORE';
+ Sybase_reservedwords[43] := 'BEGIN';
+ Sybase_reservedwords[44] := 'BETWEEN';
+ Sybase_reservedwords[45] := 'BIGINT';
+ Sybase_reservedwords[46] := 'BINARY';
+ Sybase_reservedwords[47] := 'BIND';
+ Sybase_reservedwords[48] := 'BINDING';
+ Sybase_reservedwords[49] := 'BIT';
+ Sybase_reservedwords[50] := 'BLOB';
+ Sybase_reservedwords[51] := 'BLOCK';
+ Sybase_reservedwords[52] := 'BODY';
+ Sybase_reservedwords[53] := 'BOOLEAN';
+ Sybase_reservedwords[54] := 'BOTH';
+ Sybase_reservedwords[55] := 'BREADTH';
+ Sybase_reservedwords[56] := 'BREAK';
+ Sybase_reservedwords[57] := 'BREAKDISPLAY';
+ Sybase_reservedwords[58] := 'BROWSE';
+ Sybase_reservedwords[59] := 'BUFFERPOOL';
+ Sybase_reservedwords[60] := 'BULK';
+ Sybase_reservedwords[61] := 'BY';
+ Sybase_reservedwords[62] := 'BYREF';
+ Sybase_reservedwords[63] := 'CACHE';
+ Sybase_reservedwords[64] := 'CALL';
+ Sybase_reservedwords[65] := 'CALLPROC';
+ Sybase_reservedwords[66] := 'CANCEL';
+ Sybase_reservedwords[67] := 'CAPTURE';
+ Sybase_reservedwords[68] := 'CASCADE';
+ Sybase_reservedwords[69] := 'CASCADED';
+ Sybase_reservedwords[70] := 'CASE';
+ Sybase_reservedwords[71] := 'CAST';
+ Sybase_reservedwords[72] := 'CATALOG';
+ Sybase_reservedwords[73] := 'CCSID';
+ Sybase_reservedwords[74] := 'CEILING';
+ Sybase_reservedwords[75] := 'CHANGE';
+ Sybase_reservedwords[76] := 'CHAR';
+ Sybase_reservedwords[77] := 'CHARACTER';
+ Sybase_reservedwords[78] := 'CHARTOROWID';
+ Sybase_reservedwords[79] := 'CHECK';
+ Sybase_reservedwords[80] := 'CHECKPOINT';
+ Sybase_reservedwords[81] := 'CHR';
+ Sybase_reservedwords[82] := 'CLASS';
+ Sybase_reservedwords[83] := 'CLEANUP';
+ Sybase_reservedwords[84] := 'CLEAR';
+ Sybase_reservedwords[85] := 'CLEARROW';
+ Sybase_reservedwords[86] := 'CLOB';
+ Sybase_reservedwords[87] := 'CLOSE';
+ Sybase_reservedwords[88] := 'CLUSTER';
+ Sybase_reservedwords[89] := 'CLUSTERED';
+ Sybase_reservedwords[90] := 'COALESCE';
+ Sybase_reservedwords[91] := 'COBOL';
+ Sybase_reservedwords[92] := 'COLGROUP';
+ Sybase_reservedwords[93] := 'COLLATE';
+ Sybase_reservedwords[94] := 'COLLATION';
+ Sybase_reservedwords[95] := 'COLLECTION';
+ Sybase_reservedwords[96] := 'COLUMN';
+ Sybase_reservedwords[97] := 'COMMAND';
+ Sybase_reservedwords[98] := 'COMMENT';
+ Sybase_reservedwords[99] := 'COMMIT';
+ Sybase_reservedwords[100] := 'COMMITTED';
+ Sybase_reservedwords[101] := 'COMPILE';
+ Sybase_reservedwords[102] := 'COMPLETION';
+ Sybase_reservedwords[103] := 'COMPLEX';
+ Sybase_reservedwords[104] := 'COMPRESS';
+ Sybase_reservedwords[105] := 'COMPUTE';
+ Sybase_reservedwords[106] := 'CONCAT';
+ Sybase_reservedwords[107] := 'CONFIRM';
+ Sybase_reservedwords[108] := 'CONNECT';
+ Sybase_reservedwords[109] := 'CONNECTION';
+ Sybase_reservedwords[110] := 'CONSTRAINT';
+ Sybase_reservedwords[111] := 'CONSTRAINTS';
+ Sybase_reservedwords[112] := 'CONSTRUCTOR';
+ Sybase_reservedwords[113] := 'CONTAINS';
+ Sybase_reservedwords[114] := 'CONTAINSTABLE';
+ Sybase_reservedwords[115] := 'CONTENTS';
+ Sybase_reservedwords[116] := 'CONTINUE';
+ Sybase_reservedwords[117] := 'CONTROLFILE';
+ Sybase_reservedwords[118] := 'CONTROLROW';
+ Sybase_reservedwords[119] := 'CONVERT';
+ Sybase_reservedwords[120] := 'COPY';
+ Sybase_reservedwords[121] := 'CORRESPONDING';
+ Sybase_reservedwords[122] := 'COS';
+ Sybase_reservedwords[123] := 'COUNT';
+ Sybase_reservedwords[124] := 'COUNTU';
+ Sybase_reservedwords[125] := 'CREATE';
+ Sybase_reservedwords[126] := 'CROSS';
+ Sybase_reservedwords[127] := 'CUBE';
+ Sybase_reservedwords[128] := 'CURRENT';
+ Sybase_reservedwords[129] := 'CURRENT_DATE';
+ Sybase_reservedwords[130] := 'CURRENT_PATH';
+ Sybase_reservedwords[131] := 'CURRENT_ROLE';
+ Sybase_reservedwords[132] := 'CURRENT_TIME';
+ Sybase_reservedwords[133] := 'CURRENT_TIMESTAMP';
+ Sybase_reservedwords[134] := 'CURRENT_USER';
+ Sybase_reservedwords[135] := 'CURSOR';
+ Sybase_reservedwords[136] := 'CVAR';
+ Sybase_reservedwords[137] := 'CYCLE';
+ Sybase_reservedwords[138] := 'DATA';
+ Sybase_reservedwords[139] := 'DATABASE';
+ Sybase_reservedwords[140] := 'DATAFILE';
+ Sybase_reservedwords[141] := 'DATAHANDLER';
+ Sybase_reservedwords[142] := 'DATAPAGES';
+ Sybase_reservedwords[143] := 'DATE';
+ Sybase_reservedwords[144] := 'DAY';
+ Sybase_reservedwords[145] := 'DAYOFMONTH';
+ Sybase_reservedwords[146] := 'DAYOFWEEK';
+ Sybase_reservedwords[147] := 'DAYOFYEAR';
+ Sybase_reservedwords[148] := 'DAYS';
+ Sybase_reservedwords[149] := 'DBA';
+ Sybase_reservedwords[150] := 'DBCC';
+ Sybase_reservedwords[151] := 'DBSPACE';
+ Sybase_reservedwords[152] := 'DEALLOCATE';
+ Sybase_reservedwords[153] := 'DEC';
+ Sybase_reservedwords[154] := 'DECIMAL';
+ Sybase_reservedwords[155] := 'DECLARATION';
+ Sybase_reservedwords[156] := 'DECLARE';
+ Sybase_reservedwords[157] := 'DECODE';
+ Sybase_reservedwords[158] := 'DEFAULT';
+ Sybase_reservedwords[159] := 'DEFERRABLE';
+ Sybase_reservedwords[160] := 'DEFERRED';
+ Sybase_reservedwords[161] := 'DEFINE';
+ Sybase_reservedwords[162] := 'DEFINITION';
+ Sybase_reservedwords[163] := 'DEGREES';
+ Sybase_reservedwords[164] := 'DELETE';
+ Sybase_reservedwords[165] := 'DELETEROW';
+ Sybase_reservedwords[166] := 'DENY';
+ Sybase_reservedwords[167] := 'DEPTH';
+ Sybase_reservedwords[168] := 'DEREF';
+ Sybase_reservedwords[169] := 'DESC';
+ Sybase_reservedwords[170] := 'DESCRIBE';
+ Sybase_reservedwords[171] := 'DESCRIPTOR';
+ Sybase_reservedwords[172] := 'DESTROY';
+ Sybase_reservedwords[173] := 'DESTRUCTOR';
+ Sybase_reservedwords[174] := 'DETERMINISTIC';
+ Sybase_reservedwords[175] := 'DHTYPE';
+ Sybase_reservedwords[176] := 'DIAGNOSTICS';
+ Sybase_reservedwords[177] := 'DICTIONARY';
+ Sybase_reservedwords[178] := 'DIRECT';
+ Sybase_reservedwords[179] := 'DISABLE';
+ Sybase_reservedwords[180] := 'DISCONNECT';
+ Sybase_reservedwords[181] := 'DISK';
+ Sybase_reservedwords[182] := 'DISMOUNT';
+ Sybase_reservedwords[183] := 'DISPLAY';
+ Sybase_reservedwords[184] := 'DISTINCT';
+ Sybase_reservedwords[185] := 'DISTRIBUTE';
+ Sybase_reservedwords[186] := 'DISTRIBUTED';
+ Sybase_reservedwords[187] := 'DO';
+ Sybase_reservedwords[188] := 'DOMAIN';
+ Sybase_reservedwords[189] := 'DOUBLE';
+ Sybase_reservedwords[190] := 'DOWN';
+ Sybase_reservedwords[191] := 'DROP';
+ Sybase_reservedwords[192] := 'DUMMY';
+ Sybase_reservedwords[193] := 'DUMP';
+ Sybase_reservedwords[194] := 'DYNAMIC';
+ Sybase_reservedwords[195] := 'EACH';
+ Sybase_reservedwords[196] := 'EDITPROC';
+ Sybase_reservedwords[197] := 'ELSE';
+ Sybase_reservedwords[198] := 'ELSEIF';
+ Sybase_reservedwords[199] := 'ENABLE';
+ Sybase_reservedwords[200] := 'END';
+ Sybase_reservedwords[201] := 'ENDDATA';
+ Sybase_reservedwords[202] := 'ENDDISPLAY';
+ Sybase_reservedwords[203] := 'ENDEXEC';
+ Sybase_reservedwords[204] := 'END-EXEC';
+ Sybase_reservedwords[205] := 'ENDFORMS';
+ Sybase_reservedwords[206] := 'ENDIF';
+ Sybase_reservedwords[207] := 'ENDLOOP';
+ Sybase_reservedwords[208] := 'ENDSELECT';
+ Sybase_reservedwords[209] := 'ENDWHILE';
+ Sybase_reservedwords[210] := 'EQUALS';
+ Sybase_reservedwords[211] := 'ERASE';
+ Sybase_reservedwords[212] := 'ERRLVL';
+ Sybase_reservedwords[213] := 'ERROREXIT';
+ Sybase_reservedwords[214] := 'ESCAPE';
+ Sybase_reservedwords[215] := 'EVENTS';
+ Sybase_reservedwords[216] := 'EVERY';
+ Sybase_reservedwords[217] := 'EXCEPT';
+ Sybase_reservedwords[218] := 'EXCEPTION';
+ Sybase_reservedwords[219] := 'EXCEPTIONS';
+ Sybase_reservedwords[220] := 'EXCLUDE';
+ Sybase_reservedwords[221] := 'EXCLUDING';
+ Sybase_reservedwords[222] := 'EXCLUSIVE';
+ Sybase_reservedwords[223] := 'EXEC';
+ Sybase_reservedwords[224] := 'EXECUTE';
+ Sybase_reservedwords[225] := 'EXISTS';
+ Sybase_reservedwords[226] := 'EXIT';
+ Sybase_reservedwords[227] := 'EXP';
+ Sybase_reservedwords[228] := 'EXPLAIN';
+ Sybase_reservedwords[229] := 'EXPLICIT';
+ Sybase_reservedwords[230] := 'EXTENT';
+ Sybase_reservedwords[231] := 'EXTERNAL';
+ Sybase_reservedwords[232] := 'EXTERNALLY';
+ Sybase_reservedwords[233] := 'EXTRACT';
+ Sybase_reservedwords[234] := 'FALSE';
+ Sybase_reservedwords[235] := 'FETCH';
+ Sybase_reservedwords[236] := 'FIELD';
+ Sybase_reservedwords[237] := 'FIELDPROC';
+ Sybase_reservedwords[238] := 'FILE';
+ Sybase_reservedwords[239] := 'FILLFACTOR';
+ Sybase_reservedwords[240] := 'FINALIZE';
+ Sybase_reservedwords[241] := 'FINALIZE';
+ Sybase_reservedwords[242] := 'FIRST';
+ Sybase_reservedwords[243] := 'FLOAT';
+ Sybase_reservedwords[244] := 'FLOOR';
+ Sybase_reservedwords[245] := 'FLOPPY';
+ Sybase_reservedwords[246] := 'FLUSH';
+ Sybase_reservedwords[247] := 'FOR';
+ Sybase_reservedwords[248] := 'FORCE';
+ Sybase_reservedwords[249] := 'FOREIGN';
+ Sybase_reservedwords[250] := 'FORMDATA';
+ Sybase_reservedwords[251] := 'FORMINIT';
+ Sybase_reservedwords[252] := 'FORMS';
+ Sybase_reservedwords[253] := 'FORTRAN';
+ Sybase_reservedwords[254] := 'FOUND';
+ Sybase_reservedwords[255] := 'FREE';
+ Sybase_reservedwords[256] := 'FREELIST';
+ Sybase_reservedwords[257] := 'FREELISTS';
+ Sybase_reservedwords[258] := 'FREETEXT';
+ Sybase_reservedwords[259] := 'FREETEXTTABLE';
+ Sybase_reservedwords[260] := 'FROM';
+ Sybase_reservedwords[261] := 'FULL';
+ Sybase_reservedwords[262] := 'FUNCTION';
+ Sybase_reservedwords[263] := 'GENERAL';
+ Sybase_reservedwords[264] := 'GET';
+ Sybase_reservedwords[265] := 'GETCURRENTCONNECTION';
+ Sybase_reservedwords[266] := 'GETFORM';
+ Sybase_reservedwords[267] := 'GETOPER';
+ Sybase_reservedwords[268] := 'GETROW';
+ Sybase_reservedwords[269] := 'GLOBAL';
+ Sybase_reservedwords[270] := 'GO';
+ Sybase_reservedwords[271] := 'GOTO';
+ Sybase_reservedwords[272] := 'GRANT';
+ Sybase_reservedwords[273] := 'GRANTED';
+ Sybase_reservedwords[274] := 'GRAPHIC';
+ Sybase_reservedwords[275] := 'GREATEST';
+ Sybase_reservedwords[276] := 'GROUP';
+ Sybase_reservedwords[277] := 'GROUPING';
+ Sybase_reservedwords[278] := 'GROUPS';
+ Sybase_reservedwords[279] := 'HASH';
+ Sybase_reservedwords[280] := 'HAVING';
+ Sybase_reservedwords[281] := 'HELP';
+ Sybase_reservedwords[282] := 'HELPFILE';
+ Sybase_reservedwords[283] := 'HOLDLOCK';
+ Sybase_reservedwords[284] := 'HOST';
+ Sybase_reservedwords[285] := 'HOUR';
+ Sybase_reservedwords[286] := 'HOURS';
+ Sybase_reservedwords[287] := 'IDENTIFIED';
+ Sybase_reservedwords[288] := 'IDENTITY';
+ Sybase_reservedwords[289] := 'IDENTITYCOL';
+ Sybase_reservedwords[290] := 'IF';
+ Sybase_reservedwords[291] := 'IFNULL';
+ Sybase_reservedwords[292] := 'IGNORE';
+ Sybase_reservedwords[293] := 'IIMESSAGE';
+ Sybase_reservedwords[294] := 'IIPRINTF';
+ Sybase_reservedwords[295] := 'IMMEDIATE';
+ Sybase_reservedwords[296] := 'IMPORT';
+ Sybase_reservedwords[297] := 'IN';
+ Sybase_reservedwords[298] := 'INCLUDE';
+ Sybase_reservedwords[299] := 'INCLUDING';
+ Sybase_reservedwords[300] := 'INCREMENT';
+ Sybase_reservedwords[301] := 'INDEX';
+ Sybase_reservedwords[302] := 'INDEXPAGES';
+ Sybase_reservedwords[303] := 'INDICATOR';
+ Sybase_reservedwords[304] := 'INITCAP';
+ Sybase_reservedwords[305] := 'INITIAL';
+ Sybase_reservedwords[306] := 'INITIALIZE';
+ Sybase_reservedwords[307] := 'INITIALLY';
+ Sybase_reservedwords[308] := 'INITRANS';
+ Sybase_reservedwords[309] := 'INITTABLE';
+ Sybase_reservedwords[310] := 'INNER';
+ Sybase_reservedwords[311] := 'INOUT';
+ Sybase_reservedwords[312] := 'INPUT';
+ Sybase_reservedwords[313] := 'INSENSITIVE';
+ Sybase_reservedwords[314] := 'INSERT';
+ Sybase_reservedwords[315] := 'INSERTROW';
+ Sybase_reservedwords[316] := 'INSTANCE';
+ Sybase_reservedwords[317] := 'INSTR';
+ Sybase_reservedwords[318] := 'INT';
+ Sybase_reservedwords[319] := 'INTEGER';
+ Sybase_reservedwords[320] := 'INTEGRITY';
+ Sybase_reservedwords[321] := 'INTERFACE';
+ Sybase_reservedwords[322] := 'INTERSECT';
+ Sybase_reservedwords[323] := 'INTERVAL';
+ Sybase_reservedwords[324] := 'INTO';
+ Sybase_reservedwords[325] := 'IS';
+ Sybase_reservedwords[326] := 'ISOLATION';
+ Sybase_reservedwords[327] := 'ITERATE';
+ Sybase_reservedwords[328] := 'JOIN';
+ Sybase_reservedwords[329] := 'KEY';
+ Sybase_reservedwords[330] := 'KILL';
+ Sybase_reservedwords[331] := 'LABEL';
+ Sybase_reservedwords[332] := 'LANGUAGE';
+ Sybase_reservedwords[333] := 'LARGE';
+ Sybase_reservedwords[334] := 'LAST';
+ Sybase_reservedwords[335] := 'LATERAL';
+ Sybase_reservedwords[336] := 'LAYER';
+ Sybase_reservedwords[337] := 'LEADING';
+ Sybase_reservedwords[338] := 'LEAST';
+ Sybase_reservedwords[339] := 'LEFT';
+ Sybase_reservedwords[340] := 'LENGTH';
+ Sybase_reservedwords[341] := 'LESS';
+ Sybase_reservedwords[342] := 'LEVEL';
+ Sybase_reservedwords[343] := 'LIKE';
+ Sybase_reservedwords[344] := 'LIMIT';
+ Sybase_reservedwords[345] := 'LINENO';
+ Sybase_reservedwords[346] := 'LINK';
+ Sybase_reservedwords[347] := 'LIST';
+ Sybase_reservedwords[348] := 'LISTS';
+ Sybase_reservedwords[349] := 'LOAD';
+ Sybase_reservedwords[350] := 'LOADTABLE';
+ Sybase_reservedwords[351] := 'LOCAL';
+ Sybase_reservedwords[352] := 'LOCALTIME';
+ Sybase_reservedwords[353] := 'LOCALTIMESTAMP';
+ Sybase_reservedwords[354] := 'LOCATE';
+ Sybase_reservedwords[355] := 'LOCATOR';
+ Sybase_reservedwords[356] := 'LOCK';
+ Sybase_reservedwords[357] := 'LOCKSIZE';
+ Sybase_reservedwords[358] := 'LOG';
+ Sybase_reservedwords[359] := 'LOGFILE';
+ Sybase_reservedwords[360] := 'LONG';
+ Sybase_reservedwords[361] := 'LONGINT';
+ Sybase_reservedwords[362] := 'LOWER';
+ Sybase_reservedwords[363] := 'LPAD';
+ Sybase_reservedwords[364] := 'LTRIM';
+ Sybase_reservedwords[365] := 'LVARBINARY';
+ Sybase_reservedwords[366] := 'LVARCHAR';
+ Sybase_reservedwords[367] := 'MAIN';
+ Sybase_reservedwords[368] := 'MANAGE';
+ Sybase_reservedwords[369] := 'MANUAL';
+ Sybase_reservedwords[370] := 'MAP';
+ Sybase_reservedwords[371] := 'MATCH';
+ Sybase_reservedwords[372] := 'MAX';
+ Sybase_reservedwords[373] := 'MAXDATAFILES';
+ Sybase_reservedwords[374] := 'MAXEXTENTS';
+ Sybase_reservedwords[375] := 'MAXINSTANCES';
+ Sybase_reservedwords[376] := 'MAXLOGFILES';
+ Sybase_reservedwords[377] := 'MAXLOGHISTORY';
+ Sybase_reservedwords[378] := 'MAXLOGMEMBERS';
+ Sybase_reservedwords[379] := 'MAXTRANS';
+ Sybase_reservedwords[380] := 'MAXVALUE';
+ Sybase_reservedwords[381] := 'MENUITEM';
+ Sybase_reservedwords[382] := 'MESSAGE';
+ Sybase_reservedwords[383] := 'MICROSECOND';
+ Sybase_reservedwords[384] := 'MICROSECONDS';
+ Sybase_reservedwords[385] := 'MIN';
+ Sybase_reservedwords[386] := 'MINEXTENTS';
+ Sybase_reservedwords[387] := 'MINUS';
+ Sybase_reservedwords[388] := 'MINUTE';
+ Sybase_reservedwords[389] := 'MINUTES';
+ Sybase_reservedwords[390] := 'MINVALUE';
+ Sybase_reservedwords[391] := 'MIRROREXIT';
+ Sybase_reservedwords[392] := 'MOD';
+ Sybase_reservedwords[393] := 'MODE';
+ Sybase_reservedwords[394] := 'MODIFIES';
+ Sybase_reservedwords[395] := 'MODIFY';
+ Sybase_reservedwords[396] := 'MODULE';
+ Sybase_reservedwords[397] := 'MONEY';
+ Sybase_reservedwords[398] := 'MONTH';
+ Sybase_reservedwords[399] := 'MONTHS';
+ Sybase_reservedwords[400] := 'MOUNT';
+ Sybase_reservedwords[401] := 'MOVE';
+ Sybase_reservedwords[402] := 'NAMED';
+ Sybase_reservedwords[403] := 'NAMES';
+ Sybase_reservedwords[404] := 'NATIONAL';
+ Sybase_reservedwords[405] := 'NATURAL';
+ Sybase_reservedwords[406] := 'NCHAR';
+ Sybase_reservedwords[407] := 'NCLOB';
+ Sybase_reservedwords[408] := 'NEW';
+ Sybase_reservedwords[409] := 'NEXT';
+ Sybase_reservedwords[410] := 'NHEADER';
+ Sybase_reservedwords[411] := 'NO';
+ Sybase_reservedwords[412] := 'NOARCHIVELOG';
+ Sybase_reservedwords[413] := 'NOAUDIT';
+ Sybase_reservedwords[414] := 'NOCACHE';
+ Sybase_reservedwords[415] := 'NOCHECK';
+ Sybase_reservedwords[416] := 'NOCOMPRESS';
+ Sybase_reservedwords[417] := 'NOCYCLE';
+ Sybase_reservedwords[418] := 'NOECHO';
+ Sybase_reservedwords[419] := 'NOMAXVALUE';
+ Sybase_reservedwords[420] := 'NOMINVALUE';
+ Sybase_reservedwords[421] := 'NONCLUSTERED';
+ Sybase_reservedwords[422] := 'NONE';
+ Sybase_reservedwords[423] := 'NOORDER';
+ Sybase_reservedwords[424] := 'NORESETLOGS';
+ Sybase_reservedwords[425] := 'NORMAL';
+ Sybase_reservedwords[426] := 'NOSORT';
+ Sybase_reservedwords[427] := 'NOT';
+ Sybase_reservedwords[428] := 'NOTFOUND';
+ Sybase_reservedwords[429] := 'NOTRIM';
+ Sybase_reservedwords[430] := 'NOWAIT';
+ Sybase_reservedwords[431] := 'NULL';
+ Sybase_reservedwords[432] := 'NULLIF';
+ Sybase_reservedwords[433] := 'NULLVALUE';
+ Sybase_reservedwords[434] := 'NUMBER';
+ Sybase_reservedwords[435] := 'NUMERIC';
+ Sybase_reservedwords[436] := 'NUMPARTS';
+ Sybase_reservedwords[437] := 'NVL';
+ Sybase_reservedwords[438] := 'OBID';
+ Sybase_reservedwords[439] := 'OBJECT';
+ Sybase_reservedwords[440] := 'ODBCINFO';
+ Sybase_reservedwords[441] := 'OF';
+ Sybase_reservedwords[442] := 'OFF';
+ Sybase_reservedwords[443] := 'OFFLINE';
+ Sybase_reservedwords[444] := 'OFFSETS';
+ Sybase_reservedwords[445] := 'OLD';
+ Sybase_reservedwords[446] := 'ON';
+ Sybase_reservedwords[447] := 'ONCE';
+ Sybase_reservedwords[448] := 'ONLINE';
+ Sybase_reservedwords[449] := 'ONLY';
+ Sybase_reservedwords[450] := 'OPEN';
+ Sybase_reservedwords[451] := 'OPENDATASOURCE';
+ Sybase_reservedwords[452] := 'OPENQUERY';
+ Sybase_reservedwords[453] := 'OPENROWSET';
+ Sybase_reservedwords[454] := 'OPERATION';
+ Sybase_reservedwords[455] := 'OPTIMAL';
+ Sybase_reservedwords[456] := 'OPTIMIZE';
+ Sybase_reservedwords[457] := 'OPTION';
+ Sybase_reservedwords[458] := 'OR';
+ Sybase_reservedwords[459] := 'ORDER';
+ Sybase_reservedwords[460] := 'ORDINALITY';
+ Sybase_reservedwords[461] := 'OUT';
+ Sybase_reservedwords[462] := 'OUTER';
+ Sybase_reservedwords[463] := 'OUTPUT';
+ Sybase_reservedwords[464] := 'OVER';
+ Sybase_reservedwords[465] := 'OVERLAPS';
+ Sybase_reservedwords[466] := 'OWN';
+ Sybase_reservedwords[467] := 'PACKAGE';
+ Sybase_reservedwords[468] := 'PAD';
+ Sybase_reservedwords[469] := 'PAGE';
+ Sybase_reservedwords[470] := 'PAGES';
+ Sybase_reservedwords[471] := 'PARALLEL';
+ Sybase_reservedwords[472] := 'PARAMETER';
+ Sybase_reservedwords[473] := 'PARAMETERS';
+ Sybase_reservedwords[474] := 'PART';
+ Sybase_reservedwords[475] := 'PARTIAL';
+ Sybase_reservedwords[476] := 'PASCAL';
+ Sybase_reservedwords[477] := 'PATH';
+ Sybase_reservedwords[478] := 'PCTFREE';
+ Sybase_reservedwords[479] := 'PCTINCREASE';
+ Sybase_reservedwords[480] := 'PCTINDEX';
+ Sybase_reservedwords[481] := 'PCTUSED';
+ Sybase_reservedwords[482] := 'PERCENT';
+ Sybase_reservedwords[483] := 'PERM';
+ Sybase_reservedwords[484] := 'PERMANENT';
+ Sybase_reservedwords[485] := 'PERMIT';
+ Sybase_reservedwords[486] := 'PI';
+ Sybase_reservedwords[487] := 'PIPE';
+ Sybase_reservedwords[488] := 'PLAN';
+ Sybase_reservedwords[489] := 'PLI';
+ Sybase_reservedwords[490] := 'POSITION';
+ Sybase_reservedwords[491] := 'POSTFIX';
+ Sybase_reservedwords[492] := 'POWER';
+ Sybase_reservedwords[493] := 'PRECISION';
+ Sybase_reservedwords[494] := 'PREFIX';
+ Sybase_reservedwords[495] := 'PREORDER';
+ Sybase_reservedwords[496] := 'PREPARE';
+ Sybase_reservedwords[497] := 'PRESERVE';
+ Sybase_reservedwords[498] := 'PRIMARY';
+ Sybase_reservedwords[499] := 'PRINT';
+ Sybase_reservedwords[500] := 'PRINTSCREEN';
+ Sybase_reservedwords[501] := 'PRIOR';
+ Sybase_reservedwords[502] := 'PRIQTY';
+ Sybase_reservedwords[503] := 'PRIVATE';
+ Sybase_reservedwords[504] := 'PRIVILEGES';
+ Sybase_reservedwords[505] := 'PROC';
+ Sybase_reservedwords[506] := 'PROCEDURE';
+ Sybase_reservedwords[507] := 'PROCESSEXIT';
+ Sybase_reservedwords[508] := 'PROFILE';
+ Sybase_reservedwords[509] := 'PROGRAM';
+ Sybase_reservedwords[510] := 'PROMPT';
+ Sybase_reservedwords[511] := 'PUBLIC';
+ Sybase_reservedwords[512] := 'PUTFORM';
+ Sybase_reservedwords[513] := 'PUTOPER';
+ Sybase_reservedwords[514] := 'PUTROW';
+ Sybase_reservedwords[515] := 'QUALIFICATION';
+ Sybase_reservedwords[516] := 'QUARTER';
+ Sybase_reservedwords[517] := 'QUOTA';
+ Sybase_reservedwords[518] := 'RADIANS';
+ Sybase_reservedwords[519] := 'RAISE';
+ Sybase_reservedwords[520] := 'RAISERROR';
+ Sybase_reservedwords[521] := 'RAND';
+ Sybase_reservedwords[522] := 'RANGE';
+ Sybase_reservedwords[523] := 'RAW';
+ Sybase_reservedwords[524] := 'READ';
+ Sybase_reservedwords[525] := 'READS';
+ Sybase_reservedwords[526] := 'READTEXT';
+ Sybase_reservedwords[527] := 'REAL';
+ Sybase_reservedwords[528] := 'RECONFIGURE';
+ Sybase_reservedwords[529] := 'RECORD';
+ Sybase_reservedwords[530] := 'RECOVER';
+ Sybase_reservedwords[531] := 'RECURSIVE';
+ Sybase_reservedwords[532] := 'REDISPLAY';
+ Sybase_reservedwords[533] := 'REF';
+ Sybase_reservedwords[534] := 'REFERENCES';
+ Sybase_reservedwords[535] := 'REFERENCING';
+ Sybase_reservedwords[536] := 'REGISTER';
+ Sybase_reservedwords[537] := 'RELATIVE';
+ Sybase_reservedwords[538] := 'RELEASE';
+ Sybase_reservedwords[539] := 'RELOCATE';
+ Sybase_reservedwords[540] := 'REMOVE';
+ Sybase_reservedwords[541] := 'RENAME';
+ Sybase_reservedwords[542] := 'REPEAT';
+ Sybase_reservedwords[543] := 'REPEATABLE';
+ Sybase_reservedwords[544] := 'REPEATED';
+ Sybase_reservedwords[545] := 'REPLACE';
+ Sybase_reservedwords[546] := 'REPLICATE';
+ Sybase_reservedwords[547] := 'REPLICATION';
+ Sybase_reservedwords[548] := 'RESET';
+ Sybase_reservedwords[549] := 'RESETLOGS';
+ Sybase_reservedwords[550] := 'RESOURCE';
+ Sybase_reservedwords[551] := 'RESTORE';
+ Sybase_reservedwords[552] := 'RESTRICT';
+ Sybase_reservedwords[553] := 'RESTRICTED';
+ Sybase_reservedwords[554] := 'RESULT';
+ Sybase_reservedwords[555] := 'RESUME';
+ Sybase_reservedwords[556] := 'RETRIEVE';
+ Sybase_reservedwords[557] := 'RETURN';
+ Sybase_reservedwords[558] := 'RETURNS';
+ Sybase_reservedwords[559] := 'REUSE';
+ Sybase_reservedwords[560] := 'REVOKE';
+ Sybase_reservedwords[561] := 'RIGHT';
+ Sybase_reservedwords[562] := 'ROLE';
+ Sybase_reservedwords[563] := 'ROLES';
+ Sybase_reservedwords[564] := 'ROLLBACK';
+ Sybase_reservedwords[565] := 'ROLLUP';
+ Sybase_reservedwords[566] := 'ROUTINE';
+ Sybase_reservedwords[567] := 'ROW';
+ Sybase_reservedwords[568] := 'ROWCOUNT';
+ Sybase_reservedwords[569] := 'ROWGUIDCOL';
+ Sybase_reservedwords[570] := 'ROWID';
+ Sybase_reservedwords[571] := 'ROWIDTOCHAR';
+ Sybase_reservedwords[572] := 'ROWLABEL';
+ Sybase_reservedwords[573] := 'ROWNUM';
+ Sybase_reservedwords[574] := 'ROWS';
+ Sybase_reservedwords[575] := 'ROWS';
+ Sybase_reservedwords[576] := 'RPAD';
+ Sybase_reservedwords[577] := 'RRN';
+ Sybase_reservedwords[578] := 'RTRIM';
+ Sybase_reservedwords[579] := 'RULE';
+ Sybase_reservedwords[580] := 'RUN';
+ Sybase_reservedwords[581] := 'RUNTIMESTATISTICS';
+ Sybase_reservedwords[582] := 'SAVE';
+ Sybase_reservedwords[583] := 'SAVEPOINT';
+ Sybase_reservedwords[584] := 'SCHEDULE';
+ Sybase_reservedwords[585] := 'SCHEMA';
+ Sybase_reservedwords[586] := 'SCN';
+ Sybase_reservedwords[587] := 'SCOPE';
+ Sybase_reservedwords[588] := 'SCREEN';
+ Sybase_reservedwords[589] := 'SCROLL';
+ Sybase_reservedwords[590] := 'SCROLLDOWN';
+ Sybase_reservedwords[591] := 'SCROLLUP';
+ Sybase_reservedwords[592] := 'SEARCH';
+ Sybase_reservedwords[593] := 'SECOND';
+ Sybase_reservedwords[594] := 'SECONDS';
+ Sybase_reservedwords[595] := 'SECQTY';
+ Sybase_reservedwords[596] := 'SECTION';
+ Sybase_reservedwords[597] := 'SEGMENT';
+ Sybase_reservedwords[598] := 'SELECT';
+ Sybase_reservedwords[599] := 'SEQUENCE';
+ Sybase_reservedwords[600] := 'SERIALIZABLE';
+ Sybase_reservedwords[601] := 'SERVICE';
+ Sybase_reservedwords[602] := 'SESSION';
+ Sybase_reservedwords[603] := 'SESSION_USER';
+ Sybase_reservedwords[604] := 'SET';
+ Sybase_reservedwords[605] := 'SETS';
+ Sybase_reservedwords[606] := 'SETUSER';
+ Sybase_reservedwords[607] := 'SETUSER';
+ Sybase_reservedwords[608] := 'SHARE';
+ Sybase_reservedwords[609] := 'SHARED';
+ Sybase_reservedwords[610] := 'SHORT';
+ Sybase_reservedwords[611] := 'SHUTDOWN';
+ Sybase_reservedwords[612] := 'SIGN';
+ Sybase_reservedwords[613] := 'SIMPLE';
+ Sybase_reservedwords[614] := 'SIN';
+ Sybase_reservedwords[615] := 'SIZE';
+ Sybase_reservedwords[616] := 'SLEEP';
+ Sybase_reservedwords[617] := 'SMALLINT';
+ Sybase_reservedwords[618] := 'SNAPSHOT';
+ Sybase_reservedwords[619] := 'SOME';
+ Sybase_reservedwords[620] := 'SORT';
+ Sybase_reservedwords[621] := 'SOUNDEX';
+ Sybase_reservedwords[622] := 'SPACE';
+ Sybase_reservedwords[623] := 'SPECIFIC';
+ Sybase_reservedwords[624] := 'SPECIFICTYPE';
+ Sybase_reservedwords[625] := 'SQL';
+ Sybase_reservedwords[626] := 'SQLBUF';
+ Sybase_reservedwords[627] := 'SQLCA';
+ Sybase_reservedwords[628] := 'SQLCODE';
+ Sybase_reservedwords[629] := 'SQLERROR';
+ Sybase_reservedwords[630] := 'SQLEXCEPTION';
+ Sybase_reservedwords[631] := 'SQLSTATE';
+ Sybase_reservedwords[632] := 'SQLWARNING';
+ Sybase_reservedwords[633] := 'SQRT';
+ Sybase_reservedwords[634] := 'START';
+ Sybase_reservedwords[635] := 'STATE';
+ Sybase_reservedwords[636] := 'STATEMENT';
+ Sybase_reservedwords[637] := 'STATIC';
+ Sybase_reservedwords[638] := 'STATISTICS';
+ Sybase_reservedwords[639] := 'STOGROUP';
+ Sybase_reservedwords[640] := 'STOP';
+ Sybase_reservedwords[641] := 'STORAGE';
+ Sybase_reservedwords[642] := 'STORPOOL';
+ Sybase_reservedwords[643] := 'STRUCTURE';
+ Sybase_reservedwords[644] := 'SUBMENU';
+ Sybase_reservedwords[645] := 'SUBPAGES';
+ Sybase_reservedwords[646] := 'SUBSTR';
+ Sybase_reservedwords[647] := 'SUBSTRING';
+ Sybase_reservedwords[648] := 'SUCCESSFUL';
+ Sybase_reservedwords[649] := 'SUFFIX';
+ Sybase_reservedwords[650] := 'SUM';
+ Sybase_reservedwords[651] := 'SUMU';
+ Sybase_reservedwords[652] := 'SWITCH';
+ Sybase_reservedwords[653] := 'SYNONYM';
+ Sybase_reservedwords[654] := 'SYSCAT';
+ Sybase_reservedwords[655] := 'SYSDATE';
+ Sybase_reservedwords[656] := 'SYSFUN';
+ Sybase_reservedwords[657] := 'SYSIBM';
+ Sybase_reservedwords[658] := 'SYSSTAT';
+ Sybase_reservedwords[659] := 'SYSTEM';
+ Sybase_reservedwords[660] := 'SYSTEM_USER';
+ Sybase_reservedwords[661] := 'SYSTIME';
+ Sybase_reservedwords[662] := 'SYSTIMESTAMP';
+ Sybase_reservedwords[663] := 'TABLE';
+ Sybase_reservedwords[664] := 'TABLEDATA';
+ Sybase_reservedwords[665] := 'TABLES';
+ Sybase_reservedwords[666] := 'TABLESPACE';
+ Sybase_reservedwords[667] := 'TAN';
+ Sybase_reservedwords[668] := 'TAPE';
+ Sybase_reservedwords[669] := 'TEMP';
+ Sybase_reservedwords[670] := 'TEMPORARY';
+ Sybase_reservedwords[671] := 'TERMINATE';
+ Sybase_reservedwords[672] := 'TEXTSIZE';
+ Sybase_reservedwords[673] := 'THAN';
+ Sybase_reservedwords[674] := 'THEN';
+ Sybase_reservedwords[675] := 'THREAD';
+ Sybase_reservedwords[676] := 'TIME';
+ Sybase_reservedwords[677] := 'TIMEOUT';
+ Sybase_reservedwords[678] := 'TIMESTAMP';
+ Sybase_reservedwords[679] := 'TIMEZONE_HOUR';
+ Sybase_reservedwords[680] := 'TIMEZONE_MINUTE';
+ Sybase_reservedwords[681] := 'TINYINT';
+ Sybase_reservedwords[682] := 'TO';
+ Sybase_reservedwords[683] := 'TOP';
+ Sybase_reservedwords[684] := 'TPE';
+ Sybase_reservedwords[685] := 'TRACING';
+ Sybase_reservedwords[686] := 'TRAILING';
+ Sybase_reservedwords[687] := 'TRAN';
+ Sybase_reservedwords[688] := 'TRANSACTION';
+ Sybase_reservedwords[689] := 'TRANSLATE';
+ Sybase_reservedwords[690] := 'TRANSLATION';
+ Sybase_reservedwords[691] := 'TREAT';
+ Sybase_reservedwords[692] := 'TRIGGER';
+ Sybase_reservedwords[693] := 'TRIGGERS';
+ Sybase_reservedwords[694] := 'TRIM';
+ Sybase_reservedwords[695] := 'TRUE';
+ Sybase_reservedwords[696] := 'TRUNCATE';
+ Sybase_reservedwords[697] := 'TSEQUAL';
+ Sybase_reservedwords[698] := 'TYPE';
+ Sybase_reservedwords[699] := 'UID';
+ Sybase_reservedwords[700] := 'UNCOMMITTED';
+ Sybase_reservedwords[701] := 'UNDER';
+ Sybase_reservedwords[702] := 'UNION';
+ Sybase_reservedwords[703] := 'UNIQUE';
+ Sybase_reservedwords[704] := 'UNKNOWN';
+ Sybase_reservedwords[705] := 'UNLIMITED';
+ Sybase_reservedwords[706] := 'UNLOADTABLE';
+ Sybase_reservedwords[707] := 'UNNEST';
+ Sybase_reservedwords[708] := 'UNSIGNED';
+ Sybase_reservedwords[709] := 'UNTIL';
+ Sybase_reservedwords[710] := 'UP';
+ Sybase_reservedwords[711] := 'UPDATE';
+ Sybase_reservedwords[712] := 'UPDATETEXT';
+ Sybase_reservedwords[713] := 'UPPER';
+ Sybase_reservedwords[714] := 'USAGE';
+ Sybase_reservedwords[715] := 'USE';
+ Sybase_reservedwords[716] := 'USER';
+ Sybase_reservedwords[717] := 'USING';
+ Sybase_reservedwords[718] := 'UUID';
+ Sybase_reservedwords[719] := 'VALIDATE';
+ Sybase_reservedwords[720] := 'VALIDPROC';
+ Sybase_reservedwords[721] := 'VALIDROW';
+ Sybase_reservedwords[722] := 'VALUE';
+ Sybase_reservedwords[723] := 'VALUES';
+ Sybase_reservedwords[724] := 'VARBINARY';
+ Sybase_reservedwords[725] := 'VARCHAR';
+ Sybase_reservedwords[726] := 'VARIABLE';
+ Sybase_reservedwords[727] := 'VARIABLES';
+ Sybase_reservedwords[728] := 'VARYING';
+ Sybase_reservedwords[729] := 'VCAT';
+ Sybase_reservedwords[730] := 'VERSION';
+ Sybase_reservedwords[731] := 'VIEW';
+ Sybase_reservedwords[732] := 'VOLUMES';
+ Sybase_reservedwords[733] := 'WAITFOR';
+ Sybase_reservedwords[734] := 'WEEK';
+ Sybase_reservedwords[735] := 'WHEN';
+ Sybase_reservedwords[736] := 'WHENEVER';
+ Sybase_reservedwords[737] := 'WHERE';
+ Sybase_reservedwords[738] := 'WHILE';
+ Sybase_reservedwords[739] := 'WITH';
+ Sybase_reservedwords[740] := 'WITHOUT';
+ Sybase_reservedwords[741] := 'WORK';
+ Sybase_reservedwords[742] := 'WRITE';
+ Sybase_reservedwords[743] := 'WRITETEXT';
+ Sybase_reservedwords[744] := 'YEAR';
+ Sybase_reservedwords[745] := 'YEARS';
+ Sybase_reservedwords[746] := 'ZONE';
+end;
+
+initialization
+ Sybase_InitializeReservedWords;
+finalization
+ Sybase_reservedwords := nil;
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAUtils.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAUtils.pas
new file mode 100644
index 0000000..93de6f0
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAUtils.pas
@@ -0,0 +1,259 @@
+unit uDAUtils;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses Classes, DB, SysUtils, uDARes;
+
+const
+ // Directory aliases. DEFINE THEM IN UPPERCASE and do not translate
+ alias_System = '%SYSTEM%';
+ alias_ModuleDir = '%MODULE%';
+ alias_DABinDir = '%DABINDIR%';
+
+type
+ { TDAConnectionStringParser
+ Simple class that provides all the methods to work with Data Abstract connection strings.
+ Connection objects make use of this class in the method ApplyConnectionString. }
+ TDAConnectionStringParser = class
+ private
+ fServer: string;
+ fAuxDriver: string;
+ fPassword: string;
+ fUserID: string;
+ fDriverID: string;
+ fAuxParams: TStringList;
+ fDatabase: string;
+
+ function GetAuxParamNames(Index: integer): string;
+ function GetAuxParamsCount: integer;
+ function GetAuxParams(const Name: string): string;
+ procedure SetAuxParams(const Name, Value: string);
+ function GetAuxParamsString: string;
+
+ protected
+ public
+ constructor Create(const aConnectionString: string = '');
+ destructor Destroy; override;
+
+ procedure Clear;
+
+ class function ExtractDriverID(const aConnectionString: string): string;
+
+ procedure Parse(const aConnectionString: string);
+ function BuildString: string;
+
+ property DriverID: string read fDriverID write fDriverID;
+ property Server: string read fServer write fServer;
+ property Database: string read fDatabase write fDatabase;
+ property UserID: string read fUserID write fUserID;
+ property Password: string read fPassword write fPassword;
+ property AuxDriver: string read fAuxDriver write fAuxDriver;
+
+ property AuxParams[const Name: string]: string read GetAuxParams write SetAuxParams;
+ property AuxParamNames[Index: integer]: string read GetAuxParamNames;
+ property AuxParamsCount: integer read GetAuxParamsCount;
+ property AuxParamsString: string read GetAuxParamsString;
+ end;
+
+// Misc
+function TranslateFileName(const aFileName: string): string;
+function GetSystemDir: string;
+function GetModulePath: string;
+
+{$IFDEF FPC}
+type
+ IProviderSupport = interface
+ procedure PSExecute;
+ function PSGetParams: TParams;
+ end;
+{$ENDIF}
+function GetProviderSupport(aDataset: TDataset): IProviderSupport;
+
+implementation
+
+uses
+ {$IFDEF MSWINDOWS}Windows, {$ENDIF}
+ TypInfo, uROClasses;
+
+// Misc
+
+function TranslateFileName(const aFileName: string): string;
+var
+ i: integer;
+begin
+ result := aFileName;
+ i := Pos(alias_System, UpperCase(aFileName));
+ if (i > 0) then begin
+ Delete(result, i, Length(alias_System));
+ Insert(GetSystemDir, result, i);
+ end;
+
+ i := Pos(alias_ModuleDir, UpperCase(aFileName));
+ if (i > 0) then begin
+ Delete(result, i, Length(alias_ModuleDir));
+ Insert(GetModulePath, result, i);
+ end;
+end;
+
+function GetSystemDir: string;
+{$IFDEF MSWINDOWS}
+var
+ osdir: array[0..MAX_PATH] of char;
+ {$ENDIF}
+begin
+ {$IFDEF MSWINDOWS}
+ GetSystemDirectory(osdir, SizeOf(osdir));
+ result := ExcludeTrailingPathDelimiter(osdir);
+ {$ELSE}
+ Result := '';
+ RaiseError(err_NotSupported);
+ {$ENDIF}
+end;
+
+function GetModulePath: string;
+begin
+ result := ExcludeTrailingPathDelimiter(ExtractFilePath({$IFDEF FPC}ParamStr(0){$ELSE}GetModuleName(hInstance){$ENDIF}));
+end;
+
+function GetProviderSupport(aDataset: TDataset): IProviderSupport;
+begin
+ {$IFDEF DELPHI7UP}
+ result := aDataset as IProviderSupport;
+ {$ELSE}{$IFNDEF FPC}
+ result := IProviderSupport(aDataset);
+ {$ELSE}
+ result:=nil;
+ {$ENDIF}{$ENDIF}
+end;
+
+{ TDAConnectionStringParser }
+
+constructor TDAConnectionStringParser.Create(const aConnectionString: string = '');
+begin
+ inherited Create;
+
+ fAuxParams := TStringList.Create;
+ {fAuxParams.Duplicates := dupError;
+ fAuxParams.Sorted := TRUE;}
+
+ if (aConnectionString <> '') then Parse(aConnectionString);
+end;
+
+destructor TDAConnectionStringParser.Destroy;
+begin
+ fAuxParams.Free;
+
+ inherited;
+end;
+
+procedure TDAConnectionStringParser.Clear;
+begin
+ fServer := '';
+ fDatabase := '';
+ fAuxDriver := '';
+ fPassword := '';
+ fUserID := '';
+ fDriverID := '';
+ fAuxParams.Clear;
+end;
+
+procedure TDAConnectionStringParser.Parse(const aConnectionString: string);
+var
+ pars: IROStrings;
+ i: integer;
+ str: string;
+begin
+ Clear;
+
+ // ADO?Server=127.0.0.1;UserID=sa;Password=lemmein;AuxDriver=SQLOLEDB.1;Params1=abc;Param2=CDE
+ str := Trim(aConnectionString);
+
+ // Extracts the driver name
+ fDriverID := ExtractDriverID(str);
+ Delete(str, 1, Pos(ds_Separator, str));
+
+ // Extracts the rest of the parameters
+ pars := ListStringElements(str);
+
+ fAuxDriver := pars.ExtractValue(ds_AuxDriver);
+ fDatabase := pars.ExtractValue(ds_Database);
+ fUserID := pars.ExtractValue(ds_UserID);
+ fPassword := pars.ExtractValue(ds_Password);
+ fServer := pars.ExtractValue(ds_Server);
+
+ for i := 0 to (pars.Count - 1) do
+ AuxParams[pars.Names[i]] := pars.Values[pars.Names[i]];
+end;
+
+function TDAConnectionStringParser.GetAuxParamNames(
+ Index: integer): string;
+begin
+ result := fAuxParams.Names[Index]
+end;
+
+function TDAConnectionStringParser.GetAuxParamsCount: integer;
+begin
+ result := fAuxParams.Count
+end;
+
+function TDAConnectionStringParser.GetAuxParams(
+ const Name: string): string;
+begin
+ result := fAuxParams.Values[Name]
+end;
+
+procedure TDAConnectionStringParser.SetAuxParams(const Name,
+ Value: string);
+begin
+ fAuxParams.Values[Name] := Value
+end;
+
+function TDAConnectionStringParser.BuildString: string;
+var
+ i: integer;
+begin
+ result := fDriverID + ds_Separator;
+
+ if (fAuxDriver <> '') then result := result + ds_AuxDriver + '=' + fAuxDriver+';';
+ if (fDatabase <> '') then result := result + ds_Database + '=' + fDatabase+';';
+ if (fUserID <> '') then result := result + ds_UserID + '=' + fUserID+';';
+ if (fPassword <> '') then result := result + ds_Password + '=' + fPassword+';';
+ if (fServer <> '') then result := result + ds_Server + '=' + fServer+';';
+
+ for i := 0 to (fAuxParams.Count - 1) do
+ result := result + fAuxParams.Names[i] + '=' + fAuxParams.Values[fAuxParams.Names[i]]+';';
+end;
+
+class function TDAConnectionStringParser.ExtractDriverID(
+ const aConnectionString: string): string;
+var
+ str: string;
+begin
+ str := Trim(aConnectionString);
+ result := Trim(Copy(str, 1, Pos(ds_Separator, str) - 1));
+end;
+
+function TDAConnectionStringParser.GetAuxParamsString: string;
+var
+ i: integer;
+begin
+ result := '';
+ for i := 0 to (AuxParamsCount - 1) do
+ result := result + AuxParamNames[i] + '=' + AuxParams[AuxParamNames[i]] +';';
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAWhere.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAWhere.pas
new file mode 100644
index 0000000..20b5fc4
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAWhere.pas
@@ -0,0 +1,1296 @@
+unit uDAWhere;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ SysUtils, Classes, uDAInterfaces, DateUtils, uROBinaryHelpers,
+ uROCompression, uROXMLIntf, uROClientIntf, FMTBcd;
+
+type
+ TDABinaryExpression = class(TDAWhereExpression)
+ private
+ fLeft,
+ fRight: TDAWhereExpression;
+ fOperator: TDABinaryOperator;
+ public
+ constructor Create(aLeft, aRight: TDAWhereExpression; anOp: TDABinaryOperator); overload;
+ destructor Destroy; override;
+
+ property Left: TDAWhereExpression read fLeft write fLeft;
+ property Right: TDAWhereExpression read fRight write fRight;
+ property Operator: TDABinaryOperator read fOperator write fOperator;
+
+ procedure ReadFromXml(xr: IXmlNode); override;
+ procedure WriteToXml(sw: IXmlNode); override;
+ procedure Validate; override;
+ end;
+
+ TDAUnaryExpression = class(TDAWhereExpression)
+ private
+ fExpression: TDAWhereExpression;
+ fOperator: TDAUnaryOperator;
+ public
+ constructor Create(anExpression: TDAWhereExpression; anOp: TDAUnaryOperator); overload;
+
+ destructor Destroy; override;
+
+ property Expression: TDAWhereExpression read fExpression write fExpression;
+ property Operator: TDAUnaryOperator read fOperator write fOperator;
+
+ procedure ReadFromXml(xr: IXmlNode); override;
+ procedure WriteToXml(sw: IXmlNode); override;
+ procedure Validate; override;
+ end;
+
+ TDAConstantExpression = class(TDAWhereExpression)
+ private
+ fType: TDADataType;
+ fValue: Variant;
+ procedure SetValue(const Value: Variant);
+ public
+ class function SerializeObject(const v: Variant; dt: TDADataType): Unicodestring;
+ class function DeserializeObject(const s: Unicodestring; dt: TDADataType): Variant;
+
+ constructor Create(const aValue: Variant); overload;
+ constructor Create(const aValue: Variant; aType: TDADataType); overload;
+
+ property aType: TDADataType read fType write fType;
+ property Value: Variant read fValue write SetValue;
+
+ procedure ReadFromXml(xr: IXmlNode); override;
+ procedure WriteToXml(sw: IXmlNode); override;
+ end;
+
+ TDAListExpression = class(TDAWhereExpression)
+ private
+ FItems: TList;
+ function GetItem(idx: Integer): TDAWhereExpression;
+ procedure SetItem(idx: Integer; aValue: TDAWhereExpression);
+ function GetCount: Integer;
+ public
+ constructor Create(const aValues: array of TDAWhereExpression); overload;
+ constructor Create; overload;
+
+ destructor Destroy; override;
+
+ property Count: Integer read GetCount;
+ property Item[idx: Integer]: TDAWhereExpression read getItem write setItem; default;
+
+ procedure Add(aValue: TDAWhereExpression);
+ procedure Delete(index: Integer);
+ procedure Remove(aValue: TDAWhereExpression);
+ procedure Insert(Position: Integer; aValue: TDAWhereExpression);
+
+ procedure ReadFromXml(xr: IXmlNode); override;
+ procedure WriteToXml(sw: IXmlNode); override;
+ procedure Validate; override;
+ end;
+
+ TDAParameterExpression = class(TDAWhereExpression)
+ private
+ fParameterName: string;
+ public
+ constructor Create(const aParameterName: string); overload;
+
+ property ParameterName: string read fParameterName write fParameterName;
+
+ procedure ReadFromXml(xr: IXmlNode); override;
+ procedure WriteToXml(sw: IXmlNode); override;
+ procedure Validate; override;
+ end;
+
+ TDAFieldExpression = class(TDAWhereExpression)
+ private
+ fFieldName: string;
+ fTableName: string;
+ public
+ constructor Create(const aTableName, aFieldName: string); overload;
+
+ property TableName: string read fTableName write fTableName;
+ property FieldName: string read fFieldName write fFieldName;
+
+ procedure ReadFromXml(xr: IXmlNode); override;
+ procedure WriteToXml(sw: IXmlNode); override;
+ procedure Validate; override;
+ end;
+
+ TDANullExpression = class(TDAWhereExpression)
+ public
+ procedure ReadFromXml(xr: IXmlNode); override;
+ procedure WriteToXml(sw: IXmlNode); override;
+ end;
+
+ TDAMacroExpression = class(TDAWhereExpression)
+ private
+ FItems: TList;
+ fName: string;
+ function GetItem(idx: Integer): TDAWhereExpression;
+ procedure SetItem(idx: Integer; aValue: TDAWhereExpression);
+ function GetCount: Integer;
+ public
+ constructor Create; overload;
+ constructor Create(const aName: string); overload;
+ constructor Create(const aName: string; const aValues: array of TDAWhereExpression); overload;
+
+ destructor Destroy; override;
+
+ property Name: string read fName write fName;
+
+ property Count: Integer read GetCount;
+ property Item[idx: Integer]: TDAWhereExpression read GetItem write SetItem; default;
+
+ procedure Add(aValue: TDAWhereExpression);
+ procedure Delete(index: Integer);
+ procedure Remove(aValue: TDAWhereExpression);
+ procedure Insert(Position: Integer; aValue: TDAWhereExpression);
+
+ procedure ReadFromXml(xr: IXmlNode); override;
+ procedure WriteToXml(sw: IXmlNode); override;
+ procedure Validate; override;
+ end;
+
+ TDASelectWhereBuilder = class;
+ TDASelectWhereItem = class(TObject) // abstract
+ private
+ fOwner: TDASelectWhereBuilder;
+ public
+ constructor Create(anOwner: TDASelectWhereBuilder);
+
+ property Owner: TDASelectWhereBuilder read fOwner;
+
+ procedure ReadFromXml(xr: IXmlNode); virtual; abstract;
+ procedure WriteToXml(sw: IXmlNode); virtual; abstract;
+ end;
+
+ TDASelectWhereField = class(TDASelectWhereItem)
+ private
+ fAlias, fFieldName: string;
+ public
+ constructor Create(anOwner: TDASelectWhereBuilder); overload;
+ constructor Create(anOwner: TDASelectWhereBuilder; const aFieldName: String); overload;
+ constructor Create(anOwner: TDASelectWhereBuilder; const aFieldName, anAlias: string); overload;
+
+ property FieldName: string read fFieldName write fFieldName;
+ property Alias: string read fAlias write fAlias;
+
+ procedure ReadFromXml(xr: IXmlNode); override;
+ procedure WriteToXml(sw: IXmlNode); override;
+ end;
+
+ TDASelectWhereBuilder = class(TDAWhereBuilder)
+ private
+ fFields: TList;
+ fTableName: string;
+ function GetCount: Integer;
+ function GetItem(i: Integer): TDASelectWhereItem;
+ protected
+ function ReadFromXml(xr: IXmlNode):TDAWhereExpression; override;
+ procedure WriteToXml(sw: IXmlNode; const aExpression: TDAWhereExpression); override;
+ public
+ constructor Create;
+ destructor Destroy; override;
+
+
+ property TableName: string read fTableName write fTableName;
+ property Fields[i: Integer]: TDASelectWhereItem read GetItem;
+ property FieldCount: Integer read GetCount;
+
+ function AddField(aField: TDASelectWhereItem): Integer;
+ procedure DeleteField(index: Integer);
+ end;
+
+
+function CreateWhereExpression(AName: string): TDAWhereExpression;
+
+type
+ TWhereFieldsArray = array of string;
+
+function Where_ExtractFieldNames(const AWhereExpression: TDAWhereExpression): TWhereFieldsArray;
+function Where_RemapFieldNames(const aXML: UnicodeString; aMappings: TDAColumnMappingCollection; aTargetTableName: String): UnicodeString;
+function ProcessDAWhereForUnions(aSourceTableID: Integer; var aDAWhereString: UnicodeString): Boolean;
+procedure Where_RemapTableNames(aExpression: TDAWhereExpression; const AOldTableName, aNewTableName: string);
+function Where_RemapTableNamesForUnions(const aXML: UnicodeString; const AOldTableName, aNewTableName: string): UnicodeString;
+procedure Where_CreateParameters(aExpression: TDAWhereExpression; AParams: TDAParamCollection);
+implementation
+
+uses Variants, TypInfo, uROClasses, uDAClasses;
+
+procedure Where_RemapTableNames(aExpression: TDAWhereExpression; const AOldTableName, aNewTableName: string);
+var
+ i: integer;
+begin
+ if aExpression = nil then Exit;
+ if aExpression is TDABinaryExpression then begin
+ Where_RemapTableNames(TDABinaryExpression(aExpression).Left,AOldTableName, aNewTableName);
+ Where_RemapTableNames(TDABinaryExpression(aExpression).Right,AOldTableName, aNewTableName);
+ end
+ else if aExpression is TDAUnaryExpression then begin
+ Where_RemapTableNames(TDAUnaryExpression(aExpression).Expression,AOldTableName, aNewTableName);
+ end
+ else if aExpression is TDAListExpression then begin
+ with TDAListExpression(aExpression) do
+ for i := 0 to Count - 1 do
+ Where_RemapTableNames(Item[i], AOldTableName, aNewTableName);
+ end
+ else if aExpression is TDAFieldExpression then begin
+ with TDAFieldExpression(AExpression) do begin
+ if TableName = AOldTableName then TableName := aNewTableName;
+ end;
+ end;
+end;
+
+function Where_RemapTableNamesForUnions(const aXML: UnicodeString; const AOldTableName, aNewTableName: string): UnicodeString;
+begin
+ Result := '';
+ if aXML <> '' then
+ with TDAWhereBuilder.Create do try
+ Xml := aXML;
+ Where_RemapTableNames(Expression,AOldTableName,aNewTableName);
+ Result := Xml;
+ finally
+ free;
+ end;
+end;
+
+function Where_ExtractFieldNames(const AWhereExpression: TDAWhereExpression): TWhereFieldsArray;
+
+ procedure ProcessExpression(aExpression: TDAWhereExpression);
+ var
+ i: integer;
+ begin
+ if aExpression = nil then Exit;
+ if aExpression is TDABinaryExpression then begin
+ ProcessExpression(TDABinaryExpression(aExpression).fLeft);
+ ProcessExpression(TDABinaryExpression(aExpression).fRight);
+ end
+ else if aExpression is TDAUnaryExpression then begin
+ ProcessExpression(TDAUnaryExpression(aExpression).Expression);
+ end
+ else if aExpression is TDAListExpression then begin
+ with TDAListExpression(aExpression) do
+ for i := 0 to Count - 1 do
+ ProcessExpression(Item[i]);
+ end
+ else if aExpression is TDAFieldExpression then begin
+ SetLength(Result,Length(Result)+1);
+ with TDAFieldExpression(AExpression) do begin
+ //Result[High(Result)]:=TableName +'.'+ FieldName;
+ Result[High(Result)]:=FieldName;
+ end;
+ end;
+ end;
+
+begin
+ SetLength(Result,0);
+ ProcessExpression(AWhereExpression);
+end;
+
+function Where_RemapFieldNames(const aXML: UnicodeString; aMappings: TDAColumnMappingCollection; aTargetTableName: String): UnicodeString;
+
+ procedure ProcessExpression(aExpression: TDAWhereExpression);
+ var
+ i: integer;
+ lMapping : TDAColumnMapping;
+ begin
+ if aExpression = nil then Exit;
+ if aExpression is TDABinaryExpression then begin
+ ProcessExpression(TDABinaryExpression(aExpression).fLeft);
+ ProcessExpression(TDABinaryExpression(aExpression).fRight);
+ end
+ else if aExpression is TDAUnaryExpression then begin
+ ProcessExpression(TDAUnaryExpression(aExpression).Expression);
+ end
+ else if aExpression is TDAListExpression then begin
+ with TDAListExpression(aExpression) do
+ for i := 0 to Count - 1 do
+ ProcessExpression(Item[i]);
+ end
+ else if aExpression is TDAFieldExpression then begin
+ SetLength(Result,Length(Result)+1);
+ with TDAFieldExpression(AExpression) do begin
+ TableName := aTargetTableName;
+ lMapping := aMappings.FindMappingByDatasetField(FieldName);
+ if (assigned(lMapping)) then FieldName := lMapping.TableField;
+ end;
+ end;
+ end;
+
+begin
+ SetLength(Result,0);
+ if aXML <> '' then
+ with TDAWhereBuilder.Create do try
+ Xml:=aXML;
+ ProcessExpression(Expression);
+ result := Xml;
+ finally
+ free;
+ end;
+end;
+
+function CreateWhereExpression(AName: string): TDAWhereExpression;
+begin
+ if AName = 'binaryoperation' then
+ Result := TDABinaryExpression.Create
+ else if AName = 'unaryoperation' then
+ Result := TDAUnaryExpression.Create
+ else if AName = 'constant' then
+ Result := TDAConstantExpression.Create
+ else if AName = 'list' then
+ Result := TDAListExpression.Create
+ else if AName = 'parameter' then
+ Result := TDAParameterExpression.Create
+ else if AName = 'field' then
+ Result := TDAFieldExpression.Create
+ else if AName = 'null' then
+ Result := TDANullExpression.Create
+ else if AName = 'macro' then
+ Result := TDAMacroExpression.Create
+ else
+ raise Exception.Create('Unknown element type: '+AName);
+end;
+
+{ TDABinaryExpression }
+
+constructor TDABinaryExpression.Create(aLeft,aRight: TDAWhereExpression; anOp: TDABinaryOperator);
+begin
+ inherited Create;
+ fLeft := aLeft;
+ fRight := aRight;
+ fOperator := anOp;
+end;
+
+destructor TDABinaryExpression.Destroy;
+begin
+ fLeft.Free;
+ fRight.Free;
+ inherited Destroy;
+end;
+
+procedure TDABinaryExpression.ReadFromXml(xr: IXmlNode);
+begin
+ fOperator := TDABinaryOperator(GetEnumValue(typeinfo(TDABinaryOperator), 'dbo'+xr.GetAttributeValue('operator', 'Addition')));
+ FreeAndNil(fLeft);
+ FreeAndNil(fRight);
+ Left := TDAWhereExpression.ParseExpression(xr.FirstChild);
+ Right := TDAWhereExpression.ParseExpression(xr.FirstChild.NextSibling);
+end;
+
+procedure TDABinaryExpression.Validate;
+begin
+ inherited;
+ if Left = nil then raise Exception.Create('TDABinaryExpression.Left must be assigned.');
+ Left.Validate;
+ if Right = nil then raise Exception.Create('TDABinaryExpression.Right must be assigned.');
+ Right.Validate;
+end;
+
+procedure TDABinaryExpression.WriteToXml(sw: IXmlNode);
+var
+ lNode: IXMLNode;
+begin
+ lNode := sw.Add('binaryoperation');
+ lNode.AddAttribute('operator', Copy(GetEnumName(typeinfo(TDABinaryOperator), ord(fOperator)), 4, MaxInt));
+ if Left <> nil then Left.WriteToXml(lNode);
+ if Right <> nil then Right.WriteToXml(lNode);
+end;
+
+{ TDAUnaryExpression }
+
+constructor TDAUnaryExpression.Create(anExpression: TDAWhereExpression; anOp: TDAUnaryOperator);
+begin
+ inherited Create;
+ fExpression := anExpression;
+ fOperator := anOp;
+end;
+
+destructor TDAUnaryExpression.Destroy;
+begin
+ fExpression.Free;
+ inherited;
+end;
+
+procedure TDAUnaryExpression.ReadFromXml(xr: IXmlNode);
+begin
+ FreeAndNil(fExpression);
+ fOperator := TDAUnaryOperator(GetEnumValue(typeinfo(TDAUnaryOperator), 'duo'+xr.GetAttributeValue('operator', 'Not')));
+ fExpression := TDAWhereExpression.ParseExpression(xr.FirstChild);
+end;
+
+procedure TDAUnaryExpression.Validate;
+begin
+ inherited;
+ if Expression = nil then raise Exception.Create('TDAUnaryExpression.Expression must be assigned.');
+ Expression.Validate;
+end;
+
+procedure TDAUnaryExpression.WriteToXml(sw: IXmlNode);
+var
+ lNode: IXMLNode;
+begin
+ lNode := sw.Add('unaryoperation');
+ lNode.AddAttribute('operator', Copy(GetEnumName(typeinfo(TDAUnaryOperator), ord(fOperator)), 4, MaxInt));
+ if fExpression <> nil then fExpression.WriteToXml(lNode);
+end;
+
+{ TDAConstantExpression }
+
+constructor TDAConstantExpression.Create(const aValue: Variant);
+begin
+ inherited Create;
+ Value := aValue;
+end;
+
+constructor TDAConstantExpression.Create(const aValue: Variant; aType: TDADataType);
+begin
+ Create(aValue);
+ fType := aType;
+end;
+
+function GetVariantBase64(s: string): Variant;
+var ss: TStringStream;
+ binstream : TMemoryStream;
+begin
+ binstream := TMemoryStream.Create;
+ ss := TStringStream.Create(s);
+
+ try
+
+ DecodeStream(ss, binstream);
+ binstream.Position := 0;
+
+ Result := ReadVariantFromBinary(binstream);
+ finally
+ FreeAndNIL(ss);
+ FreeAndNIL(binstream);
+ end;
+end;
+
+class function TDAConstantExpression.DeserializeObject(const s: Unicodestring;
+ dt: TDADataType): Variant;
+var
+ lTemp: Currency;
+ c: Integer;
+ lTemp2: Double;
+ lTemp3: Single;
+begin
+ case dt of
+ datGuid: if copy(s,1,1) <> '{' then result := '{'+s+'}' else result := s;
+ datXml: result := s;
+ datDecimal: result := BCDToVariant(StrToBcd(StringReplace(s, '.', DecimalSeparator, [])));
+ datSingleFloat:
+ begin
+ Val(s, lTemp3, c);
+ Result := lTemp3;
+ end;
+ datLargeAutoInc,
+ datCardinal,
+ datLargeUInt,
+ datLargeInt: Result := StrToInt64(s);
+ datBoolean: result := Lowercase(S) = 'true';
+ datAutoInc,
+ datByte,
+ datShortInt,
+ datWord,
+ datSmallInt,
+ datInteger: Result := STrToInt(S);
+ datBlob: Result := GetVariantBase64(s);
+ datCurrency:
+ begin
+ Int64((@lTemp)^) := StrToInt64(s);
+ Result := lTemp;
+ end;
+ datDateTime: Result := UnixToDateTime(StrToInt64(s));
+ datFloat:
+ begin
+ Val(s, lTemp2, c);
+ Result := lTemp2;
+ end;
+{
+ DataType.Memo: ;
+ DataType.String: ;
+ DataType.Unknown: ;
+ DataType.WideMemo: ;
+ DataType.WideString: ;
+ }
+ else
+ Result := s;
+ end;
+end;
+
+function GetBase64Variant(v: Variant): string;
+var ss: TStringStream;
+ binstream : TMemoryStream;
+begin
+ binstream := TMemoryStream.Create;
+ ss := TStringStream.Create('');
+
+ try
+ WriteVariantToBinary(v, binstream);
+ binstream.Position := 0;
+
+ EncodeStream(binstream, ss);
+ result := ss.DataString;
+ finally
+ FreeAndNIL(ss);
+ FreeAndNIL(binstream);
+ end;
+end;
+
+class function TDAConstantExpression.SerializeObject(const v: Variant;
+ dt: TDADataType): Unicodestring;
+var
+ lTemp: Int64;
+begin
+ case dt of
+ datBoolean: if v then Result := 'True' else Result := 'False';
+ datGuid: begin Result := v; if Copy(Result, 1,1) = '{' then Result := Copy(Result, 2, Length(Result) -2); end;
+ datXml: result := v;
+ datDecimal: Result := StringReplace(BcdToStr(VariantToBCD(v)), DecimalSeparator, '.', []);
+ datSingleFloat: Result:= FloatToStr(Single(V)); //Str(Single(v), Result);
+
+ datLargeAutoInc,
+ datByte,
+ datShortInt,
+ datWord,
+ datSmallInt,
+ datCardinal,
+ datLargeUInt,
+ datLargeInt,
+ datAutoInc,
+ datInteger: begin
+ lTemp := v;
+ Result := IntTostr(lTemp);
+ end;
+ datBlob:
+ begin
+ Result := GetBase64Variant(v);
+ end;
+ datCurrency:
+ begin
+ Currency((@lTemp)^) := Currency(v);
+ Result := IntToStr(lTemp)
+ end;
+ datDateTime: Result := IntToStr(DateTimeToUnix(v));
+ datFloat: Result:= FloatToStr(Double(V)); //Str(Double(v), Result); // System.Str always emits .
+{
+ DataType.Memo: ;
+ DataType.String: ;
+ DataType.Unknown: ;
+ DataType.WideMemo: ;
+ DataType.WideString: ;
+}
+ else
+ Result := v;
+ end;
+end;
+
+procedure TDAConstantExpression.ReadFromXml(xr: IXmlNode);
+var
+ s: string;
+begin
+ s := xr.GetAttributeValue('type', '');
+ if s <> '' then begin
+ s := 'dat' + s;
+ fType := TDADataType(GetEnumValue(typeinfo(TDADataType), s));
+ end;
+ if xr.GetAttributeValue('null', '0') = '1' then begin
+ fValue := null;
+ end else begin
+ fValue := DeserializeObject(xr.Value, fType);
+ end;
+end;
+
+procedure TDAConstantExpression.WriteToXml(sw: IXmlNode);
+var
+ lNode: IXMLNode;
+begin
+ lNode := sw.Add('constant');
+ lNode.AddAttribute('type', Copy(GetEnumName(typeinfo(TDADataType), ord(fType)), 4, MaxInt));
+ if VarIsNull(fValue) or VarIsError(fValue) then
+ lNode.AddAttribute('null', '1')
+ else begin
+ lNode.AddAttribute('null', '0');
+ LNode.Value := SerializeObject(fValue, fType);
+ end;
+end;
+
+procedure TDAConstantExpression.SetValue(const Value: Variant);
+var
+ d: TDecimal;
+begin
+ if not ROVariantsEqual(fValue,Value) then begin
+ fValue := Value;
+ case VarType(fValue) of
+ varSmallint: fType := datSmallInt;
+ varInteger: fType := datInteger;
+ varSingle: fType := datSingleFloat;
+ varDouble: fType := datFloat;
+ varCurrency: fType := datCurrency;
+ varDate: fType := datDateTime;
+ varUString,
+ varOleStr: fType := datWideString;
+ //varDispatch:
+ //varError:
+ varBoolean: fType := datBoolean;
+ //varVariant:
+ //varUnknown:
+ varShortInt: fType := datShortInt;
+ varByte: fType := datByte;
+ varWord: fType := datWord;
+ varLongWord: fType := datCardinal;
+ varInt64: fType := datLargeInt;
+ //varStrArg:
+ varString: fType := datString;
+ //varAny:
+ //varTypeMask:
+ //varByRef:
+ //: fType := datGuid;
+ //: fType := datXml;
+ //: fType := datDecimal;
+ //: fType := datLargeAutoInc;
+ //: fType := datLargeUInt;
+ //: fType := datAutoInc;
+ //: fType := datMemo;
+ //: fType := datWideMemo;
+ else
+ if fValue = varArray or varByte then begin
+ if VarByteArrayToDecimal(fValue,d) then
+ fType:= datDecimal
+ else
+ fType := datBlob;
+ end
+ else begin
+ fType:= datUnknown;
+ end;
+ end;
+ end;
+end;
+
+{ TDAListExpression }
+
+procedure TDAListExpression.Add(aValue: TDAWhereExpression);
+begin
+ FItems.Add(aValue);
+end;
+
+constructor TDAListExpression.Create(const aValues: array of TDAWhereExpression);
+var
+ i: Integer;
+begin
+ Create;
+ for i := 0 to Length(aValues) -1 do
+ Add(aValues[i]);
+end;
+
+constructor TDAListExpression.Create;
+begin
+ inherited Create;
+ FItems := TList.Create;
+end;
+
+function TDAListExpression.GetCount: Integer;
+begin
+ Result := FItems.Count;
+end;
+
+function TDAListExpression.GetItem(idx: Integer): TDAWhereExpression;
+begin
+ Result := TDAWhereExpression(fItems[idx]);
+end;
+
+procedure TDAListExpression.Insert(Position: Integer;
+ aValue: TDAWhereExpression);
+begin
+ fItems.Insert(Position, aValue);
+end;
+
+procedure TDAListExpression.ReadFromXml(xr: IXmlNode);
+var
+ i: Integer;
+ el: IXMLNode;
+begin
+ for i := 0 to xr.ChildrenCount -1 do begin
+ el := xr.Children[i];
+ Add(TDAWhereExpression.ParseExpression(el));
+ end;
+end;
+
+procedure TDAListExpression.WriteToXml(sw: IXmlNode);
+var
+ i: Integer;
+ el: IXMLNode;
+begin
+ el := sw.Add('list');
+ for i := 0 to Count -1 do begin
+ Item[i].WriteToXml(el);
+ end;
+end;
+
+procedure TDAListExpression.Remove(aValue: TDAWhereExpression);
+var
+ lIndex: Integer;
+begin
+ lIndex := FItems.IndexOf(aValue);
+ if lIndex <> -1 then
+ Delete(lIndex);
+end;
+
+procedure TDAListExpression.Delete(index: Integer);
+begin
+ TObject(FItems[index]).Free;
+ fItems.Delete(index);
+end;
+
+procedure TDAListExpression.SetItem(idx: Integer;
+ aValue: TDAWhereExpression);
+begin
+ fItems[idx] := aValue;
+end;
+
+destructor TDAListExpression.Destroy;
+var
+ i: Integer;
+begin
+ for i := fItems.Count -1 downto 0 do
+ TDAWhereExpression(fItems[i]).Free;
+ fItems.Free;
+ inherited Destroy;
+end;
+
+procedure TDAListExpression.Validate;
+var
+ i: Integer;
+begin
+ inherited;
+ for i:=0 to Count-1 do begin
+ if Item[i] = nil then raise Exception.CreateFmt('TDAListExpression.Item[%d] must be assigned.',[i]);
+ Item[i].Validate;
+ end;
+end;
+
+{ TDAParameterExpression }
+
+constructor TDAParameterExpression.Create(const aParameterName: string);
+begin
+ inherited Create;
+ fParameterName := aParameterName;
+end;
+
+procedure TDAParameterExpression.ReadFromXml(xr: IXmlNode);
+begin
+ fParameterName := xr.Value;
+end;
+
+procedure TDAParameterExpression.Validate;
+begin
+ inherited;
+ if ParameterName = '' then raise Exception.Create('TDAParameterExpression.ParameterName must be assigned.');
+end;
+
+procedure TDAParameterExpression.WriteToXml(sw: IXmlNode);
+var
+ el: IXmlNode;
+begin
+ el := sw.Add('parameter');
+ el.Value := fParameterName;
+end;
+
+{ TDAFieldExpression }
+
+constructor TDAFieldExpression.Create(const aTableName, aFieldName: string);
+begin
+ inherited Create;
+ fTableName := aTableName;
+ fFieldName := aFieldName;
+end;
+
+procedure TDAFieldExpression.ReadFromXml(xr: IXmlNode);
+begin
+ if xr.LocalName <> 'field' then raise Exception.Create('field tag expected');
+ fFieldName := VarToStr(xr.Value);
+ fTableName := xr.GetAttributeValue('tablename', '');
+end;
+
+procedure TDAFieldExpression.Validate;
+begin
+ inherited;
+ if FieldName = '' then raise Exception.Create('TDAFieldExpression.FieldName must be assigned.');
+end;
+
+procedure TDAFieldExpression.WriteToXml(sw: IXmlNode);
+var
+ el: IXMLNode;
+begin
+ el := sw.Add('field');
+ el.Value := fFieldName;
+ if fTableName <> '' then
+ el.AddAttribute('tablename', fTableName);
+end;
+
+{ TDANullExpression }
+
+procedure TDANullExpression.ReadFromXml(xr: IXmlNode);
+begin
+ // nothing to do.
+end;
+
+procedure TDANullExpression.WriteToXml(sw: IXmlNode);
+begin
+ sw.Add('null');
+end;
+
+{ TDAMacroExpression }
+
+procedure TDAMacroExpression.Add(aValue: TDAWhereExpression);
+begin
+ FItems.Add(aValue);
+end;
+
+constructor TDAMacroExpression.Create;
+begin
+ inherited Create;
+ FItems := TList.Create;
+end;
+
+constructor TDAMacroExpression.Create(const aName: string);
+begin
+ Create;
+ fName := aName;
+end;
+
+constructor TDAMacroExpression.Create(const aName: string; const aValues: array of TDAWhereExpression);
+var
+ i: Integer;
+begin
+ Create(aName);
+ for i := 0 to Length(aValues) -1 do
+ Add(aValues[i]);
+end;
+
+destructor TDAMacroExpression.Destroy;
+var
+ i: Integer;
+begin
+ for i := fItems.Count -1 downto 0 do
+ TObject(FItems[i]).Free;
+ fItems.Free;
+ inherited Destroy;
+end;
+
+function TDAMacroExpression.GetCount: Integer;
+begin
+ Result := FItems.Count;
+end;
+
+function TDAMacroExpression.GetItem(idx: Integer): TDAWhereExpression;
+begin
+ result := TDAWhereExpression(FItems[idx]);
+end;
+
+procedure TDAMacroExpression.Insert(Position: Integer;
+ aValue: TDAWhereExpression);
+begin
+ FItems.Insert(Position, aValue);
+end;
+
+procedure TDAMacroExpression.Remove(aValue: TDAWhereExpression);
+var
+ lIndex: Integer;
+begin
+ lIndex := FItems.IndexOf(aValue);
+ if lIndex <> -1 then
+ Delete(lIndex);
+end;
+
+procedure TDAMacroExpression.Delete(index: Integer);
+begin
+ TDAWhereExpression(FItems[index]).Free;
+ FItems.Delete(index);
+end;
+
+procedure TDAMacroExpression.SetItem(idx: Integer;
+ aValue: TDAWhereExpression);
+begin
+ FItems[idx] := aValue;
+end;
+
+procedure TDAMacroExpression.ReadFromXml(xr: IXmlNode);
+var
+ i: Integer;
+begin
+ fName := xr.GetAttributeValue('name', '');
+ for i := 0 to xr.ChildrenCount -1 do
+ Add(TDAWhereExpression.ParseExpression(xr.Children[i]));
+end;
+
+procedure TDAMacroExpression.WriteToXml(sw: IXmlNode);
+var
+ el: IXMLNode;
+ i: Integer;
+begin
+ el := sw.Add('macro');
+ el.AddAttribute('name', fName);
+ for i := 0 to Count -1 do
+ Item[i].WriteToXml(el);
+end;
+
+procedure TDAMacroExpression.Validate;
+var
+ i: integer;
+begin
+ inherited;
+ if Name = '' then raise Exception.Create('TDAMacroExpression.Name must be assigned.');
+ for i := 0 to Count -1 do begin
+ if Item[i] = nil then raise Exception.CreateFmt('TDAMacroExpression.Item[%d] must be assigned.',[i]);
+ Item[i].Validate;
+ end;
+end;
+
+{ TDASelectWhereItem }
+
+constructor TDASelectWhereItem.Create(anOwner: TDASelectWhereBuilder);
+begin
+ inherited Create;
+ fOwner := anOwner;
+end;
+
+{ TDASelectWhereField }
+
+constructor TDASelectWhereField.Create(anOwner: TDASelectWhereBuilder);
+begin
+ inherited Create(anOwner);
+end;
+
+constructor TDASelectWhereField.Create(anOwner: TDASelectWhereBuilder;
+ const aFieldName: String);
+begin
+ inherited Create(anOwner);
+ fFieldName := aFieldName;
+end;
+
+constructor TDASelectWhereField.Create(anOwner: TDASelectWhereBuilder;
+ const aFieldName, anAlias: string);
+begin
+ inherited Create(anOwner);
+ fFieldName := aFieldName;
+ fAlias := anAlias;
+end;
+
+procedure TDASelectWhereField.ReadFromXml(xr: IXmlNode);
+begin
+ if xr.LocalName <> 'field' then raise Exception.Create('field tag expected');
+ Alias := xr.GetAttributeValue('alias', '');
+ fFieldName := VarToStr(xr.Value);
+end;
+
+procedure TDASelectWhereField.WriteToXml(sw: IXmlNode);
+var
+ el: IXMLNode;
+begin
+ el := sw.Add('field');
+ el.Value := fFieldName;
+ if fAlias <> '' then
+ el.AddAttribute('alias', fAlias);
+end;
+
+{ TDASelectWhereBuilder }
+
+function TDASelectWhereBuilder.AddField(
+ aField: TDASelectWhereItem): Integer;
+begin
+ Result := fFields.Add(aField);
+end;
+
+constructor TDASelectWhereBuilder.Create;
+begin
+ inherited Create;
+ fFields := TList.Create;
+end;
+
+procedure TDASelectWhereBuilder.DeleteField(index: Integer);
+begin
+ TDASelectWhereItem(fFields[index]).Free;
+ fFields.Delete(index);
+end;
+
+destructor TDASelectWhereBuilder.Destroy;
+var
+ i: Integer;
+begin
+ for i := fFields.Count -1 downto 0 do
+ TDASelectWhereItem(fFields[i]).Free;
+ fFields.Free;
+ inherited Destroy;
+end;
+
+function TDASelectWhereBuilder.GetCount: Integer;
+begin
+ result := fFields.Count;
+end;
+
+function TDASelectWhereBuilder.GetItem(i: Integer): TDASelectWhereItem;
+begin
+ result := TDASelectWhereItem(fFields[i]);
+end;
+
+function TDASelectWhereBuilder.ReadFromXml(xr: IXmlNode):TDAWhereExpression;
+var
+ el: IXMLNode;
+ i: Integer;
+ sw: TDASelectWhereField;
+begin
+ el := SelectNodeLocal(xr, 'select');
+ if el = nil then raise Exception.Create('"select" node expected');
+ fTableName := el.GetNodeValue('table', '');
+ el := SelectNodeLocal(el, 'fields');
+ if el <> nil then begin
+ for i := 0 to el.ChildrenCount -1 do begin
+ sw := TDASelectWhereField.Create(self);
+ fFields.Add(sw);
+ sw.ReadFromXml(el.Children[i]);
+ end;
+ end;
+ Result:= inherited ReadFromXml(xr);
+end;
+
+procedure TDASelectWhereBuilder.WriteToXml(sw: IXmlNode; const aExpression: TDAWhereExpression);
+var
+ el: IXMLNode;
+ i: Integer;
+begin
+ el := sw.Add('where');
+ el.Add('table').Value := fTableName;
+ el := el.Add('fields');
+ for i := 0 to fFields.Count -1 do
+ Fields[i].WriteToXml(el);
+
+ inherited WriteToXml(sw,aExpression);
+end;
+
+function ProcessDAWhereForUnions(aSourceTableID: Integer; var aDAWhereString: UnicodeString): Boolean;
+var
+ // 0 initial state
+ // 1 all OR
+ // 2 all AND
+ // 3 mixed
+ gFlag: Integer;
+
+ gFalseFound: Boolean;
+ gTrueFound: Boolean;
+
+ // Just replace TDAFieldExpression of the SourceTableName field to its real value
+ procedure ResolveSourceTableFieldExpression(var anExpression: TDAWhereExpression);
+ begin
+ if (SameText(TDAFieldExpression(anExpression).FieldName, def_SourceTableFieldName)) then
+ anExpression := TDAConstantExpression.Create(aSourceTableID, datInteger);
+ end;
+
+ procedure ProcessExpression(var aExpression: TDAWhereExpression);
+ var
+ lTempExpr: TDAWhereExpression;
+ begin
+ if aExpression = nil then Exit;
+
+ if aExpression is TDAFieldExpression then begin
+ ResolveSourceTableFieldExpression(aExpression);
+ end else
+
+ if aExpression is TDABinaryExpression then begin
+
+ lTempExpr := TDABinaryExpression(aExpression).Left;
+ ProcessExpression(lTempExpr);
+ TDABinaryExpression(aExpression).Left := lTempExpr;
+
+ lTempExpr := TDABinaryExpression(aExpression).Right;
+ ProcessExpression(lTempExpr);
+ TDABinaryExpression(aExpression).Right := lTempExpr;
+
+ end;
+ end;
+
+ // Returns:
+ // -1 unknown
+ // 0 false
+ // 1 true
+ function ScanExpressionIsTrueOrFalse(anExpression: TDAWhereExpression): integer;
+ var lBinExpr: TDABinaryExpression;
+ var lLeftValue, lRightValue: Variant;
+ var lResult : TVariantRelationship;
+ begin
+ result := -1;
+ lBinExpr := anExpression as TDABinaryExpression;
+ if not assigned(lBinExpr) then exit;
+ if not ((lBinExpr.Left is TDAConstantExpression) and (lBinExpr.Right is TDAConstantExpression)) then exit;
+
+ lLeftValue := (lBinExpr.Left as TDAConstantExpression).Value;
+ lRightValue := (lBinExpr.Right as TDAConstantExpression).Value;
+
+ lResult := VarCompareValue(lLeftValue, lRightValue);
+
+ if ((lBinExpr.Operator in [dboEqual, dboGreaterOrEqual, dboLessOrEqual]) and (lResult = vrEqual)) then
+ result := 1
+ else
+ if ((lBinExpr.Operator in [dboGreater, dboGreaterOrEqual]) and (lResult = vrGreaterThan)) then
+ result := 1
+ else
+ if ((lBinExpr.Operator in [dboLess, dboLessOrEqual]) and (lResult = vrLessThan)) then
+ result := 1
+ else
+ result := 0;
+ end;
+
+ // this sub proc goes throw all bin exp and operates with global variables
+ // declared in parent proc
+ procedure TestExpressionRecursive(anExpression: TDAWhereExpression);
+ var
+ lFound: Integer;
+ lInnerOp: TDABinaryOperator;
+ begin
+ if anExpression is TDABinaryExpression then begin
+
+ lInnerOp := TDABinaryExpression(anExpression).Operator;
+ case gFlag of
+ 0: begin
+ if lInnerOp = dboOr then gFlag := 1;
+ if lInnerOp = dboAnd then gFlag := 2;
+ end;
+ 1: begin
+ if lInnerOp = dboAnd then gFlag := 3;
+ end;
+ 2: begin
+ if lInnerOp = dboOr then gFlag := 3;
+ end;
+ end;
+ if gFlag = 3 then exit;
+
+ lFound := ScanExpressionIsTrueOrFalse(anExpression);
+ case lFound of
+ -1:{Unknown} begin
+ TestExpressionRecursive(TDABinaryExpression(anExpression).Left);
+ TestExpressionRecursive(TDABinaryExpression(anExpression).Right);
+ end;
+ 0: {found FALSE} begin
+ gFalseFound := true;
+ end;
+ 1: {found TRUE} begin
+ gTrueFound := true;
+ end;
+ end;
+ end;
+ end;
+
+ // gFlag
+ // 0 initial state
+ // 1 all OR
+ // 2 all AND
+ // 3 mixed
+
+ // Rules I found
+ // If *ALL* binexp joined by "OR" and TRUE was found then get ALL records : -1
+ // If *ALL* binexp joined by "AND" and FALSE was found then get NONE records : 0
+ // All other cases need to apply where query : 1
+ function TestExpression(anExpression: TDAWhereExpression): Integer;
+ begin
+ // initialize
+ gFlag := 0;
+ gFalseFound := false;
+ gTrueFound := false;
+ result := 1; // apply query
+
+ TestExpressionRecursive(anExpression);
+
+ case gFlag of
+
+ 0: begin
+ if gTrueFound then begin
+ result := -1;
+ exit;
+ end;
+ if gFalseFound then begin
+ result := 0;
+ exit;
+ end;
+ end;
+
+ 1: begin
+ if gTrueFound then begin
+ result := -1;
+ exit;
+ end;
+ end;
+
+ 2: begin
+ if gFalseFound then begin
+ result := 0;
+ exit;
+ end;
+ end;
+ end;
+ end;
+
+
+var lTempExpr: TDAWhereExpression;
+lResult : Integer;
+begin
+ Result := True;
+ if aDAWhereString <> '' then
+ with TDAWhereBuilder.Create do try
+ Xml := aDAWhereString;
+ lTempExpr := Expression;
+ ProcessExpression(lTempExpr);
+ Expression := lTempExpr;
+
+ aDAWhereString := Xml;
+ lResult := TestExpression(Expression);
+ if lResult = -1 then aDAWhereString := '';
+ result := (0 <> lResult);
+ finally
+ free;
+ end;
+end;
+
+procedure Where_CreateParameters(aExpression: TDAWhereExpression; AParams: TDAParamCollection);
+
+ procedure ProcessExpression(lExpression: TDAWhereExpression);
+ var
+ i: integer;
+ begin
+ if lExpression = nil then Exit;
+ if lExpression is TDABinaryExpression then begin
+ ProcessExpression(TDABinaryExpression(lExpression).Left);
+ ProcessExpression(TDABinaryExpression(lExpression).Right);
+ end
+ else if lExpression is TDAUnaryExpression then begin
+ ProcessExpression(TDAUnaryExpression(lExpression).Expression);
+ end
+ else if lExpression is TDAListExpression then begin
+ with TDAListExpression(lExpression) do
+ for i := 0 to Count - 1 do
+ ProcessExpression(Item[i]);
+ end
+ else if lExpression is TDAParameterExpression then begin
+ with TDAParameterExpression(lExpression) do
+ if AParams.FindParam(ParameterName) = nil then
+ AParams.Add.Name := ParameterName;
+ end;
+ end;
+
+begin
+ ProcessExpression(aExpression);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAXMLAdapter.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAXMLAdapter.pas
new file mode 100644
index 0000000..7a4bd5d
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAXMLAdapter.pas
@@ -0,0 +1,1061 @@
+unit uDAXMLAdapter;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses
+ Classes, TypInfo, SysUtils,
+ uROClasses, uROXMLIntf,
+ uDAInterfaces, uDADataStreamer, uDADelta;
+
+const
+ // Data stream node names
+ nn_DocumentName = 'XMLData';
+ nn_Schema = 'Schema';
+ nn_Datasets = 'Datasets';
+ nn_Fields = 'Fields';
+ nn_Field = 'Field';
+ nn_Params = 'Params';
+ nn_Param = 'Param';
+ nn_Row = 'Row';
+
+ // Delta stream node names
+ nn_Deltas = 'Deltas';
+
+ attr_RecId = 'RecId';
+ nn_SourceTableFieldName = '___SourceTableFieldName';
+
+type
+
+ TDADataForAppendXML = class(TDADataForAppend)
+ public
+ Node: iXMLNode;
+ end;
+
+ TDAXMLSchemaOption = (soIncludeEmptyAttributes);
+ TDAXMLSchemaOptions = set of TDAXMLSchemaOption;
+
+ TDAXMLRowOption = (roCompressBlobs);
+ TDAXMLRowOptions = set of TDAXMLRowOption;
+
+ TDAXmlDataStreamerOption = (xaoUseDatasetXSLTs, xaoUseDeltaXSLTs);
+ TDAXmlDataStreamerOptions = set of TDAXmlDataStreamerOption;
+
+ { TDAXmlDataStreamer }
+ TDAXmlDataStreamer = class(TDADataStreamer)
+ private
+ fWriteXSLT,
+ fReadXSLT{,
+ fWriteDeltaXSLT,
+ fReadDeltaXSLT} : IXMLDocument;
+
+ fXMLDocument : IXMLDocument;
+ fSchemaRoot,
+ fRootNode,
+ fDatasetSchemaNode,
+ fDeltaSchemaNode,
+ fDatasetNode,
+ fDeltaNode : IXMLNode;
+
+ fDAFieldPropInfoList : PPropList;
+ fDAMemPropCount,
+ fDAFieldPropCount : integer;
+ fSchemaOptions: TDAXMLSchemaOptions;
+ fRowOptions: TDAXMLRowOptions;
+ fOptions: TDAXmlDataStreamerOptions;
+ fDocumentName: string;
+ fSkipNull: boolean;
+ param_proplistcount: integer;
+ param_PropList: PPropList;
+
+ procedure WriteBlobValue(const aDestination : IXMLNode; const anAttributeName : string; const aBlobValue : Variant);
+ function ReadBlobValue(const aSource: IXMLNode; const anAttributeName : string) : Variant;
+ function GetReadXSLT: IXMLDocument;
+ function GetWriteXSLT: IXMLDocument;
+ {function GetReadDeltaXSLT: IXMLDocument;
+ function GetWriteDeltaXSLT: IXMLDocument;}
+
+ function GetXMLDocument(var XMLDocument: IXMLDocument): IXMLDocument;
+ function SaveDocumentName: Boolean;
+ procedure SetDocumentName(const Value: string);
+ procedure ClearXMLNodes;
+
+ protected
+ function DoCreateStream: TStream; override;
+ procedure DoInitialize(Mode: TDAAdapterInitialization); override;
+ procedure DoFinalize; override;
+ function DoWriteDataset(const Source: IDADataset; Options: TDAWriteOptions; MaxRows: integer;ADynFieldNames: array of string): integer; override;
+ procedure DoWriteDelta(const Source: IDADelta); override;
+ procedure DoReadDataset(const DatasetName: string; const Destination: IDADataset; ApplySchema: boolean;AppendMode: Boolean); override;
+ procedure DoReadDelta(const DeltaName: string; const Destination: IDADelta); override;
+ function DoBeginWriteDataset( const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend; override;
+ function DoWriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aDataIndex: Integer = -1): Integer; override;
+ function DoEndWriteDataset(aDataForAppend: TDADataForAppend): Integer; override;
+ public
+ constructor Create(aOwner : TComponent); override;
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ function GetTargetDataType: TRODataType; override;
+
+ property ReadXSLT : IXMLDocument read GetReadXSLT write fReadXSLT;
+ property WriteXSLT : IXMLDocument read GetWriteXSLT write fWriteXSLT;
+ {property ReadDeltaXSLT : IXMLDocument read GetReadDeltaXSLT write fReadDeltaXSLT;
+ property WriteDeltaXSLT : IXMLDocument read GetWriteDeltaXSLT write fWriteDeltaXSLT;}
+
+ published
+ property SkipNull : boolean read fSkipNull write fSkipNull default true;
+ property SchemaOptions : TDAXMLSchemaOptions read fSchemaOptions write fSchemaOptions;
+ property RowOptions : TDAXMLRowOptions read fRowOptions write fRowOptions;
+ property Options : TDAXmlDataStreamerOptions read fOptions write fOptions;
+ property DocumentName : string read fDocumentName write SetDocumentName stored SaveDocumentName;
+ end;
+
+ TDAXMLAdapter = class(TDAXmlDataStreamer) end deprecated;
+
+implementation
+
+uses
+ Variants, uROXMLSerializer, uROCompression, uROBinaryHelpers
+ ,uDAClasses, uDAEngine
+ {$IFDEF MSWINDOWS}
+ ,uROZLib
+ {$ENDIF};
+
+const
+ XML_DateTimeFormat = 'yyyy-mm-dd"T"hh":"nn":"ss"."zzz';
+
+function XMLDateTimeToDateTime(const aXMLDateTime : string) : TDateTime;
+var year, month, day, hour, min, sec, msec : word;
+begin {yyyy-mm-ddThh:nn:ss.zzz}
+ year := StrToInt(Copy(aXMLDateTime,1,4));
+ month := StrToInt(Copy(aXMLDateTime,6,2));
+ day := StrToInt(Copy(aXMLDateTime,9,2));
+ hour := StrToInt(Copy(aXMLDateTime,12,2));
+ min := StrToInt(Copy(aXMLDateTime,15,2));
+ sec := StrToInt(Copy(aXMLDateTime,18,2));
+ msec := StrToInt(Copy(aXMLDateTime,21,3));
+
+ result := EncodeDate(year, month, day);
+ // The code below is required! Do not adjust
+ if (result<0)
+ then result := result-EncodeTime(hour, min, sec, msec)
+ else result := result+EncodeTime(hour, min, sec, msec)
+end;
+
+function DateTimeToXMLDateTime(aDateTime : TDateTime) : string;
+begin
+ Result := FormatDateTime(XML_DateTimeFormat, aDateTime);
+end;
+
+function WriteFloat(Val: Variant): String;
+begin
+ Result := FloatToStr(Val{$IFDEF DELPHI7UP},SOAPFormatSettings{$ENDIF});
+
+ {$IFNDEF DELPHI7UP}
+ if DecimalSeparator <> '.' then
+ ReplaceChar(Result, [DecimalSeparator], '.');
+ {$ENDIF}
+end;
+
+
+function ReadFloat(text: String): Variant;
+begin
+ {$IFNDEF DELPHI7UP}
+ if DecimalSeparator <> '.' then
+ ReplaceChar(text, ['.'], DecimalSeparator);
+ {$ENDIF}
+
+ Result := SOAPStrToFloat(text);
+end;
+
+{ TDAXmlDataStreamer }
+
+constructor TDAXmlDataStreamer.Create(aOwner: TComponent);
+begin
+ inherited;
+
+ fDocumentName := nn_DocumentName;
+
+ fSchemaOptions := [soIncludeEmptyAttributes];
+
+ fXMLDocument := NewROXmlDocument;
+
+ fWriteXSLT := NIL;
+ fReadXSLT := NIL;
+ {fWriteDeltaXSLT := NIL;
+ fReadDeltaXSLT := NIL;}
+
+ fOptions := [xaoUseDatasetXSLTs, xaoUseDeltaXSLTs];
+
+ fDAMemPropCount := GetTypeData(TDAField.ClassInfo).PropCount;
+ GetMem(fDAFieldPropInfoList, fDAMemPropCount*SizeOf(PPropInfo));
+ fDAFieldPropCount := GetPropList(TDAField.ClassInfo, tkProperties, fDAFieldPropInfoList);
+
+ GetMem(param_PropList, GetTypeData(TDAParam.ClassInfo).PropCount * SizeOf(PPropInfo));
+ param_proplistcount := GetPropList(TDAParam.ClassInfo, tkProperties, param_PropList);
+ fSkipNull := true;
+end;
+
+destructor TDAXmlDataStreamer.Destroy;
+begin
+ fWriteXSLT := NIL;
+ fReadXSLT := NIL;
+ {fWriteDeltaXSLT := NIL;
+ fReadDeltaXSLT := NIL;}
+
+ FreeMem(fDAFieldPropInfoList, fDAMemPropCount*SizeOf(PPropInfo));
+ FreeMem(param_PropList);
+
+ ClearXMLNodes;
+
+ inherited;
+end;
+
+function TDAXmlDataStreamer.GetTargetDataType: TRODataType;
+begin
+ result := rtString;
+end;
+
+function TDAXmlDataStreamer.DoCreateStream: TStream;
+begin
+ result := NIL;
+end;
+
+procedure TDAXmlDataStreamer.DoInitialize(Mode: TDAAdapterInitialization);
+var
+ i : integer;
+begin
+ ClearXMLNodes;
+ fXMLDocument.New(fDocumentName);
+
+ if (Mode in AdapterReadModes) then begin
+
+ fXMLDocument.LoadFromStream(Data);
+
+ // Applies the XSLT (if any). The resulting document MUST be a valid XML document
+ // that conforms to the Data Abstract XML format
+ if (fReadXSLT<>NIL)
+ then fXMLDocument.XML := fXMLDocument.Transform(fReadXSLT.XML);
+
+ // Parses the document
+ fRootNode := fXMLDocument.DocumentNode;
+
+ // Schema sections
+ fSchemaRoot := fRootNode.GetNodeByName(nn_Schema);
+ if (fSchemaRoot<>NIL) then begin
+ fDatasetSchemaNode := fSchemaRoot.GetNodeByName(nn_Datasets);
+ fDeltaSchemaNode := fSchemaRoot.GetNodeByName(nn_Deltas);
+ end;
+
+ // Data sections
+ fDatasetNode := fRootNode.GetNodeByName(nn_Datasets);
+ fDeltaNode := fRootNode.GetNodeByName(nn_Deltas);
+
+ if (fDatasetSchemaNode<>NIL) and (fDatasetSchemaNode.ChildrenCount>0) then begin
+ for i := 0 to (fDatasetSchemaNode.ChildrenCount-1) do
+ AddingDataset(fDatasetSchemaNode.Children[i].Name);
+ end
+ else if (fDatasetNode<>NIL) then begin
+ for i := 0 to (fDatasetNode.ChildrenCount-1) do
+ AddingDataset(fDatasetNode.Children[i].Name);
+ end;
+
+ if (fDeltaSchemaNode<>NIL) and (fDeltaSchemaNode.ChildrenCount>0) then begin
+ for i := 0 to (fDeltaSchemaNode.ChildrenCount-1) do
+ AddingDelta(fDeltaSchemaNode.Children[i].Name);
+ end
+ else if (fDeltaNode<>NIL) then begin
+ for i := 0 to (fDeltaNode.ChildrenCount-1) do
+ AddingDataset(fDeltaNode.Children[i].Name);
+ end;
+
+ end
+ else if (Mode in AdapterWriteModes) then begin
+ fRootNode := fXMLDocument.DocumentNode;
+ // Schema sections
+ fSchemaRoot := fRootNode.Add(nn_Schema);
+ fDatasetSchemaNode := fSchemaRoot.Add(nn_Datasets);
+ fDeltaSchemaNode := fSchemaRoot.Add(nn_Deltas);
+
+ // Data sections
+ fDatasetNode := fRootNode.Add(nn_Datasets);
+ fDeltaNode := fRootNode.Add(nn_Deltas);
+ end;
+end;
+
+procedure TDAXmlDataStreamer.DoFinalize;
+var finaldocument : string;
+begin
+ if (AdapterInitialization in AdapterWriteModes) then begin
+ // Removes the delta sections if they don't contain data
+ if (fDeltaSchemaNode.ChildrenCount=0) then begin
+ fSchemaRoot.Remove(fDeltaSchemaNode);
+ fDeltaSchemaNode := NIL;
+ end;
+
+ if (fDeltaNode.ChildrenCount=0) then begin
+ fRootNode.Remove(fDeltaNode);
+ fDeltaNode := NIL;
+ end;
+
+ // Removes the datasets sections if they don't contain data
+ if (fDatasetSchemaNode.ChildrenCount=0) then begin
+ fSchemaRoot.Remove(fDatasetSchemaNode);
+ fDatasetSchemaNode := NIL;
+ end;
+
+ if (fDatasetNode.ChildrenCount=0) then begin
+ fRootNode.Remove(fDatasetNode);
+ fDeltaNode := NIL;
+ end;
+
+ // Applies the XSLT (if any)
+ if (fWriteXSLT<>NIL)
+ then begin
+ // The resulting document might not be a valid XML document!!
+ finaldocument := fXMLDocument.Transform(fWriteXSLT.XML);
+ if (finaldocument<>'')
+ then Data.Write(finaldocument[1], Length(finaldocument)*SizeOf(char));
+ end
+ else fXMLDocument.SaveToStream(Data);
+ end;
+ ClearXMLNodes;
+end;
+
+procedure TDAXmlDataStreamer.WriteBlobValue(const aDestination : IXMLNode; const anAttributeName : string; const aBlobValue : Variant);
+var ss, compressedstream : TStringStream;
+ binstream : TROBinaryMemoryStream;
+begin
+ compressedstream := NIL;
+ binstream := TROBinaryMemoryStream.Create;
+ ss := TStringStream.Create('');
+
+ try
+ //binstream := BinaryFromVariant(aBlobValue);//, ms.Stream);
+ WriteVariantToBinary(aBlobValue, binstream);
+ binstream.Position := 0;
+
+ if (roCompressBlobs in fRowOptions) then begin
+ compressedstream := TStringStream.Create('');
+ ZCompressStream(binstream, compressedstream);
+ compressedstream.Position := 0;
+
+ EncodeStream(compressedstream, ss);
+ end
+ else begin
+ EncodeStream(binstream, ss);
+ end;
+
+ aDestination.AddAttribute(anAttributeName, ss.DataString);
+
+ finally
+ FreeAndNIL(ss);
+ FreeAndNIL(compressedstream);
+ FreeAndNIL(binstream);
+ end;
+end;
+
+function TDAXmlDataStreamer.ReadBlobValue(const aSource: IXMLNode; const anAttributeName : string) : Variant;
+var data, compressedstream : TStringStream;
+ finaldata : IROStream;
+begin
+ compressedstream := NIL;
+
+ data := TStringStream.Create(aSource.GetAttributeValue(anAttributeName, NULL));
+ finaldata := NewROStream;
+
+ try
+ data.Position := 0;
+
+ if (roCompressBlobs in fRowOptions) then begin
+ compressedstream := TStringStream.Create('');
+ DecodeStream(data, compressedstream);
+ compressedstream.Position := 0;
+
+ ZDecompressStream(compressedstream, finaldata.Stream);
+ finaldata.Position := 0;
+ end
+ else begin
+ DecodeStream(data, finaldata.Stream);
+ end;
+
+ finaldata.Position := 0;
+ result := ReadVariantFromBinary(finaldata.Stream);
+
+ finally
+ FreeAndNIL(data);
+ FreeAndNIL(compressedstream);
+ end;
+end;
+
+procedure TDAXmlDataStreamer.DoReadDataset(const DatasetName: string;
+ const Destination: IDADataset; ApplySchema: boolean;AppendMode: Boolean);
+
+var
+ lPK: string; //for append mode
+ lPKValues: array of variant; //for append mode
+ lOnePK:Boolean; //for append mode
+
+ function Dataset_Locate(): boolean;
+ begin
+ if lOnePK then
+ Result:= Destination.Locate(lPK,lPKValues[0],[])
+ else
+ Result:= Destination.Locate(lPK,lPKValues,[]);
+ end;
+
+var sourcenode : IXMLNode;
+ i,j, x : integer;
+ attr, node, scNode : IXMLNode;
+ fld : TDAField;
+ par: TDAParam;
+ val: Variant;
+ editable : IDAEditableDataset;
+ lName: string;
+ lProgress: Boolean;
+ lTotal: integer;
+// append mode
+ flds: TDAFieldArray;
+ lFldValues: array of Variant; // flds values for append mode
+ lPKFlds: TDAFieldArray; // PK flds (Append mode)
+begin
+ // Reads and applies the schema
+ if ApplySchema then begin
+ scNode := fDatasetSchemaNode.GetNodeByName(DatasetName);
+ if (scNode=NIL) then exit;//raise EROException.Create('Cannot find schema for dataset '+DatasetName)
+ sourcenode := scNode.GetNodeByName(nn_Fields); // For now we only have fields, so this is ok
+ if sourcenode <> nil then begin
+ Destination.Fields.Clear;
+
+ for i := 0 to (sourcenode.ChildrenCount-1) do begin
+ fld := Destination.Fields.Add;
+ node := sourcenode.Children[i];
+
+ for x := 0 to (fDAFieldPropCount-1) do begin
+ lName:= {$IFDEF UNICODE}UTF8ToString{$ENDIF}(fDAFieldPropInfoList^[x].Name);
+ attr := node.GetAttributeByName(lName);
+ if (attr=NIL) then Continue;
+
+ if (fDAFieldPropInfoList^[x].PropType^.Kind<>tkClass) then SetPropValue(fld, lName, VarToStr(attr.Value));
+ end;
+ end;
+ end;
+
+ sourcenode := scNode.GetNodeByName(nn_Params); // For now we only have fields, so this is ok
+ if sourcenode <> nil then begin
+ Destination.Params.Clear;
+
+ for i := 0 to (sourcenode.ChildrenCount-1) do begin
+ par := Destination.Params.Add;
+ node := sourcenode.Children[i];
+
+ for x := 0 to (param_proplistcount-1) do begin
+ lName := {$IFDEF UNICODE}UTF8ToString{$ENDIF}(param_PropList^[x].Name);
+ attr := node.GetAttributeByName(lName);
+ if (attr=NIL) then Continue;
+
+ if (param_PropList^[x].PropType^.Kind<>tkClass) then SetPropValue(par, lName, VarToStr(attr.Value));
+ end;
+ end;
+ end;
+
+ end
+ else begin
+ editable := Destination as IDAEditableDataset;
+ // if table is empty then process in standard mode
+ AppendMode := AppendMode and not (editable.EOF and editable.GetBOF);
+
+ sourcenode := fDatasetNode.GetNodeByName(DatasetName);
+ if (sourcenode=NIL)
+ then raise EROException.Create('Cannot find schema for dataset '+DatasetName);
+
+ if not Destination.Active then Destination.Open;
+
+ {$IFDEF STORERECID}
+ Destination.CurrentRecIdValue := 0;
+ {$ENDIF}
+
+ lProgress := Assigned(OnReadDatasetProgress);
+ lTotal := sourcenode.ChildrenCount;
+
+ Destination.DisableConstraints;
+ try
+ if AppendMode then begin
+ SetLength(flds, Destination.Fields.Count);
+ for i := 0 to Destination.Fields.Count - 1 do
+ flds[i]:=Destination.Fields[i];
+ lPK := Dataset_GetPK(flds, lPKFlds);
+ lOnePK := Length(lPKFlds) = 1;
+ AppendMode := AppendMode and (Length(lPKFlds)>0);
+ if AppendMode then begin
+ SetLength(lFldValues, Length(flds));
+ SetLength(lPKValues, Length(lPKFlds));
+ end;
+ end;
+ for i := 0 to sourcenode.ChildrenCount-1 do begin
+ editable.Append;
+
+ node := sourcenode.Children[i];
+
+ {$IFDEF STORERECID}
+ Destination.CurrentRecIdValue := node.GetAttributeValue(attr_RecId, -1);
+ for x := 1 to node.AttributeCount-1 do begin
+ {$ELSE}
+ for x := 0 to node.AttributeCount-1 do begin
+ {$ENDIF}
+ attr := node.Attributes[x];
+ if attr.Name = nn_SourceTableFieldName then
+ fld := Destination.Fields.FieldByName(def_SourceTableFieldName)
+ else
+ fld := Destination.Fields.FieldByName(attr.Name);
+
+ if fld.Calculated or fld.Lookup then Continue;
+ if (attr.Value = '') and (fld.DataType <> datBlob) then begin
+ val := NULL;
+ end else begin
+ case fld.DataType of
+ datBlob : val := ReadBlobValue(node, attr.Name); // <--- MARC!!!
+ datDateTime : val := XMLDateTimeToDateTime(attr.Value);
+ datFloat,
+ datCurrency: val := ReadFloat(attr.Value);
+ // TODO -cAleF: remember to use the proper XML conversion routines here!
+ else val := attr.Value;
+ end;
+ end;
+
+ if Assigned(OnReadFieldValue) then OnReadFieldValue(fld, val);
+ fld.Value := val;
+
+ end;
+ if AppendMode then begin
+ // store values and avoid firing OnReadFieldValue event
+ for j := 0 to Length(Flds) - 1 do
+ lFldValues[j]:= Flds[j].Value;
+ // store PK values for locate
+ for j := 0 to Length(lPKFlds) - 1 do
+ lPKValues[j]:= lPKFlds[j].Value;
+
+ editable.Cancel;
+ if Dataset_Locate then
+ editable.Edit
+ else
+ editable.Append;
+ // assign new values
+ for j := 0 to Length(Flds) - 1 do
+ Flds[j].Value := lFldValues[j];
+ end;
+ try
+ editable.Post;
+ except
+ // Introduced to restore the dsBrowse state of the datatable
+ // in case of errors
+ editable.Cancel;
+ raise;
+ end;
+ if lProgress then OnReadDatasetProgress(Self, Destination, i, lTotal);
+ end;
+ finally
+ Destination.EnableConstraints;
+ end;
+ end;
+end;
+
+function TDAXmlDataStreamer.DoWriteDataset(const Source: IDADataset;
+ Options: TDAWriteOptions; MaxRows: integer; ADynFieldNames: array of string): integer;
+var
+ lDataForAppend: TDADataForAppend;
+begin
+ lDataForAppend := DoBeginWriteDataset(Source, {schema}nil, Options, MaxRows, ADynFieldNames);
+ if woRows in Options then begin
+ DoWriteDatasetData(Source, lDataForAppend);
+ result := DoEndWriteDataset(lDataForAppend);
+ end
+ else begin
+ lDataForAppend.Free;
+ result := -1;
+ end;
+end;
+
+function TDAXmlDataStreamer.DoBeginWriteDataset( const Source: IDADataset; const Schema: TDADataset;
+ Options: TDAWriteOptions; MaxRows: integer;
+ ADynFieldNames: array of string): TDADataForAppend;
+var
+ i: integer;
+ fld: TDAField;
+ lfields: array of integer;
+ lDataForAppend : TDADataForAppendXML;
+ lSchemaFields: TDAFieldCollection;
+ lSchemaParams: TDAParamCollection;
+ lLogicalName: String;
+ x : integer;
+ subnode, node, scNode : IXMLNode;
+ s : string;
+ lName: string;
+
+begin
+ lDataForAppend := TDADataForAppendXML.Create();
+ result := lDataForAppend;
+
+ if Assigned(Schema) then begin
+ lDataForAppend.TableSchema := Schema;
+ if Schema is TDAUnionDataTable then begin
+ fld := Schema.FindField(def_SourceTableFieldName);
+ if not Assigned(fld) then begin
+ fld := Schema.Fields.Add();
+ fld.Name := def_SourceTableFieldName;
+ fld.DataType := datInteger;
+ fld.InPrimaryKey := true;
+ fld.ServerAutoRefresh := true;
+ end;
+ end;
+ lSchemaFields := Schema.Fields;
+ lSchemaParams := Schema.Params;
+ lLogicalName := Schema.Name;
+ end else begin
+ if Assigned(Source) then begin
+ lSchemaFields := Source.Fields;
+ lSchemaParams := Source.Params;
+ lLogicalName := Source.LogicalName;
+ end else begin
+ raise EDAException.Create('Schema or source should be assigned.');
+ end;
+ end;
+
+
+ if Length(ADynFieldNames) > 0 then begin
+ SetLength(lfields, Length(ADynFieldNames));
+ For i:=0 to High(ADynFieldNames) do begin
+ fld:=lSchemaFields.FindField(ADynFieldNames[i]);
+ if fld <> nil then
+ lfields[i]:= fld.Index
+ else
+ lfields[i]:= -1;
+ end;
+ end else begin
+ SetLength(lfields, lSchemaFields.Count);
+ For i:=0 to lSchemaFields.Count-1 do
+ lfields[i]:=i;
+ end;
+
+ // Writes the schema
+ if (woSchema in Options) or (Length(ADynFieldNames)>0) then begin
+ scNode := fDatasetSchemaNode.Add(lLogicalName);
+ node := scNode.Add(nn_Fields);
+
+ for i := 0 to high(lfields) do begin
+ subnode := node.Add(nn_Field);
+
+ for x := 0 to (fDAFieldPropCount-1) do begin
+ lName := {$IFDEF UNICODE}UTF8ToString{$ENDIF}(fDAFieldPropInfoList^[x].Name);
+ s := VarToStr(GetPropValue(lSchemaFields[lfields[i]], lName, TRUE));
+
+ if (s<>'') or (soIncludeEmptyAttributes in SchemaOptions) then subnode.AddAttribute(lName, s);
+ end;
+ end;
+ node := scNode.Add(nn_Params);
+
+ for i := 0 to (lSchemaParams.Count-1) do begin
+ subnode := node.Add(nn_Param);
+
+ for x := 0 to (param_proplistcount-1) do begin
+ lName := {$IFDEF UNICODE}UTF8ToString{$ENDIF}(param_PropList^[x].Name);
+ s := VarToStr(GetPropValue(lSchemaParams.Params[i], lName, TRUE));
+
+ if (s<>'') or (soIncludeEmptyAttributes in SchemaOptions) then subnode.AddAttribute(lName, s);
+ end;
+ end;
+ end;
+
+ SetLength(lDataForAppend.RealFields, Length(lFields));
+ for i:= 0 to Length(lFields) -1 do
+ lDataForAppend.RealFields[i] := lFields[i];
+
+ AddingDataset(lLogicalName);
+ lDataForAppend.node := fDatasetNode.Add(lLogicalName);
+ lDataForAppend.MaxRowCount := MaxRows;
+ lDataForAppend.RecordCount := 0;
+end;
+
+function TDAXmlDataStreamer.DoWriteDatasetData(const Source: IDADataset; var aDataForAppend: TDADataForAppend; aDataIndex: Integer = -1): Integer;
+var
+ i, max, k : integer;
+ subnode, node : IXMLNode;
+ val: Variant;
+ lfields: array of integer;
+ flds: array of TDAField;
+ flds_names: array of string;
+ lProgress: Boolean;
+ f,ev, ev1, ev2: boolean;
+ NativeDataset: IDASQLCommandNativeObject;
+ lColumnMappings: TDAColumnMappingCollection;
+ lColumnMapping: TDAColumnMapping;
+ lFieldName: string;
+ lDataForAppend: TDADataForAppendXML;
+ lMapToFieldName: String;
+begin
+ f:=(Source.QueryInterface(IDASQLCommandNativeObject, NativeDataset) = 0) and not NativeDataset.IsTDatasetCompatible;
+ lDataForAppend := TDADataForAppendXML(aDataForAppend);
+
+ SetLength(lfields, Length(lDataForAppend.RealFields));
+ SetLength(flds, Length(lDataForAppend.RealFields));
+ SetLength(flds_names, Length(lDataForAppend.RealFields));
+ for i:= 0 to Length(lDataForAppend.RealFields) -1 do
+ lFields[i] := lDataForAppend.RealFields[i];
+
+
+ k := lDataForAppend.RecordCount;
+ max := lDataForAppend.MaxRowCount;
+
+ // Mapping fields of Source table to the streamed dataset
+ if Assigned(lDataForAppend.TableSchema) and (lDataForAppend.TableSchema is TDAUnionDataTable) then begin
+ lColumnMappings := TDAUnionSourceTable(TDAUnionDataTable(lDataForAppend.TableSchema).SourceTables.ItemByName(Source.Name)).ColumnMappings;
+ for i := 0 to lDataForAppend.TableSchema.Fields.Count - 1 do begin
+ lFieldName := lDataForAppend.TableSchema.Fields[lFields[i]].Name;
+ if lFieldName = def_SourceTableFieldName then begin
+ lFields[i] := -10;
+ flds_names[i] := nn_SourceTableFieldName;
+ continue;
+ end;
+ flds_names[i] := lFieldName;
+ lMapToFieldName := lFieldName;
+ if Assigned(lColumnMappings) then begin
+ lColumnMapping := lColumnMappings.MappingByDatasetField(lFieldName);
+ if Assigned(lColumnMapping) and (lColumnMapping.TableField <> '') then
+ lMapToFieldName := lColumnMapping.TableField;
+ end;
+ lFields[i] := Source.FieldByName(lMapToFieldName).Index;
+ end;
+ end
+ else begin
+ for i := 0 to Length(lfields) -1 do
+ flds_names[i] := Source.Fields[lfields[i]].Name;
+ end;
+
+ Source.DisableControls;
+ try
+ if not Source.Active then Source.Open;
+ for i:= 0 to Length(lfields) -1 do begin
+ if lfields[i] = -10 then
+ flds[i] := lDataForAppend.TableSchema.FieldByName(def_SourceTableFieldName)
+ else
+ flds[i] := Source.Fields[lfields[i]];
+ end;
+
+
+ ev1 := Assigned(OnBeforeFieldValueSerialization);
+ ev := Assigned(OnWriteFieldValue);
+ ev2 := Assigned(OnWriteFieldValueEx);
+ f := f or ev or ev1 or ev2;
+ lProgress := Assigned(onWriteDatasetProgress);
+ node := lDataForAppend.Node;
+ // Writes the actual records
+ while (k<>max) and not source.EOF do begin
+
+ subnode := node.Add(nn_Row);
+
+ {$IFDEF STORERECID}
+ subnode.AddAttribute(attr_RecId, Source.GetRowRecIdValue);
+ {$ENDIF}
+
+ for i := 0 to Length(lfields) - 1 do begin
+ //RealFields[i] = -10 then this is @SourceTable field
+ if lfields[i] = -10 then
+ val := aDataIndex
+ else
+ val := Source.FieldValues[lfields[i]];
+ if ev1 then OnBeforeFieldValueSerialization(flds[i], val);
+ if flds[i].Calculated or flds[i].Lookup then Continue;
+ if fSkipNull and
+ (lfields[i] <> -10) and
+ ((f and VarIsNull(Val)) or (flds[i].IsNull)) then continue;
+ if ev then OnWriteFieldValue(flds[i], val);
+ if ev2 then OnWriteFieldValueEx(Source, flds[i], val);
+ if (VarIsEmpty(val) or VarIsNull(val)) and (flds[i].DataType <> datBlob) then begin
+ subnode.AddAttribute(flds_names[i], VarToStr(Null))
+ end else begin
+ case flds[i].DataType of
+ datBlob : WriteBlobValue(subnode, flds_names[i], val);// <--- MARC!!!
+ datDateTime : subnode.AddAttribute(flds_names[i], DateTimeToXMLDateTime(val));
+ datFloat,
+ datCurrency: subnode.AddAttribute(flds_names[i], WriteFloat(val));
+ else
+ // TODO -cAleF: remember to use the proper XML conversion reoutines here!
+ subnode.AddAttribute(flds_names[i], VarToStr(val));
+ end;
+ end;
+ end;
+ Inc(k);
+ if lProgress then OnWriteDatasetProgress(Self, Source, k, max);
+ Source.Next;
+ if Source.EOF then Break;
+ end;
+ aDataForAppend.RecordCount := k;
+ Result := k;
+ finally
+ Source.EnableControls;
+ end;
+end;
+
+function TDAXmlDataStreamer.DoEndWriteDataset(aDataForAppend: TDADataForAppend): Integer;
+begin
+ result := aDataForAppend.RecordCount;
+ TDADataForAppendXML(aDataForAppend).Node := nil;
+ aDataForAppend.Free();
+end;
+
+procedure TDAXmlDataStreamer.DoReadDelta(const DeltaName: string;
+ const Destination: IDADelta);
+var schema, rootnode, node, subnode : IXMLNode;
+ x, i : integer;
+ fieldname : string;
+ datatype : TDADataType;
+ changetype : TDAChangeType;
+ changestatus : TDAChangeStatus;
+ changemessage : string;
+ recid : integer;
+ change : TDADeltaChange;
+ val : Variant;
+ lProgress: Boolean;
+ lTotal : integer;
+begin
+ Destination.Clear(TRUE, TRUE);
+ schema := fDeltaSchemaNode.GetNodeByName(DeltaName);
+
+ // Logged fields and their types
+ rootnode := schema.GetNodeByName('LoggedFields');
+ for i := 0 to (rootnode.ChildrenCount-1) do begin
+ fieldname := rootnode.Children[i].GetAttributeByName('Name').Value;
+ datatype := TDADataType(GetEnumValue(TypeInfo(TDADataType), rootnode.Children[i].GetAttributeByName('DataType').Value));
+ Destination.AddFieldName(fieldname, datatype);
+// Destination.AddFieldName(fieldname);
+// Destination.LoggedFieldTypes[i] := datatype;
+ end;
+
+ // Key fields
+ rootnode := schema.GetNodeByName('KeyFields');
+ for i := 0 to (rootnode.ChildrenCount-1) do begin
+ fieldname := rootnode.Children[i].GetAttributeByName('Name').Value;
+ Destination.AddKeyFieldName(fieldname);
+ end;
+
+ // Actual changes
+ rootnode := fDeltaNode.GetNodeByName(DeltaName);
+ lProgress := Assigned(OnReadDeltaProgress);
+ lTotal := rootnode.ChildrenCount;
+ for i := 0 to (rootnode.ChildrenCount-1) do begin
+ node := rootnode.Children[i];
+
+ recid := node.GetNodeByName('RecID').Value;
+ changetype := TDAChangeType(GetEnumValue(TypeInfo(TDAChangeType), node.GetNodeByName('ChangeType').Value));
+ changestatus := TDAChangeStatus(GetEnumValue(TypeInfo(TDAChangeStatus), node.GetNodeByName('Status').Value));
+ changemessage := node.GetNodeByName('Message').Value;
+
+ change := Destination.Add(recid, changetype, changestatus, changemessage);
+
+ subnode := node.GetNodeByName('OldValues');
+ for x := 0 to Destination.LoggedFieldCount-1 do begin
+ val := subnode.GetAttributeValue(Destination.LoggedFieldNames[x], Null);
+ if (val = '') and (Destination.LoggedFieldTypes[x] <> datblob) then begin
+ change.OldValues[x] := NULL;
+ end else begin
+ case Destination.LoggedFieldTypes[x] of
+ datBlob : change.OldValues[x] := ReadBlobValue(subnode, Destination.LoggedFieldNames[x]);
+ datDateTime : change.OldValues[x] := XMLDateTimeToDateTime(val);
+ datFloat,
+ datCurrency: change.OldValues[x] := ReadFloat(val);
+ else
+ change.OldValues[x] := val;
+ end;
+ end;
+ end;
+
+ subnode := node.GetNodeByName('NewValues');
+ for x := 0 to Destination.LoggedFieldCount-1 do begin
+ val := subnode.GetAttributeValue(Destination.LoggedFieldNames[x], Null);
+ if (val = '') and (Destination.LoggedFieldTypes[x] <> datblob) then begin
+ change.NewValues[x] := NULL;
+ end else begin
+ case Destination.LoggedFieldTypes[x] of
+ datBlob : change.NewValues[x] := ReadBlobValue(subnode, Destination.LoggedFieldNames[x]);
+ datDateTime : change.NewValues[x] := XMLDateTimeToDateTime(val);
+ datFloat,
+ datCurrency: change.NewValues[x] := ReadFloat(val);
+ else
+ change.NewValues[x] := val;
+ end;
+ end;
+ end;
+ if lProgress then OnReadDeltaProgress(Self, Destination, i, lTotal);
+ end;
+end;
+
+
+procedure TDAXmlDataStreamer.DoWriteDelta(const Source: IDADelta);
+var
+ rootnode, node, subnode : IXMLNode;
+ x, i : integer;
+ lProgress: Boolean;
+ lTotal : integer;
+begin
+ {
+
+
+
+
+
+
+
+
+ }
+
+ AddingDelta(Source.LogicalName);
+ // Writes the schema of the delta
+ rootnode := fDeltaSchemaNode.Add(Source.LogicalName);
+ node := rootnode.Add('LoggedFields');
+ for i := 0 to (Source.LoggedFieldCount-1) do begin
+ subnode := node.Add('Field');
+ subnode.AddAttribute('Name', Source.LoggedFieldNames[i]);
+ subnode.AddAttribute('DataType', GetEnumName(TypeInfo(TDADataType), Ord(Source.LoggedFieldTypes[i])));
+ end;
+ node := rootnode.Add('KeyFields');
+ for i := 0 to (Source.KeyFieldCount-1) do begin
+ subnode := node.Add('Field');
+ subnode.AddAttribute('Name', Source.KeyFieldNames[i]);
+ end;
+
+ lProgress := Assigned(OnWriteDeltaProgress);
+ lTotal := Source.Count;
+ // Writes the actual changes
+ rootnode := fDeltaNode.Add(Source.LogicalName);
+ Source.RemoveUnchangedChanges;
+ for i := 0 to (Source.Count-1) do begin
+ node := rootnode.Add(nn_Row);
+
+ node.Add('RecID').Value := Source[i].RecID;
+ node.Add('ChangeType').Value := GetEnumName(TypeInfo(TDAChangeType), Ord(Source[i].ChangeType));
+ node.Add('Status').Value := GetEnumName(TypeInfo(TDAChangeStatus), Ord(Source[i].Status));
+ node.Add('Message').Value := Source[i].Message;
+
+ subnode := node.Add('OldValues');
+ for x := 0 to Source.LoggedFieldCount-1 do begin
+ if VarIsNull(Source.Changes[i].OldValues[x]) and (Source.LoggedFieldTypes[x] <> datblob) then begin
+ subnode.AddAttribute(Source.LoggedFieldNames[x], VarToStr(Null))
+ end else begin
+ case Source.LoggedFieldTypes[x] of
+ datblob: WriteBlobValue(subnode, Source.LoggedFieldNames[x], Source.Changes[i].OldValues[x]);
+ datDateTime : subnode.AddAttribute(Source.LoggedFieldNames[x], DateTimeToXMLDateTime(Source.Changes[i].OldValues[x]));
+ datFloat,
+ datCurrency: subnode.AddAttribute(Source.LoggedFieldNames[x], WriteFloat(Source.Changes[i].OldValues[x]));
+ // TODO -cAleF: remember to use the proper XML conversion reoutines here!
+ else subnode.AddAttribute(Source.LoggedFieldNames[x], VarToStr(Source.Changes[i].OldValues[x]));
+ end;
+ end;
+ end;
+
+ subnode := node.Add('NewValues');
+ for x := 0 to Source.LoggedFieldCount-1 do begin
+ if VarIsNull(Source.Changes[i].NewValues[x]) and (Source.LoggedFieldTypes[x] <> datblob) then begin
+ subnode.AddAttribute(Source.LoggedFieldNames[x], VarToStr(Null))
+ end else begin
+ case Source.LoggedFieldTypes[x] of
+ datblob: WriteBlobValue(subnode, Source.LoggedFieldNames[x], Source.Changes[i].NewValues[x]);
+ datDateTime : subnode.AddAttribute(Source.LoggedFieldNames[x], DateTimeToXMLDateTime(Source.Changes[i].NewValues[x]));
+ datFloat,
+ datCurrency: subnode.AddAttribute(Source.LoggedFieldNames[x], WriteFloat(Source.Changes[i].NewValues[x]));
+ // TODO -cAleF: remember to use the proper XML conversion reoutines here!
+ else subnode.AddAttribute(Source.LoggedFieldNames[x], VarToStr(Source.Changes[i].NewValues[x]));
+ end;
+ end;
+ end;
+ if lProgress then OnWriteDeltaProgress(Self, Source, i+1, lTotal);
+ end;
+end;
+
+function TDAXmlDataStreamer.GetXMLDocument(var XMLDocument : IXMLDocument) : IXMLDocument;
+begin
+ if (XMLDocument=NIL) then begin
+ XMLDocument := NewROXmlDocument;
+ XMLDocument.New();
+ end;
+
+ result := XMLDocument;
+end;
+
+function TDAXmlDataStreamer.GetReadXSLT: IXMLDocument;
+begin
+ result := GetXMLDocument(fReadXSLT)
+end;
+
+{function TDAXmlDataStreamer.GetReadDeltaXSLT: IXMLDocument;
+begin
+ result := GetXMLDocument(fReadDeltaXSLT);
+end;}
+
+function TDAXmlDataStreamer.GetWriteXSLT: IXMLDocument;
+begin
+ result := GetXMLDocument(fWriteXSLT);
+end;
+
+{function TDAXmlDataStreamer.GetWriteDeltaXSLT: IXMLDocument;
+begin
+ result := GetXMLDocument(fWriteDeltaXSLT);
+end;}
+
+function TDAXmlDataStreamer.SaveDocumentName: Boolean;
+begin
+ result := fDocumentName<>nn_DocumentName
+end;
+
+procedure TDAXmlDataStreamer.SetDocumentName(const Value: string);
+var n : string;
+begin
+ n := Trim(Value);
+ if (n<>'')
+ then fDocumentName := n;
+end;
+
+procedure TDAXmlDataStreamer.Assign(Source: TPersistent);
+var
+ lSource: TDAXmlDataStreamer;
+begin
+ inherited;
+ if Source is TDAXmlDataStreamer then begin
+ lSource := TDAXmlDataStreamer(Source);
+
+ SkipNull := lSource.SkipNull;
+ SchemaOptions := lSource.SchemaOptions;
+ RowOptions := lSource.RowOptions;
+ Options := lSource.Options;
+ DocumentName := lSource.DocumentName;
+ end;
+end;
+
+procedure TDAXmlDataStreamer.ClearXMLNodes;
+begin
+ fXMLDocument := NIL;
+ fXMLDocument := NewROXmlDocument;
+
+ fSchemaRoot := NIL;
+ fRootNode := NIL;
+ fDatasetSchemaNode := NIL;
+ fDeltaSchemaNode := NIL;
+ fDatasetNode := NIL;
+ fDeltaNode := NIL;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAXMLUtils.pas b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAXMLUtils.pas
new file mode 100644
index 0000000..c12bc44
--- /dev/null
+++ b/internal/6.0.43.801/1/Data Abstract for Delphi/Source/uDAXMLUtils.pas
@@ -0,0 +1,658 @@
+unit uDAXMLUtils;
+
+{----------------------------------------------------------------------------}
+{ Data Abstract Library - Core Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the Data Abstract }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I DataAbstract.inc}
+
+interface
+
+uses Classes, TypInfo, uROXMLIntf, uDAInterfaces;
+
+const
+ // Misc
+ ValueNIL = 'NIL';
+
+ // Attribute names
+ attr_Type = 'Type';
+ attr_IsObject = 'IsObject';
+ attr_ByRef = 'ByRef';
+ attr_RefName = 'RefName';
+ attr_Owner = 'Owner';
+ attr_IsCollection = 'IsCollection';
+ attr_IsArray = 'IsArray';
+ attr_Count = 'Count';
+ attr_ItemClass = 'ItemClass';
+ attr_Item = 'Item';
+ attr_ClassName = 'ClassName';
+ attr_IsNull = 'IsNull';
+
+type
+ { Misc }
+ TROXMLStreamerOption = (soIncludeType);
+ TROXMLStreamerOptions = set of TROXMLStreamerOption;
+
+ { TROXMLStreamer }
+ TROXMLStreamer = class(TComponent)
+ private
+ fXMLStreamerOptions: TROXMLStreamerOptions;
+ fPropertiesToIgnore: TStringList;
+
+ procedure SetPropertiesToIgnore(const Value: TStrings);
+ function GetPropertiesToIgnore: TStrings;
+
+ protected
+ procedure SerializeSimpleType(const aTargetNode: IXMLNode; anObject: TObject; aPropertyInfo: PPropInfo);
+ procedure SerializeObject(const anObjectNode: IXMLNode; anObject: TObject; IsRoot: boolean = FALSE);
+
+ procedure DeserializeObject(const anObjectNode: IXMLNode; anObject: TObject; IsRoot: boolean = FALSE);
+
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+
+ procedure Serialize(const aSource: TObject; const anObjectNode: IXMLNode; IsRoot: boolean = True); overload;
+ procedure Serialize(const aSource: TObject; aStream: TStream); overload;
+ procedure Deserialize(aStream: TStream; aDestination: TObject);
+
+ published
+ property StreamerOptions: TROXMLStreamerOptions read fXMLStreamerOptions write fXMLStreamerOptions;
+ property PropertiesToIgnore: TStrings read GetPropertiesToIgnore write SetPropertiesToIgnore;
+ end;
+
+// Quick access functions
+procedure SaveObjectToXMLNode(aSource: TObject; anObjectNode: IXMLNode; somePropertiesToIgnore: array of string; someStreamerOptions: TROXMLStreamerOptions = []; IsRoot: boolean = True);
+procedure SaveObjectToStream(aSource: TObject; aStream: TStream; somePropertiesToIgnore: array of string; someStreamerOptions: TROXMLStreamerOptions = []);
+procedure LoadObjectFromStream(aStream: TStream; aDestination: TObject; somePropertiesToIgnore: array of string);
+
+procedure SaveObjectToFile(aSource: TObject; const aFileName: string; somePropertiesToIgnore: array of string; someStreamerOptions: TROXMLStreamerOptions = []);
+procedure LoadObjectFromFile(const aFileName: string; aDestination: TObject; somePropertiesToIgnore: array of string);
+
+// Dataset oriented functions
+function DatasetToXML(
+ const aDataset : IDADataset;
+ const RootNodeName : string = '';
+ const RecordNodeName : string = 'Record';
+ IncludeSchema : boolean = TRUE) : IXMLDocument;
+
+procedure XMLToCommandParams(const aCommand : IDASQLCommand; const XML : string);
+function XMLToUpdateCommand(const aConnection : IDAConnection;
+ const aReferencedDataset : TDADataset;
+ const aTargetTableName : string;
+ const aXML : string) : IDASQLCommand;
+
+
+implementation
+
+uses SysUtils, uROTypes, Variants;
+
+procedure SaveObjectToXMLNode(aSource: TObject; anObjectNode: IXMLNode; somePropertiesToIgnore: array of string; someStreamerOptions: TROXMLStreamerOptions = []; IsRoot: boolean = True);
+var
+ i: integer;
+begin
+ with TROXMLStreamer.Create(nil) do try
+ for i := 0 to High(somePropertiesToIgnore) do
+ PropertiesToIgnore.Add(somePropertiesToIgnore[i]);
+
+ StreamerOptions := someStreamerOptions;
+ Serialize(aSource, anObjectNode,IsRoot);
+ finally
+ Free;
+ end;
+end;
+
+procedure SaveObjectToStream(aSource: TObject; aStream: TStream; somePropertiesToIgnore: array of string; someStreamerOptions: TROXMLStreamerOptions = []);
+var
+ i: integer;
+begin
+ with TROXMLStreamer.Create(nil) do try
+ for i := 0 to High(somePropertiesToIgnore) do
+ PropertiesToIgnore.Add(somePropertiesToIgnore[i]);
+
+ StreamerOptions := someStreamerOptions;
+ Serialize(aSource, aStream);
+ finally
+ Free;
+ end;
+end;
+
+procedure LoadObjectFromStream(aStream: TStream; aDestination: TObject; somePropertiesToIgnore: array of string);
+var
+ i: integer;
+begin
+ with TROXMLStreamer.Create(nil) do try
+ for i := 0 to High(somePropertiesToIgnore) do
+ PropertiesToIgnore.Add(somePropertiesToIgnore[i]);
+
+ Deserialize(aStream, aDestination);
+ finally
+ Free;
+ end;
+end;
+
+procedure SaveObjectToFile(aSource: TObject; const aFileName: string; somePropertiesToIgnore: array of string; someStreamerOptions: TROXMLStreamerOptions = []);
+var
+ fs: TFileStream;
+begin
+ fs := TFileStream.Create(aFileName, fmCreate);
+ try
+ SaveObjectToStream(aSource, fs, somePropertiesToIgnore, someStreamerOptions);
+ finally
+ fs.Free;
+ end;
+end;
+
+procedure LoadObjectFromFile(const aFileName: string; aDestination: TObject; somePropertiesToIgnore: array of string);
+var
+ fs: TFileStream;
+begin
+ fs := TFileStream.Create(aFileName, fmOpenRead + fmShareDenyWrite);
+ try
+ LoadObjectFromStream(fs, aDestination, somePropertiesToIgnore);
+ finally
+ fs.Free;
+ end;
+end;
+
+{ TROXMLStreamer }
+
+constructor TROXMLStreamer.Create(aOwner: TComponent);
+begin
+ inherited;
+
+ fPropertiesToIgnore := TStringList.Create;
+ fPropertiesToIgnore.Sorted := TRUE;
+ fPropertiesToIgnore.Duplicates := dupError;
+
+ fXMLStreamerOptions := [soIncludeType];
+end;
+
+destructor TROXMLStreamer.Destroy;
+begin
+ fPropertiesToIgnore.Free;
+
+ inherited;
+end;
+
+procedure TROXMLStreamer.Deserialize(aStream: TStream; aDestination: TObject);
+var
+ xml: IXMLDocument;
+begin
+ if (aStream = nil) then raise Exception.Create('Invalid stream');
+
+ xml := NewROXmlDocument;
+ xml.New('');
+ xml.LoadFromStream(aStream);
+
+ if (xml.DocumentNode.Value = ValueNIL) then
+ FreeAndNIL(aDestination)
+ else
+ DeserializeObject(xml.DocumentNode, aDestination, TRUE);
+end;
+
+procedure TROXMLStreamer.Serialize(const aSource: TObject; aStream: TStream);
+{$IFNDEF RemObjects_OpenXML}
+const
+ _xls = ''+sLineBreak+
+ ''+sLineBreak+
+ ' '+sLineBreak+
+ ''+sLineBreak+
+ ''+sLineBreak+
+ ' '+sLineBreak+
+ ' '+sLineBreak+
+ ' '+sLineBreak+
+ ' ';
+{$ENDIF RemObjects_OpenXML}
+var
+ xml: IXMLDocument;
+begin
+ if (aStream = nil) then raise Exception.Create('Invalid stream');
+
+ xml := NewROXmlDocument;
+ try
+ if (aSource = nil) then begin
+ xml.New(ValueNIL);
+ Exit;
+ end
+ else
+ xml.New(aSource.ClassName);
+
+ // Serializes the object
+ SerializeObject(xml.DocumentNode, aSource, TRUE);
+ finally
+ {$IFDEF RemObjects_OpenXML}
+ xml.SaveToStream(aStream);
+ {$ELSE}
+ xml.Transform2(_xls, aStream);
+ {$ENDIF}
+ end;
+end;
+
+procedure TROXMLStreamer.SerializeSimpleType(const aTargetNode: IXMLNode; anObject: TObject; aPropertyInfo: PPropInfo);
+var
+ int64val: int64;
+ intval: integer;
+ dblval: double;
+ strval: string;
+ {$IFNDEF DELPHI5}wstrval: widestring;
+ {$ENDIF}
+ lName: string;
+begin
+ lName := {$IFDEF UNICODE}UTF8ToString{$ENDIF}(aPropertyInfo^.Name);
+ case aPropertyInfo^.PropType^.Kind of
+ {$IFDEF FPC}tkBool,{$ENDIF}
+ tkEnumeration: begin
+ //enuval := GetOrdProp(anObject, lName);
+ aTargetNode.Value := GetPropValue(anObject, lName, TRUE);
+ end;
+
+ tkInteger: begin
+ intval := GetOrdProp(anObject, lName);
+ aTargetNode.Value := intval;
+ end;
+
+ tkFloat: begin
+ dblval := GetFloatProp(anObject, lName);
+ aTargetNode.Value := dblval;
+ end;
+
+ tkLString,
+ {$IFDEF FPC}tkAString,{$ENDIF}
+ tkString: begin
+ strval := GetStrProp(anObject, lName);
+ aTargetNode.Value := strval;
+ end;
+
+ tkInt64: begin
+ int64val := GetInt64Prop(anObject, lName);
+ aTargetNode.Value := int64val;
+ end;
+ {$IFDEF UNICODE}tkUString,{$ENDIF}
+ tkWString: begin
+ {$IFDEF DELPHI5}
+ strval := GetStrProp(anObject, lName);
+ aTargetNode.Value := strval;
+ {$ELSE}
+ wstrval := GetWideStrProp(anObject, lName);
+ aTargetNode.Value := wstrval;
+ {$ENDIF}
+ end;
+
+ tkVariant, tkSet: begin
+ aTargetNode.Value := GetVariantProp(anObject, lName);
+ end;
+
+ else
+ raise Exception.Create(Format('Type not supported %s', [GetEnumName(TypeInfo(TTypeKind), Ord(aPropertyInfo^.PropType^.Kind))]))
+ end;
+end;
+
+procedure TROXMLStreamer.SerializeObject(const anObjectNode: IXMLNode; anObject: TObject; IsRoot: boolean = FALSE);
+var
+ props: PPropList;
+ x, cnt, i: integer;
+ subnode, node: IXMLNode;
+ coll: TCollection;
+ // Temporary variables
+ objval: TObject;
+ pdata: PTypeData;
+ lname: string;
+begin
+ if (anObject <> nil) and (anObject.ClassInfo <> nil) then begin
+ pdata := GetTypeData(anObject.ClassInfo);
+
+ if (pdata <> nil) then begin
+
+ cnt := pdata.PropCount;
+
+ if (cnt > 0) then begin
+ GetMem(props, cnt * SizeOf(PPropInfo));
+
+ try
+ cnt := GetPropList(PTypeInfo(anObject.ClassInfo), tkProperties, props);
+
+ for i := 0 to (cnt - 1) do begin
+ lName := {$IFDEF UNICODE}UTF8ToString{$ENDIF}(props^[i]^.Name);
+ if IsRoot and (fPropertiesToIgnore.IndexOf(lName) >= 0)
+ or not IsStoredProp(anObject, props^[i]) then Continue;
+
+ node := anObjectNode.Add(lName);
+
+ with props^[i]^ do
+ // Class types
+ if (PropType^.Kind = tkClass) then begin
+ node.AddAttribute(attr_Type, props^[i]^.PropType^.Name); // Always set fo object types
+ objval := GetObjectProp(anObject, lName);
+ node.AddAttribute(attr_IsObject, XMLBooleans[TRUE]);
+
+ if Assigned(objval) then begin
+ // TComponent
+
+ if (objval is TStrings) then begin
+ node.Value := TStrings(objval).Text;
+ end else
+ if (objval is TComponent) then begin
+ if (TComponent(objval).Owner = anObject) then
+ SerializeObject(node, objval) // Owned sub-component
+ else begin
+ // Reference to another component
+ node.AddAttribute(attr_ByRef, XMLBooleans[TRUE]);
+ node.AddAttribute(attr_RefName, TComponent(objval).Name);
+ if (TComponent(objval).Owner <> nil) then node.AddAttribute(attr_Owner, TComponent(objval).Owner.Name);
+ end;
+ end
+
+ // TCollection
+ else if (objval is TCollection) then begin
+ coll := TCollection(objval);
+ node.AddAttribute(attr_IsCollection, XMLBooleans[TRUE]);
+ node.AddAttribute(attr_Count, coll.Count);
+ node.AddAttribute(attr_ItemClass, coll.ItemClass.ClassName);
+
+ for x := 0 to (coll.Count - 1) do begin
+ subnode := node.Add(attr_Item + IntToStr(x));
+ SerializeObject(subnode, coll.Items[x]);
+ end;
+ end
+
+ // Standard persistent class
+ else
+ SerializeObject(node, objval);
+ end
+
+ // NIL object
+ else
+ node.AddAttribute(attr_IsNull, XMLBooleans[TRUE]);
+ end
+
+ // Simple types
+ else begin
+ if (soIncludeType in fXMLStreamerOptions) then node.AddAttribute(attr_Type, props^[i]^.PropType^.Name);
+ SerializeSimpleType(node, anObject, props^[i]);
+ end;
+ end;
+ finally
+ FreeMem(props, cnt * SizeOf(PPropInfo));
+ end;
+ end
+
+(* // TROArray (they don't have properties so they will not fall in the previous block)
+ else if (anObject is TROArray) then begin
+ arr := TROArray(anObject);
+ anObjectNode.AddAttribute(attr_IsArray, XMLBooleans[TRUE]);
+ anObjectNode.AddAttribute(attr_Count, arr.Count);
+
+ if (arr.GetItemType<>NIL) then begin
+ anObjectNode.AddAttribute(attr_ItemClass, arr.GetItemType^.Name);
+ for x := 0 to (arr.Count-1) do begin
+ subnode := anObjectNode.Add(attr_Item+IntToStr(x));
+ SerializeObject(subnode, TObject(arr.GetItemRef(x)));
+ end;
+ end;
+ end*)
+ end;
+ end
+
+ else
+ anObjectNode.AddAttribute(attr_IsNull, XMLBooleans[TRUE]);
+end;
+
+procedure TROXMLStreamer.DeserializeObject(const anObjectNode: IXMLNode;
+ anObject: TObject; IsRoot: boolean = FALSE);
+var
+ props: PPropList;
+ x, cnt, i: integer;
+ node: IXMLNode;
+ coll: TCollection;
+
+ // Temporary variables
+ objval: TObject;
+ pdata: PTypeData;
+ collitem: TCollectionItem;
+ strVal: string;
+ lName: string;
+begin
+ if (anObjectNode.GetAttributeValue(attr_IsNull, XMLBooleans[FALSE]) = XMLBooleans[TRUE]) then begin
+ //anObject := NIL;
+ Exit;
+ end;
+
+ pdata := GetTypeData(anObject.ClassInfo);
+
+ if (pdata <> nil) then begin
+
+ cnt := pdata.PropCount;
+
+ if (cnt > 0) then begin
+ GetMem(props, cnt * SizeOf(PPropInfo));
+
+ try
+ cnt := GetPropList(PTypeInfo(anObject.ClassInfo), tkProperties, props);
+
+ for i := 0 to (cnt - 1) do begin
+ lname:= {$IFDEF UNICODE}UTF8ToString {$ENDIF}(props^[i]^.Name);
+ if IsRoot and (fPropertiesToIgnore.IndexOf(lName) >= 0) then Continue;
+
+ node := anObjectNode.GetNodeByName(lName);
+ if (node = nil) then Continue; // Property was not streamed
+
+ with props^[i]^ do
+ // Class types
+ if (PropType^.Kind = tkClass) then begin
+ objval := GetObjectProp(anObject, lName);
+
+ if (objval = nil) then
+ Continue
+
+ else begin
+ // TComponent
+ if (objval is TStrings) then begin
+ TStrings(objval).Text := node.Value;
+ end else
+ if (objval is TComponent) then begin
+ if (TComponent(objval).Owner = anObject) then
+ DeserializeObject(node, objval) // Owned sub-component
+ else begin
+ // Reference to another component
+ {node.AddAttribute(attr_ByRef, XMLBooleans[TRUE]);
+ node.AddAttribute(attr_RefName, TComponent(objval).Name);
+ if (TComponent(objval).Owner<>NIL)
+ then node.AddAttribute(attr_Owner, TComponent(objval).Owner.Name);}
+ end;
+ end
+
+ // TCollection
+ else if (objval is TCollection) then begin
+ coll := TCollection(objval);
+ coll.Clear;
+
+ for x := 0 to (node.ChildrenCount - 1) do try
+ if SameText(Copy(node.Children[x].Name, 1, 4), attr_Item) then begin
+ collitem := coll.Add;
+ DeserializeObject(node.Children[x], collitem);
+ end;
+ except
+ raise
+ end;
+ end
+
+ // Standard persistent class
+ else
+ DeserializeObject(node, objval);
+ end
+ end
+
+ // Simple types
+ else begin
+ case PropType^.Kind of
+ tkEnumeration: begin
+ // If enumerated values are empty, it should just skip and leave the defaults.
+ // Not doing so generates a range check error.
+ strVal := VarToStr(node.Value);
+ if (strVal<>'')
+ then SetPropValue(anObject, lName, GetEnumValue(props^[i]^.PropType{$IFNDEF FPC}^{$ENDIF}, strVal));
+ end;
+ else
+ SetPropValue(anObject, lName, node.Value);
+ end;
+ end;
+ end;
+ finally
+ FreeMem(props, cnt * SizeOf(PPropInfo));
+ end;
+ end
+
+ // TROArray (they don't have properties so they will not fall in the previous block)
+(* else if (anObject is TROArray) then begin
+ arr := TROArray(anObject);
+ arr.Resize(anObjectNode.ChildrenCount-1);
+
+ if (arr.GetItemType<>NIL) then begin
+ arr.GetItemClass.Create
+ anObjectNode.AddAttribute(attr_ItemClass, arr.GetItemType^.Name);
+ for x := 0 to (arr.Count-1) do begin
+ subnode := anObjectNode.Add(attr_Item+IntToStr(x));
+ SerializeObject(subnode, TObject(arr.GetItemRef(x)));
+ end;
+ end;
+ end*)
+ end;
+end;
+
+procedure TROXMLStreamer.SetPropertiesToIgnore(const Value: TStrings);
+begin
+ fPropertiesToIgnore.Assign(Value);
+end;
+
+function TROXMLStreamer.GetPropertiesToIgnore: TStrings;
+begin
+ result := fPropertiesToIgnore;
+end;
+
+// Dataset oriented functions
+function DatasetToXML(
+ const aDataset : IDADataset;
+ const RootNodeName : string = '';
+ const RecordNodeName : string = 'Record';
+ IncludeSchema : boolean = TRUE) : IXMLDocument;
+var root, node : IXMLNode;
+ i : integer;
+begin
+ result := NewROXmlDocument;
+
+ if (RootNodeName<>'') then result.New(RootNodeName)
+ else begin
+ if (Trim(aDataset.Name)<>'') then result.New(aDataset.Name)
+ else result.New('Dataset');
+ end;
+
+ if not aDataset.Active then Exit;
+
+ root := result.DocumentNode;
+
+ if IncludeSchema then begin
+ end;
+
+ while not aDataset.EOF do try
+ node := root.Add(RecordNodeName);
+ for i := 0 to aDataset.FieldCount-1 do begin
+ node.Add(aDataset.Fields[i].Name).Value := aDataset.Fields[i].AsString;
+ end;
+ finally
+ aDataset.Next;
+ end;
+end;
+
+procedure XMLToCommandParams(const aCommand : IDASQLCommand; const XML : string);
+var xmldoc : IXMLDocument;
+ i : integer;
+ node : IXMLNode;
+ param : TDAParam;
+begin
+ xmldoc := NewROXmlDocument;
+ xmldoc.New('CommandParams');
+ xmldoc.XML := XML;
+
+ for i := 0 to (aCommand.Params.Count-1) do
+ aCommand.Params[i].Value := Null;
+
+ for i := 0 to (xmldoc.DocumentNode.ChildrenCount-1) do begin
+ node := xmldoc.DocumentNode.Children[i];
+ param := aCommand.Params.FindParam(node.Name);
+ if (param=NIL) then Continue;
+
+ param.Value := node.Value;
+ end;
+end;
+
+function XMLToUpdateCommand(const aConnection : IDAConnection;
+ const aReferencedDataset : TDADataset;
+ const aTargetTableName : string;
+ const aXML : string) : IDASQLCommand;
+const CRLF = #13#10;
+var fld : TDAField;
+ i : integer;
+ xmldoc : IXMLDocument;
+ nme, where, sql : string;
+begin
+ xmldoc := NewROXmlDocument;
+ xmldoc.New;
+ xmldoc.XML := aXML;
+
+ result := NIL;
+ if (xmldoc.DocumentNode.ChildrenCount=0)
+ then raise Exception.Create('Invalid XML document. Cannot generate an update statement');
+
+ sql := 'UPDATE '+aTargetTableName+' SET'+CRLF;
+ where := '';
+
+ with xmldoc do begin
+ for i := 0 to (DocumentNode.ChildrenCount-1) do begin
+ nme := DocumentNode.Children[i].Name;
+ fld := aReferencedDataset.Fields.FindField(nme);
+
+ if (fld=NIL) then begin
+ if (Pos(old_FieldPrefix, UpperCase(nme))=1) then begin
+ if (where<>'') then where := where+' AND ';
+ nme := Copy(nme, Length(old_FieldPrefix)+1, MaxInt);
+ fld := aReferencedDataset.Fields.FindField(nme);
+ if (fld=NIL) then Continue;
+ if (fld.DataType in [datWideString, datString, datDateTime])
+ then where := where+nme+'='+''''+VarToStr(DocumentNode.Children[i].Value)+''''
+ else where := where+nme+'='+VarToStr(DocumentNode.Children[i].Value);
+
+ end;
+ Continue;
+ end
+ else begin
+ sql := sql+fld.Name+'=';
+ if (fld.DataType in [datWideString, datString, datDateTime])
+ then sql := sql+''''+VarToStr(DocumentNode.Children[i].Value)+''''
+ else sql := sql+VarToStr(DocumentNode.Children[i].Value);
+ sql := sql+','+CRLF;
+ end;
+ end;
+ end;
+ sql := Copy(sql, 1, Length(sql)-3)+CRLF;
+
+ if (where<>'') then sql := sql+' WHERE '+where;
+
+ result := aConnection.NewCommand(sql, stSQL, 'UPDATE_'+aTargetTableName);
+end;
+
+procedure TROXMLStreamer.Serialize(const aSource: TObject; const anObjectNode: IXMLNode; IsRoot: boolean = True);
+begin
+ if (anObjectNode = nil) then raise Exception.Create('Invalid XMLNode.');
+ if (aSource <> nil) then SerializeObject(anObjectNode, aSource, IsRoot);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/unins000.dat b/internal/6.0.43.801/1/Data Abstract for Delphi/unins000.dat
new file mode 100644
index 0000000..be2621f
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/unins000.dat differ
diff --git a/internal/6.0.43.801/1/Data Abstract for Delphi/unins000.exe b/internal/6.0.43.801/1/Data Abstract for Delphi/unins000.exe
new file mode 100644
index 0000000..00508f0
Binary files /dev/null and b/internal/6.0.43.801/1/Data Abstract for Delphi/unins000.exe differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/1033/RemObjects.Everwood.Resources.dll b/internal/6.0.43.801/1/Everwood/Bin/1033/RemObjects.Everwood.Resources.dll
new file mode 100644
index 0000000..4247833
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/1033/RemObjects.Everwood.Resources.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/EWSetRegistryPath.exe b/internal/6.0.43.801/1/Everwood/Bin/EWSetRegistryPath.exe
new file mode 100644
index 0000000..49b5a72
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/EWSetRegistryPath.exe differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/EWSetRegistryPath.log b/internal/6.0.43.801/1/Everwood/Bin/EWSetRegistryPath.log
new file mode 100644
index 0000000..473d936
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Bin/EWSetRegistryPath.log
@@ -0,0 +1,8 @@
+29/01/2010 16:38:41 - Adding C:\Archivos de programa\RemObjects Software\RemObjects SDK for Delphi\Dcu\D14
+29/01/2010 16:38:41 - Adding C:\Archivos de programa\RemObjects Software\RemObjects SDK for Delphi\Source;C:\Archivos de programa\RemObjects Software\RemObjects SDK for Delphi\Source\CodeGen
+29/01/2010 16:38:41 - Adding C:\Archivos de programa\RemObjects Software\RemObjects SDK for Delphi\Source\DataSnap;C:\Archivos de programa\RemObjects Software\RemObjects SDK for Delphi\Source\ZLib
+29/01/2010 16:38:41 - Adding C:\Archivos de programa\RemObjects Software\RemObjects SDK for Delphi\Source\RODX;C:\Archivos de programa\RemObjects Software\RemObjects SDK for Delphi\Source\RODEC
+29/01/2010 16:38:41 - Adding C:\Archivos de programa\RemObjects Software\RemObjects SDK for Delphi\Source\Synapse;$(Everwood)\Bin
+29/01/2010 16:38:41 - Adding C:\Archivos de programa\RemObjects Software\Pascal Script for Delphi\Dcu\D14;C:\Archivos de programa\RemObjects Software\Pascal Script for Delphi\Source
+29/01/2010 16:38:42 - Adding C:\Archivos de programa\RemObjects Software\Data Abstract for Delphi\Source;C:\Archivos de programa\RemObjects Software\Data Abstract for Delphi\Dcu\D14
+29/01/2010 16:38:42 - Adding C:\Archivos de programa\RemObjects Software\Data Abstract for Delphi\Source\Drivers
diff --git a/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.OLE.Interop.dll b/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.OLE.Interop.dll
new file mode 100644
index 0000000..bcdd96d
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.OLE.Interop.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.Shell.Interop.8.0.dll b/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.Shell.Interop.8.0.dll
new file mode 100644
index 0000000..778b6ad
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.Shell.Interop.8.0.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.Shell.Interop.dll b/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.Shell.Interop.dll
new file mode 100644
index 0000000..a4b7afe
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.Shell.Interop.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.TextManager.Interop.dll b/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.TextManager.Interop.dll
new file mode 100644
index 0000000..553e141
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.TextManager.Interop.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.VSIP.Helper.dll b/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.VSIP.Helper.dll
new file mode 100644
index 0000000..9ffccfb
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/Microsoft.VisualStudio.VSIP.Helper.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.BDS5.dll b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.BDS5.dll
new file mode 100644
index 0000000..b4c88c0
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.BDS5.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.BDS6.dll b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.BDS6.dll
new file mode 100644
index 0000000..05e0411
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.BDS6.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.BDS7.dll b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.BDS7.dll
new file mode 100644
index 0000000..05330c1
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.BDS7.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.ShDocWv.dll b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.ShDocWv.dll
new file mode 100644
index 0000000..d5528f0
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.ShDocWv.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.VarReplacer.exe b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.VarReplacer.exe
new file mode 100644
index 0000000..8d01880
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.VarReplacer.exe differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.VisualStudio.dll b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.VisualStudio.dll
new file mode 100644
index 0000000..87b8c16
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.VisualStudio.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.dll b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.dll
new file mode 100644
index 0000000..8bda1ab
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects.Everwood.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D11.bpl b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D11.bpl
new file mode 100644
index 0000000..7d6deb6
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D11.dcp b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D11.dcp
new file mode 100644
index 0000000..9ba21e8
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D12.bpl b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D12.bpl
new file mode 100644
index 0000000..0654f25
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D12.bpl differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D12.dcp b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D12.dcp
new file mode 100644
index 0000000..4938c05
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D12.dcp differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D14.bpl b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D14.bpl
new file mode 100644
index 0000000..ddb60b7
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D14.bpl differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D14.dcp b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D14.dcp
new file mode 100644
index 0000000..0e0f486
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D14.dcp differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D7.bpl b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D7.bpl
new file mode 100644
index 0000000..912a1d7
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D7.dcp b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D7.dcp
new file mode 100644
index 0000000..ebd2951
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/RemObjects_Everwood_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Everwood/Bin/SHDocVw.dll b/internal/6.0.43.801/1/Everwood/Bin/SHDocVw.dll
new file mode 100644
index 0000000..77b0ae8
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Bin/SHDocVw.dll differ
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki.HxC b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki.HxC
new file mode 100644
index 0000000..fe86782
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki.HxC
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki.HxS b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki.HxS
new file mode 100644
index 0000000..d6c8d63
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki.HxS differ
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki.HxT b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki.HxT
new file mode 100644
index 0000000..3cbd108
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki.HxT
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_A.HxK b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_A.HxK
new file mode 100644
index 0000000..4f0e99b
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_A.HxK
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_D.HxK b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_D.HxK
new file mode 100644
index 0000000..a44afbb
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_D.HxK
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_F.HxK b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_F.HxK
new file mode 100644
index 0000000..6cb9b25
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_F.HxK
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_K.HxK b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_K.HxK
new file mode 100644
index 0000000..5ad4b08
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_K.HxK
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_N.HxK b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_N.HxK
new file mode 100644
index 0000000..d03796a
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/DelphiHelp/RemObjectsDelphiWiki_N.HxK
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/h2reg.exe b/internal/6.0.43.801/1/Everwood/DelphiHelp/h2reg.exe
new file mode 100644
index 0000000..270ad45
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/DelphiHelp/h2reg.exe differ
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/h2reg.ini b/internal/6.0.43.801/1/Everwood/DelphiHelp/h2reg.ini
new file mode 100644
index 0000000..5287ad5
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/DelphiHelp/h2reg.ini
@@ -0,0 +1,101 @@
+[MAIN]
+DebugMode=0 ;set to 1 to log everything - Check your resources (ship with =0)
+DumpNSToLog_before=0 ;Very verbose but good for debugging - dumps all NS info to log file before Registration
+DumpNSToLog_after=0 ;Very verbose but good for debugging - dumps all NS info to log file after Registration
+OKtoReport_FinalRegError=0 ;Report general error at end if a registration error was logged
+OKtoReport_FinalUnRegError=0 ;Report general error at end if a unregistration error was logged
+
+;Advanced feature - These can be set then used as etc specifiers. They can
+;also be set via the H2Reg.exe command line. Command line has preference over INI file.
+UserDir1=''
+UserDir2=''
+UserDir3=''
+UserDir4=''
+
+; Resource Strings
+
+[en] ; English
+ErrSt_SysFileNotFound = 'Installation Error. Error reading system file or file not found.|%s'
+ErrSt_MSHelp2RTNotFound = 'MS Help 2.x runtime files are not installed on this PC.'
+ErrSt_NotAdminMode = 'You must be logged on as an Administrator.'
+ErrSt_Extra = 'Installation/registration of Help files cannot proceed.'
+
+Msg_Registering = 'Registering Online Documentation Files:'
+Msg_UnRegistering = 'Unregistering Online Documentation Files:'
+Msg_LoggingNSInfo = 'Logging Namespace Info'
+Msg_Registering_Namespaces = 'Registering Namespaces'
+Msg_Registering_Titles = 'Registering Titles'
+Msg_Registering_Plugins = 'Registering Plug-ins'
+Msg_Registering_Filters = 'Registering Filters'
+Msg_UnRegistering_Namespaces = 'Unregistering Namespaces'
+Msg_UnRegistering_Titles = 'Unregistering Titles'
+Msg_UnRegistering_Plugins = 'Unregistering Plug-ins'
+Msg_UnRegistering_Filters = 'Unregistering Filters'
+
+Msg_Merging_Namespaces = 'Merging Help Indexes. This may take several minutes'
+
+PopupSt_FinalRegError='There were errors reported while Registering help files.||View Log file?'
+PopupSt_FinalUnRegError='There were errors reported while Unregistering help files.||View Log file?'
+
+; International Strings - Defaults to [en]
+[de] ; German
+[ja] ; Japanese
+[fr] ; French
+[es] ; Spanish
+[it] ; Italian
+[ko] ; Korean
+[cn] ; Chinese (Simplified)
+[tw] ; Chinese (Traditional)
+[sv] ; Swedish
+[nl] ; Dutch
+[ru] ; Russian
+[ar] ; Arabic
+[he] ; Hebrew
+[da] ; Danish
+[no] ; Norwegian
+[fi] ; Finnish
+[pt] ; Portuguese
+[br] ; Brazilian
+[cs] ; Czech
+[pl] ; Polish
+[hu] ; Hungarian
+[el] ; Greek
+[tr] ; Turkish
+[sl] ; Slovenian
+[sk] ; Slovakian
+[eu] ; Basque
+[ca] ; Catalan
+
+;--- Optionally you can place your Registration Commands in this file
+
+;------- Register -r switch
+
+[Reg_Namespace]
+RemObjectsDelphiWiki|RemObjectsDelphiWiki.HxC|RemObjects Wiki
+
+[Reg_Title]
+RemObjectsDelphiWiki|RemObjectsDelphiWiki|1033|RemObjectsDelphiWiki.HxS
+
+[Reg_Plugin]
+embarcadero.*|_DEFAULT|RemObjectsDelphiWiki|_DEFAULT
+borland.*|_DEFAULT|RemObjectsDelphiWiki|_DEFAULT
+
+[Reg_Filter]
+;||
+RemObjectsDelphiWiki|RemObjects Wiki|("DocSet"="RemObjects Wiki")
+
+;------- UnRegister -u switch
+
+[UnReg_Namespace]
+RemObjectsDelphiWiki|RemObjects Wiki
+
+[UnReg_Title]
+RemObjectsDelphiWiki|RemObjectsDelphiWiki|1033
+
+[UnReg_Plugin]
+embarcadero.*|_DEFAULT|RemObjectsDelphiWiki|_DEFAULT
+borland.*|_DEFAULT|RemObjectsDelphiWiki|_DEFAULT
+
+[UnReg_Filter]
+RemObjectsDelphiWiki|RemObjects Wiki
+
diff --git a/internal/6.0.43.801/1/Everwood/DelphiHelp/h2reg_Log.txt b/internal/6.0.43.801/1/Everwood/DelphiHelp/h2reg_Log.txt
new file mode 100644
index 0000000..0b46b0b
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/DelphiHelp/h2reg_Log.txt
@@ -0,0 +1,62 @@
+===============================================================================
+Log File: C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp\h2reg_Log.txt
+Date: 29/01/2010 16:38:36
+Operating System: Windows XP 5.1 (Build 2600) Service Pack 2
+SysLocale.DefaultLCID: 0x0C0A (3082)
+SysLocale.PriLangID: 0x000A (10)
+SysLocale.SubLangID: 0x0003 (3)
+DecimalSeparator: ,
+-------------------------------------------------------------------------------
+EXE Path = C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp\h2reg.exe
+Cmdline Param(s) = -r | -m | -q | CmdFile=C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp\h2reg.ini
+Actual CmdLine = "C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp\h2reg.exe" -r -m -q CmdFile="C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp\h2reg.ini"
+_RunDir = C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp
+_ModuleName = h2reg.exe
+_ModuleDir = C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp
+-------------------------------------------------------------------------------
+_hhInstalled = YES
+_hhVerStr = 5.2.3790.2847
+_hhFriendlyVerStr = > 1.4a
+-------------------------------------------------------------------------------
+_ieInstalled = YES
+_ieVerStr = 6.0.2900.3086
+_ieFriendlyVerStr = > Internet Explorer 6 SP1
+===============================================================================
+MS Help 2.x Runtime Found: NO
+NT Admin Log On: YES
+PC Language ID = es
+-------------------------------------------------------------------------------
+Quiet Mode (-Q): Yes
+Registration Mode (-R): Yes
+UnRegistration Mode (-U): No
+Append Log Mode (-A): No
+No NT Admin Check (-N): No
+Merge Indexes Mode (-M): Yes
+Cmd Script File (CmdFile=): C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp\h2reg.ini
+User Dir 1 (UserDir1=):
+User Dir 2 (UserDir2=):
+User Dir 3 (UserDir3=):
+User Dir 4 (UserDir4=):
+===============================================================================
+CmdFile = C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp\h2reg.ini
+ = C:\WINDOWS
+ = C:\WINDOWS\system32
+ = C:\Archivos de programa
+ = C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp
+ = C:\Archivos de programa\RemObjects Software\Everwood
+ = C:\Archivos de programa\RemObjects Software\Everwood\DelphiHelp
+ = C:\Archivos de programa\RemObjects Software\Everwood
+ =
+ =
+ =
+ =
+ =
+ =
+ =
+ =
+-------------------------------------------------------------------------------
+16:38:36 ** Error **
MS Help 2.x runtime files are not installed on this PC.
+16:38:36 Program Aborted!!
+
+--END OF FILE--
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/Everwood.inc b/internal/6.0.43.801/1/Everwood/Source/Delphi/Everwood.inc
new file mode 100644
index 0000000..7f6a92f
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/Everwood.inc
@@ -0,0 +1,6 @@
+{$INCLUDE eDefines.inc}
+
+{$IFDEF FPC}
+ {$MODE DELPHI}
+{$ENDIF}
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/EverwoodIDEResources.lrs b/internal/6.0.43.801/1/Everwood/Source/Delphi/EverwoodIDEResources.lrs
new file mode 100644
index 0000000..b0fbd11
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/EverwoodIDEResources.lrs
@@ -0,0 +1,524 @@
+LazarusResources.Add('EverwoodWizardStandardIcon','ICO',[
+ #0#0#1#0#3#0'00'#0#0#1#0' '#0#168'%'#0#0'6'#0#0#0' '#0#0#1#0' '#0#168#16#0#0
+ +#222'%'#0#0#16#16#0#0#1#0' '#0'h'#4#0#0#134'6'#0#0'('#0#0#0'0'#0#0#0'`'#0#0#0
+ +#1#0' '#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#31#0#255#0'{'#0
+ +#255#0'}'#0#255#1'|'#0#255#1'|'#0#255#1'|'#0#255#1'{'#0#255#2'{'#0#255#2'z'#0
+ +#255#2'z'#0#255#3'z'#0#255#3'y'#0#255#4'y'#0#255#4'x'#0#255#4'x'#0#255#5'w'#0
+ +#255#5'v'#0#255#6'v'#0#255#6'u'#0#255#7'u'#0#255#7'u'#0#255#8's'#0#255#8's'#0
+ +#255#9's'#0#255#9'r'#0#255#9'r'#0#255#10'q'#0#255#10'o'#0#255#11'o'#0#255#11
+ +'o'#0#255#12'n'#0#255#12'm'#0#255#13'm'#0#255#14'l'#0#255#14'k'#0#255#15'j'#0
+ +#255#16'i'#0#255#16'i'#0#255#17'h'#0#255#18'g'#0#255#18'f'#0#255#19'e'#0#255
+ +#20'e'#0#255#20'd'#0#255#21'c'#0#255#22'b'#0#255#22'a'#0#255#23'`'#0#255#0#31
+ +#0#255#1'z'#0#255#1'|'#0#255#1'|'#0#255#1'|'#0#255#2'{'#0#255#2'{'#0#255#2'z'
+ +#0#255#3'z'#0#255#3'y'#0#255#3'y'#0#255#4'x'#0#255#4'x'#0#255#5'w'#0#255#5'w'
+ +#0#255#5'v'#0#255#6'u'#0#255#6'u'#0#255#7't'#0#255#7't'#0#255#8't'#0#255#8'r'
+ +#0#255#8'r'#0#255#10'r'#0#255#10'p'#0#255#10'p'#0#255#11'p'#0#255#11'n'#0#255
+ +#12'n'#0#255#12'n'#0#255#13'm'#0#255#13'l'#0#255#14'k'#0#255#15'j'#0#255#15
+ +'j'#0#255#16'i'#0#255#17'h'#0#255#17'g'#0#255#18'f'#0#255#19'f'#0#255#19'e'#0
+ +#255#20'd'#0#255#21'c'#0#255#21'b'#0#255#22'a'#0#255#23'a'#0#255#24'`'#0#255
+ +#24'_'#0#255#0#31#0#255#1'z'#0#255#1'|'#0#255#2'{'#0#255#2'{'#0#255#2'z'#0
+ +#255#3'z'#0#255#3'y'#0#255#3'y'#0#255#4'x'#0#255#4'x'#0#255#5'w'#0#255#5'w'#0
+ +#255#5'v'#0#255#6'v'#0#255#6'u'#0#255#7't'#0#255#7't'#0#255#8's'#0#255#8's'#0
+ +#255#9's'#0#255#9'q'#0#255#10'q'#0#255#10'q'#0#255#10'p'#0#255#12'n'#0#255#12
+ +'n'#0#255#12'n'#0#255#13'm'#0#255#13'l'#0#255#14'k'#0#255#15'k'#0#255#15'j'#0
+ +#255#16'i'#0#255#17'h'#0#255#17'g'#0#255#18'g'#0#255#19'f'#0#255#19'e'#0#255
+ +#20'd'#0#255#21'c'#0#255#21'b'#0#255#22'b'#0#255#23'a'#0#255#24'`'#0#255#24
+ +'_'#0#255#25'^'#0#255#25']'#0#255#0#31#0#255#1'y'#0#255#2'{'#0#255#2'z'#0#255
+ +#2'z'#0#255#3'z'#0#255#3'y'#0#255#4'y'#0#255#4'x'#0#255#4'w'#0#255#5'w'#0#255
+ +#5'v'#0#255#6'v'#0#255#6'u'#0#255#7't'#0#255#7't'#0#255#8's'#0#255#8's'#0#255
+ +#9'r'#0#255#9'r'#0#255#10'r'#0#255#10'p'#0#255#11'o'#0#255#11'o'#0#255#11'o'
+ +#0#255#13'n'#0#255#13'l'#0#255#13'l'#0#255#14'l'#0#255#14'k'#0#255#15'j'#0
+ +#255#16'i'#0#255#16'h'#0#255#17'h'#0#255#18'g'#0#255#18'f'#0#255#19'e'#0#255
+ +#20'd'#0#255#20'c'#0#255#21'c'#0#255#22'b'#0#255#23'a'#0#255#23'`'#0#255#24
+ +'_'#0#255#25'^'#0#255#25']'#0#255#26'\'#0#255#27'['#0#255#0#30#0#255#2'x'#0
+ +#255#2'z'#0#255#3'z'#0#255#3'y'#0#255#4'y'#0#255#4'x'#0#255#4'x'#0#255#5'w'#0
+ +#255#5'v'#0#255#6'v'#0#255#6'u'#0#255#7'u'#0#255#7't'#0#255#8't'#0#255#8's'#0
+ +#255#8'r'#0#255#9'r'#0#255#10'q'#0#255#10'p'#0#255#11'o'#0#255#11'o'#0#255#12
+ +'o'#0#255#12'm'#0#255#12'm'#0#255#14'm'#0#255#14'l'#0#255#14'k'#0#255#16'j'#0
+ +#255#16'i'#0#255#16'i'#0#255#17'h'#0#255#18'g'#0#255#18'f'#0#255#19'e'#0#255
+ +#20'e'#0#255#20'd'#0#255#21'c'#0#255#22'b'#0#255#22'a'#0#255#23'`'#0#255#24
+ +'_'#0#255#24'^'#0#255#25']'#0#255#26'\'#0#255#27'\'#0#255#27'['#0#255#28'Z'#0
+ +#255#0#30#0#255#3'x'#0#255#3'y'#0#255#3'y'#0#255#4'x'#0#255#4'x'#0#255#5'w'#0
+ +#255#5'w'#0#255#5'v'#0#255#6'v'#0#255#6'u'#0#255#7't'#0#255#7't'#0#255#8's'#0
+ +#255#8's'#0#255#9'r'#0#255#9'q'#0#255#10'p'#0#255#11'p'#0#255#11'p'#0#255#12
+ +'n'#0#255#12'n'#0#255#13'n'#0#255#13'm'#0#255#13'l'#0#255#15'j'#0#255#15'j'#0
+ +#255#15'j'#0#255#17'i'#0#255#17'h'#0#255#17'g'#0#255#18'f'#0#255#19'f'#0#255
+ +#19'e'#0#255#20'd'#0#255#21'c'#0#255#21'b'#0#255#22'a'#0#255#23'a'#0#255#24
+ +'`'#0#255#24'_'#0#255#25'^'#0#255#26']'#0#255#26'\'#0#255#27'['#0#255#28'Z'#0
+ +#255#29'Y'#0#255#30'X'#0#255#0#30#0#255#3'w'#0#255#4'x'#0#255#4'x'#0#255#5'w'
+ +#0#255#5'w'#0#255#5'v'#0#255#6'v'#0#255#6'u'#0#255#7't'#0#255#7't'#0#255#8's'
+ +#0#255#8's'#0#255#9'r'#0#255#9'q'#0#255#10'q'#0#255#10'p'#0#255#11'o'#0#255
+ +#12'n'#0#255#12'n'#0#255#13'n'#0#255#13'l'#0#255#13'k'#0#255#15'k'#0#255#15
+ +'k'#0#255#15'j'#0#255#17'i'#0#255#17'g'#0#255#17'g'#0#255#18'g'#0#255#19'f'#0
+ +#255#19'e'#0#255#20'd'#0#255#20'c'#0#255#21'b'#0#255#22'b'#0#255#23'a'#0#255
+ +#23'`'#0#255#24'_'#0#255#25'^'#0#255#25']'#0#255#26'\'#0#255#27'['#0#255#28
+ +'Z'#0#255#29'Y'#0#255#29'X'#0#255#30'W'#0#255#31'V'#0#255#1#30#0#255#4'v'#0
+ +#255#4'w'#0#255#5'w'#0#255#5'v'#0#255#6'v'#0#255#6'u'#0#255#7'u'#0#255#7't'#0
+ +#255#8's'#0#255#8's'#0#255#9'r'#0#255#9'r'#0#255#10'q'#0#255#10'p'#0#255#11
+ +'o'#0#255#11'o'#0#255#12'n'#0#255#13'm'#0#255#13'l'#0#255#14'l'#0#255#14'l'#0
+ +#255#14'j'#0#255#16'j'#0#255#16'h'#0#255#16'h'#0#255#18'h'#0#255#18'g'#0#255
+ +#18'f'#0#255#19'e'#0#255#20'e'#0#255#20'd'#0#255#21'c'#0#255#22'b'#0#255#22
+ +'a'#0#255#23'`'#0#255#24'_'#0#255#25'^'#0#255#25']'#0#255#26'\'#0#255#27'['#0
+ +#255#28'['#0#255#28'Z'#0#255#29'Y'#0#255#30'X'#0#255#31'W'#0#255' V'#0#255' '
+ +'U'#0#255#1#29#0#255#5'u'#0#255#5'w'#0#255#5'v'#0#255#6'u'#0#255#6'u'#0#255#7
+ +'t'#0#255#7't'#0#255#8's'#0#255#8'r'#0#255#9'r'#0#255#10'q'#0#255#10'p'#0#255
+ +#11'o'#0#255#11'o'#0#255#12'n'#0#255#12'm'#0#255#13'm'#0#255#14'l'#0#255#14
+ ,'k'#0#255#14'j'#0#255#16'k'#0#255#16'j'#0#255#17'i'#0#255#17'h'#0#255#17'f'#0
+ +#255#19'f'#0#255#19'f'#0#255#19'e'#0#255#20'd'#0#255#21'c'#0#255#21'b'#0#255
+ +#22'a'#0#255#23'`'#0#255#24'_'#0#255#24'^'#0#255#25']'#0#255#26'\'#0#255#27
+ +'\'#0#255#27'['#0#255#28'Z'#0#255#29'Y'#0#255#30'X'#0#255#31'W'#0#255#31'V'#0
+ +#255' U'#0#255'!T'#0#255'"S'#0#255#1#29#0#255#5't'#0#255#6'v'#0#255#6'u'#0
+ +#255#7't'#0#255#7't'#0#255#8's'#0#255#8's'#0#255#9'r'#0#255#9'q'#0#255#10'p'
+ +#0#255#11'p'#0#255#11'o'#0#255#12'n'#0#255#12'n'#0#255#13'm'#0#255#13'l'#0
+ +#255#14'k'#0#255#15'k'#0#255#15'k'#0#255#15'i'#0#255#17'h'#0#255#17'h'#0#255
+ +#17'g'#0#255#19'g'#0#255#19'f'#0#255#19'e'#0#255#21'e'#0#255#20'c'#0#255#21
+ +'b'#0#255#22'a'#0#255#23'a'#0#255#24'`'#0#255#24'_'#0#255#25'^'#0#255#26']'#0
+ +#255#26'\'#0#255#27'['#0#255#28'Z'#0#255#29'Y'#0#255#30'X'#0#255#30'W'#0#255
+ +#31'V'#0#255' U'#0#255'!T'#0#255'!S'#0#255'"R'#0#255'#Q'#0#255#1#29#0#255#6
+ +'s'#0#255#7't'#0#255#7't'#0#255#8's'#0#255#8's'#0#255#9'r'#0#255#9'q'#0#255
+ +#10'q'#0#255#10'p'#0#255#11'o'#0#255#12'n'#0#255#12'n'#0#255#13'm'#0#255#13
+ +'l'#0#255#14'l'#0#255#15'k'#0#255#15'j'#0#255#16'i'#0#255#16'i'#0#255#16'h'#0
+ +#255#18'h'#0#255#18'f'#0#255#18'f'#0#255#20'e'#0#255#20'e'#0#255#20'c'#0#255
+ +#21'b'#0#255#23'b'#0#255#23'a'#0#255#23'`'#0#255#24'`'#0#255#25'_'#0#255#25
+ +'^'#0#255#26'\'#0#255#27'['#0#255#28'Z'#0#255#29'Y'#0#255#29'Y'#0#255#30'X'#0
+ +#255#31'W'#0#255' V'#0#255' U'#0#255'!T'#0#255'"S'#0#255'#R'#0#255'$Q'#0#255
+ +'$P'#0#255#1#29#0#255#7'r'#0#255#8's'#0#255#8's'#0#255#9'r'#0#255#9'r'#0#255
+ +#10'q'#0#255#10'p'#0#255#11'p'#0#255#11'o'#0#255#12'n'#0#255#13'm'#0#255#13
+ +'m'#0#255#14'l'#0#255#14'k'#0#255#15'k'#0#255#16'j'#0#255#16'i'#0#255#17'h'#0
+ +#255#17'g'#0#255#17'f'#0#255#18'f'#0#255#19'e'#0#255#19'e'#0#255#20'd'#0#255
+ +#22'c'#0#255#21'b'#0#255#22'a'#0#255#23'a'#0#255#24'`'#0#255#24'_'#0#255#25
+ +']'#0#255#26'\'#0#255#26'['#0#255#27'['#0#255#28'Z'#0#255#29'Y'#0#255#30'X'#0
+ +#255#30'X'#0#255#31'W'#0#255' V'#0#255'!U'#0#255'!T'#0#255'"S'#0#255'#R'#0
+ +#255'$P'#0#255'%N'#0#255'%M'#0#255#2#29#0#255#8'q'#0#255#8'r'#0#255#9'r'#0
+ +#255#10'q'#0#255#10'q'#0#255#11'p'#0#255#11'o'#0#255#12'n'#0#255#12'n'#0#255
+ +#13'm'#0#255#13'l'#0#255#14'l'#0#255#15'k'#0#255#15'j'#0#255#16'i'#0#255#17
+ +'h'#0#255#17'h'#0#255#18'g'#0#255#19'f'#0#255#19'f'#0#255#19'd'#0#255#21'd'#0
+ +#255#21'd'#0#255#20'c'#0#255#22'b'#0#255#24'a'#0#255#23'`'#0#255#24'_'#0#255
+ +#25'^'#0#255#26']'#0#255#26'\'#0#255#27'['#0#255#28'Z'#0#255#29'Z'#0#255#29
+ +'Y'#0#255#30'X'#0#255#31'W'#0#255' V'#0#255' U'#0#255'!T'#0#255'"S'#0#255'#R'
+ +#0#255'$Q'#0#255'$P'#0#255'%N'#0#255'&M'#0#255'''L'#0#255#2#28#0#255#9'p'#0
+ +#255#9'q'#0#255#10'q'#0#255#11'p'#0#255#11'o'#0#255#12'n'#0#255#12'n'#0#255
+ +#13'm'#0#255#13'm'#0#255#14'l'#0#255#14'k'#0#255#15'j'#0#255#16'i'#0#255#16
+ +'i'#0#255#17'h'#0#255#18'g'#0#255#18'f'#0#255#19'e'#0#255#20'e'#0#255#20'd'#0
+ +#255#20'b'#0#255#21'b'#0#255#23'b'#0#255#23'a'#0#255#23'`'#0#255#24'_'#0#255
+ +#26'_'#0#255#25']'#0#255#26'\'#0#255#27'['#0#255#28'['#0#255#28'Z'#0#255#29
+ +'Y'#0#255#30'X'#0#255#31'W'#0#255#31'V'#0#255' U'#0#255'!T'#0#255'"S'#0#255
+ +'#R'#0#255'#Q'#0#255'$P'#0#255'%O'#0#255'&N'#0#255'''M'#0#255'(L'#0#255'(K'#0
+ +#255#2#28#0#255#10'o'#0#255#10'p'#0#255#11'o'#0#255#11'o'#0#255#12'n'#0#255
+ +#13'm'#0#255#13'm'#0#255#14'l'#0#255#14'k'#0#255#15'j'#0#255#16'j'#0#255#16
+ +'i'#0#255#17'h'#0#255#18'g'#0#255#18'f'#0#255#19'f'#0#255#20'e'#0#255#20'd'#0
+ +#255#21'c'#0#255#22'b'#0#255#22'b'#0#255#22'`'#0#255#23'`'#0#255#25'`'#0#255
+ +#25'_'#0#255#24'^'#0#255#26'\'#0#255#28'\'#0#255#27'['#0#255#28'Z'#0#255#29
+ +'Y'#0#255#30'X'#0#255#30'W'#0#255#31'V'#0#255' U'#0#255'!T'#0#255'"S'#0#255
+ +'"S'#0#255'#Q'#0#255'$P'#0#255'%O'#0#255'&N'#0#255'''M'#0#255'''L'#0#255'(K'
+ +#0#255')J'#0#255'*I'#0#255#2#28#0#255#11'n'#0#255#11'o'#0#255#12'n'#0#255#12
+ +'n'#0#255#13'm'#0#255#14'l'#0#255#14'k'#0#255#15'k'#0#255#15'j'#0#255#16'i'#0
+ +#255#17'h'#0#255#17'g'#0#255#18'g'#0#255#19'f'#0#255#19'e'#0#255#20'd'#0#255
+ +#21'c'#0#255#21'b'#0#255#22'a'#0#255#22'a'#0#255#24'`'#0#255#24'_'#0#255#24
+ +'_'#0#255#25']'#0#255#26']'#0#255#26'\'#0#255#26'['#0#255#28'Z'#0#255#29'Z'#0
+ +#255#29'Y'#0#255#30'X'#0#255#31'W'#0#255' V'#0#255'!U'#0#255'!T'#0#255'"S'#0
+ +#255'#R'#0#255'$P'#0#255'%O'#0#255'%N'#0#255'&M'#0#255'''L'#0#255'(K'#0#255
+ +')J'#0#255'*I'#0#255'+H'#0#255',G'#0#255#2#27#0#255#12'l'#0#255#12'o'#0#255
+ +#13'n'#0#255#13'l'#0#255#14'l'#0#255#15'k'#0#255#15'k'#0#255#16'i'#0#255#17
+ +'h'#0#255#17'h'#0#255#18'g'#0#255#19'g'#0#255#19'e'#0#255#20'd'#0#255#21'd'#0
+ +#255#21'c'#0#255#22'b'#0#255#23'b'#0#255#23'a'#0#255#23'_'#0#255#24'^'#0#255
+ +#26']'#0#255#26']'#0#255#25'\'#0#255#27'['#0#255#28'['#0#255#29'Z'#0#255#29
+ +'Y'#0#255#30'X'#0#255#31'W'#0#255' V'#0#255' U'#0#255'!T'#0#255'"S'#0#255'#R'
+ +#0#255'$Q'#0#255'$P'#0#255'%N'#0#255'&M'#0#255'''L'#0#255'(K'#0#255')J'#0#255
+ +'*I'#0#255'+H'#0#255'+G'#0#255',F'#0#255'-E'#0#255#3#27#0#255#13'k'#0#255#13
+ +'m'#0#255#14'l'#0#255#14'l'#0#255#15'j'#0#255#16'i'#0#255#16'i'#0#255#17'h'#0
+ ,#255#18'h'#0#255#18'f'#0#255#19'e'#0#255#20'e'#0#255#20'd'#0#255#21'c'#0#255
+ +#22'b'#0#255#22'a'#0#255#22'`'#0#255#24'`'#0#255#25'_'#0#255#25'^'#0#255#24
+ +']'#0#255#27'\'#0#255#27'\'#0#255#28'['#0#255#28'Z'#0#255#28'Y'#0#255#30'X'#0
+ +#255#31'W'#0#255#31'V'#0#255' U'#0#255' T'#0#255'"S'#0#255'#R'#0#255'#Q'#0
+ +#255'$P'#0#255'%O'#0#255'&N'#0#255'''M'#0#255'(L'#0#255'(K'#0#255')J'#0#255
+ +'*I'#0#255'*G'#0#255'+G'#0#255'-E'#0#255'.D'#0#255'/C'#0#255#3#27#0#255#14'k'
+ +#0#255#13'k'#0#255#15'j'#0#255#16'j'#0#255#15'i'#0#255#17'i'#0#255#18'g'#0
+ +#255#17'f'#0#255#19'f'#0#255#20'f'#0#255#20'e'#0#255#21'c'#0#255#22'b'#0#255
+ +#21'a'#0#255#23'a'#0#255#24'`'#0#255#24'_'#0#255#24'^'#0#255#26']'#0#255#26
+ +'\'#0#255#27'['#0#255#27'['#0#255#28'Z'#0#255#29'Y'#0#255#30'X'#0#255#31'W'#0
+ +#255#31'V'#0#255#31'U'#0#255'!T'#0#255'"S'#0#255'"R'#0#255'#Q'#0#255'#P'#0
+ +#255'%O'#0#255'&N'#0#255'''M'#0#255'''L'#0#255'(K'#0#255')J'#0#255'*I'#0#255
+ +'+H'#0#255',G'#0#255',F'#0#255'-D'#0#255'.C'#0#255'/B'#0#255'0A'#0#255#3#26#0
+ +#255#15'i'#0#255#15'j'#0#255#16'j'#0#255#17'h'#0#255#17'g'#0#255#18'g'#0#255
+ +#19'g'#0#255#19'f'#0#255#20'd'#0#255#21'd'#0#255#20'c'#0#255#21'b'#0#255#23
+ +'a'#0#255#23'`'#0#255#23'_'#0#255#25'^'#0#255#26']'#0#255#26'\'#0#255#26'\'#0
+ +#255#27'Z'#0#255#29'Z'#0#255#29'Y'#0#255#30'Y'#0#255#30'X'#0#255#30'W'#0#255
+ +' V'#0#255'!U'#0#255'"T'#0#255'"S'#0#255'"R'#0#255'$P'#0#255'%O'#0#255'%N'#0
+ +#255'&M'#0#255'&M'#0#255'''L'#0#255')J'#0#255'*I'#0#255'+H'#0#255'+G'#0#255
+ +',F'#0#255'-E'#0#255'/D'#0#255'/C'#0#255'0A'#0#255'1@'#0#255'2?'#0#255#4#26#0
+ +#255#16'g'#0#255#17'h'#0#255#17'h'#0#255#18'h'#0#255#19'g'#0#255#19'e'#0#255
+ +#20'e'#0#255#21'd'#0#255#20'c'#0#255#22'b'#0#255#22'a'#0#255#23'`'#0#255#24
+ +'_'#0#255#25'^'#0#255#25']'#0#255#25'\'#0#255#26'['#0#255#28'['#0#255#28'Z'#0
+ +#255#29'Y'#0#255#29'X'#0#255#30'W'#0#255' W'#0#255' V'#0#255'!U'#0#255'!T'#0
+ +#255'!S'#0#255'#R'#0#255'$Q'#0#255'$P'#0#255'%O'#0#255'%N'#0#255'''M'#0#255
+ +'(L'#0#255'(J'#0#255')I'#0#255'*H'#0#255'+G'#0#255',F'#0#255'-E'#0#255'.D'#0
+ +#255'0E'#0#255'2E'#0#255'-<'#0#255'1?'#0#255'2>'#0#255'3='#0#255#4#26#0#255
+ +#17'g'#0#255#18'h'#0#255#17'f'#0#255#19'h'#0#255#21'n'#0#255#20'g'#0#255#21
+ +'c'#0#255#22'b'#0#255#22'a'#0#255#22'`'#0#255#24'`'#0#255#25'_'#0#255#24'^'#0
+ +#255#25']'#0#255#27'\'#0#255#27'['#0#255#28'Z'#0#255#28'Y'#0#255#30'X'#0#255
+ +#31'W'#0#255#31'V'#0#255' U'#0#255' U'#0#255' T'#0#255'"T'#0#255'#R'#0#255'#'
+ +'P'#0#255'#P'#0#255'$O'#0#255'&N'#0#255'''M'#0#255'''L'#0#255'(K'#0#255')J'#0
+ +#255'*H'#0#255'+G'#0#255',G'#0#255'-E'#0#255'-D'#0#255'/C'#0#255'1D'#0#255','
+ +';'#0#255#22#28#0#255')3'#0#255'4='#0#255'4<'#0#255'5;'#0#255#4#25#0#255#18
+ +'e'#0#255#19'f'#0#255#19'f'#0#255#17'Z'#0#255#10'7'#0#255#18'V'#0#255#22'f'#0
+ +#255#23'c'#0#255#24'`'#0#255#24'_'#0#255#24'^'#0#255#26']'#0#255#26'\'#0#255
+ +#27'['#0#255#27'Z'#0#255#29'Y'#0#255#30'X'#0#255#30'W'#0#255#31'V'#0#255#31
+ +'U'#0#255' T'#0#255'"T'#0#255'"T'#0#255'"S'#0#255'"Q'#0#255'$O'#0#255'%N'#0
+ +#255'%N'#0#255'&M'#0#255'''L'#0#255'(K'#0#255')J'#0#255'*I'#0#255'+H'#0#255
+ +',G'#0#255',F'#0#255'-D'#0#255'.C'#0#255'0B'#0#255'1B'#0#255'''2'#0#255#15#20
+ +#0#244#0#0#0#218')0'#0#255'6<'#0#255'6:'#0#255'79'#0#255#4#25#0#255#18'd'#0
+ +#255#20'e'#0#255#21'e'#0#255#16'N'#0#255#0#3#0#211#6#28#0#235#15'B'#0#255#24
+ +'`'#0#255#25'a'#0#255#26']'#0#255#26'\'#0#255#26'\'#0#255#28'['#0#255#29'Z'#0
+ +#255#29'Y'#0#255#30'X'#0#255#30'W'#0#255' V'#0#255'!U'#0#255'!T'#0#255'!S'#0
+ +#255'"R'#0#255'$R'#0#255'$Q'#0#255'$O'#0#255'&N'#0#255'&N'#0#255'''M'#0#255
+ +'(K'#0#255')J'#0#255'*I'#0#255'+H'#0#255'+G'#0#255',F'#0#255'-E'#0#255'.D'#0
+ +#255'.B'#0#255'0A'#0#255'2A'#0#255'&1'#0#255#11#13#0#232#0#0#0'c'#3#3#0#154
+ +'+/'#0#255'89'#0#255'78'#0#255'87'#0#255#4#25#0#255#20'b'#0#255#20'c'#0#255
+ +#21'c'#0#255#17'N'#0#255#2#6#0#149#0#0#0'W'#3#11#0#174#11'+'#0#255#22'P'#0
+ +#255#28'_'#0#255#28']'#0#255#28'Z'#0#255#29'Y'#0#255#29'X'#0#255#31'W'#0#255
+ +' V'#0#255' U'#0#255' T'#0#255'!S'#0#255'#R'#0#255'#Q'#0#255'#P'#0#255'%P'#0
+ +#255'%O'#0#255'&N'#0#255'''M'#0#255'''L'#0#255'(K'#0#255')H'#0#255'*H'#0#255
+ +'+G'#0#255',F'#0#255'-E'#0#255'.D'#0#255'/C'#0#255'/B'#0#255'1A'#0#255'3A'#0
+ +#255'&0'#0#255#11#14#0#232#0#0#0'V'#0#0#0#0#3#3#0#140'--'#0#255'87'#0#255'96'
+ +#0#255':5'#0#255#5#25#0#255#22'a'#0#255#22'b'#0#255#22'b'#0#255#18'N'#0#255#2
+ +#7#0#146#0#0#0#0#0#0#0#29#0#0#0'y'#8#27#0#224#18'>'#0#255#28'Y'#0#255#31']'#0
+ +#255#31'Y'#0#255#31'V'#0#255#31'V'#0#255' U'#0#255'"S'#0#255'"S'#0#255'#R'#0
+ +#255'#P'#0#255'$O'#0#255'&N'#0#255'&N'#0#255'&M'#0#255'''L'#0#255'(K'#0#255
+ +')J'#0#255'*H'#0#255'*G'#0#255'+F'#0#255',E'#0#255'.D'#0#255'/C'#0#255'/B'#0
+ +#255'0A'#0#255'2@'#0#255'3?'#0#255'''0'#0#255#11#14#0#229#0#0#0'X'#0#0#0#0#0
+ +#0#0#10#3#3#0#144'-,'#0#255':5'#0#255':4'#0#255';3'#0#255#5#24#0#255#22'_'#0
+ +#255#24'`'#0#255#24'`'#0#255#20'M'#0#255#2#7#0#148#0#0#0#14#0#0#0#0#0#0#0#0#0
+ +#0#0'O'#3#9#0#178#14'*'#0#253#25'I'#0#255'!Z'#0#255'!X'#0#255'!T'#0#255'"S'#0
+ +#255'"S'#0#255'#R'#0#255'$P'#0#255'%N'#0#255'%M'#0#255'''L'#0#255'(L'#0#255
+ ,'(K'#0#255')J'#0#255')I'#0#255'+H'#0#255'+G'#0#255',F'#0#255'-E'#0#255'.D'#0
+ +#255'.B'#0#255'/A'#0#255'0@'#0#255'2?'#0#255'4?'#0#255',4'#0#255#12#13#0#235
+ +#0#0#0'Y'#0#0#0#0#0#0#0#0#0#0#0#11#3#3#0#144'.*'#0#255'<3'#0#255'<2'#0#255'='
+ +'1'#0#255#5#24#0#255#23']'#0#255#24'_'#0#255#26'_'#0#255#22'L'#0#255#2#7#0
+ +#148#0#0#0#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#27#0#0#0'{'#8#21#0#215#20'4'#0
+ +#255' Q'#0#255'$W'#0#255'$R'#0#255'$Q'#0#255'%O'#0#255'&M'#0#255'&L'#0#255
+ +'''L'#0#255'*M'#0#255',O'#0#255'.O'#0#255'-L'#0#255',I'#0#255',F'#0#255'-E'#0
+ +#255'-D'#0#255'.C'#0#255'/B'#0#255'0@'#0#255'1?'#0#255'2>'#0#255'5>'#0#255'1'
+ +'8'#0#255#19#21#0#243#0#0#0'o'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#3#3#0#144'/'
+ +''''#0#255'>1'#0#255'>0'#0#255'?/'#0#255#6#23#0#255#25'\'#0#255#25']'#0#255
+ +#26']'#0#255#22'K'#0#255#2#7#0#148#0#0#0#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0'D'#0#1#0#163#15'$'#0#246#27'@'#0#255'%Q'#0#255'''R'#0#255'''M'#0
+ +#255'''L'#0#255')M'#0#255'*O'#0#255'&B'#0#255#28'/'#0#255#25'+'#0#251#30'1'#0
+ +#255'*@'#0#255'0G'#0#255'/C'#0#255'/B'#0#255'0A'#0#255'1@'#0#255'2>'#0#255'3'
+ +'='#0#255'5='#0#255'4:'#0#255#28#30#0#249#0#0#0#144#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#11#3#3#0#144'1&'#0#255'?/'#0#255'?.'#0#255'@,'#0#255#6#23#0#255
+ +#26'Z'#0#255#27'\'#0#255#27'\'#0#255#23'I'#0#255#2#6#0#148#0#0#0#13#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4#0#0#0'u'#6#12#0#202#22'.'#0
+ +#255'"E'#0#255')N'#0#255',O'#0#255'(F'#0#255#30'3'#0#255#16#26#0#219#0#0#0
+ +#150#0#0#0'}'#2#3#0#166#19#28#0#239')9'#0#255'4E'#0#255'1@'#0#255'2?'#0#255
+ +'3>'#0#255'4<'#0#255'5<'#0#255'7;'#0#255'''('#0#255#2#3#0#193#0#0#0#22#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#4#3#0#144'3$'#0#255'A-'#0#255'A,'#0#255
+ +'B*'#0#255#6#23#0#255#26'Y'#0#255#29'Z'#0#255#29'Z'#0#255#24'H'#0#255#2#6#0
+ +#148#0#0#0#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0'*'#0#0#0#150#12#23#0#222#28'2'#0#255#31'5'#0#255#19' '#0#239#2#2#0#176
+ +#0#0#0'H'#0#0#0#0#0#0#0#0#0#0#0#3#0#0#0#132#18#23#0#241'2>'#0#255'4@'#0#255
+ +'3='#0#255'4;'#0#255'6:'#0#255'8:'#0#255'-/'#0#255#13#13#0#226#0#0#0'I'#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#4#2#0#144'3#'#0#255'C+'#0#255'C*'
+ +#0#255'D('#0#255#7#22#0#255#28'W'#0#255#29'X'#0#255#30'X'#0#255#25'F'#0#255#2
+ +#6#0#148#0#0#0#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0'N'#3#7#0#164#3#5#0#169#0#0#0'o'#0#0#0#11#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#2#3#0#153#28'!'#0#255'7@'#0#255'5;'#0#255'69'
+ +#0#255'9:'#0#255'54'#0#255#21#21#0#247#0#0#0'v'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#11#4#2#0#144'5!'#0#255'D)'#0#255'E'''#0#255'F&'#0
+ +#255#7#22#0#255#29'U'#0#255#31'V'#0#255' V'#0#255#26'E'#0#255#2#6#0#148#0#0#0
+ +#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0'('#9#10#0#209'.1'#0#255';<'#0#255'98'#0#255':7'#0#255'" '#0
+ +#252#0#0#0#168#0#0#0#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#11#4#2#0#144'6 '#0#255'F&'#0#255'G%'#0#255'H$'#0#255#7#21#0#255#30'T'#0#255
+ +' U'#0#255'!U'#0#255#27'C'#0#255#2#6#0#148#0#0#0#13#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'b'
+ +#19#19#0#243'87'#0#255';7'#0#255'$!'#0#255#4#4#0#192#0#0#0'+'#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#4#2#0#144'7'#30#0#255'I$'#0
+ +#255'H#'#0#255'I!'#0#255#8#21#0#255' S'#0#255'"S'#0#255'"S'#0#255#28'B'#0#255
+ +#2#6#0#148#0#0#0#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#20#2#1#0#145#25#22#0#240'#'#31#0#245
+ +#5#4#0#196#0#0#0'?'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#11#4#2#0#144'9'#28#0#255'J"'#0#255'J '#0#255'K'#31#0#255#8#21#0
+ +#255'!R'#0#255'#Q'#0#255'$Q'#0#255#29'@'#0#255#3#6#0#148#0#0#0#13#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#17#0#0#0'w'#0#0#0#134#0#0#0'/'#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#4#2#0#144'<'#26#0#255
+ +'L'#31#0#255'L'#30#0#255'M'#29#0#255#8#20#0#255'"O'#0#255'$O'#0#255'%O'#0#255
+ +#30'?'#0#255#3#5#0#148#0#0#0#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#11#4#2#0#144'<'#24#0#255'M'#29#0#255'N'#28#0#255'O'#27#0#255#9
+ +#20#0#255'#M'#0#255'%M'#0#255'&M'#0#255#31'>'#0#255#3#5#0#148#0#0#0#13#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#4#2#0#144'='#23#0#255
+ +'O'#27#0#255'P'#26#0#255'Q'#24#0#255#9#19#0#255'%L'#0#255'''L'#0#255'(L'#0
+ +#255'!='#0#255#3#5#0#148#0#0#0#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#11#4#1#0#144'?'#20#0#255'Q'#25#0#255'Q'#23#0#255'R'#23#0#255#9
+ +#19#0#255'&K'#0#255'(J'#0#255')J'#0#255'";'#0#255#3#5#0#148#0#0#0#13#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#4#1#0#144'@'#19#0#255
+ +'R'#22#0#255'R'#22#0#255'T'#20#0#255#10#18#0#255'(I'#0#255'*H'#0#255'+H'#0
+ +#255'#9'#0#255#3#5#0#147#0#0#0#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#9#5#1#0#143'B'#18#0#255'T'#21#0#255'T'#19#0#255'V'#18#0#255#10
+ +#18#0#255'*G'#0#255'+G'#0#255',G'#0#255'%7'#0#255#3#5#0#153#0#0#0#25#0#0#0#13
+ +#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0
+ +#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13
+ +#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0
+ +#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13#0#0#0#13
+ +#0#0#0#23#4#1#0#150'C'#16#0#255'V'#19#0#255'V'#17#0#255'W'#16#0#255#11#17#0
+ +#255'+E'#0#255'-E'#0#255'.E'#0#255'''7'#0#255#6#9#0#211#4#4#0#153#4#4#0#147#4
+ +#4#0#148#4#4#0#148#4#4#0#148#4#4#0#148#4#4#0#148#4#4#0#148#4#4#0#148#4#4#0
+ +#148#4#4#0#148#4#4#0#148#4#3#0#148#4#3#0#148#5#3#0#148#5#3#0#148#5#3#0#148#5
+ +#3#0#148#5#3#0#148#5#3#0#148#5#3#0#148#5#3#0#148#5#3#0#148#5#2#0#148#5#2#0
+ +#148#5#2#0#148#5#2#0#148#5#2#0#148#5#2#0#148#6#2#0#148#6#2#0#148#6#2#0#148#6
+ +#2#0#148#6#2#0#148#6#1#0#148#6#1#0#147#6#1#0#153#11#2#0#209'F'#14#0#255'X'#16
+ +#0#255'X'#15#0#255'Y'#14#0#255#11#17#0#255'-C'#0#255'.C'#0#255'/B'#0#255'/>'
+ +#0#255')4'#0#255')3'#0#255')2'#0#255'*1'#0#255'+0'#0#255',.'#0#255'--'#0#255
+ +'.,'#0#255'.+'#0#255'/*'#0#255'0*'#0#255'1)'#0#255'1('#0#255'2'''#0#255'3&'#0
+ +#255'4%'#0#255'4$'#0#255'4#'#0#255'6"'#0#255'7!'#0#255'7 '#0#255'8'#31#0#255
+ +'9'#30#0#255':'#29#0#255';'#28#0#255'<'#27#0#255'<'#26#0#255'='#25#0#255'>'
+ +#24#0#255'?'#23#0#255'@'#22#0#255'A'#20#0#255'A'#19#0#255'B'#18#0#255'C'#17#0
+ +#255'D'#16#0#255'E'#15#0#255'E'#14#0#255'G'#13#0#255'T'#14#0#255'Y'#14#0#255
+ +'Z'#13#0#255'['#11#0#255#11#16#0#255'.A'#0#255'0A'#0#255'1@'#0#255'2?'#0#255
+ +'4>'#0#255'5<'#0#255'6;'#0#255'7:'#0#255'89'#0#255'88'#0#255'97'#0#255':5'#0
+ +#255';4'#0#255'<3'#0#255'=2'#0#255'>0'#0#255'?/'#0#255'@.'#0#255'A.'#0#255'B'
+ +','#0#255'C*'#0#255'D)'#0#255'E)'#0#255'E'''#0#255'G%'#0#255'I%'#0#255'I#'#0
+ +#255'J!'#0#255'K!'#0#255'L'#31#0#255'M'#30#0#255'N'#29#0#255'O'#27#0#255'P'
+ +#26#0#255'Q'#25#0#255'R'#23#0#255'S'#22#0#255'T'#21#0#255'U'#20#0#255'V'#19#0
+ +#255'X'#17#0#255'X'#16#0#255'Z'#14#0#255'Z'#13#0#255'['#12#0#255'\'#10#0#255
+ +']'#9#0#255#12#16#0#255'0?'#0#255'2?'#0#255'3>'#0#255'4='#0#255'5;'#0#255'6:'
+ +#0#255'69'#0#255'78'#0#255'87'#0#255'95'#0#255':4'#0#255';3'#0#255'<2'#0#255
+ +'=1'#0#255'>0'#0#255'?/'#0#255'@-'#0#255'A,'#0#255'B,'#0#255'C*'#0#255'D('#0
+ +#255'E('#0#255'F&'#0#255'G$'#0#255'G$'#0#255'H"'#0#255'I '#0#255'J '#0#255'K'
+ +#30#0#255'L'#28#0#255'N'#28#0#255'O'#26#0#255'P'#25#0#255'Q'#24#0#255'R'#23#0
+ +#255'S'#21#0#255'T'#20#0#255'U'#19#0#255'V'#18#0#255'W'#16#0#255'X'#15#0#255
+ +'Z'#13#0#255'['#12#0#255'\'#11#0#255']'#9#0#255'^'#8#0#255'_'#6#0#255#12#15#0
+ +#255'0<'#0#255'2<'#0#255'3;'#0#255'4:'#0#255'58'#0#255'67'#0#255'76'#0#255'8'
+ +'5'#0#255'94'#0#255':3'#0#255';2'#0#255'<0'#0#255'=/'#0#255'>.'#0#255'?-'#0
+ +#255'@+'#0#255'A*'#0#255'B*'#0#255'C('#0#255'D&'#0#255'E&'#0#255'F$'#0#255'G'
+ +'"'#0#255'H"'#0#255'H '#0#255'I'#30#0#255'J'#30#0#255'K'#28#0#255'L'#26#0#255
+ +'N'#26#0#255'O'#24#0#255'P'#23#0#255'Q'#23#0#255'R'#22#0#255'S'#20#0#255'T'
+ +#19#0#255'T'#18#0#255'U'#16#0#255'V'#15#0#255'W'#14#0#255'X'#12#0#255'Y'#11#0
+ +#255'Z'#9#0#255'\'#8#0#255']'#7#0#255'^'#5#0#255'_'#4#0#255#3#3#0#255#13#15#0
+ +#255#13#15#0#255#13#14#0#255#13#14#0#255#13#14#0#255#14#13#0#255#14#13#0#255
+ +#14#13#0#255#14#13#0#255#15#12#0#255#15#12#0#255#15#12#0#255#15#11#0#255#16
+ +#11#0#255#16#11#0#255#16#10#0#255#16#10#0#255#17#10#0#255#17#9#0#255#17#9#0
+ +#255#17#9#0#255#18#8#0#255#18#8#0#255#18#8#0#255#18#8#0#255#18#7#0#255#19#7#0
+ ,#255#19#7#0#255#19#6#0#255#20#6#0#255#20#6#0#255#20#5#0#255#20#5#0#255#21#5#0
+ +#255#21#4#0#255#21#4#0#255#21#4#0#255#22#3#0#255#22#3#0#255#22#3#0#255#23#2#0
+ +#255#23#2#0#255#23#2#0#255#23#1#0#255#24#1#0#255#24#1#0#255#24#0#0#255#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0' '#0#0#2#0#0#0#0'@'#0#0#1#128#0#0#0#192#0#0#1#192#0#0#1#192#0#0#1
+ +#240#0#0#3#192#0#0#1#248#0#0#3#192#0#0#1#254#1#128#7#192#0#0#1#255#131#192#15
+ +#192#0#0#1#255#255#224#15#192#0#0#1#255#255#240#31#192#0#0#1#255#255#240'?'
+ +#192#0#0#1#255#255#248''#192#0#0#1#255#255#255#255#192#0#0#1#255#255#255#255
+ +#192#0#0#1#255#255#255#255#192#0#0#1#255#255#255#255#192#0#0#1#255#255#255
+ +#255#192#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1
+ +#0' '#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'F'#0#255#0']'#0#255
+ +#0']'#0#255#0']'#0#255#1'\'#0#255#1'\'#0#255#2'['#0#255#2'['#0#255#2'['#0#255
+ +#3'Z'#0#255#3'Y'#0#255#4'Y'#0#255#4'X'#0#255#5'W'#0#255#5'W'#0#255#6'V'#0#255
+ +#7'U'#0#255#7'U'#0#255#8'T'#0#255#8'S'#0#255#9'R'#0#255#10'Q'#0#255#10'P'#0
+ +#255#11'O'#0#255#12'O'#0#255#13'N'#0#255#13'M'#0#255#14'L'#0#255#15'K'#0#255
+ +#16'J'#0#255#16'I'#0#255#13'6'#0#255#0']'#0#255#1'|'#0#255#1'|'#0#255#1'{'#0
+ +#255#2'z'#0#255#2'z'#0#255#3'y'#0#255#4'y'#0#255#4'x'#0#255#5'w'#0#255#6'v'#0
+ +#255#6'u'#0#255#7't'#0#255#8's'#0#255#9'r'#0#255#9'q'#0#255#10'p'#0#255#11'o'
+ +#0#255#12'n'#0#255#13'm'#0#255#14'l'#0#255#14'k'#0#255#15'j'#0#255#16'h'#0
+ +#255#17'g'#0#255#18'f'#0#255#19'e'#0#255#20'c'#0#255#21'b'#0#255#23'a'#0#255
+ +#24'`'#0#255#18'G'#0#255#1']'#0#255#1'{'#0#255#2'{'#0#255#2'z'#0#255#3'y'#0
+ +#255#4'y'#0#255#4'x'#0#255#5'w'#0#255#5'v'#0#255#6'u'#0#255#7't'#0#255#8't'#0
+ +#255#8's'#0#255#9'r'#0#255#10'q'#0#255#11'o'#0#255#12'n'#0#255#12'm'#0#255#13
+ +'l'#0#255#14'k'#0#255#15'j'#0#255#16'i'#0#255#17'h'#0#255#18'f'#0#255#19'e'#0
+ +#255#20'd'#0#255#21'b'#0#255#22'a'#0#255#23'`'#0#255#24'^'#0#255#25']'#0#255
+ +#20'E'#0#255#1'\'#0#255#2'z'#0#255#3'z'#0#255#3'y'#0#255#4'x'#0#255#5'w'#0
+ +#255#5'v'#0#255#6'v'#0#255#7'u'#0#255#7't'#0#255#8's'#0#255#9'r'#0#255#10'q'
+ +#0#255#11'p'#0#255#11'o'#0#255#12'n'#0#255#13'm'#0#255#14'k'#0#255#15'j'#0
+ +#255#16'i'#0#255#17'h'#0#255#18'g'#0#255#19'e'#0#255#20'd'#0#255#21'c'#0#255
+ +#22'b'#0#255#23'`'#0#255#24'_'#0#255#25']'#0#255#26'\'#0#255#27'['#0#255#21
+ +'C'#0#255#2'['#0#255#3'y'#0#255#4'x'#0#255#4'w'#0#255#5'w'#0#255#6'v'#0#255#6
+ +'u'#0#255#7't'#0#255#8's'#0#255#9'r'#0#255#9'q'#0#255#10'p'#0#255#11'o'#0#255
+ +#12'n'#0#255#13'm'#0#255#14'l'#0#255#15'k'#0#255#16'i'#0#255#17'h'#0#255#18
+ +'g'#0#255#19'f'#0#255#20'e'#0#255#21'c'#0#255#22'b'#0#255#23'a'#0#255#24'_'#0
+ +#255#25'^'#0#255#26'\'#0#255#27'['#0#255#28'Z'#0#255#29'X'#0#255#23'A'#0#255
+ +#3'Z'#0#255#4'x'#0#255#5'w'#0#255#6'v'#0#255#6'u'#0#255#7't'#0#255#8's'#0#255
+ +#8'r'#0#255#9'r'#0#255#10'p'#0#255#11'o'#0#255#12'n'#0#255#13'm'#0#255#13'l'
+ +#0#255#14'k'#0#255#15'j'#0#255#16'h'#0#255#17'g'#0#255#18'f'#0#255#19'e'#0
+ +#255#20'd'#0#255#21'b'#0#255#22'a'#0#255#24'`'#0#255#25'^'#0#255#26']'#0#255
+ +#27'['#0#255#28'Z'#0#255#29'Y'#0#255#30'W'#0#255#31'V'#0#255#24'?'#0#255#3'Y'
+ +#0#255#5'v'#0#255#6'u'#0#255#7't'#0#255#8't'#0#255#8's'#0#255#9'r'#0#255#10
+ +'q'#0#255#11'o'#0#255#12'n'#0#255#12'n'#0#255#13'l'#0#255#14'k'#0#255#15'j'#0
+ +#255#16'i'#0#255#17'h'#0#255#18'f'#0#255#19'e'#0#255#20'd'#0#255#21'b'#0#255
+ +#22'a'#0#255#23'`'#0#255#24'_'#0#255#25']'#0#255#26'\'#0#255#28'['#0#255#29
+ +'Y'#0#255#30'X'#0#255#31'V'#0#255' U'#0#255'"S'#0#255#26'='#0#255#4'X'#0#255
+ +#7'u'#0#255#7't'#0#255#8's'#0#255#9'r'#0#255#10'q'#0#255#11'p'#0#255#11'o'#0
+ +#255#12'n'#0#255#13'm'#0#255#14'k'#0#255#15'j'#0#255#16'i'#0#255#17'h'#0#255
+ +#18'g'#0#255#19'f'#0#255#20'd'#0#255#21'c'#0#255#22'b'#0#255#23'`'#0#255#24
+ +'_'#0#255#25']'#0#255#26'\'#0#255#27'['#0#255#28'Z'#0#255#30'X'#0#255#31'W'#0
+ +#255' U'#0#255'!T'#0#255'"R'#0#255'$P'#0#255#27';'#0#255#5'W'#0#255#8's'#0
+ +#255#9'r'#0#255#9'q'#0#255#10'p'#0#255#11'o'#0#255#12'n'#0#255#13'm'#0#255#14
+ +'l'#0#255#15'k'#0#255#16'i'#0#255#17'h'#0#255#18'g'#0#255#19'f'#0#255#20'e'#0
+ +#255#21'c'#0#255#21'b'#0#255#23'a'#0#255#24'_'#0#255#25'^'#0#255#26'\'#0#255
+ +#27'['#0#255#28'Z'#0#255#29'X'#0#255#30'W'#0#255' V'#0#255'!T'#0#255'"S'#0
+ +#255'#Q'#0#255'$O'#0#255'&N'#0#255#29'9'#0#255#6'V'#0#255#9'r'#0#255#10'p'#0
+ +#255#11'o'#0#255#12'n'#0#255#13'm'#0#255#13'l'#0#255#14'k'#0#255#15'j'#0#255
+ +#16'i'#0#255#17'g'#0#255#18'f'#0#255#19'e'#0#255#20'd'#0#255#21'b'#0#255#22
+ +'a'#0#255#24'`'#0#255#25'^'#0#255#25']'#0#255#27'\'#0#255#28'Z'#0#255#29'Y'#0
+ +#255#30'W'#0#255#31'V'#0#255'!T'#0#255'"S'#0#255'#R'#0#255'$P'#0#255'%N'#0
+ ,#255'''M'#0#255'(K'#0#255#31'7'#0#255#7'T'#0#255#11'p'#0#255#11'o'#0#255#12
+ +'n'#0#255#13'l'#0#255#14'k'#0#255#15'j'#0#255#16'i'#0#255#17'h'#0#255#18'g'#0
+ +#255#19'e'#0#255#20'd'#0#255#21'c'#0#255#22'a'#0#255#23'`'#0#255#24'_'#0#255
+ +#25']'#0#255#26'\'#0#255#28'['#0#255#29'Y'#0#255#30'X'#0#255#31'V'#0#255' U'
+ +#0#255'!S'#0#255'#R'#0#255'$P'#0#255'%N'#0#255'&M'#0#255'(L'#0#255')J'#0#255
+ +'*H'#0#255' 5'#0#255#8'S'#0#255#12'n'#0#255#13'm'#0#255#14'l'#0#255#15'j'#0
+ +#255#16'i'#0#255#17'h'#0#255#18'g'#0#255#19'f'#0#255#20'd'#0#255#21'c'#0#255
+ +#22'b'#0#255#23'a'#0#255#24'_'#0#255#25'^'#0#255#26'\'#0#255#27'['#0#255#28
+ +'Z'#0#255#30'X'#0#255#31'W'#0#255' U'#0#255'!T'#0#255'"R'#0#255'#Q'#0#255'%O'
+ +#0#255'&M'#0#255'''L'#0#255')J'#0#255'*I'#0#255'+G'#0#255',F'#0#255'"3'#0#255
+ +#10'R'#0#255#14'l'#0#255#15'k'#0#255#16'j'#0#255#17'h'#0#255#17'g'#0#255#18
+ +'f'#0#255#19'e'#0#255#20'c'#0#255#21'b'#0#255#23'a'#0#255#24'_'#0#255#25'^'#0
+ +#255#26']'#0#255#27'['#0#255#28'Z'#0#255#29'Y'#0#255#30'W'#0#255' V'#0#255'!'
+ +'T'#0#255'"S'#0#255'#Q'#0#255'$O'#0#255'&N'#0#255'''L'#0#255'(K'#0#255'*I'#0
+ +#255'+G'#0#255',F'#0#255'.D'#0#255'/B'#0#255'$1'#0#255#11'P'#0#255#15'j'#0
+ +#255#16'i'#0#255#17'g'#0#255#18'f'#0#255#19'e'#0#255#20'd'#0#255#21'b'#0#255
+ +#22'a'#0#255#23'`'#0#255#24'^'#0#255#25']'#0#255#27'\'#0#255#28'Z'#0#255#29
+ +'Y'#0#255#30'X'#0#255#31'V'#0#255' U'#0#255'"S'#0#255'#R'#0#255'$P'#0#255'%N'
+ +#0#255'''M'#0#255'(K'#0#255')J'#0#255'+H'#0#255',F'#0#255'-E'#0#255'.C'#0#255
+ +'0A'#0#255'1?'#0#255'&/'#0#255#12'N'#0#255#17'h'#0#255#18'g'#0#255#19'e'#0
+ +#255#20'd'#0#255#21'c'#0#255#22'a'#0#255#23'`'#0#255#24'_'#0#255#25']'#0#255
+ +#26'\'#0#255#27'['#0#255#29'Y'#0#255#30'X'#0#255#31'V'#0#255' U'#0#255'!S'#0
+ +#255'"R'#0#255'$P'#0#255'%O'#0#255'&M'#0#255'''L'#0#255')J'#0#255'*H'#0#255
+ +'+G'#0#255'-E'#0#255'.C'#0#255'/B'#0#255'*8'#0#255'2>'#0#255'4='#0#255'(,'#0
+ +#255#13'M'#0#255#19'f'#0#255#20'e'#0#255#14'D'#0#255#20'\'#0#255#23'a'#0#255
+ +#24'_'#0#255#25'^'#0#255#26'\'#0#255#27'['#0#255#28'Z'#0#255#29'X'#0#255#31
+ +'W'#0#255' U'#0#255'!T'#0#255'"R'#0#255'#Q'#0#255'%O'#0#255'&M'#0#255'''L'#0
+ +#255'(K'#0#255'*I'#0#255'+G'#0#255',F'#0#255'.D'#0#255'/B'#0#255'0@'#0#255'!'
+ +'*'#0#239#19#22#0#175'5;'#0#255'6:'#0#255')*'#0#255#15'K'#0#255#20'c'#0#255
+ +#21'b'#0#255#11'1'#0''#6#24#0''#18'G'#0#255#26']'#0#255#27'['#0#255#28'Z'#0
+ +#255#29'Y'#0#255#30'W'#0#255' V'#0#255'!T'#0#255'"S'#0#255'#Q'#0#255'$O'#0
+ +#255'&N'#0#255'''L'#0#255'(K'#0#255'*I'#0#255'+G'#0#255',F'#0#255'-D'#0#255
+ +'/C'#0#255'0A'#0#255'1?'#0#255#23#29#0#207#0#0#0#31#27#28#0'78'#0#255'87'#0
+ +#255'+('#0#255#16'J'#0#255#22'a'#0#255#23'`'#0#255#12'/'#0''#0#0#0#0#0#0#0
+ +'/'#15'1'#0#207#27'S'#0#255#30'X'#0#255#31'V'#0#255' U'#0#255'"S'#0#255'#R'#0
+ +#255'$P'#0#255'%N'#0#255'&M'#0#255'(K'#0#255')J'#0#255'*H'#0#255',F'#0#255'-'
+ +'E'#0#255'.C'#0#255'0A'#0#255'1@'#0#255'2>'#0#255#27'!'#0#207#0#0#0#15#0#0#0
+ +#0#28#27#0'95'#0#255';3'#0#255'-%'#0#255#17'H'#0#255#24'_'#0#255#25']'#0#255
+ +#13'.'#0''#0#0#0#0#0#0#0#0#0#0#0#0#7#21#0''#24'@'#0#255'!T'#0#255'"R'#0#255
+ +'$P'#0#255'%O'#0#255'&M'#0#255'''L'#0#255')J'#0#255'*H'#0#255'+G'#0#255'-E'#0
+ +#255'.C'#0#255'/B'#0#255'1@'#0#255'2>'#0#255'4='#0#255'#('#0#239#0#0#0'/'#0#0
+ +#0#0#0#0#0#0#29#25#0'<2'#0#255'=0'#0#255'/#'#0#255#19'F'#0#255#26'\'#0#255
+ +#27'['#0#255#14'-'#0''#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'/'#19','#0#207
+ +'"J'#0#255'&N'#0#255'''L'#0#255'(K'#0#255'$@'#0#255#24')'#0#223#28'-'#0#223
+ +'+@'#0#255'/B'#0#255'0A'#0#255'2?'#0#255'3='#0#255'5;'#0#255',/'#0#255#11#11
+ +#0'O'#0#0#0#0#0#0#0#0#0#0#0#0#31#24#0'>/'#0#255'@-'#0#255'1 '#0#255#20'D'#0
+ +#255#28'Z'#0#255#29'Y'#0#255#15','#0''#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#5#11#0'o'#26'2'#0#239')I'#0#255#25'+'#0#239#7#12#0'_'#0#0#0#0#0#0
+ +#0#0#14#19#0#159'.;'#0#255'3>'#0#255'4<'#0#255'6:'#0#255'78'#0#255#18#18#0
+ +#143#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0' '#22#0'A,'#0#255'B*'#0#255'3'#30#0#255
+ +#22'C'#0#255#30'X'#0#255#31'V'#0#255#16'+'#0''#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#0#0#0'?'#0#0#0#15#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#26#30#0#223'5;'#0#255'79'#0#255'87'#0#255#30#29#0#207#0#0#0#15#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0'!'#21#0'D('#0#255'E&'#0#255'5'#28#0#255#23'A'#0
+ +#255' U'#0#255'!T'#0#255#17')'#0''#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +'?--'#0#255'96'#0#255''#0#239#0#0#0'/'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0'"'#19#0'G%'#0#255'H#'#0#255'7'#25#0#255#25'?'#0#255'"S'#0#255'#Q'#0#255
+ +#18'('#0''#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9#8#0'_"'#30#0#191#0#0
+ +#0'/'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'$'#17#0'I"'#0#255'K '
+ +#0#255'9'#22#0#255#26'='#0#255'$P'#0#255'%N'#0#255#19'&'#0''#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0'%'#16#0'L'#30#0#255'M'#28#0#255';'#20#0#255#28';'#0
+ +#255'&M'#0#255'''L'#0#255#20'%'#0''#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +''''#14#0'O'#27#0#255'P'#25#0#255'='#17#0#255#29'9'#0#255')J'#0#255'*I'#0
+ +#255#21'$'#0''#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'('#12#0'Q'#23#0#255
+ +'S'#21#0#255'?'#15#0#255#31'7'#0#255'+G'#0#255',F'#0#255#22'"'#0''#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0')'#10#0'T'#20#0#255'V'#18#0#255'A'#12#0#255
+ +'!5'#0#255'-E'#0#255'.C'#0#255#28'&'#0#191#25#31#0''#26#30#0''#26#29#0''
+ +#27#28#0''#27#28#0''#28#27#0''#29#26#0''#30#25#0''#30#24#0''#31#23#0''
+ +' '#22#0'!'#21#0'!'#20#0'"'#19#0'#'#18#0'$'#17#0'%'#16#0'%'#15#0'&'
+ +#14#0''''#13#0'('#12#0')'#11#0')'#10#0'*'#9#0'2'#10#0#191'W'#16#0#255
+ +'Y'#14#0#255'D'#9#0#255'#2'#0#255'/B'#0#255'1@'#0#255'2>'#0#255'4='#0#255'5;'
+ +#0#255'69'#0#255'87'#0#255'96'#0#255':4'#0#255'<2'#0#255'=0'#0#255'?.'#0#255
+ +'@,'#0#255'B+'#0#255'C)'#0#255'E'''#0#255'G%'#0#255'H#'#0#255'J!'#0#255'K'#31
+ +#0#255'M'#29#0#255'N'#27#0#255'P'#25#0#255'R'#23#0#255'S'#21#0#255'U'#19#0
+ +#255'W'#17#0#255'X'#15#0#255'Z'#13#0#255'['#11#0#255'F'#7#0#255'$0'#0#255'2?'
+ +#0#255'3='#0#255'5;'#0#255'6:'#0#255'78'#0#255'96'#0#255':4'#0#255'<2'#0#255
+ +'=1'#0#255'?/'#0#255'@-'#0#255'A+'#0#255'C)'#0#255'E'''#0#255'F%'#0#255'H#'#0
+ +#255'I!'#0#255'K'#31#0#255'L'#29#0#255'N'#28#0#255'P'#26#0#255'Q'#24#0#255'S'
+ +#22#0#255'T'#20#0#255'V'#18#0#255'X'#15#0#255'Z'#13#0#255'['#11#0#255']'#9#0
+ +#255'^'#7#0#255'H'#4#0#255#28'#'#0#255'''-'#0#255'(,'#0#255')*'#0#255'*)'#0
+ +#255'+('#0#255',&'#0#255'-%'#0#255'.$'#0#255'/"'#0#255'0!'#0#255'2 '#0#255'3'
+ +#30#0#255'4'#29#0#255'5'#27#0#255'6'#26#0#255'7'#24#0#255'9'#23#0#255':'#21#0
+ +#255';'#20#0#255'<'#18#0#255'='#17#0#255'>'#15#0#255'@'#14#0#255'A'#12#0#255
+ +'B'#11#0#255'D'#9#0#255'E'#8#0#255'F'#6#0#255'G'#5#0#255'I'#3#0#255'7'#1#0
+ +#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#8#0#0#16#14
+ +#0#0'0'#15#0#0'p'#15#193#128#240#15#227#192#240#15#255#193#240#15#255#227#240
+ +#15#255#255#240#15#255#255#240#15#255#255#240#15#255#255#240#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0'('#0#0#0#16#0#0#0' '#0#0#0#1#0' '#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0'}'#0#255#1'|'#0#255#2'z'#0#255#3'y'#0#255#4'x'#0
+ +#255#6'v'#0#255#7't'#0#255#8'r'#0#255#10'p'#0#255#12'n'#0#255#13'l'#0#255#15
+ +'j'#0#255#17'g'#0#255#19'e'#0#255#21'b'#0#255#23'`'#0#255#2'{'#0#255#3'z'#0
+ +#255#4'x'#0#255#5'v'#0#255#7'u'#0#255#8's'#0#255#10'q'#0#255#11'o'#0#255#13
+ +'m'#0#255#15'j'#0#255#17'h'#0#255#19'f'#0#255#21'c'#0#255#23'a'#0#255#25'^'#0
+ +#255#27'['#0#255#4'x'#0#255#5'w'#0#255#6'u'#0#255#8's'#0#255#9'r'#0#255#11'o'
+ +#0#255#13'm'#0#255#14'k'#0#255#16'i'#0#255#18'f'#0#255#20'd'#0#255#22'a'#0
+ +#255#24'^'#0#255#27'\'#0#255#29'Y'#0#255#31'V'#0#255#6'v'#0#255#7't'#0#255#9
+ +'r'#0#255#10'p'#0#255#12'n'#0#255#14'l'#0#255#16'i'#0#255#18'g'#0#255#20'e'#0
+ +#255#22'b'#0#255#24'_'#0#255#26']'#0#255#28'Z'#0#255#31'W'#0#255'!T'#0#255'#'
+ +'Q'#0#255#8's'#0#255#10'p'#0#255#12'n'#0#255#13'l'#0#255#15'j'#0#255#17'h'#0
+ +#255#19'e'#0#255#21'c'#0#255#23'`'#0#255#25']'#0#255#28'['#0#255#30'X'#0#255
+ +' U'#0#255'#R'#0#255'%O'#0#255'(L'#0#255#11'o'#0#255#13'm'#0#255#15'j'#0#255
+ +#17'h'#0#255#19'f'#0#255#21'c'#0#255#23'a'#0#255#25'^'#0#255#27'['#0#255#29
+ +'Y'#0#255' V'#0#255'"S'#0#255'$O'#0#255'''L'#0#255'*I'#0#255',F'#0#255#14'k'
+ +#0#255#16'i'#0#255#18'f'#0#255#20'd'#0#255#22'a'#0#255#24'_'#0#255#26'\'#0
+ +#255#29'Y'#0#255#31'V'#0#255'!S'#0#255'$P'#0#255'&M'#0#255')J'#0#255'+G'#0
+ +#255'.C'#0#255'1@'#0#255#18'g'#0#255#20'e'#0#255#21'b'#0#255#24'_'#0#255#26
+ +']'#0#255#28'Z'#0#255#30'W'#0#255'!T'#0#255'#Q'#0#255'&N'#0#255'(K'#0#255'+H'
+ +#0#255'-D'#0#255'0A'#0#255'3>'#0#239'6:'#0#255#21'c'#0#255#23'`'#0#207#25'^'
+ +#0#143#27'['#0#255#30'X'#0#255' U'#0#255'"R'#0#255'%O'#0#255'''L'#0#255'*I'#0
+ +#255'-E'#0#255'/B'#0#255'2?'#0#255'3='#0'_87'#0#191':4'#0#255#25'^'#0#255#27
+ +'\'#0#191#0#0#0#0#31'W'#0'?"S'#0#223'$P'#0#255'''M'#0#255')I'#0#255',F'#0#255
+ +'.C'#0#255'1?'#0#255'4<'#0#255'6:'#0''#0#0#0#0'=1'#0#191'?.'#0#255#29'Y'#0
+ +#255#31'W'#0#191#0#0#0#0#0#0#0#0#0#0#0#0'(K'#0'*H'#0#175'+G'#0#31'0A'#0'?3='
+ +#0#255'6:'#0#255'87'#0#191#0#0#0#0#0#0#0#0'B+'#0#191'E'''#0#255'!T'#0#255'#R'
+ +#0#191#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'87'#0#143';4'
+ +#0#239';3'#0#31#0#0#0#0#0#0#0#0'G$'#0#191'J!'#0#255'%O'#0#255'''L'#0#191#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0'L'#30#0#191'O'#26#0#255')J'#0#255'+G'#0#191#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0'R'#23#0#191'U'#19#0#255'.D'#0#255'0A'#0#239'4='#0#191'69'#0#191'96'#0
+ +#191'<2'#0#191'?.'#0#191'B+'#0#191'E'''#0#191'H#'#0#191'K'#31#0#191'N'#27#0
+ +#191'R'#23#0#191'U'#19#0#191'W'#16#0#239'Z'#12#0#255'2>'#0#255'5;'#0#255'87'
+ +#0#255';4'#0#255'=0'#0#255'@,'#0#255'C)'#0#255'G%'#0#255'J!'#0#255'M'#29#0
+ +#255'P'#25#0#255'S'#21#0#255'V'#17#0#255'Z'#13#0#255']'#9#0#255'`'#5#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255' '#4#0#255'8'#12#0#255'?'#140#0#255'?'#252#0#255'?'#252#0#255
+ +#0#0#0#255#0#0#0#255
+]);
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/EverwoodIDEResources.res b/internal/6.0.43.801/1/Everwood/Source/Delphi/EverwoodIDEResources.res
new file mode 100644
index 0000000..12dee92
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Source/Delphi/EverwoodIDEResources.res differ
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.bdsproj b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.bdsproj
new file mode 100644
index 0000000..786d0f4
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.bdsproj
@@ -0,0 +1,180 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {C239782A-EA39-4CF9-91C2-955D92AF0504}
+
+
+
+
+ RemObjects_Everwood_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Everwood for Delphi
+ False
+
+
+
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\..\Dcu\D10
+ ..\;..\..\Dcu\D10
+
+ xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 1
+ 56
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ 1.0.1.56
+ 1.0.0.0
+
+
+
+
+
+
+
+
+
+ True
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.cfg b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.cfg
new file mode 100644
index 0000000..9692106
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.cfg
@@ -0,0 +1,45 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N0"..\..\Dcu\D10"
+-LE"..\..\Bin"
+-LN"..\..\Bin"
+-U"..\;..\..\Dcu\D10"
+-O"..\;..\..\Dcu\D10"
+-I"..\;..\..\Dcu\D10"
+-R"..\;..\..\Dcu\D10"
+-DxDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+-Z
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.dpk b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.dpk
new file mode 100644
index 0000000..9465b2d
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.dpk
@@ -0,0 +1,53 @@
+package RemObjects_Everwood_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Everwood for Delphi'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+
+requires
+ rtl,
+ vcl,
+ vclie,
+ designide,
+ vclx;
+
+contains
+ uEWOTAWizards in 'uEWOTAWizards.pas',
+ uEWOTAHelpers in 'uEWOTAHelpers.pas',
+ uEWSampleInfo in 'uEWSampleInfo.pas' {SampleInfoForm},
+ uEWOTANewModuleExpert in 'uEWOTANewModuleExpert.pas',
+ RemObjects_Everwood_Reg in 'RemObjects_Everwood_Reg.pas',
+ uEWOTANewProjectExpert in 'uEWOTANewProjectExpert.pas',
+ uEWOTARepositoryExpert in 'uEWOTARepositoryExpert.pas',
+ uEWMenuManager in 'uEWMenuManager.pas',
+ uEWAbout in 'uEWAbout.pas',
+ uEWWizard in 'uEWWizard.pas' {EWWizardForm},
+ uEWTools in 'uEWTools.pas',
+ uEWOTAMessages in 'uEWOTAMessages.pas',
+ uEWStringTools in 'uEWStringTools.pas',
+ uEWHelpers in 'uEWHelpers.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.res b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.res
new file mode 100644
index 0000000..b76fd15
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D10.res differ
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D11.dpk b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D11.dpk
new file mode 100644
index 0000000..0ac7aae
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D11.dpk
@@ -0,0 +1,53 @@
+package RemObjects_Everwood_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Everwood for Delphi'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+
+requires
+ rtl,
+ vcl,
+ vclie,
+ designide,
+ vclx;
+
+contains
+ uEWOTAWizards in 'uEWOTAWizards.pas',
+ uEWOTAHelpers in 'uEWOTAHelpers.pas',
+ uEWSampleInfo in 'uEWSampleInfo.pas' {SampleInfoForm},
+ uEWOTANewModuleExpert in 'uEWOTANewModuleExpert.pas',
+ RemObjects_Everwood_Reg in 'RemObjects_Everwood_Reg.pas',
+ uEWOTANewProjectExpert in 'uEWOTANewProjectExpert.pas',
+ uEWOTARepositoryExpert in 'uEWOTARepositoryExpert.pas',
+ uEWMenuManager in 'uEWMenuManager.pas',
+ uEWAbout in 'uEWAbout.pas',
+ uEWWizard in 'uEWWizard.pas' {EWWizardForm},
+ uEWTools in 'uEWTools.pas',
+ uEWOTAMessages in 'uEWOTAMessages.pas',
+ uEWStringTools in 'uEWStringTools.pas',
+ uEWHelpers in 'uEWHelpers.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D11.dproj b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D11.dproj
new file mode 100644
index 0000000..29a0ca5
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D11.dproj
@@ -0,0 +1,93 @@
+
+
+ {b7956419-311f-4137-a85b-371bb0f78d5d}
+ RemObjects_Everwood_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\RemObjects_Everwood_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ 0
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Bin
+ ..\..\Bin
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE;RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Dcu\D11
+ ..\..\Bin
+ ..\..\Bin
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ ..\;..\..\Dcu\D11
+ xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False False True False RemObjects Everwood for Delphi False True False True False 1 0 1 53 False False False False False 1033 1252 1.0.1.53 1.0.0.0 RemObjects_Everwood_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D11.res b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D11.res
new file mode 100644
index 0000000..0fc3bba
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D11.res differ
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D12.dpk b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D12.dpk
new file mode 100644
index 0000000..d2e1eb9
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D12.dpk
@@ -0,0 +1,53 @@
+package RemObjects_Everwood_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Everwood for Delphi'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+
+requires
+ rtl,
+ vcl,
+ vclie,
+ designide,
+ vclx;
+
+contains
+ uEWOTAWizards in 'uEWOTAWizards.pas',
+ uEWOTAHelpers in 'uEWOTAHelpers.pas',
+ uEWSampleInfo in 'uEWSampleInfo.pas' {SampleInfoForm},
+ uEWOTANewModuleExpert in 'uEWOTANewModuleExpert.pas',
+ RemObjects_Everwood_Reg in 'RemObjects_Everwood_Reg.pas',
+ uEWOTANewProjectExpert in 'uEWOTANewProjectExpert.pas',
+ uEWOTARepositoryExpert in 'uEWOTARepositoryExpert.pas',
+ uEWMenuManager in 'uEWMenuManager.pas',
+ uEWAbout in 'uEWAbout.pas',
+ uEWWizard in 'uEWWizard.pas' {EWWizardForm},
+ uEWTools in 'uEWTools.pas',
+ uEWOTAMessages in 'uEWOTAMessages.pas',
+ uEWStringTools in 'uEWStringTools.pas',
+ uEWHelpers in 'uEWHelpers.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D12.dproj b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D12.dproj
new file mode 100644
index 0000000..452c01f
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D12.dproj
@@ -0,0 +1,183 @@
+
+
+ {b7956419-311f-4137-a85b-371bb0f78d5d}
+ RemObjects_Everwood_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\RemObjects_Everwood_D11.bpl
+ 11.1
+ Debug
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ 1
+ error
+ error
+ error
+ error
+ error
+ error
+ error
+ ..\..\Bin
+ ..\..\Dcu\D12
+ error
+ ..\..\Bin
+ true
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Bin\RemObjects_Everwood_D12.bpl
+ RemObjects Everwood for Delphi
+ xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE;$(DCC_Define)
+
+
+ false
+ true
+ true
+ true
+ false
+ true
+ true
+ true
+ False
+ ..\..\Dcu\D11
+ 7.0
+ 0
+ False
+ False
+ False
+ False
+ True
+ False
+ False
+ ..\;..\..\Dcu\D11;$(DCC_ObjPath)
+ False
+ ..\;..\..\Dcu\D11;$(DCC_ResourcePath)
+ False
+ RELEASE;$(DCC_Define)
+ ..\..\Dcu\D11
+ ..\;..\..\Dcu\D11;$(DCC_IncludePath)
+ False
+
+
+ False
+ ..\..\Dcu\D11
+ 7.0
+ False
+ False
+ False
+ True
+ False
+ False
+ ..\;..\..\Dcu\D11;$(DCC_ObjPath)
+ False
+ ..\;..\..\Dcu\D11;$(DCC_ResourcePath)
+ ..\..\Dcu\D11
+ ..\;..\..\Dcu\D11;$(DCC_IncludePath)
+ False
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+ Cfg_Release
+ Base
+
+
+ Cfg_Debug
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 2
+ 0
+ 1
+ 109
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ 2.0.1.109
+ 2.0.1.109
+
+
+
+
+
+
+
+
+
+ RemObjects_Everwood_D12.dpk
+
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D12.res b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D12.res
new file mode 100644
index 0000000..0fc3bba
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D12.res differ
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D14.dpk b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D14.dpk
new file mode 100644
index 0000000..1f0ac47
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D14.dpk
@@ -0,0 +1,53 @@
+package RemObjects_Everwood_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Everwood for Delphi'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+
+requires
+ rtl,
+ vcl,
+ vclie,
+ designide,
+ vclx;
+
+contains
+ uEWOTAWizards in 'uEWOTAWizards.pas',
+ uEWOTAHelpers in 'uEWOTAHelpers.pas',
+ uEWSampleInfo in 'uEWSampleInfo.pas' {SampleInfoForm},
+ uEWOTANewModuleExpert in 'uEWOTANewModuleExpert.pas',
+ RemObjects_Everwood_Reg in 'RemObjects_Everwood_Reg.pas',
+ uEWOTANewProjectExpert in 'uEWOTANewProjectExpert.pas',
+ uEWOTARepositoryExpert in 'uEWOTARepositoryExpert.pas',
+ uEWMenuManager in 'uEWMenuManager.pas',
+ uEWAbout in 'uEWAbout.pas',
+ uEWWizard in 'uEWWizard.pas' {EWWizardForm},
+ uEWTools in 'uEWTools.pas',
+ uEWOTAMessages in 'uEWOTAMessages.pas',
+ uEWStringTools in 'uEWStringTools.pas',
+ uEWHelpers in 'uEWHelpers.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D14.dproj b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D14.dproj
new file mode 100644
index 0000000..c290c21
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D14.dproj
@@ -0,0 +1,186 @@
+
+
+ {b7956419-311f-4137-a85b-371bb0f78d5d}
+ RemObjects_Everwood_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\..\Dcu\D11\RemObjects_Everwood_D11.bpl
+ 11.1
+ Debug
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ 1
+ error
+ error
+ error
+ error
+ error
+ error
+ error
+ ..\..\Bin
+ ..\..\Dcu\D14
+ error
+ ..\..\Bin
+ true
+ true
+ true
+ true
+ true
+ 00400000
+ ..\..\Bin\RemObjects_Everwood_D14.bpl
+ RemObjects Everwood for Delphi
+ xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE;$(DCC_Define)
+
+
+ false
+ true
+ true
+ true
+ false
+ true
+ true
+ true
+ False
+ ..\..\Dcu\D11
+ 7.0
+ 0
+ False
+ False
+ False
+ False
+ True
+ False
+ False
+ ..\;..\..\Dcu\D11;$(DCC_ObjPath)
+ False
+ ..\;..\..\Dcu\D11;$(DCC_ResourcePath)
+ False
+ RELEASE;$(DCC_Define)
+ ..\..\Dcu\D11
+ ..\;..\..\Dcu\D11;$(DCC_IncludePath)
+ False
+
+
+ False
+ ..\..\Dcu\D11
+ 7.0
+ False
+ False
+ False
+ True
+ False
+ False
+ ..\;..\..\Dcu\D11;$(DCC_ObjPath)
+ False
+ ..\;..\..\Dcu\D11;$(DCC_ResourcePath)
+ ..\..\Dcu\D11
+ ..\;..\..\Dcu\D11;$(DCC_IncludePath)
+ False
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+ Cfg_Release
+ Base
+
+
+ Cfg_Debug
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 2
+ 0
+ 1
+ 109
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ 2.0.1.109
+ 2.0.1.109
+
+
+
+
+
+
+
+
+
+ RemObjects_Everwood_D14.dpk
+
+
+
+
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D14.res b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D14.res
new file mode 100644
index 0000000..26bd1d0
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D14.res differ
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.cfg b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.cfg
new file mode 100644
index 0000000..8758c38
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.cfg
@@ -0,0 +1,38 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D6"
+-LE"..\..\Bin"
+-LN"..\..\Bin"
+-DxDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+-Z
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.dof b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.dof
new file mode 100644
index 0000000..32497d8
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.dof
@@ -0,0 +1,165 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=1
+UnsafeCode=1
+UnsafeCast=1
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Everwood for Delphi
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D6
+PackageDLLOutputDir=..\..\Bin
+PackageDCPOutputDir=..\..\Bin
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;vcldb;dsnapcon;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;CDKSmp;CDKDesignTimeSupport;ES_CodeSite20;CDK;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;RzBz4070;cxCommonEditingVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxExtEditorsVCLD7;cxGridUtilsVCLD7;cxGridVCLD7;cxPageControlVCLD7;cxTreeListVCLD7;addict3_d6;dxBarD7;dxComnD7;dxBarDBNavD7;dxBarExtDBItemsD7;dxBarExtItemsD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxGrEdD7;dxDBEdD7;dxInsD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;dxsbD7;SynEdit_D7;tb2kComplete_70;EzSpecials_D7;PurposesoftD7;Rz252D70;Rz252N70;RemObjects_DataSnap_D7;DataAbstract_IDE_D7;DataAbstract_Core_D7;DataAbstract_DBXDriver_D7;DataAbstract_DiskDriver_D7;Nexus100ts70;Nexus100ll70;Nexus100tn70;Nexus100pt70;Nexus100tw70;ECQDBCD7;EQTLD7;sq7;cxExportVCLD7;SchemaModelerUtils_d7;CrTb2k;ESCore;CR_Standard;madBasic_;madDisAsm_;CSP20I70.bpl;
+Conditionals=xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+[Version Info]
+IncludeVerInfo=1
+AutoIncBuild=0
+MajorVer=0
+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=0.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+[Excluded Packages]
+R:\RemObjects SDK\Dcu\D6\RemObjects_Core_D6.bpl=RemObjects SDK - Core Library
+R:\Hydra\Trial\D6\Hydra_RO_D6.bpl=RemObjects' Hydra - RemObjects SDK Integration Library TRIAL
+R:\RemObjects SDK\Dcu\D6\RemObjects_RODX_D6.bpl=RemObjects SDK - RODXSock Library
+R:\RemObjects SDK\Dcu\D6\RemObjects_BPDX_D6.bpl=RemObjects SDK - BPDX Library
+R:\RemObjects SDK\Dcu\D6\RemObjects_DataSnap_D6.bpl=RemObjects SDK - DataSnap Integration Pack
+r:\RemObjects SDK\Dcu\d6\RemObjects_Indy_D6.bpl=RemObjects SDK - Indy Library
+R:\RemObjects SDK for Delphi\Dcu\D6\RemObjects_IDE_D6.bpl=RemObjects SDK - IDE Integration
+R:\Data Abstract\Dcu\D6\DataAbstract_Core_D6.bpl=RemObjects Data Abstract - Core Library
+R:\Data Abstract\Dcu\D6\DataAbstract_DBXDriver_D6.bpl=RemObjects Data Abstract - dbExpress Driver
+R:\Data Abstract\Dcu\D6\DataAbstract_DiskDriver_D6.bpl=RemObjects Data Abstract - Disk Driver
+R:\Data Abstract\Dcu\D6\DataAbstract_IBXDriver_D6.bpl=RemObjects Data Abstract - InterBase Express Driver
+R:\Data Abstract\Dcu\D6\DataAbstract_IDE_D6.bpl=RemObjects Data Abstract - IDE Package
+R:\RemObjects SDK\Dcu\D6\RemObjects_Enterprise_D6.bpl=RemObjects SDK - Enterprise Edition
+R:\Data Abstract\Dcu\D6\DataAbstract_ADODriver_D6.bpl=RemObjects Data Abstract - ADOExpress/dbGo Driver
+[HistoryLists\hlConditionals]
+Count=1
+Item0=xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+[HistoryLists\hlUnitAliases]
+Count=1
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+[HistoryLists\hlUnitOutputDirectory]
+Count=1
+Item0=..\..\Dcu\D6
+[HistoryLists\hlBPLOutput]
+Count=1
+Item0=..\..\Dcu\D6
+[HistoryLists\hlDCPOutput]
+Count=1
+Item0=..\..\Dcu\D6
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.dpk b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.dpk
new file mode 100644
index 0000000..cef08c6
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.dpk
@@ -0,0 +1,53 @@
+package RemObjects_Everwood_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Everwood for Delphi'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+
+requires
+ rtl,
+ vcl,
+ vclie,
+ designide,
+ vclx;
+
+contains
+ uEWOTAWizards in 'uEWOTAWizards.pas',
+ uEWOTAHelpers in 'uEWOTAHelpers.pas',
+ uEWSampleInfo in 'uEWSampleInfo.pas' {SampleInfoForm},
+ uEWOTANewModuleExpert in 'uEWOTANewModuleExpert.pas',
+ RemObjects_Everwood_Reg in 'RemObjects_Everwood_Reg.pas',
+ uEWOTANewProjectExpert in 'uEWOTANewProjectExpert.pas',
+ uEWOTARepositoryExpert in 'uEWOTARepositoryExpert.pas',
+ uEWMenuManager in 'uEWMenuManager.pas',
+ uEWAbout in 'uEWAbout.pas',
+ uEWWizard in 'uEWWizard.pas' {EWWizardForm},
+ uEWTools in 'uEWTools.pas',
+ uEWOTAMessages in 'uEWOTAMessages.pas',
+ uEWStringTools in 'uEWStringTools.pas',
+ uEWHelpers in 'uEWHelpers.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.res b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.res
new file mode 100644
index 0000000..2ef0d19
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D6.res differ
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.cfg b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.cfg
new file mode 100644
index 0000000..2132da9
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.cfg
@@ -0,0 +1,47 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D7"
+-LE"..\..\Bin"
+-LN"..\..\Bin"
+-DxDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+-Z
+-w-SYMBOL_DEPRECATED
+-w-SYMBOL_LIBRARY
+-w-SYMBOL_PLATFORM
+-w-UNIT_LIBRARY
+-w-UNIT_PLATFORM
+-w-UNIT_DEPRECATED
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.dof b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.dof
new file mode 100644
index 0000000..5a17516
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.dof
@@ -0,0 +1,135 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Everwood for Delphi
+[Directories]
+OutputDir=
+UnitOutputDir=..\..\Dcu\D7
+PackageDLLOutputDir=..\..\Bin
+PackageDCPOutputDir=..\..\Bin
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;vcldb;dsnapcon;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;dclOfficeXP;CDKSmp;CDKDesignTimeSupport;ES_CodeSite20;CDK;ESDelphiCommandCompiler;ESFileSearch;ESVisualCompositeExpert;EaglWk;ESGraphUtils;ESBase;ESVsCp;ESSampleComposites70;ESSampleCompositeEditors7;RzBz4070;cxCommonEditingVCLD7;cxEditorsVCLD7;dxThemeD7;cxLibraryVCLD7;cxDataD7;cxExtEditorsVCLD7;cxGridUtilsVCLD7;cxGridVCLD7;cxPageControlVCLD7;cxTreeListVCLD7;addict3_d6;dxBarD7;dxComnD7;dxBarDBNavD7;dxBarExtDBItemsD7;dxBarExtItemsD7;dxDockingD7;dxEdtrD7;dxELibD7;dxExELD7;EQGridD7;dxExRwD7;dxGrEdD7;dxDBEdD7;dxInsD7;dxLayoutControlD7;dxMasterViewD7;dxmdsd7;dxNavBarD7;dxObjInsD7;dxPageControlD7;dxPSCoreD7;dxsbD7;SynEdit_D7;tb2kComplete_70;EzSpecials_D7;PurposesoftD7;Rz252D70;Rz252N70;RemObjects_DataSnap_D7;DataAbstract_IDE_D7;DataAbstract_Core_D7;DataAbstract_DBXDriver_D7;DataAbstract_DiskDriver_D7;Nexus100ts70;Nexus100ll70;Nexus100tn70;Nexus100pt70;Nexus100tw70;ECQDBCD7;EQTLD7;sq7;cxExportVCLD7;SchemaModelerUtils_d7;CrTb2k;ESCore;CR_Standard;madBasic_;madDisAsm_;CSP20I70.bpl;
+Conditionals=xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+[Version Info]
+IncludeVerInfo=1
+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.1.50
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.dpk b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.dpk
new file mode 100644
index 0000000..ab11329
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.dpk
@@ -0,0 +1,53 @@
+package RemObjects_Everwood_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Everwood for Delphi'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+
+requires
+ rtl,
+ vcl,
+ vclie,
+ designide,
+ vclx;
+
+contains
+ uEWOTAWizards in 'uEWOTAWizards.pas',
+ uEWOTAHelpers in 'uEWOTAHelpers.pas',
+ uEWSampleInfo in 'uEWSampleInfo.pas' {SampleInfoForm},
+ uEWOTANewModuleExpert in 'uEWOTANewModuleExpert.pas',
+ RemObjects_Everwood_Reg in 'RemObjects_Everwood_Reg.pas',
+ uEWOTANewProjectExpert in 'uEWOTANewProjectExpert.pas',
+ uEWOTARepositoryExpert in 'uEWOTARepositoryExpert.pas',
+ uEWMenuManager in 'uEWMenuManager.pas',
+ uEWAbout in 'uEWAbout.pas',
+ uEWWizard in 'uEWWizard.pas' {EWWizardForm},
+ uEWTools in 'uEWTools.pas',
+ uEWOTAMessages in 'uEWOTAMessages.pas',
+ uEWStringTools in 'uEWStringTools.pas',
+ uEWHelpers in 'uEWHelpers.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.res b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.res
new file mode 100644
index 0000000..0fc3bba
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D7.res differ
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.bdsproj b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.bdsproj
new file mode 100644
index 0000000..1f3a8c7
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.bdsproj
@@ -0,0 +1,176 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {C239782A-EA39-4CF9-91C2-955D92AF0504}
+
+
+
+
+ RemObjects_Everwood_D9.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Everwood for Delphi False
+
+
+
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+ ..\..\Dcu\D9
+ ..\;..\..\Dcu\D9
+
+ xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 1
+ 282
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ 3.0.1.282
+ 1.0.0.0
+
+
+
+
+
+
+
+
+ True
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.cfg b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.cfg
new file mode 100644
index 0000000..cbc338d
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.cfg
@@ -0,0 +1,45 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W+
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"..\..\Dcu\D9"
+-LE"..\..\Bin"
+-LN"..\..\Bin"
+-U"..\;..\..\Dcu\D9"
+-O"..\;..\..\Dcu\D9"
+-I"..\;..\..\Dcu\D9"
+-R"..\;..\..\Dcu\D9"
+-DxDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+-Z
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.dof b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.dof
new file mode 100644
index 0000000..6e0a739
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.dof
@@ -0,0 +1,136 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Everwood for Delphi
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP;RemObjects_WebBroker_D7;RemObjects_Indy_D7;RemObjects_RODX_D7;RemObjects_BPDX_D7;DataAbstract_DBXDriver_D7;DataAbstract_Scripting_D7;PascalScript_RO_D7;IBO40FTS_D7;IBO40TRT_D7;IBO40CRT_D7;IBO40RPL_D7;IBO40VRT_D7;IBO40FRT_D7;IBO40XRT_D7;IBO40WRT_D7;IBO40WXDT_D7;IBO40WXRT_D7;CRControls70;dac70;dacvcl70;sdacvcl70;sdac70;DataAbstract_IDE_D7;cxLibraryVCLD7;dxBarD7;dxComnD7;dxBarDBNavD7;dxBarExtDBItemsD7;dxBarExtItemsD7;dxDockingD7;dxsbD7;cxEditorsVCLD7;dxThemeD7;cxDataD7;cxExtEditorsVCLD7;cxPageControlVCLD7;cxGridVCLD7;cxSchedulerVCLD7;cxTreeListVCLD7;cxVerticalGridVCLD7;cxSpreadSheetVCLD7;dxNavBarD7;cxWebD7;cxWebPascalScriptD7;cxWebSnapD7;cxWebTeeChartD7;dxMasterViewD7;dxmdsD7;dxdbtrD7;dxtrmdD7;dxorgcD7;dxdborD7;dxFlowChartD7;dxLayoutControlD7;dxLayoutControlcxEditAdaptersD7;dxPSCoreD7;dxPSTeeChartD7;dxPsPrVwAdvD7;dxPSLnksD7;dxPSdxOCLnkD7;dxPSdxMVLnkD7;dxPSdxLCLnkD7;dxPSdxFCLnkD7;dxPSdxDBTVLnkD7;dxPSdxDBOCLnkD7;dxPSDBTeeChartD7;dxPScxCommonD7;dxPScxTLLnkD7;dxPScxSSLnkD7;dxPScxScheduler2LnkD7;dxPScxPCProdD7;dxPScxGridLnkD7;dxPScxExtCommonD7;dxPScxVGridLnkD7;DataAbstract_Core_D7;Hydra_Core_D7;Hydra_RO_D7
+Conditionals=xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=C:\Program Files\Borland\Delphi7\Bin\
+[Version Info]
+IncludeVerInfo=1
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1058
+CodePage=1251
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.dpk b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.dpk
new file mode 100644
index 0000000..71083c0
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.dpk
@@ -0,0 +1,53 @@
+package RemObjects_Everwood_D9;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Everwood for Delphi'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE xDEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+
+requires
+ rtl,
+ vcl,
+ vclie,
+ designide,
+ vclx;
+
+contains
+ uEWOTAWizards in 'uEWOTAWizards.pas',
+ uEWOTAHelpers in 'uEWOTAHelpers.pas',
+ uEWSampleInfo in 'uEWSampleInfo.pas' {SampleInfoForm},
+ uEWOTANewModuleExpert in 'uEWOTANewModuleExpert.pas',
+ RemObjects_Everwood_Reg in 'RemObjects_Everwood_Reg.pas',
+ uEWOTANewProjectExpert in 'uEWOTANewProjectExpert.pas',
+ uEWOTARepositoryExpert in 'uEWOTARepositoryExpert.pas',
+ uEWMenuManager in 'uEWMenuManager.pas',
+ uEWAbout in 'uEWAbout.pas',
+ uEWWizard in 'uEWWizard.pas' {EWWizardForm},
+ uEWTools in 'uEWTools.pas',
+ uEWOTAMessages in 'uEWOTAMessages.pas',
+ uEWStringTools in 'uEWStringTools.pas',
+ uEWHelpers in 'uEWHelpers.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.res b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.res
new file mode 100644
index 0000000..ddf10d2
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_D9.res differ
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Lazarus_Mac.lpk b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Lazarus_Mac.lpk
new file mode 100644
index 0000000..d6c7a0f
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Lazarus_Mac.lpk
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Lazarus_Unix.lpk b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Lazarus_Unix.lpk
new file mode 100644
index 0000000..2cebc1e
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Lazarus_Unix.lpk
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Lazarus_Windows.lpk b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Lazarus_Windows.lpk
new file mode 100644
index 0000000..3d3d02b
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Lazarus_Windows.lpk
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Reg.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Reg.pas
new file mode 100644
index 0000000..454629b
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/RemObjects_Everwood_Reg.pas
@@ -0,0 +1,29 @@
+unit RemObjects_Everwood_Reg;
+
+interface
+
+{$IFNDEF FPC}
+ {$R 'EverwoodIDEResources.res' 'EverwoodIDEResources.rc'}
+{$ENDIF}
+
+{$IFDEF FPC}
+procedure Register;
+{$ENDIF}
+implementation
+
+{$IFDEF FPC}
+uses
+ LResources,FormEditingIntf,
+ uEWWizard;
+
+
+procedure Register;
+begin
+ FormEditingHook.RegisterDesignerBaseClass(TEWWizardForm);
+end;
+
+initialization
+ {$I EverwoodIDEResources.lrs}
+{$ENDIF}
+end.
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/eDefines.inc b/internal/6.0.43.801/1/Everwood/Source/Delphi/eDefines.inc
new file mode 100644
index 0000000..ef01d58
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/eDefines.inc
@@ -0,0 +1,495 @@
+{----------------------------------------------------------------------------}
+{file: eDefines.inc }
+{type: Delphi include file }
+{ }
+{compiler: Borland Pascal 7, }
+{ Delphi 1-7, 2005-2007 for Win32 }
+{ Kylix 1-3, }
+{ C++Builder 1-6, 2006-2007 }
+{ Free Pascal Compiler 2.x }
+{ }
+{platforms: DOS, DPMI, Win16, Win32, Win64, Linux, Mac OS X }
+{ }
+{author: mh@elitedev.com }
+{ }
+{contents: Defines that can be flexibily used to determine the exact }
+{ compiler version used. }
+{ }
+{(c)opyright elitedevelopments software. all rights reserved. }
+{ http://www.elitedev.com }
+{ }
+{ Third Party component developers are encouraged to use the set of defines }
+{ established in this file, rather then their own system, for checking their }
+{ component libraries agains different versions of Delphi and C++Builder. }
+{ }
+{ This file may be distributed freely with both free and commercial source }
+{ libraries, but you are asked to please leave this comment in place, and }
+{ to return any improvements you make to this file to the maintainer that }
+{ is noted above. }
+{----------------------------------------------------------------------------}
+
+{----------------------------------------------------------------------------}
+{ Compiler and OS version defines: }
+{ }
+{ exact compiler versions: }
+{ }
+{ BP7 Borland Pascal 7.0 }
+{ DELPHI1 Delphi 1.0 (any Delphi) }
+{ DELPHI2 Delphi 2.0 }
+{ DELPHI3 Delphi 3.0 }
+{ DELPHI4 Delphi 4.0 }
+{ DELPHI5 Delphi 5.0 }
+{ DELPHI6 Delphi 6.0 }
+{ DELPHI7 Delphi 7.0 }
+{ DELPHI9 Delphi 2005 }
+{ DELPHI2005 Delphi 2005 }
+{ DELPHI2006 Delphi 2006 }
+{ DELPHI2007 Delphi 2007 }
+{ KYLIX1 Kylix 1.0 }
+{ KYLIX2 Kylix 2.0 }
+{ KYLIX3 Kylix 3.0 }
+{ CBUILDER1 C++Builder 1.0 }
+{ CBUILDER3 C++Builder 3.0 }
+{ CBUILDER4 C++Builder 4.0 }
+{ CBUILDER5 C++Builder 5.0 }
+{ }
+{ }
+{ minimum compiler versions: }
+{ }
+{ DELPHI1UP Delphi 1.0 and above (any Delphi) }
+{ DELPHI2UP Delphi 2.0 and above }
+{ DELPHI3UP Delphi 3.0 and above }
+{ DELPHI4UP Delphi 4.0 and above }
+{ DELPHI5UP Delphi 5.0 and above }
+{ DELPHI6UP Delphi 6.0 and above }
+{ DELPHI7UP Delphi 7.0 and above }
+{ DELPHI9UP Delphi 9.0 (2005) and above }
+{ DELPHI10UP Delphi 10.0 (2006) and above }
+{ DELPHI11UP Delphi 11.0 (2007) and above }
+{ DELPHI2005UP Delphi 2005 and above }
+{ DELPHI2006UP Delphi 2006 and above }
+{ DELPHI2007UP Delphi 2007 and above }
+{ KYLIX1UP Kylix 1.0 and above (any Kylix) }
+{ KYLIX2UP Kylix 2.0 and above (any Kylix) }
+{ KYLIX3UP Kylix 3.0 and above (any Kylix) }
+{ CBUILDER1UP C++Builder 1.0 and above or Delphi 2 and above }
+{ CBUILDER3UP C++Builder 3.0 and above or Delphi 3.0 and above }
+{ CBUILDER4UP C++Builder 4.0 and above or Delphi 4.0 and above }
+{ CBUILDER5UP C++Builder 5.0 and above or Delphi 5.0 and above }
+{ CBUILDER6UP C++Builder 5.0 and above or Delphi 5.0 and above }
+{ }
+{ }
+{ compiler types: }
+{ }
+{ BP Borland Pascal (not Delphi or C++Builder) }
+{ DELPHI any Delphi version (but not C++Builder or Kylix) }
+{ KYLIX any Kylix version (not Delphi or C++Builder for Windows) }
+{ CBUILDER any C++Builder for Windows (Pascal) }
+{ }
+{ }
+{ target platforms compiler types: }
+{ }
+{ DELPHI_16BIT 16bit Delphi (but not C++Builder!) }
+{ DELPHI_32BIT 32bit Delphi (but not C++Builder) }
+{ KYLIX_32BIT 32bit Kylix (but not C++Builder) }
+{ CBUILDER_32BIT 32bit C++Builer's Pascal (but not Delphi) }
+{ }
+{ }
+{ target cpu types }
+{ }
+{ CPU16 16bit Delphi or Borland Pascal }
+{ CPU32 32bit Delphi or Free Pascal }
+{ CPU64 64bit Free Pascal }
+{ }
+{ target platforms }
+{ }
+{ DOS any DOS (plain and DPMI) }
+{ REALMODE 16bit realmode DOS }
+{ PROTECTEDMODE 16bit DPMI DOS }
+{ }
+{ MSWINDOWS any Windows platform }
+{ WIN16 16bit Windows }
+{ WIN32 32bit Windows }
+{ WIN64 64bit Windows }
+{ DOTNET .NET }
+{ }
+{ LINUX any Linux platform }
+{ LINUX32 32bit Linux }
+{ LINUX64 64bit Linux }
+{ }
+{ DARWIN Any Mac OS X }
+{ DARWIN32 32bit Mac OS X }
+{ DARWIN64 64bit Mac OS X }
+{----------------------------------------------------------------------------}
+
+{ defines for Borland Pascal 7.0 }
+{$IFDEF VER70}
+ {$DEFINE BP}
+ {$DEFINE BP7}
+ {$DEFINE 16BIT}
+ {$DEFINE CPU16}
+
+ { defines for BP7 DOS real mode }
+ {$IFDEF MSDOS}
+ {$DEFINE DOS}
+ {$DEFINE REALMODE}
+ {$ENDIF}
+
+ { defines for BP7 DOS protected mode }
+ {$IFDEF DPMI}
+ {$DEFINE DOS}
+ {$DEFINE PROTECTEDMODE}
+ {$ENDIF}
+
+ { defines for BP7 Windows }
+ {$IFDEF WINDOWS}
+ {$DEFINE MSWINDOWS}
+ {$DEFINE WIN16}
+ {$ENDIF}
+{$ENDIF}
+
+{ defines for Delphi 1.0 thru 7.0 }
+{$IFDEF MSWINDOWS}
+
+ { defines for Delphi 1.0 }
+ {$IFDEF VER80}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI1}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI_16BIT}
+ {$DEFINE WIN16}
+ {$DEFINE 16BIT}
+ {$DEFINE CPU16}
+ {$ENDIF}
+
+ { defines for Delphi 2.0 }
+ {$IFDEF VER90}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI2}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$ENDIF}
+
+ { defines for C++Builder 1.0 }
+ {$IFDEF VER93}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER1}
+ {$DEFINE CBUILDER1UP}
+ {$ENDIF}
+
+ { defines for Delphi 3.0 }
+ {$IFDEF VER100}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI3}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$ENDIF}
+
+ { defines for C++Builder 3.0 }
+ {$IFDEF VER110}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER3}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$ENDIF}
+
+ { defines for Delphi 4.0 }
+ {$IFDEF VER120}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI4}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$ENDIF}
+
+ { defines for C++Builder 4.0 }
+ {$IFDEF VER125}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER4}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$DEFINE CBUILDER4UP}
+ {$ENDIF}
+ { defines for Delphi 5.0 }
+ {$IFDEF VER130}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI5}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$ENDIF}
+
+ { defines for C++Builder 5.0 }
+ {$IFDEF VER135}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER5}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$DEFINE CBUILDER4UP}
+ {$DEFINE CBUILDER5UP}
+ {$ENDIF}
+
+ { defines for Delphi 6.0 }
+ {$IFDEF VER140}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI6}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$ENDIF}
+
+ { defines for Delphi 7.0 }
+ {$IFDEF VER150}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI7}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$ENDIF}
+
+ { defines for Delphi 2005 }
+ {$IFDEF VER170}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI9}
+ {$DEFINE DELPHI2005}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE BDS}
+ {$DEFINE BDS3}
+ {$DEFINE BDS3UP}
+ {$ENDIF}
+
+ { defines for Delphi 2006 }
+ {$IFDEF VER180}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI10}
+ {$DEFINE DELPHI10A}
+ {$DEFINE DELPHI2006}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE BDS}
+ {$DEFINE BDS4}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$ENDIF}
+
+ { defines for Delphi 2007 }
+ {$IFDEF VER185}
+ {$UNDEF DELPHI10A} // declared in VER180
+ {$UNDEF DELPHI2006} // declared in VER180
+ {$UNDEF BDS4} // declared in VER180
+
+ {$DEFINE DELPHI10B}
+ {$DEFINE DELPHI10BUP}
+ {$DEFINE DELPHI11}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI2007}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE BDS5}
+ {$DEFINE BDS5UP}
+ {$ENDIF}
+
+ { defines for Delphi 2009 }
+ {$IFDEF VER200}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+
+ {$DEFINE DELPHI12}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI12UP}
+
+ {$DEFINE DELPHI2009}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE DELPHI2009UP}
+
+ {$DEFINE BDS}
+ {$DEFINE BDS6}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$DEFINE BDS5UP}
+ {$DEFINE BDS6UP}
+ {$ENDIF}
+
+ { defines for Delphi 2010 }
+ {$IFDEF VER210}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+
+ {$DEFINE DELPHI14}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI12UP}
+ {$DEFINE DELPHI14UP}
+
+ {$DEFINE DELPHI2010}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE DELPHI2009UP}
+ {$DEFINE DELPHI2010UP}
+
+ {$DEFINE BDS}
+ {$DEFINE BDS7}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$DEFINE BDS5UP}
+ {$DEFINE BDS6UP}
+ {$DEFINE BDS7UP}
+ {$ENDIF}
+
+
+ {$IFDEF WIN32}
+ {$DEFINE MSWINDOWS} //not automatically defined for Delphi 2 thru 5
+ {$DEFINE 32BIT}
+ {$DEFINE CPU32}
+ {$ENDIF}
+
+{$ENDIF MSWINDOWS}
+
+{ defines for "Delphi for .NET" }
+{$IFDEF CLR}
+ {$DEFINE DOTNET}
+{$ENDIF}
+
+{$IFDEF DELPHI}
+ {$IFDEF DELPHI2UP}
+ {$DEFINE DELPHI_32BIT}
+ {$ENDIF}
+{$ENDIF}
+
+{$IFDEF CBUILDER}
+ {$DEFINE CBUILDER_32BIT}
+{$ENDIF}
+
+{$IFNDEF FPC}
+
+ { Kylix 1.0 thru 3.0 }
+ {$IFDEF LINUX}
+
+ {$DEFINE VER140UP}
+
+ { Any Kylix }
+ {$DEFINE 32BIT}
+ {$DEFINE LINUX32}
+ {$DEFINE KYLIX_32BIT}
+ {$DEFINE KYLIX}
+ {$DEFINE KYLIX1UP}
+
+ {$IFDEF CONDITIONALEXPRESSIONS}
+ {$IF Declared(CompilerVersion)}
+
+ { Kylix 2.0 }
+ {$IF Declared(RTLVersion) and (RTLVersion = 14.1)}
+ {$DEFINE KYLIX2}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$IFEND}
+
+ { Kylix 3.0 - Delphi portion }
+ {$IF Declared(RTLVersion) and (RTLVersion = 14.5)}
+ {$DEFINE KYLIX3}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$DEFINE KYLIX3UP}
+ {$IFEND}
+
+ { Kylix 1.0 }
+ {$ELSE}
+ {$DEFINE KYLIX1}
+ {$IFEND}
+ {$ENDIF CONDITIONALEXPRESSIONS}
+
+ {$ENDIF LINUX}
+{$ENDIF}
+
+{ CPU }
+
+{$IFDEF FPC}
+ {$IFDEF MSWINDOWS}
+ {$IFDEF CPU64}
+ {$DEFINE WIN64}
+ {$ENDIF}
+ {$ENDIF}
+ {$IFDEF LINUX}
+ {$IFDEF CPU32}
+ {$DEFINE LINUX32}
+ {$ENDIF}
+ {$IFDEF CPU64}
+ {$DEFINE LINUX64}
+ {$ENDIF}
+ {$ENDIF}
+ {$IFDEF DARWIN}
+ {$IFDEF CPU32}
+ {$DEFINE DARWIN32}
+ {$ENDIF}
+ {$IFDEF CPU64}
+ {$DEFINE DARWIN64}
+ {$ENDIF}
+ {$ENDIF}
+{$ELSE}
+ {$DEFINE ENDIAN_LITTLE} // To have endianness symbol defined in Delphi too
+{$ENDIF}
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.dfm b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.dfm
new file mode 100644
index 0000000..27f554a
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.dfm
@@ -0,0 +1,4830 @@
+object AboutForm: TAboutForm
+ Left = 366
+ Top = 242
+ BorderIcons = []
+ BorderStyle = bsNone
+ Caption = 'About RemObjects SDK'
+ ClientHeight = 300
+ ClientWidth = 500
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWhite
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ OldCreateOrder = False
+ Position = poMainFormCenter
+ OnClick = OnCloseClick
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Image1: TImage
+ Left = 0
+ Top = 0
+ Width = 500
+ Height = 300
+ AutoSize = True
+ Picture.Data = {
+ 07544269746D6170264E0200424D264E0200000000003604000028000000F401
+ 00002C0100000100080000000000F0490200C21E0000C21E0000000100000000
+ 000000000000000080000080000000808000800000008000800080800000C0C0
+ C000C0DCC000F0CAA600000000000B0B0B00151515001B1B1B00222222002B2B
+ 2B00333333003B3B3B00037F0100434343004B4B4B00535353005B5B5B006060
+ 60006A6A6A00727272007E7E7E000A81030017850800248A0D002C8D1000328E
+ 1200359014003B91160033921D003E9318003C96250037983200439419004996
+ 1B004D981C0053991E0044972300579B20005C9C2200539C2900449D3700629F
+ 24004FA03B0065A0250068A126006CA2280073A42A007AA72D007DA82E0067A3
+ 30006BA4310077A8360074AA3F007BAA3800429F40004DA244005BA5430062A7
+ 42006AAA450076AC44006FB15B0078B1540062AF600067B0620074B567007FB6
+ 61007DBA740080A92F0084AA31008BAC330087AE3C008BAF3D0091AE350094B0
+ 370095B038009BB23900A3B53C00A9B63E0083B24E008EB349009EB6450094B5
+ 4B009BB84E008CB5520085B5590090B95D00A2B74600AEB84000A3B94B00A8B9
+ 4800B3BA4200BABC4500A4BB5400B1BF560082BA6C009ABC610082BC760091BE
+ 7100C0BE4700C1BF4800ACC05E00B4C05700BEC15100B1C25F009AC27600AFC3
+ 6900BBC56500A3C57800BBCA7700BECB7800C4C04800CBC24B00D2C44D00D6C6
+ 5000D8C75000DCC85200E2CA5400E8CC5600ECCD5800F0CF5900F4D05B00F8D1
+ 5C00CDCB6A00D6CB6400D3CD6C00CBCD7300C4CD7B00DAD27800E8CF6000E4D0
+ 6900EDD36C00F4D36500F8D46600E3D27200EBD57500E3D57C00FAD87100FAD9
+ 7A00828282008D8D8D00929292009D9D9D0081BF8000A3A3A300ABABAB00B4B4
+ B400BEBEBE0088C1830096C6890098C99200A6C98400BDCD8200BFD18D00A1CE
+ 9C00ACD09A00BBD29500B8D49E00A9D1A200B3D5A600B8D7A800BED8AA00BFDF
+ BF00C1D28D00D3D58B00C0D49700CDD59200C4D59800CCD89C00D4DB9F00F4DA
+ 8200F8DC8400F0DC8B00E3DA9000ECDD9400F0DF9500ECE09E00F5E09700FAE2
+ 9800C2D7A200C1D9AB00C8DCAE00D6DCA000DADCA100D3DDA800D8DFAA00C0DE
+ BC00D0DFB100DEE0AC00CEE1BA00D3E0B200D9E1B400D6E3BD00E9E2A600F5E6
+ AB00F9E7AC00FBE8AD00ECE5B200F5E8B500FBEBB700F3EABE00FCEBB800C4C4
+ C400CDCDCD00C1DFC000D4D4D400DCDCDC00C7E1C200D7E6C800D1E7D000D3E8
+ D000DBEAD300E2E7C200E4EBCC00E9ECCE00F7ECC000FBEDC100F2EDC800FDF0
+ CC00E1ECD500ECEDD000F0EFD100EEF0DA00F4F0D300FAF2D500F5F3DD00F8F4
+ DE00E3E3E300EDEDED00E4F0E000EBF2E300F2F5E600FDF6E000F0F7EF00FCF8
+ E900F1F2F100F4F8F000FBFAF300FFFFFF000000000000000000F0FBFF00A4A0
+ A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000010161717150E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0E11
+ 1717171717171717141311100E0C0B000000000B1617171717150E0E0E0E0E0E
+ 0E0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0C0D0E0E0E0E10171717170C00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000013
+ 171717150E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0F0E0E0E161717171717171717171717
+ 1717171713110F1417171717150F0E0F0E0F0E0E0C0D0D0D0D0D0D0D0C0D0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0D0E0F0E0E1317171717
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000D0B0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000013171717140E0E0F0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0E0E0F0E0E111717171717171717171717171717171717171717171716
+ 0F0E0F0E0E0E0E0D0D0C0D0D0C0D0D0D0D0C0D0C0D0D0C0D0D0C0D0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0C0D0E0E0F0E1317171714000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000F17160F0B00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000015171717130E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0F0E0E161617
+ 17171717171717171717171717171717171716100E0E0E0E0F0D0D0D0D0D0C0D
+ 0D0D0C0D0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0E0E
+ 0E0E0E1517171713000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000001117171717160F0B0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001717171713
+ 0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0F0E0E10101010131314151617171717
+ 171717171717100E0F0E0F0E0E0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D
+ 0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0D0C0E0E0F0E0E161717171000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000000B
+ 1117171717171717160F0B000000000000000000000000000000000000000000
+ 00000000000000000000000000000017171717100E0E0F0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0E0E0F0E0E0E0F0E0E0E0F0E0E0E0E0E0E0F10131415171717110E0E0E0E0E0E
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C
+ 0D0C0D0C0C0D0E0E0E0F0E171717170E00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000B1417171717171717171717160F
+ 0B00000000000000000000000000000000000000000000000000000000000000
+ 00000C17171717100E0F0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0F0E0E0E0F0E0E0E
+ 0F0E0F0E0F0E0E0E0F0E0E10100E0F0E0F0E0E0D0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0D0C0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0C0E0F0E0E1017
+ 1717170C00000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000C1516171717171617171717171717160F0B000000000000000000
+ 000000000000000000000000000000000000000000000C171717170F0E0E0E0F
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0E0E0E0E0F0E0E0E0F0E0E0E0F0E0E0E0F0E0E0E0E0F0E
+ 0E0E0E0E0E0E0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0D0E0E0E0F1116171717000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000C15171717171711
+ 0E111517171717171717160F0B00000000000000000000000000000000000000
+ 000000000000000000000E171717170E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0D0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E
+ 0E0E0E0F0E0E0F0E0E0E0E0F0E0E0F0E0F0E0E0E0F0E0F0E0E0E0C0D0D0D0D0C
+ 0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0C0D
+ 0C0D0F0E0E0E1317171715000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000C151717171717110E0E0F0E111517171717171717
+ 150E000000000000000000000000000000000000000000000000000000001016
+ 1717170E0E0F0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0E0E0E
+ 0E0E0E0E0E0E0F0E0E0E0E0F0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0D0E0F0E0E151717171300
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000E16
+ 17171717160F0F0E0E0E0E0E0F101617171717171717150E0000000000000000
+ 00000000000000000000000000000000000010171717150E0E0E0E0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0E0F0E0E0D
+ 0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0C0C0C0E0E0E0F0E161617171000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000E171717171716100E0E0F0E0F0E0E
+ 0E0F0E111517171717171717150E000000000000000000000000000000000000
+ 000000000B1016171717140F0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0E0D0D0E0D0E0D0E0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0D0C0D0D0D0C0D0D0D0C0D0D0D
+ 0D0C0D0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0C0C0D0C0D0C0D0C0D0C0E0F0E
+ 0E0E171717170F00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000E1717171717150F0E0E0F0E0E0E0F0E0E0E0E0E0F13161717171717
+ 1717150E0000000000000000000000000000000000000B10171717171717130E
+ 0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D
+ 0C0D0C0D0D0C0D0D0C0C0C0C0C0D0C0D0C0E0E0E0F10171717170C0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000E1717171717150F0E
+ 0F0E0E0E0F0E0E0F0E0F0E0E0E0E0F111617171717171717150E000000000000
+ 00000000000000000B0F1617171717171717130E0F0E0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C
+ 0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0C0D0C0D0C
+ 0D0C0D0C0D0F0E0E0E10171717170B0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000E1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0F0E
+ 0F0E0E0F0E131617171717171717150E00000000000000000000000F15171717
+ 1717171716100F0E0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0C0D0C0D0C0D0D0C0D0D0D0C0D0C0D0C0C0C0C0C0D0E0F0E0F131617
+ 1716000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000C1717
+ 171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0F0E0E0E0F1116171717
+ 17171717130C000000000000000C151717171717171716100F0E0E0E0F0E0E0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0D0E0E0E0E141717171300000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000C1517171717150F0E0E0E0E0F0E0E0E
+ 0E0E0E0D0E0E0E0E0F0E0E0E0F0E0E0E0F131617171717171717130C0000000B
+ 131717171717171716100F0E0E0E0F0E0E0E0F0D0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0C0C0C0C0D0C0D0C0D
+ 0E0E0F0E0E151717171100000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000C1517171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0F0E
+ 0E0E0F0E0E0E0F111617171717171717130C0F1517171717171716100F0E0E0E
+ 0F0E0E0E0F0E0E0D0E0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0D
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0D0C0D0C
+ 0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0E0E0E0F0E17171717100000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B1617171717150F0E0E
+ 0E0E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0F0E0E0E0F0E0E0E0F131717
+ 17171717171717171717171716130E0E0E0E0F0E0E0E0F0E0E0D0D0E0D0D0E0D
+ 0D0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0D0C0C0C0C0E0F0E0E0F171717170C0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000B1417171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0F0E0E0E0F0E0E0F0F13171717171717171717171714
+ 0E0E0F0E0F0E0E0E0F0E0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D0D0C0C0D0C0D0C0D0C0D0D0E0E0E0F
+ 10161717170B0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000141717
+ 171716100E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0E0E
+ 0E0F0E0E0E0E0E0F0F131717171717171715100E0F0E0E0E0E0E0F0E0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0D0D0E0D0E0D0D0D0E0D0D0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C
+ 0D0C0D0D0C0D0D0C0C0D0C0C0D0C0C0D0F0E0E0E131717171700000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001117171717160F0E0F0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0E0E0F0E0F0E0E0E0F0F13
+ 17171716130E0E0F0E0E0F0E0F0E0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D
+ 0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C
+ 0C0D0C0D0E0F0E0E141717171300000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000101617171717100E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0D0E0E0E0E0E0E0D0E0E0E0E0E0E0E0F0E0E0E0F0F13150F0E0F0E0E0E0F0E0E
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D
+ 0D0C0D0C0D0C0D0C0D0D0C0D0D0C0C0D0C0D0C0D0C0D0C0E0E0E0F0E15171717
+ 1300000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000E1717171717110E0E0E
+ 0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0E0E0E0E0F0E0E0E0E0F0E0E0E0E0E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C
+ 0D0D0C0D0C0C0C0D0C0D0C0E0E0F0E0E17171717100000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000C1517171717130E0F0E0F0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0E0E0E0F0E0F0E0E0E0F
+ 0E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0D0C0D0D0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0E
+ 0E0E0E0F171717170D0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000B151717
+ 1717140E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0E0E0D0E0E0D0E0E0D0E0E0E0E0E0E0E0F0E0E0E0E0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0C0C0C0C0F0E0F0E10171717170C000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001317171717150F0E0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0E0E0E0E0F0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C
+ 0D0C0D0C0D0C0D0E0E0E0E11171717170B000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000001017171717160F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0E0D0E0E0E0E0E0E0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0D0C0D0C0D0F0E0F0E13
+ 17171717140B0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000C1717171717100E0F0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0E0D0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0C0D0C
+ 0D0C0D0D0C0D0C0D0C0D0C0D0C0D0E0E0E0E0F131717171717160B0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000B1517171717130E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0E0D0E0E
+ 0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0C0C
+ 0C0C0E0E0F0E0E0E131717171717160D00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000131717
+ 1717140E0F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E
+ 0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0C0D0C0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0E0E0E0E0F0E0E101617
+ 171717170E000000000000000000000000000000000000000000000000000000
+ 00000000000000000C0E110E0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000F17171717160E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E
+ 0E0D0E0E0E0D0E0E0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D
+ 0C0D0C0C0C0D0C0D0C0C0C0E0E0F0E0E0F0E0F1617171717170E000000000000
+ 00000000000000000000000000000000000000000000000B0D0F141617171716
+ 0B00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000C17171717150E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0E0D0E0E0E0D
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0E0E0E0E0E0E0F0F1517171717170E0000000000000000000000000000000000
+ 000000000000000C0F1315161717171717171717130000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000001317171717110E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C
+ 0D0C0D0D0C0D0C0D0D0C0D0C0C0C0C0C0D0C0C0D0C0D0E0F0E0E0E0E0F151717
+ 171717110000000000000000000000000000000000000C0E1014171717171717
+ 1717171717171717171000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000B17171717160F0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0D0C0D
+ 0C0D0C0D0C0D0C0C0C0D0D0E0E0F0E0E0E0F1417171717171100000000000000
+ 00000000000B0D0F141517171717171717171717171717171717171717170C00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00001016171717130E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0D0C0D0C0C0C0D
+ 0E0E0F0E0E0E0F1317171717170E000000000000000C0F131516171717171717
+ 1717171717171717171615131013171717171400000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B15161717170F0F0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0D0C
+ 0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0E0E0F0E0E0E0F13171717
+ 17170E000C0E101417171717171717171717171717171717171513110F0E0E0E
+ 0E0E151717171710000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000E17171717150E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0C0C0D0C
+ 0C0D0C0D0C0D0C0D0C0C0E0E0E0F0E0E0E141717171717161717171717171717
+ 1717171717171717151411100E0E0E0F0E0F0E0F0E0E0F16171717170B000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 1317171717100E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0C0C0D0C0C0E
+ 0E0E0E0F0E0E1417171717171717171717171717171717171413100F0E0F0E0E
+ 0F0E0E0E0E0E0E0E0F0E0E111717171713000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000C16171717160E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0D0C
+ 0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0E0E0E0E0F0E0E1517171717
+ 17171717171717151410100E0E0F0E0E0E0E0E0F0E0E0F0E0F0E0F0E0E0E0F0E
+ 15171717170E0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000001117171717130E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C
+ 0C0D0C0C0D0C0D0C0D0E0E0E0E0E0F0E151717171717161413100E0E0E0F0E0E
+ 0E0E0E0F0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E101617171716000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000B1517
+ 1717160F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0C0D0C0D0D0C0D0D0C0D0C0C0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0D0E0E
+ 0F0E0E0E0F151413100F0E0E0E0E0E0F0E0E0E0F0E0F0E0E0E0E0E0F0E0E0D0D
+ 0C0C0C0D0E0F0E0E0E1317171717110000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000001016171717140E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0C0C0C0D0C0C0C0D0C0D0C0D0C0D0C0D0D0E0E0F0E0E0E0F0E0E0F0E0F
+ 0E0F0E0E0E0F0E0E0E0E0E0F0E0D0D0C0C0C0C0C0C0C0C0C0E0E0E0F0E0F1517
+ 1717170C00000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000015171717170F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D
+ 0C0C0D0C0C0C0D0C0E0E0E0E0F0E0E0E0F0E0E0E0E0E0E0F0E0E0E0E0E0D0D0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E1017171717130000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000C17171717
+ 150E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D
+ 0C0D0D0C0D0C0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0C0E0E0F
+ 0E0E0F0E0E0E0F0E0F0E0E0E0D0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0D0F0E0F0E0E14171717170E00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001317171717110E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0D0D0C0C0D0C0C0D
+ 0C0D0C0D0C0C0C0C0C0D0C0D0C0C0D0C0C0C0E0E0E0F0E0E0F0E0E0D0D0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F0F17171717
+ 1500000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000B17171717160E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0C0D0C0C0C0D0C0D0C0D0C0D0C
+ 0D0C0C0D0C0C0C0E0E0E0E0D0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0F0E0E0E0E13171717170F00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000001016171717130E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C
+ 0D0D0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0D0C0D0C0C0C0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D
+ 0F0E0F0E0F161717171600000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000B15171717160F0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C
+ 0D0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E11171717171000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000E17171717140F0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0D
+ 0C0D0D0C0D0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0C0C0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0D0F0E0F0E0E16171717150B000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000001417171717100E0F0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C
+ 0D0C0D0C0C0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0D
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E
+ 0F0E111717171711000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000C17171717150E0E0F0E0E0E0E0E0E0E0E0E0D0E0E
+ 0E0E0E0D0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0C0D0C0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0E16161717170B000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 1117171717110F0E0E0F0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D
+ 0C0D0D0C0D0C0D0C0C0D0C0D0C0C0D0C0D0C0C0C0C0D0C0D0C0C0D0C0D0C0D0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0E0F0E0F0E111717171710000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000B16171717160F0E0E0E0E0E
+ 0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0C0D0C0D0C0C
+ 0D0C0C0C0C0D0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0D0C0D0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0E
+ 1616171716000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000001016171717130E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0C0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C
+ 0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E111717171710000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000001517
+ 1717170F0E0F0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0C0D0D
+ 0C0D0C0D0C0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0D0E0E0F0E0E1616171716000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000D17171717150E0E0F0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0D0C0C0C0D0C0C0D0C0D0C0D
+ 0C0C0C0C0D0C0D0C0C0C0C0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F101717
+ 17170E0000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000001317171717100F0E0E0F0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C
+ 0D0D0C0D0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C
+ 0C0C0D0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E0E1617171715000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000C16171717
+ 160E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0E0E0E0F0E13171717170D0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001017171717130E0F0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0C0D0C0C0C0D0C0C0C0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0F1617171713
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000B15171717160F0E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0E0D0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D
+ 0C0D0C0D0C0C0D0C0C0C0D0C0D0C0C0C0C0C0C0D0C0D0C0D0C0D0C0C0C0C0D0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0E0F0E0E0E14171717170B0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000001117171717110E
+ 0E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0D0C0C0D0C0D0C0C
+ 0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E
+ 0F0E0E0F17171717100000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000B15171717160F0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E1517171716000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 1017171717110E0F0E0F0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0C0C0D0C0D0C0D0C0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0E0E0E0E0F10171717170E0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000B15171717160E0E0E0F0E0E0E
+ 0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0E0D0D0E0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0C0C0D0C0C0D0C0C0C0C
+ 0C0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0F0E0E
+ 0F16171717140000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000001017171717110E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0C0D0C0D0C0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C
+ 0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E0E0F151717171716000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000B1517171716
+ 0E0E0E0E0F0E0E0D0E0E0E0E0E0D0E0E0E0E0E0E0D0E0E0D0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0D0C0C0D0C0D0C0C0C0D0C0D0C0D0E15
+ 1415141514151415110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0E0E0F0E0F0E0F1517171717150C000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000001017171717110E0F0E0E0E0E0E0E0E0E0D0E
+ 0E0E0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0C0C0E151A9197CFE8F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3
+ CFCF939114130C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E0E0F151717171716
+ 0B00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000015171717160E0E0E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0E0D0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D
+ 0C0D0D0C0D0C0C0D0C0C0C0C0C0C0C0C0C0D0C0C0C0D0C0C0E1791CFF0F3F3F3
+ F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3D29518130C
+ 0C0C0C0C0C0C0E0E0F0E0E0F0E1517171717160C000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000E17171717110E0F0E0E0E
+ 0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0C0D0C0F1693D2F3F3F3F3F3F3F3F3F3F0CFCF9091901614141414
+ 141414131990909507D2F3F3F3F3F3F3F3F3F3F0971A130C0C0E0E0F0E0E0E0F
+ 1517171717160B00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000014171717160F0E0E0E0F0E0E0E0E0D0E0E0E0E0D0E0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E
+ 0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D
+ 0C0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C101ACFF3F3F3F3
+ F3F3F3E8CF9116140C0C0C0C0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B0B0B0F
+ 131995D0F3F3F3F3F3F3F3E893180E0E0E0F0E1517171717160C000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000C171717
+ 17130E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D
+ 0D0C0D0C0D0C0D0C0D0C0F1AD2F3F3F3F3F3F3D29316100C0C0C0C0C0C0C0C0C
+ 0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B139097E9F3F3F3
+ F3F3F096140F1517171717160B00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000011171717170F0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0C1797F3F3
+ F3F3F3F096180F0C0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0C0B0C0B0B0C
+ 0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B1392D0F3F3F3F3F3E995181717150C
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000B0C0E17171717140E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C
+ 0D0C0D0C0D0D0C0D0C0D0C0D0C0F91E8F3F3F3F3E996170D0D0D0D0D0D0D0C0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0B0C0B0C0B0C0B0B0C0B0B0B0B0B0B0B0B0B0B0B
+ 0B000B0B000B00000E19D0F3F3F3F3F3CF900C00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000B0C1010131616171717171717100E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C10
+ 96E9F3F3F3F397190E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B
+ 0C0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B000B0010
+ 92E9F3F3F3F30714000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000C0D0F
+ 131317171717171717171717171717160E0F0E0E0E0E0E0E0E0E0E0E0E0D0E0E
+ 0E0E0D0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D1096F3F3F3F3F091110E0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0C
+ 0B0B0B0B0B0B0B0B0B0B0B000B0B000B00000B0000001707F3F3F3F3D3170000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000B0C0E10131517171717171717171717171717171717
+ 171717130E0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C
+ 0D0D0C0F95F3F3F3F3E8190E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D
+ 0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B0B
+ 000B0B000B0B000B000B00001093F3F3F3F3D311000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000B0C101013161617
+ 17171717171717171717171717171717171717171614130F0E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0F91E9F3F3F3E8190E0E0E
+ 0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C
+ 0C0B0C0B0C0B0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B000B0B000B00000B000B00
+ 00000EF7F3F3F3F3070F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000C0D0F1313171717171717171717171717171717171717171717
+ 171715141311100E0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E
+ 0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C
+ 0D0C0D0C0D0C0D0D17E8F3F3F3E8190E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0B0C0B0B0B
+ 0B0B0B0B0B0B0B0B0B0B000B0B000B0B000B00000B0000000EF7F3F3F3F3910B
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000B161717171717
+ 17171717171717171717171717171717151313100F0E0E0F0E0E0E0E0F0E0E0E
+ 0E0E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D10CFF3F3F3F0
+ 190E0F0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C
+ 0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B0B00
+ 0B0B000B00000B00000B000000000E98F3F3F3E9170000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000D171717171717171717171717171717161413
+ 11100F0E0E0E0E0F0E0F0E0E0E0F0E0E0E0E0F0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0E0E0E0D0E0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0D0C0D0C0D0D0C1AF0F3F3F392100F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B
+ 0C0C0B0C0B0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B000B00000B00
+ 0000000013D3F3F3F3070D000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 001016171717171717171715141311100E0E0F0E0E0E0E0E0F0E0E0E0E0E0E0F
+ 0E0E0F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0E0E0E0F0E0E0F0E0E0E0F0E0E0E0F0E0E0E0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C10
+ CFF3F3F3D0130E0F0E0F0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B
+ 0B0B0B0B0B0B0B0B0B000B0B000B000B000B00000B0000000000F8F3F3F3E917
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000013171717161413100F0E0E
+ 0E0E0E0E0F0E0E0F0E0F0E0E0E0F0E0F0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0E0E0E0E0F0E0E0E
+ 0F0E0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C19F0F3F3F0900F0F0E0F0E0F0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B
+ 0B000B000B000B00000B00000000000E98F3F3F3960B00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000017171717130E0E0E0E0E0F0E0F0E0E0E0E0F0E0E0E0F0E
+ 0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D
+ 0D0D0D0E0D0D0E0D0E0E0E0E0E0F0E0E0E0E0F0E0E0E0F0E0E0F0E0E0E0F0E0F
+ 0E0F0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0D0C0F95F3F3F3D0130F0F0F0F0E0F0F0E0F0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B
+ 0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B
+ 000000000019F3F3F3E80F000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000C171717
+ 17100E0F0E0F0E0E0E0E0F0E0F0E0E0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0E0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0E0E0E0F
+ 0E0E0F0E0F0E0E0E0F0E0E0E0F0E0E0F0E0E0E0E0E0E0F0E0F0E0F0E0E0D0D0D
+ 0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0D10D2F3F3F3910F0F0F
+ 0F0E0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B
+ 0B0B0B0B0B0B0B0B000B0B000B0000000B000B000000000000000FD0F3F3F319
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000010161717170E0E0E0F0E0E0F0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0D0E0D0D0E0E0E0E0F0E0E0E0F0E0E0E0E0F111313151515
+ 151515141313100F0E0E0E0E0E0E0E0E0E0F0E0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0D0C0D0D0D0D0C0D15F0F3F3E8150F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C
+ 0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B
+ 000B0B000B00000B000000000000000C93F3F3F3930000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000013171717150F0E0E0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E
+ 0E0E0E0F0E0E0F0E0E0E1114151717171717171717171717171717171513100E
+ 0F0E0F0E0E0E0E0E0E0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D18F3F3
+ F398110F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C
+ 0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B00000B00000B000B00
+ 000000000017E9F3F3D00B000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000015171717130E0F0E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0E0E0F0E0E0E0F0E0F13161717
+ 1717171717171717171717171717171717171715110F0E0E0F0E0F0E0E0E0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C96F3F3F392100F0F0F0F0F0F0F0F0F0F
+ 0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B
+ 0B0B0B0B0B0B0B000B0B000B0B000B00000B00000000000000000FE8F3F3D30F
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000B16171717110E0E0E0E0E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0E0F0E0E0E0F0E0F141717171717171717171717171717171717
+ 17171717171717171716130F0E0E0E0E0F0E0E0E0C0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D96F3F3F01A100F100F0F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E
+ 0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B00
+ 0B000B000B00000B000000000000000BD0F3F3E90F0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000000C
+ 171717170F0F0E0F0E0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0F0E0E0E0F0E0F
+ 1317171717171717171717171313100F100F1013141717171717171717171716
+ 110F0E0E0E0E0F0E0E0C0D0D0D0D0C0D0D0D0C0D0D0ED2F3F3F015100F100F10
+ 0F100F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B
+ 0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B0000
+ 000000000BF7F3F3E90F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000010161717170E0E0E0E0E0F0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0E0E0E0E0F0E0E11161717171717171716110E0B00
+ 000000000000000000000C0F14171717171717171715100E0F0E0E0E0E0E0D0D
+ 0C0D0D0D0C0D0D0D0ED2F3F3F016100F100F100F100F0F0F0F0F0F0F0F0F0F0F
+ 0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B
+ 0B0B0B0B0B0B000B0B000B000B000B000B00000000000000000093F3F3F31700
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000011171717150E0F0E0F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0F
+ 0E0F0E0E0F1417171717171717130E0000000000000000000000000000000000
+ 000B101516171717171716110E0E0F0E0E0E0E0D0D0D0C0D0D0D0C0FD2F3F3D2
+ 11101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E
+ 0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C
+ 0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B
+ 0000000B00000B000000000000000091F3F3F317000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001417171714
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0F0E0E0E0E101517171717171713
+ 0C00000000000000000000000000000000000000000000000E15171717171717
+ 140E0E0F0E0E0E0E0D0D0D0C0D0D0FD2F3F3D2131010101010100F100F100F0F
+ 100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C
+ 0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B00000B0000000B000000
+ 0000000017F3F3F3110000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000017171717130E0F0E0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0E0E0E0E0F0E10161717171717150C00000000000000000000000000
+ 000000000000000000000000000010151717171717150F0E0E0F0E0E0E0C0D0D
+ 0D0CCFF3F3D31110101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F
+ 0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B
+ 0B0B0B0B0B000B0B000B000B000B000B00000000000000000017F3F3E90F0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000B17171717100E0E0F0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0E0F0E0E0E101617
+ 1717171710000000000000000000000000000000000000000000000000000000
+ 0000000B141717171717150F0E0E0E0F0E0D0D0D0D96F3F3D213101010101010
+ 101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B00
+ 0B000B00000B00000000000000001AF3F3E90F00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000C171717170F0E0F0E0E
+ 0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0E0E0E0F0E101617171717150D0000000000000000
+ 0000000000000000000000000000000000000000000000000011171717171715
+ 0F0E0E0E0E0E0D0D93F3F3F0131011101010101010101010100F100F100F100F
+ 0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E
+ 0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B
+ 0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B00000000
+ 00000093F3F3E90B000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000010161717170E0E0E0E0F0E0E0E0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0F
+ 0E0E0E0F1617171717160C000000000000000000000000000000000000000000
+ 00000000000000000000000000000E1717171717140F0E0F0E0E0E19F3F3E916
+ 11101010101010101010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F
+ 0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B
+ 0B0B0B0B000B0B000B000B000B000B00000000000000000093F3F3D00B000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000001017
+ 1717150E0F0E0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0E0E0F0E0F1517171717140B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000E1717171717130E0E0F0E16F3F3F31611101110111010101010101010
+ 1010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E
+ 0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C
+ 0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0000
+ 000B00000B0000000000000000D0F3F393000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000013171717150E0E0F0E0E0E0F0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0F0E0E0E0E1317171717160B000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000E1717171717100E
+ 0E13E9F3F3901111101110101110101010101010101010100F100F100F100F0F
+ 0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D
+ 0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C
+ 0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B00000B0000000B0000000000
+ 000BD0F3F31A0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000013171717130F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0E0E0E0F0E0F101717
+ 1717160B00000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000001016171717160E0FD2F3F39610111110111110
+ 101110101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E
+ 0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B
+ 0B0B0B000B0B000B000B000B000B000000000000000010E9F3F3110000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000017171717130E
+ 0E0F0E0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E
+ 0D0D0D0D0E0D0D0E0D0D0D0E0E0E0E0E0F15171717170E000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000013171717171393F3F3D01111111111101110111011101010101010101010
+ 10100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B00
+ 0B00000B0000000000000014F3F3E90B00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000017171717100E0F0E0E0E0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0E
+ 0F0E0F0E13171717171300000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B1517171792F3F3F014
+ 11111110111110111011101011101010101010101010100F100F100F0F0F0F0F
+ 0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E
+ 0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B
+ 0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B000000000000
+ 91F3F30700000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000C16171717100E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0E0E0E0E0F16171717150B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000D171718F0F3F31811111111111111111011101110
+ 1010101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E
+ 0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B
+ 0B0B000B0B000B000B000B000B0000000000000000D0F3F31900000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000111314131314131314131314100F100F0C0C0B0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000C171717170F0F0E0E0E0E
+ 0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D
+ 0D0E0D0D0E0D0E0F0E0F0E13171717170E000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 1317D0F3F3931111111111111111111110111011101110101010101010101010
+ 100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C
+ 0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0000000B
+ 00000B0000000000000EE9F3F30F000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000B17171717
+ 17171717171717171717171717171717151310100C0B00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000C171717170E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0E0E0E0E0F16
+ 1717171500000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000C93F3F3D213111111111111
+ 111111111110111011101110101010101010101010100F100F100F0F100F0F0F
+ 0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D
+ 0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C
+ 0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B00000B0000000B000000000014F3
+ F3D0000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000001017171717171717171717171717171717
+ 171717171717171717171713100E0C0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000101617
+ 17170E0F0E0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0E0E0F0E0E11171717170E0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000BF0F3F31711111111111111111111111111101110111010
+ 11101010101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E
+ 0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C
+ 0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B
+ 0B000B0B000B000B000B000B0000000000000096F3F31A000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000001617171717171717171717171717171717171717171717171717171717
+ 1717171713000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000010171717160E0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0D0E0E0E0F0E1517171715000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000096F3F393
+ 1311131111111111111111111111111011101110101010101010101010101010
+ 0F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B00
+ 000B00000000000CE9F3E90E0000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000E171717171413111313
+ 131514151514171717171717171717171717171717171717170B000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000010161717150E0F0E0E0E0E0E0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0E0E0F0E0E0F171717171000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000011F3F3D313111311131111111111111111
+ 1111111110111011101110101010101010101010100F100F100F100F0F0F0F0F
+ 0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D
+ 0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B
+ 0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B0000000019F3F398
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000013171717160E0E0F0E0E0E0E0F0E0E0E0E0E0E101011
+ 131415171717171717171717170D000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000010171717150E0E
+ 0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E
+ 0D0D0D0D0E0D0D0E0D0E0E0E0F11171717170B00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000D3F3F31913111313111311111111111111111111111110111011101110
+ 101010101010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F
+ 0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D
+ 0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B
+ 000B0B000B000B000B000B00000000000007F3F3110000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000B1717
+ 1717130F0E0E0E0F0E0E0E0E0F0E0F0E0E0E0F0E0E0E0E0E0F10131515171717
+ 1710000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000013171717150E0F0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0E0F0E0E
+ 0E14171717150000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000019F3F397131313111311
+ 131113111111111111111111111110111011101011101010101010101010100F
+ 100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C
+ 0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0000000B0000
+ 0B0000000010F3F3D30000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000010171717170F0E0E0F0E0E0F0E0F0E
+ 0E0E0E0F0E0E0E0E0F0E0F0E0E0F0E0E0E151717171300000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0013171717150E0E0E0F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0E0F0E0E1717171710000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000BF0F3F014131313111313111311111111111111111111
+ 11111110111011101010101010101010101010100F100F100F100F0F0F0F0F0F
+ 0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D
+ 0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B
+ 0B0B0B0B0B0B0B0B0B0B000B0B000B0B00000B0000000B00000093F3F3170000
+ 00000C0000000000000000000000000000000000000000000000000000000000
+ 000000000016171717140E0F0E0E0E0F0E0E0E0E0F0E0E0E0F0E0F0E0E0E0E0E
+ 0F0E0E0F0E131717171600000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000013171717140E0F0E0E0E0E
+ 0F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E
+ 0D0D0E0D0E0F0E0E0F171717170E000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000001AF3F3
+ F713131313131113131113111311111111111111111111111011101110111010
+ 1010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E
+ 0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C
+ 0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B00
+ 0B0B000B000B000B000B000000000CE9F3E90B000C1317150C00000000000000
+ 0000000000000000000000000000000000000000000000000E17171717110E0E
+ 0E0F0E0D0E0E0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0F0E0E10171717170B00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000013171717130E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0D0E0D0D0E0E0E0E0F10171717
+ 170C000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000BF0F3E8151313131313111311131311
+ 1113111111111111111111111110111011101110101010101010101010100F10
+ 0F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B
+ 0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B00000B
+ 000000F8F3F3921417171717160B000000000000000000000000000000000000
+ 00000000000000000000000013171717160E0F0E0E0E0E0D0D0D0D0D0D0D0E0D
+ 0E0D0E0D0E0E0E0E0E0E0E0E0F0F171717170D00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000131717
+ 17130E0F0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0E0D0D0E0D0E0E0F0E0E11171717170000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000001AF3F391131313131313131313111311131111111111111111111111
+ 111110111011101011101010101010101010100F100F100F0F0F0F0F0F0F0F0F
+ 0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D
+ 0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B
+ 0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B000CE9F3F01817171717
+ 17160C000000000000000000000000000000000000000000000000000000000B
+ 17171717130E0E0F0E0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0D0D0D0D0E0E0E0F
+ 0E0E171717171000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000013171717130E0E0E0F0E0F0E0E0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0D0E0D0D0D0E
+ 0E0E0E0F13161717160000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000BF0F3E81313131313
+ 1313131311131311131113111111111111111111111111101110111010101010
+ 10101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B
+ 0B000B000B000B000B000000F8F3F396171717171717160B0000000000000000
+ 0000000000000000000000000000000000000011171717170F0F0E0E0E0E0E0D
+ 0D0E0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0E0E0E0E0F14171717130000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000013171717130E0F0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0E0D0D0E0D0E0D0D0E0D0E0D0E0F0E0E1317171713000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000001AF3F3911313131313131313131313111313111311
+ 13111111111111111111111110111011101110101010101010101010100F100F
+ 100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B
+ 0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0000000B00000B00
+ 0CE9F3E917171617171717170E00000000000000000000000000000000000000
+ 0000000000000B15171717150E0E0E0F0E0D0D0E0D0D0D0D0E0D0D0E0D0D0D0E
+ 0D0D0D0D0D0E0E0F0E0E13171717150000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000001417171716130F
+ 0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0E0E0E0E0F1117171713000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000000D3
+ F3F0141314131313131313131313131113131113111111111111111111111111
+ 1110111011101110101010101010101010100F100F100F0F100F0F0F0F0F0F0F
+ 0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D
+ 0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B
+ 0B0B0B0B0B0B0B0B000B0B000B0B00000B0000000090F3F3910F0F1617171717
+ 170E0000000000000000000000000000000000000000000000000E1717171711
+ 0E0F0E0E0E0E0D0D0E0D0E0D0D0E0D0D0D0E0D0D0D0D0D0E0D0E0E0E0E0F1116
+ 1717170B00000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000001717171717171714100E0E0E0F0E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0D0E0E0F0E0E
+ 1317171713000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000017F3F39513141313131313131313
+ 1313131311131311131113111111111111111111111110111011101011101010
+ 101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C
+ 0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B
+ 000B000B000B000B000CF3F3D20E0E0F1517171717170E000000000000000000
+ 000000000000000000000000000014171717160E0F0E0E0E0E0D0D0E0D0D0D0E
+ 0D0D0E0D0E0D0D0E0D0E0D0D0D0D0E0F0E0E0F171717170C0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0016171717171717171715110E0E0E0F0E0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0E0E0E0F111717171300000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000D0F3F31514131413141313131313131313131311131113111311
+ 111111111111111111111110111011101010101010101010101010100F100F10
+ 0F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D
+ 0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C
+ 0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B000000F7F3
+ F3160E0E0F1517171717170F0000000000000000000000000000000000000000
+ 000C17171717130E0E0E0F0E0D0E0D0D0E0D0E0D0E0D0D0E0D0D0D0D0D0D0D0D
+ 0D0E0E0E0E0F0E17171717100000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000B0E151717171717171717
+ 16130F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0E0D0D0E0E0F0E0E131717171600000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000FF3F398131413
+ 1413131413131313131313131313131113111311131111111111111111111111
+ 10111011101110101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F
+ 0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B
+ 0B0B0B0B0B0B0B000B0B000B000B000B000010F3F3960F0E0E0F151717171717
+ 11000000000000000000000000000000000000000011171717170F0E0F0E0E0E
+ 0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D0E0F0E0E0E1517171713
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000E13171717171717171716140F0E0F0E0E0F0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0E0E0E0E0F11171717
+ 1700000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000093F3F318141413141314131313131313131313
+ 1313131113131111131111111111111111111111111011101110111010101010
+ 1010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E
+ 0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B00
+ 0B000B000B0000D0F3F3100E0E0E0F1417171717171100000000000000000000
+ 00000000000000000B15171717150E0E0E0F0E0D0E0D0D0E0D0D0E0D0E0D0D0E
+ 0D0D0E0D0E0D0D0D0D0D0E0E0E0F0E1417171714000000000000000000000000
+ 000000000000000000000000000000000000000B0B0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000C1117171717171717171714100E0E0E0E0E0E0F0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0D0E0D0E0D0D0D0D0F0E0E0E10171717170C00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00E9F3E814141414131413141314131313131313131313131113131111131111
+ 1111111111111111111110111011101011101010101010101010100F100F100F
+ 0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E
+ 0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B
+ 0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B00000B000B17F3F3190F
+ 0E0E0E0F1317171717171100000000000000000000000000000000000E171717
+ 17100F0E0E0E0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0E0D0D0E
+ 0F0E0E1117171717000000000000000000000000000000000000000000000000
+ 0000000000000E16150F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000B10161717171717
+ 17171715110F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0D0E0D0E0D
+ 0E0F0E0E0F171717170D00000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000014F3F3931414131414131413
+ 1413131313131313131313131311131311111311111111111111111111111110
+ 111011101010101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F
+ 0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D
+ 0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B
+ 0B0B0B0B0B0B000B0B000B0B000B000CE9F3D20E0F0E0E0E0F13171717171713
+ 0B00000000000000000000000000000014171717160E0E0F0E0E0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0E0E0E0E0F10171717170C000000
+ 0000000000000000000000000000000000000000000000000B13171717171300
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000B0E15171717171717171715130F0E0E0E0E
+ 0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0E0D0E0E0E0F0E0E16171717100000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000093F3F3171414141414131414131413141313131313131313
+ 1313111313111311131111111111111111111111101110111011101010101010
+ 10101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E
+ 0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C
+ 0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B
+ 00000B00F7F3F3110E0F0E0E0E0F131717171717140B00000000000000000000
+ 0000000C17171717130E0E0E0F0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D
+ 0E0D0D0D0D0D0D0E0F0E0E0E171717170F000000000000000000000000000000
+ 00000000000000000000001017171717171717160C0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000E13171717171717171716140F0E0F0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D
+ 0E0D0D0D0D0D0D0D0E0E0E0E0F14171717140000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000E9F3CF14
+ 1414141414141314131413131413131313131313131313111313111311111111
+ 11111111111111111110111011101110101010101010101010100F100F100F0F
+ 100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D
+ 0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C
+ 0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B000B15F3F3900E0E0F0E
+ 0E0E0F111717171717140B00000000000000000000000011171717170F0E0F0E
+ 0E0E0D0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0E0E0E0F0E
+ 15171717110000000000000000000000000000000000000000000000000C1417
+ 1717171717171717171000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000C11161717
+ 17171717171714100E0E0E0E0F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0E0D0E0D0F0E0E
+ 0E11171717170B00000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000014F3F39114141414141414141413141314
+ 1313131313131313131313131113131113111311111111111111111111111011
+ 1011101011101010101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F
+ 0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D
+ 0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B
+ 0B0B0B0B0B000B0B000B00000BE9F3CF0E0E0E0F0E0E0E0F101717171717140B
+ 000000000000000000000B15171717140E0F0E0E0E0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0E0E0E0E0E141717171400000000000000
+ 0000000000000000000000000000000B1017171717171717171717171717130B
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000B1015171717171717171716110E0E
+ 0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0E0D0D0E0D0E0D0E0D0E0F0E0F0F171717170F0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000093F3F31714141414141414141413141413141314131313131313131313
+ 1311131113111311111111111111111111111110111011101010101010101010
+ 101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B
+ 00F7F3F30F0E0E0E0F0E0E0E0F101717171717160B0000000000000C0E101417
+ 171717100F0E0E0F0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0E0D0D0D
+ 0D0D0D0E0E0F0E0E131717171700000000000000000000000000000000000000
+ 00000D16171717171717150F10161617171717160B0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000B0E15171717171717171716130F0E0E0E0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D
+ 0D0D0D0D0E0E0E0E0E0E15171717150000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000E9F3D3151414141414
+ 1414141414131413141313131313131313131313131313111311131113111111
+ 111111111111111110111011101110101010101010101010100F100F100F100F
+ 0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E
+ 0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B
+ 0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0017F3F3190E0E0E0E0F0E0E
+ 0E0F101717171717160B000C0F131617171717171717160E0E0E0F0E0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0E0E0F0E10171717
+ 170C0000000000000000000000000000000000000B1317171717171716110E0F
+ 0E0F141717171717170E00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000D13
+ 171717171717171717140F0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E0E0F0E0E1117
+ 1717170D00000000000000000000000000000000000000000000000000000000
+ 000000000000000000000FF3F395151414141414141414141414141314131413
+ 1413131313131313131313111313111113111111111111111111111111101110
+ 11101110101010101010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F
+ 0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D
+ 0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B
+ 0B0B0B0B000B0B000B0CF3F3960E0E0E0E0E0E0F0E0E0E101617171717161517
+ 17171717171717171717130E0F0E0E0E0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E
+ 0D0D0D0D0E0D0D0D0D0D0D0D0F0E0E0E0F161717170E00000000000000000000
+ 000000000000001015171717171717140F0F0E0E0E0E0E111717171717171100
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000C1116171717171717171715
+ 100E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0E0D0E0D0E0E0E0F0E0F16171717130000000000000000
+ 00000000000000000000000000000000000000000000000000000000000019F3
+ F319141415141414141414141414141314141314131413131313131313131313
+ 1113131111131111111111111111111111111011101110101110101010101010
+ 1010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E
+ 0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C
+ 0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000BD0F3
+ E80E0E0E0D0E0E0E0E0F0E0E0F16171717171717171717171717171717170F0E
+ 0E0E0F0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0E0E0F0E0E16171717100000000000000000000000000000000C141717171717
+ 1716100E0E0E0E0F0E0F0E0E10161717171717130B0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000B101517171717171717160E0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0E0F0E0E0E14171717170D00000000000000000000000000000000000000
+ 00000000000000000000000000000000000096F3F01514151414141414141414
+ 1414141413141314131313131313131313131313131113131111131111111111
+ 1111111111111110111011101010101010101010101010100F100F100F100F0F
+ 0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E
+ 0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C
+ 0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B0090F3F3110E0E0E0D0E0E0E0E0F0E
+ 0E101617171717171717171717151413100F0F0E0F0E0E0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0E0E0E0E0F14171717150E0B
+ 00000000000000000000000B1017171717171717130F0E0F0E0F0E0E0E0E0F0E
+ 0E0F151717171717140B00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0B0E151717171717170E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E
+ 0E0E0D0E0E0E0E0D0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0E0D0E0D0E0D0E0E0E0F0E0F17171717
+ 150B000000000000000000000000000000000000000000000000000000000000
+ 000000000000E9F3CF1514151415141414141414141414141414131413141314
+ 1313131313131313131311131311131113111111111111111111111110111011
+ 101110101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E
+ 0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D
+ 0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B
+ 0B0B0B000B0B13F3F3190E0E0E0D0E0E0E0E0E0F0E0E0F161717171717151310
+ 0F0E0E0E0F0E0E0E0E0E0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0E
+ 0D0D0D0D0D0D0D0D0E0E0F0E0E13171717171715110C00000000000000000D16
+ 171717171717150F0E0E0E0E0E0E0E0E0F0E0E0E0F0E0E141717171717150B00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000D13171717170F0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E0E0E0D0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0D0D0E0D0E0D0E0D0E0D0E0E0E0E0E13171717171000000000000000000000
+ 000000000000000000000000000000000000000000000000000FF3F396141514
+ 1514151414141414141414141414131413141313141313131313131313131311
+ 1313111311111111111111111111111111101110111011101010101010101010
+ 10100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0B0C0C0B0C0B0C0B0C0B0F0B0B0B0B0B0B0B0B0B0B000B0BF3F3960E0D
+ 0E0E0D0E0E0E0E0E0E0F0E0F151514100F0E0E0E0E0F0E0E0E0F0E0F0E0E0E0D
+ 0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E
+ 0F101617171717171717140E000000000B1317171717171716110E0F0E0F0E0F
+ 0E0F0D0D0D0E0F0E0E0E0F0E111717171717160B000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000C17171717100E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0E0E
+ 0E0F0E0F0E16171717170C000000000000000000000000000000000000000000
+ 0000000000000000000000000017F3F31A151514151414151414141414141414
+ 1414141413141314131313131313131313131313111313111311131111111111
+ 11111111111110111011101011101010101010101010100F100F100F0F0F0F0F
+ 0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D
+ 0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0D
+ 95970B0B0B0B0B0B0B0B0B0B0B000BD0F3D20E0E0D0E0E0D0E0E0E0F0E0E0E0E
+ 0E0F0E0E0E0E0F0E0E0E0F0E0E0E0E0E0F0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0F0E0E0E0F15171717171717171717
+ 150E0B0E16171717171717140F0F0E0E0E0E0E0E0E0D0D0C0D0C0E0E0F0E0E0E
+ 0F101617171717160C0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0017171717110F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0E0D0D0E0E0E0E0E0F1017171717160B
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0091F3F315151514151514151414141414171414141414141314141314131413
+ 1313131313131313131113111311131111111111111111111111111011101110
+ 1010101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E
+ 0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0DD2F3F00B0B0B0B0B0B0B0B0B0B
+ 0B0B0092F3F30E0E0E0D0E0E0D0E0E0E0E0F0E0F0E0E0E0F0E0E0E0F0E0E0E0F
+ 0E0F0E0E0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0E0D0D0D0D0D
+ 0D0D0D0D0D0E0E0F0E0E0E0F131616171717171717171717171717171716100E
+ 0E0E0E0F0E0F0E0E0C0D0C0D0D0C0D0E0E0E0F0E0E0E101617171717150C0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000014171717130E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0D0E
+ 0D0E0D0E0D0E0D0D0E0E0F0E0E0E1417171717140B0000000000000000000000
+ 00000000000000000000000000000000000000000007F3D31515151514151415
+ 1415141414D29815141414141413141314131314131313131313131313131311
+ 1311131113111111111111111111111110111011101110101010101010101010
+ 100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C
+ 0B0C0C0B0C11E8F3F3F3110B0B0B0B0B0B0B0B0B0B0B0B19F3F3160D0E0E0D0E
+ 0E0D0E0E0E0E0E0E0E0F0E0E0F0E0E0E0F0E0E0E0E0D0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0F0E0E
+ 0E0E1114171717171717171717171717130F0E0F0E0F0E0E0E0E0D0C0D0D0C0D
+ 0C0D0C0D0D0E0E0E0F0E0E0F1617171717160B00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000013171717150E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E
+ 0E0E0E0D0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0D0D0D0D0D0E0D0E0E0E0E
+ 0F0E0F1517171717140B00000000000000000000000000000000000000000000
+ 000000000000000000E9F3D015151415151514151415141514F3F3F090141414
+ 1414141314131413131313131313131313131311131311111311111111111111
+ 111111111110111011101110101010101010101010100F100F100F0F100F0F0F
+ 0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D
+ 0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B11F0F3F3F3F31A0B
+ 0C0B0B0B0B0B0B0B0B0B0B13F3F3190E0E0D0E0E0D0E0E0D0E0E0F0E0E0E0F0E
+ 0E0E0E0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D
+ 0D0D0D0E0D0D0D0D0D0D0D0D0D0E0E0F0E0E0E0F0E0E0E0E0F13161717171717
+ 1717150F0E0E0E0E0E0E0E0E0D0D0D0D0D0C0D0D0C0D0D0C0D0D0E0F0E0E0F0E
+ 101617171717160B000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000101617
+ 17160E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0E0D0D0E0D0E0D0E0D0E0D0D0D0E0E0E0E0E0E101617171717140B00
+ 000000000000000000000000000000000000000000000000000000000BF3F396
+ 15151515151514151514151419F3F3F3F3CF1514141414131414131413141313
+ 1313131313131313111313111113111111111111111111111111101110111010
+ 11101010101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E
+ 0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C
+ 0D0C0C0C0C0C0C0C0C0C0B17F0F3F39FF3F3950B0B0B0B0B0B0B0B0B0B0B0B0B
+ F3F3910E0D0E0E0D0E0E0D0E0E0D0E0F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0E0E0E0F0E0E0F0E0F0E0E0E0F111617171716130E0F0E0F0E0F0E0F0D0D
+ 0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0E0E0F0E0E0E0F1517171717160B000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000D171717170F0E0E0E0F0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E0D
+ 0E0D0D0E0D0D0E0E0F0E0E0E101717171717160B000000000000000000000000
+ 0000000000000000000000000000000011F3F391151515151515151415141415
+ 91F3F3F3F3F3F090141414141314131413131413131313131313131313111313
+ 1111131111111111111111111111111011101110101010101010101010101010
+ 0F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C18F3
+ F3F39A02A7F3CF0B0C0B0C0B0B0B0B0B0B0B0B0BD3F3CF0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0E0E0E
+ 0F0E0E0F0E1316150F0E0E0E0E0E0E0E0E0D0D0D0D0C0D0D0C0D0C0D0C0D0D0C
+ 0D0D0C0D0E0E0E0F0E0E0F1517171717160B0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000B17171717100F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0E0D0E0E0E0F0E0E
+ 0E111717171717170F0000000000000000000000000000000000000000000000
+ 0000000017F3F31A15151515151515151514151495F3F370E3F3F3F3CF151414
+ 1414131413141313131313131313131313131113131113111311111111111111
+ 1111111110111011101110101010101010101010100F100F100F100F0F0F0F0F
+ 0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D
+ 0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C18F3F3F34402129FF3F30C0B0B0B0B
+ 0B0B0B0B0B0B0B0B07F3CF0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0F0E0E0E0F0E0E0E0E0E0E0F0E0F
+ 0E0F0E0E0C0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0C0C0D0E0E0E0E0F0E0F
+ 1617171717160000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000016171717130E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0E0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0E0F0E0E0E11161717171717130C00
+ 0000000000000000000000000000000000000000000000001AF3F31515151515
+ 1515151515141515D2F3EC605DAEF3F3F3F09014141413141413141314131313
+ 1313131313131311131311131111111111111111111111111110111011101110
+ 101010101010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F
+ 0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D
+ 0C0C0C0C18F3F3F34412121294F3F30F0C0B0C0B0C0B0B0B0B0B0B0B95F3F30E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0E0E0F0E0E0E0F0E0F0E0E0E0E0E0E0E0D0C0D0D0D0D0D0C0D0D
+ 0C0D0C0D0D0C0D0C0D0C0D0C0C0D0E0E0F0E0E0E0F1617171717140B00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000013171717150E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0E0E0E0F0E0E0E1016171717171717110B0000000000000000000000
+ 00000000000000000000000096F3F315151515151515151515151415D2F3DB60
+ 5D5D70E3F3F3F3CF151414131413141313131313131313131313131311131311
+ 131113111111111111111111111110111011101011101010101010101010100F
+ 100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C19F3F3F34412121212
+ 3CF3F3140C0B0B0C0B0B0B0B0B0B0B0B90F3F30E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0F0E
+ 0E0E0E0F0E0F0E0E0D0D0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C
+ 0D0C0D0E0E0E0F0E0E101617171717140B000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000010161717170E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0E0D0D0E0D0E0E0E0F0E0E0E
+ 0F1417171717171717110C0000000000000000000000000000000000000B0E14
+ D2F3D216151515151515151515151514F3F3C16060605D5DAEF3F3F3F0901414
+ 1413141314131413131313131313131313111311131113111111111111111111
+ 11111110111011101010101010101010101010100F100F100F100F0F0F0F0F0F
+ 0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D
+ 0D0D0D0D0D0D0D0C0C0D18F3F3F3441B1212121225F3F3180B0C0B0B0C0B0B0B
+ 0B0B0B0B18F3F3150E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0F0E0E0E0E0E0E0D0D0D0C0D
+ 0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0C0E0E0E0F0E0E0F16
+ 171717170F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000C17171717100E0F0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0E0E0F0E0E0F0E13171717171717171715
+ 100D0000000000000000000000000B0E13151717D2F3D2151615151515151515
+ 15151515F3F3BC606060605D5D70E3F3F3F3CF15141413141314131413131313
+ 1313131313131311131113111311111111111111111111111011101110111010
+ 1010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E
+ 0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C19F3F3
+ F3441B1B121B121212F3F3910B0C0B0C0B0C0B0C0B0B0B0B14F3F3150E0E0D0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0D0E0D0D0E
+ 0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0E0F0E0E0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D
+ 0C0D0D0C0D0C0D0C0D0C0D0C0D0E0E0E0E0F0E15171717170B00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000B16171717110E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0E0D0E0D0E0E0F0E0E0E0E0F151717171717171717171714130F100F100F1010
+ 1316171717171717F1F3D015151615151515151515151519F3F3A96160606060
+ 5D5D53AEF3F3F3F0901414131413141313131313131313131313131113131111
+ 1311111111111111111111111110111011101110101010101010101010100F10
+ 0F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D15F3F3F3441B1B1B121B121212F3F391
+ 0B0C0C0B0B0B0C0B0B0B0B0B14F3F3150E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0E0D0D0D0E0D0D0E0D0D0D0D0E0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E
+ 0C0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0C0D0C0D0C
+ 0C0E0E0F0E0E1017171717110000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000E17
+ 171717140F0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0E0E0E0F0E0E0E
+ 0E101517171717171717171717171717171717171717171717171717F3F39616
+ 15161515151515151515151AF3F3836161606060605D5D536BDBF3F3F3CF1514
+ 1314131413141313131313131313131311131311111311111111111111111111
+ 111110111011101011101010101010101010100F100F100F0F0F0F0F0F0F0F0F
+ 0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D
+ 0D0D0D13F0F3F3451B1B1B1B1B121B1212D6F3CF0C0B0C0B0C0B0B0C0B0B0B0B
+ 11F3F3900E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E
+ 0D0E0D0D0E0D0D0E0D0E0D0D0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D
+ 0C0D0D0C0D0D0C0D0D0C0D0D0C0C0D0C0C0D0C0D0C0E0E0E0E0F14171717170B
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000E1717171717150E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0D0D0D0D0D0E0E0E0E0F0E0F0E0E0E101417171717171717
+ 17171717171717171717171717171715F3F3961615161516151515151515151A
+ F3F383616161606060605D5D5353ABF2F3F3F091141413141313131313131313
+ 1313131313111313111113111111111111111111111111101110111010101010
+ 10101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D11E9F3F3451B1B1B1B1B
+ 1B1B121B12A7F3CF0C0C0B0C0C0B0C0B0C0B0C0B0BF3F3910E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C0D
+ 0C0D0C0D0C0C0C0D0D0F0E0F0E0F171717171100000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000E1717171717150F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D
+ 0D0D0D0E0E0E0E0E0E0F0E0E0E0F101417171717171717171717171717171717
+ 1613100FF3F3961615161516151515151515151AF3F38368616161606060605D
+ 5D53536BDBF3F3F3D21614131413141313131313131313131313111313111311
+ 13111111111111111111111110111011101110101010101010101010100F100F
+ 100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0D0E0D0E0D0D0D0D0D0FD2F3F39F1C1B1B1B1B1B1B1B1B121BA7F3CF0C0C0B0C
+ 0B0C0B0C0B0B0B0B0BF3F3910E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0D0D0E0D0D0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D
+ 0D0C0D0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0D0C0C0C0D0C0D0C0D0E0E0E0E
+ 0E14171717170B00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000E1717171717150F0E
+ 0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0D0D0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0E0E0F0E0E0E0F
+ 0E0E0F0E0E10111315151717171716151413100F0E0F0E0EF3F3961616151615
+ 1615161515151593F3F3806868616161606060605D5D535353ABF2F3F3F09313
+ 1413141314131313131313131313131113131113111111111111111111111111
+ 1110111011101110101010101010101010100F100F100F0F100F0F0F0F0F0F0F
+ 0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D97F3F3
+ A31B1B1C1B1B1B1B1B1B1B1B12D1F3CF0C0C0C0B0C0C0B0B0C0B0C0B0BF3F391
+ 0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C
+ 0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0D0E0F0E0F0F1717171713000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000E1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0D0E0D0D0D0D0D0E0E0E0F0E0E0E0F0E0E0E0F0E0E0E0E0E0E
+ 0E0E0E0F0E0E0F0E0E0E0E0FF3F39615161615161516151515151596F3F36869
+ 6868616161606060605D5D53535363DBF3F3F3D0171413141313131313131313
+ 1313131311131311131113111111111111111111111110111011101011101010
+ 101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E93F3F3D61D1C1B1C1B1B1B1B1B1B1B1B
+ 1BA7F3CF0C0C0C0C0B0C0C0B0C0B0B0C0BF3F3910E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0C0D
+ 0C0D0C0E0E0E0E0E14171717170C000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000E1717
+ 171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D
+ 0D0D0D0D0E0E0E0F0E0E0E0F0E0E0E0F0E0F0E0F0E0F0E0E0E0F0E0E0F0E0E0E
+ F3F39616161615161615161516151596F3F37474686868616161606060605D5D
+ 53535352ABF2F3F3F09514131413141313131313131313131311131113111311
+ 111111111111111111111110111011101010101010101010101010100F100F10
+ 0F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D
+ 0E0D0E19F3F3EE1D1C1C1B1C1B1C1B1B1B1B1B1B1BD1F3CF0C0C0C0C0C0B0C0C
+ 0B0C0B0B0CF3F3910E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D
+ 0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0C0D0C0C0C0C0D0F0E0F0E0F16171717
+ 1300000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000E1717171717150F0E0E0E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0E0E0E0E0E
+ 0F0E0E0E0F0E0E0E0E0E0E0F0E0E0E0F0E0E0F0EF3F396161616161516151615
+ 15151596F3F3747474696868616161606060605D5D535353525FD9F3F3F3D318
+ 1314131313131313131313131313131113111311131111111111111111111111
+ 10111011101110101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F
+ 0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E14E9F3F32E1C1C1C1C1B
+ 1C1B1C1B1B1B1B1B1BD1F3CF0C0C0C0C0B0C0C0B0C0B0C0B0BF3F3910E0E0D0E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E
+ 0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C
+ 0D0C0C0D0C0D0C0D0C0D0E0E0E0E0E13171717170E0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000E1717171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0D0D0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0E0D0E0E0F0E0E0E0E0F0E0F0E0E0E
+ 0F0E0E0E0E0E0D0DF3F39616161616161516151615161593F3F3827474746968
+ 68616161606060605D5D535353535273F2F3F3F3951314131413131313131313
+ 1313131113131111131111111111111111111111111011101110111010101010
+ 1010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E
+ 0E0E0E0E0E0E0E0E0E0FD2F3F3461C1C1C1C1C1C1B1C1B1C1B1B1B1B1BD1F3CF
+ 0C0C0C0C0C0C0C0B0C0C0B0C0BF3F3910E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0C0D0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0C0D0D0D0C0D0C0D0C0D0C0D0E0E
+ 0F0E0F1617171715000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000E1717171717150F0E0E
+ 0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0E0E0E0E0E0E0E0E0E0E0E0D0E0D0D0D0D0DF3F39616
+ 161616161615161615161590F3F38575747474686868616161606060605D5D53
+ 535352525FD9F3F3F3E819141314131313131313131313131113131111131111
+ 1111111111111111111110111011101011101010101010101010100F100F100F
+ 0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E96F3F3
+ A31C1C1C1C1C1C1C1C1B1C1B1C1B1B1B1BD1F3CF0C0C0C0C0C0C0B0C0C0B0C0B
+ 0CF3F3910E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0E0E0E0E0F11171717170E00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000E1717171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DF3F3961616161616161615161515161A
+ F3F3857575747474696868616161606060605D5D53535352525270ECF3F3F396
+ 1513131313131313131313131311131311111311111111111111111111111110
+ 111011101010101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F
+ 0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E19F3F3D71E1C1C1C1C1C1C1C1C1C1B1C
+ 1B1C1B1B1BD1F3CF0C0C0C0C0C0C0C0C0C0B0C0C0BF3F3910E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0C0C
+ 0C0C0C0C0D0E0F0E0E0E16161717150000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000E171717
+ 1717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0E0D0D0D0D
+ 0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0DF3F39616161616161616161516161590F3F385757575747474696868
+ 616161606060605D5D5353535252525FBDF3F3F3F09014131313131313131313
+ 1313111313111311131111111111111111111111101791939393181010101010
+ 10101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E
+ 0E0E0E14F0F3EE2E1D1C1D1C1C1C1C1C1C1C1C1B1C1B1C1B1BD7F3CF0C0C0C0C
+ 0C0C0C0C0B0C0C0B13F3F31A0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0E0E0E0F0E111717
+ 1717100000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000E1717171717150F0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D
+ 0E0D0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DF0F3D01616161616
+ 1616161615161590F3F3B275757575747474696868616161606060605D5D5353
+ 53535252516DE3F3F3F3D2161413131313131313131313111313111311111111
+ 1111111111111596F0F3F3F3F3F3F3F0971410101010101010100F100F100F0F
+ 100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E10D2F3F3461D1C1D1C1C
+ 1C1C1C1C1C1C1B1C1B1C1B1C1BF3F3930C0C0C0C0C0C0C0C0C0C0C0B14F3F315
+ 0E0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D
+ 0D0D0E0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0D0C0D
+ 0D0C0D0C0D0C0D0C0D0C0D0C0E0F0E0E0E16171717150B000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000E1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0E0D0D0E0D0E0D0D0E0D0D
+ 0E0D0D0D0E0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0DCFF3D216161616161616161616151615F3F3C676
+ 76757575747474696868616161606060605D5D5353535252525251ADF2F3F3F0
+ 9513131313131313131313131113131113111311111111111597F3F3F3F3F3F3
+ F3F3F3F3F3F395131010101010100F10100F100F0F0F0F0F0F0F0F0F0F0F0F0F
+ 0F0E0F0E0F0E0E0F0E0E93F3F3A31D1D1C1D1C1D1C1C1C1C1C1C1C1C1C1B1C1B
+ 1BF3F3910C0C0C0C0C0C0C0C0C0C0B0C14F3F3150E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0E
+ 0E0E0E0F10171717171000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000E1717171717150F0E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ CFF3D217161616161616161616161516F3F3CA76767575757574747469686861
+ 6161606060605D5D535353535252515262DAF3F3F3D319131313131313131313
+ 131113111311131111111493F0F3F3F3D5713A2F2F3A6ED5F3F3F3D315101010
+ 1010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F18F3F3
+ EA221D1D1D1C1D1C1D1C1C1C1C1C1C1C1C1C1B1C25F3F31A0C0D0C0C0C0C0C0C
+ 0C0C0C0C18F3F3150E0E0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E
+ 0D0D0E0D0D0E0D0D0D0E0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0D0E0F0E0E0E1517171716000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000E1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D
+ 0E0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D96F3F3161716161616161616
+ 16161615D3F3E477767676757575747474696868616161606060605D5D535353
+ 52525252515172F2F3F3F398151313131313131313131311131113111318E8F3
+ F3F3D55B323231312F2F2C2C5AE0F3F3F016101010101010100F100F100F100F
+ 0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E10F0F3F3301D1D1D1D1D1C1D1C1D1C1C
+ 1C1C1C1C1C1C1C1B3DF3F3150D0C0D0C0C0C0C0C0C0C0C0C90F3F30E0D0E0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D
+ 0E0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C
+ 0D0C0D0C0D0C0E0E0E0F0E101717171711000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000E17171717
+ 17150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D
+ 0E0D0D0E0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D91F3F317161716161616161616161616D2F3EF7776767676
+ 757575747474696868616161606060605D5D5353535352525251515CBDF3F3F3
+ F0921313131313131313131113131114CFF3F3F3F171333333323231312F2F2F
+ 2C37B9F3F3F016101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F
+ 0F0E0F0ED0F3F3661D1D1D1D1D1D1D1C1D1C1D1C1C1C1C1C1C1C1C1C99F3F310
+ 0D0C0C0D0C0C0C0C0C0C0C0C93F3F30D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0E0F0E0E0E15
+ 171717170B000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000E1717171717150F0E0E0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D1AF3F31A
+ 17161716161616161616161696F3F37777777676757575757474746968686161
+ 61606060605D5D535353525252525151516ADAF3F3F3E8191313131313131313
+ 111392F0F3F3F3B83B3434333333323231312F2F2C2C2CB9F3F3E81310101010
+ 10100F10100F100F0F100F0F0F0F0F0F0F0F0F0F0F0E0F92F3F3D41E1E1D1D1D
+ 1D1D1D1D1C1D1C1D1C1C1C1C1C1C1C1B9BF3F30D0C0D0D0C0D0C0C0C0C0C0C0C
+ 07F3D20E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D
+ 0C0D0D0C0D0C0D0C0C0D0C0D0C0E0E0E0E0F0F17171717110000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000E1717171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D15F3F390171716171616161616161616
+ 92F3F38D787777767676757575747474696868616161606060605D5D53535352
+ 525252515151519DF2F3F3F3D01913131313131319D3F3F3F3E0653434343433
+ 333333323231312F2F2F2C2CB9F3F3D0101010101010100F10100F100F0F0F0F
+ 0F0F0F0F0F0F0F0F0E0F15F3F3EE231E1D1E1D1D1D1D1D1D1D1C1D1C1D1C1C1C
+ 1C1C1C1CD1F3D20D0D0C0D0C0C0D0C0C0C0C0C0CE8F3CF0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E
+ 0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0C0D0C0D0C0D0D0C0D0C0C0C0C
+ 0C0E0F0E0E0E14171717170B0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000E1717171717150F0E0E0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0E
+ 0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D10F3F39716171716171616161616161690F3F3B57878777776767575
+ 7575747474696868616161606060605D5D535353525252525151515156ADF3F3
+ F3F3CF19131692D3F3F3F3F1AA3535353434343433333333323231312F2F2C2C
+ 2CD5F3F393101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F10E8F3
+ F3421E1E1E1E1D1E1D1D1D1D1D1D1C1D1C1D1C1C1C1C1C1CF3F3960D0D0D0C0D
+ 0D0C0D0C0C0C0C0CF3F3910E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0D0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0D0E0E0F0E0F171717171300
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000E1717171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DF3F30717171717
+ 161716161616161616F3F3CD7978787777767676757575747474696868616161
+ 606060605D5D53535352525252515151515062C5F3F3F3F3F3F3F3F3F3F3C04C
+ 36363535343434343434333333323231312F2F2F2C37F1F3F318101010101010
+ 10100F100F100F100F0F0F0F0F0F0F0F0F96F3F39F1F1E1E1E1E1E1D1D1D1D1D
+ 1D1D1D1C1D1C1D1C1C1C1C2EF3F31A0D0D0D0D0C0D0C0C0D0C0C0C15F3F3190E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C
+ 0D0D0C0D0C0D0C0D0E0F0E0E0E14171717170C00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000E1717171717
+ 150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D
+ 0E0D0E0D0E0D0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0DCFF3E817171717171617161616161616D2F3EF
+ 797978787777767675757575747474696868616161606060605D5D5353535252
+ 52525151515150516FDAF3F3F3F3F3EBAC574A49493636353535343434343333
+ 3333323231312F2F2C2C5AF3F3E81310101010101010100F100F100F100F0F0F
+ 0F0F0F0F1AF3F3D81F1F1E1E1E1E1E1E1D1E1D1D1D1D1D1D1C1D1C1D1C1C1C48
+ F3F3150D0D0D0D0D0C0D0D0C0D0C0C18F3F3150E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0D0E0E0E0F
+ 0E17171717170C00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000E1717171717150F0E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0E0D0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D93F3F31717171717171617161616161697F3F3877979787877777676767575
+ 75747474696868616161606060605D5D535353525252525151515150504F5E9E
+ AC9E624B4A4A4A4A494936363535343434343433333333323231312F2F2F2CA2
+ F3F3931010101010101010100F100F100F0F100F0F0F0F13F0F3EE3E1F1F1F1F
+ 1E1E1E1E1E1D1E1D1D1D1D1D1D1C1D1C1D1C1CA3F3F30D0D0D0D0D0D0D0C0D0C
+ 0C0D0C93F3F30E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0D0C
+ 0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0D0F0E0E0E0E1317171717130000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0E1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D19F3F39017171717171716
+ 171616161691F3F3B37A79797878777776767575757574747469686861616160
+ 6060605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A494936
+ 363535353434343434333333323231312F2F2C37EBF3F3161010101010101010
+ 100F100F100F0F0F0F0F0FD2F3F3642020201F1F1F1E1E1E1E1E1D1D1D1D1D1D
+ 1D1D1C1D1C1D1CEEF3CF0D0D0D0D0D0D0D0D0C0D0D0C0DCFF3D20E0E0D0E0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D
+ 0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D
+ 0C0D0C0C0E0E0F0E0E0E15171717170F00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000E1717171717150F0E0E0F0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D
+ 0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D13F3F39517171717171717161716161618F3F3CD7A7979
+ 7978787777767676757575747474696868616161606060605D5D535353525252
+ 525151515150504F4E4E4E4B4B4B4A4A4A4A4949363635353434343434333333
+ 33323231312F2F2F5AF3F3D0101010101010101010100F100F100F100F0F95F3
+ F3BF20211F201F1F1F1F1E1E1E1E1E1D1E1D1D1D1D1D1D1C1D1C2EF3F3920D0D
+ 0D0D0D0D0D0D0D0C0D0C0CF3F3960E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0E0E0F0E0E1017
+ 171717150B000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000B1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DF3F3
+ D017171717171717171617161716D2F3F27A7A7A797978787777767675757575
+ 747474696868616161606060605D5D535353525252525151515150504F4E4E4E
+ 4B4B4B4B4A4A4A494936363535353434343433333333323231312F2F2CA2F3F3
+ 91101010101010101010100F100F100F1018F3F3EA2A2121202020201F1F1F1E
+ 1E1E1E1E1D1E1D1D1D1D1D1D1C1D48F3F3140E0D0D0D0D0D0D0D0D0D0C0D15F3
+ F3F80E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0E0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0E0E0F0E0E13171717171100000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001517171717
+ 0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0E0D0E0D0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DCFF3F11717171717171717171617
+ 161695F3F38C7A7A7A7979787877777676767575757474746968686161616060
+ 60605D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A49493636
+ 3535343434343434333333323231312F2F38F1F3F01310101010101010101010
+ 0F100F1013F0F3F33F232121212020201F1F1F1F1E1E1E1E1E1D1D1D1D1D1D1D
+ 1D1CD7F3E80E0D0E0D0D0D0D0D0D0D0D0D0C91F3F3140D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0C0D0C0D0C0D0D0C0D0C0C0C0C0C0D0C
+ 0C0D0E0E0E0E0F0E16161717170C000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000F17171717100E0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E
+ 0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0E0D0D
+ 0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D91F3F39017171717171717171716171619F3F3CB7B7A7A7A7979
+ 78787777767675757575747474696868616161606060605D5D53535352525252
+ 5151515150504F4E4E4E4B4B4B4B4A4A4A494936363535353434343433333333
+ 323231312F2F6EF3F30710101010101010101010100F1011D2F3F36E23232121
+ 2121202020201F1F1F1E1E1E1E1E1D1E1D1D1D1D1D24F3F3960E0D0E0D0E0D0D
+ 0D0D0D0D0D0DCFF3F00E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0D0C0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0E0F0E0E0E10171717
+ 1713000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000B15171717140F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D13F3F3951817
+ 1717171717171717161716E8F3EF7A7B7A7A7A79797878777776767575757574
+ 7474696868616161606060605D5D535353525252525151515150504F4E4E4E4B
+ 4B4B4A4A4A4A494936363535343434343433333333323231312F2FD5F3F39010
+ 101010101010101010100F97F3F3A52326232321212121202020201F1F1F1E1E
+ 1E1E1E1D1E1D1D1D1D48F3F3180D0E0E0D0E0D0D0D0D0D0D0D0FF3F3960D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C
+ 0C0D0C0D0C0C0C0C0D0C0D0D0E0E0F0E0E15171717170C000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000011171717170F0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DF0F3D21717171717171717171717161795
+ F3F3B17B7B7A7A7A797978787777767676757575747474696868616161606060
+ 605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A4949363635
+ 35353434343434333333323231312F3AF1F3F0151010101010101010101091F3
+ F3D82D2623262323212121212020201F1F1F1F1E1E1E1E1E1D1D1D1D1DEAF3F0
+ 0E0E0D0E0D0E0D0E0D0D0D0D0D17F3F3190E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C0C0D
+ 0E0E0E0E0F0F1617171715000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000C16171717130E0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0E
+ 0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D96F3F31818171717171717171717171619F3F3DC7C7B7A7A7A7A797978
+ 787777767675757575747474696868616161606060605D5D5353535252525251
+ 51515150504F4E4E4E4B4B4B4A4A4A4A49493636353534343434343333333332
+ 3231312F9CF3F3D31310101010101010101AF3F3F14026262626232323212121
+ 21202020201F1F1F1E1E1E1E1E1D1E1D3EF3F3930E0E0E0E0D0E0D0E0D0D0D0D
+ 0D96F3F3110E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D
+ 0D0C0D0D0C0D0C0C0D0C0C0C0D0C0D0C0C0D0C0C0D0E0F0E0E0E141717171717
+ 1717171717151313140F100F0F0C0C0C0B000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0013171717160F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0E0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D19F3F3931718171717
+ 1717171717171716D2F3F3887C7B7B7A7A7A7979787877777676767575757474
+ 74696868616161606060605D5D535353525252525151515150504F4E4E4E4B4B
+ 4B4B4A4A4A494936363535353434343433333333323231312FC2F3F307101110
+ 101010101AF3F3F343272727262626262323212121212020201F1F1F1F1E1E1E
+ 1E1E1D1EA3F3F3110E0E0E0E0E0D0E0D0E0D0D0D0DF0F3D20E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0E0E0E0F0E0F1617171717171717171717171717171717
+ 1717171717171717131413130000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000E17171717130E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D
+ 0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0FF3F3D01717181717171717171717171793F3F3C7
+ 7B7B7B7B7A7A7A79797878777776767575757574747469686861616160606060
+ 5D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A494936363535
+ 3434343434343333333232313138E0F3F3D0131010101397F3F3F36727272727
+ 2626262623232321212121202020201F1F1F1E1E1E1E1E22F3F3CF0E0E0E0E0E
+ 0E0D0E0D0E0D0E0D17F3F3900E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C0D0C0E0E
+ 0E0E0E1317171717171717171717171717171717171717171717171717171717
+ 0D00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000015171717160E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 97F3F31917171817171717171717171716E9F3F27C7C7B7B7B7A7A7A79797878
+ 7777767676757575747474696868616161606060605D5D535353525252525151
+ 515150504F4E4E4E4B4B4B4B4A4A4A4949363635353534343434333333333232
+ 313138E0F3F3F0969395F0F3F3F1672828282827272726262626232321212121
+ 2020201F1F1F1F1E1E1E1E9AF3F3190E0E0E0E0E0E0E0E0D0E0D0E0D96F3F311
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C
+ 0D0D0C0C0C0D0C0D0C0D0C0C0D0C0D0C0C0D0D0F0E0F0E0F1617171717171717
+ 1717171717171717171717171717171717171717110000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000F17
+ 171717110E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0E0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D19F3F3931817171817171717
+ 171717171796F3F3B67C7C7C7B7A7A7A7A797978787777767675757575747474
+ 696868616161606060605D5D535353525252525151515150504F4E4E4E4B4B4B
+ 4A4A4A4A4949363635353434343434333333333232313138D5F3F3F3F3F3F3F3
+ E041292828282827272727262626232323212121212020201F1F1F1F1E1E24EE
+ F3E80E0E0E0E0E0E0E0E0E0E0D0E0D0EE9F3D20E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D
+ 0D0C0D0D0D0C0D0D0D0D0D0C0D0D0C0D0C0D0C0D0C0C0D0C0D0C0C0D0C0D0C0D
+ 0C0C0D0C0D0C0D0E0E0E0E0E0E0E0E0F10101010131313141514151717171717
+ 1717171717171717160000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000B15171717160E0E0E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E
+ 0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0E0D0D0D
+ 0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0FE9F3E81718171718171717171717171718F0F3EF7D7C7C
+ 7C7B7B7A7A7A797978787777767676757575747474696868616161606060605D
+ 5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A49493636353535
+ 3434343434333333323231312F6EE0F3F3F3E06E292B29292928282827272727
+ 262626232323212121212020201F1F1F1F1E9AF3F3920E0F0E0E0E0E0E0E0E0E
+ 0D0E0D19F3F3900E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0C0D0D0C0D0C0D0D0C0D0C0C0D0C0C0D0C0D0C0D0C0D0C0C0D0C0D0F0E0F0E
+ 0F0E0E0E0E0E0E0F0E0E0E0E0E0F0E0E0E0E0F101010131313171717170D0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000001016171717110E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D96F3F3
+ 901718171718171717171717171796F3F3B67D7C7C7C7B7A7A7A7A7979787877
+ 77767675757575747474696868616161606060605D5D53535352525252515151
+ 5150504F4E4E4E4B4B4B4A4A4A4A494936363535343434343433333333323231
+ 31312F2C2C2C2C2B2B2B29292929282828272727272626262323232121212120
+ 20201F1F1F24EEF3F0100E0E0E0E0E0E0E0E0E0E0E0E0ECFF3F30F0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E
+ 0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0C0D
+ 0C0C0D0C0C0D0C0C0C0D0C0D0C0C0C0C0E0E0E0E0E0F0E0F0E0F0E0E0E0F0E0F
+ 0E0E0E0F0E0E0E0E0E0E0E0F0E16171717110000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000B15171717
+ 160E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D15F3F3CF1817181717181717171717
+ 171718F1F3EF897D7C7C7B7B7B7A7A7A79797878777776767675757574747469
+ 6868616161606060605D5D535353525252525151515150504F4E4E4E4B4B4B4B
+ 4A4A4A494936363535353434343433333333323231312F2F2F2C2C2C2B2B2B29
+ 29292928282827272727262626232323212121212020201F1F9AF3F3920F0E0E
+ 0F0E0E0E0E0E0E0E0E0E11F3F3960E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D
+ 0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0D
+ 0C0D0C0C0E0E0F0E0E0E0E0E0E0E0E0F0E0E0E0E0E0F0E0E0F0E0F0E0F0E0E0E
+ 0E14171717150000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001016171717110E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0DE8F3F0191718171817171817171717171797F3F3C77D7D7C7C7B
+ 7B7B7A7A7A797978787777767675757575747474696868616161606060605D5D
+ 535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A4949363635353434
+ 34343434333333323231312F2F2C2C2C2C2B2B2B292929292828282727272726
+ 2626232323212121212020202AEEF3F0100F0E0F0E0E0E0E0E0E0E0E0E0E93F3
+ F3150E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0E0D0D0D0E0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0D0C0C0C0C0E0D0E0E0E0E0E
+ 0F0E0E0E0F0E0F0E0E0E0F0E0E0E0E0E0E0F0E0F0E10171717170C0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000B15171717160E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D19F3F3961817
+ 181717181717171717171718F1F3F2897D7D7C7C7C7B7A7A7A7A797978787777
+ 767676757575747474696868616161606060605D5D5353535252525251515151
+ 50504F4E4E4E4B4B4B4B4A4A4A49493636353535343434343333333332323131
+ 2F2F2F2C2C2C2B2B2B2929292928282827272727262626232323212121212020
+ A4F3F31A0E0F0E0E0F0E0F0E0E0E0E0E0E0FF0F3E80E0D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0D0C0D0D0C0C0D0C0D0C0C0C0D
+ 0C0D0C0D0C0C0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0D0C0D0C0E0D0D0E0E
+ 0E0E0E0F0E0E0E0E0E0F17171717100000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000001016171717110E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0FE9F3E91817181718171718171717171717
+ 95F3F3DD7E7D7D7C7C7C7B7B7A7A7A7979787877777676757575757474746968
+ 68616161606060605D5D535353525252525151515150504F4E4E4E4B4B4B4A4A
+ 4A4A494936363535343434343433333333323231312F2F2C2C2C2C2B2B2B2929
+ 292928282827272727262626232323212121213EF3F3E80F0E0F0F0E0E0F0E0E
+ 0E0E0E0E0E92F3F3190E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D
+ 0D0C0D0D0C0D0C0D0D0C0D0C0D0C0C0C0D0C0D0C0D0C0C0D0C0D0C0D0C0C0C0D
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0E0E1417
+ 1717140000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000B15171717160F0E0E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D91F3F3931817181718171718171717171717E8F3F3AF7E7D7D7C7C7C7B
+ 7A7A7A7A797978787777767676757575747474696868616161606060605D5D53
+ 5353525252525151515150504F4E4E4E4B4B4B4B4A4A4A494936363535353434
+ 343434333333323231312F2F2F2C2C2C2B2B2B29292929282828272727272626
+ 26232323212121D8F3F3170F0F0E0F0E0F0E0F0E0F0E0E0E0EE8F3F00F0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0D0C
+ 0C0D0C0D0C0D0C0C0C0D0C0D0C0C0D0C0D0C0C0C0C0D0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0F11171717170B0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00001016171717130E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0EF3F3E91818171817
+ 18171718171717171791F3F3EF8A7E7D7D7C7C7B7B7B7A7A7A79797878777776
+ 7675757575747474696868616161606060605D5D535353525252525151515150
+ 504F4E4E4E4B4B4B4A4A4A4A494936363535343434343433333333323231312F
+ 2F2C2C2C2C2B2B2B2929292928282827272727262626232323219AF3F3980F0E
+ 0F0F0F0E0F0E0E0F0E0E0E0E19F3F3910E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0E0E0E0E0F171717170E0000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B15161717160F0E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E
+ 0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D96F3F393181718171817181717181717171797F3
+ F3CC7E7E7D7D7C7C7C7B7A7A7A7A797978787777767676757575747474696868
+ 616161606060605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A
+ 4A494936363535353434343433333333323231312F2F2F2C2C2C2B2B2B292929
+ 292828282727272726262623233FF3F3F0110F0F0F0E0F0F0E0F0F0E0F0E0F0E
+ E8F3F00F0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0D0E0E0E0E0E0E0F0E0E0E0E0E0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C
+ 0D0C0D0C0D0D0C0D0C0D0C0C0C0C0D0C0C0C0C0C0D0C0D0C0D0C0C0C0C0D0C0D
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0E0E1617171711
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000E17171717140E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 10F3F3E9181817181817171817171718171718E9F3F3B07E7E7D7D7C7C7B7B7B
+ 7A7A7A797978787777767675757575747474696868616161606060605D5D5353
+ 53525252525151515150504F4E4E4E4B4B4B4A4A4A4A49493636353534343434
+ 3434333333323231312F2F2C2C2C2C2B2B2B2929292928282827272727262626
+ 23D8F3F3180F0F0F0F0F0F0F0E0F0E0F0E0F0E92F3F3910E0E0E0D0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0E0F0E
+ 0E0E0F0E0E0E0F0E0F0E0E0E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0C0C0C0D0C
+ 0D0C0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0E0E0E0F0E1417171715000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 1417171717100F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0E0D0E0E0D0E0E0D0E0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C91F3F39618181718171817
+ 1817171717171791F3F3F28A7E7E7D7D7C7C7B7B7B7A7A7A7979787877777676
+ 76757575747474696868616161606060605D5D53535352525252515151515050
+ 4F4E4E4E4B4B4B4B4A4A4A494936363535353434343433333333323231312F2F
+ 2F2C2C2C2B2B2B29292929282828272727272626A0F3F3980F0F0F0F0F0F0F0E
+ 0F0F0E0F0E0E10F0F3F00F0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0E0E0E0E0F0E0E0F0E0E0F0E0E0E0E0E0E0F0E
+ 0E0E0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D
+ 0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C
+ 0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E
+ 0E0E0E11171717170B0000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000C17171717150E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0F0E0F0E
+ 0E0E0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0EF0F3F119181718181718171817181717171797F3F3E5
+ 7F7E7E7D7D7C7C7B7B7B7A7A7A79797878777776767575757574747469686861
+ 6161606060605D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A
+ 494936363535343434343433333333323231312F2F2C2C2C2C2B2B2B29292929
+ 2828282727272747F3F3F0110F0F0F0F0F0F0F0F0F0F0E0F0E0F92F3F3910E0E
+ 0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0E0E0F0E0E0E0F0E0E0E0E0F0E0F0E0F0E0E0E0F0E0F0E0E0E0E0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0D0C
+ 0D0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0C0C0D0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0F0E0F0E0F171717170D000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000001317171717110F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0E0E0E0F0E0F0E0F0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D91F3
+ F398181817181817181717171817171717E8F3F3CC7F7E7E7D7D7C7C7C7B7A7A
+ 7A7A797978787777767676757575747474696868616161606060605D5D535353
+ 525252525151515150504F4E4E4E4B4B4B4B4A4A4A4949363635353534343434
+ 34333333323231312F2F2F2C2C2C2B2B2B29292929282828272740F1F3F3170F
+ 0F0F0F0F0F0F0F0F0F0E0F0F0E13F3F3E80F0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0E0F0E0E0E0E0F0E0E0E0F0E10
+ 10111110100F0E0F0E0E0E0F0E0F0E0E0F0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0C0D0C0D0C0C0C0C0D0C0C
+ 0C0C0D0C0D0C0C0C0C0C0C0D0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0E0E0E0E0E1617171710000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000B1617
+ 1717160F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E
+ 0E0E0F0E0F0E0F0E0E0E0E0E0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0DE8F3F390181817181718171817
+ 171817171718F1F3F3B77F7E7E7D7D7C7C7C7B7B7A7A7A797978787777767675
+ 757575747474696868616161606060605D5D535353525252525151515150504F
+ 4E4E4E4B4B4B4A4A4A4A494936363535343434343433333333323231312F2F2C
+ 2C2C2C2B2B2B292929292828282DD8F3F3910F0F100F0F0F0F0F0F0F0F0F0F0F
+ 0ED0F3F3190E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0E0D
+ 0D0E0D0D0E0E0E0E0E0F0E0F0E0E0F13141617171717171717171715110F0E0E
+ 0E0E0E0F0E0E0E0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D
+ 0C0D0C0D0C0D0C0D0D0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0C
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E
+ 1517171713000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000001016171717140E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0F0E0E0F0E0E0E0E0E10111415150F0E
+ 0F0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0E0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C17F3F3D317181818181718171817171817171791F3F3F38F7F
+ 7E7E7D7D7C7C7C7B7A7A7A7A7979787877777676767575757474746968686161
+ 61606060605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A49
+ 4936363535353434343433333333323231312F2F2F2C2C2C2B2B2B2929292928
+ 28D8F3F3970F100F0F0F0F0F0F0F0F0F0F0F0F0E18F3F3CF0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0E0E0F0E0E0E0E0E
+ 10151717171717171717171717171717171715110F0E0E0E0E0F0E0E0E0C0D0D
+ 0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0D0C0C0D0C0D0C0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E131717171700000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000001517171717100E0E0F0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0F
+ 0E0E0F0E0E0E0F0E0F111315171717171717150F0E0E0F0E0E0E0E0E0D0E0E0D
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0DCFF3F396
+ 18181718181718171817171817171793F3F3F28F7F7E7E7D7D7C7C7C7B7B7A7A
+ 7A797978787777767675757575747474696868616161606060605D5D53535352
+ 5252525151515150504F4E4E4E4B4B4B4A4A4A4A494936363535343434343434
+ 333333323231312F2F2C2C2C2C2B2B2B29292929A5F3F3D21110100F100F0F0F
+ 0F0F0F0F0F0F0F10F0F3F3140E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0E0E0F0E0E0F0E1016171717171717171717171717
+ 171717171717171715110F0E0E0E0E0F0E0E0D0D0D0D0C0D0D0D0D0C0D0D0D0D
+ 0C0D0D0D0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D
+ 0C0D0C0C0C0C0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0D0E0E0E0E10171717170C000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000C17171717
+ 160F0E0E0E0E0E0E0F0E0F0E0E0E0E0E0F0E0E0E0E0F0E0E1013141616171717
+ 17171717171717150F0E0E0E0F0E0E0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D
+ 0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D10F0F3F01A1818171818171817181717
+ 1817171798F3F3F28F7F7E7E7D7D7C7C7C7B7A7A7A7A79797878777776767675
+ 7575747474696868616161606060605D5D535353525252525151515150504F4E
+ 4E4E4B4B4B4B4A4A4A494936363535353434343433333333323231312F2F2F2C
+ 2C2C2B2B2B2929A6F3F3E8130F100F100F100F100F0F0F0F0F0F0F95F3F3910E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0F
+ 0E0E0E0F0E141717171717171717171717171717171717171717171717171510
+ 0E0F0E0E0E0E0E0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0D
+ 0C0D0D0C0C0D0C0C0C0C0C0C0C0D0C0C0C0D0C0C0D0C0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0F0E0F0E0F171717
+ 170D000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001017171717140F0E0F0E0F0E0E0E0E0F
+ 0E0F0E0E0E0F0E101113151717171717171717171717171717171717150F0E0E
+ 0E0E0E0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0D1AF3F3D318181817181817181718171718171717CFF3F3ED8A7F7E
+ 7E7D7D7C7C7C7B7B7A7A7A797978787777767675757575747474696868616161
+ 606060605D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A4949
+ 36363535343434343433333333323231312F2F2C2C2C2C2B2B2BA6F3F3F01610
+ 10100F100F100F0F0F0F0F0F0F0F18F3F3E80F0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0E0E0E0E0E0F0E101617171717171717
+ 15100D0C000000000C0D0F141717171717171717110E0E0F0E0E0E0E0C0D0D0D
+ 0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0D0C0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E161717171000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000B1516171717100E0E0E0E0E0F0E0E0E0E0E0F111314171717171717
+ 1717171717171717171717151717171717150F0E0F0E0E0F0E0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0CCFF3F3961818
+ 1817181817181718171718171717CFF3F3ED8E7F7E7E7D7D7C7C7C7B7A7A7A7A
+ 797978787777767676757575747474696868616161606060605D5D5353535252
+ 52525151515150504F4E4E4E4B4B4B4B4A4A4A49493636353535343434343433
+ 3333323231312F2F2F2C2C2C2BB9F3F3F0161010100F10100F100F100F0F0F0F
+ 0F11F0F3F3150E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0E0E0E0F0E0E0E1117171717171717110C000000000000000000000000
+ 0B1015171717171717140E0E0F0E0E0E0E0C0D0D0D0D0C0D0D0D0D0C0D0D0D0D
+ 0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0D0C0C0D0C0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0E0E0F0E0E151717171300000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000D17171717160F
+ 0E0F0E0E0E0F10131416171717171717171717171717171717171613100C0000
+ 0E1717171717150F0E0E0F0E0E0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0D0D10F0F3F39018181818171818171817181717
+ 181717CFF3F3F28F7F7E7E7D7D7C7C7C7B7B7A7A7A7979787877777676757575
+ 75747474696868616161606060605D5D535353525252525151515150504F4E4E
+ 4E4B4B4B4A4A4A4A494936363535343434343433333333323231312F2F2C2C2C
+ B9F3F3F0161010101010100F10100F100F100F0F0FD0F3F3910E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0D0E0E0F0E0E0F111617
+ 17171717110B000000000000000000000000000000000B0F161717171717140E
+ 0E0F0E0E0E0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C0C
+ 0D0C0C0D0C0D0C0D0C0C0D0C0D0C0C0D0C0C0C0D0C0C0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E14171717130000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000001117171717140E0F11141517171717171717
+ 1717171717171717171713100E0B000000000000000E1717171717150F0E0E0E
+ 0F0E0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0C0D19F3F3E81918181718181718171817171817171717CFF3F3F28F7F7E7E
+ 7D7D7C7C7C7B7A7A7A7A79797878777776767675757574747469686861616160
+ 6060605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A494936
+ 363535353434343433333333323231312F2F2FB9F3F3F0161010101010101010
+ 0F10100F100F100F91F3F3D20D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0E0E0E0E0E0F101717171717150C0000000000000000
+ 0000000000000000000000000B141717171717140E0E0F0E0E0E0D0D0D0D0C0D
+ 0D0D0C0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0D0C0C0C0C0C0D0C0D0C0C
+ 0C0D0C0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0D0E0F0E0E13171717170000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000B1516171717171717171717171717171717171717171715110F0C000000
+ 000000000000000000000E171717171715100E0E0E0E0E0E0E0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0D0C0D96F3F3D018181818
+ 18171818171817171817171717CFF3F3F2B77F7E7E7D7D7C7C7C7B7B7A7A7A79
+ 7978787777767675757575747474696868616161606060605D5D535353525252
+ 525151515150504F4E4E4E4B4B4B4A4A4A4A4949363635353434343434343333
+ 333232313138E0F3F3F016101010101010101010100F10100F0F1017F3F3F011
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0E0F
+ 0E0F0E101717171717130B000000000000000000000000000000000000000000
+ 0000111717171717110F0E0E0F0E0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0C
+ 0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E
+ 0F10161717170B00000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000C1717171717171717
+ 17171717171717171613100C000000000000000000000000000000000000000E
+ 171717171716100E0F0E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0D0C0FD2F3F396181817181817181718171817181718
+ 1717CFF3F3F3C97F7E7E7D7D7C7C7C7B7A7A7A7A797978787777767676757575
+ 747474696868616161606060605D5D535353525252525151515150504F4E4E4E
+ 4B4B4B4B4A4A4A494936363535353434343433333333323254EBF3F3E8161110
+ 101010101010101010100F10100F14F0F3F3170E0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0E0E0E0E0F161717171711000000
+ 0000000000000000000000000000000000000000000000111717171717100E0E
+ 0E0E0E0D0D0D0D0D0C0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0C0D0C0D0C0C0D0C0D0C0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0F0E0E0E10171717170C0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000010171717171717171717171714100E0B00000000
+ 00000000000000000000000000000000000000000E171717171716110E0E0E0E
+ 0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C13F0F3F392181818181817181817181717181717171793F3F3F3DF8A7E7E7D
+ 7D7C7C7C7B7B7A7A7A7979787877777676757575757474746968686161616060
+ 60605D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A49493636
+ 353534343434343333333371F1F3F3D31311101110111010101010101010100F
+ 1011D2F3F3930E0D0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0E0F0E0F0E15171717171300000000000000000000000000000000
+ 0000000000000000000000001117171717160E0F0E0F0E0E0C0D0D0D0D0C0D0D
+ 0D0D0D0C0D0C0D0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0D0E0F0E0E0E171717170D0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0014171717171715130F0C000000000000000000000000000000000000000000
+ 0000000000000000000C151717171717110F0E0E0E0E0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D17F3F3F1901818181818
+ 17181817181717181717171792F1F3F3EF8F7E7E7D7D7C7C7C7B7A7A7A7A7979
+ 78787777767676757575747474696868616161606060605D5D53535352525252
+ 5151515150504F4E4E4E4B4B4B4B4A4A4A49493636353535343434343439BAF3
+ F3F39713111011101110101010101010101010100F97F3F3CF0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E0E0E0E0E101717
+ 1717150B00000000000000000000000000000000000000000000000000000000
+ 001317171717130E0E0E0E0E0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D
+ 0D0C0D0C0C0C0C0C0C0C0D0C0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0F0E0E1717
+ 1717100000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000C1513100D0B0000000000
+ 0000000000000000000000000000000000000000000000000000000000000C15
+ 1717171717110F0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D91F3F3F01918181718181718171817181718171817
+ 17F8E8F3F3F3C87E7E7D7D7C7C7C7B7B7A7A7A79797878777776767575757574
+ 7474696868616161606060605D5D535353525252525151515150504F4E4E4E4B
+ 4B4B4A4A4A4A4949363635353434343459E0F3F3F39211101111101110111010
+ 101010101010101097F3F3D20F0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0E0D0D0E0D0E0E0F0E0F0E16171717170B000000000000000000
+ 0000000000000000000000000000000000000000000B15171717160F0F0E0E0F
+ 0D0D0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C0C0D
+ 0C0D0C0D0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0E0E0E0F0E0E0E0F0E1517171710000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000B1417171717110E0E0E0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 96F3F3E819181818181817181817181717181717171718CFF3F3F3ED8F7E7D7D
+ 7C7C7C7B7A7A7A7A797978787777767676757575747474696868616161606060
+ 605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A4949363635
+ 353534A1F3F3F3E81711111111101110111011101110101010101091F3F3F014
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E
+ 0E0E0E0E11171717171000000000000000000000000000000000000000000000
+ 000000000000000000000E17171717130E0F0E0E0E0D0D0C0D0D0D0C0D0D0C0D
+ 0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F
+ 0E0E0F0E0F111717171713000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000C17171717100F0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E
+ 0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0CCFF3F3E819181818181817
+ 18181718171718171717171792F1F3F3F3C8897D7D7C7C7B7B7B7A7A7A797978
+ 787777767675757575747474696868616161606060605D5D5353535252525251
+ 51515150504F4E4E4E4B4B4B4A4A4A4A494936363565EBF3F3F3971411111111
+ 11111110111011101010101010101AF3F3F0140D0E0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0F0E0F0E1517171716000000
+ 0000000000000000000000000000000000000000000000000000000000000015
+ 171717160E0E0E0F0E0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0D0C0C0D0C0C0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F0E0E0E0F0E111617171717171300
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000D171717
+ 170F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0FD2F3F3E8191818171818171817181718171817181717
+ 1718D0F3F3F3EFB77D7D7C7C7C7B7A7A7A7A7979787877777676767575757474
+ 74696868616161606060605D5D535353525252525151515150504F4E4E4E4B4B
+ 4B4B4A4A4A494955C5F3F3F3F01A111111111111111111111011101110111010
+ 10F8F3F3F3190E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0E0E0E0E0F1717171710000000000000000000000000000000
+ 000000000000000000000000000000000000000E17171717110E0F0E0E0D0D0D
+ 0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0D0C0C0C0C0C0C0C0C0D0C0C0C0D0C0D0C
+ 0D0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D
+ 0E0F0E0F0E0E0E0F0E1116171717171717171000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000010161717170E0E0F0E0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0ED2
+ F3F3E8191818181818171818171817171817171717171792E9F3F3F3E5AF7D7C
+ 7C7B7B7B7A7A7A79797878777776767575757574747469686861616160606060
+ 5D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4DAAF3F3F3F396
+ 141111111111111111111111111011101110111090F3F3F3190E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E0E0F0E0F13
+ 161717170B000000000000000000000000000000000000000000000000000000
+ 000000000000000016171717140E0E0E0F0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0E0E0E0F0E1015171717
+ 17171717130C0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000013171717150E0E0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0ED2F3F3E81918181718181817
+ 1817181717181717181717171897F3F3F3F3E4AF7C7C7B7B7B7A7A7A79797878
+ 7777767676757575747474696868616161606060605D5D535353525252525151
+ 515150504F4E4E4E4B4B4B4DACF1F3F3F3D01713111311111111111111111111
+ 1111101110111090F3F3F3190E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0D0D0E0E0E0E0E15171717140000000000000000
+ 0000000000000000000000000000000000000000000000000000000011171717
+ 160F0E0E0F0E0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C
+ 0C0D0C0C0D0C0D0C0C0C0C0C0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0E0E0E0F0E0F0E0F0E0F1417171717171717150E0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000013171717140E0F0E
+ 0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0D0C0D0D0D0ED2F3F3E819181818181718181718171817181717171717
+ 171719CFF3F3F3F3E5B67C7B7B7B7A7A7A797978787777767675757575747474
+ 696868616161606060605D5D535353525252525151515150504F4E4E4E58C3F3
+ F3F3F3E89113111311111311111111111111111111111110111091F3F3F3190E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E
+ 0D0E0E0E0F0E0E17171717100000000000000000000000000000000000000000
+ 000000000000000000000000000000000D171717170F0F0E0E0E0D0D0D0D0C0D
+ 0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0D0C0C0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0F0E0E0E0E0E0F
+ 1317171717171717160F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000017171717130E0E0E0F0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0ED2F3
+ F3E99018181818171818171817181718171717171717171719CFF3F3F3F3EFC7
+ 887B7A7A7A7A797978787777767676757575747474696868616161606060605D
+ 5D535353525252525151515150504F9DDAF3F3F3F3E891131113131113131113
+ 1111111111111111111111111097F3F3F3190E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0E0E0F0F171717170C
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000B16171717110E0E0F0E0D0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C
+ 0C0C0C0C0C0C0C0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0D0E0E0F0E0E0E0F0E0F1316171717171717170F0B000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000000B
+ 17171717100E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0D0ED2F3F3F1911818181817181817
+ 181717171817181717171717171719CFF3F3F3F3F3E5B4867A7A7A7979787877
+ 77767675757575747474696868616161606060605D5D53535352525252515151
+ 6AC4F1F3F3F3F3D3911313131313131113111311131111111111111111111113
+ 07F3F3F0180E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0E0F0E0E10171717170B000000000000000000000000
+ 0000000000000000000000000000000000000000000000000016171717130E0E
+ 0E0E0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E0E
+ 0E0F0E0E111616171717171717110B0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000C171717170F0E0E0E0F0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D95F3F3F3F718181818171818171817181717171717171717
+ 171717171896E9F3F3F3F3F3E4B5877A79797878777776767675757574747469
+ 6868616161606060605D5D53535352525F73C4F2F3F3F3F3F397191313131313
+ 13131313131113111311131111111111111115D3F3F3F0140D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0E0E
+ 0E0F111717171700000000000000000000000000000000000000000000000000
+ 0000000000000000000000000013171717130E0F0E0E0E0C0D0D0D0C0D0C0D0C
+ 0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0D0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0F0E0F0E0E10151717171717171713
+ 0C00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000010161717170E0F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0E0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D93F3F3
+ F3CF191818181817181817181718171718171717171717171717169207F3F3F3
+ F3F3F3EFCDB58B78787777767675757575747474696868616161606060605D5D
+ 6B84BEE3F3F3F3F3F3F3D3921514131313131313131313131311131311131111
+ 111111111118F0F3F3D2140E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0D0E0D0D0E0D0E0F0E0E13171717170000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0013171717150E0E0F0E0E0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0C0C0D0C0D0C
+ 0D0C0D0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D
+ 0E0E0F0E0E0E0E0E0F1517171717171717150D00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001017171715
+ 0E0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D18F0F3F3E81A1817181817181817
+ 18171817171717171717171717171716171892CFF0F3F3F3F3F3F3F3E7DEC6B2
+ 858176757575747474696868616C8383BBC1DBF2F3F3F3F3F3F3F3D393161414
+ 13141314131313131313131313131113131113111311111193F3F3F3970F0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0E0D0D0E0D0E0E0E0E0F11171717170000000000000000000000000000000000
+ 00000000000000000000000000000000000000000013171717150E0E0E0E0E0C
+ 0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0C0D0C0D0C0D0C0D0C0C0D
+ 0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F0E0F0E1417171717
+ 171717160F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000013171717140F0E0E0E0E0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0D0C0D0D0D14E8F3F3F1F718181818171817181717181717181717171717
+ 1717171716171616169096D2F3F3F3F3F3F3F3F3F3F3F3F3F3E6E2E2E2E2F3F3
+ F3F3F3F3F3F3F3F3F3F3F3E89891151414131413141314131313131313131313
+ 1313131113111311131115D0F3F3F3920E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0E0F0E0E1317
+ 1717170000000000000000000000000000000000000000000000000000000000
+ 00000000000000000013171717140E0F0E0E0E0D0D0C0D0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0D0E0F0E0E0F11171717171717171510000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000016171717130E0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0E0E1098F3F3
+ F3D0191818181718181718171817171717171717171717171716171617161616
+ 16909507D2F0F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3D3CF95901614
+ 14141414141414141314131413141313131313131313131313111311131AF0F3
+ F3F0180D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0E0E0E0E0F1017171717000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000141717
+ 17130E0E0F0E0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0C0C0C0C0D0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F
+ 1317171717171717110B00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B16171717100E0F0E0E
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0D0C0D0D0C0D0E0E0E0E0E90F3F3F3F1921818181718181718
+ 1718171718171717171717171717161716161616161616161616159090F79696
+ 96D2D2D2D2D298969596901A1715141514151414141414141414141314141314
+ 13131313131313131313131313111314CFF3F3F3CF110E0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D
+ 0D0D0E0F0E0E10171717170C0000000000000000000000000000000000000000
+ 000000000000000000000000000000000017171717110F0E0E0E0D0D0D0D0C0D
+ 0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E131717171717130C00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000C17171717100E0E0E0F0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0C0E0E0F0E0E0F14D3F3F3F3D019181817181718171817181717171717171717
+ 1717171617161616161616161616161516151516151515151515151515151515
+ 1514151415141414141414141414141414131413141314131313131313131313
+ 131390F0F3F3F3920E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0E0D0E0D0D0E0D0D0E0D0E0D0E0E0E0F0E171717170E
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000C17171717100E0E0F0E0D0D0D0D0C0D0D0C0D0C0D0C0D0C0C0C0C0C
+ 0C0C0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0D0E0E0E0F11171717160C000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000F17
+ 1717170E0F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0E0E0E0F0E15171796F3F3
+ F3F1961818181817181718171718171717171717171717171617161716161616
+ 1616161615161615161515151515151515151515151415151415141414141414
+ 141414141414141314131413141313131313131317D2F3F3F3D2140E0E0E0E0D
+ 0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0D0E0D0D0E0D0D0E0D0E0E0F0E0E0E1617171711000000000000000000000000
+ 0000000000000000000000000000000000000000000000000F171717170E0F0E
+ 0E0E0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E13171717
+ 1300000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000010161717160E0E0F0E0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0C0E0F0E0E0E171717171AE8F3F3F3E99118171818171718
+ 1717181717171717171717171716171616161616161616161615161515161516
+ 1515151515151515151514151414151415141414141414141414141314141314
+ 1313131313131697F3F3F3F0920E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0D0E0E
+ 0E0F0E1417171715000000000000000000000000000000000000000000000000
+ 00000000000000000000000014171717150E0E0E0F0E0C0D0D0C0D0C0D0C0D0C
+ 0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0D0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F13171717130000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000013171717150E0E0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0E0E0E0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0E0E0E
+ 0F0E17171717171390E9F3F3F3D3911718181718171817171817171717171717
+ 1717161716161616161616161616151616151615151515151515151515151515
+ 14151415141414141414141414141414131413141314131315F7F0F3F3F39811
+ 0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E0D0E0E0E0E0E10171717170E000000
+ 000000000000000000000000000000000000000000000000000000000000000C
+ 17171717110F0E0E0E0E0D0C0D0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E
+ 0E0F0E0E15171717130000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000015171717130E
+ 0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0D0D0D0E0F0E0E0E0F0E0E0E0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0E0F0E0E10171717170E00000BF7F3
+ F3F3F3D391171818171718171717171717171717171717161716161616161616
+ 1616161516151516151615151515151515151515141515141514151414141414
+ 1414141414141314131415F7F0F3F3F3E8160E0D0E0E0E0E0E0D0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D
+ 0D0E0D0D0D0E0D0E0F0E0F0E1617171715000000000000000000000000000000
+ 0000000000000000000000000000000000000011171717170F0E0F0E0E0D0D0D
+ 0C0D0D0C0D0D0C0D0C0D0D0C0C0C0C0C0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C
+ 0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F1417171710000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000017171717110E0E0F0E0E0E0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D
+ 0E0E0E0E0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0E0E0E0F101717171700000000000E96F3F3F3F3D3921817181718
+ 1717181717171717171717171617161616161616161616161516161516151515
+ 151515151515151515141514151414141414141414141414141413141696F0F3
+ F3F3E8190E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E0D0D0E0E0E0E0E
+ 13171717170E0000000000000000000000000000000000000000000000000000
+ 0000000000000B17171717150E0E0E0F0E0D0D0D0C0D0C0D0C0D0C0D0D0C0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0E0F0E0E0E1617171710000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000C17171717100F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0E0E0F0E0E0E0F0E0E0E0E0F
+ 0E0E0F0E0E0E0E0E0F0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0F0E0E0E131717
+ 1717000000000000001107F3F3F3F3E996181817181717171717171717171717
+ 1716171616161616161616161615161515161516151515151515151515151514
+ 15141514151414141414141414141998F3F3F3F3E8190E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0F0E0F0E0F17171717150B0000000000
+ 0000000000000000000000000000000000000000000000000000131717171710
+ 0E0F0E0E0E0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C
+ 0D0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E
+ 171717170F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000D171717170F0E0E0F0E0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0E0D0E0D0E0E0E0E0F0E0E0E0F0E0F0E0E0F0E0E0E0F0E0F0E0E0E0F0E
+ 0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0E0F0E0E131717171500000000000000000011
+ F7F3F3F3F3F0CF91171817171817171717171717171716171616161616161616
+ 1616151616151615151515151515151515151514151514151414141414141415
+ 93E8F3F3F3F3E8190E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0E0D0E0E0E0E0E1317171717110000000000000000000000000000000000
+ 000000000000000000000000000F17171717150E0E0E0E0F0D0D0C0D0C0D0C0D
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0D0C0C0D0C0C0C0D0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0F0F171717170C00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000010161717160E0E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0E0F0E0E
+ 0F1111100E0E0E0F0E0E0F0E0E0E0E0E0F0E0E0F0E0E0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0E0E0E0F0E141717171300000000000000000000000E91E9F3F3F3F3E998F817
+ 1717171717171717171717161716161616161616161616151615151615161515
+ 151515151515151514151415141514141691CFF3F3F3F3F3CF190E0E0E0E0E0E
+ 0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0F0E0F0E0F1617
+ 1717170E00000000000000000000000000000000000000000000000000000000
+ 0C17171717170F0F0E0F0E0E0C0D0D0C0D0D0C0D0C0D0D0C0D0C0C0C0C0C0C0C
+ 0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0F0E0E0E10171717170C00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000131717
+ 17150E0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0E0E0F0E0E0E0F131717171715141311100E0F
+ 0E0F0E0E0E0F0E0E0F0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0E0F0E0E15171717130000
+ 00000000000000000000000B17D0F3F3F3F3F3E9989217171717171717171717
+ 1617161616161616161616161516161516151515151515151515151515151415
+ 141793CFF3F3F3F3F3F093110E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0E0D0E0E0E0E0E1017171717170E00000000000000
+ 000000000000000000000000000000000000000C1517171717130E0E0E0E0E0D
+ 0D0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C
+ 0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E1117171717
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000014171717130F0E0F0E0E0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E
+ 0D0E0E0E0E0F0E131717171717171717171717171515141313130F0E0E0E0E0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0D0C0D0E0E0E0E0F14171717100000000000000000000000000000
+ 00000E91D3F3F3F3F3F3F3D39790171717171717171617161616161616161616
+ 1615161515161516151515151515151515189298E8F3F3F3F3F3F398170E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D
+ 0D0E0E0F0E0F0E1317171717170E000000000000000000000000000000000000
+ 0000000000000C1517171717150E0F0E0F0E0E0D0C0D0C0D0C0D0C0D0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0C0C0D0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E13171717170E0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000017171717130E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0F0E0F0E0E111717171717
+ 1717171717171717171717171717140E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0E0E0F0E
+ 0E1717171710000000000000000000000000000000000000000F92D3F3F3F3F3
+ F3F3F3E807959118161716171616161616161616161615161615161515151515
+ 199195D2F0F3F3F3F3F3F3F098190F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0E0E0E0E0E15171717
+ 171710000000000000000000000000000000000000000000000F171717171716
+ 0E0E0E0E0E0E0D0D0D0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E
+ 0E0E0F1417171717171100000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000C16171717100E0F
+ 0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0E0E0E0E0E11171717171717171717171717171717171717
+ 1717170F0E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0E0E0E0F0E171717170E000000000000
+ 000000000000000000000000000000000E1896F0F3F3F3F3F3F3F3F3F3D2D296
+ 9695909090909090909090909091969607D2E9F3F3F3F3F3F3F3F3F3D293160E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0E0D0E0D0D0E0E0F0E0F0E0F151717171717140C00000000000000
+ 00000000000000000000000B131717171717160F0F0E0F0E0F0D0D0D0C0D0D0C
+ 0D0D0C0D0C0D0C0D0C0C0C0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0D0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0E0E10151717171717130B
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000C171717170F0E0E0F0E0E0D0E0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0E0E0F0E0F0E
+ 101617171717110C0F1013161717171717171717171717140E0E0F0E0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0E0F0E0E0F171717170C000000000000000000000000000000000000
+ 00000000000000000F1793D0F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3
+ F3F3F3F3F3F3F3F3F3F3F3F0CF9216100E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0E0D0E0D0D0D0D0D0E
+ 0E0E0E0E0E0F15171717171717110C00000000000000000000000000000B1117
+ 1717171717160F0E0E0F0E0E0E0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0E0E0F0E0E0F0E151717171717140C0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 10161717170E0F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0E0E0E0E0E0E10161717171714000000000000
+ 000C0C100F131315171717170F0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0E0E0E0F10161717
+ 170C000000000000000000000000000000000000000000000000000000000000
+ 000F151A9307D3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F307CF979590180E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0D0D
+ 0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0E0D0D0D0D0E0F0E0F0E0E0F1317171717
+ 171717140F0B00000000000000000B0E1317171717171717150F0E0F0E0E0E0E
+ 0D0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0C0C0C0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E0E
+ 0E0E141717171717160B00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000011171717150E0E0E0F0E0D0E
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0E0F0E0F0E0F1617171717140B000000000000000000000000000C17171717
+ 140E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0C0D0E0F0E0E10171717170000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000F1311
+ 111311111311111311110B0000000C17171717100E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0D0E0D0E
+ 0D0E0D0D0D0E0D0D0D0E0E0E0E0F0E0E11161717171717171717171314100F14
+ 1316171717171717171717130E0E0E0E0E0F0E0D0C0D0D0D0D0C0D0D0C0D0D0C
+ 0D0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0D0C0C0D0C0C0C0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F0E0E0E111717171717170E00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000013171717140F0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0F0E0E0E0F151717171715
+ 0B00000000000000000000000000000013171717170F0E0F0E0E0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0E0E0E0F13161717170000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000B16171717110E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E0D0D0D0D0D0D0E0F
+ 0E0E0E0F0E0F1417171717171717171717171717171717171717171717150F0E
+ 0F0E0F0E0E0E0D0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0E0E0E0F0E0F0E1016171717171710000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000017171717
+ 130E0F0E0E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D
+ 0D0E0D0D0E0D0E0E0E0E0E0F0E1517171717160C000000000000000000000000
+ 000000000C17171717140E0E0F0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0F0E0E0E1317171714000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000016171717130F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E
+ 0D0D0E0D0D0D0D0D0D0D0D0D0D0D0E0D0E0D0D0E0E0F0E0E0E0E0E1014171717
+ 17171717171717171717171717171715100E0F0E0E0E0E0F0E0C0D0D0C0D0D0D
+ 0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C
+ 0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E0E
+ 0F0F161617171717130000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000B16171717100E0E0F0E0E0E0E0E0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0D0D0E0D0D0E0D0D0E0E0E0F0E0E0E
+ 1417171717160B00000000000000000000000000000000000013171717170F0E
+ 0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D
+ 0D0C0D0D0D0C0D0D0E0F0E0E1417171713000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000013171717150E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0D
+ 0E0D0D0D0D0D0D0D0E0E0E0F0E0F0E0E0E0F1115171717171717171717171717
+ 16130F0E0E0E0E0E0F0E0E0E0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0F0E0F0E0E0E0F151717171717140B00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000C1717171716110E0E0E0F0E0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0E0D0D0E0D0D0E0E0E0E0E0F0E1417171717170E000000000000
+ 000000000000000000000000000C17171717140E0F0E0E0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0E0E0E0F0E
+ 1517171713000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000010
+ 161717170E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0E0D0D0D0E0E0E
+ 0E0E0E0F0E0E0F0E0F101114151415141413100F0E0E0F0E0F0E0F0E0E0E0E0C
+ 0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0D0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0D0E0E0E0F0E0E0E141717171717160B000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000F171717171717150F
+ 0E0E0F0E0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D
+ 0E0E0F0E0E0E1316171717170E00000000000000000000000000000000000000
+ 000013171717170F0E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0E0E0E0E0E151717171000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000C17171717100E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0E0D0E0D0D0D0D0D0D0D0E0E0F0E0E0E0F0E0E0E0E0F0E
+ 0E0E0F0E0E0E0F0E0F0E0E0E0E0E0E0E0E0D0D0D0D0C0D0D0D0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0D0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F0E0E
+ 0E111717171717170E0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000B1317171717171717130F0E0E0F0E0F0E0E0E0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0F0E0E0F0E11171717171710
+ 000000000000000000000000000000000000000000000C17171717140E0E0F0E
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D
+ 0D0C0D0E0E0F0E0E171717171000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000B16171717110E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0E0D0D0D0D
+ 0D0E0D0D0D0D0D0D0D0E0E0F0E0E0E0F0E0E0E0E0F0E0E0F0E0E0E0E0E0E0F0E
+ 0F0E0E0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0D0C0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0F0E0F0E11161717171717100000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000D1517171717171716110F0E0E0E0E0F0E0E0E0E0E0D0E0D0E0D0E0D0D0E0D
+ 0E0D0D0E0D0D0E0E0E0E0F0E1017171717171100000000000000000000000000
+ 000000000000000000000013171717170F0E0E0E0F0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0E0E0E0F0E17171717
+ 0D00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000014171717
+ 140F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E
+ 0E0E0F0E0E0F0E0E0E0F0E0E0F0E0F0E0F0E0E0E0E0D0D0D0D0D0D0C0D0D0D0D
+ 0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0E0E0E0E0E0E0E0F1617171717171300000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B101717171717171715
+ 110E0F0E0E0E0F0E0E0E0E0E0D0E0D0E0D0E0D0D0D0E0D0D0E0E0E0F0E0E0E10
+ 161717171713000000000000000000000000000000000000000000000000000C
+ 17171717140E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C
+ 0D0D0D0D0C0D0D0D0D0C0D0E0F0E0E0F171717170C0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000010171717160E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0F0E0E0E0E0F
+ 0E0E0E0E0E0E0D0D0D0D0C0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0C0D0C0D0D0C
+ 0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0F0E0F0E0F0E
+ 0F151717171717140B0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000C131717171717171715100E0F0E0E0E0F0E0E0F
+ 0E0E0D0E0D0D0E0D0E0D0D0E0E0E0E0E0F0E101617171717140B000000000000
+ 000000000000000000000000000000000000000013171717170F0E0E0F0E0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0E
+ 0E0E0F10171717170B0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000D17171717100E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0D0E0D0E0D0D0C0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E0E0F131717171717160B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000D151717171717171715100E0F0E0E0E0F0E0E0E0E0E0E0D0D0E0D0D0E0D
+ 0E0E0F0E0E0F1517171717140B00000000000000000000000000000000000000
+ 00000000000000000C17171717150E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0F0E0E0E111717171700000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000B16171717110E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D
+ 0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0C
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0E0F0E0F0E0E0E131717171717160E00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000B0F16171717171717
+ 1714100E0F0E0E0E0F0E0E0E0E0E0E0D0E0D0E0E0F0E0E0E0F1517171717160B
+ 0000000000000000000000000000000000000000000000000000000000131717
+ 1717100F0E0F0E0E0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D
+ 0D0C0D0D0D0C0D0E0F0E0E131717171700000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000014171717150E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F0E0E
+ 1116171717171600000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000B10171717171717171715100E0F0E0E0F0E0F
+ 0E0E0E0E0E0E0E0E0E0E0F0E1517171717150C00000000000000000000000000
+ 00000000000000000000000000000000000C17171717150E0E0E0E0E0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0E0E0F0E13
+ 1717171300000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0010161717170F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C
+ 0D0D0D0D0D0C0D0C0D0D0C0D0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0D0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F0E0E0F17171717130000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000B11171717171717171716100F0E0E0E0E0F0E0F0E0E0E0F0E0F0E0E14
+ 17171717170C0000000000000000000000000000000000000000000000000000
+ 0000000000001317171717100E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0D0C0E0E0E0E0E15171717130000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000C17171717110E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D
+ 0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0E0D0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0D
+ 0C0D0D0C0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0D0F0E0E0E0F0F171717170E0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000B111717171717
+ 17171716130F0F0E0E0E0E0E0F0E0E0E0E0E1317171717170E00000000000000
+ 00000000000000000000000000000000000000000000000000000B1717171715
+ 0E0E0F0E0E0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0C0E0E0F0E0E15171717110000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000016171717140E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0D0E0E0E0D0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0D0C0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0D0C0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E131717
+ 17170B0000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000B1117171717171717171714100F0E0F0E
+ 0E0E0F0E0F1117171717170E0000000000000000000000000000000000000000
+ 0000000000000000000000000000001117171717100E0E0E0F0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0D0E0E0E0F0E1616171710
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000001117
+ 1717160F0E0E0E0E0F0E0F0E0F0E0F0E0F0E0E0F0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0D0E0D0E0E0E0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0C0D0D0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0F0E161717171300000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000B1116171717171717171716130F0E0F0E0E0E1117171717171100
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000B17171717150E0F0E0E0E0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0D0E0E0E0E0F0E0E0E1717171710000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000D17171717110E0F0E0E0E0F0E0E
+ 0E0E0E0E0E0F0E0E0E0E0E0F0E0F0E0F0E0F0E0F0E0E0E0E0D0E0E0D0E0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D
+ 0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D
+ 0E0F0E0E10161717170E00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000B0F151717
+ 1717171717171715110F0E101617171717110000000000000000000000000000
+ 0000000000000000000000000000000000000000000000001117171717100E0E
+ 0F0E0E0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0E0D0E0E0E0E0E0F0E0E
+ 0E0F0E171717170C000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000016171717150F0E0E0F0E0E0E0F0E0F0E0F0E0E0E0F0E0F0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C
+ 0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0C0C0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F13171717170B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000E14171717171717171717171516
+ 1717171713000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000B17171717150E0E0E0E0E0D0D0D0D0D0D0D0C0D
+ 0D0D0C0D0D0D0E0E0E0E0E0E0F0E0F0E0E0E0E0F0E0E10171717170C00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001117171717
+ 1717171715151514131313101010100E0E0E0E0F0E0F0E0F0E0F0E0F0E0E0E0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0D0E0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0D0C0D
+ 0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0D0C0C0D0C0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0E0E0F0E0E1617171713000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000C1115171717171717171717171717140B00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 001117171717100F0E0F0E0E0D0D0D0D0D0D0D0D0E0E0E0E0E0E0E0E0F0E0F0E
+ 0E0E0E0F0E0F0E0E0E1113171717170B00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000D17171717171717171717171717171717
+ 17171717171716151514131313100E0E0E0F0E0E0D0E0E0D0E0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E10
+ 171717170E000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000B0E
+ 14171717171717171717140B0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000B17171717150E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0E0E0E0F0E0E0E0E0F111417171717
+ 1717170000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000016171717171717171717171717171717171717171717171717171717
+ 17160F0E0E0E0E0E0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D
+ 0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C
+ 0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F14171717160000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000B10151617171717160C00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000001117171717100E0F0E0E0E0E0E0E0F0E0F0E0F0E0E0E
+ 0E0E0F0E0F0E0F0E0E0F11141617171717171717171716000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000001017171717171717
+ 17171717171717171717171717171717171717171717130E0F0E0E0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0C
+ 0C0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0D0C0C0D0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0E0F0E0E0F16171717110000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000C101517160B0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000B17
+ 171717150E0E0F0E0F0E0F0E0E0E0E0E0E0F0E0F0E0E0E0E0E10131416171717
+ 1717171717171717171711000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000B0C0C0C100F101013131415171717171717
+ 17171717171717171717160F0E0F0E0E0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C
+ 0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0C0D0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0F0E11171717170C
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000C0C000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000001117171717100E0E0E0E0E0E0E
+ 0F0E0F0E0E0E0E0F10131415171717171717171717171717171716130E0B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000C0C0C0D100F101114141717171714
+ 0E0E0F0E0E0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D
+ 0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0E0F0E0E0E161717171500000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000B17171717150F0E0F0E0F0E0E101011131415171717171717
+ 171717171717171717171714100D000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000001417171717100E0E0F0E0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E
+ 0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0C0D0D0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E
+ 0F10171717170F00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000011171717
+ 17141314151517171717171717171717171717171717171717171715110E0B00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000C17171717150E0E0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0F0E0F0E0E15171717150B0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000B171717171717171717171717171717
+ 171717171717171717171714100E0B0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000001317171717110F0E
+ 0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0D
+ 0C0D0D0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C0D0C0D0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0D0E0E0E0E101717171711000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000011171717171717171717171717171717171717171713110F0C0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000B17171717160F0E0E0E0F0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0C0C0C0C0C0D0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0F0E14171717
+ 170B000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000B151717171717
+ 17171717171717151311100C0B00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 001016171717140E0F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D
+ 0D0C0D0C0D0C0D0C0D0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0D0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0F17171717130000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000010161715131411100F0D0C0B000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000001517171717100E0E0F0E
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D
+ 0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0C0E0E0F0E0E0E0E0D0D0D0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F
+ 0E0F0E14171717170C0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000F17171717110F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D
+ 0D0C0D0D0D0D0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0E0E0F0E0E0E
+ 0F0E0E0E0E0E0E0D0D0D0C0C0C0C0C0C0C0D0E0E0E0E0F171717171300000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000110B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000001517
+ 1717160F0E0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D
+ 0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0C0D0C0D
+ 0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F0E0E0E0F0E0E0E0F0E0E0E0E0F0E0E0E0E
+ 0E0E0E0D0D0F0E0F0E0E14171717170C00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000BF3F3070F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000E17171717130E0E0F0E0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E
+ 0F0E0E0E0F0E0E0E0F0E0E0F0E0F0E0E0E0F0E0F0E0E0E0E0E0E0E0E0F0F1717
+ 1717130000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000E93D3F3F3140000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000013171717160F0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C
+ 0D0D0C0D0C0D0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C
+ 0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E0E0F100F0F0E0E0E0F0E0E
+ 0E0E0E0F0E0E0E0E0E0F0E0F0E0F0E0E0E15171717170C000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000096F3E90B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000C17171717130E0F
+ 0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0D0C0D0C0D0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0D0C0C0C0C0C0C
+ 0C0C0C0D0E0E0E0E0F0E15171717161514131110100E0E0E0F0E0F0E0E0E0F0E
+ 0E0E0F0E10171717171300000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000EF3F3170000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000013171717170F0E0E0E0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0C0C0C0D0C0C0C0D0C0C0D0C0C0C0C0C0C0C0C0E0E0F0E0E0E141717
+ 17171717171717171717171514131110100E0E0E0F0E0E0E16171717170B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000D3F3910000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000000C
+ 17171717140E0F0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0D0C0D0D
+ 0C0D0C0D0C0D0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E0F11171717171717171717171717171717
+ 1717171717171715141313131717171711000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00001A1A1100000000000011F81A00000000000E1A9607961A140B000000171A
+ 17000000000011F81A00000000000E1A1A0D0000000000000B1791079891170B
+ 0000000000000011F811000E1A96071A0E00000000000007F307000000000000
+ 11F80798931A1100000000000000171A079891170B000000000B1998981A0000
+ 0F19960793190B00000000000000000000171A1A1A1A1A1A1A1A1A1700000000
+ 0011F8190000000000000000000B199307981A90191717171792920E0E0E0E0D
+ 0E0D0E0D1491910E0D0E0D0D0E1991170E0D0E0D0D0E0D0D11F896CF93170D0D
+ 0D0E0D0D0D0D0D139197CF91130D0D0D0D0D0D0D0D0D1995CF93150D0D91910D
+ 0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0C0D0C0C0C0C0C0C0C0C0E0E0E
+ 0E0E0F1017171717171717171717171717171717171717171717171717171717
+ 1717171600000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000F3F31A00000000000007
+ F3960000000B92F3F3F3F3F3F3F39200000007F39800000000001AF3F3000000
+ 000011F3F311000000000017E9F3F3F3F3F3F3E91A0000000000001AF31A17F3
+ F3F3F3F3F391000000000007F398000000000E98F3F3F3F3F3F3F31400000000
+ 14F0F3F3F3F3F3F31A0000000BF0F3F3F3F3000FF3F3F3F3F3F3E91700000000
+ 000000000007F3F3F3F3F3F3F3F3F3980000000000D3F3F30F00000000000000
+ 19E9F3F3F3F3F3F3E817171492F3F30E0E0E0D0E0D0E0D0E96F3F3130E0D0E0D
+ 0DF0F3E80D0D0D0E0D0D0E1AF0F3F3F3F3F3E8140D0D0D0E0D0F93F3F3F3F3F3
+ F3CF0F0D0D0D0D0D13D2F3F3F3F3F39717F3F30D0D0D0C0D0D0D0C0D0D0D0D0C
+ 0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C
+ 0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0E0E0F0E0F0E0F1717171717110E1011
+ 1315171717171717171717171717171717171717171717100000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000F3F31A00000000000BF3F31900000007F3F31A0E0000
+ 11191100000007F39800000000001AF3F3000000000011F3F3110000000093F3
+ F3071400000F92F3F3D00B000000001AF3E9F39610000E1AF3F3910000000007
+ F3980000000BF0F3E9170B000B13910B00000014F3F3D3170B000E160F000000
+ 19F3F316000E000007170D000E93F3E90E000000000000000007F3D011131111
+ 131111100000000011F3F3F3930000000000001AF3F396100000179393161710
+ 92F3F30E0E0E0E0D0E0D0E0DE8F0F3930E0D0D0E17F3F3F3110D0E0D0E0D91F3
+ F393100D15D2F3F0130E0D0D0DCFF3F01A0F0D19E9F3D20F0D0D0D0FE8F3F019
+ 0D0E19F0E8F3F30D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C
+ 0D0D0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0D0C0D0C0C0C
+ 0C0C0C0E0E0E0E0F0E0F171717171713000000000000000B0C0E101113151717
+ 1717171717171717171715000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000F3F3
+ 1A000000000011F3F30F000017F3F3110000000000000000000007F398000000
+ 00001AF3F3000000000011F3F3110000001AF3F31A00000000000011F0F39600
+ 0000001AF3F396000000000019F3F30D00000007F39800000093F3E90B000000
+ 0000000000000BF0F3D00B00000000000000000096F3D0000000000000000000
+ 000BF3F319000000000000000007F30700000000000000000000000093F393F3
+ E90B000000000EF3F31A0000000B17171717150E92F3F30E0E0D0E0D0E0D0E13
+ F3CFD2E80E0D0E0D96F393F31A0E0D0D0D11F3F3910D0E0D0D0FD2F3E80D0D0D
+ 19F3F3150D0D0D0D13F0F3960D0D0D91F3F3130D0D0D0D15F3F3F30D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0D0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E0E10161717
+ 1717140B0000000000000000000000000000000B0C0E10111315171717170D00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000F3F31A00000000001AF3E9000000
+ D0F393000000000000000000000007F39800000000001AF3F3000000000011F3
+ F31100000EF3F396000000000000000019F3F3110000001AF3F30E0000000000
+ 00D3F39100000007F39800000BF3F3170000000000000000000017F3F3110000
+ 000000000000000007F307000000000000000000000BF3F31A00000000000000
+ 0007F39800000000000000000000000BF0F31197F3170000000091F3D3000000
+ 001016171717100E92F3F30E0E0E0D0E0D0E0D92F39193F3130E0D0DF0F311F3
+ D20D0E0D0E93F3E90D0D0D0D0D0D15F3F3170E0DD2F3970D0D0D0D0D0D91F3F3
+ 0F0D0DE8F3960D0D0D0D0D0D97F3F30D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C
+ 0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0C0D0C0C0C0D0E0E0E0E0F0E0F1517171717150B000000000000000000
+ 0000000000000000000000000000000B0C0C0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000F3F31A000000000007F396000000F3F317000000000000000000
+ 000007F39800000000001AF3F3000000000011F3F311000091F3F30E00000000
+ 0000000000D0F3960000001AF3F30000000000000093F30700000007F3980000
+ 11F3F30E0000000000000000000091F3D3000000000000000000000007F39800
+ 00000000000000000E96F3F30F000000000000000007F3980000000000000000
+ 00000017F3E90017F3D00000000007F3930000000B15171717160E0E92F3F30E
+ 0D0E0D0E0D0E0DD2F31717F3930D0E13F3970EE8F3100E0D0DCFF3960D0D0D0E
+ 0D0D0DF0F3930D0DF3F3190D0D0D0D0D0D13F3F3170D0FF3F3180D0D0D0D0D0D
+ 91F3F30D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0C0C0C0C0D0E0F0E
+ 0E0E0F1517171717160B00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000F3F31A000000
+ 000EF3F317000011F3F31911111311111311110E000007F39800000000001AF3
+ F3000000000011F3F3110000D0F3960000000000000000000019F3F30B00001A
+ F3F3000000000000001AF3E900000007F39800001AF3F3111311111311111311
+ 0B0007F307000000000000000000000007F3980000000000000011F7F3F3F31A
+ 00000000000000000007F3980000000000000000000000D0F3910000E9F30F00
+ 0000F3F3931113111791909091160E0E92F3F30E0D0E0D0E0D0E11F3F30F0EF0
+ E80D0D93F3F80D96F3F80D0E0DF3F3910E0D0D0D0D0E0DCFF3CF0D15F3F3150D
+ 0D0D0D0D0D0DF3F3910D15F3F3150D0D0D0D0D0D91F3F30D0D0D0D0C0D0D0D0C
+ 0D0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0C0C0D0C0C0C0C0D0C0C0C0C0C0C0E0E0F0E0F1617171717150C000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000F3F31A0000000B97F3D30B000013F3F3F3F3
+ F3F3F3F3F3F3F31A000007F39800000000001AF3F3000000000011F3F311000B
+ F3F319000000000000000000000FF3F31100001AF3F3000000000000001AF3F3
+ 00000007F39800001AF3F3F3F3F3F3F3F3F3F3F3110096F30700000000000000
+ 0000000007F39800000000000093F3F3F398110000000000000000000007F398
+ 000000000000000000000EF3F30F000093F393000000F3F3F3F3F3F3F3F3F3F3
+ F3CF0F0E92F3F30E0D0E0D0E0D0E1AF3D20E0D97F3140DE8F3110D17F3D20E0D
+ 0DF3F3910D0D0D0D0D0D0DCFF3CF0D15F3F3150D0D0D0D0D0D0DF3F3910D15F3
+ F3150D0D0D0D0D0D91F3F30D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C
+ 0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0D0C0C0C0C
+ 0C0C0C0C0C0E0E0E0E0E16171717160C00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000F3F3071A1A92D3F3E91000000000F3F3931A1A1A1A1A1AF3F31A000007F3
+ 9800000000001AF3F3000000000011F3F3110013F3F311000000000000000000
+ 0000F3F31900001AF3F30000000000000093F3D000000007F398000011F3F31A
+ 1A1A1A1A1A93F3F31100F8F3E9000000000000000000000007F3980000000000
+ 91F3F3961000000000000000000000000007F3980000000000000000000091F3
+ D300000014F3E90B000007F3981A1A92969697E8F3CF0E0E92F3F30F0E0D0E0D
+ 0E0D97F3910E0D19F39313F3D20D0E0FF3F3110D0ECFF3960D0E0D0E0D0D0EE9
+ F3960D0DF3F3190D0D0D0D0D0D13F3F3190D0DF3F3190D0D0D0D0D0D91F3F30C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0C0C0D0C0C0C0C0C0C0E0E0F0E0E1417
+ 1717140000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000F3F3F3F3F3F3F3F31A00
+ 00000000D0F31A00000000000BF3F311000007F3D3000000000091F3F30B0000
+ 000017F3F30E0011F3F3110000000000000000000000F3F31A00001AF3F31100
+ 0000000000D3F39300000007F39800000BF3F311000000000014F3F300000FF3
+ F3110000000000000000000007F3980000000000E9F396000000000000000000
+ 000000000007F3E907980798079891000000E9F31A00000000E9F317000091F3
+ 07000015171717E8F3920E0F91F3F3190E0D0E0D0E0FF3F3150E0D0FF3D290F3
+ 910E0D0DCFF3F80D0D93F3F00D0D0D0D0D0D15F3F3190D0DD2F3970D0D0D0D0D
+ 0D91F3F3110D0DD2F3970D0D0D0D0D0D96F3F30D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D
+ 0C0D0C0D0C0C0C0C0C0C0C0C0C0D0E0E0F0E11171717170B0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000F3F39311131119D3F3D00B00000017F3E90B00000000
+ 19F3E900000007F3F31900000000D3F3F31A0000000007F3D3000011F3F31100
+ 00000000000000000000F3F31A00001AF3F3D0000000000019F3F31100000007
+ F39800000093F307000000000096F39600000007F3D30B000000000000000000
+ 07F3980000000000E9F31A000000000000000000000000000007F3F3F3F3F3F3
+ F3F307000014F3F30E0000000093F3D000000EF3F3110E1717171AF3F3140E0E
+ 92F3F3F0110E0D0E0D17F3F30E0D0E0D97F397F3130E0D0E1AF3D20E0D11F3F3
+ 910D0D0D0E0DCFF3F00D0D0D19F3F3150D0D0D0D0FF0F3970D0D0D19F3F3150D
+ 0D0D0D13F3F3F30D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C
+ 0C0C0F0E0E0F0F171717170D0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000F3F3
+ F8000000000BD0F3070000000096F3D011000019F3F31800000007F3E9E9190B
+ 0E93F3F393F31A0B0BF8F3F31A000000F3F319000000000000000000000EF3F3
+ 1100001AF3F3D3D011000E1AF3F3960000000007F3980000000BE8F3960E000B
+ F7F3F30F0000000EE9F3D3170B000E160F000F13D0F3D01113110B0092F3E914
+ 000E161700000000000000000007F39800000000000000000096F3D000000000
+ 000FF3F30E000019F3E991171790F1F3980E0F0E92F3D2F0F093910E0D96F397
+ 0E0D0D0E19F3F3E80D0D0D0D13F3F3110D0D19F3F393110D13CFF3F3170D0D0D
+ 0D96F3F01A0F0D17E8F3F0110D0D0D0DCFF3F0190E0F18F0F3F3F30D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0D0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E1617171710
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000F3F31A000000000010F3F30F0000
+ 000093F3F3F3F3F3F3910000000007F31A93F3F3F3F3F393001AF3F3F3F3F307
+ 00000000D3F3930000000000000000000017F3F30D00001AF3F30FE8F3F3F3F3
+ F3070B0000000007F398000000000BD0F3F3F3F3F3E91700000000000E98F3F3
+ F3F3F3F3190007F3F3F3F3F3F3F311000B07F3F3F3F3F3D00000000000000000
+ 0007F39800000000000000000EF3F318000000000000D3F39100000017F3F3F3
+ F3F3F3CF100E0E0E91F39317F3F3F30E0DF0F3900E0D0E0D0FF3F3930D0E0D0E
+ 0DE8F3F80E0D0D19F0F3F3F3F3F3F0170D0D0D0D0D0D93F3F3F3F3F3F3D2130D
+ 0D0D0D0D0FCFF3F3F3F3F3D293F3F30C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D
+ 0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F1417171714000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000F3F31A000000000000F3F31A00000000000F929898910F000000
+ 0000171A0E0011929893110000000F92989317000000000091F3E90B00000000
+ 000000000096F3D30000001AF3F3000B1793079111000000000000171A170000
+ 0000000014F79898190D00000000000000000FF8930793190F00171AD3F3D31A
+ 1AF80E00000011929896190D00000000000000000007F3980000000000000000
+ 0FF81A0E00000000000014F819000000001695D2D2CF180E0F0E0E0E1691150E
+ 1196CF0E119191110E0D0D0D0D1991110D0E0D0D0E1991170D0D0D0D0F1993CF
+ 93190F0D0D0D0D0D0D0D0D111A96CF91170D0D0D0D0D0D0D0D0D1593CF96180D
+ 91F3F30D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0D0E
+ 0F0E0E11171717170B0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000F3F31A000000
+ 00000BF3F31A0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000EF3F31A000000000000000011F3F31A0000001A
+ F3F3000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000007F30700000000000000000000000000
+ 00000000000000000007F3980000000000000000000000000000000000000000
+ 000000000C17171717140E0E0E0F0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D91F3F30C0D0D0DCF150D9118
+ 0DD2190CCF150D0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0E0E0F0E10161717170D000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000F3F31A000000000017F3F30F000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 001AF3F3110000000000000BE8F3D30B0000001AF3F300000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000007F3980000000000000000000000000000000000000000000007F398
+ 00000000000000000000000000000000000000000000000013171717170F0E0F
+ 0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D
+ 0E0D0D0D0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D91F3F30D0D0C0DCF150D919110CF970DCF150D0C0D0C0D0D
+ 0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0D0C0D0C0C0D0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0E0E0E0E0E1717171710000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000F3F31A0000000017E9F3D000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000093F3F31A0B00000014F0
+ F3E910000000001AF3F30000000000000000000000000091F391000000000000
+ 000000000000000000000000000000000000000000000000000F170000000000
+ 000000000000000000000000000000000007F398000000000000000000000000
+ 00000000000000000000000B17171717160F0E0E0E0F0E0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0E0E0F0E0E0F0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D91F3F30C
+ 0D0D0DCF150D1A911A1A9710CF100D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E
+ 1417171714000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000F3F3F3079807F3F3F3D0
+ 1000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000001AF3F3F30798E9F3F3D01000000000001AF3F30000
+ 0000000000000000000000F3F3F3000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000007F3F3F3F3F3F3F3F3F3110000000000000000000000000000000B
+ 1517171717150F0E0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0E0D0E0D0E0E0E0E0E0E0F0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D91F3F30D0C0D0DCF150D1591D210191A
+ F30D0C0D0D0C0D0C0D0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C
+ 0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E11171717170B000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000009307D0F3F3F3D0961700000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0E9198E9F3D39617000000000000001AF3F3000000000000000000000000001A
+ F31A000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000091079807980798
+ 0798070F000000000000000000000000000000000C1517171717150F0E0F0E0E
+ 0F0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0E0E0F
+ 0E0F0E0E0E0F0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D91F3F30C0D0D0DCF150D1596D20C0F07F30D0C0D0C0D0D0C0D0C0D0C
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0F0E0E0F0F171717170D000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000001798070000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000C1517171717150F0E0E0F0E0E0E0E0D0E0D0E0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0E0F0E0E0E0F0E0E0F0E0E0E0F0E0E0E0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D18CFCF0D0D1891E8
+ 969117E8180D0C96E90D0D0C0D0C0D0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0D
+ 0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E161717
+ 1710000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000D17
+ 17171717150F0E0E0E0F0E0E0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D
+ 0E0E0E0E0E0F0E0E0E10130F0E0F0E0E0E0F0E0E0F0E0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D13151515150E150F0C0D10130D0C0D
+ 0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F141717171400000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000E1717171717150F0E0E0E0E0E
+ 0E0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0E0E0E0F0E0E0E0F0E13171717
+ 140F0E0F0E0E0E0F0E0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0C0D0D0C0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0D
+ 0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0D0E0F0E0E11171717170B000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000E1717171717150F0E0F0E0E0E0E0E0D0E0D0D0D0E0D0D0E
+ 0D0D0E0D0D0E0E0E0E0F0E0E0F0E1016171717171717130F0F0E0E0E0E0F0E0E
+ 0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0D0C0D0D
+ 0C0D0D0C0D0C0D0C0D0C0D0C0D0C0C0D0E0E0E0E0E0D0C0D0C0D0C0D0C0C0D0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E10161717170D00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000E1717
+ 171717150F0E0E0F0E0E0E0E0D0E0D0E0D0E0D0D0E0D0D0E0E0E0E0F0E0E0E0F
+ 0E141717171717171717171715110E0F0E0E0F0E0F0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0D0D
+ 0E0E0E0E0E0E0E0F0E0E0D0C0C0C0D0C0D0C0C0C0D0C0C0C0C0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0E0E0E0E0E171717171000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000E1717171717150F0E0E0E0F0E0E
+ 0E0E0D0D0D0D0E0D0D0E0E0E0E0F0E0E0E0F0E11161717171717171717171717
+ 171716130F0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0D0D0C0D0D0D0D0D0C0D0D0C0D0E0D0E0E0E0E0E0E0F0E0F0E0E0E0F0E0E0D
+ 0D0C0C0D0C0C0D0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F
+ 0E0E141717171400000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000E171717171716100E0E0E0F0E0E0E0E0D0E0D0D0E0D0E0E0E
+ 0E0E0E0F0E0F15171717171717160F13171717171717171717130F0E0F0E0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0D0E
+ 0E0F0E0E0E0F0E0F0E0E0E0E0E0F0E0E0E0E0F0E0D0D0C0C0C0C0C0C0C0D0C0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E11171717170B00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000E171717
+ 171716100F0E0E0E0F0E0E0E0D0E0D0E0E0E0F0E0F0E0E0E1317171717171717
+ 110B00000C1317171717171717150E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0E0E0E0E0E0F0E0E0E0E0F0E0F0E
+ 0E0E0F0E0F0E0E0E0E0D0D0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0F0E0E0F0F171717170D00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000E161717171717110E0F0E0E0E0E0E
+ 0E0D0E0E0F0E0E0E0E0F1016161717171717150C0000000000000B1016171717
+ 17170E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0D0D0D0D0C0D0E0F0E0F0E0E0E0F0E0E0E0E0F10131517110E0E0F0E0F0E0D0C
+ 0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E16
+ 1717171000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000C151717171717140E0E0F0E0E0F0E0E0F0E0E0E0F0E0F131717
+ 171717171710000000000000000000000B0F171717170F0E0F0E0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0E0E0E0E0E0E0F
+ 0E0E10131415171717171717110E0E0E0E0E0E0E0C0D0C0C0D0C0C0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F14171717140000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000}
+ OnClick = OnCloseClick
+ end
+ object Label1: TLabel
+ Left = 8
+ Top = 264
+ Width = 312
+ Height = 13
+ Caption = 'Copyright RemObjects Software, 2002-2008. All rights reserved.'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWhite
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ ParentFont = False
+ Transparent = True
+ OnClick = OnCloseClick
+ end
+ object lbl_Version: TLabel
+ Left = 0
+ Top = 31
+ Width = 500
+ Height = 16
+ Alignment = taCenter
+ AutoSize = False
+ Caption = '[]'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWhite
+ Font.Height = -13
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ ParentFont = False
+ Transparent = True
+ end
+ object Label7: TLabel
+ Left = 8
+ Top = 280
+ Width = 91
+ Height = 13
+ Caption = 'Visit our website at'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWhite
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ ParentFont = False
+ Transparent = True
+ end
+ object Label3: TLabel
+ Left = 102
+ Top = 280
+ Width = 136
+ Height = 13
+ Cursor = crHandPoint
+ Caption = 'http://www.remobjects.com'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWhite
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsUnderline]
+ ParentFont = False
+ Transparent = True
+ OnClick = Label3Click
+ end
+ object btn_Cancel: TButton
+ Left = 418
+ Top = 272
+ Width = 77
+ Height = 25
+ Cancel = True
+ Caption = 'btn_Cancel'
+ Default = True
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWhite
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ ParentFont = False
+ TabOrder = 0
+ OnClick = OnCloseClick
+ end
+end
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.lfm b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.lfm
new file mode 100644
index 0000000..48e442b
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.lfm
@@ -0,0 +1,4815 @@
+object AboutForm: TAboutForm
+ Left = 281
+ Height = 300
+ Top = 181
+ Width = 500
+ HorzScrollBar.Page = 499
+ VertScrollBar.Page = 299
+ ActiveControl = btn_Cancel
+ BorderIcons = []
+ BorderStyle = bsNone
+ Caption = 'About RemObjects SDK'
+ ClientHeight = 300
+ ClientWidth = 500
+ Font.Color = clWhite
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ OnClick = OnCloseClick
+ OnCreate = FormCreate
+ Position = poMainFormCenter
+ LCLVersion = '0.9.25'
+ object Image1: TImage
+ Height = 300
+ Width = 500
+ AutoSize = True
+ OnClick = OnCloseClick
+ Picture.Data = {
+ 07544269746D6170264E0200424D264E0200000000003604000028000000F401
+ 00002C0100000100080000000000F0490200C21E0000C21E0000000100000000
+ 000000000000000080000080000000808000800000008000800080800000C0C0
+ C000C0DCC000F0CAA600000000000B0B0B00151515001B1B1B00222222002B2B
+ 2B00333333003B3B3B00037F0100434343004B4B4B00535353005B5B5B006060
+ 60006A6A6A00727272007E7E7E000A81030017850800248A0D002C8D1000328E
+ 1200359014003B91160033921D003E9318003C96250037983200439419004996
+ 1B004D981C0053991E0044972300579B20005C9C2200539C2900449D3700629F
+ 24004FA03B0065A0250068A126006CA2280073A42A007AA72D007DA82E0067A3
+ 30006BA4310077A8360074AA3F007BAA3800429F40004DA244005BA5430062A7
+ 42006AAA450076AC44006FB15B0078B1540062AF600067B0620074B567007FB6
+ 61007DBA740080A92F0084AA31008BAC330087AE3C008BAF3D0091AE350094B0
+ 370095B038009BB23900A3B53C00A9B63E0083B24E008EB349009EB6450094B5
+ 4B009BB84E008CB5520085B5590090B95D00A2B74600AEB84000A3B94B00A8B9
+ 4800B3BA4200BABC4500A4BB5400B1BF560082BA6C009ABC610082BC760091BE
+ 7100C0BE4700C1BF4800ACC05E00B4C05700BEC15100B1C25F009AC27600AFC3
+ 6900BBC56500A3C57800BBCA7700BECB7800C4C04800CBC24B00D2C44D00D6C6
+ 5000D8C75000DCC85200E2CA5400E8CC5600ECCD5800F0CF5900F4D05B00F8D1
+ 5C00CDCB6A00D6CB6400D3CD6C00CBCD7300C4CD7B00DAD27800E8CF6000E4D0
+ 6900EDD36C00F4D36500F8D46600E3D27200EBD57500E3D57C00FAD87100FAD9
+ 7A00828282008D8D8D00929292009D9D9D0081BF8000A3A3A300ABABAB00B4B4
+ B400BEBEBE0088C1830096C6890098C99200A6C98400BDCD8200BFD18D00A1CE
+ 9C00ACD09A00BBD29500B8D49E00A9D1A200B3D5A600B8D7A800BED8AA00BFDF
+ BF00C1D28D00D3D58B00C0D49700CDD59200C4D59800CCD89C00D4DB9F00F4DA
+ 8200F8DC8400F0DC8B00E3DA9000ECDD9400F0DF9500ECE09E00F5E09700FAE2
+ 9800C2D7A200C1D9AB00C8DCAE00D6DCA000DADCA100D3DDA800D8DFAA00C0DE
+ BC00D0DFB100DEE0AC00CEE1BA00D3E0B200D9E1B400D6E3BD00E9E2A600F5E6
+ AB00F9E7AC00FBE8AD00ECE5B200F5E8B500FBEBB700F3EABE00FCEBB800C4C4
+ C400CDCDCD00C1DFC000D4D4D400DCDCDC00C7E1C200D7E6C800D1E7D000D3E8
+ D000DBEAD300E2E7C200E4EBCC00E9ECCE00F7ECC000FBEDC100F2EDC800FDF0
+ CC00E1ECD500ECEDD000F0EFD100EEF0DA00F4F0D300FAF2D500F5F3DD00F8F4
+ DE00E3E3E300EDEDED00E4F0E000EBF2E300F2F5E600FDF6E000F0F7EF00FCF8
+ E900F1F2F100F4F8F000FBFAF300FFFFFF000000000000000000F0FBFF00A4A0
+ A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF
+ FF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000010161717150E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0E11
+ 1717171717171717141311100E0C0B000000000B1617171717150E0E0E0E0E0E
+ 0E0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0C0D0E0E0E0E10171717170C00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000013
+ 171717150E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0F0E0E0E161717171717171717171717
+ 1717171713110F1417171717150F0E0F0E0F0E0E0C0D0D0D0D0D0D0D0C0D0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0D0E0F0E0E1317171717
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000D0B0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000013171717140E0E0F0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0E0E0F0E0E111717171717171717171717171717171717171717171716
+ 0F0E0F0E0E0E0E0D0D0C0D0D0C0D0D0D0D0C0D0C0D0D0C0D0D0C0D0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0C0D0E0E0F0E1317171714000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000F17160F0B00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000015171717130E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0F0E0E161617
+ 17171717171717171717171717171717171716100E0E0E0E0F0D0D0D0D0D0C0D
+ 0D0D0C0D0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0E0E
+ 0E0E0E1517171713000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000001117171717160F0B0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001717171713
+ 0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0F0E0E10101010131314151617171717
+ 171717171717100E0F0E0F0E0E0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D
+ 0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0D0C0E0E0F0E0E161717171000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000000B
+ 1117171717171717160F0B000000000000000000000000000000000000000000
+ 00000000000000000000000000000017171717100E0E0F0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0E0E0F0E0E0E0F0E0E0E0F0E0E0E0E0E0E0F10131415171717110E0E0E0E0E0E
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C
+ 0D0C0D0C0C0D0E0E0E0F0E171717170E00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000B1417171717171717171717160F
+ 0B00000000000000000000000000000000000000000000000000000000000000
+ 00000C17171717100E0F0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0F0E0E0E0F0E0E0E
+ 0F0E0F0E0F0E0E0E0F0E0E10100E0F0E0F0E0E0D0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0D0C0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0C0E0F0E0E1017
+ 1717170C00000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000C1516171717171617171717171717160F0B000000000000000000
+ 000000000000000000000000000000000000000000000C171717170F0E0E0E0F
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0E0E0E0E0F0E0E0E0F0E0E0E0F0E0E0E0F0E0E0E0E0F0E
+ 0E0E0E0E0E0E0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0D0E0E0E0F1116171717000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000C15171717171711
+ 0E111517171717171717160F0B00000000000000000000000000000000000000
+ 000000000000000000000E171717170E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0D0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E
+ 0E0E0E0F0E0E0F0E0E0E0E0F0E0E0F0E0F0E0E0E0F0E0F0E0E0E0C0D0D0D0D0C
+ 0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0C0D
+ 0C0D0F0E0E0E1317171715000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000C151717171717110E0E0F0E111517171717171717
+ 150E000000000000000000000000000000000000000000000000000000001016
+ 1717170E0E0F0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0E0E0E
+ 0E0E0E0E0E0E0F0E0E0E0E0F0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0D0E0F0E0E151717171300
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000E16
+ 17171717160F0F0E0E0E0E0E0F101617171717171717150E0000000000000000
+ 00000000000000000000000000000000000010171717150E0E0E0E0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0E0F0E0E0D
+ 0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0C0C0C0E0E0E0F0E161617171000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000E171717171716100E0E0F0E0F0E0E
+ 0E0F0E111517171717171717150E000000000000000000000000000000000000
+ 000000000B1016171717140F0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0E0D0D0E0D0E0D0E0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0D0C0D0D0D0C0D0D0D0C0D0D0D
+ 0D0C0D0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0C0C0D0C0D0C0D0C0D0C0E0F0E
+ 0E0E171717170F00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000E1717171717150F0E0E0F0E0E0E0F0E0E0E0E0E0F13161717171717
+ 1717150E0000000000000000000000000000000000000B10171717171717130E
+ 0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D
+ 0C0D0C0D0D0C0D0D0C0C0C0C0C0D0C0D0C0E0E0E0F10171717170C0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000E1717171717150F0E
+ 0F0E0E0E0F0E0E0F0E0F0E0E0E0E0F111617171717171717150E000000000000
+ 00000000000000000B0F1617171717171717130E0F0E0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C
+ 0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0C0D0C0D0C
+ 0D0C0D0C0D0F0E0E0E10171717170B0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000E1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0F0E
+ 0F0E0E0F0E131617171717171717150E00000000000000000000000F15171717
+ 1717171716100F0E0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0C0D0C0D0C0D0D0C0D0D0D0C0D0C0D0C0C0C0C0C0D0E0F0E0F131617
+ 1716000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000C1717
+ 171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0F0E0E0E0F1116171717
+ 17171717130C000000000000000C151717171717171716100F0E0E0E0F0E0E0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0D0E0E0E0E141717171300000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000C1517171717150F0E0E0E0E0F0E0E0E
+ 0E0E0E0D0E0E0E0E0F0E0E0E0F0E0E0E0F131617171717171717130C0000000B
+ 131717171717171716100F0E0E0E0F0E0E0E0F0D0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0C0C0C0C0D0C0D0C0D
+ 0E0E0F0E0E151717171100000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000C1517171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0F0E
+ 0E0E0F0E0E0E0F111617171717171717130C0F1517171717171716100F0E0E0E
+ 0F0E0E0E0F0E0E0D0E0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0D
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0D0C0D0C
+ 0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0E0E0E0F0E17171717100000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B1617171717150F0E0E
+ 0E0E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0F0E0E0E0F0E0E0E0F131717
+ 17171717171717171717171716130E0E0E0E0F0E0E0E0F0E0E0D0D0E0D0D0E0D
+ 0D0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0D0C0C0C0C0E0F0E0E0F171717170C0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000B1417171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0F0E0E0E0F0E0E0F0F13171717171717171717171714
+ 0E0E0F0E0F0E0E0E0F0E0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D0D0C0C0D0C0D0C0D0C0D0D0E0E0E0F
+ 10161717170B0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000141717
+ 171716100E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0E0E
+ 0E0F0E0E0E0E0E0F0F131717171717171715100E0F0E0E0E0E0E0F0E0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0D0D0E0D0E0D0D0D0E0D0D0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C
+ 0D0C0D0D0C0D0D0C0C0D0C0C0D0C0C0D0F0E0E0E131717171700000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001117171717160F0E0F0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0E0E0F0E0F0E0E0E0F0F13
+ 17171716130E0E0F0E0E0F0E0F0E0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D
+ 0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C
+ 0C0D0C0D0E0F0E0E141717171300000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000101617171717100E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0D0E0E0E0E0E0E0D0E0E0E0E0E0E0E0F0E0E0E0F0F13150F0E0F0E0E0E0F0E0E
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D
+ 0D0C0D0C0D0C0D0C0D0D0C0D0D0C0C0D0C0D0C0D0C0D0C0E0E0E0F0E15171717
+ 1300000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000E1717171717110E0E0E
+ 0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0E0E0E0E0F0E0E0E0E0F0E0E0E0E0E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C
+ 0D0D0C0D0C0C0C0D0C0D0C0E0E0F0E0E17171717100000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000C1517171717130E0F0E0F0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0E0E0E0F0E0F0E0E0E0F
+ 0E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0D0C0D0D0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0E
+ 0E0E0E0F171717170D0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000B151717
+ 1717140E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0E0E0D0E0E0D0E0E0D0E0E0E0E0E0E0E0F0E0E0E0E0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0C0C0C0C0F0E0F0E10171717170C000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001317171717150F0E0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0E0E0E0E0F0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C
+ 0D0C0D0C0D0C0D0E0E0E0E11171717170B000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000001017171717160F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0E0D0E0E0E0E0E0E0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0D0C0D0C0D0F0E0F0E13
+ 17171717140B0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000C1717171717100E0F0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0E0D0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0C0D0C
+ 0D0C0D0D0C0D0C0D0C0D0C0D0C0D0E0E0E0E0F131717171717160B0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000B1517171717130E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0E0D0E0E
+ 0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0C0C
+ 0C0C0E0E0F0E0E0E131717171717160D00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000131717
+ 1717140E0F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E
+ 0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0C0D0C0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0E0E0E0E0F0E0E101617
+ 171717170E000000000000000000000000000000000000000000000000000000
+ 00000000000000000C0E110E0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000F17171717160E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E
+ 0E0D0E0E0E0D0E0E0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D
+ 0C0D0C0C0C0D0C0D0C0C0C0E0E0F0E0E0F0E0F1617171717170E000000000000
+ 00000000000000000000000000000000000000000000000B0D0F141617171716
+ 0B00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000C17171717150E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0E0D0E0E0E0D
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0E0E0E0E0E0E0F0F1517171717170E0000000000000000000000000000000000
+ 000000000000000C0F1315161717171717171717130000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000001317171717110E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C
+ 0D0C0D0D0C0D0C0D0D0C0D0C0C0C0C0C0D0C0C0D0C0D0E0F0E0E0E0E0F151717
+ 171717110000000000000000000000000000000000000C0E1014171717171717
+ 1717171717171717171000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000B17171717160F0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0D0C0D
+ 0C0D0C0D0C0D0C0C0C0D0D0E0E0F0E0E0E0F1417171717171100000000000000
+ 00000000000B0D0F141517171717171717171717171717171717171717170C00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00001016171717130E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0D0C0D0C0C0C0D
+ 0E0E0F0E0E0E0F1317171717170E000000000000000C0F131516171717171717
+ 1717171717171717171615131013171717171400000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B15161717170F0F0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0D0C
+ 0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0E0E0F0E0E0E0F13171717
+ 17170E000C0E101417171717171717171717171717171717171513110F0E0E0E
+ 0E0E151717171710000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000E17171717150E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0C0C0D0C
+ 0C0D0C0D0C0D0C0D0C0C0E0E0E0F0E0E0E141717171717161717171717171717
+ 1717171717171717151411100E0E0E0F0E0F0E0F0E0E0F16171717170B000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 1317171717100E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0C0C0D0C0C0E
+ 0E0E0E0F0E0E1417171717171717171717171717171717171413100F0E0F0E0E
+ 0F0E0E0E0E0E0E0E0F0E0E111717171713000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000C16171717160E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0D0C
+ 0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0E0E0E0E0F0E0E1517171717
+ 17171717171717151410100E0E0F0E0E0E0E0E0F0E0E0F0E0F0E0F0E0E0E0F0E
+ 15171717170E0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000001117171717130E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C
+ 0C0D0C0C0D0C0D0C0D0E0E0E0E0E0F0E151717171717161413100E0E0E0F0E0E
+ 0E0E0E0F0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E101617171716000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000B1517
+ 1717160F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0C0D0C0D0D0C0D0D0C0D0C0C0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0D0E0E
+ 0F0E0E0E0F151413100F0E0E0E0E0E0F0E0E0E0F0E0F0E0E0E0E0E0F0E0E0D0D
+ 0C0C0C0D0E0F0E0E0E1317171717110000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000001016171717140E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0C0C0C0D0C0C0C0D0C0D0C0D0C0D0C0D0D0E0E0F0E0E0E0F0E0E0F0E0F
+ 0E0F0E0E0E0F0E0E0E0E0E0F0E0D0D0C0C0C0C0C0C0C0C0C0E0E0E0F0E0F1517
+ 1717170C00000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000015171717170F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D
+ 0C0C0D0C0C0C0D0C0E0E0E0E0F0E0E0E0F0E0E0E0E0E0E0F0E0E0E0E0E0D0D0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E1017171717130000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000C17171717
+ 150E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D
+ 0C0D0D0C0D0C0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0C0E0E0F
+ 0E0E0F0E0E0E0F0E0F0E0E0E0D0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0D0F0E0F0E0E14171717170E00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001317171717110E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0D0D0C0C0D0C0C0D
+ 0C0D0C0D0C0C0C0C0C0D0C0D0C0C0D0C0C0C0E0E0E0F0E0E0F0E0E0D0D0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F0F17171717
+ 1500000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000B17171717160E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0C0D0C0C0C0D0C0D0C0D0C0D0C
+ 0D0C0C0D0C0C0C0E0E0E0E0D0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0F0E0E0E0E13171717170F00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000001016171717130E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C
+ 0D0D0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0D0C0D0C0C0C0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D
+ 0F0E0F0E0F161717171600000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000B15171717160F0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C
+ 0D0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E11171717171000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000E17171717140F0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0D
+ 0C0D0D0C0D0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0C0C0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0D0F0E0F0E0E16171717150B000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000001417171717100E0F0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C
+ 0D0C0D0C0C0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0D
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E
+ 0F0E111717171711000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000C17171717150E0E0F0E0E0E0E0E0E0E0E0E0D0E0E
+ 0E0E0E0D0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0C0D0C0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0E16161717170B000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 1117171717110F0E0E0F0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D
+ 0C0D0D0C0D0C0D0C0C0D0C0D0C0C0D0C0D0C0C0C0C0D0C0D0C0C0D0C0D0C0D0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0E0F0E0F0E111717171710000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000B16171717160F0E0E0E0E0E
+ 0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0C0D0C0D0C0C
+ 0D0C0C0C0C0D0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0D0C0D0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0E
+ 1616171716000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000001016171717130E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0C0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C
+ 0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E111717171710000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000001517
+ 1717170F0E0F0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0C0D0D
+ 0C0D0C0D0C0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0D0E0E0F0E0E1616171716000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000D17171717150E0E0F0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0D0C0C0C0D0C0C0D0C0D0C0D
+ 0C0C0C0C0D0C0D0C0C0C0C0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F101717
+ 17170E0000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000001317171717100F0E0E0F0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C
+ 0D0D0C0D0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C
+ 0C0C0D0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E0E1617171715000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000C16171717
+ 160E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0E0E0E0F0E13171717170D0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001017171717130E0F0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0C0D0C0C0C0D0C0C0C0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0F1617171713
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000B15171717160F0E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0E0D0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D
+ 0C0D0C0D0C0C0D0C0C0C0D0C0D0C0C0C0C0C0C0D0C0D0C0D0C0D0C0C0C0C0D0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0E0F0E0E0E14171717170B0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000001117171717110E
+ 0E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0D0C0C0D0C0D0C0C
+ 0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E
+ 0F0E0E0F17171717100000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000B15171717160F0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E1517171716000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 1017171717110E0F0E0F0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0C0C0D0C0D0C0D0C0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0E0E0E0E0F10171717170E0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000B15171717160E0E0E0F0E0E0E
+ 0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0E0D0D0E0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0C0C0D0C0C0D0C0C0C0C
+ 0C0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0F0E0E
+ 0F16171717140000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000001017171717110E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0C0D0C0D0C0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C
+ 0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E0E0F151717171716000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000B1517171716
+ 0E0E0E0E0F0E0E0D0E0E0E0E0E0D0E0E0E0E0E0E0D0E0E0D0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0D0C0C0D0C0D0C0C0C0D0C0D0C0D0E15
+ 1415141514151415110C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0E0E0F0E0F0E0F1517171717150C000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000001017171717110E0F0E0E0E0E0E0E0E0E0D0E
+ 0E0E0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0C0C0E151A9197CFE8F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3
+ CFCF939114130C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E0E0F151717171716
+ 0B00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000015171717160E0E0E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0E0D0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D
+ 0C0D0D0C0D0C0C0D0C0C0C0C0C0C0C0C0C0D0C0C0C0D0C0C0E1791CFF0F3F3F3
+ F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3D29518130C
+ 0C0C0C0C0C0C0E0E0F0E0E0F0E1517171717160C000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000E17171717110E0F0E0E0E
+ 0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0C0D0C0F1693D2F3F3F3F3F3F3F3F3F3F0CFCF9091901614141414
+ 141414131990909507D2F3F3F3F3F3F3F3F3F3F0971A130C0C0E0E0F0E0E0E0F
+ 1517171717160B00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000014171717160F0E0E0E0F0E0E0E0E0D0E0E0E0E0D0E0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E
+ 0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D
+ 0C0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C101ACFF3F3F3F3
+ F3F3F3E8CF9116140C0C0C0C0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B0B0B0F
+ 131995D0F3F3F3F3F3F3F3E893180E0E0E0F0E1517171717160C000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000C171717
+ 17130E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D
+ 0D0C0D0C0D0C0D0C0D0C0F1AD2F3F3F3F3F3F3D29316100C0C0C0C0C0C0C0C0C
+ 0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B139097E9F3F3F3
+ F3F3F096140F1517171717160B00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000011171717170F0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0C1797F3F3
+ F3F3F3F096180F0C0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0C0B0C0B0B0C
+ 0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B1392D0F3F3F3F3F3E995181717150C
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000B0C0E17171717140E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C
+ 0D0C0D0C0D0D0C0D0C0D0C0D0C0F91E8F3F3F3F3E996170D0D0D0D0D0D0D0C0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0B0C0B0C0B0C0B0B0C0B0B0B0B0B0B0B0B0B0B0B
+ 0B000B0B000B00000E19D0F3F3F3F3F3CF900C00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000B0C1010131616171717171717100E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C10
+ 96E9F3F3F3F397190E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B
+ 0C0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B000B0010
+ 92E9F3F3F3F30714000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000C0D0F
+ 131317171717171717171717171717160E0F0E0E0E0E0E0E0E0E0E0E0E0D0E0E
+ 0E0E0D0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D1096F3F3F3F3F091110E0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0C
+ 0B0B0B0B0B0B0B0B0B0B0B000B0B000B00000B0000001707F3F3F3F3D3170000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000B0C0E10131517171717171717171717171717171717
+ 171717130E0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C
+ 0D0D0C0F95F3F3F3F3E8190E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D
+ 0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B0B
+ 000B0B000B0B000B000B00001093F3F3F3F3D311000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000B0C101013161617
+ 17171717171717171717171717171717171717171614130F0E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0F91E9F3F3F3E8190E0E0E
+ 0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C
+ 0C0B0C0B0C0B0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B000B0B000B00000B000B00
+ 00000EF7F3F3F3F3070F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000C0D0F1313171717171717171717171717171717171717171717
+ 171715141311100E0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E
+ 0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C
+ 0D0C0D0C0D0C0D0D17E8F3F3F3E8190E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0B0C0B0B0B
+ 0B0B0B0B0B0B0B0B0B0B000B0B000B0B000B00000B0000000EF7F3F3F3F3910B
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000B161717171717
+ 17171717171717171717171717171717151313100F0E0E0F0E0E0E0E0F0E0E0E
+ 0E0E0F0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D10CFF3F3F3F0
+ 190E0F0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C
+ 0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B0B00
+ 0B0B000B00000B00000B000000000E98F3F3F3E9170000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000D171717171717171717171717171717161413
+ 11100F0E0E0E0E0F0E0F0E0E0E0F0E0E0E0E0F0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0E0E0E0D0E0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0D0C0D0C0D0D0C1AF0F3F3F392100F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B
+ 0C0C0B0C0B0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B000B00000B00
+ 0000000013D3F3F3F3070D000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 001016171717171717171715141311100E0E0F0E0E0E0E0E0F0E0E0E0E0E0E0F
+ 0E0E0F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0E0E0E0F0E0E0F0E0E0E0F0E0E0E0F0E0E0E0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C10
+ CFF3F3F3D0130E0F0E0F0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B
+ 0B0B0B0B0B0B0B0B0B000B0B000B000B000B00000B0000000000F8F3F3F3E917
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000013171717161413100F0E0E
+ 0E0E0E0E0F0E0E0F0E0F0E0E0E0F0E0F0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0E0E0E0E0F0E0E0E
+ 0F0E0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C19F0F3F3F0900F0F0E0F0E0F0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B
+ 0B000B000B000B00000B00000000000E98F3F3F3960B00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000017171717130E0E0E0E0E0F0E0F0E0E0E0E0F0E0E0E0F0E
+ 0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D
+ 0D0D0D0E0D0D0E0D0E0E0E0E0E0F0E0E0E0E0F0E0E0E0F0E0E0F0E0E0E0F0E0F
+ 0E0F0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0D0C0F95F3F3F3D0130F0F0F0F0E0F0F0E0F0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B
+ 0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B
+ 000000000019F3F3F3E80F000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000C171717
+ 17100E0F0E0F0E0E0E0E0F0E0F0E0E0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0E0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0E0E0E0F
+ 0E0E0F0E0F0E0E0E0F0E0E0E0F0E0E0F0E0E0E0E0E0E0F0E0F0E0F0E0E0D0D0D
+ 0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0D10D2F3F3F3910F0F0F
+ 0F0E0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B
+ 0B0B0B0B0B0B0B0B000B0B000B0000000B000B000000000000000FD0F3F3F319
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000010161717170E0E0E0F0E0E0F0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0D0E0D0D0E0E0E0E0F0E0E0E0F0E0E0E0E0F111313151515
+ 151515141313100F0E0E0E0E0E0E0E0E0E0F0E0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0D0C0D0D0D0D0C0D15F0F3F3E8150F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C
+ 0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B
+ 000B0B000B00000B000000000000000C93F3F3F3930000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000013171717150F0E0E0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E
+ 0E0E0E0F0E0E0F0E0E0E1114151717171717171717171717171717171513100E
+ 0F0E0F0E0E0E0E0E0E0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D18F3F3
+ F398110F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C
+ 0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B00000B00000B000B00
+ 000000000017E9F3F3D00B000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000015171717130E0F0E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0E0E0F0E0E0E0F0E0F13161717
+ 1717171717171717171717171717171717171715110F0E0E0F0E0F0E0E0E0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C96F3F3F392100F0F0F0F0F0F0F0F0F0F
+ 0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B
+ 0B0B0B0B0B0B0B000B0B000B0B000B00000B00000000000000000FE8F3F3D30F
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000B16171717110E0E0E0E0E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0E0F0E0E0E0F0E0F141717171717171717171717171717171717
+ 17171717171717171716130F0E0E0E0E0F0E0E0E0C0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D96F3F3F01A100F100F0F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E
+ 0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B00
+ 0B000B000B00000B000000000000000BD0F3F3E90F0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000000C
+ 171717170F0F0E0F0E0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0F0E0E0E0F0E0F
+ 1317171717171717171717171313100F100F1013141717171717171717171716
+ 110F0E0E0E0E0F0E0E0C0D0D0D0D0C0D0D0D0C0D0D0ED2F3F3F015100F100F10
+ 0F100F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B
+ 0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B0000
+ 000000000BF7F3F3E90F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000010161717170E0E0E0E0E0F0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0E0E0E0E0F0E0E11161717171717171716110E0B00
+ 000000000000000000000C0F14171717171717171715100E0F0E0E0E0E0E0D0D
+ 0C0D0D0D0C0D0D0D0ED2F3F3F016100F100F100F100F0F0F0F0F0F0F0F0F0F0F
+ 0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B
+ 0B0B0B0B0B0B000B0B000B000B000B000B00000000000000000093F3F3F31700
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000011171717150E0F0E0F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0F
+ 0E0F0E0E0F1417171717171717130E0000000000000000000000000000000000
+ 000B101516171717171716110E0E0F0E0E0E0E0D0D0D0C0D0D0D0C0FD2F3F3D2
+ 11101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E
+ 0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C
+ 0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B
+ 0000000B00000B000000000000000091F3F3F317000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001417171714
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0F0E0E0E0E101517171717171713
+ 0C00000000000000000000000000000000000000000000000E15171717171717
+ 140E0E0F0E0E0E0E0D0D0D0C0D0D0FD2F3F3D2131010101010100F100F100F0F
+ 100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C
+ 0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B00000B0000000B000000
+ 0000000017F3F3F3110000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000017171717130E0F0E0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0E0E0E0E0F0E10161717171717150C00000000000000000000000000
+ 000000000000000000000000000010151717171717150F0E0E0F0E0E0E0C0D0D
+ 0D0CCFF3F3D31110101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F
+ 0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B
+ 0B0B0B0B0B000B0B000B000B000B000B00000000000000000017F3F3E90F0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000B17171717100E0E0F0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0E0F0E0E0E101617
+ 1717171710000000000000000000000000000000000000000000000000000000
+ 0000000B141717171717150F0E0E0E0F0E0D0D0D0D96F3F3D213101010101010
+ 101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B00
+ 0B000B00000B00000000000000001AF3F3E90F00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000C171717170F0E0F0E0E
+ 0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0E0E0E0F0E101617171717150D0000000000000000
+ 0000000000000000000000000000000000000000000000000011171717171715
+ 0F0E0E0E0E0E0D0D93F3F3F0131011101010101010101010100F100F100F100F
+ 0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E
+ 0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B
+ 0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B00000000
+ 00000093F3F3E90B000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000010161717170E0E0E0E0F0E0E0E0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0F
+ 0E0E0E0F1617171717160C000000000000000000000000000000000000000000
+ 00000000000000000000000000000E1717171717140F0E0F0E0E0E19F3F3E916
+ 11101010101010101010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F
+ 0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B
+ 0B0B0B0B000B0B000B000B000B000B00000000000000000093F3F3D00B000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000001017
+ 1717150E0F0E0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0E0E0F0E0F1517171717140B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000E1717171717130E0E0F0E16F3F3F31611101110111010101010101010
+ 1010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E
+ 0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C
+ 0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0000
+ 000B00000B0000000000000000D0F3F393000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000013171717150E0E0F0E0E0E0F0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0F0E0E0E0E1317171717160B000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000E1717171717100E
+ 0E13E9F3F3901111101110101110101010101010101010100F100F100F100F0F
+ 0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D
+ 0E0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C
+ 0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B00000B0000000B0000000000
+ 000BD0F3F31A0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000013171717130F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0E0E0E0F0E0F101717
+ 1717160B00000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000001016171717160E0FD2F3F39610111110111110
+ 101110101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E
+ 0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B
+ 0B0B0B000B0B000B000B000B000B000000000000000010E9F3F3110000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000017171717130E
+ 0E0F0E0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E
+ 0D0D0D0D0E0D0D0E0D0D0D0E0E0E0E0E0F15171717170E000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000013171717171393F3F3D01111111111101110111011101010101010101010
+ 10100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B00
+ 0B00000B0000000000000014F3F3E90B00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000017171717100E0F0E0E0E0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0E
+ 0F0E0F0E13171717171300000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B1517171792F3F3F014
+ 11111110111110111011101011101010101010101010100F100F100F0F0F0F0F
+ 0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E
+ 0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B
+ 0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B000000000000
+ 91F3F30700000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000C16171717100E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0E0E0E0E0F16171717150B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000D171718F0F3F31811111111111111111011101110
+ 1010101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E
+ 0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B
+ 0B0B000B0B000B000B000B000B0000000000000000D0F3F31900000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000111314131314131314131314100F100F0C0C0B0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000C171717170F0F0E0E0E0E
+ 0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D
+ 0D0E0D0D0E0D0E0F0E0F0E13171717170E000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 1317D0F3F3931111111111111111111110111011101110101010101010101010
+ 100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C
+ 0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0000000B
+ 00000B0000000000000EE9F3F30F000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000B17171717
+ 17171717171717171717171717171717151310100C0B00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000C171717170E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0E0E0E0E0F16
+ 1717171500000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000C93F3F3D213111111111111
+ 111111111110111011101110101010101010101010100F100F100F0F100F0F0F
+ 0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D
+ 0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C
+ 0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B00000B0000000B000000000014F3
+ F3D0000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000001017171717171717171717171717171717
+ 171717171717171717171713100E0C0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000101617
+ 17170E0F0E0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0E0E0F0E0E11171717170E0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000BF0F3F31711111111111111111111111111101110111010
+ 11101010101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E
+ 0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C
+ 0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B
+ 0B000B0B000B000B000B000B0000000000000096F3F31A000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000001617171717171717171717171717171717171717171717171717171717
+ 1717171713000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000010171717160E0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0D0E0E0E0F0E1517171715000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000096F3F393
+ 1311131111111111111111111111111011101110101010101010101010101010
+ 0F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B00
+ 000B00000000000CE9F3E90E0000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000E171717171413111313
+ 131514151514171717171717171717171717171717171717170B000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000010161717150E0F0E0E0E0E0E0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0E0E0F0E0E0F171717171000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000011F3F3D313111311131111111111111111
+ 1111111110111011101110101010101010101010100F100F100F100F0F0F0F0F
+ 0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D
+ 0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B
+ 0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B0000000019F3F398
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000013171717160E0E0F0E0E0E0E0F0E0E0E0E0E0E101011
+ 131415171717171717171717170D000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000010171717150E0E
+ 0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E
+ 0D0D0D0D0E0D0D0E0D0E0E0E0F11171717170B00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000D3F3F31913111313111311111111111111111111111110111011101110
+ 101010101010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F
+ 0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D
+ 0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B
+ 000B0B000B000B000B000B00000000000007F3F3110000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000B1717
+ 1717130F0E0E0E0F0E0E0E0E0F0E0F0E0E0E0F0E0E0E0E0E0F10131515171717
+ 1710000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000013171717150E0F0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0E0F0E0E
+ 0E14171717150000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000019F3F397131313111311
+ 131113111111111111111111111110111011101011101010101010101010100F
+ 100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C
+ 0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0000000B0000
+ 0B0000000010F3F3D30000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000010171717170F0E0E0F0E0E0F0E0F0E
+ 0E0E0E0F0E0E0E0E0F0E0F0E0E0F0E0E0E151717171300000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0013171717150E0E0E0F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0E0F0E0E1717171710000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000BF0F3F014131313111313111311111111111111111111
+ 11111110111011101010101010101010101010100F100F100F100F0F0F0F0F0F
+ 0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D
+ 0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B
+ 0B0B0B0B0B0B0B0B0B0B000B0B000B0B00000B0000000B00000093F3F3170000
+ 00000C0000000000000000000000000000000000000000000000000000000000
+ 000000000016171717140E0F0E0E0E0F0E0E0E0E0F0E0E0E0F0E0F0E0E0E0E0E
+ 0F0E0E0F0E131717171600000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000013171717140E0F0E0E0E0E
+ 0F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E
+ 0D0D0E0D0E0F0E0E0F171717170E000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000001AF3F3
+ F713131313131113131113111311111111111111111111111011101110111010
+ 1010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E
+ 0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C
+ 0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B00
+ 0B0B000B000B000B000B000000000CE9F3E90B000C1317150C00000000000000
+ 0000000000000000000000000000000000000000000000000E17171717110E0E
+ 0E0F0E0D0E0E0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0F0E0E10171717170B00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000013171717130E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0D0E0D0D0E0E0E0E0F10171717
+ 170C000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000BF0F3E8151313131313111311131311
+ 1113111111111111111111111110111011101110101010101010101010100F10
+ 0F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B
+ 0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B00000B
+ 000000F8F3F3921417171717160B000000000000000000000000000000000000
+ 00000000000000000000000013171717160E0F0E0E0E0E0D0D0D0D0D0D0D0E0D
+ 0E0D0E0D0E0E0E0E0E0E0E0E0F0F171717170D00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000131717
+ 17130E0F0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0E0D0D0E0D0E0E0F0E0E11171717170000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000001AF3F391131313131313131313111311131111111111111111111111
+ 111110111011101011101010101010101010100F100F100F0F0F0F0F0F0F0F0F
+ 0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D
+ 0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B
+ 0B0B0B0B0B0B0B0B0B000B0B000B000B000B0000000B000CE9F3F01817171717
+ 17160C000000000000000000000000000000000000000000000000000000000B
+ 17171717130E0E0F0E0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0D0D0D0D0E0E0E0F
+ 0E0E171717171000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000013171717130E0E0E0F0E0F0E0E0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0D0E0D0D0D0E
+ 0E0E0E0F13161717160000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000BF0F3E81313131313
+ 1313131311131311131113111111111111111111111111101110111010101010
+ 10101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B
+ 0B000B000B000B000B000000F8F3F396171717171717160B0000000000000000
+ 0000000000000000000000000000000000000011171717170F0F0E0E0E0E0E0D
+ 0D0E0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0E0E0E0E0F14171717130000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000013171717130E0F0E0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0E0D0D0E0D0E0D0D0E0D0E0D0E0F0E0E1317171713000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000001AF3F3911313131313131313131313111313111311
+ 13111111111111111111111110111011101110101010101010101010100F100F
+ 100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0D0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B
+ 0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0000000B00000B00
+ 0CE9F3E917171617171717170E00000000000000000000000000000000000000
+ 0000000000000B15171717150E0E0E0F0E0D0D0E0D0D0D0D0E0D0D0E0D0D0D0E
+ 0D0D0D0D0D0E0E0F0E0E13171717150000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000001417171716130F
+ 0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0E0E0E0E0F1117171713000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000000D3
+ F3F0141314131313131313131313131113131113111111111111111111111111
+ 1110111011101110101010101010101010100F100F100F0F100F0F0F0F0F0F0F
+ 0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D
+ 0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B
+ 0B0B0B0B0B0B0B0B000B0B000B0B00000B0000000090F3F3910F0F1617171717
+ 170E0000000000000000000000000000000000000000000000000E1717171711
+ 0E0F0E0E0E0E0D0D0E0D0E0D0D0E0D0D0D0E0D0D0D0D0D0E0D0E0E0E0E0F1116
+ 1717170B00000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000001717171717171714100E0E0E0F0E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0D0E0E0F0E0E
+ 1317171713000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000017F3F39513141313131313131313
+ 1313131311131311131113111111111111111111111110111011101011101010
+ 101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C
+ 0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B
+ 000B000B000B000B000CF3F3D20E0E0F1517171717170E000000000000000000
+ 000000000000000000000000000014171717160E0F0E0E0E0E0D0D0E0D0D0D0E
+ 0D0D0E0D0E0D0D0E0D0E0D0D0D0D0E0F0E0E0F171717170C0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0016171717171717171715110E0E0E0F0E0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0E0E0E0F111717171300000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000D0F3F31514131413141313131313131313131311131113111311
+ 111111111111111111111110111011101010101010101010101010100F100F10
+ 0F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D
+ 0E0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C
+ 0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B000B000B000000F7F3
+ F3160E0E0F1517171717170F0000000000000000000000000000000000000000
+ 000C17171717130E0E0E0F0E0D0E0D0D0E0D0E0D0E0D0D0E0D0D0D0D0D0D0D0D
+ 0D0E0E0E0E0F0E17171717100000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000B0E151717171717171717
+ 16130F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0E0D0D0E0E0F0E0E131717171600000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000FF3F398131413
+ 1413131413131313131313131313131113111311131111111111111111111111
+ 10111011101110101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F
+ 0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B
+ 0B0B0B0B0B0B0B000B0B000B000B000B000010F3F3960F0E0E0F151717171717
+ 11000000000000000000000000000000000000000011171717170F0E0F0E0E0E
+ 0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D0E0F0E0E0E1517171713
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000E13171717171717171716140F0E0F0E0E0F0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0E0E0E0E0F11171717
+ 1700000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000093F3F318141413141314131313131313131313
+ 1313131113131111131111111111111111111111111011101110111010101010
+ 1010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E
+ 0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B00
+ 0B000B000B0000D0F3F3100E0E0E0F1417171717171100000000000000000000
+ 00000000000000000B15171717150E0E0E0F0E0D0E0D0D0E0D0D0E0D0E0D0D0E
+ 0D0D0E0D0E0D0D0D0D0D0E0E0E0F0E1417171714000000000000000000000000
+ 000000000000000000000000000000000000000B0B0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000C1117171717171717171714100E0E0E0E0E0E0F0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0D0E0D0E0D0D0D0D0F0E0E0E10171717170C00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00E9F3E814141414131413141314131313131313131313131113131111131111
+ 1111111111111111111110111011101011101010101010101010100F100F100F
+ 0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E
+ 0D0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B
+ 0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B00000B000B17F3F3190F
+ 0E0E0E0F1317171717171100000000000000000000000000000000000E171717
+ 17100F0E0E0E0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0E0D0D0E
+ 0F0E0E1117171717000000000000000000000000000000000000000000000000
+ 0000000000000E16150F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000B10161717171717
+ 17171715110F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0D0E0D0E0D
+ 0E0F0E0E0F171717170D00000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000014F3F3931414131414131413
+ 1413131313131313131313131311131311111311111111111111111111111110
+ 111011101010101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F
+ 0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D
+ 0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B
+ 0B0B0B0B0B0B000B0B000B0B000B000CE9F3D20E0F0E0E0E0F13171717171713
+ 0B00000000000000000000000000000014171717160E0E0F0E0E0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0E0E0E0E0F10171717170C000000
+ 0000000000000000000000000000000000000000000000000B13171717171300
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000B0E15171717171717171715130F0E0E0E0E
+ 0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0E0D0E0E0E0F0E0E16171717100000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000093F3F3171414141414131414131413141313131313131313
+ 1313111313111311131111111111111111111111101110111011101010101010
+ 10101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E
+ 0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C
+ 0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B
+ 00000B00F7F3F3110E0F0E0E0E0F131717171717140B00000000000000000000
+ 0000000C17171717130E0E0E0F0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D
+ 0E0D0D0D0D0D0D0E0F0E0E0E171717170F000000000000000000000000000000
+ 00000000000000000000001017171717171717160C0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000E13171717171717171716140F0E0F0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D
+ 0E0D0D0D0D0D0D0D0E0E0E0E0F14171717140000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000E9F3CF14
+ 1414141414141314131413131413131313131313131313111313111311111111
+ 11111111111111111110111011101110101010101010101010100F100F100F0F
+ 100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D
+ 0E0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C
+ 0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B000B15F3F3900E0E0F0E
+ 0E0E0F111717171717140B00000000000000000000000011171717170F0E0F0E
+ 0E0E0D0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0E0E0E0F0E
+ 15171717110000000000000000000000000000000000000000000000000C1417
+ 1717171717171717171000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000C11161717
+ 17171717171714100E0E0E0E0F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0E0D0E0D0F0E0E
+ 0E11171717170B00000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000014F3F39114141414141414141413141314
+ 1313131313131313131313131113131113111311111111111111111111111011
+ 1011101011101010101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F
+ 0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D
+ 0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B
+ 0B0B0B0B0B000B0B000B00000BE9F3CF0E0E0E0F0E0E0E0F101717171717140B
+ 000000000000000000000B15171717140E0F0E0E0E0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0E0E0E0E0E141717171400000000000000
+ 0000000000000000000000000000000B1017171717171717171717171717130B
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000B1015171717171717171716110E0E
+ 0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0E0D0D0E0D0E0D0E0D0E0F0E0F0F171717170F0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000093F3F31714141414141414141413141413141314131313131313131313
+ 1311131113111311111111111111111111111110111011101010101010101010
+ 101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0B
+ 00F7F3F30F0E0E0E0F0E0E0E0F101717171717160B0000000000000C0E101417
+ 171717100F0E0E0F0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0E0D0D0D
+ 0D0D0D0E0E0F0E0E131717171700000000000000000000000000000000000000
+ 00000D16171717171717150F10161617171717160B0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000B0E15171717171717171716130F0E0E0E0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D
+ 0D0D0D0D0E0E0E0E0E0E15171717150000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000E9F3D3151414141414
+ 1414141414131413141313131313131313131313131313111311131113111111
+ 111111111111111110111011101110101010101010101010100F100F100F100F
+ 0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E
+ 0E0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B
+ 0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000B0017F3F3190E0E0E0E0F0E0E
+ 0E0F101717171717160B000C0F131617171717171717160E0E0E0F0E0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0E0E0F0E10171717
+ 170C0000000000000000000000000000000000000B1317171717171716110E0F
+ 0E0F141717171717170E00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000D13
+ 171717171717171717140F0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E0E0F0E0E1117
+ 1717170D00000000000000000000000000000000000000000000000000000000
+ 000000000000000000000FF3F395151414141414141414141414141314131413
+ 1413131313131313131313111313111113111111111111111111111111101110
+ 11101110101010101010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F
+ 0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D
+ 0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0C0B0B0B0B0B0B0B0B
+ 0B0B0B0B000B0B000B0CF3F3960E0E0E0E0E0E0F0E0E0E101617171717161517
+ 17171717171717171717130E0F0E0E0E0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E
+ 0D0D0D0D0E0D0D0D0D0D0D0D0F0E0E0E0F161717170E00000000000000000000
+ 000000000000001015171717171717140F0F0E0E0E0E0E111717171717171100
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000C1116171717171717171715
+ 100E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0E0D0E0D0E0E0E0F0E0F16171717130000000000000000
+ 00000000000000000000000000000000000000000000000000000000000019F3
+ F319141415141414141414141414141314141314131413131313131313131313
+ 1113131111131111111111111111111111111011101110101110101010101010
+ 1010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E
+ 0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C
+ 0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B000BD0F3
+ E80E0E0E0D0E0E0E0E0F0E0E0F16171717171717171717171717171717170F0E
+ 0E0E0F0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0E0E0F0E0E16171717100000000000000000000000000000000C141717171717
+ 1716100E0E0E0E0F0E0F0E0E10161717171717130B0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000B101517171717171717160E0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0E0F0E0E0E14171717170D00000000000000000000000000000000000000
+ 00000000000000000000000000000000000096F3F01514151414141414141414
+ 1414141413141314131313131313131313131313131113131111131111111111
+ 1111111111111110111011101010101010101010101010100F100F100F100F0F
+ 0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E
+ 0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C
+ 0B0C0B0B0B0B0B0B0B0B0B0B0B0B000B0B0090F3F3110E0E0E0D0E0E0E0E0F0E
+ 0E101617171717171717171717151413100F0F0E0F0E0E0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0E0E0E0E0F14171717150E0B
+ 00000000000000000000000B1017171717171717130F0E0F0E0F0E0E0E0E0F0E
+ 0E0F151717171717140B00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0B0E151717171717170E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E
+ 0E0E0D0E0E0E0E0D0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0E0D0E0D0E0D0E0E0E0F0E0F17171717
+ 150B000000000000000000000000000000000000000000000000000000000000
+ 000000000000E9F3CF1514151415141414141414141414141414131413141314
+ 1313131313131313131311131311131113111111111111111111111110111011
+ 101110101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E
+ 0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D
+ 0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0B0C0B0B0B0B0B0B0B0B0B
+ 0B0B0B000B0B13F3F3190E0E0E0D0E0E0E0E0E0F0E0E0F161717171717151310
+ 0F0E0E0E0F0E0E0E0E0E0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0E
+ 0D0D0D0D0D0D0D0D0E0E0F0E0E13171717171715110C00000000000000000D16
+ 171717171717150F0E0E0E0E0E0E0E0E0F0E0E0E0F0E0E141717171717150B00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000D13171717170F0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0D0E0E0E0D0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0D0D0E0D0E0D0E0D0E0D0E0E0E0E0E13171717171000000000000000000000
+ 000000000000000000000000000000000000000000000000000FF3F396141514
+ 1514151414141414141414141414131413141313141313131313131313131311
+ 1313111311111111111111111111111111101110111011101010101010101010
+ 10100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0B0C0C0B0C0B0C0B0C0B0F0B0B0B0B0B0B0B0B0B0B000B0BF3F3960E0D
+ 0E0E0D0E0E0E0E0E0E0F0E0F151514100F0E0E0E0E0F0E0E0E0F0E0F0E0E0E0D
+ 0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E
+ 0F101617171717171717140E000000000B1317171717171716110E0F0E0F0E0F
+ 0E0F0D0D0D0E0F0E0E0E0F0E111717171717160B000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000C17171717100E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0E0E
+ 0E0F0E0F0E16171717170C000000000000000000000000000000000000000000
+ 0000000000000000000000000017F3F31A151514151414151414141414141414
+ 1414141413141314131313131313131313131313111313111311131111111111
+ 11111111111110111011101011101010101010101010100F100F100F0F0F0F0F
+ 0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D
+ 0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0B0C0C0B0C0B0C0B0B0D
+ 95970B0B0B0B0B0B0B0B0B0B0B000BD0F3D20E0E0D0E0E0D0E0E0E0F0E0E0E0E
+ 0E0F0E0E0E0E0F0E0E0E0F0E0E0E0E0E0F0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0F0E0E0E0F15171717171717171717
+ 150E0B0E16171717171717140F0F0E0E0E0E0E0E0E0D0D0C0D0C0E0E0F0E0E0E
+ 0F101617171717160C0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0017171717110F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0E0D0D0E0E0E0E0E0F1017171717160B
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0091F3F315151514151514151414141414171414141414141314141314131413
+ 1313131313131313131113111311131111111111111111111111111011101110
+ 1010101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E
+ 0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0B0C0C0B0C0DD2F3F00B0B0B0B0B0B0B0B0B0B
+ 0B0B0092F3F30E0E0E0D0E0E0D0E0E0E0E0F0E0F0E0E0E0F0E0E0E0F0E0E0E0F
+ 0E0F0E0E0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0E0D0D0D0D0D
+ 0D0D0D0D0D0E0E0F0E0E0E0F131616171717171717171717171717171716100E
+ 0E0E0E0F0E0F0E0E0C0D0C0D0D0C0D0E0E0E0F0E0E0E101617171717150C0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000014171717130E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0D0E
+ 0D0E0D0E0D0E0D0D0E0E0F0E0E0E1417171717140B0000000000000000000000
+ 00000000000000000000000000000000000000000007F3D31515151514151415
+ 1415141414D29815141414141413141314131314131313131313131313131311
+ 1311131113111111111111111111111110111011101110101010101010101010
+ 100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C
+ 0B0C0C0B0C11E8F3F3F3110B0B0B0B0B0B0B0B0B0B0B0B19F3F3160D0E0E0D0E
+ 0E0D0E0E0E0E0E0E0E0F0E0E0F0E0E0E0F0E0E0E0E0D0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0F0E0E
+ 0E0E1114171717171717171717171717130F0E0F0E0F0E0E0E0E0D0C0D0D0C0D
+ 0C0D0C0D0D0E0E0E0F0E0E0F1617171717160B00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000013171717150E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E
+ 0E0E0E0D0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0D0D0D0D0D0E0D0E0E0E0E
+ 0F0E0F1517171717140B00000000000000000000000000000000000000000000
+ 000000000000000000E9F3D015151415151514151415141514F3F3F090141414
+ 1414141314131413131313131313131313131311131311111311111111111111
+ 111111111110111011101110101010101010101010100F100F100F0F100F0F0F
+ 0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D
+ 0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0B11F0F3F3F3F31A0B
+ 0C0B0B0B0B0B0B0B0B0B0B13F3F3190E0E0D0E0E0D0E0E0D0E0E0F0E0E0E0F0E
+ 0E0E0E0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D
+ 0D0D0D0E0D0D0D0D0D0D0D0D0D0E0E0F0E0E0E0F0E0E0E0E0F13161717171717
+ 1717150F0E0E0E0E0E0E0E0E0D0D0D0D0D0C0D0D0C0D0D0C0D0D0E0F0E0E0F0E
+ 101617171717160B000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000101617
+ 17160E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0E0D0D0E0D0E0D0E0D0E0D0D0D0E0E0E0E0E0E101617171717140B00
+ 000000000000000000000000000000000000000000000000000000000BF3F396
+ 15151515151514151514151419F3F3F3F3CF1514141414131414131413141313
+ 1313131313131313111313111113111111111111111111111111101110111010
+ 11101010101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E
+ 0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C
+ 0D0C0C0C0C0C0C0C0C0C0B17F0F3F39FF3F3950B0B0B0B0B0B0B0B0B0B0B0B0B
+ F3F3910E0D0E0E0D0E0E0D0E0E0D0E0F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0E0E0E0F0E0E0F0E0F0E0E0E0F111617171716130E0F0E0F0E0F0E0F0D0D
+ 0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0E0E0F0E0E0E0F1517171717160B000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000D171717170F0E0E0E0F0E0E0E0E0E
+ 0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E0D
+ 0E0D0D0E0D0D0E0E0F0E0E0E101717171717160B000000000000000000000000
+ 0000000000000000000000000000000011F3F391151515151515151415141415
+ 91F3F3F3F3F3F090141414141314131413131413131313131313131313111313
+ 1111131111111111111111111111111011101110101010101010101010101010
+ 0F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C0C0C18F3
+ F3F39A02A7F3CF0B0C0B0C0B0B0B0B0B0B0B0B0BD3F3CF0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0E0E0E
+ 0F0E0E0F0E1316150F0E0E0E0E0E0E0E0E0D0D0D0D0C0D0D0C0D0C0D0C0D0D0C
+ 0D0D0C0D0E0E0E0F0E0E0F1517171717160B0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000B17171717100F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0E0D0E0E0E0F0E0E
+ 0E111717171717170F0000000000000000000000000000000000000000000000
+ 0000000017F3F31A15151515151515151514151495F3F370E3F3F3F3CF151414
+ 1414131413141313131313131313131313131113131113111311111111111111
+ 1111111110111011101110101010101010101010100F100F100F100F0F0F0F0F
+ 0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D
+ 0D0D0D0D0D0D0D0D0C0C0D0C0C0C0C0C0C18F3F3F34402129FF3F30C0B0B0B0B
+ 0B0B0B0B0B0B0B0B07F3CF0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0F0E0E0E0F0E0E0E0E0E0E0F0E0F
+ 0E0F0E0E0C0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0C0C0D0E0E0E0E0F0E0F
+ 1617171717160000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000016171717130E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0E0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0E0F0E0E0E11161717171717130C00
+ 0000000000000000000000000000000000000000000000001AF3F31515151515
+ 1515151515141515D2F3EC605DAEF3F3F3F09014141413141413141314131313
+ 1313131313131311131311131111111111111111111111111110111011101110
+ 101010101010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F
+ 0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C0C0D
+ 0C0C0C0C18F3F3F34412121294F3F30F0C0B0C0B0C0B0B0B0B0B0B0B95F3F30E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0E0E0F0E0E0E0F0E0F0E0E0E0E0E0E0E0D0C0D0D0D0D0D0C0D0D
+ 0C0D0C0D0D0C0D0C0D0C0D0C0C0D0E0E0F0E0E0E0F1617171717140B00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000013171717150E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0E0E0E0F0E0E0E1016171717171717110B0000000000000000000000
+ 00000000000000000000000096F3F315151515151515151515151415D2F3DB60
+ 5D5D70E3F3F3F3CF151414131413141313131313131313131313131311131311
+ 131113111111111111111111111110111011101011101010101010101010100F
+ 100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0C0C0D0C0C19F3F3F34412121212
+ 3CF3F3140C0B0B0C0B0B0B0B0B0B0B0B90F3F30E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0F0E
+ 0E0E0E0F0E0F0E0E0D0D0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C
+ 0D0C0D0E0E0E0F0E0E101617171717140B000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000010161717170E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0E0D0D0E0D0E0E0E0F0E0E0E
+ 0F1417171717171717110C0000000000000000000000000000000000000B0E14
+ D2F3D216151515151515151515151514F3F3C16060605D5DAEF3F3F3F0901414
+ 1413141314131413131313131313131313111311131113111111111111111111
+ 11111110111011101010101010101010101010100F100F100F100F0F0F0F0F0F
+ 0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D
+ 0D0D0D0D0D0D0D0C0C0D18F3F3F3441B1212121225F3F3180B0C0B0B0C0B0B0B
+ 0B0B0B0B18F3F3150E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0F0E0E0E0E0E0E0D0D0D0C0D
+ 0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0C0E0E0E0F0E0E0F16
+ 171717170F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000C17171717100E0F0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0E0E0F0E0E0F0E13171717171717171715
+ 100D0000000000000000000000000B0E13151717D2F3D2151615151515151515
+ 15151515F3F3BC606060605D5D70E3F3F3F3CF15141413141314131413131313
+ 1313131313131311131113111311111111111111111111111011101110111010
+ 1010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E
+ 0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0C19F3F3
+ F3441B1B121B121212F3F3910B0C0B0C0B0C0B0C0B0B0B0B14F3F3150E0E0D0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0D0E0D0D0E
+ 0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0E0F0E0E0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D
+ 0C0D0D0C0D0C0D0C0D0C0D0C0D0E0E0E0E0F0E15171717170B00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000B16171717110E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0E0D0E0D0E0E0F0E0E0E0E0F151717171717171717171714130F100F100F1010
+ 1316171717171717F1F3D015151615151515151515151519F3F3A96160606060
+ 5D5D53AEF3F3F3F0901414131413141313131313131313131313131113131111
+ 1311111111111111111111111110111011101110101010101010101010100F10
+ 0F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D15F3F3F3441B1B1B121B121212F3F391
+ 0B0C0C0B0B0B0C0B0B0B0B0B14F3F3150E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0E0D0D0D0E0D0D0E0D0D0D0D0E0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E
+ 0C0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0C0D0C0D0C
+ 0C0E0E0F0E0E1017171717110000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000E17
+ 171717140F0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0E0E0E0F0E0E0E
+ 0E101517171717171717171717171717171717171717171717171717F3F39616
+ 15161515151515151515151AF3F3836161606060605D5D536BDBF3F3F3CF1514
+ 1314131413141313131313131313131311131311111311111111111111111111
+ 111110111011101011101010101010101010100F100F100F0F0F0F0F0F0F0F0F
+ 0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D0D0D
+ 0D0D0D13F0F3F3451B1B1B1B1B121B1212D6F3CF0C0B0C0B0C0B0B0C0B0B0B0B
+ 11F3F3900E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E
+ 0D0E0D0D0E0D0D0E0D0E0D0D0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D
+ 0C0D0D0C0D0D0C0D0D0C0D0D0C0C0D0C0C0D0C0D0C0E0E0E0E0F14171717170B
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000E1717171717150E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0D0D0D0D0D0E0E0E0E0F0E0F0E0E0E101417171717171717
+ 17171717171717171717171717171715F3F3961615161516151515151515151A
+ F3F383616161606060605D5D5353ABF2F3F3F091141413141313131313131313
+ 1313131313111313111113111111111111111111111111101110111010101010
+ 10101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0D0D0D0D0D11E9F3F3451B1B1B1B1B
+ 1B1B121B12A7F3CF0C0C0B0C0C0B0C0B0C0B0C0B0BF3F3910E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C0D
+ 0C0D0C0D0C0C0C0D0D0F0E0F0E0F171717171100000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000E1717171717150F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D
+ 0D0D0D0E0E0E0E0E0E0F0E0E0E0F101417171717171717171717171717171717
+ 1613100FF3F3961615161516151515151515151AF3F38368616161606060605D
+ 5D53536BDBF3F3F3D21614131413141313131313131313131313111313111311
+ 13111111111111111111111110111011101110101010101010101010100F100F
+ 100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0D0E0D0E0D0D0D0D0D0FD2F3F39F1C1B1B1B1B1B1B1B1B121BA7F3CF0C0C0B0C
+ 0B0C0B0C0B0B0B0B0BF3F3910E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0D0D0E0D0D0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D
+ 0D0C0D0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0D0C0C0C0D0C0D0C0D0E0E0E0E
+ 0E14171717170B00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000E1717171717150F0E
+ 0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0D0D0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0E0E0F0E0E0E0F
+ 0E0E0F0E0E10111315151717171716151413100F0E0F0E0EF3F3961616151615
+ 1615161515151593F3F3806868616161606060605D5D535353ABF2F3F3F09313
+ 1413141314131313131313131313131113131113111111111111111111111111
+ 1110111011101110101010101010101010100F100F100F0F100F0F0F0F0F0F0F
+ 0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0D0D97F3F3
+ A31B1B1C1B1B1B1B1B1B1B1B12D1F3CF0C0C0C0B0C0C0B0B0C0B0C0B0BF3F391
+ 0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C
+ 0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0D0E0F0E0F0F1717171713000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000E1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0D0D0D0D0E0D0D0D0D0D0E0E0E0F0E0E0E0F0E0E0E0F0E0E0E0E0E0E
+ 0E0E0E0F0E0E0F0E0E0E0E0FF3F39615161615161516151515151596F3F36869
+ 6868616161606060605D5D53535363DBF3F3F3D0171413141313131313131313
+ 1313131311131311131113111111111111111111111110111011101011101010
+ 101010101010100F100F100F0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E93F3F3D61D1C1B1C1B1B1B1B1B1B1B1B
+ 1BA7F3CF0C0C0C0C0B0C0C0B0C0B0B0C0BF3F3910E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0C0D
+ 0C0D0C0E0E0E0E0E14171717170C000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000E1717
+ 171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D
+ 0D0D0D0D0E0E0E0F0E0E0E0F0E0E0E0F0E0F0E0F0E0F0E0E0E0F0E0E0F0E0E0E
+ F3F39616161615161615161516151596F3F37474686868616161606060605D5D
+ 53535352ABF2F3F3F09514131413141313131313131313131311131113111311
+ 111111111111111111111110111011101010101010101010101010100F100F10
+ 0F100F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D
+ 0E0D0E19F3F3EE1D1C1C1B1C1B1C1B1B1B1B1B1B1BD1F3CF0C0C0C0C0C0B0C0C
+ 0B0C0B0B0CF3F3910E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D
+ 0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0C0D0C0C0C0C0D0F0E0F0E0F16171717
+ 1300000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000E1717171717150F0E0E0E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0E0E0E0E0E
+ 0F0E0E0E0F0E0E0E0E0E0E0F0E0E0E0F0E0E0F0EF3F396161616161516151615
+ 15151596F3F3747474696868616161606060605D5D535353525FD9F3F3F3D318
+ 1314131313131313131313131313131113111311131111111111111111111111
+ 10111011101110101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F
+ 0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0D0E14E9F3F32E1C1C1C1C1B
+ 1C1B1C1B1B1B1B1B1BD1F3CF0C0C0C0C0B0C0C0B0C0B0C0B0BF3F3910E0E0D0E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E
+ 0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C
+ 0D0C0C0D0C0D0C0D0C0D0E0E0E0E0E13171717170E0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000E1717171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0D0D0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0E0D0E0E0F0E0E0E0E0F0E0F0E0E0E
+ 0F0E0E0E0E0E0D0DF3F39616161616161516151615161593F3F3827474746968
+ 68616161606060605D5D535353535273F2F3F3F3951314131413131313131313
+ 1313131113131111131111111111111111111111111011101110111010101010
+ 1010101010100F100F100F0F100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E
+ 0E0E0E0E0E0E0E0E0E0FD2F3F3461C1C1C1C1C1C1B1C1B1C1B1B1B1B1BD1F3CF
+ 0C0C0C0C0C0C0C0B0C0C0B0C0BF3F3910E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0C0D0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0C0D0D0D0C0D0C0D0C0D0C0D0E0E
+ 0F0E0F1617171715000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000E1717171717150F0E0E
+ 0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0E0E0E0E0E0E0E0E0E0E0E0D0E0D0D0D0D0DF3F39616
+ 161616161615161615161590F3F38575747474686868616161606060605D5D53
+ 535352525FD9F3F3F3E819141314131313131313131313131113131111131111
+ 1111111111111111111110111011101011101010101010101010100F100F100F
+ 0F0F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E0E0E0E0E0E0E0E96F3F3
+ A31C1C1C1C1C1C1C1C1B1C1B1C1B1B1B1BD1F3CF0C0C0C0C0C0C0B0C0C0B0C0B
+ 0CF3F3910E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0E0E0E0E0F11171717170E00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000E1717171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DF3F3961616161616161615161515161A
+ F3F3857575747474696868616161606060605D5D53535352525270ECF3F3F396
+ 1513131313131313131313131311131311111311111111111111111111111110
+ 111011101010101010101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F
+ 0E0F0F0E0F0F0E0E0F0E0E0E0E0E0E0E19F3F3D71E1C1C1C1C1C1C1C1C1C1B1C
+ 1B1C1B1B1BD1F3CF0C0C0C0C0C0C0C0C0C0B0C0C0BF3F3910E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0C0C
+ 0C0C0C0C0D0E0F0E0E0E16161717150000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000E171717
+ 1717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0E0D0D0D0D
+ 0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0DF3F39616161616161616161516161590F3F385757575747474696868
+ 616161606060605D5D5353535252525FBDF3F3F3F09014131313131313131313
+ 1313111313111311131111111111111111111111101791939393181010101010
+ 10101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E0E0F0E0E
+ 0E0E0E14F0F3EE2E1D1C1D1C1C1C1C1C1C1C1C1B1C1B1C1B1BD7F3CF0C0C0C0C
+ 0C0C0C0C0B0C0C0B13F3F31A0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0E0E0E0F0E111717
+ 1717100000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000E1717171717150F0E0E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D
+ 0E0D0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DF0F3D01616161616
+ 1616161615161590F3F3B275757575747474696868616161606060605D5D5353
+ 53535252516DE3F3F3F3D2161413131313131313131313111313111311111111
+ 1111111111111596F0F3F3F3F3F3F3F0971410101010101010100F100F100F0F
+ 100F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F0E0E0E10D2F3F3461D1C1D1C1C
+ 1C1C1C1C1C1C1B1C1B1C1B1C1BF3F3930C0C0C0C0C0C0C0C0C0C0C0B14F3F315
+ 0E0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D
+ 0D0D0E0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0D0C0D
+ 0D0C0D0C0D0C0D0C0D0C0D0C0E0F0E0E0E16171717150B000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000E1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0D0E0D0D0E0D0E0D0D0E0D0D
+ 0E0D0D0D0E0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0DCFF3D216161616161616161616151615F3F3C676
+ 76757575747474696868616161606060605D5D5353535252525251ADF2F3F3F0
+ 9513131313131313131313131113131113111311111111111597F3F3F3F3F3F3
+ F3F3F3F3F3F395131010101010100F10100F100F0F0F0F0F0F0F0F0F0F0F0F0F
+ 0F0E0F0E0F0E0E0F0E0E93F3F3A31D1D1C1D1C1D1C1C1C1C1C1C1C1C1C1B1C1B
+ 1BF3F3910C0C0C0C0C0C0C0C0C0C0B0C14F3F3150E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0E
+ 0E0E0E0F10171717171000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000E1717171717150F0E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ CFF3D217161616161616161616161516F3F3CA76767575757574747469686861
+ 6161606060605D5D535353535252515262DAF3F3F3D319131313131313131313
+ 131113111311131111111493F0F3F3F3D5713A2F2F3A6ED5F3F3F3D315101010
+ 1010100F100F100F100F0F0F0F0F0F0F0F0F0F0F0E0F0F0E0F0F0E0E0F18F3F3
+ EA221D1D1D1C1D1C1D1C1C1C1C1C1C1C1C1C1B1C25F3F31A0C0D0C0C0C0C0C0C
+ 0C0C0C0C18F3F3150E0E0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E
+ 0D0D0E0D0D0E0D0D0D0E0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0D0E0F0E0E0E1517171716000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000E1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D
+ 0E0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D96F3F3161716161616161616
+ 16161615D3F3E477767676757575747474696868616161606060605D5D535353
+ 52525252515172F2F3F3F398151313131313131313131311131113111318E8F3
+ F3F3D55B323231312F2F2C2C5AE0F3F3F016101010101010100F100F100F100F
+ 0F0F0F0F0F0F0F0F0F0F0F0E0F0E0F0E10F0F3F3301D1D1D1D1D1C1D1C1D1C1C
+ 1C1C1C1C1C1C1C1B3DF3F3150D0C0D0C0C0C0C0C0C0C0C0C90F3F30E0D0E0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D
+ 0E0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C
+ 0D0C0D0C0D0C0E0E0E0F0E101717171711000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000E17171717
+ 17150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D
+ 0E0D0D0E0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D91F3F317161716161616161616161616D2F3EF7776767676
+ 757575747474696868616161606060605D5D5353535352525251515CBDF3F3F3
+ F0921313131313131313131113131114CFF3F3F3F171333333323231312F2F2F
+ 2C37B9F3F3F016101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0E0F
+ 0F0E0F0ED0F3F3661D1D1D1D1D1D1D1C1D1C1D1C1C1C1C1C1C1C1C1C99F3F310
+ 0D0C0C0D0C0C0C0C0C0C0C0C93F3F30D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0E0F0E0E0E15
+ 171717170B000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000E1717171717150F0E0E0E0E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D1AF3F31A
+ 17161716161616161616161696F3F37777777676757575757474746968686161
+ 61606060605D5D535353525252525151516ADAF3F3F3E8191313131313131313
+ 111392F0F3F3F3B83B3434333333323231312F2F2C2C2CB9F3F3E81310101010
+ 10100F10100F100F0F100F0F0F0F0F0F0F0F0F0F0F0E0F92F3F3D41E1E1D1D1D
+ 1D1D1D1D1C1D1C1D1C1C1C1C1C1C1C1B9BF3F30D0C0D0D0C0D0C0C0C0C0C0C0C
+ 07F3D20E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D
+ 0C0D0D0C0D0C0D0C0C0D0C0D0C0E0E0E0E0F0F17171717110000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000E1717171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D15F3F390171716171616161616161616
+ 92F3F38D787777767676757575747474696868616161606060605D5D53535352
+ 525252515151519DF2F3F3F3D01913131313131319D3F3F3F3E0653434343433
+ 333333323231312F2F2F2C2CB9F3F3D0101010101010100F10100F100F0F0F0F
+ 0F0F0F0F0F0F0F0F0E0F15F3F3EE231E1D1E1D1D1D1D1D1D1D1C1D1C1D1C1C1C
+ 1C1C1C1CD1F3D20D0D0C0D0C0C0D0C0C0C0C0C0CE8F3CF0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E
+ 0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0C0D0C0D0C0D0D0C0D0C0C0C0C
+ 0C0E0F0E0E0E14171717170B0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000E1717171717150F0E0E0E0E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0E
+ 0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D10F3F39716171716171616161616161690F3F3B57878777776767575
+ 7575747474696868616161606060605D5D535353525252525151515156ADF3F3
+ F3F3CF19131692D3F3F3F3F1AA3535353434343433333333323231312F2F2C2C
+ 2CD5F3F393101010101010100F100F100F100F0F0F0F0F0F0F0F0F0F0F10E8F3
+ F3421E1E1E1E1D1E1D1D1D1D1D1D1C1D1C1D1C1C1C1C1C1CF3F3960D0D0D0C0D
+ 0D0C0D0C0C0C0C0CF3F3910E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0D0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0D0E0E0F0E0F171717171300
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000E1717171717150F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DF3F30717171717
+ 161716161616161616F3F3CD7978787777767676757575747474696868616161
+ 606060605D5D53535352525252515151515062C5F3F3F3F3F3F3F3F3F3F3C04C
+ 36363535343434343434333333323231312F2F2F2C37F1F3F318101010101010
+ 10100F100F100F100F0F0F0F0F0F0F0F0F96F3F39F1F1E1E1E1E1E1D1D1D1D1D
+ 1D1D1D1C1D1C1D1C1C1C1C2EF3F31A0D0D0D0D0C0D0C0C0D0C0C0C15F3F3190E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C
+ 0D0D0C0D0C0D0C0D0E0F0E0E0E14171717170C00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000E1717171717
+ 150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D
+ 0E0D0E0D0E0D0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0DCFF3E817171717171617161616161616D2F3EF
+ 797978787777767675757575747474696868616161606060605D5D5353535252
+ 52525151515150516FDAF3F3F3F3F3EBAC574A49493636353535343434343333
+ 3333323231312F2F2C2C5AF3F3E81310101010101010100F100F100F100F0F0F
+ 0F0F0F0F1AF3F3D81F1F1E1E1E1E1E1E1D1E1D1D1D1D1D1D1C1D1C1D1C1C1C48
+ F3F3150D0D0D0D0D0C0D0D0C0D0C0C18F3F3150E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0D0E0E0E0F
+ 0E17171717170C00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000E1717171717150F0E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0E0D0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D93F3F31717171717171617161616161697F3F3877979787877777676767575
+ 75747474696868616161606060605D5D535353525252525151515150504F5E9E
+ AC9E624B4A4A4A4A494936363535343434343433333333323231312F2F2F2CA2
+ F3F3931010101010101010100F100F100F0F100F0F0F0F13F0F3EE3E1F1F1F1F
+ 1E1E1E1E1E1D1E1D1D1D1D1D1D1C1D1C1D1C1CA3F3F30D0D0D0D0D0D0D0C0D0C
+ 0C0D0C93F3F30E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0D0C
+ 0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0D0F0E0E0E0E1317171717130000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0E1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D19F3F39017171717171716
+ 171616161691F3F3B37A79797878777776767575757574747469686861616160
+ 6060605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A494936
+ 363535353434343434333333323231312F2F2C37EBF3F3161010101010101010
+ 100F100F100F0F0F0F0F0FD2F3F3642020201F1F1F1E1E1E1E1E1D1D1D1D1D1D
+ 1D1D1C1D1C1D1CEEF3CF0D0D0D0D0D0D0D0D0C0D0D0C0DCFF3D20E0E0D0E0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D
+ 0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D
+ 0C0D0C0C0E0E0F0E0E0E15171717170F00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000E1717171717150F0E0E0F0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D
+ 0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D13F3F39517171717171717161716161618F3F3CD7A7979
+ 7978787777767676757575747474696868616161606060605D5D535353525252
+ 525151515150504F4E4E4E4B4B4B4A4A4A4A4949363635353434343434333333
+ 33323231312F2F2F5AF3F3D0101010101010101010100F100F100F100F0F95F3
+ F3BF20211F201F1F1F1F1E1E1E1E1E1D1E1D1D1D1D1D1D1C1D1C2EF3F3920D0D
+ 0D0D0D0D0D0D0D0C0D0C0CF3F3960E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0E0E0F0E0E1017
+ 171717150B000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000B1717171717150F0E0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DF3F3
+ D017171717171717171617161716D2F3F27A7A7A797978787777767675757575
+ 747474696868616161606060605D5D535353525252525151515150504F4E4E4E
+ 4B4B4B4B4A4A4A494936363535353434343433333333323231312F2F2CA2F3F3
+ 91101010101010101010100F100F100F1018F3F3EA2A2121202020201F1F1F1E
+ 1E1E1E1E1D1E1D1D1D1D1D1D1C1D48F3F3140E0D0D0D0D0D0D0D0D0D0C0D15F3
+ F3F80E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0E0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0E0E0F0E0E13171717171100000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001517171717
+ 0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0E0D0E0D0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DCFF3F11717171717171717171617
+ 161695F3F38C7A7A7A7979787877777676767575757474746968686161616060
+ 60605D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A49493636
+ 3535343434343434333333323231312F2F38F1F3F01310101010101010101010
+ 0F100F1013F0F3F33F232121212020201F1F1F1F1E1E1E1E1E1D1D1D1D1D1D1D
+ 1D1CD7F3E80E0D0E0D0D0D0D0D0D0D0D0D0C91F3F3140D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0C0D0C0D0C0D0D0C0D0C0C0C0C0C0D0C
+ 0C0D0E0E0E0E0F0E16161717170C000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000F17171717100E0E0E0F0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E
+ 0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0E0D0D
+ 0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D91F3F39017171717171717171716171619F3F3CB7B7A7A7A7979
+ 78787777767675757575747474696868616161606060605D5D53535352525252
+ 5151515150504F4E4E4E4B4B4B4B4A4A4A494936363535353434343433333333
+ 323231312F2F6EF3F30710101010101010101010100F1011D2F3F36E23232121
+ 2121202020201F1F1F1E1E1E1E1E1D1E1D1D1D1D1D24F3F3960E0D0E0D0E0D0D
+ 0D0D0D0D0D0DCFF3F00E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0D0C0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0E0F0E0E0E10171717
+ 1713000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000B15171717140F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D13F3F3951817
+ 1717171717171717161716E8F3EF7A7B7A7A7A79797878777776767575757574
+ 7474696868616161606060605D5D535353525252525151515150504F4E4E4E4B
+ 4B4B4A4A4A4A494936363535343434343433333333323231312F2FD5F3F39010
+ 101010101010101010100F97F3F3A52326232321212121202020201F1F1F1E1E
+ 1E1E1E1D1E1D1D1D1D48F3F3180D0E0E0D0E0D0D0D0D0D0D0D0FF3F3960D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C
+ 0C0D0C0D0C0C0C0C0D0C0D0D0E0E0F0E0E15171717170C000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000011171717170F0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0DF0F3D21717171717171717171717161795
+ F3F3B17B7B7A7A7A797978787777767676757575747474696868616161606060
+ 605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A4949363635
+ 35353434343434333333323231312F3AF1F3F0151010101010101010101091F3
+ F3D82D2623262323212121212020201F1F1F1F1E1E1E1E1E1D1D1D1D1DEAF3F0
+ 0E0E0D0E0D0E0D0E0D0D0D0D0D17F3F3190E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C0C0D
+ 0E0E0E0E0F0F1617171715000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000C16171717130E0E0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0E
+ 0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D96F3F31818171717171717171717171619F3F3DC7C7B7A7A7A7A797978
+ 787777767675757575747474696868616161606060605D5D5353535252525251
+ 51515150504F4E4E4E4B4B4B4A4A4A4A49493636353534343434343333333332
+ 3231312F9CF3F3D31310101010101010101AF3F3F14026262626232323212121
+ 21202020201F1F1F1E1E1E1E1E1D1E1D3EF3F3930E0E0E0E0D0E0D0E0D0D0D0D
+ 0D96F3F3110E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D
+ 0D0C0D0D0C0D0C0C0D0C0C0C0D0C0D0C0C0D0C0C0D0E0F0E0E0E141717171717
+ 1717171717151313140F100F0F0C0C0C0B000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0013171717160F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0E0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D19F3F3931718171717
+ 1717171717171716D2F3F3887C7B7B7A7A7A7979787877777676767575757474
+ 74696868616161606060605D5D535353525252525151515150504F4E4E4E4B4B
+ 4B4B4A4A4A494936363535353434343433333333323231312FC2F3F307101110
+ 101010101AF3F3F343272727262626262323212121212020201F1F1F1F1E1E1E
+ 1E1E1D1EA3F3F3110E0E0E0E0E0D0E0D0E0D0D0D0DF0F3D20E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0E0E0E0F0E0F1617171717171717171717171717171717
+ 1717171717171717131413130000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000E17171717130E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D
+ 0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0FF3F3D01717181717171717171717171793F3F3C7
+ 7B7B7B7B7A7A7A79797878777776767575757574747469686861616160606060
+ 5D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A494936363535
+ 3434343434343333333232313138E0F3F3D0131010101397F3F3F36727272727
+ 2626262623232321212121202020201F1F1F1E1E1E1E1E22F3F3CF0E0E0E0E0E
+ 0E0D0E0D0E0D0E0D17F3F3900E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C0D0C0E0E
+ 0E0E0E1317171717171717171717171717171717171717171717171717171717
+ 0D00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000015171717160E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 97F3F31917171817171717171717171716E9F3F27C7C7B7B7B7A7A7A79797878
+ 7777767676757575747474696868616161606060605D5D535353525252525151
+ 515150504F4E4E4E4B4B4B4B4A4A4A4949363635353534343434333333333232
+ 313138E0F3F3F0969395F0F3F3F1672828282827272726262626232321212121
+ 2020201F1F1F1F1E1E1E1E9AF3F3190E0E0E0E0E0E0E0E0D0E0D0E0D96F3F311
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C
+ 0D0D0C0C0C0D0C0D0C0D0C0C0D0C0D0C0C0D0D0F0E0F0E0F1617171717171717
+ 1717171717171717171717171717171717171717110000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000F17
+ 171717110E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0E0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D19F3F3931817171817171717
+ 171717171796F3F3B67C7C7C7B7A7A7A7A797978787777767675757575747474
+ 696868616161606060605D5D535353525252525151515150504F4E4E4E4B4B4B
+ 4A4A4A4A4949363635353434343434333333333232313138D5F3F3F3F3F3F3F3
+ E041292828282827272727262626232323212121212020201F1F1F1F1E1E24EE
+ F3E80E0E0E0E0E0E0E0E0E0E0D0E0D0EE9F3D20E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D
+ 0D0C0D0D0D0C0D0D0D0D0D0C0D0D0C0D0C0D0C0D0C0C0D0C0D0C0C0D0C0D0C0D
+ 0C0C0D0C0D0C0D0E0E0E0E0E0E0E0E0F10101010131313141514151717171717
+ 1717171717171717160000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000B15171717160E0E0E0E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E
+ 0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0E0D0D0D
+ 0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0FE9F3E81718171718171717171717171718F0F3EF7D7C7C
+ 7C7B7B7A7A7A797978787777767676757575747474696868616161606060605D
+ 5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A49493636353535
+ 3434343434333333323231312F6EE0F3F3F3E06E292B29292928282827272727
+ 262626232323212121212020201F1F1F1F1E9AF3F3920E0F0E0E0E0E0E0E0E0E
+ 0D0E0D19F3F3900E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0C0D0D0C0D0C0D0D0C0D0C0C0D0C0C0D0C0D0C0D0C0D0C0C0D0C0D0F0E0F0E
+ 0F0E0E0E0E0E0E0F0E0E0E0E0E0F0E0E0E0E0F101010131313171717170D0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000001016171717110E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D96F3F3
+ 901718171718171717171717171796F3F3B67D7C7C7C7B7A7A7A7A7979787877
+ 77767675757575747474696868616161606060605D5D53535352525252515151
+ 5150504F4E4E4E4B4B4B4A4A4A4A494936363535343434343433333333323231
+ 31312F2C2C2C2C2B2B2B29292929282828272727272626262323232121212120
+ 20201F1F1F24EEF3F0100E0E0E0E0E0E0E0E0E0E0E0E0ECFF3F30F0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E
+ 0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0C0D
+ 0C0C0D0C0C0D0C0C0C0D0C0D0C0C0C0C0E0E0E0E0E0F0E0F0E0F0E0E0E0F0E0F
+ 0E0E0E0F0E0E0E0E0E0E0E0F0E16171717110000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000B15171717
+ 160E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D15F3F3CF1817181717181717171717
+ 171718F1F3EF897D7C7C7B7B7B7A7A7A79797878777776767675757574747469
+ 6868616161606060605D5D535353525252525151515150504F4E4E4E4B4B4B4B
+ 4A4A4A494936363535353434343433333333323231312F2F2F2C2C2C2B2B2B29
+ 29292928282827272727262626232323212121212020201F1F9AF3F3920F0E0E
+ 0F0E0E0E0E0E0E0E0E0E11F3F3960E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D
+ 0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0D
+ 0C0D0C0C0E0E0F0E0E0E0E0E0E0E0E0F0E0E0E0E0E0F0E0E0F0E0F0E0F0E0E0E
+ 0E14171717150000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001016171717110E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0DE8F3F0191718171817171817171717171797F3F3C77D7D7C7C7B
+ 7B7B7A7A7A797978787777767675757575747474696868616161606060605D5D
+ 535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A4949363635353434
+ 34343434333333323231312F2F2C2C2C2C2B2B2B292929292828282727272726
+ 2626232323212121212020202AEEF3F0100F0E0F0E0E0E0E0E0E0E0E0E0E93F3
+ F3150E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0E0D0D0D0E0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0D0C0C0C0C0E0D0E0E0E0E0E
+ 0F0E0E0E0F0E0F0E0E0E0F0E0E0E0E0E0E0F0E0F0E10171717170C0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000B15171717160E0F0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D19F3F3961817
+ 181717181717171717171718F1F3F2897D7D7C7C7C7B7A7A7A7A797978787777
+ 767676757575747474696868616161606060605D5D5353535252525251515151
+ 50504F4E4E4E4B4B4B4B4A4A4A49493636353535343434343333333332323131
+ 2F2F2F2C2C2C2B2B2B2929292928282827272727262626232323212121212020
+ A4F3F31A0E0F0E0E0F0E0F0E0E0E0E0E0E0FF0F3E80E0D0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0D0C0D0D0C0C0D0C0D0C0C0C0D
+ 0C0D0C0D0C0C0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0D0C0D0C0E0D0D0E0E
+ 0E0E0E0F0E0E0E0E0E0F17171717100000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000001016171717110E
+ 0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0FE9F3E91817181718171718171717171717
+ 95F3F3DD7E7D7D7C7C7C7B7B7A7A7A7979787877777676757575757474746968
+ 68616161606060605D5D535353525252525151515150504F4E4E4E4B4B4B4A4A
+ 4A4A494936363535343434343433333333323231312F2F2C2C2C2C2B2B2B2929
+ 292928282827272727262626232323212121213EF3F3E80F0E0F0F0E0E0F0E0E
+ 0E0E0E0E0E92F3F3190E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D
+ 0D0C0D0D0C0D0C0D0D0C0D0C0D0C0C0C0D0C0D0C0D0C0C0D0C0D0C0D0C0C0C0D
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0E0E1417
+ 1717140000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000B15171717160F0E0E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D91F3F3931817181718171718171717171717E8F3F3AF7E7D7D7C7C7C7B
+ 7A7A7A7A797978787777767676757575747474696868616161606060605D5D53
+ 5353525252525151515150504F4E4E4E4B4B4B4B4A4A4A494936363535353434
+ 343434333333323231312F2F2F2C2C2C2B2B2B29292929282828272727272626
+ 26232323212121D8F3F3170F0F0E0F0E0F0E0F0E0F0E0E0E0EE8F3F00F0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0D0C
+ 0C0D0C0D0C0D0C0C0C0D0C0D0C0C0D0C0D0C0C0C0C0D0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0F11171717170B0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00001016171717130E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0EF3F3E91818171817
+ 18171718171717171791F3F3EF8A7E7D7D7C7C7B7B7B7A7A7A79797878777776
+ 7675757575747474696868616161606060605D5D535353525252525151515150
+ 504F4E4E4E4B4B4B4A4A4A4A494936363535343434343433333333323231312F
+ 2F2C2C2C2C2B2B2B2929292928282827272727262626232323219AF3F3980F0E
+ 0F0F0F0E0F0E0E0F0E0E0E0E19F3F3910E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D
+ 0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0E0E0E0E0F171717170E0000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B15161717160F0E0E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E
+ 0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D96F3F393181718171817181717181717171797F3
+ F3CC7E7E7D7D7C7C7C7B7A7A7A7A797978787777767676757575747474696868
+ 616161606060605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A
+ 4A494936363535353434343433333333323231312F2F2F2C2C2C2B2B2B292929
+ 292828282727272726262623233FF3F3F0110F0F0F0E0F0F0E0F0F0E0F0E0F0E
+ E8F3F00F0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0D0E0E0E0E0E0E0F0E0E0E0E0E0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C
+ 0D0C0D0C0D0D0C0D0C0D0C0C0C0C0D0C0C0C0C0C0D0C0D0C0D0C0C0C0C0D0C0D
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0E0E1617171711
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000E17171717140E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0E0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 10F3F3E9181817181817171817171718171718E9F3F3B07E7E7D7D7C7C7B7B7B
+ 7A7A7A797978787777767675757575747474696868616161606060605D5D5353
+ 53525252525151515150504F4E4E4E4B4B4B4A4A4A4A49493636353534343434
+ 3434333333323231312F2F2C2C2C2C2B2B2B2929292928282827272727262626
+ 23D8F3F3180F0F0F0F0F0F0F0E0F0E0F0E0F0E92F3F3910E0E0E0D0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0E0F0E
+ 0E0E0F0E0E0E0F0E0F0E0E0E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0C0C0C0D0C
+ 0D0C0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0E0E0E0F0E1417171715000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 1417171717100F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0D0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0E0D0E0E0D0E0E0D0E0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C91F3F39618181718171817
+ 1817171717171791F3F3F28A7E7E7D7D7C7C7B7B7B7A7A7A7979787877777676
+ 76757575747474696868616161606060605D5D53535352525252515151515050
+ 4F4E4E4E4B4B4B4B4A4A4A494936363535353434343433333333323231312F2F
+ 2F2C2C2C2B2B2B29292929282828272727272626A0F3F3980F0F0F0F0F0F0F0E
+ 0F0F0E0F0E0E10F0F3F00F0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0E0E0E0E0F0E0E0F0E0E0F0E0E0E0E0E0E0F0E
+ 0E0E0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D
+ 0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C
+ 0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E
+ 0E0E0E11171717170B0000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000C17171717150E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0F0E0F0E
+ 0E0E0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0EF0F3F119181718181718171817181717171797F3F3E5
+ 7F7E7E7D7D7C7C7B7B7B7A7A7A79797878777776767575757574747469686861
+ 6161606060605D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A
+ 494936363535343434343433333333323231312F2F2C2C2C2C2B2B2B29292929
+ 2828282727272747F3F3F0110F0F0F0F0F0F0F0F0F0F0E0F0E0F92F3F3910E0E
+ 0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0E0E0F0E0E0E0F0E0E0E0E0F0E0F0E0F0E0E0E0F0E0F0E0E0E0E0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0D0C
+ 0D0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0C0C0D0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0F0E0F0E0F171717170D000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000001317171717110F0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0E0E0E0F0E0F0E0F0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D91F3
+ F398181817181817181717171817171717E8F3F3CC7F7E7E7D7D7C7C7C7B7A7A
+ 7A7A797978787777767676757575747474696868616161606060605D5D535353
+ 525252525151515150504F4E4E4E4B4B4B4B4A4A4A4949363635353534343434
+ 34333333323231312F2F2F2C2C2C2B2B2B29292929282828272740F1F3F3170F
+ 0F0F0F0F0F0F0F0F0F0E0F0F0E13F3F3E80F0E0E0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0E0F0E0E0E0E0F0E0E0E0F0E10
+ 10111110100F0E0F0E0E0E0F0E0F0E0E0F0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0C0D0C0D0C0C0C0C0D0C0C
+ 0C0C0D0C0D0C0C0C0C0C0C0D0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0E0E0E0E0E1617171710000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000B1617
+ 1717160F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E
+ 0E0E0F0E0F0E0F0E0E0E0E0E0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0DE8F3F390181817181718171817
+ 171817171718F1F3F3B77F7E7E7D7D7C7C7C7B7B7A7A7A797978787777767675
+ 757575747474696868616161606060605D5D535353525252525151515150504F
+ 4E4E4E4B4B4B4A4A4A4A494936363535343434343433333333323231312F2F2C
+ 2C2C2C2B2B2B292929292828282DD8F3F3910F0F100F0F0F0F0F0F0F0F0F0F0F
+ 0ED0F3F3190E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0E0D
+ 0D0E0D0D0E0E0E0E0E0F0E0F0E0E0F13141617171717171717171715110F0E0E
+ 0E0E0E0F0E0E0E0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D
+ 0C0D0C0D0C0D0C0D0D0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0C
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E
+ 1517171713000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000001016171717140E0F0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0F0E0E0F0E0E0E0E0E10111415150F0E
+ 0F0E0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0E0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C17F3F3D317181818181718171817171817171791F3F3F38F7F
+ 7E7E7D7D7C7C7C7B7A7A7A7A7979787877777676767575757474746968686161
+ 61606060605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A49
+ 4936363535353434343433333333323231312F2F2F2C2C2C2B2B2B2929292928
+ 28D8F3F3970F100F0F0F0F0F0F0F0F0F0F0F0F0E18F3F3CF0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0E0E0F0E0E0E0E0E
+ 10151717171717171717171717171717171715110F0E0E0E0E0F0E0E0E0C0D0D
+ 0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0D0C0C0D0C0D0C0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E131717171700000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000001517171717100E0E0F0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0F
+ 0E0E0F0E0E0E0F0E0F111315171717171717150F0E0E0F0E0E0E0E0E0D0E0E0D
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0DCFF3F396
+ 18181718181718171817171817171793F3F3F28F7F7E7E7D7D7C7C7C7B7B7A7A
+ 7A797978787777767675757575747474696868616161606060605D5D53535352
+ 5252525151515150504F4E4E4E4B4B4B4A4A4A4A494936363535343434343434
+ 333333323231312F2F2C2C2C2C2B2B2B29292929A5F3F3D21110100F100F0F0F
+ 0F0F0F0F0F0F0F10F0F3F3140E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0E0E0F0E0E0F0E1016171717171717171717171717
+ 171717171717171715110F0E0E0E0E0F0E0E0D0D0D0D0C0D0D0D0D0C0D0D0D0D
+ 0C0D0D0D0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D
+ 0C0D0C0C0C0C0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0D0E0E0E0E10171717170C000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000C17171717
+ 160F0E0E0E0E0E0E0F0E0F0E0E0E0E0E0F0E0E0E0E0F0E0E1013141616171717
+ 17171717171717150F0E0E0E0F0E0E0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D
+ 0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D10F0F3F01A1818171818171817181717
+ 1817171798F3F3F28F7F7E7E7D7D7C7C7C7B7A7A7A7A79797878777776767675
+ 7575747474696868616161606060605D5D535353525252525151515150504F4E
+ 4E4E4B4B4B4B4A4A4A494936363535353434343433333333323231312F2F2F2C
+ 2C2C2B2B2B2929A6F3F3E8130F100F100F100F100F0F0F0F0F0F0F95F3F3910E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0F
+ 0E0E0E0F0E141717171717171717171717171717171717171717171717171510
+ 0E0F0E0E0E0E0E0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0D
+ 0C0D0D0C0C0D0C0C0C0C0C0C0C0D0C0C0C0D0C0C0D0C0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0F0E0F0E0F171717
+ 170D000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000001017171717140F0E0F0E0F0E0E0E0E0F
+ 0E0F0E0E0E0F0E101113151717171717171717171717171717171717150F0E0E
+ 0E0E0E0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0D1AF3F3D318181817181817181718171718171717CFF3F3ED8A7F7E
+ 7E7D7D7C7C7C7B7B7A7A7A797978787777767675757575747474696868616161
+ 606060605D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A4949
+ 36363535343434343433333333323231312F2F2C2C2C2C2B2B2BA6F3F3F01610
+ 10100F100F100F0F0F0F0F0F0F0F18F3F3E80F0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0E0E0E0E0E0F0E101617171717171717
+ 15100D0C000000000C0D0F141717171717171717110E0E0F0E0E0E0E0C0D0D0D
+ 0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0D0C0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E161717171000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000B1516171717100E0E0E0E0E0F0E0E0E0E0E0F111314171717171717
+ 1717171717171717171717151717171717150F0E0F0E0E0F0E0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0CCFF3F3961818
+ 1817181817181718171718171717CFF3F3ED8E7F7E7E7D7D7C7C7C7B7A7A7A7A
+ 797978787777767676757575747474696868616161606060605D5D5353535252
+ 52525151515150504F4E4E4E4B4B4B4B4A4A4A49493636353535343434343433
+ 3333323231312F2F2F2C2C2C2BB9F3F3F0161010100F10100F100F100F0F0F0F
+ 0F11F0F3F3150E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0E0E0E0F0E0E0E1117171717171717110C000000000000000000000000
+ 0B1015171717171717140E0E0F0E0E0E0E0C0D0D0D0D0C0D0D0D0D0C0D0D0D0D
+ 0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0D0C0C0D0C0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0E0E0F0E0E151717171300000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000D17171717160F
+ 0E0F0E0E0E0F10131416171717171717171717171717171717171613100C0000
+ 0E1717171717150F0E0E0F0E0E0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0D0D10F0F3F39018181818171818171817181717
+ 181717CFF3F3F28F7F7E7E7D7D7C7C7C7B7B7A7A7A7979787877777676757575
+ 75747474696868616161606060605D5D535353525252525151515150504F4E4E
+ 4E4B4B4B4A4A4A4A494936363535343434343433333333323231312F2F2C2C2C
+ B9F3F3F0161010101010100F10100F100F100F0F0FD0F3F3910E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0D0E0E0F0E0E0F111617
+ 17171717110B000000000000000000000000000000000B0F161717171717140E
+ 0E0F0E0E0E0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0C0D0C0D0D0C0C
+ 0D0C0C0D0C0D0C0D0C0C0D0C0D0C0C0D0C0C0C0D0C0C0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E14171717130000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000001117171717140E0F11141517171717171717
+ 1717171717171717171713100E0B000000000000000E1717171717150F0E0E0E
+ 0F0E0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0C0D19F3F3E81918181718181718171817171817171717CFF3F3F28F7F7E7E
+ 7D7D7C7C7C7B7A7A7A7A79797878777776767675757574747469686861616160
+ 6060605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A494936
+ 363535353434343433333333323231312F2F2FB9F3F3F0161010101010101010
+ 0F10100F100F100F91F3F3D20D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0E0E0E0E0E0F101717171717150C0000000000000000
+ 0000000000000000000000000B141717171717140E0E0F0E0E0E0D0D0D0D0C0D
+ 0D0D0C0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0D0C0C0C0C0C0D0C0D0C0C
+ 0C0D0C0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0D0E0F0E0E13171717170000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000B1516171717171717171717171717171717171717171715110F0C000000
+ 000000000000000000000E171717171715100E0E0E0E0E0E0E0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0D0C0D96F3F3D018181818
+ 18171818171817171817171717CFF3F3F2B77F7E7E7D7D7C7C7C7B7B7A7A7A79
+ 7978787777767675757575747474696868616161606060605D5D535353525252
+ 525151515150504F4E4E4E4B4B4B4A4A4A4A4949363635353434343434343333
+ 333232313138E0F3F3F016101010101010101010100F10100F0F1017F3F3F011
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0E0F
+ 0E0F0E101717171717130B000000000000000000000000000000000000000000
+ 0000111717171717110F0E0E0F0E0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0C
+ 0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E
+ 0F10161717170B00000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000C1717171717171717
+ 17171717171717171613100C000000000000000000000000000000000000000E
+ 171717171716100E0F0E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0D0C0FD2F3F396181817181817181718171817181718
+ 1717CFF3F3F3C97F7E7E7D7D7C7C7C7B7A7A7A7A797978787777767676757575
+ 747474696868616161606060605D5D535353525252525151515150504F4E4E4E
+ 4B4B4B4B4A4A4A494936363535353434343433333333323254EBF3F3E8161110
+ 101010101010101010100F10100F14F0F3F3170E0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0E0E0E0E0F161717171711000000
+ 0000000000000000000000000000000000000000000000111717171717100E0E
+ 0E0E0E0D0D0D0D0D0C0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0C0D0C0D0C0C0D0C0D0C0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0F0E0E0E10171717170C0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000010171717171717171717171714100E0B00000000
+ 00000000000000000000000000000000000000000E171717171716110E0E0E0E
+ 0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C13F0F3F392181818181817181817181717181717171793F3F3F3DF8A7E7E7D
+ 7D7C7C7C7B7B7A7A7A7979787877777676757575757474746968686161616060
+ 60605D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4A49493636
+ 353534343434343333333371F1F3F3D31311101110111010101010101010100F
+ 1011D2F3F3930E0D0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0E0F0E0F0E15171717171300000000000000000000000000000000
+ 0000000000000000000000001117171717160E0F0E0F0E0E0C0D0D0D0D0C0D0D
+ 0D0D0D0C0D0C0D0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0D0E0F0E0E0E171717170D0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0014171717171715130F0C000000000000000000000000000000000000000000
+ 0000000000000000000C151717171717110F0E0E0E0E0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D
+ 0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D17F3F3F1901818181818
+ 17181817181717181717171792F1F3F3EF8F7E7E7D7D7C7C7C7B7A7A7A7A7979
+ 78787777767676757575747474696868616161606060605D5D53535352525252
+ 5151515150504F4E4E4E4B4B4B4B4A4A4A49493636353535343434343439BAF3
+ F3F39713111011101110101010101010101010100F97F3F3CF0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E0E0E0E0E101717
+ 1717150B00000000000000000000000000000000000000000000000000000000
+ 001317171717130E0E0E0E0E0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D
+ 0D0C0D0C0C0C0C0C0C0C0D0C0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0F0E0E1717
+ 1717100000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000C1513100D0B0000000000
+ 0000000000000000000000000000000000000000000000000000000000000C15
+ 1717171717110F0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D91F3F3F01918181718181718171817181718171817
+ 17F8E8F3F3F3C87E7E7D7D7C7C7C7B7B7A7A7A79797878777776767575757574
+ 7474696868616161606060605D5D535353525252525151515150504F4E4E4E4B
+ 4B4B4A4A4A4A4949363635353434343459E0F3F3F39211101111101110111010
+ 101010101010101097F3F3D20F0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0E0D0D0E0D0E0E0F0E0F0E16171717170B000000000000000000
+ 0000000000000000000000000000000000000000000B15171717160F0F0E0E0F
+ 0D0D0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C0C0D
+ 0C0D0C0D0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0E0E0E0F0E0E0E0F0E1517171710000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000B1417171717110E0E0E0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 96F3F3E819181818181817181817181717181717171718CFF3F3F3ED8F7E7D7D
+ 7C7C7C7B7A7A7A7A797978787777767676757575747474696868616161606060
+ 605D5D535353525252525151515150504F4E4E4E4B4B4B4B4A4A4A4949363635
+ 353534A1F3F3F3E81711111111101110111011101110101010101091F3F3F014
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E
+ 0E0E0E0E11171717171000000000000000000000000000000000000000000000
+ 000000000000000000000E17171717130E0F0E0E0E0D0D0C0D0D0D0C0D0D0C0D
+ 0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F
+ 0E0E0F0E0F111717171713000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000C17171717100F0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E
+ 0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0CCFF3F3E819181818181817
+ 18181718171718171717171792F1F3F3F3C8897D7D7C7C7B7B7B7A7A7A797978
+ 787777767675757575747474696868616161606060605D5D5353535252525251
+ 51515150504F4E4E4E4B4B4B4A4A4A4A494936363565EBF3F3F3971411111111
+ 11111110111011101010101010101AF3F3F0140D0E0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0F0E0F0E1517171716000000
+ 0000000000000000000000000000000000000000000000000000000000000015
+ 171717160E0E0E0F0E0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0D0C0C0D0C0C0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F0E0E0E0F0E111617171717171300
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000D171717
+ 170F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0FD2F3F3E8191818171818171817181718171817181717
+ 1718D0F3F3F3EFB77D7D7C7C7C7B7A7A7A7A7979787877777676767575757474
+ 74696868616161606060605D5D535353525252525151515150504F4E4E4E4B4B
+ 4B4B4A4A4A494955C5F3F3F3F01A111111111111111111111011101110111010
+ 10F8F3F3F3190E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0E0E0E0E0F1717171710000000000000000000000000000000
+ 000000000000000000000000000000000000000E17171717110E0F0E0E0D0D0D
+ 0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0D0C0C0C0C0C0C0C0C0D0C0C0C0D0C0D0C
+ 0D0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D
+ 0E0F0E0F0E0E0E0F0E1116171717171717171000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000010161717170E0E0F0E0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0ED2
+ F3F3E8191818181818171818171817171817171717171792E9F3F3F3E5AF7D7C
+ 7C7B7B7B7A7A7A79797878777776767575757574747469686861616160606060
+ 5D5D535353525252525151515150504F4E4E4E4B4B4B4A4A4A4DAAF3F3F3F396
+ 141111111111111111111111111011101110111090F3F3F3190E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E0E0F0E0F13
+ 161717170B000000000000000000000000000000000000000000000000000000
+ 000000000000000016171717140E0E0E0F0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0E0E0E0F0E1015171717
+ 17171717130C0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000013171717150E0E0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0ED2F3F3E81918181718181817
+ 1817181717181717181717171897F3F3F3F3E4AF7C7C7B7B7B7A7A7A79797878
+ 7777767676757575747474696868616161606060605D5D535353525252525151
+ 515150504F4E4E4E4B4B4B4DACF1F3F3F3D01713111311111111111111111111
+ 1111101110111090F3F3F3190E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0D0D0E0E0E0E0E15171717140000000000000000
+ 0000000000000000000000000000000000000000000000000000000011171717
+ 160F0E0E0F0E0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C
+ 0C0D0C0C0D0C0D0C0C0C0C0C0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0E0E0E0F0E0F0E0F0E0F1417171717171717150E0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000013171717140E0F0E
+ 0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0D0C0D0D0D0ED2F3F3E819181818181718181718171817181717171717
+ 171719CFF3F3F3F3E5B67C7B7B7B7A7A7A797978787777767675757575747474
+ 696868616161606060605D5D535353525252525151515150504F4E4E4E58C3F3
+ F3F3F3E89113111311111311111111111111111111111110111091F3F3F3190E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E
+ 0D0E0E0E0F0E0E17171717100000000000000000000000000000000000000000
+ 000000000000000000000000000000000D171717170F0F0E0E0E0D0D0D0D0C0D
+ 0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0D0C0C0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0F0E0E0E0E0E0F
+ 1317171717171717160F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000017171717130E0E0E0F0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0ED2F3
+ F3E99018181818171818171817181718171717171717171719CFF3F3F3F3EFC7
+ 887B7A7A7A7A797978787777767676757575747474696868616161606060605D
+ 5D535353525252525151515150504F9DDAF3F3F3F3E891131113131113131113
+ 1111111111111111111111111097F3F3F3190E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0E0E0F0F171717170C
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000B16171717110E0E0F0E0D0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C
+ 0C0C0C0C0C0C0C0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0D0E0E0F0E0E0E0F0E0F1316171717171717170F0B000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000000B
+ 17171717100E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0D0ED2F3F3F1911818181817181817
+ 181717171817181717171717171719CFF3F3F3F3F3E5B4867A7A7A7979787877
+ 77767675757575747474696868616161606060605D5D53535352525252515151
+ 6AC4F1F3F3F3F3D3911313131313131113111311131111111111111111111113
+ 07F3F3F0180E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0E0F0E0E10171717170B000000000000000000000000
+ 0000000000000000000000000000000000000000000000000016171717130E0E
+ 0E0E0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E0E
+ 0E0F0E0E111616171717171717110B0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000C171717170F0E0E0E0F0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0D0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D95F3F3F3F718181818171818171817181717171717171717
+ 171717171896E9F3F3F3F3F3E4B5877A79797878777776767675757574747469
+ 6868616161606060605D5D53535352525F73C4F2F3F3F3F3F397191313131313
+ 13131313131113111311131111111111111115D3F3F3F0140D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0E0E
+ 0E0F111717171700000000000000000000000000000000000000000000000000
+ 0000000000000000000000000013171717130E0F0E0E0E0C0D0D0D0C0D0C0D0C
+ 0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0D0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0F0E0F0E0E10151717171717171713
+ 0C00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000010161717170E0F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0E0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D93F3F3
+ F3CF191818181817181817181718171718171717171717171717169207F3F3F3
+ F3F3F3EFCDB58B78787777767675757575747474696868616161606060605D5D
+ 6B84BEE3F3F3F3F3F3F3D3921514131313131313131313131311131311131111
+ 111111111118F0F3F3D2140E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0D0E0D0D0E0D0E0F0E0E13171717170000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0013171717150E0E0F0E0E0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0C0C0D0C0D0C
+ 0D0C0D0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D
+ 0E0E0F0E0E0E0E0E0F1517171717171717150D00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001017171715
+ 0E0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D18F0F3F3E81A1817181817181817
+ 18171817171717171717171717171716171892CFF0F3F3F3F3F3F3F3E7DEC6B2
+ 858176757575747474696868616C8383BBC1DBF2F3F3F3F3F3F3F3D393161414
+ 13141314131313131313131313131113131113111311111193F3F3F3970F0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0E0D0D0E0D0E0E0E0E0F11171717170000000000000000000000000000000000
+ 00000000000000000000000000000000000000000013171717150E0E0E0E0E0C
+ 0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0C0D0C0D0C0D0C0D0C0C0D
+ 0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F0E0F0E1417171717
+ 171717160F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000013171717140F0E0E0E0E0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0E0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D
+ 0C0D0D0C0D0D0D14E8F3F3F1F718181818171817181717181717181717171717
+ 1717171716171616169096D2F3F3F3F3F3F3F3F3F3F3F3F3F3E6E2E2E2E2F3F3
+ F3F3F3F3F3F3F3F3F3F3F3E89891151414131413141314131313131313131313
+ 1313131113111311131115D0F3F3F3920E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0E0F0E0E1317
+ 1717170000000000000000000000000000000000000000000000000000000000
+ 00000000000000000013171717140E0F0E0E0E0D0D0C0D0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0D0E0F0E0E0F11171717171717171510000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000016171717130E0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0E0E1098F3F3
+ F3D0191818181718181718171817171717171717171717171716171617161616
+ 16909507D2F0F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3D3CF95901614
+ 14141414141414141314131413141313131313131313131313111311131AF0F3
+ F3F0180D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0E0E0E0E0F1017171717000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000141717
+ 17130E0E0F0E0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0C0C0C0C0D0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F
+ 1317171717171717110B00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B16171717100E0F0E0E
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0D0C0D0D0C0D0E0E0E0E0E90F3F3F3F1921818181718181718
+ 1718171718171717171717171717161716161616161616161616159090F79696
+ 96D2D2D2D2D298969596901A1715141514151414141414141414141314141314
+ 13131313131313131313131313111314CFF3F3F3CF110E0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D
+ 0D0D0E0F0E0E10171717170C0000000000000000000000000000000000000000
+ 000000000000000000000000000000000017171717110F0E0E0E0D0D0D0D0C0D
+ 0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E131717171717130C00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000C17171717100E0E0E0F0D0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0C0E0E0F0E0E0F14D3F3F3F3D019181817181718171817181717171717171717
+ 1717171617161616161616161616161516151516151515151515151515151515
+ 1514151415141414141414141414141414131413141314131313131313131313
+ 131390F0F3F3F3920E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0E0D0E0D0D0E0D0D0E0D0E0D0E0E0E0F0E171717170E
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000C17171717100E0E0F0E0D0D0D0D0C0D0D0C0D0C0D0C0D0C0C0C0C0C
+ 0C0C0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0D0E0E0E0F11171717160C000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000F17
+ 1717170E0F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0E0E0E0F0E15171796F3F3
+ F3F1961818181817181718171718171717171717171717171617161716161616
+ 1616161615161615161515151515151515151515151415151415141414141414
+ 141414141414141314131413141313131313131317D2F3F3F3D2140E0E0E0E0D
+ 0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D
+ 0D0E0D0D0E0D0D0E0D0E0E0F0E0E0E1617171711000000000000000000000000
+ 0000000000000000000000000000000000000000000000000F171717170E0F0E
+ 0E0E0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E13171717
+ 1300000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000010161717160E0E0F0E0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0C0E0F0E0E0E171717171AE8F3F3F3E99118171818171718
+ 1717181717171717171717171716171616161616161616161615161515161516
+ 1515151515151515151514151414151415141414141414141414141314141314
+ 1313131313131697F3F3F3F0920E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0D0D0E0E
+ 0E0F0E1417171715000000000000000000000000000000000000000000000000
+ 00000000000000000000000014171717150E0E0E0F0E0C0D0D0C0D0C0D0C0D0C
+ 0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0D0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F13171717130000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000013171717150E0E0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0E0E0E0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0E0E0E
+ 0F0E17171717171390E9F3F3F3D3911718181718171817171817171717171717
+ 1717161716161616161616161616151616151615151515151515151515151515
+ 14151415141414141414141414141414131413141314131315F7F0F3F3F39811
+ 0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E0D0E0E0E0E0E10171717170E000000
+ 000000000000000000000000000000000000000000000000000000000000000C
+ 17171717110F0E0E0E0E0D0C0D0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E
+ 0E0F0E0E15171717130000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000015171717130E
+ 0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0D0D0D0E0F0E0E0E0F0E0E0E0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0E0F0E0E10171717170E00000BF7F3
+ F3F3F3D391171818171718171717171717171717171717161716161616161616
+ 1616161516151516151615151515151515151515141515141514151414141414
+ 1414141414141314131415F7F0F3F3F3E8160E0D0E0E0E0E0E0D0E0E0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0E0D
+ 0D0E0D0D0D0E0D0E0F0E0F0E1617171715000000000000000000000000000000
+ 0000000000000000000000000000000000000011171717170F0E0F0E0E0D0D0D
+ 0C0D0D0C0D0D0C0D0C0D0D0C0C0C0C0C0C0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C
+ 0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F1417171710000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000017171717110E0E0F0E0E0E0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D
+ 0E0E0E0E0E0F0E0E0E0F0E0E0E0E0E0E0E0E0E0D0D0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0E0E0E0F101717171700000000000E96F3F3F3F3D3921817181718
+ 1717181717171717171717171617161616161616161616161516161516151515
+ 151515151515151515141514151414141414141414141414141413141696F0F3
+ F3F3E8190E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0E0D0D0E0E0E0E0E
+ 13171717170E0000000000000000000000000000000000000000000000000000
+ 0000000000000B17171717150E0E0E0F0E0D0D0D0C0D0C0D0C0D0C0D0D0C0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0E0F0E0E0E1617171710000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000C17171717100F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0E0E0F0E0E0E0F0E0E0E0E0F
+ 0E0E0F0E0E0E0E0E0F0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0F0E0E0E131717
+ 1717000000000000001107F3F3F3F3E996181817181717171717171717171717
+ 1716171616161616161616161615161515161516151515151515151515151514
+ 15141514151414141414141414141998F3F3F3F3E8190E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0F0E0F0E0F17171717150B0000000000
+ 0000000000000000000000000000000000000000000000000000131717171710
+ 0E0F0E0E0E0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C
+ 0D0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E
+ 171717170F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000D171717170F0E0E0F0E0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D
+ 0D0E0D0E0D0E0D0E0E0E0E0F0E0E0E0F0E0F0E0E0F0E0E0E0F0E0F0E0E0E0F0E
+ 0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0E0F0E0E131717171500000000000000000011
+ F7F3F3F3F3F0CF91171817171817171717171717171716171616161616161616
+ 1616151616151615151515151515151515151514151514151414141414141415
+ 93E8F3F3F3F3E8190E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0E0D0E0E0E0E0E1317171717110000000000000000000000000000000000
+ 000000000000000000000000000F17171717150E0E0E0E0F0D0D0C0D0C0D0C0D
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0D0C0C0D0C0C0C0D0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0F0F171717170C00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000010161717160E0E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0E0F0E0E
+ 0F1111100E0E0E0F0E0E0F0E0E0E0E0E0F0E0E0F0E0E0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0E0E0E0F0E141717171300000000000000000000000E91E9F3F3F3F3E998F817
+ 1717171717171717171717161716161616161616161616151615151615161515
+ 151515151515151514151415141514141691CFF3F3F3F3F3CF190E0E0E0E0E0E
+ 0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0F0E0F0E0F1617
+ 1717170E00000000000000000000000000000000000000000000000000000000
+ 0C17171717170F0F0E0F0E0E0C0D0D0C0D0D0C0D0C0D0D0C0D0C0C0C0C0C0C0C
+ 0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0F0E0E0E10171717170C00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000131717
+ 17150E0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0E0E0F0E0E0E0F131717171715141311100E0F
+ 0E0F0E0E0E0F0E0E0F0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0E0F0E0E15171717130000
+ 00000000000000000000000B17D0F3F3F3F3F3E9989217171717171717171717
+ 1617161616161616161616161516161516151515151515151515151515151415
+ 141793CFF3F3F3F3F3F093110E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0E0D0E0E0E0E0E1017171717170E00000000000000
+ 000000000000000000000000000000000000000C1517171717130E0E0E0E0E0D
+ 0D0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C
+ 0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E1117171717
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000014171717130F0E0F0E0E0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E
+ 0D0E0E0E0E0F0E131717171717171717171717171515141313130F0E0E0E0E0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0C0D0D0D0D0C0D0E0E0E0E0F14171717100000000000000000000000000000
+ 00000E91D3F3F3F3F3F3F3D39790171717171717171617161616161616161616
+ 1615161515161516151515151515151515189298E8F3F3F3F3F3F398170E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D
+ 0D0E0E0F0E0F0E1317171717170E000000000000000000000000000000000000
+ 0000000000000C1517171717150E0F0E0F0E0E0D0C0D0C0D0C0D0C0D0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0C0C0D0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E13171717170E0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000017171717130E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0F0E0F0E0E111717171717
+ 1717171717171717171717171717140E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0E0E0F0E
+ 0E1717171710000000000000000000000000000000000000000F92D3F3F3F3F3
+ F3F3F3E807959118161716171616161616161616161615161615161515151515
+ 199195D2F0F3F3F3F3F3F3F098190F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0E0E0E0E0E0E15171717
+ 171710000000000000000000000000000000000000000000000F171717171716
+ 0E0E0E0E0E0E0D0D0D0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E
+ 0E0E0F1417171717171100000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000C16171717100E0F
+ 0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0E0E0E0E0E11171717171717171717171717171717171717
+ 1717170F0E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0C0E0E0E0F0E171717170E000000000000
+ 000000000000000000000000000000000E1896F0F3F3F3F3F3F3F3F3F3D2D296
+ 9695909090909090909090909091969607D2E9F3F3F3F3F3F3F3F3F3D293160E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0D
+ 0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0E0D0E0D0D0E0E0F0E0F0E0F151717171717140C00000000000000
+ 00000000000000000000000B131717171717160F0F0E0F0E0F0D0D0D0C0D0D0C
+ 0D0D0C0D0C0D0C0D0C0C0C0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0D0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0E0E10151717171717130B
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000C171717170F0E0E0F0E0E0D0E0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0E0E0F0E0F0E
+ 101617171717110C0F1013161717171717171717171717140E0E0F0E0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0E0F0E0E0F171717170C000000000000000000000000000000000000
+ 00000000000000000F1793D0F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3
+ F3F3F3F3F3F3F3F3F3F3F3F0CF9216100E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0E0D0E0D0D0D0D0D0E
+ 0E0E0E0E0E0F15171717171717110C00000000000000000000000000000B1117
+ 1717171717160F0E0E0F0E0E0E0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0E0E0F0E0E0F0E151717171717140C0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 10161717170E0F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0E0E0E0E0E0E10161717171714000000000000
+ 000C0C100F131315171717170F0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0E0E0E0F10161717
+ 170C000000000000000000000000000000000000000000000000000000000000
+ 000F151A9307D3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F3F307CF979590180E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E
+ 0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0D0D
+ 0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0E0D0D0D0D0E0F0E0F0E0E0F1317171717
+ 171717140F0B00000000000000000B0E1317171717171717150F0E0F0E0E0E0E
+ 0D0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0C0C0C0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E0E
+ 0E0E141717171717160B00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000011171717150E0E0E0F0E0D0E
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0E0F0E0F0E0F1617171717140B000000000000000000000000000C17171717
+ 140E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0C0D0E0F0E0E10171717170000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000F1311
+ 111311111311111311110B0000000C17171717100E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0E0D0D0E0D0E
+ 0D0E0D0D0D0E0D0D0D0E0E0E0E0F0E0E11161717171717171717171314100F14
+ 1316171717171717171717130E0E0E0E0E0F0E0D0C0D0D0D0D0C0D0D0C0D0D0C
+ 0D0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0D0C0C0D0C0C0C0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F0E0E0E111717171717170E00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000013171717140F0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0F0E0E0E0F151717171715
+ 0B00000000000000000000000000000013171717170F0E0F0E0E0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0E0E0E0F13161717170000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000B16171717110E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0E0D0D0D0D0D0D0E0F
+ 0E0E0E0F0E0F1417171717171717171717171717171717171717171717150F0E
+ 0F0E0F0E0E0E0D0D0D0D0C0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0E0E0E0F0E0F0E1016171717171710000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000017171717
+ 130E0F0E0E0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D
+ 0D0E0D0D0E0D0E0E0E0E0E0F0E1517171717160C000000000000000000000000
+ 000000000C17171717140E0E0F0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0F0E0E0E1317171714000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000016171717130F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E
+ 0D0D0E0D0D0D0D0D0D0D0D0D0D0D0E0D0E0D0D0E0E0F0E0E0E0E0E1014171717
+ 17171717171717171717171717171715100E0F0E0E0E0E0F0E0C0D0D0C0D0D0D
+ 0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C
+ 0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E0E
+ 0F0F161617171717130000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000B16171717100E0E0F0E0E0E0E0E0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0D0D0E0D0D0E0D0D0E0E0E0F0E0E0E
+ 1417171717160B00000000000000000000000000000000000013171717170F0E
+ 0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D
+ 0D0C0D0D0D0C0D0D0E0F0E0E1417171713000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000013171717150E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0D
+ 0E0D0D0D0D0D0D0D0E0E0E0F0E0F0E0E0E0F1115171717171717171717171717
+ 16130F0E0E0E0E0E0F0E0E0E0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0F0E0F0E0E0E0F151717171717140B00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000C1717171716110E0E0E0F0E0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0E0D0D0E0D0D0E0E0E0E0E0F0E1417171717170E000000000000
+ 000000000000000000000000000C17171717140E0F0E0E0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0E0E0E0F0E
+ 1517171713000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000010
+ 161717170E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0E0D0D0D0E0E0E
+ 0E0E0E0F0E0E0F0E0F101114151415141413100F0E0E0F0E0F0E0F0E0E0E0E0C
+ 0D0D0D0D0C0D0D0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0D0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0D0E0E0E0F0E0E0E141717171717160B000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000F171717171717150F
+ 0E0E0F0E0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D
+ 0E0E0F0E0E0E1316171717170E00000000000000000000000000000000000000
+ 000013171717170F0E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0E0E0E0E0E151717171000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000C17171717100E0F0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E
+ 0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D
+ 0D0D0D0D0D0D0D0D0D0E0D0E0D0D0D0D0D0D0D0E0E0F0E0E0E0F0E0E0E0E0F0E
+ 0E0E0F0E0E0E0F0E0F0E0E0E0E0E0E0E0E0D0D0D0D0C0D0D0D0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0D0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E0F0E0E
+ 0E111717171717170E0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000B1317171717171717130F0E0E0F0E0F0E0E0E0E0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0F0E0E0F0E11171717171710
+ 000000000000000000000000000000000000000000000C17171717140E0E0F0E
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D
+ 0D0C0D0E0E0F0E0E171717171000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000B16171717110E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0D0E0D0D0D0D
+ 0D0E0D0D0D0D0D0D0D0E0E0F0E0E0E0F0E0E0E0E0F0E0E0F0E0E0E0E0E0E0F0E
+ 0F0E0E0D0D0D0C0D0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0D0C0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0F0E0F0E11161717171717100000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000D1517171717171716110F0E0E0E0E0F0E0E0E0E0E0D0E0D0E0D0E0D0D0E0D
+ 0E0D0D0E0D0D0E0E0E0E0F0E1017171717171100000000000000000000000000
+ 000000000000000000000013171717170F0E0E0E0F0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0E0E0E0F0E17171717
+ 0D00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000014171717
+ 140F0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0D0E0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E
+ 0E0E0F0E0E0F0E0E0E0F0E0E0F0E0F0E0F0E0E0E0E0D0D0D0D0D0D0C0D0D0D0D
+ 0C0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0E0E0E0E0E0E0E0F1617171717171300000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000B101717171717171715
+ 110E0F0E0E0E0F0E0E0E0E0E0D0E0D0E0D0E0D0D0D0E0D0D0E0E0E0F0E0E0E10
+ 161717171713000000000000000000000000000000000000000000000000000C
+ 17171717140E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C
+ 0D0D0D0D0C0D0D0D0D0C0D0E0F0E0E0F171717170C0000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000010171717160E0E0F0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D
+ 0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0F0E0E0E0E0F
+ 0E0E0E0E0E0E0D0D0D0D0C0D0D0C0D0D0D0C0D0D0D0D0C0D0C0D0C0D0C0D0D0C
+ 0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0F0E0F0E0F0E
+ 0F151717171717140B0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000C131717171717171715100E0F0E0E0E0F0E0E0F
+ 0E0E0D0E0D0D0E0D0E0D0D0E0E0E0E0E0F0E101617171717140B000000000000
+ 000000000000000000000000000000000000000013171717170F0E0E0F0E0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0E
+ 0E0E0F10171717170B0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000D17171717100E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D
+ 0E0E0E0E0D0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0E0D0D0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0E0E0E0E0D0E0D0E0D0D0C0D0D0D0D0D0C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0E0E0F131717171717160B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000D151717171717171715100E0F0E0E0E0F0E0E0E0E0E0E0D0D0E0D0D0E0D
+ 0E0E0F0E0E0F1517171717140B00000000000000000000000000000000000000
+ 00000000000000000C17171717150E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0F0E0E0E111717171700000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000B16171717110E0F
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E
+ 0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D
+ 0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0C
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0E0F0E0F0E0E0E131717171717160E00000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000B0F16171717171717
+ 1714100E0F0E0E0E0F0E0E0E0E0E0E0D0E0D0E0E0F0E0E0E0F1517171717160B
+ 0000000000000000000000000000000000000000000000000000000000131717
+ 1717100F0E0F0E0E0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D
+ 0D0C0D0D0D0C0D0E0F0E0E131717171700000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000014171717150E0E0F0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F0E0E
+ 1116171717171600000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000B10171717171717171715100E0F0E0E0F0E0F
+ 0E0E0E0E0E0E0E0E0E0E0F0E1517171717150C00000000000000000000000000
+ 00000000000000000000000000000000000C17171717150E0E0E0E0E0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0E0E0F0E13
+ 1717171300000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0010161717170F0E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E
+ 0E0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0D0E0D0D0E0D0D0E0D0E0D0E0D0E0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C
+ 0D0D0D0D0D0C0D0C0D0D0C0D0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0D0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F0E0E0F17171717130000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000B11171717171717171716100F0E0E0E0E0F0E0F0E0E0E0F0E0F0E0E14
+ 17171717170C0000000000000000000000000000000000000000000000000000
+ 0000000000001317171717100E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D
+ 0C0D0D0D0C0D0D0D0C0D0D0D0D0C0E0E0E0E0E15171717130000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000C17171717110E0F0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0E0E0E0D0E0E0D0E0E0D0E0E0D0E0D
+ 0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0E0D0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0D
+ 0C0D0D0C0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0D0F0E0E0E0F0F171717170E0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000B111717171717
+ 17171716130F0F0E0E0E0E0E0F0E0E0E0E0E1317171717170E00000000000000
+ 00000000000000000000000000000000000000000000000000000B1717171715
+ 0E0E0F0E0E0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0C0E0E0F0E0E15171717110000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000016171717140E0E0E0F0E0E0E0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0E0D0E0E0E0D0E0D0E0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0D0C0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0C0D0C0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E131717
+ 17170B0000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000B1117171717171717171714100F0E0F0E
+ 0E0E0F0E0F1117171717170E0000000000000000000000000000000000000000
+ 0000000000000000000000000000001117171717100E0E0E0F0D0D0D0D0D0D0D
+ 0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0D0E0E0E0F0E1616171710
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000001117
+ 1717160F0E0E0E0E0F0E0F0E0F0E0F0E0F0E0E0F0E0F0E0E0E0E0E0E0E0E0E0E
+ 0E0E0E0D0E0D0E0E0E0D0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D
+ 0C0D0D0C0D0D0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0F0E161717171300000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000B1116171717171717171716130F0E0F0E0E0E1117171717171100
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000B17171717150E0F0E0E0E0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D
+ 0D0D0C0D0D0D0D0E0E0E0E0F0E0E0E1717171710000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000D17171717110E0F0E0E0E0F0E0E
+ 0E0E0E0E0E0F0E0E0E0E0E0F0E0F0E0F0E0F0E0F0E0E0E0E0D0E0E0D0E0E0E0D
+ 0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D
+ 0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C0D
+ 0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D
+ 0E0F0E0E10161717170E00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000B0F151717
+ 1717171717171715110F0E101617171717110000000000000000000000000000
+ 0000000000000000000000000000000000000000000000001117171717100E0E
+ 0F0E0E0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0C0D0E0D0E0E0E0E0E0F0E0E
+ 0E0F0E171717170C000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000016171717150F0E0E0F0E0E0E0F0E0F0E0F0E0E0E0F0E0F0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0E0D0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C
+ 0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0C0C0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F13171717170B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000E14171717171717171717171516
+ 1717171713000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000B17171717150E0E0E0E0E0D0D0D0D0D0D0D0C0D
+ 0D0D0C0D0D0D0E0E0E0E0E0E0F0E0F0E0E0E0E0F0E0E10171717170C00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000001117171717
+ 1717171715151514131313101010100E0E0E0E0F0E0F0E0F0E0F0E0F0E0E0E0E
+ 0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0E0D0D0D0E0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0D0C0D
+ 0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0D0C0C0D0C0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0E0E0F0E0E1617171713000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000C1115171717171717171717171717140B00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 001117171717100F0E0F0E0E0D0D0D0D0D0D0D0D0E0E0E0E0E0E0E0E0F0E0F0E
+ 0E0E0E0F0E0F0E0E0E1113171717170B00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000D17171717171717171717171717171717
+ 17171717171716151514131313100E0E0E0F0E0E0D0E0E0D0E0E0D0E0D0E0D0E
+ 0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0E0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E10
+ 171717170E000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000B0E
+ 14171717171717171717140B0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000B17171717150E0E0E0E0E
+ 0E0E0E0E0E0E0E0E0E0E0E0F0E0F0E0E0E0E0E0E0F0E0E0E0E0F111417171717
+ 1717170000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000016171717171717171717171717171717171717171717171717171717
+ 17160F0E0E0E0E0E0E0E0D0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D
+ 0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C
+ 0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F14171717160000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000B10151617171717160C00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000001117171717100E0F0E0E0E0E0E0E0F0E0F0E0F0E0E0E
+ 0E0E0F0E0F0E0F0E0E0F11141617171717171717171716000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000001017171717171717
+ 17171717171717171717171717171717171717171717130E0F0E0E0E0E0D0E0E
+ 0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0E0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0C0D0C
+ 0C0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0D0C0C0D0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0E0F0E0E0F16171717110000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000C101517160B0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000B17
+ 171717150E0E0F0E0F0E0F0E0E0E0E0E0E0F0E0F0E0E0E0E0E10131416171717
+ 1717171717171717171711000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000B0C0C0C100F101013131415171717171717
+ 17171717171717171717160F0E0F0E0E0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C
+ 0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0C0D0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0F0E11171717170C
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000C0C000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000001117171717100E0E0E0E0E0E0E
+ 0F0E0F0E0E0E0E0F10131415171717171717171717171717171716130E0B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000C0C0C0D100F101114141717171714
+ 0E0E0F0E0E0E0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D
+ 0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0E0F0E0E0E161717171500000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000B17171717150F0E0F0E0F0E0E101011131415171717171717
+ 171717171717171717171714100D000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000001417171717100E0E0F0E0E0E0D0E0E0D0E
+ 0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E
+ 0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0C0D0D0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0E
+ 0F10171717170F00000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000011171717
+ 17141314151517171717171717171717171717171717171717171715110E0B00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000C17171717150E0E0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D
+ 0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0F0E0F0E0E15171717150B0000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000B171717171717171717171717171717
+ 171717171717171717171714100E0B0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000001317171717110F0E
+ 0F0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E
+ 0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0D
+ 0C0D0D0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C0D0C0D0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0D0E0E0E0E101717171711000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000011171717171717171717171717171717171717171713110F0C0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000B17171717160F0E0E0E0F0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0E0D0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0D0C0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0C0C0C0C0C0D0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0F0E14171717
+ 170B000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000B151717171717
+ 17171717171717151311100C0B00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 001016171717140E0F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D0D0E0D0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D
+ 0D0C0D0C0D0C0D0C0D0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0D0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0D0E0E0E0E0F17171717130000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000010161715131411100F0D0C0B000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000001517171717100E0E0F0E
+ 0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D
+ 0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0C0E0E0F0E0E0E0E0D0D0D0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F
+ 0E0F0E14171717170C0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000F17171717110F0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E
+ 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D
+ 0D0C0D0D0D0D0D0C0D0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0F0E0E0E0F0E0E0E
+ 0F0E0E0E0E0E0E0D0D0D0C0C0C0C0C0C0C0D0E0E0E0E0F171717171300000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000110B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000001517
+ 1717160F0E0E0F0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D
+ 0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0C0D0C0D
+ 0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F0E0E0E0F0E0E0E0F0E0E0E0E0F0E0E0E0E
+ 0E0E0E0D0D0F0E0F0E0E14171717170C00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000BF3F3070F000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000E17171717130E0E0F0E0E0E0D0E0D
+ 0E0D0E0D0E0D0E0D0D0D0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D0D0D0E0D0D0D
+ 0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C
+ 0C0C0C0C0C0C0C0D0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E
+ 0F0E0E0E0F0E0E0E0F0E0E0F0E0F0E0E0E0F0E0F0E0E0E0E0E0E0E0E0F0F1717
+ 1717130000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000E93D3F3F3140000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000013171717160F0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C
+ 0D0D0C0D0C0D0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C
+ 0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0D0E0F0E0E0E0F100F0F0E0E0E0F0E0E
+ 0E0E0E0F0E0E0E0E0E0F0E0F0E0F0E0E0E15171717170C000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000096F3E90B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000C17171717130E0F
+ 0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D
+ 0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0D0C0D0D0C0D0C0D0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0D0C0C0C0D0C0C0C0C0C0C
+ 0C0C0C0D0E0E0E0E0F0E15171717161514131110100E0E0E0F0E0F0E0E0E0F0E
+ 0E0E0F0E10171717171300000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000EF3F3170000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000013171717170F0E0E0E0E0E0D0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0D0E0D0D0E0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D
+ 0D0C0D0D0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0C0C0C0D0C0C0C0D0C0C0D0C0C0C0C0C0C0C0C0E0E0F0E0E0E141717
+ 17171717171717171717171514131110100E0E0E0F0E0E0E16171717170B0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000D3F3910000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000000C
+ 17171717140E0F0E0F0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0D0D0C0D0D
+ 0C0D0C0D0C0D0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E0F11171717171717171717171717171717
+ 1717171717171715141313131717171711000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00001A1A1100000000000011F81A00000000000E1A9607961A140B000000171A
+ 17000000000011F81A00000000000E1A1A0D0000000000000B1791079891170B
+ 0000000000000011F811000E1A96071A0E00000000000007F307000000000000
+ 11F80798931A1100000000000000171A079891170B000000000B1998981A0000
+ 0F19960793190B00000000000000000000171A1A1A1A1A1A1A1A1A1700000000
+ 0011F8190000000000000000000B199307981A90191717171792920E0E0E0E0D
+ 0E0D0E0D1491910E0D0E0D0D0E1991170E0D0E0D0D0E0D0D11F896CF93170D0D
+ 0D0E0D0D0D0D0D139197CF91130D0D0D0D0D0D0D0D0D1995CF93150D0D91910D
+ 0C0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0C0D0C0C0C0C0C0C0C0C0E0E0E
+ 0E0E0F1017171717171717171717171717171717171717171717171717171717
+ 1717171600000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000F3F31A00000000000007
+ F3960000000B92F3F3F3F3F3F3F39200000007F39800000000001AF3F3000000
+ 000011F3F311000000000017E9F3F3F3F3F3F3E91A0000000000001AF31A17F3
+ F3F3F3F3F391000000000007F398000000000E98F3F3F3F3F3F3F31400000000
+ 14F0F3F3F3F3F3F31A0000000BF0F3F3F3F3000FF3F3F3F3F3F3E91700000000
+ 000000000007F3F3F3F3F3F3F3F3F3980000000000D3F3F30F00000000000000
+ 19E9F3F3F3F3F3F3E817171492F3F30E0E0E0D0E0D0E0D0E96F3F3130E0D0E0D
+ 0DF0F3E80D0D0D0E0D0D0E1AF0F3F3F3F3F3E8140D0D0D0E0D0F93F3F3F3F3F3
+ F3CF0F0D0D0D0D0D13D2F3F3F3F3F39717F3F30D0D0D0C0D0D0D0C0D0D0D0D0C
+ 0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C
+ 0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0E0E0F0E0F0E0F1717171717110E1011
+ 1315171717171717171717171717171717171717171717100000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000F3F31A00000000000BF3F31900000007F3F31A0E0000
+ 11191100000007F39800000000001AF3F3000000000011F3F3110000000093F3
+ F3071400000F92F3F3D00B000000001AF3E9F39610000E1AF3F3910000000007
+ F3980000000BF0F3E9170B000B13910B00000014F3F3D3170B000E160F000000
+ 19F3F316000E000007170D000E93F3E90E000000000000000007F3D011131111
+ 131111100000000011F3F3F3930000000000001AF3F396100000179393161710
+ 92F3F30E0E0E0E0D0E0D0E0DE8F0F3930E0D0D0E17F3F3F3110D0E0D0E0D91F3
+ F393100D15D2F3F0130E0D0D0DCFF3F01A0F0D19E9F3D20F0D0D0D0FE8F3F019
+ 0D0E19F0E8F3F30D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0D0C0D0C0D0C
+ 0D0D0C0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0D0C0D0C0C0C
+ 0C0C0C0E0E0E0E0F0E0F171717171713000000000000000B0C0E101113151717
+ 1717171717171717171715000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000F3F3
+ 1A000000000011F3F30F000017F3F3110000000000000000000007F398000000
+ 00001AF3F3000000000011F3F3110000001AF3F31A00000000000011F0F39600
+ 0000001AF3F396000000000019F3F30D00000007F39800000093F3E90B000000
+ 0000000000000BF0F3D00B00000000000000000096F3D0000000000000000000
+ 000BF3F319000000000000000007F30700000000000000000000000093F393F3
+ E90B000000000EF3F31A0000000B17171717150E92F3F30E0E0D0E0D0E0D0E13
+ F3CFD2E80E0D0E0D96F393F31A0E0D0D0D11F3F3910D0E0D0D0FD2F3E80D0D0D
+ 19F3F3150D0D0D0D13F0F3960D0D0D91F3F3130D0D0D0D15F3F3F30D0D0D0C0D
+ 0D0D0C0D0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0D0C0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E0E10161717
+ 1717140B0000000000000000000000000000000B0C0E10111315171717170D00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000F3F31A00000000001AF3E9000000
+ D0F393000000000000000000000007F39800000000001AF3F3000000000011F3
+ F31100000EF3F396000000000000000019F3F3110000001AF3F30E0000000000
+ 00D3F39100000007F39800000BF3F3170000000000000000000017F3F3110000
+ 000000000000000007F307000000000000000000000BF3F31A00000000000000
+ 0007F39800000000000000000000000BF0F31197F3170000000091F3D3000000
+ 001016171717100E92F3F30E0E0E0D0E0D0E0D92F39193F3130E0D0DF0F311F3
+ D20D0E0D0E93F3E90D0D0D0D0D0D15F3F3170E0DD2F3970D0D0D0D0D0D91F3F3
+ 0F0D0DE8F3960D0D0D0D0D0D97F3F30D0D0D0D0C0D0D0D0D0C0D0D0D0C0D0D0C
+ 0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C
+ 0C0C0C0C0D0C0C0C0D0E0E0E0E0F0E0F1517171717150B000000000000000000
+ 0000000000000000000000000000000B0C0C0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000F3F31A000000000007F396000000F3F317000000000000000000
+ 000007F39800000000001AF3F3000000000011F3F311000091F3F30E00000000
+ 0000000000D0F3960000001AF3F30000000000000093F30700000007F3980000
+ 11F3F30E0000000000000000000091F3D3000000000000000000000007F39800
+ 00000000000000000E96F3F30F000000000000000007F3980000000000000000
+ 00000017F3E90017F3D00000000007F3930000000B15171717160E0E92F3F30E
+ 0D0E0D0E0D0E0DD2F31717F3930D0E13F3970EE8F3100E0D0DCFF3960D0D0D0E
+ 0D0D0DF0F3930D0DF3F3190D0D0D0D0D0D13F3F3170D0FF3F3180D0D0D0D0D0D
+ 91F3F30D0D0C0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0C0C0C0C0D0E0F0E
+ 0E0E0F1517171717160B00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000F3F31A000000
+ 000EF3F317000011F3F31911111311111311110E000007F39800000000001AF3
+ F3000000000011F3F3110000D0F3960000000000000000000019F3F30B00001A
+ F3F3000000000000001AF3E900000007F39800001AF3F3111311111311111311
+ 0B0007F307000000000000000000000007F3980000000000000011F7F3F3F31A
+ 00000000000000000007F3980000000000000000000000D0F3910000E9F30F00
+ 0000F3F3931113111791909091160E0E92F3F30E0D0E0D0E0D0E11F3F30F0EF0
+ E80D0D93F3F80D96F3F80D0E0DF3F3910E0D0D0D0D0E0DCFF3CF0D15F3F3150D
+ 0D0D0D0D0D0DF3F3910D15F3F3150D0D0D0D0D0D91F3F30D0D0D0D0C0D0D0D0C
+ 0D0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0C0C0D0C0C0C0C0D0C0C0C0C0C0C0E0E0F0E0F1617171717150C000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000F3F31A0000000B97F3D30B000013F3F3F3F3
+ F3F3F3F3F3F3F31A000007F39800000000001AF3F3000000000011F3F311000B
+ F3F319000000000000000000000FF3F31100001AF3F3000000000000001AF3F3
+ 00000007F39800001AF3F3F3F3F3F3F3F3F3F3F3110096F30700000000000000
+ 0000000007F39800000000000093F3F3F398110000000000000000000007F398
+ 000000000000000000000EF3F30F000093F393000000F3F3F3F3F3F3F3F3F3F3
+ F3CF0F0E92F3F30E0D0E0D0E0D0E1AF3D20E0D97F3140DE8F3110D17F3D20E0D
+ 0DF3F3910D0D0D0D0D0D0DCFF3CF0D15F3F3150D0D0D0D0D0D0DF3F3910D15F3
+ F3150D0D0D0D0D0D91F3F30D0D0C0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C
+ 0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0D0C0C0C0C
+ 0C0C0C0C0C0E0E0E0E0E16171717160C00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000F3F3071A1A92D3F3E91000000000F3F3931A1A1A1A1A1AF3F31A000007F3
+ 9800000000001AF3F3000000000011F3F3110013F3F311000000000000000000
+ 0000F3F31900001AF3F30000000000000093F3D000000007F398000011F3F31A
+ 1A1A1A1A1A93F3F31100F8F3E9000000000000000000000007F3980000000000
+ 91F3F3961000000000000000000000000007F3980000000000000000000091F3
+ D300000014F3E90B000007F3981A1A92969697E8F3CF0E0E92F3F30F0E0D0E0D
+ 0E0D97F3910E0D19F39313F3D20D0E0FF3F3110D0ECFF3960D0E0D0E0D0D0EE9
+ F3960D0DF3F3190D0D0D0D0D0D13F3F3190D0DF3F3190D0D0D0D0D0D91F3F30C
+ 0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0C0D0C0C0C0C0C0C0C0D0C0C0C0C0C0C0E0E0F0E0E1417
+ 1717140000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000F3F3F3F3F3F3F3F31A00
+ 00000000D0F31A00000000000BF3F311000007F3D3000000000091F3F30B0000
+ 000017F3F30E0011F3F3110000000000000000000000F3F31A00001AF3F31100
+ 0000000000D3F39300000007F39800000BF3F311000000000014F3F300000FF3
+ F3110000000000000000000007F3980000000000E9F396000000000000000000
+ 000000000007F3E907980798079891000000E9F31A00000000E9F317000091F3
+ 07000015171717E8F3920E0F91F3F3190E0D0E0D0E0FF3F3150E0D0FF3D290F3
+ 910E0D0DCFF3F80D0D93F3F00D0D0D0D0D0D15F3F3190D0DD2F3970D0D0D0D0D
+ 0D91F3F3110D0DD2F3970D0D0D0D0D0D96F3F30D0D0C0D0D0D0C0D0D0D0C0D0D
+ 0D0D0C0D0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D
+ 0C0D0C0D0C0C0C0C0C0C0C0C0C0D0E0E0F0E11171717170B0000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000F3F39311131119D3F3D00B00000017F3E90B00000000
+ 19F3E900000007F3F31900000000D3F3F31A0000000007F3D3000011F3F31100
+ 00000000000000000000F3F31A00001AF3F3D0000000000019F3F31100000007
+ F39800000093F307000000000096F39600000007F3D30B000000000000000000
+ 07F3980000000000E9F31A000000000000000000000000000007F3F3F3F3F3F3
+ F3F307000014F3F30E0000000093F3D000000EF3F3110E1717171AF3F3140E0E
+ 92F3F3F0110E0D0E0D17F3F30E0D0E0D97F397F3130E0D0E1AF3D20E0D11F3F3
+ 910D0D0D0E0DCFF3F00D0D0D19F3F3150D0D0D0D0FF0F3970D0D0D19F3F3150D
+ 0D0D0D13F3F3F30D0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0C0D0C0D0C0D0D0C
+ 0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C
+ 0C0C0F0E0E0F0F171717170D0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000F3F3
+ F8000000000BD0F3070000000096F3D011000019F3F31800000007F3E9E9190B
+ 0E93F3F393F31A0B0BF8F3F31A000000F3F319000000000000000000000EF3F3
+ 1100001AF3F3D3D011000E1AF3F3960000000007F3980000000BE8F3960E000B
+ F7F3F30F0000000EE9F3D3170B000E160F000F13D0F3D01113110B0092F3E914
+ 000E161700000000000000000007F39800000000000000000096F3D000000000
+ 000FF3F30E000019F3E991171790F1F3980E0F0E92F3D2F0F093910E0D96F397
+ 0E0D0D0E19F3F3E80D0D0D0D13F3F3110D0D19F3F393110D13CFF3F3170D0D0D
+ 0D96F3F01A0F0D17E8F3F0110D0D0D0DCFF3F0190E0F18F0F3F3F30D0D0C0D0D
+ 0D0C0D0D0D0C0D0D0D0C0D0C0D0D0C0D0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0D0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E1617171710
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000F3F31A000000000010F3F30F0000
+ 000093F3F3F3F3F3F3910000000007F31A93F3F3F3F3F393001AF3F3F3F3F307
+ 00000000D3F3930000000000000000000017F3F30D00001AF3F30FE8F3F3F3F3
+ F3070B0000000007F398000000000BD0F3F3F3F3F3E91700000000000E98F3F3
+ F3F3F3F3190007F3F3F3F3F3F3F311000B07F3F3F3F3F3D00000000000000000
+ 0007F39800000000000000000EF3F318000000000000D3F39100000017F3F3F3
+ F3F3F3CF100E0E0E91F39317F3F3F30E0DF0F3900E0D0E0D0FF3F3930D0E0D0E
+ 0DE8F3F80E0D0D19F0F3F3F3F3F3F0170D0D0D0D0D0D93F3F3F3F3F3F3D2130D
+ 0D0D0D0D0FCFF3F3F3F3F3D293F3F30C0D0D0D0C0D0D0D0C0D0D0D0C0D0D0C0D
+ 0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F1417171714000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000F3F31A000000000000F3F31A00000000000F929898910F000000
+ 0000171A0E0011929893110000000F92989317000000000091F3E90B00000000
+ 000000000096F3D30000001AF3F3000B1793079111000000000000171A170000
+ 0000000014F79898190D00000000000000000FF8930793190F00171AD3F3D31A
+ 1AF80E00000011929896190D00000000000000000007F3980000000000000000
+ 0FF81A0E00000000000014F819000000001695D2D2CF180E0F0E0E0E1691150E
+ 1196CF0E119191110E0D0D0D0D1991110D0E0D0D0E1991170D0D0D0D0F1993CF
+ 93190F0D0D0D0D0D0D0D0D111A96CF91170D0D0D0D0D0D0D0D0D1593CF96180D
+ 91F3F30D0D0C0D0D0D0C0D0D0D0C0D0D0C0D0D0C0D0C0D0C0D0D0C0D0C0D0C0D
+ 0C0D0C0D0C0D0C0D0C0D0C0C0C0C0C0D0C0C0D0C0D0C0C0C0C0C0C0C0C0C0D0E
+ 0F0E0E11171717170B0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000F3F31A000000
+ 00000BF3F31A0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000EF3F31A000000000000000011F3F31A0000001A
+ F3F3000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000007F30700000000000000000000000000
+ 00000000000000000007F3980000000000000000000000000000000000000000
+ 000000000C17171717140E0E0E0F0E0E0D0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D
+ 0E0D0D0E0D0D0E0D0D0D0D0E0D0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D91F3F30C0D0D0DCF150D9118
+ 0DD2190CCF150D0C0D0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C
+ 0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0E0E0F0E10161717170D000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000F3F31A000000000017F3F30F000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 001AF3F3110000000000000BE8F3D30B0000001AF3F300000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000007F3980000000000000000000000000000000000000000000007F398
+ 00000000000000000000000000000000000000000000000013171717170F0E0F
+ 0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D
+ 0E0D0D0D0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D91F3F30D0D0C0DCF150D919110CF970DCF150D0C0D0C0D0D
+ 0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0D0C0D0C0D0C0C0D0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0E0E0E0E0E1717171710000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000F3F31A0000000017E9F3D000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000093F3F31A0B00000014F0
+ F3E910000000001AF3F30000000000000000000000000091F391000000000000
+ 000000000000000000000000000000000000000000000000000F170000000000
+ 000000000000000000000000000000000007F398000000000000000000000000
+ 00000000000000000000000B17171717160F0E0E0E0F0E0E0E0D0E0D0E0D0E0D
+ 0E0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0D0D0E0E0E0F0E0E0F0E0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D91F3F30C
+ 0D0D0DCF150D1A911A1A9710CF100D0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C
+ 0D0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E
+ 1417171714000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000F3F3F3079807F3F3F3D0
+ 1000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000001AF3F3F30798E9F3F3D01000000000001AF3F30000
+ 0000000000000000000000F3F3F3000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000007F3F3F3F3F3F3F3F3F3110000000000000000000000000000000B
+ 1517171717150F0E0E0E0E0E0E0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D
+ 0E0D0D0D0D0E0D0E0D0E0E0E0E0E0E0F0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D91F3F30D0C0D0DCF150D1591D210191A
+ F30D0C0D0D0C0D0C0D0D0C0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C
+ 0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E11171717170B000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000009307D0F3F3F3D0961700000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0E9198E9F3D39617000000000000001AF3F3000000000000000000000000001A
+ F31A000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000091079807980798
+ 0798070F000000000000000000000000000000000C1517171717150F0E0F0E0E
+ 0F0E0D0E0D0E0D0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0D0D0D0E0E0E0F
+ 0E0F0E0E0E0F0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D91F3F30C0D0D0DCF150D1596D20C0F07F30D0C0D0C0D0D0C0D0C0D0C
+ 0C0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0F0E0E0F0F171717170D000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000001798070000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000C1517171717150F0E0E0F0E0E0E0E0D0E0D0E0D0E0D0D
+ 0E0D0D0E0D0D0E0D0D0E0D0E0D0D0E0E0F0E0E0E0F0E0E0F0E0E0E0F0E0E0E0E
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D18CFCF0D0D1891E8
+ 969117E8180D0C96E90D0D0C0D0C0D0D0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0D
+ 0C0C0C0C0C0C0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E161717
+ 1710000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000D17
+ 17171717150F0E0E0E0F0E0E0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0D0D0D
+ 0E0E0E0E0E0F0E0E0E10130F0E0F0E0E0E0F0E0E0F0E0E0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D13151515150E150F0C0D10130D0C0D
+ 0D0C0D0C0D0D0C0D0C0D0C0D0C0D0C0D0C0D0C0C0D0C0D0C0D0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F141717171400000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000E1717171717150F0E0E0E0E0E
+ 0E0E0D0E0D0E0D0E0D0D0E0D0D0E0D0D0E0D0E0E0E0E0F0E0E0E0F0E13171717
+ 140F0E0F0E0E0E0F0E0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C
+ 0D0D0C0D0D0C0D0D0C0D0D0D0D0D0C0D0C0D0D0C0D0D0C0D0C0C0D0C0D0C0D0D
+ 0D0C0D0C0D0C0D0C0C0C0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0D0E0F0E0E11171717170B000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000E1717171717150F0E0F0E0E0E0E0E0D0E0D0D0D0E0D0D0E
+ 0D0D0E0D0D0E0E0E0E0F0E0E0F0E1016171717171717130F0F0E0E0E0E0F0E0E
+ 0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0D0C0D0D
+ 0C0D0D0C0D0C0D0C0D0C0D0C0D0C0C0D0E0E0E0E0E0D0C0D0C0D0C0D0C0C0D0C
+ 0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E10161717170D00
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000E1717
+ 171717150F0E0E0F0E0E0E0E0D0E0D0E0D0E0D0D0E0D0D0E0E0E0E0F0E0E0E0F
+ 0E141717171717171717171715110E0F0E0E0F0E0F0E0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0D0D0D0C0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0C0D0D0C0D0C0D0D0D
+ 0E0E0E0E0E0E0E0F0E0E0D0C0C0C0D0C0D0C0C0C0D0C0C0C0C0C0D0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0E0E0E0E0E171717171000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000E1717171717150F0E0E0E0F0E0E
+ 0E0E0D0D0D0D0E0D0D0E0E0E0E0F0E0E0E0F0E11161717171717171717171717
+ 171716130F0E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D
+ 0D0D0D0C0D0D0D0D0D0C0D0D0C0D0E0D0E0E0E0E0E0E0F0E0F0E0E0E0F0E0E0D
+ 0D0C0C0D0C0C0D0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F
+ 0E0E141717171400000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000E171717171716100E0E0E0F0E0E0E0E0D0E0D0D0E0D0E0E0E
+ 0E0E0E0F0E0F15171717171717160F13171717171717171717130F0E0F0E0E0D
+ 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0D0D0E
+ 0E0F0E0E0E0F0E0F0E0E0E0E0E0F0E0E0E0E0F0E0D0D0C0C0C0C0C0C0C0D0C0C
+ 0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0D0E0E0F0E11171717170B00000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000E171717
+ 171716100F0E0E0E0F0E0E0E0D0E0D0E0E0E0F0E0F0E0E0E1317171717171717
+ 110B00000C1317171717171717150E0E0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D
+ 0D0D0D0C0D0D0D0D0C0D0D0D0D0C0D0D0C0D0E0E0E0E0E0F0E0E0E0E0F0E0F0E
+ 0E0E0F0E0F0E0E0E0E0D0D0C0D0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0F0E0E0F0F171717170D00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000E161717171717110E0F0E0E0E0E0E
+ 0E0D0E0E0F0E0E0E0E0F1016161717171717150C0000000000000B1016171717
+ 17170E0F0E0E0E0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D
+ 0D0D0D0D0C0D0E0F0E0F0E0E0E0F0E0E0E0E0F10131517110E0E0F0E0F0E0D0C
+ 0C0C0C0C0C0C0D0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0F0E0E16
+ 1717171000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000C151717171717140E0E0F0E0E0F0E0E0F0E0E0E0F0E0F131717
+ 171717171710000000000000000000000B0F171717170F0E0F0E0E0D0D0D0D0D
+ 0D0D0D0D0D0D0D0D0D0D0D0C0D0D0D0C0D0D0D0D0C0D0D0C0D0E0E0E0E0E0E0F
+ 0E0E10131415171717171717110E0E0E0E0E0E0E0C0D0C0C0D0C0C0C0C0D0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0E0E0E0F14171717140000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000
+ }
+ Transparent = False
+ end
+ object Label1: TLabel
+ Left = 8
+ Height = 17
+ Top = 254
+ Width = 463
+ Caption = 'Copyright RemObjects Software, 2002-2008. All rights reserved.'#10
+ Font.Color = clWhite
+ Font.Height = -9
+ Font.Name = 'Tahoma'
+ ParentColor = False
+ OnClick = OnCloseClick
+ end
+ object lbl_Version: TLabel
+ Height = 16
+ Top = 31
+ Width = 500
+ Alignment = taCenter
+ AutoSize = False
+ Caption = '[]'
+ Font.Color = clWhite
+ Font.Height = -13
+ Font.Name = 'Tahoma'
+ ParentColor = False
+ end
+ object Label7: TLabel
+ Left = 8
+ Height = 17
+ Top = 280
+ Width = 138
+ Caption = 'Visit our website at'
+ Font.Color = clWhite
+ Font.Height = -9
+ Font.Name = 'Tahoma'
+ ParentColor = False
+ end
+ object Label3: TLabel
+ Cursor = crHandPoint
+ Left = 152
+ Height = 17
+ Top = 280
+ Width = 198
+ Caption = 'http://www.remobjects.com'
+ Font.Color = clWhite
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsUnderline]
+ ParentColor = False
+ OnClick = Label3Click
+ end
+ object btn_Cancel: TButton
+ Left = 418
+ Height = 25
+ Top = 272
+ Width = 77
+ Cancel = True
+ Caption = 'btn_Cancel'
+ Default = True
+ Font.Color = clWhite
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ OnClick = OnCloseClick
+ TabOrder = 0
+ end
+end
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.lrs b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.lrs
new file mode 100644
index 0000000..f99e3a5
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.lrs
@@ -0,0 +1,5159 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TAboutForm','FORMDATA',[
+ 'TPF0'#10'TAboutForm'#9'AboutForm'#4'Left'#3#25#1#6'Height'#3','#1#3'Top'#3
+ +#181#0#5'Width'#3#244#1#18'HorzScrollBar.Page'#3#243#1#18'VertScrollBar.Page'
+ +#3'+'#1#13'ActiveControl'#7#10'btn_Cancel'#11'BorderIcons'#11#0#11'BorderSty'
+ +'le'#7#6'bsNone'#7'Caption'#6#20'About RemObjects SDK'#12'ClientHeight'#3','
+ +#1#11'ClientWidth'#3#244#1#10'Font.Color'#7#7'clWhite'#11'Font.Height'#2#245
+ +#9'Font.Name'#6#6'Tahoma'#7'OnClick'#7#12'OnCloseClick'#8'OnCreate'#7#10'For'
+ +'mCreate'#8'Position'#7#16'poMainFormCenter'#10'LCLVersion'#6#6'0.9.25'#0#6
+ +'TImage'#6'Image1'#6'Height'#3','#1#5'Width'#3#244#1#8'AutoSize'#9#7'OnClick'
+ +#7#12'OnCloseClick'#12'Picture.Data'#10'2N'#2#0#7'TBitmap&N'#2#0'BM&N'#2#0#0
+ +#0#0#0'6'#4#0#0'('#0#0#0#244#1#0#0','#1#0#0#1#0#8#0#0#0#0#0#240'I'#2#0#194#30
+ +#0#0#194#30#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128#0#128#0
+ +#0#0#128#0#128#0#128#128#0#0#192#192#192#0#192#220#192#0#240#202#166#0#0#0#0
+ +#0#11#11#11#0#21#21#21#0#27#27#27#0'"""'#0'+++'#0'333'#0';;;'#0#3''#1#0'CCC'
+ +#0'KKK'#0'SSS'#0'[[['#0'```'#0'jjj'#0'rrr'#0'~~~'#0#10#129#3#0#23#133#8#0'$'
+ +#138#13#0','#141#16#0'2'#142#18#0'5'#144#20#0';'#145#22#0'3'#146#29#0'>'#147
+ +#24#0'<'#150'%'#0'7'#152'2'#0'C'#148#25#0'I'#150#27#0'M'#152#28#0'S'#153#30#0
+ +'D'#151'#'#0'W'#155' '#0'\'#156'"'#0'S'#156')'#0'D'#157'7'#0'b'#159'$'#0'O'
+ +#160';'#0'e'#160'%'#0'h'#161'&'#0'l'#162'('#0's'#164'*'#0'z'#167'-'#0'}'#168
+ +'.'#0'g'#163'0'#0'k'#164'1'#0'w'#168'6'#0't'#170'?'#0'{'#170'8'#0'B'#159'@'#0
+ +'M'#162'D'#0'['#165'C'#0'b'#167'B'#0'j'#170'E'#0'v'#172'D'#0'o'#177'['#0'x'
+ +#177'T'#0'b'#175'`'#0'g'#176'b'#0't'#181'g'#0''#182'a'#0'}'#186't'#0#128#169
+ +'/'#0#132#170'1'#0#139#172'3'#0#135#174'<'#0#139#175'='#0#145#174'5'#0#148
+ +#176'7'#0#149#176'8'#0#155#178'9'#0#163#181'<'#0#169#182'>'#0#131#178'N'#0
+ +#142#179'I'#0#158#182'E'#0#148#181'K'#0#155#184'N'#0#140#181'R'#0#133#181'Y'
+ +#0#144#185']'#0#162#183'F'#0#174#184'@'#0#163#185'K'#0#168#185'H'#0#179#186
+ +'B'#0#186#188'E'#0#164#187'T'#0#177#191'V'#0#130#186'l'#0#154#188'a'#0#130
+ +#188'v'#0#145#190'q'#0#192#190'G'#0#193#191'H'#0#172#192'^'#0#180#192'W'#0
+ +#190#193'Q'#0#177#194'_'#0#154#194'v'#0#175#195'i'#0#187#197'e'#0#163#197'x'
+ +#0#187#202'w'#0#190#203'x'#0#196#192'H'#0#203#194'K'#0#210#196'M'#0#214#198
+ +'P'#0#216#199'P'#0#220#200'R'#0#226#202'T'#0#232#204'V'#0#236#205'X'#0#240
+ +#207'Y'#0#244#208'['#0#248#209'\'#0#205#203'j'#0#214#203'd'#0#211#205'l'#0
+ +#203#205's'#0#196#205'{'#0#218#210'x'#0#232#207'`'#0#228#208'i'#0#237#211'l'
+ +#0#244#211'e'#0#248#212'f'#0#227#210'r'#0#235#213'u'#0#227#213'|'#0#250#216
+ +'q'#0#250#217'z'#0#130#130#130#0#141#141#141#0#146#146#146#0#157#157#157#0
+ +#129#191#128#0#163#163#163#0#171#171#171#0#180#180#180#0#190#190#190#0#136
+ +#193#131#0#150#198#137#0#152#201#146#0#166#201#132#0#189#205#130#0#191#209
+ +#141#0#161#206#156#0#172#208#154#0#187#210#149#0#184#212#158#0#169#209#162#0
+ +#179#213#166#0#184#215#168#0#190#216#170#0#191#223#191#0#193#210#141#0#211
+ +#213#139#0#192#212#151#0#205#213#146#0#196#213#152#0#204#216#156#0#212#219
+ +#159#0#244#218#130#0#248#220#132#0#240#220#139#0#227#218#144#0#236#221#148#0
+ +#240#223#149#0#236#224#158#0#245#224#151#0#250#226#152#0#194#215#162#0#193
+ +#217#171#0#200#220#174#0#214#220#160#0#218#220#161#0#211#221#168#0#216#223
+ +#170#0#192#222#188#0#208#223#177#0#222#224#172#0#206#225#186#0#211#224#178#0
+ +#217#225#180#0#214#227#189#0#233#226#166#0#245#230#171#0#249#231#172#0#251
+ +#232#173#0#236#229#178#0#245#232#181#0#251#235#183#0#243#234#190#0#252#235
+ +#184#0#196#196#196#0#205#205#205#0#193#223#192#0#212#212#212#0#220#220#220#0
+ +#199#225#194#0#215#230#200#0#209#231#208#0#211#232#208#0#219#234#211#0#226
+ +#231#194#0#228#235#204#0#233#236#206#0#247#236#192#0#251#237#193#0#242#237
+ +#200#0#253#240#204#0#225#236#213#0#236#237#208#0#240#239#209#0#238#240#218#0
+ +#244#240#211#0#250#242#213#0#245#243#221#0#248#244#222#0#227#227#227#0#237
+ +#237#237#0#228#240#224#0#235#242#227#0#242#245#230#0#253#246#224#0#240#247
+ +#239#0#252#248#233#0#241#242#241#0#244#248#240#0#251#250#243#0#255#255#255#0
+ +#0#0#0#0#0#0#0#0#240#251#255#0#164#160#160#0#128#128#128#0#0#0#255#0#0#255#0
+ +#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#21#14#14#14#14#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#14#14#14#14#14#17#23#23#23#23#23#23#23#23
+ +#20#19#17#16#14#12#11#0#0#0#0#11#22#23#23#23#23#21#14#14#14#14#14#14#14#12#13
+ +#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12
+ +#12#12#12#12#12#12#13#14#14#14#14#16#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#21#14#15#14#14#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#14#14#15#14#14#14#22#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#19#17#15#20#23#23#23#23#21#15#14#15#14#15#14#14#12#13#13#13#13
+ +#13#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#13#12#13#12#13#12#13
+ +#12#13#12#13#13#14#15#14#14#19#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#13#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#20#14#14#15#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13
+ +#13#13#13#13#13#13#14#14#15#14#14#17#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#22#15#14#15#14#14#14#14#13#13#12#13#13#12#13#13
+ +#13#13#12#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13
+ +#12#12#13#14#14#15#14#19#23#23#23#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#15#23#22#15#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#21#23#23#23#19#14#14#14#14#14#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#14#14#14#15#14#14#22#22#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#22#16#14#14#14#14#15#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#13#12#13#12#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13
+ +#12#14#14#14#14#14#21#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17
+ +#23#23#23#23#22#15#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#23#23#23#23#19#14#15#14#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#14#14#14#14#15#14#14#16#16#16#16#19#19#20#21#22#23#23#23#23
+ +#23#23#23#23#23#23#16#14#15#14#15#14#14#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12#13#12
+ +#14#14#15#14#14#22#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#17#23
+ +#23#23#23#23#23#23#22#15#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#23#23#23#23#16#14#14#15#14#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#13
+ +#13#13#13#13#13#13#14#14#15#14#14#14#15#14#14#14#15#14#14#14#14#14#14#15#16
+ +#19#20#21#23#23#23#17#14#14#14#14#14#14#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#12
+ +#13#14#14#14#15#14#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#20#23
+ +#23#23#23#23#23#23#23#23#23#22#15#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#16#14#15#14#14#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#14#14#14#15#14#14#14#15#14#14#14#15#14#15#14#15
+ +#14#14#14#15#14#14#16#16#14#15#14#15#14#14#13#13#13#13#12#13#13#13#13#12#13
+ +#13#13#12#13#13#12#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12
+ +#13#12#12#14#15#14#14#16#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12
+ +#21#22#23#23#23#23#22#23#23#23#23#23#23#23#22#15#11#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#15#14#14#14#15#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#14#14#14#14#15#14#14#14#15#14#14#14
+ +#15#14#14#14#15#14#14#14#14#15#14#14#14#14#14#14#14#13#13#13#12#13#13#13#12
+ +#13#13#13#13#12#13#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#13#13#14#14#14#15#17#22#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#12#21#23#23#23#23#23#17#14#17#21#23#23#23#23#23#23#23#22#15#11#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#14#15#14#14
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#14#13#14#13#14
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#14#14#14#14#15#14
+ +#14#15#14#14#14#14#15#14#14#15#14#15#14#14#14#15#14#15#14#14#14#12#13#13#13
+ +#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#13#12#13#13#12#13#13#12#13#12
+ +#13#12#12#12#12#12#12#12#13#12#13#15#14#14#14#19#23#23#23#21#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#12#21#23#23#23#23#23#17#14#14#15#14#17#21#23#23#23#23#23#23
+ +#23#21#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23
+ ,#23#14#14#15#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#13#14#13
+ +#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#14#13#14#14#14#14#14#14#14#14#14#15#14#14#14#14#15#13
+ +#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#13#14#15#14#14#21#23#23#23#19#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#22#23#23#23#23#22#15#15#14#14#14#14#14#15#16
+ +#22#23#23#23#23#23#23#23#21#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#16#23#23#23#21#14#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#14#14#14
+ +#14#15#14#14#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12#13
+ +#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#14#14#14#15
+ +#14#22#22#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#22#16#14#14
+ +#15#14#15#14#14#14#15#14#17#21#23#23#23#23#23#23#23#21#14#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#11#16#22#23#23#23#20#15#14#15#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14#13#14#13#13#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#14#14#13#12#13#13#13#12#13#13#13#12#13#13#13
+ +#13#12#13#13#13#13#12#13#12#13#12#13#13#12#13#13#12#13#12#12#12#13#12#13#12
+ +#13#12#13#12#14#15#14#14#14#23#23#23#23#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23
+ +#23#23#23#21#15#14#14#15#14#14#14#15#14#14#14#14#14#15#19#22#23#23#23#23#23
+ +#23#23#21#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#16#23#23#23#23#23#23#19
+ +#14#14#14#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13
+ +#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12#13#12#13#12
+ +#13#13#12#13#13#12#12#12#12#12#13#12#13#12#14#14#14#15#16#23#23#23#23#12#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#15#14#14#14#15#14#14#15#14#15
+ +#14#14#14#14#15#17#22#23#23#23#23#23#23#23#21#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#11#15#22#23#23#23#23#23#23#23#19#14#15#14#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ ,#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13
+ +#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#13
+ +#15#14#14#14#16#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15
+ +#14#14#14#14#15#14#14#14#14#14#14#14#15#14#15#14#14#15#14#19#22#23#23#23#23
+ +#23#23#23#21#14#0#0#0#0#0#0#0#0#0#0#0#15#21#23#23#23#23#23#23#23#22#16#15#14
+ +#14#15#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14#13
+ +#14#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13
+ +#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#12#13#12#13#12#13#13#12
+ +#13#13#13#12#13#12#13#12#12#12#12#12#13#14#15#14#15#19#22#23#23#22#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#12#23#23#23#23#23#21#15#14#14#15#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#15#14#14#14#15#17#22#23#23#23#23#23#23#23#19#12#0#0#0#0#0#0#0#12
+ +#21#23#23#23#23#23#23#23#22#16#15#14#14#14#15#14#14#13#14#13#13#13#13#13#13
+ +#13#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13
+ +#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#13#14#14#14#14#20#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#21#23#23#23#23#21#15
+ +#14#14#14#14#15#14#14#14#14#14#14#13#14#14#14#14#15#14#14#14#15#14#14#14#15
+ +#19#22#23#23#23#23#23#23#23#19#12#0#0#0#11#19#23#23#23#23#23#23#23#22#16#15
+ +#14#14#14#15#14#14#14#15#13#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#13#13#13#13#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#13#12#13#12
+ +#13#13#12#13#13#12#13#12#12#12#12#12#13#12#13#12#13#14#14#15#14#14#21#23#23
+ +#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#12#21#23#23#23#23#21#15#14#14#15#14#14#14#14#14#14
+ +#14#14#14#14#14#13#14#14#14#14#15#14#14#14#15#14#14#14#15#17#22#23#23#23#23
+ +#23#23#23#19#12#15#21#23#23#23#23#23#23#22#16#15#14#14#14#15#14#14#14#15#14
+ +#14#13#14#13#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14#13#14#13#14#13
+ +#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#13#13#13#12#13#12#13#13#12#13#12#13#12#13#13#12
+ ,#13#13#12#13#12#12#13#12#13#12#14#14#14#15#14#23#23#23#23#16#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#11#22#23#23#23#23#21#15#14#14#14#14#15#14#14#14#14#14#14#14#14#13#14#14#14
+ +#14#13#14#14#14#15#14#14#14#15#14#14#14#15#19#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#22#19#14#14#14#14#15#14#14#14#15#14#14#13#13#14#13#13#14#13#13
+ +#13#13#13#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#13#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12
+ +#12#12#12#14#15#14#14#15#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#20#23#23#23#23#21#15
+ +#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14
+ +#15#14#14#14#15#14#14#15#15#19#23#23#23#23#23#23#23#23#23#23#23#20#14#14#15
+ +#14#15#14#14#14#15#14#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12
+ +#13#12#13#12#13#12#13#13#12#13#13#12#12#13#12#13#12#13#12#13#13#14#14#14#15
+ +#16#22#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23#23#23#22#16#14#14#14#14#15#14#14#14
+ +#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#14#14#14#15#14#14#14
+ +#14#14#15#15#19#23#23#23#23#23#23#23#21#16#14#15#14#14#14#14#14#15#14#14#13
+ +#14#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#13#13#14
+ +#13#14#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#12
+ +#13#13#12#13#13#12#12#13#12#12#13#12#12#13#15#14#14#14#19#23#23#23#23#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#17#23#23#23#23#22#15#14#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#13#14#14#14#14#15#14#15#14#14#14#15#15#19
+ +#23#23#23#22#19#14#14#15#14#14#15#14#15#14#14#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12
+ +#12#13#12#12#13#12#13#14#15#14#14#20#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23
+ +#23#16#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13
+ +#14#14#14#14#14#14#13#14#14#14#14#14#14#14#15#14#14#14#15#15#19#21#15#14#15
+ +#14#14#14#15#14#14#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13
+ +#14#13#13#14#13#13#14#13#13#13#13#13#13#14#13#13#13#14#13#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12
+ +#13#13#13#12#13#12#13#12#13#12#13#13#12#13#13#12#12#13#12#13#12#13#12#13#12
+ +#14#14#14#15#14#21#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#17#14#14#14#14#15
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13
+ +#14#14#13#14#14#14#14#14#14#15#14#14#14#14#15#14#14#14#14#14#15#14#14#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13#14#13
+ +#13#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13
+ +#13#12#13#13#12#13#13#12#13#13#12#13#12#12#12#13#12#13#12#14#14#15#14#14#23
+ +#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#12#21#23#23#23#23#19#14#15#14#15#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14
+ +#14#14#14#14#15#14#15#14#14#14#15#14#15#14#14#14#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13
+ +#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#12#13#13#12#13#12#13
+ +#12#13#12#13#12#12#13#12#13#12#13#12#13#14#14#14#14#15#23#23#23#23#13#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11
+ +#21#23#23#23#23#20#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#14#14#14
+ +#14#14#15#14#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#14#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#12#13#12#13#13#12#13#13#12#13#12#13
+ +#12#13#12#12#12#12#12#15#14#15#14#16#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#23#21#15
+ +#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13
+ +#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#14#14#14#14#15#14#15
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#12#13#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12
+ +#13#14#14#14#14#17#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#23#23#23#23#22#15#14#14#15#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14
+ +#14#14#13#14#14#13#14#14#13#14#14#14#13#14#14#14#14#14#14#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12
+ +#13#13#12#13#13#12#13#13#12#13#12#13#12#12#12#12#13#12#13#12#13#15#14#15#14
+ +#19#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#23#16#14#15#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#13#14#14#13#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#12#13#12#13
+ +#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#14#14#14#14#15#19#23#23#23#23
+ +#23#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#11#21#23#23#23#23#19#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13
+ +#14#14#14#13#14#14#13#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#12
+ +#13#13#12#13#12#13#12#12#12#12#12#14#14#15#14#14#14#19#23#23#23#23#23#22#13#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23
+ +#23#23#20#14#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14
+ +#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#13#12#13#12#13#12#13#12#13#13#12#13#12#13#13#12
+ +#13#12#13#12#13#12#13#14#14#14#14#15#14#14#16#22#23#23#23#23#23#14#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#14#17#14#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#23#23#23#23
+ +#22#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#14#13#14
+ +#14#13#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#12
+ +#12#13#12#13#12#12#12#14#14#15#14#14#15#14#15#22#23#23#23#23#23#14#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#13#15#20#22#23#23#23#22
+ +#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23
+ +#23#21#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14
+ +#14#13#14#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#12#13#13#12#13#12#13
+ +#12#13#12#13#12#13#12#13#12#14#14#14#14#14#14#15#15#21#23#23#23#23#23#14#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#15#19#21#22#23#23#23#23#23#23
+ +#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19
+ +#23#23#23#23#17#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13
+ +#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12#13#12#13#13#12#13#12#13#13
+ +#12#13#12#12#12#12#12#13#12#12#13#12#13#14#15#14#14#14#14#15#21#23#23#23#23
+ +#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#14#16#20#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#11#23#23#23#23#22#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13
+ +#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#12#12#13#13#14#14#15#14#14#14
+ +#15#20#23#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#11#13#15#20#21#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#19#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#13#13#13#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#12#12#13#12#13#12#12
+ +#12#13#14#14#15#14#14#14#15#19#23#23#23#23#23#14#0#0#0#0#0#0#0#12#15#19#21#22
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#22#21#19#16#19#23#23#23#23#20#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#22#23#23
+ +#23#15#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14
+ +#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#12#13#12#13#13#12#13#12#13#13#12#13#12#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#12#14#14#15#14#14#14#15#19#23#23#23#23#23#14#0
+ +#12#14#16#20#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#21#19#17#15
+ +#14#14#14#14#14#21#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#14#23#23#23#23#21#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#13#13#13#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#13
+ +#12#13#12#13#13#12#13#12#12#12#13#12#12#13#12#13#12#13#12#13#12#12#14#14#14
+ +#15#14#14#14#20#23#23#23#23#23#22#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ ,#23#23#21#20#17#16#14#14#14#15#14#15#14#15#14#14#15#22#23#23#23#23#11#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#23#16#14
+ +#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13
+ +#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#12
+ +#12#12#13#12#12#12#13#12#12#14#14#14#14#15#14#14#20#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#20#19#16#15#14#15#14#14#15#14#14#14#14#14#14#14
+ +#15#14#14#17#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#12#22#23#23#23#22#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13
+ +#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12#13#13#12#13#12#13#13
+ +#12#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#13#14#14#14#14
+ +#15#14#14#21#23#23#23#23#23#23#23#23#23#23#23#21#20#16#16#14#14#15#14#14#14
+ +#14#14#15#14#14#15#14#15#14#15#14#14#14#15#14#21#23#23#23#23#14#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#19#14#14#15
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13
+ +#13#12#13#13#12#13#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#12#12
+ +#13#12#12#13#12#13#12#13#14#14#14#14#14#15#14#21#23#23#23#23#23#22#20#19#16
+ +#14#14#14#15#14#14#14#14#14#15#14#15#14#14#14#15#14#14#14#14#14#14#14#14#14
+ +#14#16#22#23#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#11#21#23#23#23#22#15#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14
+ +#13#14#14#14#14#13#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14
+ +#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#12#13#12#13#13#12#13#13#12#13
+ ,#12#12#12#12#13#12#13#12#13#12#13#12#13#12#12#13#12#12#12#13#14#14#15#14#14
+ +#14#15#21#20#19#16#15#14#14#14#14#14#15#14#14#14#15#14#15#14#14#14#14#14#15
+ +#14#14#13#13#12#12#12#13#14#15#14#14#14#19#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#20#14#15#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#12
+ +#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#12#12#12#13#12#12#12#13#12
+ +#13#12#13#12#13#12#13#13#14#14#15#14#14#14#15#14#14#15#14#15#14#15#14#14#14
+ +#15#14#14#14#14#14#15#14#13#13#12#12#12#12#12#12#12#12#12#14#14#14#15#14#15
+ +#21#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#21#23#23#23#23#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#14#13#13#14#13#13#14
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#13#13#12#13#12#13
+ +#12#13#12#13#12#12#13#12#13#12#13#12#12#13#12#12#12#13#12#14#14#14#14#15#14
+ +#14#14#15#14#14#14#14#14#14#15#14#14#14#14#14#13#13#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#14#14#14#14#14#16#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#21#14#14#14#14#15#14#14
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12
+ +#13#13#12#13#13#12#13#12#12#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#12
+ +#13#12#13#12#12#12#14#14#15#14#14#15#14#14#14#15#14#15#14#14#14#13#13#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#15#14#15#14#14#20#23
+ +#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19
+ +#23#23#23#23#17#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14
+ +#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ ,#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#12#13#13#12#13#12#13#13#12#13#12#13#13#12#12#13#12#12#13
+ +#12#13#12#13#12#12#12#12#12#13#12#13#12#12#13#12#12#12#14#14#14#15#14#14#15
+ +#14#14#13#13#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#14#14#14#14#15#15#23#23#23#23#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#22#14#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#12#13#13#12#13#12#13
+ +#12#13#13#12#13#12#13#12#13#12#12#13#12#12#12#13#12#13#12#13#12#13#12#13#12
+ +#12#13#12#12#12#14#14#14#14#13#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#15#14#14#14#14#19#23#23#23
+ +#23#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23
+ +#23#23#19#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14
+ +#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13
+ +#12#13#13#12#13#12#13#13#12#13#13#12#13#12#13#13#12#12#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#12#13#12#13#12#12#13#12#13#12#12#12#12#12#12#13#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#13#15#14#15#14#15#22#23#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23#22#15#14#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12#13#12#13#13#12#13
+ +#12#13#12#13#12#13#12#12#12#13#12#12#13#12#13#12#12#12#13#12#13#12#12#12#12
+ +#12#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#14#14#17#23#23#23#23#16#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23
+ +#20#15#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#14#13#13#14#13#13#14#13#13
+ ,#14#13#13#14#13#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13
+ +#12#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#12#13#12#13#12#13#12#12#12
+ +#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#13#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#13#15#14#15#14#14#22#23#23#23#21#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#20#23#23#23#23#16#14#15#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13
+ +#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#13#13#12#13#13#13#12#13#12#13#13#12#13#13#12#13#12#13#13#12#13
+ +#12#13#12#13#12#12#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12
+ +#13#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#15#14#17#23#23#23#23#17#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#21#14
+ +#14#15#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#12
+ +#13#12#13#12#13#13#12#13#12#13#12#12#13#12#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#12#12#12#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14
+ +#14#14#14#14#22#22#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#17#23#23#23#23#17#15#14#14#15#14#14#14#14#14#14#14#14#14#13
+ +#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#14
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#13#12#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#12#13
+ +#12#13#12#12#13#12#13#12#12#12#12#13#12#13#12#12#13#12#13#12#13#12#13#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#14#15#14#15#14#17#23#23#23#23#16#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#22#23#23#23#22#15#14#14
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14
+ ,#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12
+ +#13#13#12#13#12#13#12#12#13#12#13#12#12#13#12#12#12#12#13#12#13#12#12#13#12
+ +#13#12#12#12#12#12#12#12#12#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14
+ +#14#14#22#22#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#16#22#23#23#23#19#14#15#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14
+ +#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#14#13#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#12#13#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#12#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12
+ +#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#14#14#15#14#14#17#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#21#23#23#23#23#15#14#15#14#14#14
+ +#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#12#13#12#13#12#13#12#13
+ +#13#12#13#12#13#12#12#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#12
+ +#12#12#13#12#13#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#15#14#14#22
+ +#22#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#13#23#23#23#23#21#14#14#15#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14
+ +#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#13#13#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#12#13#13#12#13#13#12#13#12#13#13#12#12#12#13#12#12#13#12#13#12#13#12
+ +#12#12#12#13#12#13#12#12#12#12#12#13#12#12#12#12#12#13#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#14#14#14#14#15#16#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#23#16#15#14#14#15#14#14#14
+ +#13#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13
+ +#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13
+ +#12#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12
+ +#13#12#12#13#12#12#12#12#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#13
+ +#12#13#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#15#14#14#14#22#23#23
+ +#23#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#22
+ +#23#23#23#22#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#12
+ +#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#12#12#12#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#14#14#14#15#14#19#23#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#23#23#23#23#19#14#15#14#14#14#14#14#14#14
+ +#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12#12#12#13#12#12#12#12#13
+ +#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#14#15#22#23#23#23#19#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23
+ +#22#15#14#15#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13
+ +#13#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#12#13#12#13#12#13
+ +#13#12#13#12#13#12#12#13#12#12#12#13#12#13#12#12#12#12#12#12#13#12#13#12#13
+ +#12#13#12#12#12#12#13#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#14#15#14#14#14#20#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#17#14#14#15#14#14#14#14#14#14#14#14#13#14
+ +#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13
+ +#12#13#13#13#12#13#13#12#13#12#13#13#12#13#13#13#12#12#13#12#13#12#12#12#13
+ +#12#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#12#13#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#13#14#15#14#14#15#23#23#23#23#16#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23#22#15#14#14
+ +#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#12#13#13#12
+ +#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#12#13#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#15
+ +#14#14#21#23#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#16#23#23#23#23#17#14#15#14#15#14#14#14#14#14#14#14#13#14#14#14#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13
+ +#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12#13#12
+ +#13#12#13#12#12#13#12#13#12#12#12#12#13#12#13#12#13#12#12#12#12#13#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#14#14#14#14#15#16#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23#22#14#14#14#15#14#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13#13#13
+ +#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#13#12#13#13#12#13#12
+ +#12#12#13#12#12#13#12#12#12#12#12#12#13#12#13#12#13#12#13#12#13#12#12#12#12
+ +#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#15#14#15#14#14#15
+ +#22#23#23#23#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16
+ +#23#23#23#23#17#14#15#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#12#13#12#13#12#13#12#13#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#14#14#14#14#14#14#15#21#23#23#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23#22#14#14#14#14#15#14#14#13#14
+ +#14#14#14#14#13#14#14#14#14#14#14#13#14#14#13#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13#13#14#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#12#13#12#13#13#12#13#13#12#13#12#13#12#13
+ +#12#13#12#13#12#13#12#13#12#13#12#12#12#13#12#12#12#13#12#12#13#12#13#12#12
+ +#12#13#12#13#12#13#14#21#20#21#20#21#20#21#20#21#17#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#15#14#15#14#15#21#23#23
+ +#23#23#21#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#23#23
+ +#23#23#17#14#15#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#13
+ +#14#14#14#13#14#14#13#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#13#13#14#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#12#13#13#12#13#13#12#13#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#13#12#12#12#14#21#26#145#151#207#232#243#243#243#243#243#243
+ +#243#243#243#243#243#243#243#243#243#243#207#207#147#145#20#19#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#14#14#15#14#14#14#15#21#23#23#23#23#22#11#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#21#23#23#23#22#14#14#14#15
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#14#13#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13
+ +#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12#13#12#13#12
+ +#13#13#12#13#12#12#13#12#12#12#12#12#12#12#12#12#13#12#12#12#13#12#12#14#23
+ +#145#207#240#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243
+ +#243#243#243#243#243#243#243#243#243#243#243#243#243#243#210#149#24#19#12#12
+ +#12#12#12#12#12#14#14#15#14#14#15#14#21#23#23#23#23#22#12#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#17#14#15#14#14#14#14#14
+ +#14#14#14#13#14#14#14#14#13#14#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#13#13
+ +#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12#13#13#12#13#13#12#13#12#13
+ +#12#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12#15#22#147#210#243#243#243
+ +#243#243#243#243#243#243#240#207#207#144#145#144#22#20#20#20#20#20#20#20#19
+ +#25#144#144#149#7#210#243#243#243#243#243#243#243#243#243#240#151#26#19#12#12
+ +#14#14#15#14#14#14#15#21#23#23#23#23#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23#23#22#15#14#14#14#15#14#14#14#14#13#14#14
+ +#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#13#14#13#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13
+ +#12#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#12#13#12#13#13#12#13#12#13
+ +#12#13#12#13#12#13#12#13#12#16#26#207#243#243#243#243#243#243#243#232#207#145
+ +#22#20#12#12#12#12#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11#11#11#11
+ +#15#19#25#149#208#243#243#243#243#243#243#243#232#147#24#14#14#14#15#14#21#23
+ +#23#23#23#22#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12
+ +#23#23#23#23#19#14#15#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14
+ +#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#12#13#12#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#15#26
+ +#210#243#243#243#243#243#243#210#147#22#16#12#12#12#12#12#12#12#12#12#12#12
+ +#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#19#144
+ +#151#233#243#243#243#243#243#240#150#20#15#21#23#23#23#23#22#11#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#15#14#14#15
+ +#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#12#13#12#13#13#12
+ +#13#13#12#13#12#13#12#12#12#12#12#12#12#23#151#243#243#243#243#243#240#150#24
+ ,#15#12#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#12#11#12#11#11
+ +#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#19#146#208#243#243#243
+ +#243#243#233#149#24#23#23#21#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#11#12#14#23#23#23#23#20#14#15#14#14#14#14#14#14#14#14#14#14#13
+ +#14#14#14#14#13#14#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#13#13#13
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#12#13#13#12#13#12#13#12#13#13#12#13#12#13#12#13
+ +#12#15#145#232#243#243#243#243#233#150#23#13#13#13#13#13#13#13#12#12#13#12#12
+ +#12#12#12#12#12#12#12#12#12#11#12#11#12#11#12#11#11#12#11#11#11#11#11#11#11
+ +#11#11#11#11#11#0#11#11#0#11#0#0#14#25#208#243#243#243#243#243#207#144#12#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#12#16#16#19#22#22#23#23#23#23
+ +#23#23#16#14#14#15#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#12#13#13#12#13#13#12#13#12#13#13#12#13#12#16#150#233#243#243#243#243#151
+ +#25#14#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11
+ +#12#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0
+ +#11#11#0#11#0#16#146#233#243#243#243#243#7#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#12#13#15#19#19#23#23#23#23#23#23#23#23#23#23#23#23#23#22#14#15#14#14#14#14
+ +#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13
+ +#13#13#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13
+ +#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12#13#12#13#12#13
+ +#13#12#13#12#13#16#150#243#243#243#243#240#145#17#14#14#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12
+ +#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#0#11#0#0#0#23#7
+ +#243#243#243#243#211#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#12#14#16#19#21#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#19#14#14#14#15#14#14#14#14#14#14#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ ,#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13
+ +#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#12#13#13#12#15#149#243
+ +#243#243#243#232#25#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12
+ +#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#11#12#11#11#11#11
+ +#11#11#11#11#11#11#11#11#11#0#11#11#0#11#11#0#11#0#11#0#0#16#147#243#243#243
+ +#243#211#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#11#12#16#16#19#22#22#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#22#20#19#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#13#14#13#13#14
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13
+ +#13#12#13#13#13#12#13#13#12#13#13#12#13#13#12#13#12#15#145#233#243#243#243
+ +#232#25#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#12#12
+ +#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#12#11#12#11#11#11
+ +#11#11#11#11#11#11#11#11#0#11#11#0#11#0#0#11#0#11#0#0#0#14#247#243#243#243
+ +#243#7#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#13#15
+ +#19#19#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#21#20#19#17#16#14#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14
+ +#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#13#12#13#13#13#12#13#12#13#12#13#12#13#13#23#232#243#243#243#232#25#14
+ +#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#12#12
+ +#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#11#12#11#11#11#11#11
+ +#11#11#11#11#11#11#11#11#0#11#11#0#11#11#0#11#0#0#11#0#0#0#14#247#243#243#243
+ +#243#145#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#22#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#21#19#19#16#15#14
+ +#14#15#14#14#14#14#15#14#14#14#14#14#15#14#14#14#14#14#14#14#14#13#14#14#14
+ +#14#13#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#13#13#13#14#13#13#14
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13
+ +#12#13#13#13#13#12#13#13#12#13#13#12#13#13#16#207#243#243#243#240#25#14#15#14
+ +#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12
+ +#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#12#11#11#11#11
+ +#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#0#11#0#0#11#0#0#0#0#14#152#243#243
+ +#243#233#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#22#20#19#17#16#15#14#14#14#14#15#14#15#14
+ +#14#14#15#14#14#14#14#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14
+ ,#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#14#13#14#14#14#13#14#14#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#13#13#12#13#12#13#13#12#26#240#243#243#243#146#16#15#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#12
+ +#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#11#12#11#12#11#11
+ +#11#11#11#11#11#11#11#11#11#0#11#11#0#11#11#0#11#0#0#11#0#0#0#0#0#19#211#243
+ +#243#243#7#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23
+ +#23#23#23#23#23#21#20#19#17#16#14#14#15#14#14#14#14#14#15#14#14#14#14#14#14
+ +#15#14#14#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14
+ +#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13
+ +#13#13#13#13#14#14#14#15#14#14#15#14#14#14#15#14#14#14#15#14#14#14#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#12#16#207#243#243#243#208#19#14#15#14#15#14#15#14
+ +#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11
+ +#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#11#0#0#0#0#0#248
+ +#243#243#243#233#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23
+ +#22#20#19#16#15#14#14#14#14#14#14#15#14#14#15#14#15#14#14#14#15#14#15#14#15
+ +#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13
+ +#14#14#14#14#14#13#14#14#14#14#13#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13
+ +#13#14#14#14#14#14#15#14#14#14#15#14#14#15#14#14#14#15#14#14#14#14#14#14#14
+ +#14#14#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#12#25#240#243#243#240#144#15#15#14#15#14#15#14#14
+ +#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13
+ +#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12
+ +#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#11#0#0#0#0#0
+ +#14#152#243#243#243#150#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#23#23#23
+ +#23#19#14#14#14#14#14#15#14#15#14#14#14#14#15#14#14#14#15#14#14#14#15#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14
+ +#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#13
+ +#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13#14#13#13#14#13#14
+ +#14#14#14#14#15#14#14#14#14#15#14#14#14#15#14#14#15#14#14#14#15#14#15#14#15
+ +#14#14#14#14#14#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13
+ +#13#12#13#13#13#12#13#13#12#15#149#243#243#243#208#19#15#15#15#15#14#15#15#14
+ +#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13
+ +#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11
+ +#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#0#11#0
+ +#0#0#0#0#25#243#243#243#232#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23
+ +#23#23#16#14#15#14#15#14#14#14#14#15#14#15#14#14#14#15#14#14#14#15#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14
+ +#13#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#14
+ +#14#14#14#15#14#14#15#14#15#14#14#14#15#14#14#14#15#14#14#15#14#14#14#14#14
+ +#14#15#14#15#14#15#14#14#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12
+ +#13#13#13#13#12#13#13#13#13#16#210#243#243#243#145#15#15#15#15#14#15#15#14#15
+ +#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12
+ +#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#0#0#11#0#11#0
+ +#0#0#0#0#0#0#15#208#243#243#243#25#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22
+ +#23#23#23#14#14#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#14#14
+ +#14#15#14#14#14#15#14#14#14#14#15#17#19#19#21#21#21#21#21#21#20#19#19#16#15
+ +#14#14#14#14#14#14#14#14#14#15#14#13#13#13#13#13#13#13#12#13#13#13#12#13#13
+ +#13#13#12#13#13#13#13#12#13#21#240#243#243#232#21#15#15#15#15#15#15#15#15#15
+ +#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13#13
+ +#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12
+ +#11#12#11#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#11#0#11#0
+ +#0#11#0#0#0#0#0#0#0#12#147#243#243#243#147#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#19#23#23#23#21#15#14#14#14#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#14
+ +#14#14#15#14#14#15#14#14#14#17#20#21#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#21#19#16#14#15#14#15#14#14#14#14#14#14#13#13#12#13#13#13#13#12#13#13
+ +#13#12#13#13#13#13#12#13#13#13#24#243#243#243#152#17#15#15#15#15#15#15#15#15
+ +#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13
+ +#14#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12
+ +#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11
+ +#0#0#11#0#0#11#0#11#0#0#0#0#0#0#23#233#243#243#208#11#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#21#23#23#23#19#14#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14
+ +#14#14#15#14#14#14#15#14#15#19#22#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#21#17#15#14#14#15#14#15#14#14#14#13#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#13#13#13#12#150#243#243#243#146#16#15#15#15#15#15#15#15
+ +#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12
+ +#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11
+ ,#11#0#11#11#0#11#0#0#11#0#0#0#0#0#0#0#0#15#232#243#243#211#15#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#11#22#23#23#23#17#14#14#14#14#14#14#15#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#14#15#14#14#14#15#14#15#20#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#22#19#15#14#14#14#14#15#14#14#14#12#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#13#150#243#243#240#26#16#15#16#15#15#15#15
+ +#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14
+ +#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12
+ +#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11
+ +#11#11#0#11#11#0#11#0#11#0#11#0#0#11#0#0#0#0#0#0#0#11#208#243#243#233#15#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#15#15#14#15#14#14#14#14#14#14#15#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#13#14#15#14#14#14#15#14#15#19#23#23#23#23#23#23#23#23#23#23#23#19#19#16
+ +#15#16#15#16#19#20#23#23#23#23#23#23#23#23#23#23#22#17#15#14#14#14#14#15#14
+ +#14#12#13#13#13#13#12#13#13#13#12#13#13#14#210#243#243#240#21#16#15#16#15#16
+ +#15#16#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#12#12#13#12
+ +#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11#11
+ +#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#0#11#0#0#0#0#0#0#11#247#243#243
+ +#233#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#14#14#14#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#14#14#14#14#15#14#14#17#22#23#23#23#23#23#23#23#22#17#14#11#0#0
+ +#0#0#0#0#0#0#0#0#0#12#15#20#23#23#23#23#23#23#23#23#21#16#14#15#14#14#14#14
+ +#14#13#13#12#13#13#13#12#13#13#13#14#210#243#243#240#22#16#15#16#15#16#15#16
+ +#15#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12
+ +#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11
+ +#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#11#0#0#0#0#0#0#0#0#0#147#243#243
+ +#243#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#21#14#15#14#15#14#14#14#14#15#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#14#15#14#15#14#14#15#20#23#23#23#23#23#23#23#19#14#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#11#16#21#22#23#23#23#23#23#22#17#14#14#15#14#14#14#14#13#13
+ ,#13#12#13#13#13#12#15#210#243#243#210#17#16#16#16#16#15#16#15#16#15#16#15#15
+ +#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14
+ +#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12
+ +#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11#11#11#11#11
+ +#11#11#11#0#11#11#0#11#0#0#0#11#0#0#11#0#0#0#0#0#0#0#0#145#243#243#243#23#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#20#23#23#23#20#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#15#14
+ +#14#14#14#16#21#23#23#23#23#23#23#19#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#14#21#23#23#23#23#23#23#20#14#14#15#14#14#14#14#13#13#13#12#13#13#15
+ +#210#243#243#210#19#16#16#16#16#16#16#15#16#15#16#15#15#16#15#15#15#15#15#15
+ +#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13
+ +#14#13#14#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12
+ +#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11
+ +#0#11#11#0#0#11#0#0#0#11#0#0#0#0#0#0#0#23#243#243#243#17#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#23
+ +#23#23#23#19#14#15#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#14#14#14#14#15#14#16#22#23
+ +#23#23#23#23#21#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16
+ +#21#23#23#23#23#23#21#15#14#14#15#14#14#14#12#13#13#13#12#207#243#243#211#17
+ +#16#16#16#16#16#16#16#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15#15
+ +#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11
+ +#12#11#12#11#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0
+ +#11#0#11#0#0#0#0#0#0#0#0#0#23#243#243#233#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#16#14
+ +#14#15#14#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13
+ +#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#14#14#15#14#14#14#16#22#23#23#23#23#23#16#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#20#23#23#23#23#23
+ +#21#15#14#14#14#15#14#13#13#13#13#150#243#243#210#19#16#16#16#16#16#16#16#16
+ +#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14
+ +#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13
+ +#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11
+ +#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#11#0#0#0#0
+ +#0#0#0#0#26#243#243#233#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#15#14#15#14#14#14#15#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13
+ ,#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#14#14#14#15#14#16#22#23#23#23#23#21#13#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#23#21#15#14#14#14#14
+ +#14#13#13#147#243#243#240#19#16#17#16#16#16#16#16#16#16#16#16#16#15#16#15#16
+ +#15#16#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#12#12#13
+ +#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11
+ +#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#0#11#0#0#0#0#0#0#0#147#243
+ +#243#233#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#16#22#23#23#23#14#14#14#14#15#14#14#14#14#14#15#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#15#14
+ +#14#14#15#22#23#23#23#23#22#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#20#15#14#15#14#14#14#25#243#243
+ +#233#22#17#16#16#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#16#15#15
+ +#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14
+ +#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12
+ +#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11
+ +#11#11#0#11#11#0#11#0#11#0#11#0#11#0#0#0#0#0#0#0#0#0#147#243#243#208#11#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#16#23#23#23#21#14#15#14#14#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#14#14#15#14#15#21#23#23#23
+ +#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#14#23#23#23#23#23#19#14#14#15#14#22#243#243#243#22#17#16#17#16#17#16
+ +#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15
+ +#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14
+ +#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12
+ +#12#11#12#11#12#11#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11
+ +#0#0#0#11#0#0#11#0#0#0#0#0#0#0#0#208#243#243#147#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#21#14#14
+ +#15#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13
+ +#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#15#14#14#14#14#19#23#23#23#23#22#11#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23
+ +#23#16#14#14#19#233#243#243#144#17#17#16#17#16#16#17#16#16#16#16#16#16#16#16
+ +#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15
+ +#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13
+ +#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12
+ +#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#11#0#0#11#0#0#0#11#0
+ +#0#0#0#0#0#11#208#243#243#26#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#19#15#14#14#14#15#14#14#14#14#14
+ ,#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#14#14
+ +#14#15#14#15#16#23#23#23#23#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#22#14#15#210#243#243
+ +#150#16#17#17#16#17#17#16#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16
+ +#15#16#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14
+ +#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13
+ +#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11
+ +#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#11#0#0#0#0#0#0#0#0#16#233#243
+ +#243#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#23#23#23#23#19#14#14#15#14#14#14#14#14#14#15#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#13#14#13#13#13#13#14#13#13#14#13#13#13#14#14#14#14#14#15#21#23#23#23
+ +#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#19#23#23#23#23#19#147#243#243#208#17#17#17#17#17#16#17#16#17
+ +#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#16#15#15#15#15#15
+ +#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14
+ +#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12
+ +#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11
+ +#11#0#11#0#11#0#11#0#0#11#0#0#0#0#0#0#0#20#243#243#233#11#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#23#23#23#23#16#14#15
+ +#14#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13
+ +#13#14#13#13#14#13#14#15#14#15#14#19#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23
+ +#146#243#243#240#20#17#17#17#16#17#17#16#17#16#17#16#16#17#16#16#16#16#16#16
+ +#16#16#16#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14
+ +#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13
+ +#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11
+ +#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#0#11
+ +#0#0#0#0#0#0#145#243#243#7#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#12#22#23#23#23#16#14#14#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#14#14#14
+ +#14#15#22#23#23#23#21#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#23#23#24#240#243#243#24#17#17#17#17
+ +#17#17#17#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16
+ +#15#16#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14
+ +#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13
+ +#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11
+ +#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#11#0#0#0#0#0#0#0#0#208#243#243
+ +#25#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#17#19#20#19#19#20#19#19#20#19#19#20#16#15#16#15#12#12#11
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#12#23#23#23#23#15#15#14#14#14#14#15#14#14#14#15#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#14#15#14#15#14#19#23
+ +#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#208#243#243#147#17#17#17#17#17#17#17#17
+ +#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#16
+ +#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14
+ +#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12
+ +#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11#11#11
+ +#11#11#11#11#11#0#11#11#0#11#0#0#0#11#0#0#11#0#0#0#0#0#0#14#233#243#243#15#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#11#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#21#19#16#16#12#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#14#14#15#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#14#14#14#14#15#22
+ +#23#23#23#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#147#243#243#210#19#17#17#17#17#17#17#17
+ +#17#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16
+ +#15#15#16#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#12#12#13
+ +#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11
+ +#11#11#11#11#11#11#11#0#11#11#0#11#11#0#0#11#0#0#0#11#0#0#0#0#0#20#243#243
+ +#208#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#16#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#19#16#14#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#14#15#14#14#15#14#14#14#15#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#14#14#15
+ +#14#14#17#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#240#243#243#23#17#17#17#17#17
+ +#17#17#17#17#17#17#17#17#16#17#16#17#16#16#17#16#16#16#16#16#16#16#16#16#16
+ +#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15
+ +#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11
+ +#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#11#0#0#0#0#0#0#0
+ +#150#243#243#26#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#22#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#23#23#23#22#14#14#14#15#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14
+ +#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14
+ +#14#14#15#14#21#23#23#23#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#150#243#243#147#19#17#19#17
+ +#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16
+ +#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15
+ +#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13
+ +#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12
+ ,#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#11#0#0
+ +#0#0#0#12#233#243#233#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#20#19#17#19#19#19#21#20#21#21
+ +#20#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#11#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#21#14#15#14#14
+ +#14#14#14#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14
+ +#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13
+ +#14#13#14#14#15#14#14#15#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#243#243#211#19
+ +#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16
+ +#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15
+ +#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13
+ +#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11
+ +#12#11#12#11#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0
+ +#11#0#0#0#11#0#0#0#0#25#243#243#152#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#22#14#14#15#14#14#14
+ +#14#15#14#14#14#14#14#14#16#16#17#19#20#21#23#23#23#23#23#23#23#23#23#23#13#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#23#23#23#21
+ +#14#14#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13
+ +#13#13#14#13#13#14#13#14#14#14#15#17#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#211
+ +#243#243#25#19#17#19#19#17#19#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17
+ +#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#16#15#15#15#15#15
+ +#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12
+ +#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11
+ +#11#0#11#0#11#0#11#0#11#0#0#0#0#0#0#7#243#243#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#19#15#14
+ +#14#14#15#14#14#14#14#15#14#15#14#14#14#15#14#14#14#14#14#15#16#19#21#21#23
+ +#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19
+ +#23#23#23#21#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#14#13#14#13#13#14#13#14#15#14#14#14#20#23#23#23#21#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#25#243#243#151#19#19#19#17#19#17#19#17#19#17#17#17#17#17#17#17#17#17#17
+ +#17#16#17#16#17#16#16#17#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#15
+ +#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14
+ +#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12
+ +#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11#11#11#11
+ +#11#11#11#11#0#11#11#0#11#0#0#0#11#0#0#11#0#0#0#0#16#243#243#211#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#23#23
+ +#23#23#15#14#14#15#14#14#15#14#15#14#14#14#14#15#14#14#14#14#15#14#15#14#14
+ +#15#14#14#14#21#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#19#23#23#23#21#14#14#14#15#14#14#14#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#14#15#14#14#23#23#23#23#16#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#11#240#243#240#20#19#19#19#17#19#19#17#19#17#17#17#17#17#17
+ +#17#17#17#17#17#17#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#16#16#15
+ +#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14
+ +#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13
+ +#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11
+ +#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#11#0#0#11#0#0#0#11#0#0#0#147#243
+ +#243#23#0#0#0#0#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#22#23#23#23#20#14#15#14#14#14#15#14#14#14#14#15#14#14#14#15#14#15
+ +#14#14#14#14#14#15#14#14#15#14#19#23#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#20#14#15#14#14#14#14#15#14#14#14
+ +#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#14#13#13#14#13#14#15#14#14
+ +#15#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#26#243#243#247#19#19#19#19#19#17#19#19
+ +#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16#16
+ +#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15
+ +#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12
+ +#11#12#11#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11
+ +#0#11#0#0#0#0#12#233#243#233#11#0#12#19#23#21#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#17#14#14#14#15#14#13#14#14
+ +#14#14#14#14#14#14#14#14#14#14#15#14#15#14#14#14#15#14#14#16#23#23#23#23#11#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#19#14
+ +#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13
+ +#13#14#13#13#14#14#14#14#15#16#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#240#243#232
+ +#21#19#19#19#19#19#17#19#17#19#19#17#17#19#17#17#17#17#17#17#17#17#17#17#17
+ +#16#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#16#15
+ +#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14
+ +#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12
+ +#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11
+ +#11#11#11#0#11#11#0#11#0#11#0#11#0#0#11#0#0#0#248#243#243#146#20#23#23#23#23
+ +#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23
+ +#23#22#14#15#14#14#14#14#13#13#13#13#13#13#13#14#13#14#13#14#13#14#14#14#14
+ +#14#14#14#14#15#15#23#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#19#23#23#23#19#14#15#14#14#14#14#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#14#14#15#14#14#17#23#23#23#23#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#26#243#243#145#19#19#19#19#19#19#19#19#19#17#19#17#19#17#17
+ +#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#16#17#16#16#16#16#16#16#16
+ +#16#16#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15
+ +#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13
+ +#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11
+ +#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#0#11#0
+ +#12#233#243#240#24#23#23#23#23#23#22#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#11#23#23#23#23#19#14#14#15#14#14#13#14#13#14#13#14#13#14
+ +#13#13#14#13#13#13#13#13#13#13#14#14#14#15#14#14#23#23#23#23#16#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#19#14#14#14#15#14
+ ,#15#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14
+ +#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#13#13#14#13#13#13
+ +#14#14#14#14#15#19#22#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#240#243#232#19#19#19#19#19
+ +#19#19#19#19#17#19#19#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17#17#16#17
+ +#16#17#16#16#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15
+ +#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14
+ +#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12
+ +#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11
+ +#11#0#11#11#0#11#0#11#0#11#0#11#0#0#0#248#243#243#150#23#23#23#23#23#23#22#11
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#15#15
+ +#14#14#14#14#14#13#13#14#13#14#13#13#14#13#13#14#13#13#13#13#14#13#13#14#14
+ +#14#14#15#20#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#19#23#23#23#19#14#15#14#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#14#13#13#14#13#14#13#13#14#13#14#13#14#15#14#14#19#23#23#23#19#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#26#243#243#145#19#19#19#19#19#19#19#19#19#19#19#17#19#19#17#19#17#19
+ +#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16#16
+ +#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15
+ +#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13
+ +#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11
+ +#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#0#0#11#0#0#11#0#12
+ +#233#243#233#23#23#22#23#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#11#21#23#23#23#21#14#14#14#15#14#13#13#14#13#13#13#13#14#13#13
+ +#14#13#13#13#14#13#13#13#13#13#14#14#15#14#14#19#23#23#23#21#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23#23#22#19#15#14#15#14#15
+ +#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14
+ +#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14
+ +#14#14#14#15#17#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#211#243#240#20#19#20#19#19#19#19
+ +#19#19#19#19#19#19#17#19#19#17#19#17#17#17#17#17#17#17#17#17#17#17#17#17#16
+ +#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#16#15#15
+ +#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14
+ +#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12
+ +#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11
+ +#11#11#0#11#11#0#11#11#0#0#11#0#0#0#0#144#243#243#145#15#15#22#23#23#23#23#23
+ +#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#17#14#15
+ +#14#14#14#14#13#13#14#13#14#13#13#14#13#13#13#14#13#13#13#13#13#14#13#14#14
+ +#14#14#15#17#22#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#23#23#23#23#23#23#23#20#16#14#14#14#15#14#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#13#13#14#13#13#14#13#13#13#14#14#15#14#14#19#23#23#23#19#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#23#243#243#149#19#20#19#19#19#19#19#19#19#19#19#19#19#19#17#19#19#17#19
+ +#17#19#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#16#17#16#16#16#16#16
+ +#16#16#16#16#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15#15#15#14#15
+ +#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12
+ +#11#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#11
+ ,#0#12#243#243#210#14#14#15#21#23#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#20#23#23#23#22#14#15#14#14#14#14#13#13#14#13#13#13#14#13#13
+ +#14#13#14#13#13#14#13#14#13#13#13#13#14#15#14#14#15#23#23#23#23#12#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#22#23#23#23#23#23#23#23#23
+ +#21#17#14#14#14#15#14#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14
+ +#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13
+ +#14#13#14#14#14#15#17#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#208#243#243#21#20#19#20#19#20
+ +#19#19#19#19#19#19#19#19#19#19#17#19#17#19#17#19#17#17#17#17#17#17#17#17#17
+ +#17#17#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15
+ +#16#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12
+ +#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11
+ +#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#0#247#243#243#22#14#14#15#21#23
+ +#23#23#23#23#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#19
+ +#14#14#14#15#14#13#14#13#13#14#13#14#13#14#13#13#14#13#13#13#13#13#13#13#13
+ +#13#14#14#14#14#15#14#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#11#14#21#23#23#23#23#23#23#23#23#22#19#15#14#14#14#14#15
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#14#13#13#14#13#14#13#13#14#14#15#14#14#19#23#23#23
+ +#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#15#243#243#152#19#20#19#20#19#19#20#19#19#19#19#19#19#19#19#19
+ +#19#19#17#19#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17
+ +#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15
+ +#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14
+ +#13#14#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11
+ +#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0
+ +#11#0#11#0#11#0#0#16#243#243#150#15#14#14#15#21#23#23#23#23#23#17#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#15#14#15#14#14#14#13#13#14#13#13
+ +#14#13#13#13#14#13#13#13#13#13#13#13#13#14#13#13#13#14#15#14#14#14#21#23#23
+ +#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#19
+ +#23#23#23#23#23#23#23#23#22#20#15#14#15#14#14#15#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#13#13#14#13#14#14#14#14#15#17#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#147#243#243#24#20#20
+ +#19#20#19#20#19#19#19#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19#17#17#17
+ +#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16
+ +#16#15#16#15#16#15#15#16#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14
+ +#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12
+ +#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#11#0#11#0#0#208#243#243
+ +#16#14#14#14#15#20#23#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11
+ +#21#23#23#23#21#14#14#14#15#14#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13
+ +#14#13#14#13#13#13#13#13#14#14#14#15#14#20#23#23#23#20#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#17#23#23#23#23#23#23#23
+ +#23#23#20#16#14#14#14#14#14#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#13#13#13#15#14#14
+ +#14#16#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#233#243#232#20#20#20#20#19#20#19#20#19#20#19
+ +#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19#17#17#17#17#17#17#17#17#17#17
+ +#17#17#16#17#16#17#16#16#17#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15
+ +#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14
+ +#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12
+ +#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11#11#11
+ +#11#11#11#11#11#0#11#11#0#11#0#0#11#0#11#23#243#243#25#15#14#14#14#15#19#23
+ +#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#16#15#14#14
+ +#14#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#14#13#14#13
+ +#13#14#15#14#14#17#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#14#22#21#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#16#22#23#23#23#23#23#23#23#23#21#17#15#14
+ +#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#14#13#13#13#14#13#14#13#14#15#14#14#15#23#23#23#23#13#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#20#243#243#147#20#20#19#20#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19
+ +#19#19#17#19#19#17#17#19#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16
+ +#16#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15
+ +#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13
+ +#14#13#14#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12
+ +#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11
+ +#0#11#11#0#11#0#12#233#243#210#14#15#14#14#14#15#19#23#23#23#23#23#19#11#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23#23#22#14#14#15#14#14#14#13#14#13#14#13#13
+ +#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#14#14#14#14#15#16#23#23
+ +#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#19#23#23
+ +#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#11#14#21#23#23#23#23#23#23#23#23#21#19#15#14#14#14#14#15#14#14
+ +#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13
+ +#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14
+ +#13#14#13#14#13#14#14#14#15#14#14#22#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#147#243#243#23#20#20
+ +#20#20#20#19#20#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#17#19#19#17#19
+ +#17#19#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16
+ +#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15#14#15
+ +#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12
+ +#11#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#0#0#11#0#247
+ +#243#243#17#14#15#14#14#14#15#19#23#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#12#23#23#23#23#19#14#14#14#15#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13
+ +#13#13#14#13#14#13#13#13#13#13#13#14#15#14#14#14#23#23#23#23#15#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#23#23#23#23#23#23#23#22#12#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#14#19#23#23#23#23#23#23#23#23#22#20#15#14#15#14#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14
+ +#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#13#13#13#13#13#13#14
+ +#14#14#14#15#20#23#23#23#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#233#243#207#20#20#20#20#20#20#20#19#20#19
+ +#20#19#19#20#19#19#19#19#19#19#19#19#19#19#17#19#19#17#19#17#17#17#17#17#17
+ +#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15
+ +#16#15#16#15#15#16#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14
+ +#14#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13
+ +#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11
+ +#11#11#11#11#11#11#11#11#11#11#0#11#11#0#11#11#0#11#21#243#243#144#14#14#15
+ +#14#14#14#15#17#23#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23
+ +#15#14#15#14#14#14#13#13#14#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13
+ +#13#14#13#13#13#13#14#14#14#15#14#21#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#12#20#23#23#23#23#23#23#23#23#23#23#16#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#17#22
+ +#23#23#23#23#23#23#23#23#20#16#14#14#14#14#15#14#15#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#14#13#14#13#15#14#14#14#17
+ +#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#20#243#243#145#20#20#20#20#20#20#20#20#20#19#20#19#20#19
+ +#19#19#19#19#19#19#19#19#19#19#19#17#19#19#17#19#17#19#17#17#17#17#17#17#17
+ +#17#17#17#17#16#17#16#17#16#16#17#16#16#16#16#16#16#16#16#16#16#15#16#15#16
+ +#15#15#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#12#12#13
+ +#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11
+ +#11#11#11#11#11#11#11#0#11#11#0#11#0#0#11#233#243#207#14#14#14#15#14#14#14#15
+ +#16#23#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23#20#14#15#14#14#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13#13#13#13#13
+ +#13#14#14#14#14#14#20#23#23#23#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#11#16#23#23#23#23#23#23#23#23#23#23#23#23#23#19#11#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#16#21#23#23
+ +#23#23#23#23#23#23#22#17#14#14#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#14#13#13#14#13#14#13#14#13#14#15#14#15#15#23#23#23#23
+ +#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#147#243#243#23#20#20#20#20#20#20#20#20#20#19#20#20#19#20#19#20#19#19
+ +#19#19#19#19#19#19#19#19#17#19#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17
+ +#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15
+ +#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14
+ +#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12
+ +#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11#11#11#11
+ +#11#11#11#11#0#11#11#0#11#11#0#247#243#243#15#14#14#14#15#14#14#14#15#16#23
+ +#23#23#23#23#22#11#0#0#0#0#0#0#12#14#16#20#23#23#23#23#16#15#14#14#15#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#14#13#13#13#13#13#13
+ +#14#14#15#14#14#19#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13
+ +#22#23#23#23#23#23#23#21#15#16#22#22#23#23#23#23#22#11#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#14#21
+ +#23#23#23#23#23#23#23#23#22#19#15#14#14#14#14#14#15#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#13#14#13#13#13#13#13#13#14#14#14#14#14#14#21#23#23#23
+ +#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#233#243#211#21#20#20#20#20#20#20#20#20#20#20#19#20#19#20#19#19#19#19
+ +#19#19#19#19#19#19#19#19#19#19#17#19#17#19#17#19#17#17#17#17#17#17#17#17#17
+ +#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#16
+ +#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14
+ +#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12
+ +#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11#11#11#11#11
+ +#11#11#11#11#11#0#11#11#0#11#0#23#243#243#25#14#14#14#14#15#14#14#14#15#16#23
+ +#23#23#23#23#22#11#0#12#15#19#22#23#23#23#23#23#23#23#22#14#14#14#15#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#14#13#13#13#13
+ +#13#14#14#15#14#16#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#19
+ +#23#23#23#23#23#23#22#17#14#15#14#15#20#23#23#23#23#23#23#14#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#13#19#23#23#23#23#23#23#23#23#23#20#15#14#15#14#14#14#15#14#14#14#14#14#14
+ +#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#13#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#14#13#14#13#13#14#14#15#14#14#17#23#23#23
+ +#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#15#243#243#149#21#20#20#20#20#20#20#20#20#20#20#20#20#19#20#19#20#19
+ +#20#19#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19#17#17#17#17#17#17#17#17
+ +#17#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16
+ ,#15#15#16#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#12#12#13
+ +#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#12#11#11#11#11#11
+ +#11#11#11#11#11#11#11#0#11#11#0#11#12#243#243#150#14#14#14#14#14#14#15#14#14
+ +#14#16#22#23#23#23#23#22#21#23#23#23#23#23#23#23#23#23#23#23#19#14#15#14#14
+ +#14#14#13#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#13#13#13#14#13#13#13
+ +#13#13#13#13#15#14#14#14#15#22#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#16#21#23#23#23#23#23#23#20#15#15#14#14#14#14#14#17#23#23#23#23#23#23#17#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#12#17#22#23#23#23#23#23#23#23#23#21#16#14#15#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14#13#14#13#14#14#14#15#14#15#22
+ +#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#25#243#243#25#20#20#21#20#20#20#20#20#20#20#20#20#20#19#20#20#19
+ +#20#19#20#19#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19#17#17#17#17#17#17
+ +#17#17#17#17#17#17#16#17#16#17#16#16#17#16#16#16#16#16#16#16#16#16#16#15#16
+ +#15#16#15#15#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14
+ +#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#11#12#11#11#11
+ +#11#11#11#11#11#11#11#11#11#0#11#11#0#11#208#243#232#14#14#14#13#14#14#14#14
+ +#15#14#14#15#22#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#15#14#14#14
+ +#15#13#13#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#14#13#13#13#13#13
+ +#13#13#13#13#13#14#14#15#14#14#22#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#12#20#23#23#23#23#23#23#22#16#14#14#14#14#15#14#15#14#14#16#22#23#23#23#23
+ +#23#19#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#11#16#21#23#23#23#23#23#23#23#22#14#14#14#15#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#14#15#14#14
+ +#14#20#23#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#150#243#240#21#20#21#20#20#20#20#20#20#20#20#20#20#20#20
+ +#19#20#19#20#19#19#19#19#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19#17#17
+ +#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16
+ +#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14
+ +#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13
+ +#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11
+ +#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#0#144#243#243#17#14#14#14#13
+ +#14#14#14#14#15#14#14#16#22#23#23#23#23#23#23#23#23#23#23#21#20#19#16#15#15
+ +#14#15#14#14#14#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#14#13#13#13#13
+ +#13#14#13#13#13#13#13#13#14#14#14#14#15#20#23#23#23#21#14#11#0#0#0#0#0#0#0#0
+ +#0#0#0#11#16#23#23#23#23#23#23#23#19#15#14#15#14#15#14#14#14#14#15#14#14#15
+ +#21#23#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#14#21#23#23#23#23#23#23#14#15
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14
+ +#14#14#14#13#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#14#13#14#13#14#13
+ +#14#14#14#15#14#15#23#23#23#23#21#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#233#243#207#21#20#21#20#21#20#20#20#20#20#20
+ +#20#20#20#20#20#20#19#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#17#19#19
+ +#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16#16
+ +#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15
+ +#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13
+ +#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#11#12#12#11#12
+ +#11#12#11#11#11#12#11#11#11#11#11#11#11#11#11#11#11#11#0#11#11#19#243#243#25
+ +#14#14#14#13#14#14#14#14#14#15#14#14#15#22#23#23#23#23#23#21#19#16#15#14#14
+ +#14#15#14#14#14#14#14#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13
+ +#13#14#13#14#13#13#13#13#13#13#13#13#14#14#15#14#14#19#23#23#23#23#23#21#17
+ +#12#0#0#0#0#0#0#0#0#13#22#23#23#23#23#23#23#21#15#14#14#14#14#14#14#14#14#15
+ +#14#14#14#15#14#14#20#23#23#23#23#23#21#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#19#23
+ +#23#23#23#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14
+ +#14#13#14#14#14#14#13#14#14#14#13#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#13#13#14#13
+ +#14#13#14#13#14#13#14#14#14#14#14#19#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#243#243#150#20#21#20#21#20#21
+ +#20#20#20#20#20#20#20#20#20#20#20#19#20#19#20#19#19#20#19#19#19#19#19#19#19
+ +#19#19#19#17#19#19#17#19#17#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17
+ +#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#16#15#15#15#15#15
+ +#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12
+ +#12#12#12#11#12#12#11#12#11#12#11#12#11#15#11#11#11#11#11#11#11#11#11#11#0#11
+ +#11#243#243#150#14#13#14#14#13#14#14#14#14#14#14#15#14#15#21#21#20#16#15#14
+ +#14#14#14#15#14#14#14#15#14#15#14#14#14#13#13#13#13#14#13#13#14#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#14#14#15#16#22#23
+ +#23#23#23#23#23#23#20#14#0#0#0#0#11#19#23#23#23#23#23#23#22#17#14#15#14#15#14
+ +#15#14#15#13#13#13#14#15#14#14#14#15#14#17#23#23#23#23#23#22#11#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#12#23#23#23#23#16#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14
+ +#13#14#13#13#13#13#13#13#13#13#14#14#14#15#14#15#14#22#23#23#23#23#12#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#23#243#243#26#21
+ +#21#20#21#20#20#21#20#20#20#20#20#20#20#20#20#20#20#20#19#20#19#20#19#19#19
+ +#19#19#19#19#19#19#19#19#19#17#19#19#17#19#17#19#17#17#17#17#17#17#17#17#17
+ +#17#17#16#17#16#17#16#16#17#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15
+ +#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14
+ +#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12
+ +#12#12#12#12#12#12#12#11#12#12#11#12#11#12#11#11#13#149#151#11#11#11#11#11#11
+ +#11#11#11#11#11#0#11#208#243#210#14#14#13#14#14#13#14#14#14#15#14#14#14#14#14
+ +#15#14#14#14#14#15#14#14#14#15#14#14#14#14#14#15#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#13#14#13#13#13#13#13#14#13#13#13#13#13#13#13#13#15#14
+ +#14#14#15#21#23#23#23#23#23#23#23#23#23#21#14#11#14#22#23#23#23#23#23#23#20
+ +#15#15#14#14#14#14#14#14#14#13#13#12#13#12#14#14#15#14#14#14#15#16#22#23#23
+ +#23#23#22#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#23#23#23#23#17#15#14#15#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#13#14#13#14#13#14#13#14#13#14#13#13#14#14#14#14#14#15
+ +#16#23#23#23#23#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#145#243#243#21#21#21#20#21#21#20#21#20#20#20#20#20#23#20#20#20#20
+ +#20#20#19#20#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#17#19#17#19#17#19
+ +#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#16#16#16#16#16#16#16#16
+ +#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15
+ +#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13
+ +#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#12#12#11#12#13
+ +#210#243#240#11#11#11#11#11#11#11#11#11#11#11#11#0#146#243#243#14#14#14#13#14
+ +#14#13#14#14#14#14#15#14#15#14#14#14#15#14#14#14#15#14#14#14#15#14#15#14#14
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#14#13#14#13#13
+ +#13#13#13#13#13#13#13#13#14#14#15#14#14#14#15#19#22#22#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#22#16#14#14#14#14#15#14#15#14#14#12#13#12#13#13#12#13
+ +#14#14#14#15#14#14#14#16#22#23#23#23#23#21#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23
+ +#23#19#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14
+ +#14#13#14#14#14#13#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#13#13#14#13#14#13
+ +#14#13#14#13#13#14#14#15#14#14#14#20#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7#243#211#21#21#21#21#20#21#20#21
+ +#20#21#20#20#20#210#152#21#20#20#20#20#20#19#20#19#20#19#19#20#19#19#19#19#19
+ +#19#19#19#19#19#19#17#19#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17#16#17
+ +#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15
+ ,#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14
+ +#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12
+ +#12#12#12#11#12#12#11#12#17#232#243#243#243#17#11#11#11#11#11#11#11#11#11#11
+ +#11#11#25#243#243#22#13#14#14#13#14#14#13#14#14#14#14#14#14#14#15#14#14#15#14
+ +#14#14#15#14#14#14#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#14#14#14#15#14#14
+ +#14#14#17#20#23#23#23#23#23#23#23#23#23#23#23#23#19#15#14#15#14#15#14#14#14
+ +#14#13#12#13#13#12#13#12#13#12#13#13#14#14#14#15#14#14#15#22#23#23#23#23#22
+ +#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#21#14#15#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#13#14#14#14#14#13#14#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#14#13#14#13#13#13#13#13#13#13#14#13#14#14#14#14#15#14#15#21#23#23
+ +#23#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#233#243#208#21#21#20#21#21#21#20#21#20#21#20#21#20#243#243#240#144#20#20#20
+ +#20#20#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19
+ +#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16
+ +#16#16#16#16#15#16#15#16#15#15#16#15#15#15#15#15#15#15#15#15#14#15#15#14#15
+ +#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13
+ +#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#11#17#240#243#243
+ +#243#243#26#11#12#11#11#11#11#11#11#11#11#11#11#19#243#243#25#14#14#13#14#14
+ +#13#14#14#13#14#14#15#14#14#14#15#14#14#14#14#14#13#14#13#14#13#14#13#13#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#14#13#13
+ +#13#13#13#13#13#13#13#14#14#15#14#14#14#15#14#14#14#14#15#19#22#23#23#23#23
+ +#23#23#23#21#15#14#14#14#14#14#14#14#14#13#13#13#13#13#12#13#13#12#13#13#12
+ +#13#13#14#15#14#14#15#14#16#22#23#23#23#23#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23
+ +#23#22#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14
+ +#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#14#13
+ +#14#13#14#13#13#13#14#14#14#14#14#14#16#22#23#23#23#23#20#11#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#243#243#150#21#21#21#21#21#21
+ +#20#21#21#20#21#20#25#243#243#243#243#207#21#20#20#20#20#19#20#20#19#20#19#20
+ +#19#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19#17#17#17#17#17#17#17#17#17
+ +#17#17#17#16#17#16#17#16#16#17#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15
+ +#15#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#12#12#13#12
+ +#12#12#12#12#12#12#12#12#11#23#240#243#243#159#243#243#149#11#11#11#11#11#11
+ +#11#11#11#11#11#11#11#243#243#145#14#13#14#14#13#14#14#13#14#14#13#14#15#14
+ +#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#13#13#13#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#14
+ +#14#14#15#14#14#15#14#15#14#14#14#15#17#22#23#23#23#22#19#14#15#14#15#14#15
+ +#14#15#13#13#13#13#13#12#13#13#12#13#13#12#13#12#13#12#13#14#14#15#14#14#14
+ +#15#21#23#23#23#23#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#23#23#23#23#15#14#14#14#15#14#14
+ +#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#14#13#14#13#13#14#13#13#14#14
+ +#15#14#14#14#16#23#23#23#23#23#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#17#243#243#145#21#21#21#21#21#21#21#20#21#20#20#21#145#243
+ +#243#243#243#243#240#144#20#20#20#20#19#20#19#20#19#19#20#19#19#19#19#19#19
+ +#19#19#19#19#17#19#19#17#17#19#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16
+ +#17#16#16#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15
+ +#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13
+ +#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#12
+ +#12#24#243#243#243#154#2#167#243#207#11#12#11#12#11#11#11#11#11#11#11#11#11
+ +#211#243#207#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#14#14#14#14
+ +#14#14#15#14#14#15#14#19#22#21#15#14#14#14#14#14#14#14#14#13#13#13#13#12#13
+ +#13#12#13#12#13#12#13#13#12#13#13#12#13#14#14#14#15#14#14#15#21#23#23#23#23
+ ,#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#16#15#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#13#13#13#13#14#13#13#14#13#14#14#14#15#14#14#14#17#23
+ +#23#23#23#23#23#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#23
+ +#243#243#26#21#21#21#21#21#21#21#21#21#20#21#20#149#243#243'p'#227#243#243
+ +#243#207#21#20#20#20#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#19#19#17#19
+ +#19#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16
+ +#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15
+ +#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13
+ +#13#13#13#13#13#13#13#13#13#12#12#13#12#12#12#12#12#12#24#243#243#243'D'#2#18
+ +#159#243#243#12#11#11#11#11#11#11#11#11#11#11#11#11#7#243#207#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#14#14#14#15#14#14#14#15#14#14#14#14
+ +#14#14#15#14#15#14#15#14#14#12#13#13#12#13#13#13#13#12#13#13#12#13#12#13#13
+ +#12#13#12#12#13#14#14#14#14#15#14#15#22#23#23#23#23#22#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#22#23
+ +#23#23#19#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14
+ +#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#14#15#14#14#14#17#22#23#23#23#23#23#19#12#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#26#243#243#21#21#21#21#21#21
+ +#21#21#21#21#20#21#21#210#243#236'`]'#174#243#243#243#240#144#20#20#20#19#20
+ +#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#17#19#19#17#19#17#17#17#17#17
+ +#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16
+ +#15#16#15#16#15#15#16#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15
+ +#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13
+ +#13#12#12#13#12#12#12#12#24#243#243#243'D'#18#18#18#148#243#243#15#12#11#12
+ +#11#12#11#11#11#11#11#11#11#149#243#243#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#14#13#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#14#14#15#14#14#14#15#14#15#14#14#14#14#14#14#14
+ +#13#12#13#13#13#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#12#13#14
+ +#14#15#14#14#14#15#22#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#21#14#14#15#14
+ +#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#14#14#14#15#14#14#14#16#22#23#23#23#23#23#23#17#11#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#150#243#243#21#21#21#21#21#21#21#21#21#21#21#20#21
+ +#210#243#219'`]]p'#227#243#243#243#207#21#20#20#19#20#19#20#19#19#19#19#19#19
+ +#19#19#19#19#19#19#19#17#19#19#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17
+ +#16#17#16#17#16#16#17#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#15#15
+ +#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14
+ +#14#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#12#12#13#12#12#25#243
+ +#243#243'D'#18#18#18#18'<'#243#243#20#12#11#11#12#11#11#11#11#11#11#11#11#144
+ +#243#243#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#14#15#14#14#14#14#15#14#15#14#14#13#13#13#13#13#12#13#13#13#13#12#13#13
+ +#12#13#12#13#13#12#13#13#12#13#12#13#12#13#14#14#14#15#14#14#16#22#23#23#23
+ +#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#16#22#23#23#23#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#14#13#13#13#13#13#13#14#13#13#14#13#13#14#13#14#14#14#15#14#14#14
+ +#15#20#23#23#23#23#23#23#23#17#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#14
+ +#20#210#243#210#22#21#21#21#21#21#21#21#21#21#21#21#20#243#243#193'```]]'#174
+ ,#243#243#243#240#144#20#20#20#19#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19
+ +#17#19#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#16#16
+ +#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15
+ +#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14
+ +#13#13#13#13#13#13#13#13#13#13#13#12#12#13#24#243#243#243'D'#27#18#18#18#18
+ +'%'#243#243#24#11#12#11#11#12#11#11#11#11#11#11#11#24#243#243#21#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#14#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#15#14#14
+ +#14#14#14#14#13#13#13#12#13#13#13#13#12#13#13#13#12#13#12#13#13#12#13#12#13
+ +#12#13#12#13#12#12#12#12#14#14#14#15#14#14#15#22#23#23#23#23#15#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12
+ +#23#23#23#23#16#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13
+ +#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#13#13#13#14#14#15#14#14#15#14#19#23#23#23#23
+ +#23#23#23#23#21#16#13#0#0#0#0#0#0#0#0#0#0#0#0#11#14#19#21#23#23#210#243#210
+ +#21#22#21#21#21#21#21#21#21#21#21#21#21#243#243#188'````]]p'#227#243#243#243
+ +#207#21#20#20#19#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#19#17#19#17#19
+ +#17#19#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16
+ +#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15#14#15
+ +#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13
+ +#13#13#13#13#13#13#12#25#243#243#243'D'#27#27#18#27#18#18#18#243#243#145#11
+ +#12#11#12#11#12#11#12#11#11#11#11#20#243#243#21#14#14#13#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#13#14#13#13
+ +#14#13#14#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#15#14#14#13#13#13#12
+ +#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12
+ +#13#12#13#14#14#14#14#15#14#21#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#22#23#23#23#17#14
+ +#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#14#13#14#13#14#14#15#14#14#14#14#15#21#23#23#23#23#23#23#23#23
+ +#23#23#20#19#15#16#15#16#15#16#16#19#22#23#23#23#23#23#23#241#243#208#21#21
+ +#22#21#21#21#21#21#21#21#21#21#25#243#243#169'a````]]S'#174#243#243#243#240
+ +#144#20#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19
+ +#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16
+ +#16#16#16#16#15#16#15#16#15#15#16#15#15#15#15#15#15#15#15#15#14#15#15#14#15
+ +#15#14#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#13#13
+ +#13#13#13#13#21#243#243#243'D'#27#27#27#18#27#18#18#18#243#243#145#11#12#12
+ +#11#11#11#12#11#11#11#11#11#20#243#243#21#14#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#13#14#13#13#14#13#13#13
+ +#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#12#13#13#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#12#13#12#13#12
+ +#12#14#14#15#14#14#16#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#20#15#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#13#14#13#13#13#13#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#13#14#13#14#14#14#15#14#14#14#14#16#21#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#243#243#150#22#21#22#21
+ +#21#21#21#21#21#21#21#21#26#243#243#131'aa````]]Sk'#219#243#243#243#207#21#20
+ +#19#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19#17#17#17
+ +#17#17#17#17#17#17#17#17#17#16#17#16#17#16#16#17#16#16#16#16#16#16#16#16#16
+ +#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14
+ +#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#14#13#13#13#13#13#13#13#13#19
+ +#240#243#243'E'#27#27#27#27#27#18#27#18#18#214#243#207#12#11#12#11#12#11#11
+ +#12#11#11#11#11#17#243#243#144#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#13#14#13#13#14#13#14#13#13
+ ,#13#13#14#13#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13
+ +#13#13#12#13#13#12#13#13#12#13#13#12#13#13#12#12#13#12#12#13#12#13#12#14#14
+ +#14#14#15#20#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#14#14#15#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#13
+ +#13#13#13#13#14#14#14#14#15#14#15#14#14#14#16#20#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#21#243#243#150#22#21#22#21#22#21#21
+ +#21#21#21#21#21#26#243#243#131'aaa````]]SS'#171#242#243#243#240#145#20#20#19
+ +#20#19#19#19#19#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19#17#17#17#17#17
+ +#17#17#17#17#17#17#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#16#16#15
+ +#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14
+ +#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14#13#13#13#13#13#17#233#243#243
+ +'E'#27#27#27#27#27#27#27#18#27#18#167#243#207#12#12#11#12#12#11#12#11#12#11
+ +#12#11#11#243#243#145#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#13
+ +#12#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#12#12#13#13#15#14#15#14#15
+ +#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13
+ +#13#13#13#14#14#14#14#14#14#15#14#14#14#15#16#20#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#22#19#16#15#243#243#150#22#21#22#21#22#21#21#21#21#21
+ +#21#21#26#243#243#131'haaa````]]SSk'#219#243#243#243#210#22#20#19#20#19#20#19
+ +#19#19#19#19#19#19#19#19#19#19#17#19#19#17#19#17#19#17#17#17#17#17#17#17#17
+ +#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15
+ +#16#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#13#14#13#14#13#13#13#13#13#15#210#243#243#159#28#27#27#27#27
+ +#27#27#27#27#18#27#167#243#207#12#12#11#12#11#12#11#12#11#11#11#11#11#243#243
+ +#145#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#13#13#14#13#13#13#13#14#13#13#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#12#13#13
+ +#12#13#12#13#13#12#12#12#13#12#13#12#13#14#14#14#14#14#20#23#23#23#23#11#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#14#23#23#23#23#23#21#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13
+ +#13#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#14
+ +#14#15#14#14#14#15#14#14#15#14#14#16#17#19#21#21#23#23#23#23#22#21#20#19#16
+ +#15#14#15#14#14#243#243#150#22#22#21#22#21#22#21#22#21#21#21#21#147#243#243
+ +#128'hhaaa````]]SSS'#171#242#243#243#240#147#19#20#19#20#19#20#19#19#19#19#19
+ +#19#19#19#19#19#17#19#19#17#19#17#17#17#17#17#17#17#17#17#17#17#17#17#16#17
+ +#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#16#15#15#15
+ +#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14
+ +#13#14#13#14#14#13#13#13#151#243#243#163#27#27#28#27#27#27#27#27#27#27#27#18
+ +#209#243#207#12#12#12#11#12#12#11#11#12#11#12#11#11#243#243#145#14#14#13#14
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#14#13#13#14#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#13#12#13#12#12
+ +#13#12#13#12#13#12#13#13#14#15#14#15#15#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23
+ +#23#21#15#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13
+ +#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ ,#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#13#13#13#13#13#14#14#14#15#14
+ +#14#14#15#14#14#14#15#14#14#14#14#14#14#14#14#14#15#14#14#15#14#14#14#14#15
+ +#243#243#150#21#22#22#21#22#21#22#21#21#21#21#21#150#243#243'hihhaaa````]]SS'
+ +'Sc'#219#243#243#243#208#23#20#19#20#19#19#19#19#19#19#19#19#19#19#19#19#17
+ +#19#19#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#16#17#16
+ +#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15
+ +#15#15#14#15#14#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#13#14
+ +#147#243#243#214#29#28#27#28#27#27#27#27#27#27#27#27#27#167#243#207#12#12#12
+ +#12#11#12#12#11#12#11#11#12#11#243#243#145#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#13#12#13#13#13#12#13#13#12#13#12#13#12#13#13#12#13#12#12#13#12#13#12
+ +#14#14#14#14#14#20#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#15#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13
+ +#13#14#13#14#13#13#13#13#13#14#13#13#13#13#13#14#14#14#15#14#14#14#15#14#14
+ +#14#15#14#15#14#15#14#15#14#14#14#15#14#14#15#14#14#14#243#243#150#22#22#22
+ +#21#22#22#21#22#21#22#21#21#150#243#243'tthhhaaa````]]SSSR'#171#242#243#243
+ +#240#149#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#17#19#17#19#17#19#17#17
+ +#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16
+ +#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14
+ +#14#15#14#14#14#14#14#14#14#14#14#14#13#14#13#14#25#243#243#238#29#28#28#27
+ +#28#27#28#27#27#27#27#27#27#27#209#243#207#12#12#12#12#12#11#12#12#11#12#11
+ +#11#12#243#243#145#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#14#13
+ +#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#12
+ +#13#12#13#13#12#13#13#12#13#12#12#13#12#12#12#12#13#15#14#15#14#15#22#23#23
+ +#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#14#14#15#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#14#13#13#13#13#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#13#13#13#14#13#13#13#13#13#13#14#14#14#14#14#15#14#14#14#15#14#14#14#14
+ +#14#14#15#14#14#14#15#14#14#15#14#243#243#150#22#22#22#22#21#22#21#22#21#21
+ +#21#21#150#243#243'tttihhaaa````]]SSSR_'#217#243#243#243#211#24#19#20#19#19
+ +#19#19#19#19#19#19#19#19#19#19#19#17#19#17#19#17#19#17#17#17#17#17#17#17#17
+ +#17#17#17#16#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15
+ +#16#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#13#14#20#233#243#243'.'#28#28#28#28#27#28#27#28#27#27#27#27
+ +#27#27#209#243#207#12#12#12#12#11#12#12#11#12#11#12#11#11#243#243#145#14#14
+ +#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#14#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#13#12#13#12
+ +#12#13#12#13#12#13#12#13#14#14#14#14#14#19#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23
+ +#23#21#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13
+ +#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#13#13#13#13#13#14#13
+ +#13#13#13#13#13#14#13#14#14#15#14#14#14#14#15#14#15#14#14#14#15#14#14#14#14
+ +#14#13#13#243#243#150#22#22#22#22#22#21#22#21#22#21#22#21#147#243#243#130'tt'
+ +'tihhaaa````]]SSSSRs'#242#243#243#243#149#19#20#19#20#19#19#19#19#19#19#19#19
+ +#19#19#17#19#19#17#17#19#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16
+ +#17#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#16#15#15#15#15#15#15
+ +#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14#14#14#14#15#210#243
+ ,#243'F'#28#28#28#28#28#28#27#28#27#28#27#27#27#27#27#209#243#207#12#12#12#12
+ +#12#12#12#11#12#12#11#12#11#243#243#145#14#14#13#14#14#13#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14
+ +#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12
+ +#13#13#13#12#13#12#13#12#13#12#13#12#13#13#13#12#13#12#13#12#13#12#13#14#14
+ +#15#14#15#22#23#23#23#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#14#14#15#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#14#13#13#13#13#13#14#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13
+ +#14#14#14#14#14#14#14#14#14#14#14#13#14#13#13#13#13#13#243#243#150#22#22#22
+ +#22#22#22#21#22#22#21#22#21#144#243#243#133'uttthhhaaa````]]SSSRR_'#217#243
+ +#243#243#232#25#20#19#20#19#19#19#19#19#19#19#19#19#19#17#19#19#17#17#19#17
+ +#17#17#17#17#17#17#17#17#17#17#17#16#17#16#17#16#16#17#16#16#16#16#16#16#16
+ +#16#16#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#15#15#15#14#15#14#15
+ +#14#14#15#14#14#14#14#14#14#14#14#14#150#243#243#163#28#28#28#28#28#28#28#28
+ +#27#28#27#28#27#27#27#27#209#243#207#12#12#12#12#12#12#11#12#12#11#12#11#12
+ +#243#243#145#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#13#13#13#13#14#13
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#13#14#14#14#14#15#17#23#23#23#23#14#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14
+ +#23#23#23#23#23#21#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#13#13#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#13#13
+ +#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#243#243#150#22#22#22#22#22#22#22#21#22#21#21#22
+ +#26#243#243#133'uutttihhaaa````]]SSSRRRp'#236#243#243#243#150#21#19#19#19#19
+ +#19#19#19#19#19#19#19#19#17#19#19#17#17#19#17#17#17#17#17#17#17#17#17#17#17
+ +#17#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15
+ +#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14#14#14#14#14#14
+ +#25#243#243#215#30#28#28#28#28#28#28#28#28#28#27#28#27#28#27#27#27#209#243
+ +#207#12#12#12#12#12#12#12#12#12#11#12#12#11#243#243#145#14#14#13#14#14#13#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#14#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#13#12#13#13#13#13#12#13#13#12#13#13#12#13#13#12#13#12#12#12#12#12#12
+ +#12#13#14#15#14#14#14#22#22#23#23#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#14#14#15
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14
+ +#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14
+ +#13#13#14#13#13#14#13#14#13#13#13#13#14#13#13#13#13#13#14#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#243#243
+ +#150#22#22#22#22#22#22#22#22#21#22#22#21#144#243#243#133'uuutttihhaaa````]]S'
+ +'SSRRR_'#189#243#243#243#240#144#20#19#19#19#19#19#19#19#19#19#19#19#17#19#19
+ +#17#19#17#19#17#17#17#17#17#17#17#17#17#17#17#16#23#145#147#147#147#24#16#16
+ +#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15
+ +#15#14#15#14#15#14#14#15#14#14#14#14#14#20#240#243#238'.'#29#28#29#28#28#28
+ +#28#28#28#28#28#27#28#27#28#27#27#215#243#207#12#12#12#12#12#12#12#12#11#12
+ +#12#11#19#243#243#26#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13#13#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#12
+ +#13#12#13#12#13#13#12#13#12#13#12#13#12#13#14#14#14#15#14#17#23#23#23#23#16#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14
+ ,#23#23#23#23#23#21#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#14#13#14#13#13#14#13#13#13#13#14#13#13#14#13#13#14#13#13#13#14#13
+ +#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#240#243#208#22#22#22#22#22#22#22#22#22#21
+ +#22#21#144#243#243#178'uuuutttihhaaa````]]SSSSRRQm'#227#243#243#243#210#22#20
+ +#19#19#19#19#19#19#19#19#19#19#17#19#19#17#19#17#17#17#17#17#17#17#17#17#17
+ +#21#150#240#243#243#243#243#243#243#240#151#20#16#16#16#16#16#16#16#16#15#16
+ +#15#16#15#15#16#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14#14#15#14#14
+ +#14#16#210#243#243'F'#29#28#29#28#28#28#28#28#28#28#28#27#28#27#28#27#28#27
+ +#243#243#147#12#12#12#12#12#12#12#12#12#12#12#11#20#243#243#21#14#14#14#13#14
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14
+ +#13#13#13#13#14#13#14#13#14#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13
+ +#12#13#13#13#12#13#13#13#13#12#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13
+ +#12#13#12#14#15#14#14#14#22#23#23#23#21#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#14#14
+ +#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14
+ +#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#13#13#14#13#13#14
+ +#13#14#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#14#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#207#243#210#22#22#22#22#22#22#22#22#22#22#21#22#21#243#243#198'vvuuuttti'
+ +'hhaaa````]]SSSRRRRQ'#173#242#243#243#240#149#19#19#19#19#19#19#19#19#19#19
+ +#19#17#19#19#17#19#17#19#17#17#17#17#17#21#151#243#243#243#243#243#243#243
+ +#243#243#243#243#243#149#19#16#16#16#16#16#16#15#16#16#15#16#15#15#15#15#15
+ +#15#15#15#15#15#15#15#15#15#14#15#14#15#14#14#15#14#14#147#243#243#163#29#29
+ +#28#29#28#29#28#28#28#28#28#28#28#28#28#27#28#27#27#243#243#145#12#12#12#12
+ +#12#12#12#12#12#12#11#12#20#243#243#21#14#14#13#14#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13
+ +#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13
+ +#13#13#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#14#14#14#14#15#16
+ +#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#15#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#13#14#13#13#14#13#13
+ +#14#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#207#243#210#23#22#22
+ +#22#22#22#22#22#22#22#22#21#22#243#243#202'vvuuuutttihhaaa````]]SSSSRRQRb'
+ +#218#243#243#243#211#25#19#19#19#19#19#19#19#19#19#19#17#19#17#19#17#19#17#17
+ +#17#20#147#240#243#243#243#213'q://:n'#213#243#243#243#211#21#16#16#16#16#16
+ +#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15#15#14#15#15#14#15#15#14
+ +#14#15#24#243#243#234'"'#29#29#29#28#29#28#29#28#28#28#28#28#28#28#28#28#27
+ +#28'%'#243#243#26#12#13#12#12#12#12#12#12#12#12#12#12#24#243#243#21#14#14#13
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13
+ +#13#14#13#13#13#14#13#13#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13
+ +#13#12#13#13#13#13#12#13#13#13#12#13#12#13#13#12#13#13#12#13#12#13#12#12#12
+ +#12#12#12#13#14#15#14#14#14#21#23#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#14#14
+ +#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#14#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#13#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#150#243#243#22#23#22#22#22#22#22#22#22#22#22#22#21#211#243#228'wvv'
+ +'vuuutttihhaaa````]]SSSRRRRQQr'#242#243#243#243#152#21#19#19#19#19#19#19#19
+ +#19#19#19#17#19#17#19#17#19#24#232#243#243#243#213'[2211//,,Z'#224#243#243
+ ,#240#22#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#15
+ +#15#15#14#15#14#15#14#16#240#243#243'0'#29#29#29#29#29#28#29#28#29#28#28#28
+ +#28#28#28#28#28#28#27'='#243#243#21#13#12#13#12#12#12#12#12#12#12#12#12#144
+ +#243#243#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#14#13#14#13#14#13#13#13#13#13#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#12#13#12#13#12
+ +#13#13#12#13#12#13#12#13#12#14#14#14#15#14#16#23#23#23#23#17#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21
+ +#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13#13#13#14#13#13#14#13#13
+ +#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#145#243#243#23#22#23#22#22#22#22#22#22#22#22#22
+ +#22#210#243#239'wvvvvuuutttihhaaa````]]SSSSRRRQQ\'#189#243#243#243#240#146#19
+ +#19#19#19#19#19#19#19#19#17#19#19#17#20#207#243#243#243#241'q3332211///,7'
+ +#185#243#243#240#22#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15
+ +#15#15#15#15#14#15#15#14#15#14#208#243#243'f'#29#29#29#29#29#29#29#28#29#28
+ +#29#28#28#28#28#28#28#28#28#28#153#243#243#16#13#12#12#13#12#12#12#12#12#12
+ +#12#12#147#243#243#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13
+ +#13#12#13#13#12#13#12#13#12#13#12#13#12#14#15#14#14#14#21#23#23#23#23#11#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23
+ +#23#23#23#21#15#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13
+ +#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#26#243#243#26#23#22#23#22#22#22#22
+ +#22#22#22#22#22#150#243#243'wwwvvuuuutttihhaaa````]]SSSRRRRQQQj'#218#243#243
+ +#243#232#25#19#19#19#19#19#19#19#19#17#19#146#240#243#243#243#184';443332211'
+ +'//,,,'#185#243#243#232#19#16#16#16#16#16#16#15#16#16#15#16#15#15#16#15#15#15
+ +#15#15#15#15#15#15#15#15#14#15#146#243#243#212#30#30#29#29#29#29#29#29#29#28
+ +#29#28#29#28#28#28#28#28#28#28#27#155#243#243#13#12#13#13#12#13#12#12#12#12
+ +#12#12#12#7#243#210#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12
+ +#13#13#12#13#12#13#12#12#13#12#13#12#14#14#14#14#15#15#23#23#23#23#17#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23
+ +#23#21#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#21#243#243#144#23#23#22#23#22#22#22
+ +#22#22#22#22#22#146#243#243#141'xwwvvvuuutttihhaaa````]]SSSRRRRQQQQ'#157#242
+ +#243#243#243#208#25#19#19#19#19#19#19#25#211#243#243#243#224'e444433332211//'
+ +'/,,'#185#243#243#208#16#16#16#16#16#16#16#15#16#16#15#16#15#15#15#15#15#15
+ +#15#15#15#15#15#15#14#15#21#243#243#238'#'#30#29#30#29#29#29#29#29#29#29#28
+ +#29#28#29#28#28#28#28#28#28#28#209#243#210#13#13#12#13#12#12#13#12#12#12#12
+ +#12#12#232#243#207#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#14#13#13#13
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#12#13#12#13
+ +#12#13#12#13#13#12#13#12#12#12#12#12#14#15#14#14#14#20#23#23#23#23#11#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23
+ ,#23#21#15#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13#13#13#13
+ +#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#16#243#243#151#22#23#23#22#23#22
+ +#22#22#22#22#22#22#144#243#243#181'xxwwvvuuuutttihhaaa````]]SSSRRRRQQQQV'#173
+ +#243#243#243#243#207#25#19#22#146#211#243#243#243#241#170'555444433332211//,'
+ +',,'#213#243#243#147#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15
+ +#15#15#15#15#15#16#232#243#243'B'#30#30#30#30#29#30#29#29#29#29#29#29#28#29
+ +#28#29#28#28#28#28#28#28#243#243#150#13#13#13#12#13#13#12#13#12#12#12#12#12
+ +#243#243#145#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#14#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#12#13#13#12
+ +#13#12#13#12#13#12#13#12#13#13#14#14#15#14#15#23#23#23#23#19#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15
+ +#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#13#13
+ +#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#243#243#7#23#23#23#23#22#23#22#22#22
+ +#22#22#22#22#243#243#205'yxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPb'#197#243#243
+ +#243#243#243#243#243#243#243#243#192'L66554444443332211///,7'#241#243#243#24
+ +#16#16#16#16#16#16#16#16#15#16#15#16#15#16#15#15#15#15#15#15#15#15#15#150#243
+ +#243#159#31#30#30#30#30#30#29#29#29#29#29#29#29#29#28#29#28#29#28#28#28#28'.'
+ +#243#243#26#13#13#13#13#12#13#12#12#13#12#12#12#21#243#243#25#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13
+ +#14#15#14#14#14#20#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14
+ +#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#13#14#13#13#14#13#14#13#14#13#13#13#14#13#13#13#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#207#243#232#23#23#23#23#23#22#23#22#22#22#22#22#22#210#243#239
+ +'yyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPQo'#218#243#243#243#243#243#235#172
+ +'WJII66555444433332211//,,Z'#243#243#232#19#16#16#16#16#16#16#16#16#15#16#15
+ +#16#15#16#15#15#15#15#15#15#15#26#243#243#216#31#31#30#30#30#30#30#30#29#30
+ +#29#29#29#29#29#29#28#29#28#29#28#28#28'H'#243#243#21#13#13#13#13#13#12#13#13
+ +#12#13#12#12#24#243#243#21#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#14#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#13#12
+ +#13#12#13#12#13#12#13#12#12#13#12#13#13#14#14#14#15#14#23#23#23#23#23#12#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23
+ +#23#21#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13
+ +#13#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#147#243#243#23#23#23
+ +#23#23#23#22#23#22#22#22#22#22#151#243#243#135'yyxxwwvvvuuutttihhaaa````]]SS'
+ +'SRRRRQQQQPPO^'#158#172#158'bKJJJJII66554444433332211///,'#162#243#243#147#16
+ +#16#16#16#16#16#16#16#16#15#16#15#16#15#15#16#15#15#15#15#19#240#243#238'>'
+ +#31#31#31#31#30#30#30#30#30#29#30#29#29#29#29#29#29#28#29#28#29#28#28#163#243
+ +#243#13#13#13#13#13#13#13#12#13#12#12#13#12#147#243#243#14#13#14#14#13#14#13
+ ,#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13
+ +#13#12#13#13#13#13#13#12#13#12#13#13#12#13#13#12#13#12#13#12#12#12#12#13#15
+ +#14#14#14#14#19#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#14#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14
+ +#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13#13#13#13#13#13#14#13#13#14
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#25#243#243#144#23#23#23#23#23#23#22#23#22#22#22#22#145#243#243
+ +#179'zyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444443332211'
+ +'//,7'#235#243#243#22#16#16#16#16#16#16#16#16#16#15#16#15#16#15#15#15#15#15
+ +#15#210#243#243'd '#31#31#31#30#30#30#30#30#29#29#29#29#29#29#29#29#28#29
+ +#28#29#28#238#243#207#13#13#13#13#13#13#13#13#12#13#13#12#13#207#243#210#14
+ +#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#13#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#12#13#12#13#12#13#13#12#13#12
+ +#13#12#13#12#12#14#14#15#14#14#14#21#23#23#23#23#15#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#15#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#19#243#243#149#23#23#23#23#23#23#23#22#23#22
+ +#22#22#24#243#243#205'zyyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJI'
+ +'I66554444433332211///Z'#243#243#208#16#16#16#16#16#16#16#16#16#16#15#16#15
+ +#16#15#16#15#15#149#243#243#191' !'#31' '#31#31#31#31#30#30#30#30#30#29#30#29
+ +#29#29#29#29#29#28#29#28'.'#243#243#146#13#13#13#13#13#13#13#13#13#12#13#12
+ +#12#243#243#150#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#13#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13
+ +#13#12#13#12#12#13#12#13#12#13#12#13#14#14#15#14#14#16#23#23#23#23#21#11#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#23#21#15#14
+ +#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13
+ +#13#13#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#243#243#208#23#23#23
+ +#23#23#23#23#23#22#23#22#23#22#210#243#242'zzzyyxxwwvvuuuutttihhaaa````]]SSS'
+ +'RRRRQQQQPPONNNKKKKJJJII66555444433332211//,'#162#243#243#145#16#16#16#16#16
+ +#16#16#16#16#16#15#16#15#16#15#16#24#243#243#234'*!! '#31#31#31#30#30#30
+ +#30#30#29#30#29#29#29#29#29#29#28#29'H'#243#243#20#14#13#13#13#13#13#13#13#13
+ +#13#12#13#21#243#243#248#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#13#12
+ +#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#14#14#15#14#14#19#23#23#23
+ +#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#21#23#23#23#23
+ +#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#14#13#14#13#13#13#14#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#207#243#241
+ ,#23#23#23#23#23#23#23#23#23#22#23#22#22#149#243#243#140'zzzyyxxwwvvvuuutttih'
+ +'haaa````]]SSSRRRRQQQQPPONNNKKKJJJJII66554444443332211//8'#241#243#240#19#16
+ +#16#16#16#16#16#16#16#16#16#15#16#15#16#19#240#243#243'?#!!! '#31#31#31#31
+ +#30#30#30#30#30#29#29#29#29#29#29#29#29#28#215#243#232#14#13#14#13#13#13#13
+ +#13#13#13#13#13#12#145#243#243#20#13#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#13#13
+ +#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#13#13#12
+ +#13#12#13#12#13#12#13#13#12#13#12#12#12#12#12#13#12#12#13#14#14#14#14#15#14
+ +#22#22#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15
+ +#23#23#23#23#16#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#14#13#14#13#13#13#14#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#145#243#243#144#23#23#23#23#23#23#23#23#23#22#23#22#25#243#243#203'{zzzyyxx'
+ +'wwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444433332211//n'#243
+ +#243#7#16#16#16#16#16#16#16#16#16#16#16#15#16#17#210#243#243'n##!!!! '#31
+ +#31#31#30#30#30#30#30#29#30#29#29#29#29#29'$'#243#243#150#14#13#14#13#14#13
+ +#13#13#13#13#13#13#13#207#243#240#14#14#13#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12
+ +#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#12#12#14#15#14#14
+ +#14#16#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11
+ +#21#23#23#23#20#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13
+ +#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#19#243#243#149#24#23#23#23#23#23#23#23#23#23#22#23#22#232#243#239'z{zzzyyxx'
+ +'wwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII66554444433332211//'#213
+ +#243#243#144#16#16#16#16#16#16#16#16#16#16#16#15#151#243#243#165'##!!!! '
+ +' '#31#31#31#30#30#30#30#30#29#30#29#29#29#29'H'#243#243#24#13#14#14#13#14#13
+ +#13#13#13#13#13#13#15#243#243#150#13#14#14#13#14#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13
+ +#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#13#13#12
+ +#13#13#12#13#13#12#13#12#13#12#12#13#12#13#12#12#12#12#13#12#13#13#14#14#15
+ +#14#14#21#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#17#23#23#23#23#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13
+ +#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#240#243#210#23#23#23#23#23#23#23#23#23#23#23#22#23#149#243#243#177'{{zzz'
+ +'yyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444443332211/:'
+ +#241#243#240#21#16#16#16#16#16#16#16#16#16#16#145#243#243#216'-#!!!! '
+ +#31#31#31#31#30#30#30#30#30#29#29#29#29#29#234#243#240#14#14#13#14#13#14#13
+ +#14#13#13#13#13#13#23#243#243#25#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#12#13#12#13#12#13#13#12#13#12#12#13#12#13#12#13#12#13#12#12#13#14#14#14#14
+ +#15#15#22#23#23#23#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12
+ +#22#23#23#23#19#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14
+ ,#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#14#13#14#13#13#13#13#13#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#150#243#243#24#24#23#23#23#23#23#23#23#23#23#23#22#25#243#243#220'|{zzzzyyx'
+ +'xwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII66554444433332211/'#156
+ +#243#243#211#19#16#16#16#16#16#16#16#16#26#243#243#241'@&&&##!!!! '#31
+ +#31#31#30#30#30#30#30#29#30#29'>'#243#243#147#14#14#14#14#13#14#13#14#13#13
+ +#13#13#13#150#243#243#17#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12#13#13
+ +#12#13#13#12#13#12#12#13#12#12#12#13#12#13#12#12#13#12#12#13#14#15#14#14#14
+ +#20#23#23#23#23#23#23#23#23#23#23#21#19#19#20#15#16#15#15#12#12#12#11#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#19#23#23#23#22#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13
+ +#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#13#13#13#14#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#25#243#243#147#23#24#23#23#23#23#23#23#23#23#23#23#22#210#243
+ +#243#136'|{{zzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444'
+ +'433332211/'#194#243#243#7#16#17#16#16#16#16#16#26#243#243#243'C''''''&&&#'
+ +'!!!! '#31#31#31#31#30#30#30#30#30#29#30#163#243#243#17#14#14#14#14#14#13
+ +#14#13#14#13#13#13#13#240#243#210#14#13#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#14
+ +#14#14#15#14#15#22#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#19#20#19#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#19#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#13#13#13#13#13#13#14#13#13
+ +#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#15#243#243#208#23#23#24#23#23#23#23#23#23#23
+ +#23#23#23#147#243#243#199'{{{{zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONN'
+ +'NKKKJJJJII665544444433322118'#224#243#243#208#19#16#16#16#19#151#243#243#243
+ +'g''''''''&&&##!!!! '#31#31#31#30#30#30#30#30'"'#243#243#207#14#14#14#14
+ +#14#14#13#14#13#14#13#14#13#23#243#243#144#14#14#13#14#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13
+ +#13#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#12#12#12#13#12#13#12
+ +#12#13#12#14#14#14#14#14#19#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#21#23#23#23#22#14#14#15#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#14#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#151#243#243#25#23#23#24#23#23#23
+ +#23#23#23#23#23#23#22#233#243#242'||{{{zzzyyxxwwvvvuuutttihhaaa````]]SSSRRRR'
+ +'QQQQPPONNNKKKKJJJII665554444333322118'#224#243#243#240#150#147#149#240#243
+ +#243#241'g((((''''''&&&#!!!! '#31#31#31#31#30#30#30#30#154#243#243#25#14
+ +#14#14#14#14#14#14#14#13#14#13#14#13#150#243#243#17#14#13#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13
+ +#13#12#13#13#12#13#12#13#13#12#13#13#12#13#13#12#12#12#13#12#13#12#13#12#12
+ ,#13#12#13#12#12#13#13#15#14#15#14#15#22#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#23#23#23#23#17#14
+ +#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#14#13#13#13
+ +#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#25#243#243#147#24#23
+ +#23#24#23#23#23#23#23#23#23#23#23#150#243#243#182'|||{zzzzyyxxwwvvuuuutttihh'
+ +'aaa````]]SSSRRRRQQQQPPONNNKKKJJJJII665544444333322118'#213#243#243#243#243
+ +#243#243#243#224'A)((((''''''''&&##!!!! '#31#31#31#31#30#30'$'#238#243
+ +#232#14#14#14#14#14#14#14#14#14#14#13#14#13#14#233#243#210#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13
+ +#13#12#13#13#13#13#13#12#13#13#12#13#12#13#12#13#12#12#13#12#13#12#12#13#12
+ +#13#12#13#12#12#13#12#13#12#13#14#14#14#14#14#14#14#14#15#16#16#16#16#19#19
+ +#19#20#21#20#21#23#23#23#23#23#23#23#23#23#23#23#23#23#22#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23
+ +#22#14#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14
+ +#13#14#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#15#233#243#232
+ +#23#24#23#23#24#23#23#23#23#23#23#23#23#24#240#243#239'}|||{{zzzyyxxwwvvvuuu'
+ +'tttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444443332211/n'#224#243#243
+ +#243#224'n)+)))(((''''''''&&##!!!! '#31#31#31#31#30#154#243#243#146#14#15
+ +#14#14#14#14#14#14#14#14#13#14#13#25#243#243#144#14#13#14#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13
+ +#12#13#13#13#12#13#12#13#13#12#13#12#13#13#12#13#12#12#13#12#12#13#12#13#12
+ +#13#12#13#12#12#13#12#13#15#14#15#14#15#14#14#14#14#14#14#15#14#14#14#14#14
+ +#15#14#14#14#14#15#16#16#16#19#19#19#23#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#17#14
+ +#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#13#14#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13
+ +#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#150#243#243#144#23#24
+ +#23#23#24#23#23#23#23#23#23#23#23#150#243#243#182'}|||{zzzzyyxxwwvvuuuutttih'
+ +'haaa````]]SSSRRRRQQQQPPONNNKKKJJJJII665544444333322111/,,,,+++))))((('''''''
+ +'''&&##!!!! '#31#31#31'$'#238#243#240#16#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#207#243#243#15#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#14#13#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12#13#12#13
+ +#13#12#13#12#13#12#12#13#12#12#13#12#12#13#12#12#12#13#12#13#12#12#12#12#14
+ +#14#14#14#14#15#14#15#14#15#14#14#14#15#14#15#14#14#14#15#14#14#14#14#14#14
+ +#14#15#14#22#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23#22#14#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14
+ +#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#21#243#243#207#24#23#24#23#23#24#23#23#23#23
+ +#23#23#23#24#241#243#239#137'}||{{{zzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQ'
+ +'PPONNNKKKKJJJII66555444433332211///,,,+++))))(((''''''''&&##!!!! '#31#31
+ +#154#243#243#146#15#14#14#15#14#14#14#14#14#14#14#14#14#17#243#243#150#14#13
+ +#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13
+ ,#14#13#13#14#13#13#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13
+ +#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#13#12#13#13#12#13#12#13#12#13
+ +#12#13#12#13#12#12#13#12#13#12#12#13#12#13#12#12#14#14#15#14#14#14#14#14#14
+ +#14#14#15#14#14#14#14#14#15#14#14#15#14#15#14#15#14#14#14#14#20#23#23#23#21#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#16#22#23#23#23#17#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#14#13#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#232#243#240#25#23#24#23#24#23#23#24#23#23#23#23#23#23#151#243#243#199
+ +'}}||{{{zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII665544444433'
+ +'32211//,,,,+++))))(((''''''''&&##!!!! *'#238#243#240#16#15#14#15#14#14
+ +#14#14#14#14#14#14#14#14#147#243#243#21#14#14#13#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13
+ +#14#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#13
+ +#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#13
+ +#12#12#13#12#12#12#12#14#13#14#14#14#14#14#15#14#14#14#15#14#15#14#14#14#15
+ +#14#14#14#14#14#14#15#14#15#14#16#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23#22#14
+ +#15#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13
+ +#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#25#243#243#150#24#23
+ +#24#23#23#24#23#23#23#23#23#23#23#24#241#243#242#137'}}|||{zzzzyyxxwwvvvuuut'
+ +'ttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444433332211///,,,+++))))((('''
+ +'''''''&&##!!!! '#164#243#243#26#14#15#14#14#15#14#15#14#14#14#14#14#14#15
+ +#240#243#232#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#12#13#13#12
+ +#13#13#12#12#13#12#13#12#12#12#13#12#13#12#13#12#12#13#12#12#12#13#12#12#12
+ +#12#12#12#12#12#12#12#12#12#13#12#13#12#14#13#13#14#14#14#14#14#15#14#14#14
+ +#14#14#15#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#17#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14
+ +#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13#13#13#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#15#233#243#233#24#23#24#23#24#23#23#24#23#23#23
+ +#23#23#23#149#243#243#221'~}}|||{{zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQP'
+ +'PONNNKKKJJJJII66554444433332211//,,,,+++))))(((''''''''&&##!!!!>'#243#243
+ +#232#15#14#15#15#14#14#15#14#14#14#14#14#14#14#146#243#243#25#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13
+ +#13#13#12#13#13#13#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#12#12#13#12
+ +#13#12#13#12#12#13#12#13#12#13#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#15#14#14#14#20#23#23#23#20#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#11#21#23#23#23#22#15#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#145#243#243#147#24#23#24#23#24#23#23#24#23#23#23#23#23#23#232#243#243#175
+ +'~}}|||{zzzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444443'
+ ,'332211///,,,+++))))(((''''''''&&##!!!'#216#243#243#23#15#15#14#15#14#15#14
+ +#15#14#15#14#14#14#14#232#243#240#15#14#13#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13
+ +#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13
+ +#12#13#12#13#13#12#13#12#13#13#12#12#13#12#13#12#13#12#12#12#13#12#13#12#12
+ +#13#12#13#12#12#12#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#13#14#15#14#15#17#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#19
+ +#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14
+ +#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#243#243#233#24#24
+ +#23#24#23#24#23#23#24#23#23#23#23#23#145#243#243#239#138'~}}||{{{zzzyyxxwwvv'
+ +'uuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII66554444433332211//,,,,+++))))'
+ +'(((''''''''&&##!'#154#243#243#152#15#14#15#15#15#14#15#14#14#15#14#14#14
+ +#14#25#243#243#145#14#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12#13#12#13
+ +#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12
+ +#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#14#14#14#14#15#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#22#23#23#22#15#14#14#15#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13
+ +#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#150#243#243#147#24#23#24#23#24#23
+ +#24#23#23#24#23#23#23#23#151#243#243#204'~~}}|||{zzzzyyxxwwvvvuuutttihhaaa``'
+ +'``]]SSSRRRRQQQQPPONNNKKKKJJJII66555444433332211///,,,+++))))(((''''''''&&'
+ +'#?'#243#243#240#17#15#15#15#14#15#15#14#15#15#14#15#14#15#14#232#243#240#15
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#14#14#14#14#14#15#14#14#14#14
+ +#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#13#12#13#12#13#12#13#13#12#13
+ +#12#13#12#12#12#12#13#12#12#12#12#12#13#12#13#12#13#12#12#12#12#13#12#13#12
+ +#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#15#14#14
+ +#14#22#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#20#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14
+ +#14#13#14#14#14#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#16#243#243#233#24#24#23#24#24#23#23#24#23#23#23#24
+ +#23#23#24#233#243#243#176'~~}}||{{{zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQ'
+ +'PPONNNKKKJJJJII66554444443332211//,,,,+++))))(((''''''''&&'#216#243#243#24
+ +#15#15#15#15#15#15#15#14#15#14#15#14#15#14#146#243#243#145#14#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#14#15#14#14#14#15#14#14#14#15#14#15#14#14#14#15#14#14
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13
+ +#13#13#12#13#13#13#13#13#12#13#12#13#13#12#13#13#12#13#12#12#12#12#13#12#13
+ +#12#12#13#12#13#12#13#12#13#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#15#14#20#23#23#23
+ +#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#20#23#23#23#23#16#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#14#14#14#14#14#15#14
+ +#15#14#14#14#14#13#14#14#13#14#14#13#14#14#14#13#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#13#13#13#14#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13
+ ,#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#12#145#243#243#150#24#24#23#24#23#24#23#24#23#23#23#23#23#23#145#243
+ +#243#242#138'~~}}||{{{zzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJ'
+ +'II66555444433332211///,,,+++))))(((''''''''&&'#160#243#243#152#15#15#15#15
+ +#15#15#15#14#15#15#14#15#14#14#16#240#243#240#15#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#14#14#14#14#15#14#14#15#14#14#15#14#14#14#14#14#14#15#14#14#14#14#14#14#14
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13
+ +#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13
+ +#12#13#12#12#13#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#14#17#23#23#23#23#11#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#12#23#23#23#23#21#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#15#14#15#14#14#14#14#14
+ +#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#14#240#243#241#25#24#23#24#24#23#24#23#24#23#24#23#23#23#23#151#243#243
+ +#229'~~}}||{{{zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII66554'
+ +'444433332211//,,,,+++))))(((''''''''G'#243#243#240#17#15#15#15#15#15#15#15
+ +#15#15#15#14#15#14#15#146#243#243#145#14#14#13#14#13#14#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#14#14#15
+ +#14#14#14#15#14#14#14#14#15#14#15#14#15#14#14#14#15#14#15#14#14#14#14#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13
+ +#13#12#13#12#13#13#12#13#13#12#13#13#12#13#12#12#13#12#13#12#13#12#13#12#13
+ +#12#12#13#12#13#12#13#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#15#14#15#14#15#23#23#23#23#13#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19
+ +#23#23#23#23#17#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#15#14#15#14#14#14#14#14#14#15#14#15#14#15#14#14#14
+ +#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13
+ +#14#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#145#243
+ +#243#152#24#24#23#24#24#23#24#23#23#23#24#23#23#23#23#232#243#243#204'~~}}|'
+ +'||{zzzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII665554444433322'
+ +'11///,,,+++))))(((''''@'#241#243#243#23#15#15#15#15#15#15#15#15#15#15#14#15
+ +#15#14#19#243#243#232#15#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#14#13#13#14#13#13#14#13#13#14#14#15#14#14#14#14#15#14#14
+ +#14#15#14#16#16#17#17#16#16#15#14#15#14#14#14#15#14#15#14#14#15#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13
+ +#12#13#13#12#13#13#12#12#13#12#13#12#12#12#12#13#12#12#12#12#13#12#13#12#12
+ +#12#12#12#12#13#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#14#14#14#14#14#22#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#22#23#23#23
+ +#22#15#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#15#14#15#14#14#14#14#15#14#15#14#15#14#14#14#14#14#14#14#14#14#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#14#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#232#243#243#144
+ +#24#24#23#24#23#24#23#24#23#23#24#23#23#23#24#241#243#243#183'~~}}|||{{zzzy'
+ +'yxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII66554444433332211//,,,,'
+ +'+++))))(((-'#216#243#243#145#15#15#16#15#15#15#15#15#15#15#15#15#15#15#14
+ +#208#243#243#25#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#13#14#13#13#14#13#13#14#14#14#14#14#15#14#15#14#14#15#19#20#22
+ +#23#23#23#23#23#23#23#23#23#21#17#15#14#14#14#14#14#15#14#14#14#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12#13#12#13
+ +#12#13#12#13#13#12#12#12#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12#12#12
+ +#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#14#14#15#14#14#21#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#20
+ +#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#15#14#15#14#14#14#15
+ ,#14#14#15#14#14#14#14#14#16#17#20#21#21#15#14#15#14#14#14#14#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13#13#14#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#23#243#243#211#23#24
+ +#24#24#24#23#24#23#24#23#23#24#23#23#23#145#243#243#243#143'~~}}|||{zzzzyyx'
+ +'xwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444433332211///,,,++'
+ +'+))))(('#216#243#243#151#15#16#15#15#15#15#15#15#15#15#15#15#15#15#14#24#243
+ +#243#207#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#14#13#13#14#13#13#14#14#14#15#14#14#14#14#14#16#21#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#21#17#15#14#14#14#14#15#14#14#14#12#13#13#13
+ +#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#13#12#13#13
+ +#12#13#12#13#12#13#12#13#12#13#12#12#13#12#13#12#12#13#12#12#12#13#12#13#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#13#14#14#15#14#19#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#21#23#23#23#23#16#14
+ +#14#15#14#14#14#14#14#14#14#14#14#15#14#15#14#14#14#15#14#14#15#14#14#14#15
+ +#14#15#17#19#21#23#23#23#23#23#23#21#15#14#14#15#14#14#14#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#13#14#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#207#243#243#150#24#24#23
+ +#24#24#23#24#23#24#23#23#24#23#23#23#147#243#243#242#143'~~}}|||{{zzzyyxxww'
+ +'vvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII66554444443332211//,,,,+++))'
+ +'))'#165#243#243#210#17#16#16#15#16#15#15#15#15#15#15#15#15#15#15#16#240#243
+ +#243#20#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#14#14#15#14#14#15#14#16#22#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#21#17#15#14#14#14#14#15#14#14#13#13#13
+ +#13#12#13#13#13#13#12#13#13#13#13#12#13#13#13#13#13#12#13#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#12#12#12#12
+ +#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#13#14#14#14#14#16#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#22#15
+ +#14#14#14#14#14#14#15#14#15#14#14#14#14#14#15#14#14#14#14#15#14#14#16#19#20
+ +#22#22#23#23#23#23#23#23#23#23#23#23#21#15#14#14#14#15#14#14#14#14#13#14#14
+ +#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13#13#13#14#13#13#14
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#16#240#243#240#26#24#24
+ +#23#24#24#23#24#23#24#23#23#24#23#23#23#152#243#243#242#143'~~}}|||{zzzzyyx'
+ +'xwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444433332211///,,,++'
+ +'+))'#166#243#243#232#19#15#16#15#16#15#16#15#16#15#15#15#15#15#15#15#149#243
+ +#243#145#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#14#13#13#14#13#14#15#14#14#14#15#14#20#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#21#16#14#15#14#14#14#14#14#13
+ +#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#12#13#13#12
+ +#13#13#12#12#13#12#12#12#12#12#12#12#13#12#12#12#13#12#12#13#12#12#13#12#13
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#15#14#15#14#15#23#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#23#23#23#23
+ +#20#15#14#15#14#15#14#14#14#14#15#14#15#14#14#14#15#14#16#17#19#21#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#21#15#14#14#14#14#14#14#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#26#243#243#211#24
+ +#24#24#23#24#24#23#24#23#24#23#23#24#23#23#23#207#243#243#237#138'~~}}|||{{'
+ +'zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII66554444433332211//'
+ +',,,,+++'#166#243#243#240#22#16#16#16#15#16#15#16#15#15#15#15#15#15#15#15#24
+ +#243#243#232#15#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#13#14#13#13#14#13#13#14#13#14#14#14#14#14#15#14#16#22#23#23#23#23#23#23#23
+ +#21#16#13#12#0#0#0#0#12#13#15#20#23#23#23#23#23#23#23#23#17#14#14#15#14#14#14
+ +#14#12#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#13#12#13#12
+ +#13#12#13#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12
+ ,#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#14#14#14#14#14#22#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#22#23
+ +#23#23#16#14#14#14#14#14#15#14#14#14#14#14#15#17#19#20#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#21#23#23#23#23#23#21#15#14#15#14#14#15#14#14
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#12#207#243#243
+ +#150#24#24#24#23#24#24#23#24#23#24#23#23#24#23#23#23#207#243#243#237#142'~~'
+ +'}}|||{zzzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII665554444433'
+ +'32211///,,,+'#185#243#243#240#22#16#16#16#15#16#16#15#16#15#16#15#15#15#15
+ +#15#17#240#243#243#21#14#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#14#14#14#15#14#14#14#17#23#23#23#23#23#23
+ +#23#17#12#0#0#0#0#0#0#0#0#0#0#0#0#11#16#21#23#23#23#23#23#23#20#14#14#15#14
+ +#14#14#14#12#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#13#12
+ +#13#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12#13#12#12#13#12#12#13#12#12
+ +#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#14#14#15#14#14#21#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#23#23
+ +#23#23#22#15#14#15#14#14#14#15#16#19#20#22#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#22#19#16#12#0#0#14#23#23#23#23#23#21#15#14#14#15#14#14#14#14
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#13#16#240#243#243
+ +#144#24#24#24#24#23#24#24#23#24#23#24#23#23#24#23#23#207#243#243#242#143'~~'
+ +'}}|||{{zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII665544444333'
+ +'32211//,,,'#185#243#243#240#22#16#16#16#16#16#16#15#16#16#15#16#15#16#15#15
+ +#15#208#243#243#145#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#13#14#14#15#14#14#15#17#22#23#23#23#23#23#17
+ +#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#15#22#23#23#23#23#23#20#14#14#15#14#14
+ +#14#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#12#13#12#13#12#13
+ +#13#12#12#13#12#12#13#12#13#12#13#12#12#13#12#13#12#12#13#12#12#12#13#12#12
+ +#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#13#14#14#15#14#20#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23
+ +#23#20#14#15#17#20#21#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#19
+ +#16#14#11#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#14#15#14#14#14#14#13#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#13#14#13#13#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#12#13#25#243#243#232#25#24#24
+ +#23#24#24#23#24#23#24#23#23#24#23#23#23#23#207#243#243#242#143'~~}}|||{zzzz'
+ +'yyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444433332211///'
+ +#185#243#243#240#22#16#16#16#16#16#16#16#16#15#16#16#15#16#15#16#15#145#243
+ +#243#210#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#13#14
+ +#13#13#14#13#13#14#13#14#14#14#14#14#15#16#23#23#23#23#23#21#12#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#11#20#23#23#23#23#23#20#14#14#15#14#14#14#13#13#13
+ +#13#12#13#13#13#12#13#13#13#13#12#13#12#13#13#12#13#13#12#13#12#13#12#12#13
+ +#12#12#12#12#12#13#12#13#12#12#12#13#12#12#12#13#12#12#13#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#13#14#15#14#14#19#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#22#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#21#17#15#12#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#14#23#23#23#23#23#21#16#14#14#14#14#14#14#14#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#12#13#13#13#13#13#12#13#150#243#243#208#24#24#24#24#24#23#24#24#23
+ +#24#23#23#24#23#23#23#23#207#243#243#242#183'~~}}|||{{zzzyyxxwwvvuuuutttihh'
+ +'aaa````]]SSSRRRRQQQQPPONNNKKKJJJJII665544444433322118'#224#243#243#240#22#16
+ +#16#16#16#16#16#16#16#16#16#15#16#16#15#15#16#23#243#243#240#17#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13
+ ,#14#14#15#14#15#14#16#23#23#23#23#23#19#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#17#23#23#23#23#23#17#15#14#14#15#14#13#13#13#13#13#12#13#13#13
+ +#13#12#13#13#13#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13
+ +#12#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#15#16
+ +#22#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#22#19#16#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23
+ +#22#16#14#15#14#15#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13
+ +#13#13#12#15#210#243#243#150#24#24#23#24#24#23#24#23#24#23#24#23#24#23#24#23
+ +#23#207#243#243#243#201'~~}}|||{zzzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQP'
+ +'PONNNKKKKJJJII665554444333322T'#235#243#243#232#22#17#16#16#16#16#16#16#16
+ +#16#16#16#16#15#16#16#15#20#240#243#243#23#14#14#14#13#14#14#13#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14#14#14#14#14#15
+ +#22#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23
+ +#23#23#23#23#16#14#14#14#14#14#13#13#13#13#13#12#13#13#13#13#12#13#12#13#13
+ +#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#12#13#12#13#12#12#13#12
+ +#13#12#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#15#14#14#14#16#23#23#23#23#12#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#16#23#23#23#23#23#23#23#23#23#23#23#20#16#14#11#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#22#17#14#14#14#14#15#14
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#19#240#243#243
+ +#146#24#24#24#24#24#23#24#24#23#24#23#23#24#23#23#23#23#147#243#243#243#223
+ +#138'~~}}|||{{zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII665544'
+ +'4443333q'#241#243#243#211#19#17#16#17#16#17#16#16#16#16#16#16#16#16#16#15#16
+ +#17#210#243#243#147#14#13#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#14#13#13#14#14#15#14#15#14#21#23#23#23#23#19#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#22#14#15#14
+ +#15#14#14#12#13#13#13#13#12#13#13#13#13#13#12#13#12#13#12#13#13#12#13#12#13
+ +#12#12#13#12#13#12#13#12#13#12#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#13#14#15#14#14#14#23#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23
+ +#23#23#23#21#19#15#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#12#21#23#23#23#23#23#17#15#14#14#14#14#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#12#13#13#13#12#13#13#13#23#243#243#241#144#24#24#24#24#24#23#24#24#23
+ +#24#23#23#24#23#23#23#23#146#241#243#243#239#143'~~}}|||{zzzzyyxxwwvvvuuuttt'
+ +'ihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII66555444449'#186#243#243#243#151#19#17
+ +#16#17#16#17#16#16#16#16#16#16#16#16#16#16#16#15#151#243#243#207#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13
+ +#14#13#14#14#14#14#14#16#23#23#23#23#21#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#23#19#14#14#14#14#14#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#13#12#13#12#13#12#13#13#12#13#12#12#12#12#12#12#12#13
+ +#12#12#13#12#13#12#13#12#13#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#14#15#14
+ +#14#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#21#19#16#13#11#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#21#23#23#23#23#23
+ +#17#15#14#15#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#145#243#243#240#25#24#24#23#24#24#23#24#23#24#23#24#23#24#23#24#23#23
+ +#248#232#243#243#243#200'~~}}|||{{zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQP'
+ ,'PONNNKKKJJJJII66554444Y'#224#243#243#243#146#17#16#17#17#16#17#16#17#16#16
+ +#16#16#16#16#16#16#16#16#151#243#243#210#15#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#14#14#15#14#15#14
+ +#22#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#11#21#23#23#23#22#15#15#14#14#15#13#13#13#13#13#12#13#13#13#12#13#13#12#13
+ +#13#12#13#13#12#13#12#12#13#12#13#12#13#12#13#12#12#13#12#13#12#13#12#12#12
+ +#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#14#14#14#15#14#14#14#15#14#21#23#23#23#16#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#11#20#23#23#23#23#17#14#14#14#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#150#243#243#232#25#24#24
+ +#24#24#24#23#24#24#23#24#23#23#24#23#23#23#23#24#207#243#243#243#237#143'~}}'
+ +'|||{zzzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKKJJJII665554'#161#243
+ +#243#243#232#23#17#17#17#17#16#17#16#17#16#17#16#17#16#16#16#16#16#16#145#243
+ +#243#240#20#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#14#14#14#14#17#23#23#23#23#16#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#19#14#15#14
+ +#14#14#13#13#12#13#13#13#12#13#13#12#13#12#13#12#13#12#13#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#13#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14
+ +#14#15#14#14#15#14#15#17#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12
+ +#23#23#23#23#16#15#14#15#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13
+ +#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#13#12#207#243#243#232#25#24#24#24#24#24#23#24#24#23#24#23
+ +#23#24#23#23#23#23#23#146#241#243#243#243#200#137'}}||{{{zzzyyxxwwvvuuuuttti'
+ +'hhaaa````]]SSSRRRRQQQQPPONNNKKKJJJJII665e'#235#243#243#243#151#20#17#17#17
+ +#17#17#17#17#16#17#16#17#16#16#16#16#16#16#16#26#243#243#240#20#13#14#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#14#15#14#15#14#21#23#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#21#23#23#23#22#14#14#14#15#14#13#13#13#13#12
+ +#13#13#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#12#12#12#12#13#12#12#13#12#12#13#12#12#12#13#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#15#14#14#14#15#14#17#22
+ +#23#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#23#23#23#23#15#14#14
+ +#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#15#210#243#243#232#25#24#24#23#24#24#23#24#23#24#23#24#23#24#23#24#23#23
+ +#23#24#208#243#243#243#239#183'}}|||{zzzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQ'
+ +'QQQPPONNNKKKKJJJIIU'#197#243#243#243#240#26#17#17#17#17#17#17#17#17#17#17#16
+ +#17#16#17#16#17#16#16#16#248#243#243#243#25#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#14#14#14
+ +#14#15#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#14#23#23#23#23#17#14#15#14#14#13#13#13#13#13#12#13#13#12#13#12
+ +#13#13#12#13#13#12#13#13#12#12#12#12#12#12#12#12#13#12#12#12#13#12#13#12#13
+ +#12#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#13#14#15#14#15#14#14#14#15#14#17#22#23#23#23#23#23#23#23#16#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#14#14#15#14#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ ,#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#14#210#243#243
+ +#232#25#24#24#24#24#24#23#24#24#23#24#23#23#24#23#23#23#23#23#23#146#233#243
+ +#243#243#229#175'}||{{{zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKJJJ'
+ +'M'#170#243#243#243#243#150#20#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16
+ +#17#16#17#16#144#243#243#243#25#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#14#14#15#14#15#19#22
+ +#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#22#23#23#23#20#14#14#14#15#13#13#13#12#13#13#13#13#12#13#13#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12
+ +#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#13#14#14#14#14#14#14#14#15#14#16#21#23#23#23#23#23#23#23#19#12#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#21#14#14#14#15#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#13#14#13#13#14#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#14#210#243#243#232#25
+ +#24#24#23#24#24#24#23#24#23#24#23#23#24#23#23#24#23#23#23#24#151#243#243#243
+ +#243#228#175'||{{{zzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPONNNKKKM'#172
+ +#241#243#243#243#208#23#19#17#19#17#17#17#17#17#17#17#17#17#17#17#17#16#17#16
+ +#17#16#144#243#243#243#25#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#13#14#14#14#14#14#21#23#23
+ +#23#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#17#23#23#23#22#15#14#14#15#14#13#13#13#12#13#13#13#12#13#12#13#13#12#13#12
+ +#13#13#12#13#12#13#12#13#12#13#12#12#13#12#12#13#12#13#12#12#12#12#12#12#13
+ +#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14
+ +#15#14#15#14#15#14#15#20#23#23#23#23#23#23#23#21#14#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#19#23#23#23#20#14#15#14#14#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#13#13#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#14#210#243#243#232#25#24#24
+ +#24#24#23#24#24#23#24#23#24#23#24#23#23#23#23#23#23#23#25#207#243#243#243#243
+ +#229#182'|{{{zzzyyxxwwvvuuuutttihhaaa````]]SSSRRRRQQQQPPONNNX'#195#243#243
+ +#243#243#232#145#19#17#19#17#17#19#17#17#17#17#17#17#17#17#17#17#17#17#16#17
+ +#16#145#243#243#243#25#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#13#13#14#13#13#14#13#14#14#14#15#14#14#23#23#23
+ +#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#13#23#23#23#23#15#15#14#14#14#13#13#13#13#12#13#13#12#13#12#13#12#13#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12#12#12#12#12#13#12#12#12#12#12
+ +#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#15#14
+ +#14#14#14#14#15#19#23#23#23#23#23#23#23#22#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#23#23#23#23#19#14#14#14#15#13#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#14#210#243#243#233#144#24
+ +#24#24#24#23#24#24#23#24#23#24#23#24#23#23#23#23#23#23#23#23#25#207#243#243
+ +#243#243#239#199#136'{zzzzyyxxwwvvvuuutttihhaaa````]]SSSRRRRQQQQPPO'#157#218
+ +#243#243#243#243#232#145#19#17#19#19#17#19#19#17#19#17#17#17#17#17#17#17#17
+ +#17#17#17#17#16#151#243#243#243#25#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#14#14#14
+ +#15#15#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#11#22#23#23#23#17#14#14#15#14#13#13#13#13#13#12#13#13#12#13
+ +#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#13#12#13#12#13#12#13#12#12
+ +#12#13#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14
+ +#14#15#14#14#14#15#14#15#19#22#23#23#23#23#23#23#23#15#11#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#16#14#15#14#14#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#13#13#13#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#13#14#210
+ +#243#243#241#145#24#24#24#24#23#24#24#23#24#23#23#23#24#23#24#23#23#23#23#23
+ +#23#23#25#207#243#243#243#243#243#229#180#134'zzzyyxxwwvvuuuutttihhaaa````]]'
+ +'SSSRRRRQQQj'#196#241#243#243#243#243#211#145#19#19#19#19#19#19#17#19#17#19
+ +#17#19#17#17#17#17#17#17#17#17#17#17#19#7#243#243#240#24#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#14#15#14#14#16#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#22#23#23#23#19#14#14#14#14#13#13
+ +#13#12#13#13#12#13#13#12#13#13#12#13#13#12#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#12#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#13#14#15#14#14#14#14#15#14#14#17#22#22#23#23#23#23#23#23#17#11#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#15#14#14#14#15
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#13#13#14#13#13#13#13#13#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#149#243#243#243#247#24#24#24#24#23#24#24#23#24#23#24#23
+ +#23#23#23#23#23#23#23#23#23#23#23#24#150#233#243#243#243#243#243#228#181#135
+ +'zyyxxwwvvvuuutttihhaaa````]]SSSRR_s'#196#242#243#243#243#243#243#151#25#19
+ +#19#19#19#19#19#19#19#19#19#17#19#17#19#17#19#17#17#17#17#17#17#17#21#211#243
+ +#243#240#20#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#14#14#14#15#17#23#23#23#23#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19
+ +#23#23#23#19#14#15#14#14#14#12#13#13#13#12#13#12#13#12#13#12#13#12#13#13#12
+ +#13#12#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#12#12#12#12#13#12#13#12
+ +#13#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#14#15#14#15#14#14#16#21#23
+ +#23#23#23#23#23#23#19#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#16#22#23#23#23#14#15#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13
+ +#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#147#243#243#243#207#25
+ +#24#24#24#24#23#24#24#23#24#23#24#23#23#24#23#23#23#23#23#23#23#23#23#22#146
+ +#7#243#243#243#243#243#243#239#205#181#139'xxwwvvuuuutttihhaaa````]]k'#132
+ +#190#227#243#243#243#243#243#243#211#146#21#20#19#19#19#19#19#19#19#19#19#19
+ +#19#17#19#19#17#19#17#17#17#17#17#17#17#24#240#243#243#210#20#14#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#13#14#13#13#14#13#14#15#14#14#19#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#21#14#14
+ +#15#14#14#13#12#13#13#13#12#13#13#12#13#13#12#13#12#13#12#12#13#12#13#12#13
+ +#12#13#12#12#12#12#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#13#14#14#15#14#14#14#14#14#15#21#23#23#23#23#23#23#23#21#13#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#23#23#23#21#14#14
+ +#15#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13
+ +#12#13#13#13#12#13#13#13#12#13#12#13#24#240#243#243#232#26#24#23#24#24#23#24
+ +#24#23#24#23#24#23#23#23#23#23#23#23#23#23#23#23#23#22#23#24#146#207#240#243
+ +#243#243#243#243#243#243#231#222#198#178#133#129'vuuutttihhal'#131#131#187
+ +#193#219#242#243#243#243#243#243#243#243#211#147#22#20#20#19#20#19#20#19#19
+ +#19#19#19#19#19#19#19#19#17#19#19#17#19#17#19#17#17#17#147#243#243#243#151#15
+ +#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#14#13#13#14#13#14#14#14#14#15#17#23#23#23#23#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19
+ +#23#23#23#21#14#14#14#14#14#12#13#13#13#12#13#12#13#13#12#13#13#12#13#12#13
+ +#12#12#12#12#12#12#12#13#12#13#12#13#12#13#12#12#13#12#12#12#12#13#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#15#14#15#14#20#23#23#23#23#23
+ +#23#23#22#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19
+ +#23#23#23#20#15#14#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#14
+ +#13#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12#13#13#13#20#232#243#243#241
+ +#247#24#24#24#24#23#24#23#24#23#23#24#23#23#24#23#23#23#23#23#23#23#23#23#22
+ +#23#22#22#22#144#150#210#243#243#243#243#243#243#243#243#243#243#243#243#243
+ +#230#226#226#226#226#243#243#243#243#243#243#243#243#243#243#243#243#243#232
+ +#152#145#21#20#20#19#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#19#19#17#19
+ +#17#19#17#19#17#21#208#243#243#243#146#14#14#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#14#15#14#14#19#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#20#14#15#14#14#14#13#13#12
+ +#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#12#12#13#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#13
+ +#14#15#14#14#15#17#23#23#23#23#23#23#23#21#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#22#23#23#23#19#14#14#15#14#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#14#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13
+ +#12#13#12#13#14#14#16#152#243#243#243#208#25#24#24#24#23#24#24#23#24#23#24#23
+ +#23#23#23#23#23#23#23#23#23#23#23#22#23#22#23#22#22#22#22#144#149#7#210#240
+ +#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243
+ +#243#211#207#149#144#22#20#20#20#20#20#20#20#20#20#19#20#19#20#19#20#19#19#19
+ +#19#19#19#19#19#19#19#19#17#19#17#19#26#240#243#243#240#24#13#14#14#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#14#14#14#14#15#16#23#23#23#23#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23#23#19
+ +#14#14#15#14#13#13#13#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#13#12#13#12#12#13#12#12#12#12
+ +#12#12#12#12#12#12#12#13#14#14#14#15#19#23#23#23#23#23#23#23#17#11#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#22#23#23#23#16#14
+ +#15#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#13#13#13#13#14#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#13#12#13#13#12#13#14#14#14#14#14#144#243#243#243#241#146
+ +#24#24#24#23#24#24#23#24#23#24#23#23#24#23#23#23#23#23#23#23#23#23#22#23#22
+ +#22#22#22#22#22#22#22#22#22#21#144#144#247#150#150#150#210#210#210#210#210
+ +#152#150#149#150#144#26#23#21#20#21#20#21#20#20#20#20#20#20#20#20#20#19#20#20
+ +#19#20#19#19#19#19#19#19#19#19#19#19#19#19#19#17#19#20#207#243#243#243#207#17
+ +#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#13#13#13#14#13#13#14#13#13#13#13#14#15#14#14#16#23
+ +#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#23#23#23#23#17#15#14#14#14#13#13#13#13#12#13#12#13#12#13#13#12#13
+ +#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#13#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#15#14#14#19#23#23#23#23
+ +#23#19#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#12#23#23#23#23#16#14#14#14#15#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13
+ ,#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#12#14#14#15#14#14#15
+ +#20#211#243#243#243#208#25#24#24#23#24#23#24#23#24#23#24#23#23#23#23#23#23#23
+ +#23#23#23#23#22#23#22#22#22#22#22#22#22#22#22#22#21#22#21#21#22#21#21#21#21
+ +#21#21#21#21#21#21#21#21#21#20#21#20#21#20#20#20#20#20#20#20#20#20#20#20#20
+ +#19#20#19#20#19#20#19#19#19#19#19#19#19#19#19#19#19#144#240#243#243#243#146
+ +#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#14#13#14#13#13#14#13#13#14#13#14#13#14#14#14#15
+ +#14#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#12#23#23#23#23#16#14#14#15#14#13#13#13#13#12#13#13#12#13#12#13
+ +#12#13#12#12#12#12#12#12#12#12#12#13#12#13#12#13#12#13#12#13#12#12#13#12#12
+ +#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#15#17#23#23
+ +#23#22#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#15#23#23#23#23#14#15#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13
+ +#14#13#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#14#14#14#15#14
+ +#21#23#23#150#243#243#243#241#150#24#24#24#24#23#24#23#24#23#23#24#23#23#23
+ +#23#23#23#23#23#23#23#22#23#22#23#22#22#22#22#22#22#22#22#21#22#22#21#22#21
+ +#21#21#21#21#21#21#21#21#21#21#21#20#21#21#20#21#20#20#20#20#20#20#20#20#20
+ +#20#20#20#20#19#20#19#20#19#20#19#19#19#19#19#19#19#23#210#243#243#243#210#20
+ +#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#14#14#15#14
+ +#14#14#22#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#15#23#23#23#23#14#15#14#14#14#13#13#12#13#13#12#13#13#12#13
+ +#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#13
+ +#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#15#14#14#19#23
+ +#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#16#22#23#23#22#14#14#15#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#14#15#14#14
+ +#14#23#23#23#23#26#232#243#243#243#233#145#24#23#24#24#23#23#24#23#23#24#23
+ +#23#23#23#23#23#23#23#23#23#22#23#22#22#22#22#22#22#22#22#22#22#21#22#21#21
+ +#22#21#22#21#21#21#21#21#21#21#21#21#21#20#21#20#20#21#20#21#20#20#20#20#20
+ +#20#20#20#20#20#19#20#20#19#20#19#19#19#19#19#19#22#151#243#243#243#240#146
+ +#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#13#13#14
+ +#14#14#15#14#20#23#23#23#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#20#23#23#23#21#14#14#14#15#14#12#13#13#12#13#12#13#12
+ +#13#12#13#13#12#13#12#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#12#13#12
+ +#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#15
+ +#19#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#19#23#23#23#21#14#14#14#14#14#14#14#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#13#13#13#13#14#13#13#14#14#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12#14#14
+ +#14#15#14#23#23#23#23#23#19#144#233#243#243#243#211#145#23#24#24#23#24#23#24
+ +#23#23#24#23#23#23#23#23#23#23#23#23#22#23#22#22#22#22#22#22#22#22#22#22#21
+ +#22#22#21#22#21#21#21#21#21#21#21#21#21#21#21#21#21#20#21#20#21#20#20#20#20
+ +#20#20#20#20#20#20#20#20#19#20#19#20#19#20#19#19#21#247#240#243#243#243#152
+ +#17#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#14
+ +#13#14#14#14#14#14#16#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#17#15#14#14#14#14#13#12#13#13#12
+ +#13#13#12#13#13#12#13#12#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14
+ +#15#14#14#21#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#21#23#23#23#19#14#15#14#14#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#14#13#13#13#13#14#15#14#14#14#15#14#14#14#14#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13
+ +#13#14#15#14#14#16#23#23#23#23#14#0#0#11#247#243#243#243#243#211#145#23#24#24
+ +#23#23#24#23#23#23#23#23#23#23#23#23#23#23#23#22#23#22#22#22#22#22#22#22#22
+ +#22#22#21#22#21#21#22#21#22#21#21#21#21#21#21#21#21#21#21#20#21#21#20#21#20
+ +#21#20#20#20#20#20#20#20#20#20#20#20#19#20#19#20#21#247#240#243#243#243#232
+ +#22#14#13#14#14#14#14#14#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#13#14#13
+ +#13#13#14#13#14#15#14#15#14#22#23#23#23#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#15#14#15#14#14#13#13#13#12
+ +#13#13#12#13#13#12#13#12#13#13#12#12#12#12#12#12#12#13#12#13#12#13#12#13#12
+ +#13#12#12#13#12#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#13#14#14#14#15#20#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#23#23#23#23#17#14#14#15#14#14#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#14#13#13#13#14#14#14#14#14#15#14#14#14#15#14#14#14#14#14#14
+ +#14#14#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#14#14#14#15#16#23#23#23#23#0#0#0#0#0#14#150#243#243#243#243#211#146
+ +#24#23#24#23#24#23#23#24#23#23#23#23#23#23#23#23#23#22#23#22#22#22#22#22#22
+ +#22#22#22#22#21#22#22#21#22#21#21#21#21#21#21#21#21#21#21#21#21#20#21#20#21
+ +#20#20#20#20#20#20#20#20#20#20#20#20#20#19#20#22#150#240#243#243#243#232#25
+ +#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13
+ +#14#13#14#13#13#14#14#14#14#14#19#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#21#14#14#14#15#14#13#13
+ +#13#12#13#12#13#12#13#12#13#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#14#15#14#14#14#22#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#16#15#14#14#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#13#13#13#14#13#14#14#15#14#14#14#15#14#14#14#14#15#14#14
+ +#15#14#14#14#14#14#15#14#14#14#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#12#13#15#14#14#14#19#23#23#23#23#0#0#0#0#0#0#0#17#7#243#243#243#243
+ +#233#150#24#24#23#24#23#23#23#23#23#23#23#23#23#23#23#23#22#23#22#22#22#22#22
+ +#22#22#22#22#22#21#22#21#21#22#21#22#21#21#21#21#21#21#21#21#21#21#21#20#21
+ +#20#21#20#21#20#20#20#20#20#20#20#20#20#25#152#243#243#243#243#232#25#14#14
+ +#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#15#14#15#14#15#23#23#23#23#21#11#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#23#16#14#15#14#14#14#12#13
+ +#13#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#12#13#12#13#12#13#12
+ +#13#12#12#12#12#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#14#14#15#14#14#23#23#23#23#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#23#23#23#23#15#14#14#15#14#14#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#14#13#14#13#14#14#14#14#15#14#14#14#15#14#15#14#14#15#14
+ +#14#14#15#14#15#14#14#14#15#14#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ ,#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#14#15#14#14#19#23#23#23#21#0#0#0#0#0#0#0#0#0#17#247#243#243
+ +#243#243#240#207#145#23#24#23#23#24#23#23#23#23#23#23#23#23#23#22#23#22#22#22
+ +#22#22#22#22#22#22#22#21#22#22#21#22#21#21#21#21#21#21#21#21#21#21#21#21#20
+ +#21#21#20#21#20#20#20#20#20#20#20#21#147#232#243#243#243#243#232#25#14#14#14
+ +#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#14#13#14#14#14#14#14#19#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#23#23#23#23#21#14#14#14#14#15#13#13
+ +#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12
+ +#12#12#13#12#12#13#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#14#14#14#15#15#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#22#14#14#15#14#14#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#14#13#13#14#14#15#14#14#15#17#17#16#14#14#14#15#14
+ +#14#15#14#14#14#14#14#15#14#14#15#14#14#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#14#14#14#15#14#20#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#14#145
+ +#233#243#243#243#243#233#152#248#23#23#23#23#23#23#23#23#23#23#23#23#22#23#22
+ +#22#22#22#22#22#22#22#22#22#21#22#21#21#22#21#22#21#21#21#21#21#21#21#21#21
+ +#21#20#21#20#21#20#21#20#20#22#145#207#243#243#243#243#243#207#25#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#13#13#13#14#15#14#15#14#15#22#23#23#23#23#14#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#23#15#15#14#15#14#14
+ +#12#13#13#12#13#13#12#13#12#13#13#12#13#12#12#12#12#12#12#12#13#12#13#12#13
+ +#12#13#12#13#12#12#12#12#12#13#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#15#14#14#14#16#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#21#14#14#14#14#14#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#13#13#14#14#15#14#14#14#15#19#23#23#23#23#21#20
+ +#19#17#16#14#15#14#15#14#14#14#15#14#14#15#14#14#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#12#13#13#14#15#14#14#21#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#11#23#208#243#243#243#243#243#233#152#146#23#23#23#23#23#23#23#23#23#23#22
+ +#23#22#22#22#22#22#22#22#22#22#22#21#22#22#21#22#21#21#21#21#21#21#21#21#21
+ +#21#21#21#21#20#21#20#23#147#207#243#243#243#243#243#240#147#17#14#14#14#14
+ +#14#14#14#14#14#14#14#14#13#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#14#13#14#13#14#14#14#14#14#16#23#23#23#23#23#14#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#21#23#23#23#23#19#14#14#14#14
+ +#14#13#13#13#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#12#13#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#13#14#15#14#14#17#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23#23#19#15#14#15#14#14
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#14#13#14#14#14#14#15#14#19#23#23#23#23#23
+ +#23#23#23#23#23#23#23#21#21#20#19#19#19#15#14#14#14#14#14#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#13#12#13#14#14#14#14#15#20#23#23#23#16#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#14#145#211#243#243#243#243#243#243#211#151#144#23#23#23#23#23#23
+ +#23#22#23#22#22#22#22#22#22#22#22#22#22#21#22#21#21#22#21#22#21#21#21#21#21
+ +#21#21#21#21#24#146#152#232#243#243#243#243#243#243#152#23#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#14#13#13#14#14#15#14#15#14#19#23#23#23#23#23#14#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#21#23#23#23#23#21#14#15#14
+ +#15#14#14#13#12#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13
+ ,#12#13#12#13#12#13#12#12#12#13#12#12#12#12#12#12#13#12#13#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#13#14#14#15#14#19#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#23#23#23#23#19#14#14#14
+ +#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#15#14#15#14#14#17#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#20#14#15#14#14#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#13#12#14#14#15#14#14#23#23#23#23#16#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#15#146#211#243#243#243#243#243#243#243#232#7#149#145
+ +#24#22#23#22#23#22#22#22#22#22#22#22#22#22#22#21#22#22#21#22#21#21#21#21#21
+ +#25#145#149#210#240#243#243#243#243#243#243#240#152#25#15#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#14#14#14#14#14#14#21#23#23#23
+ +#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#23#23#23#23#23#22#14
+ +#14#14#14#14#14#13#13#13#13#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13
+ +#12#12#12#12#12#12#12#12#12#13#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#14#14#14#14#15#20#23#23#23#23#23#17#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#22#23#23#23
+ +#16#14#15#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#14#14#14#14#14#17#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#15#14#15#14#14
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#12#13#13#13#12#13#13#13#12#13#13#13#12#13#12#14#14#14#15#14#23#23#23#23#14#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#24#150#240#243#243#243#243#243
+ +#243#243#243#243#210#210#150#150#149#144#144#144#144#144#144#144#144#144#144
+ +#144#145#150#150#7#210#233#243#243#243#243#243#243#243#243#243#210#147#22#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14
+ +#14#13#14#14#13#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#13#14
+ +#14#15#14#15#14#15#21#23#23#23#23#23#20#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#11#19#23#23#23#23#23#22#15#15#14#15#14#15#13#13#13#12#13#13#12#13#13#12#13
+ +#12#13#12#13#12#12#12#12#12#12#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12
+ +#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#15#14#14
+ +#14#16#21#23#23#23#23#23#19#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#12#23#23#23#23#15#14#14#15#14#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#14#14#15#14#15#14#16#22#23#23#23#23#17#12#15#16#19#22#23#23#23#23#23
+ +#23#23#23#23#23#23#20#14#14#15#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13
+ +#12#14#15#14#14#15#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#15#23#147#208#243#243#243#243#243#243#243#243#243#243#243#243#243
+ +#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243#243#240
+ +#207#146#22#16#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13
+ +#14#13#14#13#13#13#13#13#14#14#14#14#14#14#15#21#23#23#23#23#23#23#17#12#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#11#17#23#23#23#23#23#23#22#15#14#14#15#14#14#14#12
+ +#13#13#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#12#12#13#12#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#14#14#15#14#14#15#14#21#23#23#23#23#23#20#12#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#14#15#14#14
+ +#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#14#14#14#14#14#14#16#22#23#23#23#23#20#0#0
+ +#0#0#0#0#0#12#12#16#15#19#19#21#23#23#23#23#15#14#14#14#14#14#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13
+ ,#13#12#13#13#13#12#13#13#14#14#14#15#16#22#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#21#26#147#7#211#243#243#243#243
+ +#243#243#243#243#243#243#243#243#243#243#243#243#243#243#7#207#151#149#144#24
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#13#14#13#13
+ +#13#13#13#13#13#14#13#13#13#13#14#15#14#15#14#14#15#19#23#23#23#23#23#23#23
+ +#20#15#11#0#0#0#0#0#0#0#0#11#14#19#23#23#23#23#23#23#23#21#15#14#15#14#14#14
+ +#14#13#13#13#12#13#13#12#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#12#12#12#12#13#12#12#12#12#12#13#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#13#14#14#15#14#14#14#14#20#23#23#23#23#23#22#11#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#21#14
+ +#14#14#15#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#14#15#14#15#14#15#22#23#23#23#23
+ +#20#11#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#20#14#15#14#14#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13
+ +#12#13#13#13#12#13#13#12#13#14#15#14#14#16#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#19#17#17#19#17
+ +#17#19#17#17#19#17#17#11#0#0#0#12#23#23#23#23#16#14#15#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#14#13#13#14#13#14#13#14#13#13#13#14#13#13
+ +#13#14#14#14#14#15#14#14#17#22#23#23#23#23#23#23#23#23#23#19#20#16#15#20#19
+ +#22#23#23#23#23#23#23#23#23#23#19#14#14#14#14#14#15#14#13#12#13#13#13#13#12
+ +#13#13#12#13#13#12#13#12#13#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12
+ +#13#12#12#13#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#13#14#14#14#15#14#14#14#17#23#23#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#20#15#14#14#14#14#14#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#14#15#14#14#14#15#21#23#23#23#23#21#11#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#19#23#23#23#23#15#14#15#14#14#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12
+ +#13#14#14#14#15#19#22#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#22#23
+ +#23#23#17#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#13#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13
+ +#14#13#14#13#14#13#13#14#13#13#13#13#13#13#14#15#14#14#14#15#14#15#20#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#21#15#14#15#14
+ +#15#14#14#14#13#13#13#13#12#13#12#13#12#13#13#12#13#13#12#13#12#13#12#12#12
+ +#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#13#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#15#14#15#14#16
+ +#22#23#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#23#23#23#23#19#14#15#14#14#15#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#13#14#14#14#14#14#15#14#21
+ +#23#23#23#23#22#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#20#14#14#15
+ +#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13
+ +#12#13#13#13#13#12#13#13#13#12#13#13#13#13#15#14#14#14#19#23#23#23#20#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#22#23#23#23#19#15#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#14#13#14
+ +#13#13#14#14#15#14#14#14#14#14#16#20#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#21#16#14#15#14#14#14#14#15#14#12#13#13#12#13#13#13#13#12#13
+ +#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12
+ +#13#12#12#12#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#14#14#14#14#14#14#15#15#22#22#23#23#23#23#19#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#22#23#23#23#16#14#14#15#14#14#14#14
+ +#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#13#13#14#13
+ +#13#14#13#13#14#14#14#15#14#14#14#20#23#23#23#23#22#11#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#19#23#23#23#23#15#14#14#14#14#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#13#12#13
+ +#13#14#15#14#14#20#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23
+ +#23#23#21#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#13#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14
+ +#13#14#13#14#13#14#13#13#14#13#13#13#13#13#13#13#14#14#14#15#14#15#14#14#14
+ +#15#17#21#23#23#23#23#23#23#23#23#23#23#23#23#22#19#15#14#14#14#14#14#15#14
+ +#14#14#13#13#12#13#13#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#13#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#15#14#15#14#14
+ +#14#15#21#23#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#12#23#23#23#23#22#17#14#14#14#15#14#14#15#14#14#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14#14#14#14#14#15#14#20#23
+ +#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#20#14#15
+ +#14#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12
+ +#13#13#13#13#12#13#13#13#13#12#13#13#12#14#14#14#15#14#21#23#23#23#19#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14
+ +#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#13#13#13#13#13#13#13
+ +#14#13#13#13#14#14#14#14#14#14#15#14#14#15#14#15#16#17#20#21#20#21#20#20#19
+ +#16#15#14#14#15#14#15#14#15#14#14#14#14#12#13#13#13#13#12#13#13#12#13#13#12
+ +#13#13#12#13#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#13#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#13#14#14#14#15#14#14#14#20#23#23#23#23#23#22#11#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#23#23#23#23#23#23#21#15#14#14#15#14
+ +#14#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13
+ +#13#14#13#14#14#15#14#14#14#19#22#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#19#23#23#23#23#15#14#15#14#14#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#14
+ +#14#14#14#14#21#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23
+ +#23#23#16#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#13#14#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13
+ +#13#13#13#13#13#13#13#13#14#13#14#13#13#13#13#13#13#13#14#14#15#14#14#14#15
+ +#14#14#14#14#15#14#14#14#15#14#14#14#15#14#15#14#14#14#14#14#14#14#14#13#13
+ +#13#13#12#13#13#13#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#15
+ +#14#14#14#17#23#23#23#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#11#19#23#23#23#23#23#23#23#19#15#14#14#15#14#15#14#14#14#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#15#14#14#15#14#17#23#23#23
+ +#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#20#14#14
+ +#15#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13
+ +#13#12#13#13#13#13#12#13#13#13#12#13#14#14#15#14#14#23#23#23#23#16#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#22#23#23#23#17#14#14#15#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ ,#13#14#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14#13#14#13#13#13#13#13
+ +#14#13#13#13#13#13#13#13#14#14#15#14#14#14#15#14#14#14#14#15#14#14#15#14#14
+ +#14#14#14#14#15#14#15#14#14#13#13#13#12#13#13#13#13#12#13#13#13#12#13#12#13
+ +#13#12#13#12#13#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12
+ +#12#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#14#14#14#15#14#15#14#17#22#23#23#23#23#23#16#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#21#23#23#23#23#23#23#22#17#15
+ +#14#14#14#14#15#14#14#14#14#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13
+ +#13#14#14#14#14#15#14#16#23#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#19#23#23#23#23#15#14#14#14#15#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#14#14
+ +#14#15#14#23#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23
+ +#23#20#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#13#14#14#14#14#13#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#14#14#14#15
+ +#14#14#15#14#14#14#15#14#14#15#14#15#14#15#14#14#14#14#13#13#13#13#13#13#12
+ +#13#13#13#13#12#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14
+ +#14#14#14#14#15#22#23#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#11#16#23#23#23#23#23#23#23#21#17#14#15#14#14#14#15#14#14#14#14#14#13
+ +#14#13#14#13#14#13#13#13#14#13#13#14#14#14#15#14#14#14#16#22#23#23#23#23#19#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#20#14#15#14
+ +#14#14#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13
+ +#13#13#13#12#13#13#13#13#12#13#14#15#14#14#15#23#23#23#23#12#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#16#23#23#23#22#14#14#15#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#14#13#14#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#14#14#14#14#15#14#14#14#14#15#14#14#14#14#14
+ +#14#13#13#13#13#12#13#13#12#13#13#13#12#13#13#13#13#12#13#12#13#12#13#12#13
+ +#13#12#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#13#15#14#15#14#15#14#15#21#23#23#23#23#23#20#11#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#19#23#23#23#23#23#23#23#21#16
+ +#14#15#14#14#14#15#14#14#15#14#14#13#14#13#13#14#13#14#13#13#14#14#14#14#14
+ +#15#14#16#22#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#19#23#23#23#23#15#14#14#15#14#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#12#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#14#14#14#15#16
+ +#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#23#23#23#23#16#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14
+ +#13#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#14#13
+ +#14#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#14#14#14#14#13#14#13#14#13#13#12#13#13#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#12#13#13#12#13#13#12#13#12#12#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#13#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#14
+ +#14#14#15#19#23#23#23#23#23#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#13#21#23#23#23#23#23#23#23#21#16#14#15#14#14#14#15#14#14#14#14#14#14#13
+ +#13#14#13#13#14#13#14#14#15#14#14#15#21#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#21#14#14#14#14#14#13#13#13
+ ,#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13
+ +#13#13#12#13#15#14#14#14#17#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#11#22#23#23#23#17#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13
+ +#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#14#13#13#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#13#12#13#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#13#12#12#12#12#13#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#14#15#14#15#14#14#14#19#23#23#23#23#23#22#14#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#15#22#23#23#23#23#23#23#23#20#16#14#15
+ +#14#14#14#15#14#14#14#14#14#14#13#14#13#14#14#15#14#14#14#15#21#23#23#23#23
+ +#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23
+ +#23#16#15#14#15#14#14#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#13#12#13#13#13#12#13#14#15#14#14#19#23#23#23#23#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23#23#21#14#14#15#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14#14#14#13#14#14
+ +#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#14#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#12#13
+ +#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12
+ +#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#14#15#14#14#17#22
+ +#23#23#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#16#23
+ +#23#23#23#23#23#23#23#21#16#14#15#14#14#15#14#15#14#14#14#14#14#14#14#14#14
+ +#14#15#14#21#23#23#23#23#21#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#12#23#23#23#23#21#14#14#14#14#14#13#13#13#13#13#13#13#13#13#13
+ +#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#14#14#15#14
+ +#19#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23
+ +#15#14#14#14#15#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#14#14#14#13#14
+ +#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#14#13#14#13#14
+ +#13#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13
+ +#13#13#12#13#12#13#13#12#13#12#13#12#12#13#12#13#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#13#12#12#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#14#14#14#14#15#14#14#15#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#11#17#23#23#23#23#23#23#23#23#22#16#15#14#14#14#14#15#14
+ +#15#14#14#14#15#14#15#14#14#20#23#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#23#16#14#15#14#14#14#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13
+ +#13#12#14#14#14#14#14#21#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#12#23#23#23#23#17#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#13#14#14#14#14#14#13#14#14#13#14#14#13#14#14#13#14#13#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#14#13#13#13#13#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#12#13#13#13#13#12#13#13#12#13#13#12#13#12#13#13#12#13#13#12#12#12#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#12#12#13#12#12#13#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#13#15#14#14#14#15#15#23#23#23#23#14#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#17#23#23#23#23#23#23#23#23#22
+ +#19#15#15#14#14#14#14#14#15#14#14#14#14#14#19#23#23#23#23#23#14#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#21#14#14
+ +#15#14#14#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#13#12#13#13#12#14#14#15#14#14#21#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#22#23#23#23#20#14#14#14#15#14#14#14#14#14#14#14#14#14
+ +#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14#14#13#14#14#14#13#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13
+ +#13#13#12#13#13#13#12#13#13#13#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12#12#13#12#12#13#12#13
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#15#14#14#19#23#23#23#23#11#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#17#23#23#23
+ +#23#23#23#23#23#23#20#16#15#14#15#14#14#14#15#14#15#17#23#23#23#23#23#14#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23
+ +#23#23#16#14#14#14#15#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#13#13#13#13#14#14#14#15#14#22#22#23#23#16#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#22#15#14#14#14#14#15#14#15#14
+ +#15#14#15#14#15#14#14#15#14#15#14#14#14#14#14#14#14#14#14#14#14#14#14#13#14
+ +#13#14#14#14#13#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#13
+ +#12#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#15#14#22#23#23
+ +#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#11#17#22#23#23#23#23#23#23#23#23#22#19#15#14#15#14#14#14#17#23#23#23#23#23
+ +#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#11#23#23#23#23#21#14#15#14#14#14#13#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#13#12#13#13#13#13#14#14#14#14#15#14#14#14#23#23#23#23#16#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#23#23#23#23#17#14#15#14#14#14
+ +#15#14#14#14#14#14#14#14#15#14#14#14#14#14#15#14#15#14#15#14#15#14#15#14#14
+ +#14#14#13#14#14#13#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#14#13#14#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12#13#12#13#12
+ +#13#12#13#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#13#12#12#13
+ +#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#15#14#14#16
+ +#22#23#23#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#11#15#21#23#23#23#23#23#23#23#23#23#21#17#15#14#16#22#23#23#23
+ +#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#17#23#23#23#23#16#14#14#15#14#14#13#13#13#13#13#13#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#14#13#14#14#14#14#14#15#14#14#14#15#14#23#23#23#23#12#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#22#23#23#23#21#15#14#14#15
+ +#14#14#14#15#14#15#14#15#14#14#14#15#14#15#14#14#14#14#14#14#14#14#14#14#14
+ +#14#14#14#13#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ ,#13#13#13#13#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#13#12
+ +#13#13#12#13#12#12#12#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12
+ +#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#14#15
+ +#19#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#14#20#23#23#23#23#23#23#23#23#23#23#21#22#23#23#23#23
+ +#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#11#23#23#23#23#21#14#14#14#14#14#13#13#13#13#13#13#13#12#13#13#13#12#13
+ +#13#13#14#14#14#14#14#14#15#14#15#14#14#14#14#15#14#14#16#23#23#23#23#12#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#23#23#23#23#21
+ +#21#21#20#19#19#19#16#16#16#16#14#14#14#14#15#14#15#14#15#14#15#14#15#14#14
+ +#14#14#14#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#13#13#14#13#14#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#13#13#12#13#13#12#13#13#12
+ +#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#13#12#12#13
+ +#12#12#13#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#15#14#14#22
+ +#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#12#17#21#23#23#23#23#23#23#23#23#23#23#23#23#20#11#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#17#23#23#23#23#16#15#14#15#14#14#13#13#13#13#13#13#13#13#14#14#14#14#14#14
+ +#14#14#15#14#15#14#14#14#14#15#14#15#14#14#14#17#19#23#23#23#23#11#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#22#21#21#20#19#19#19#16#14#14#14#15#14#14
+ +#13#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#14#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#13#12#12#13#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#15#14#14#16#23#23#23
+ +#23#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#11#14#20#23#23#23#23#23#23#23#23#23#20#11#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23
+ +#23#23#21#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#14#15#14#15#14#14#14
+ +#14#14#14#15#14#14#14#14#15#17#20#23#23#23#23#23#23#23#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#22#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#22#15#14#14#14#14#14#14#14#13#14
+ +#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#13#12#13#13#13#12#13#13#13#13#13#12#13#13#12#13#12#13#13#12#13#13#12#13#12
+ +#13#12#12#12#12#12#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#13#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#14#15#20#23#23#23#22#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#11#16#21#22#23#23#23#23#22#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#16#14#15
+ +#14#14#14#14#14#14#15#14#15#14#15#14#14#14#14#14#15#14#15#14#15#14#14#15#17
+ +#20#22#23#23#23#23#23#23#23#23#23#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#16#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ ,#23#23#23#23#23#23#23#23#23#19#14#15#14#14#14#14#13#14#14#13#14#14#13#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#13#14#13#14#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13
+ +#13#12#13#13#13#12#13#12#13#13#12#13#12#13#12#12#12#12#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#12#13#12#12#12#13#12#12#13#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#14#15#14#14#15#22#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#12#16#21#23#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#21#14#14#15#14#15#14#15#14#14
+ +#14#14#14#14#15#14#15#14#14#14#14#14#16#19#20#22#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11
+ +#12#12#12#16#15#16#16#19#19#20#21#23#23#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#22#15#14#15#14#14#14#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12
+ +#13#12#13#13#12#13#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#12#13#12#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14
+ +#14#15#14#17#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#12#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#17#23#23#23#23#16#14#14#14#14#14#14#14#15#14#15#14#14#14#14#15#16#19
+ +#20#21#23#23#23#23#23#23#23#23#23#23#23#23#23#23#22#19#14#11#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12
+ +#12#12#13#16#15#16#17#20#20#23#23#23#23#20#14#14#15#14#14#14#14#14#13#14#14
+ +#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12
+ +#13#13#13#13#12#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#13#12#13#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#14#15#14#14#14#22#23#23#23#21#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#21#15#14#15#14#15#14#14#16
+ +#16#17#19#20#21#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#20#16#13#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#20#23#23#23#23#16#14#14#15#14#14#14
+ +#13#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#13#13#13#14#13#14#13#14#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#12#13#13#13#13#12#13#13#13#13#13#12#13#12#13#13#12#13#12#13#13#12#12#13#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#13#12#12#12#12#12#12#13#12#13#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#15#16#23#23#23#23#15#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23#20#19#20#21
+ +#21#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#21#17#14
+ +#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#21#14#14#14
+ +#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#15#14#15#14#14#21#23#23#23#21#11#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#20#16#14#11#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#23#17#15
+ +#14#15#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12
+ +#13#13#13#13#12#13#13#13#12#13#13#13#13#13#12#13#12#13#13#12#13#13#12#13#13
+ +#12#12#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#13#12#13#12#12#13#12
+ +#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#14#14#16#23#23#23#23#17#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#19#17#15#12#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#22#15#14
+ +#14#14#15#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#13#13#13#14#13#14#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#13#12#13#13#12#13#13#12#12#13
+ +#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#13#12#12#12#12
+ +#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#14#15#14#15#14#20#23#23#23#23#11#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21#23#23#23#23
+ +#23#23#23#23#23#23#23#23#21#19#17#16#12#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#23#23#20#14#15#14#14
+ +#14#14#14#13#14#13#14#13#14#13#14#13#14#13#13#13#14#13#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12
+ +#13#13#13#13#12#13#13#13#12#13#13#12#13#12#13#12#13#12#13#13#12#13#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#13#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#13#14#14#14#14#15#23#23#23#23#19#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#16#22#23#21#19#20#17#16#15
+ +#13#12#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#21#23#23#23#23#16#14#14#15#14#14#14#13#14#13#14
+ +#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13
+ +#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12
+ +#13#13#12#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#12#12#12#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12
+ +#12#14#14#15#14#14#14#14#13#13#13#13#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#14#15#14#15#14#20#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15
+ +#23#23#23#23#17#15#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#13#13#14#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#13#13#12#13#13#12#13#12#13#12
+ +#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#12#13#12#12#12#13#12#13
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#15#14#14#14#15#14#14#14#15
+ +#14#14#14#14#14#14#13#13#13#12#12#12#12#12#12#12#13#14#14#14#14#15#23#23#23
+ +#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#17
+ +#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#21#23#23#23#22#15#14#14#15#14#14
+ +#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12
+ +#13#13#13#12#13#13#13#12#13#12#13#13#12#13#13#12#13#12#13#12#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#12#13#12#12#12#12#12#12#13#12#13#12#12#12#12#12#12
+ +#12#12#12#12#14#14#14#14#15#14#14#14#15#14#14#14#15#14#14#14#14#15#14#14#14
+ +#14#14#14#14#13#13#15#14#15#14#14#20#23#23#23#23#12#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#243#243#7#15#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#14#23#23#23#23#19#14#14#15#14#14#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#13#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#13#13#13#14#13#13
+ +#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#12
+ +#13#12#13#13#12#13#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#13#12#12
+ +#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#14#15#14#14
+ +#14#15#14#14#14#15#14#14#15#14#15#14#14#14#15#14#15#14#14#14#14#14#14#14#14
+ +#15#15#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#14#147#211#243#243#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23
+ ,#23#22#15#14#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#14#13#14#13#13#13#13#13#14#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#12#13#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12
+ +#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#13#12
+ +#12#12#12#12#12#12#12#12#12#12#12#13#14#15#14#14#14#15#16#15#15#14#14#14#15
+ +#14#14#14#14#14#15#14#14#14#14#14#15#14#15#14#15#14#14#14#21#23#23#23#23#12#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#150
+ +#243#233#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#19#14#15#14#15#14#14#13
+ +#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13
+ +#13#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13
+ +#12#13#13#13#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#12#12#13#12#12#12#13#12#12#12#12#12#12#12#12
+ +#12#13#14#14#14#14#15#14#21#23#23#23#22#21#20#19#17#16#16#14#14#14#15#14#15
+ +#14#14#14#15#14#14#14#15#14#16#23#23#23#23#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#243#243#23#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#19#23#23#23#23#15#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13#12#13
+ +#12#13#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12
+ +#12#13#12#12#12#13#12#12#13#12#12#12#12#12#12#12#12#14#14#15#14#14#14#20#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#21#20#19#17#16#16#14#14#14#15#14#14#14
+ +#22#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#211#243#145#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#23#23#23#23#20
+ +#14#15#14#15#14#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14
+ +#13#13#14#13#13#14#13#13#14#13#13#13#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13
+ +#13#13#13#12#13#13#13#12#13#13#13#13#13#12#13#13#12#13#12#13#12#13#13#12#13
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#14#14#15#14#14#15#17#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#21#20#19#19#19#23#23#23#23#17#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#26#26#17#0#0#0#0#0#0#17
+ +#248#26#0#0#0#0#0#14#26#150#7#150#26#20#11#0#0#0#23#26#23#0#0#0#0#0#17#248#26
+ +#0#0#0#0#0#14#26#26#13#0#0#0#0#0#0#11#23#145#7#152#145#23#11#0#0#0#0#0#0#0#17
+ +#248#17#0#14#26#150#7#26#14#0#0#0#0#0#0#7#243#7#0#0#0#0#0#0#17#248#7#152#147
+ +#26#17#0#0#0#0#0#0#0#23#26#7#152#145#23#11#0#0#0#0#11#25#152#152#26#0#0#15#25
+ +#150#7#147#25#11#0#0#0#0#0#0#0#0#0#0#23#26#26#26#26#26#26#26#26#26#23#0#0#0#0
+ +#0#17#248#25#0#0#0#0#0#0#0#0#0#11#25#147#7#152#26#144#25#23#23#23#23#146#146
+ ,#14#14#14#14#13#14#13#14#13#20#145#145#14#13#14#13#13#14#25#145#23#14#13#14
+ +#13#13#14#13#13#17#248#150#207#147#23#13#13#13#14#13#13#13#13#13#19#145#151
+ +#207#145#19#13#13#13#13#13#13#13#13#13#25#149#207#147#21#13#13#145#145#13#12
+ +#13#13#13#12#13#13#13#13#12#13#13#13#12#13#13#13#12#13#12#13#13#12#13#13#12
+ +#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#13#12#12
+ +#12#13#12#12#12#12#12#12#12#12#14#14#14#14#14#15#16#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#23#22#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#243#243#26#0#0#0
+ +#0#0#0#7#243#150#0#0#0#11#146#243#243#243#243#243#243#243#146#0#0#0#7#243#152
+ +#0#0#0#0#0#26#243#243#0#0#0#0#0#17#243#243#17#0#0#0#0#0#23#233#243#243#243
+ +#243#243#243#233#26#0#0#0#0#0#0#26#243#26#23#243#243#243#243#243#243#145#0#0
+ +#0#0#0#7#243#152#0#0#0#0#14#152#243#243#243#243#243#243#243#20#0#0#0#0#20#240
+ +#243#243#243#243#243#243#26#0#0#0#11#240#243#243#243#243#0#15#243#243#243#243
+ +#243#243#233#23#0#0#0#0#0#0#0#0#0#7#243#243#243#243#243#243#243#243#243#152#0
+ +#0#0#0#0#211#243#243#15#0#0#0#0#0#0#0#25#233#243#243#243#243#243#243#232#23
+ +#23#20#146#243#243#14#14#14#13#14#13#14#13#14#150#243#243#19#14#13#14#13#13
+ +#240#243#232#13#13#13#14#13#13#14#26#240#243#243#243#243#243#232#20#13#13#13
+ +#14#13#15#147#243#243#243#243#243#243#207#15#13#13#13#13#13#19#210#243#243
+ +#243#243#243#151#23#243#243#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13
+ +#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#12#12#12#12#13#12#12#13#12#12#12#12#12#12#12#12#12#12#14#14#15#14#15
+ +#14#15#23#23#23#23#23#17#14#16#17#19#21#23#23#23#23#23#23#23#23#23#23#23#23
+ +#23#23#23#23#23#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#243#243#26#0#0#0#0#0#11#243#243#25#0#0#0#7#243#243#26#14#0
+ +#0#17#25#17#0#0#0#7#243#152#0#0#0#0#0#26#243#243#0#0#0#0#0#17#243#243#17#0#0
+ +#0#0#147#243#243#7#20#0#0#15#146#243#243#208#11#0#0#0#0#26#243#233#243#150#16
+ +#0#14#26#243#243#145#0#0#0#0#7#243#152#0#0#0#11#240#243#233#23#11#0#11#19#145
+ +#11#0#0#0#20#243#243#211#23#11#0#14#22#15#0#0#0#25#243#243#22#0#14#0#0#7#23
+ +#13#0#14#147#243#233#14#0#0#0#0#0#0#0#0#7#243#208#17#19#17#17#19#17#17#16#0#0
+ +#0#0#17#243#243#243#147#0#0#0#0#0#0#26#243#243#150#16#0#0#23#147#147#22#23#16
+ +#146#243#243#14#14#14#14#13#14#13#14#13#232#240#243#147#14#13#13#14#23#243
+ +#243#243#17#13#14#13#14#13#145#243#243#147#16#13#21#210#243#240#19#14#13#13
+ +#13#207#243#240#26#15#13#25#233#243#210#15#13#13#13#15#232#243#240#25#13#14
+ +#25#240#232#243#243#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13
+ +#13#12#13#12#13#12#13#13#12#12#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#12#12#12#12#12#13#12#13#12#12#12#12#12#12#14#14#14#14#15#14#15#23#23
+ +#23#23#23#19#0#0#0#0#0#0#0#11#12#14#16#17#19#21#23#23#23#23#23#23#23#23#23#23
+ +#23#23#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#243#243#26#0#0#0#0#0#17#243#243#15#0#0#23#243#243#17#0#0#0#0#0#0#0#0#0#0#7
+ +#243#152#0#0#0#0#0#26#243#243#0#0#0#0#0#17#243#243#17#0#0#0#26#243#243#26#0#0
+ +#0#0#0#0#17#240#243#150#0#0#0#0#26#243#243#150#0#0#0#0#0#25#243#243#13#0#0#0
+ +#7#243#152#0#0#0#147#243#233#11#0#0#0#0#0#0#0#0#0#11#240#243#208#11#0#0#0#0#0
+ +#0#0#0#0#150#243#208#0#0#0#0#0#0#0#0#0#0#11#243#243#25#0#0#0#0#0#0#0#0#7#243
+ +#7#0#0#0#0#0#0#0#0#0#0#0#0#147#243#147#243#233#11#0#0#0#0#14#243#243#26#0#0#0
+ +#11#23#23#23#23#21#14#146#243#243#14#14#13#14#13#14#13#14#19#243#207#210#232
+ +#14#13#14#13#150#243#147#243#26#14#13#13#13#17#243#243#145#13#14#13#13#15#210
+ +#243#232#13#13#13#25#243#243#21#13#13#13#13#19#240#243#150#13#13#13#145#243
+ +#243#19#13#13#13#13#21#243#243#243#13#13#13#12#13#13#13#12#13#13#13#12#13#13
+ +#13#13#13#12#13#12#13#13#12#13#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#13#12#12#13#12#12#13#12#12#12#12#12#12#12#12#12#12#14#14#15#14#14
+ +#14#16#22#23#23#23#23#20#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#12#14#16#17#19
+ +#21#23#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#243#243#26#0#0#0#0#0#26#243#233#0#0#0#208#243#147#0#0#0#0#0#0#0#0#0
+ +#0#0#7#243#152#0#0#0#0#0#26#243#243#0#0#0#0#0#17#243#243#17#0#0#14#243#243
+ +#150#0#0#0#0#0#0#0#0#25#243#243#17#0#0#0#26#243#243#14#0#0#0#0#0#0#211#243
+ +#145#0#0#0#7#243#152#0#0#11#243#243#23#0#0#0#0#0#0#0#0#0#0#23#243#243#17#0#0
+ +#0#0#0#0#0#0#0#0#7#243#7#0#0#0#0#0#0#0#0#0#0#11#243#243#26#0#0#0#0#0#0#0#0#7
+ +#243#152#0#0#0#0#0#0#0#0#0#0#0#11#240#243#17#151#243#23#0#0#0#0#145#243#211#0
+ +#0#0#0#16#22#23#23#23#16#14#146#243#243#14#14#14#13#14#13#14#13#146#243#145
+ +#147#243#19#14#13#13#240#243#17#243#210#13#14#13#14#147#243#233#13#13#13#13
+ +#13#13#21#243#243#23#14#13#210#243#151#13#13#13#13#13#13#145#243#243#15#13#13
+ +#232#243#150#13#13#13#13#13#13#151#243#243#13#13#13#13#12#13#13#13#13#12#13
+ +#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#13#12#12#12#13#14#14#14
+ +#14#15#14#15#21#23#23#23#23#21#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#11#12#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#243#243#26#0#0#0#0#0#7#243#150#0#0#0#243#243#23#0#0#0#0#0#0#0#0#0#0#0#7
+ +#243#152#0#0#0#0#0#26#243#243#0#0#0#0#0#17#243#243#17#0#0#145#243#243#14#0#0
+ +#0#0#0#0#0#0#0#208#243#150#0#0#0#26#243#243#0#0#0#0#0#0#0#147#243#7#0#0#0#7
+ +#243#152#0#0#17#243#243#14#0#0#0#0#0#0#0#0#0#0#145#243#211#0#0#0#0#0#0#0#0#0
+ +#0#0#7#243#152#0#0#0#0#0#0#0#0#0#14#150#243#243#15#0#0#0#0#0#0#0#0#7#243#152
+ +#0#0#0#0#0#0#0#0#0#0#0#23#243#233#0#23#243#208#0#0#0#0#7#243#147#0#0#0#11#21
+ +#23#23#23#22#14#14#146#243#243#14#13#14#13#14#13#14#13#210#243#23#23#243#147
+ +#13#14#19#243#151#14#232#243#16#14#13#13#207#243#150#13#13#13#14#13#13#13#240
+ +#243#147#13#13#243#243#25#13#13#13#13#13#13#19#243#243#23#13#15#243#243#24#13
+ +#13#13#13#13#13#145#243#243#13#13#12#13#13#13#12#13#13#13#13#12#13#13#13#13
+ +#12#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#12#13#12#13#12#12#12#12#12#12#13#14#15#14#14#14#15#21#23
+ +#23#23#23#22#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#243#243#26#0#0
+ +#0#0#14#243#243#23#0#0#17#243#243#25#17#17#19#17#17#19#17#17#14#0#0#7#243#152
+ +#0#0#0#0#0#26#243#243#0#0#0#0#0#17#243#243#17#0#0#208#243#150#0#0#0#0#0#0#0#0
+ +#0#0#25#243#243#11#0#0#26#243#243#0#0#0#0#0#0#0#26#243#233#0#0#0#7#243#152#0
+ +#0#26#243#243#17#19#17#17#19#17#17#19#17#11#0#7#243#7#0#0#0#0#0#0#0#0#0#0#0#7
+ +#243#152#0#0#0#0#0#0#0#17#247#243#243#243#26#0#0#0#0#0#0#0#0#0#7#243#152#0#0
+ +#0#0#0#0#0#0#0#0#0#208#243#145#0#0#233#243#15#0#0#0#243#243#147#17#19#17#23
+ +#145#144#144#145#22#14#14#146#243#243#14#13#14#13#14#13#14#17#243#243#15#14
+ +#240#232#13#13#147#243#248#13#150#243#248#13#14#13#243#243#145#14#13#13#13#13
+ +#14#13#207#243#207#13#21#243#243#21#13#13#13#13#13#13#13#243#243#145#13#21
+ +#243#243#21#13#13#13#13#13#13#145#243#243#13#13#13#13#12#13#13#13#12#13#13#13
+ +#13#12#13#13#13#12#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13
+ +#12#13#12#13#12#13#12#12#12#13#12#12#12#12#13#12#12#12#12#12#12#14#14#15#14
+ +#15#22#23#23#23#23#21#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#243#243#26#0#0#0#11#151#243#211#11#0#0#19#243#243#243#243#243#243#243#243
+ +#243#243#243#26#0#0#7#243#152#0#0#0#0#0#26#243#243#0#0#0#0#0#17#243#243#17#0
+ +#11#243#243#25#0#0#0#0#0#0#0#0#0#0#15#243#243#17#0#0#26#243#243#0#0#0#0#0#0#0
+ +#26#243#243#0#0#0#7#243#152#0#0#26#243#243#243#243#243#243#243#243#243#243
+ +#243#17#0#150#243#7#0#0#0#0#0#0#0#0#0#0#0#7#243#152#0#0#0#0#0#0#147#243#243
+ +#243#152#17#0#0#0#0#0#0#0#0#0#0#7#243#152#0#0#0#0#0#0#0#0#0#0#14#243#243#15#0
+ +#0#147#243#147#0#0#0#243#243#243#243#243#243#243#243#243#243#243#207#15#14
+ +#146#243#243#14#13#14#13#14#13#14#26#243#210#14#13#151#243#20#13#232#243#17
+ +#13#23#243#210#14#13#13#243#243#145#13#13#13#13#13#13#13#207#243#207#13#21
+ +#243#243#21#13#13#13#13#13#13#13#243#243#145#13#21#243#243#21#13#13#13#13#13
+ +#13#145#243#243#13#13#12#13#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12#13
+ +#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#13#12#12#12
+ +#12#12#12#13#12#12#12#12#12#12#12#12#12#14#14#14#14#14#22#23#23#23#22#12#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#243#243#7#26#26#146#211#243
+ +#233#16#0#0#0#0#243#243#147#26#26#26#26#26#26#243#243#26#0#0#7#243#152#0#0#0
+ +#0#0#26#243#243#0#0#0#0#0#17#243#243#17#0#19#243#243#17#0#0#0#0#0#0#0#0#0#0#0
+ +#243#243#25#0#0#26#243#243#0#0#0#0#0#0#0#147#243#208#0#0#0#7#243#152#0#0#17
+ +#243#243#26#26#26#26#26#26#147#243#243#17#0#248#243#233#0#0#0#0#0#0#0#0#0#0#0
+ +#7#243#152#0#0#0#0#0#145#243#243#150#16#0#0#0#0#0#0#0#0#0#0#0#0#7#243#152#0#0
+ +#0#0#0#0#0#0#0#0#145#243#211#0#0#0#20#243#233#11#0#0#7#243#152#26#26#146#150
+ +#150#151#232#243#207#14#14#146#243#243#15#14#13#14#13#14#13#151#243#145#14#13
+ +#25#243#147#19#243#210#13#14#15#243#243#17#13#14#207#243#150#13#14#13#14#13
+ +#13#14#233#243#150#13#13#243#243#25#13#13#13#13#13#13#19#243#243#25#13#13#243
+ +#243#25#13#13#13#13#13#13#145#243#243#12#13#13#13#12#13#13#13#12#13#13#13#12
+ +#13#13#12#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#12#13#12#12#12#12#12#12#12#13#12#12#12#12#12#12#14#14#15#14#14
+ +#20#23#23#23#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#243#243
+ +#243#243#243#243#243#243#26#0#0#0#0#0#208#243#26#0#0#0#0#0#11#243#243#17#0#0
+ +#7#243#211#0#0#0#0#0#145#243#243#11#0#0#0#0#23#243#243#14#0#17#243#243#17#0#0
+ +#0#0#0#0#0#0#0#0#0#243#243#26#0#0#26#243#243#17#0#0#0#0#0#0#211#243#147#0#0#0
+ +#7#243#152#0#0#11#243#243#17#0#0#0#0#0#20#243#243#0#0#15#243#243#17#0#0#0#0#0
+ +#0#0#0#0#0#7#243#152#0#0#0#0#0#233#243#150#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7#243
+ +#233#7#152#7#152#7#152#145#0#0#0#233#243#26#0#0#0#0#233#243#23#0#0#145#243#7
+ +#0#0#21#23#23#23#232#243#146#14#15#145#243#243#25#14#13#14#13#14#15#243#243
+ +#21#14#13#15#243#210#144#243#145#14#13#13#207#243#248#13#13#147#243#240#13#13
+ +#13#13#13#13#21#243#243#25#13#13#210#243#151#13#13#13#13#13#13#145#243#243#17
+ +#13#13#210#243#151#13#13#13#13#13#13#150#243#243#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#13#13#12#13#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#12#12#12#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#13
+ +#14#14#15#14#17#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#243#243#147#17#19#17#25#211#243#208#11#0#0#0#23#243#233#11#0#0#0#0#25
+ +#243#233#0#0#0#7#243#243#25#0#0#0#0#211#243#243#26#0#0#0#0#7#243#211#0#0#17
+ +#243#243#17#0#0#0#0#0#0#0#0#0#0#0#243#243#26#0#0#26#243#243#208#0#0#0#0#0#25
+ +#243#243#17#0#0#0#7#243#152#0#0#0#147#243#7#0#0#0#0#0#150#243#150#0#0#0#7#243
+ +#211#11#0#0#0#0#0#0#0#0#0#7#243#152#0#0#0#0#0#233#243#26#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#7#243#243#243#243#243#243#243#243#7#0#0#20#243#243#14#0#0#0#0#147
+ +#243#208#0#0#14#243#243#17#14#23#23#23#26#243#243#20#14#14#146#243#243#240#17
+ +#14#13#14#13#23#243#243#14#13#14#13#151#243#151#243#19#14#13#14#26#243#210#14
+ +#13#17#243#243#145#13#13#13#14#13#207#243#240#13#13#13#25#243#243#21#13#13#13
+ +#13#15#240#243#151#13#13#13#25#243#243#21#13#13#13#13#19#243#243#243#13#13#13
+ +#13#12#13#13#13#12#13#13#13#12#13#13#12#13#12#13#12#13#12#13#13#12#13#12#13
+ +#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12#13#12#13#12
+ +#12#12#12#12#12#12#15#14#14#15#15#23#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#243#243#248#0#0#0#0#11#208#243#7#0#0#0#0#150#243#208
+ +#17#0#0#25#243#243#24#0#0#0#7#243#233#233#25#11#14#147#243#243#147#243#26#11
+ +#11#248#243#243#26#0#0#0#243#243#25#0#0#0#0#0#0#0#0#0#0#14#243#243#17#0#0#26
+ +#243#243#211#208#17#0#14#26#243#243#150#0#0#0#0#7#243#152#0#0#0#11#232#243
+ +#150#14#0#11#247#243#243#15#0#0#0#14#233#243#211#23#11#0#14#22#15#0#15#19#208
+ +#243#208#17#19#17#11#0#146#243#233#20#0#14#22#23#0#0#0#0#0#0#0#0#0#7#243#152
+ +#0#0#0#0#0#0#0#0#0#150#243#208#0#0#0#0#0#15#243#243#14#0#0#25#243#233#145#23
+ +#23#144#241#243#152#14#15#14#146#243#210#240#240#147#145#14#13#150#243#151#14
+ ,#13#13#14#25#243#243#232#13#13#13#13#19#243#243#17#13#13#25#243#243#147#17#13
+ +#19#207#243#243#23#13#13#13#13#150#243#240#26#15#13#23#232#243#240#17#13#13
+ +#13#13#207#243#240#25#14#15#24#240#243#243#243#13#13#12#13#13#13#12#13#13#13
+ +#12#13#13#13#12#13#12#13#13#12#13#13#12#13#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#13#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14
+ +#14#15#14#14#22#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#243#243#26#0#0#0#0#0#16#243#243#15#0#0#0#0#147#243#243#243#243#243#243#145
+ +#0#0#0#0#7#243#26#147#243#243#243#243#243#147#0#26#243#243#243#243#243#7#0#0
+ +#0#0#211#243#147#0#0#0#0#0#0#0#0#0#0#23#243#243#13#0#0#26#243#243#15#232#243
+ +#243#243#243#243#7#11#0#0#0#0#7#243#152#0#0#0#0#11#208#243#243#243#243#243
+ +#233#23#0#0#0#0#0#14#152#243#243#243#243#243#243#25#0#7#243#243#243#243#243
+ +#243#243#17#0#11#7#243#243#243#243#243#208#0#0#0#0#0#0#0#0#0#7#243#152#0#0#0
+ +#0#0#0#0#0#14#243#243#24#0#0#0#0#0#0#211#243#145#0#0#0#23#243#243#243#243#243
+ +#243#207#16#14#14#14#145#243#147#23#243#243#243#14#13#240#243#144#14#13#14#13
+ +#15#243#243#147#13#14#13#14#13#232#243#248#14#13#13#25#240#243#243#243#243
+ +#243#240#23#13#13#13#13#13#13#147#243#243#243#243#243#243#210#19#13#13#13#13
+ +#13#15#207#243#243#243#243#243#210#147#243#243#12#13#13#13#12#13#13#13#12#13
+ +#13#13#12#13#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#12#13#12#13#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#14
+ +#14#14#14#15#20#23#23#23#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#243#243#26#0#0#0#0#0#0#243#243#26#0#0#0#0#0#15#146#152#152#145#15#0#0#0#0
+ +#0#23#26#14#0#17#146#152#147#17#0#0#0#15#146#152#147#23#0#0#0#0#0#145#243#233
+ +#11#0#0#0#0#0#0#0#0#0#150#243#211#0#0#0#26#243#243#0#11#23#147#7#145#17#0#0#0
+ +#0#0#0#23#26#23#0#0#0#0#0#0#20#247#152#152#25#13#0#0#0#0#0#0#0#0#15#248#147#7
+ +#147#25#15#0#23#26#211#243#211#26#26#248#14#0#0#0#17#146#152#150#25#13#0#0#0
+ +#0#0#0#0#0#0#7#243#152#0#0#0#0#0#0#0#0#15#248#26#14#0#0#0#0#0#0#20#248#25#0#0
+ +#0#0#22#149#210#210#207#24#14#15#14#14#14#22#145#21#14#17#150#207#14#17#145
+ +#145#17#14#13#13#13#13#25#145#17#13#14#13#13#14#25#145#23#13#13#13#13#15#25
+ +#147#207#147#25#15#13#13#13#13#13#13#13#13#17#26#150#207#145#23#13#13#13#13
+ +#13#13#13#13#13#21#147#207#150#24#13#145#243#243#13#13#12#13#13#13#12#13#13
+ +#13#12#13#13#12#13#13#12#13#12#13#12#13#13#12#13#12#13#12#13#12#13#12#13#12
+ +#13#12#13#12#13#12#12#12#12#12#13#12#12#13#12#13#12#12#12#12#12#12#12#12#12
+ +#13#14#15#14#14#17#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#243#243#26#0#0#0#0#0#11#243#243#26#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#243#243#26#0#0#0#0#0#0#0#0#17#243
+ +#243#26#0#0#0#26#243#243#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7#243#7#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#7#243#152#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12
+ +#23#23#23#23#20#14#14#14#15#14#14#13#14#14#13#14#13#14#13#14#13#14#13#14#13
+ +#14#13#14#13#13#14#13#13#14#13#13#13#13#14#13#14#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#145#243#243#12#13#13#13#207#21#13#145#24#13#210#25#12#207#21#13
+ +#12#13#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12
+ +#12#12#12#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#14#14#15#14#16#22
+ +#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#243#243#26#0#0
+ +#0#0#0#23#243#243#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#26#243#243#17#0#0#0#0#0#0#11#232#243#211#11#0#0#0#26
+ +#243#243#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#7#243#152#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#7#243#152#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#19#23#23#23#23
+ +#15#14#15#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#13#14#13#14#13#14#13#13#13#14#14#14#14#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#145#243#243#13#13#12#13#207#21#13#145#145#16#207#151#13#207#21#13#12#13#12
+ +#13#13#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#13#12#13#12#13#12
+ +#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#14#14#23#23#23#23
+ +#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#243#243#26#0#0#0#0#23
+ +#233#243#208#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#147#243#243#26#11#0#0#0#20#240#243#233#16#0#0#0#0#26#243
+ +#243#0#0#0#0#0#0#0#0#0#0#0#0#0#145#243#145#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#7#243#152#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#23#23#23#23#22
+ +#15#14#14#14#15#14#14#14#13#14#13#14#13#14#13#14#13#14#13#13#14#13#13#14#13
+ +#13#14#13#13#14#13#14#13#13#13#13#13#14#14#14#15#14#14#15#14#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#145#243#243#12#13#13#13#207#21#13#26#145#26#26#151#16#207#16#13#13#12#13#12
+ +#13#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#15#14#14#20#23#23#23#20#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#243#243#243#7#152#7#243#243
+ +#243#208#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#26#243#243#243#7#152#233#243#243#208#16#0#0#0#0#0#26#243
+ +#243#0#0#0#0#0#0#0#0#0#0#0#0#0#243#243#243#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#7#243#243#243#243#243#243#243#243#243#17#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11#21
+ +#23#23#23#23#21#15#14#14#14#14#14#14#14#13#14#13#14#13#14#13#14#13#14#13#13
+ +#14#13#13#14#13#13#14#13#13#13#13#14#13#14#13#14#14#14#14#14#14#15#14#14#14
+ +#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#145#243#243#13#12#13#13#207#21#13#21#145#210#16#25#26#243#13#12
+ +#13#13#12#13#12#13#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12#12#13
+ +#12#13#12#12#12#12#13#12#13#12#12#12#12#12#12#12#12#12#12#13#14#14#15#14#17
+ +#23#23#23#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#147#7#208#243
+ +#243#243#208#150#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#145#152#233#243#211#150#23#0#0#0#0#0#0#0
+ +#26#243#243#0#0#0#0#0#0#0#0#0#0#0#0#0#26#243#26#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#145#7#152#7#152#7#152#7#152#7#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#12#21
+ +#23#23#23#23#21#15#14#15#14#14#15#14#13#14#13#14#13#14#13#14#13#14#13#14#13
+ +#13#14#13#13#14#13#13#14#13#14#13#13#13#14#14#14#15#14#15#14#14#14#15#14#14
+ +#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#145#243#243#12#13#13#13#207#21#13#21#150#210#12#15#7#243#13#12#13
+ +#12#13#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#13#12#13#12#13#12#12#12
+ +#12#13#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#15#14#14#15#15#23
+ +#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#23#152#7#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#12#21#23#23#23#23#21#15#14#14#15#14#14#14#14#13#14
+ +#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13#14#13#14#13#13#14#14#15#14#14
+ +#14#15#14#14#15#14#14#14#15#14#14#14#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#24#207#207#13#13#24#145#232#150#145#23
+ +#232#24#13#12#150#233#13#13#12#13#12#13#13#12#12#12#13#12#12#12#12#12#12#12
+ +#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#14#14#15#14#14#22#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#13#23#23#23#23#23#21
+ +#15#14#14#14#15#14#14#14#13#14#13#14#13#14#13#13#14#13#13#14#13#13#14#13#13
+ +#13#13#14#14#14#14#14#15#14#14#14#16#19#15#14#15#14#14#14#15#14#14#15#14#14
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#19#21#21#21#21#14#21#15#12#13#16#19#13#12#13#13#12#13#12#13#13#12#13#12
+ +#13#12#13#12#13#12#13#12#13#12#12#13#12#13#12#13#12#13#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#14#14#14#14#15#20#23#23#23#20#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14
+ +#23#23#23#23#23#21#15#14#14#14#14#14#14#14#13#14#13#14#13#14#13#13#14#13#13
+ +#14#13#13#14#13#14#14#14#14#15#14#14#14#15#14#19#23#23#23#20#15#14#15#14#14
+ +#14#15#14#14#14#14#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13
+ +#12#13#13#12#13#13#12#13#13#12#13#13#13#13#13#12#13#12#13#13#12#13#13#12#13
+ +#12#12#13#12#13#12#13#13#13#12#13#12#13#12#13#12#12#12#12#12#12#12#12#12#13
+ +#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#13#14#15#14#14#17#23#23#23#23
+ +#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#15#14#14#14#14#14#13#14#13#13#13
+ +#14#13#13#14#13#13#14#13#13#14#14#14#14#15#14#14#15#14#16#22#23#23#23#23#23
+ +#23#19#15#15#14#14#14#14#15#14#14#14#14#13#13#13#13#13#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#13#13#13#12#13#13#12#13#13#12#13#12#13
+ +#12#13#12#13#12#13#12#12#13#14#14#14#14#14#13#12#13#12#13#12#13#12#12#13#12
+ +#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#15#14
+ +#16#22#23#23#23#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14#14#15#14#14#14
+ +#14#13#14#13#14#13#14#13#13#14#13#13#14#14#14#14#15#14#14#14#15#14#20#23#23
+ ,#23#23#23#23#23#23#23#23#21#17#14#15#14#14#15#14#15#14#13#13#13#13#13#13#13
+ +#13#13#13#13#13#13#13#13#13#12#13#13#12#13#13#13#12#13#13#13#13#12#13#13#12
+ +#13#12#13#13#12#13#12#13#13#13#14#14#14#14#14#14#14#15#14#14#13#12#12#12#13
+ +#12#13#12#12#12#13#12#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#14#14#14#14#14#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23#23#23#21#15#14
+ +#14#14#15#14#14#14#14#13#13#13#13#14#13#13#14#14#14#14#15#14#14#14#15#14#17
+ +#22#23#23#23#23#23#23#23#23#23#23#23#23#23#22#19#15#14#14#14#14#14#13#13#13
+ +#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13
+ +#13#13#13#12#13#13#12#13#14#13#14#14#14#14#14#14#15#14#15#14#14#14#15#14#14
+ +#13#13#12#12#13#12#12#13#12#12#12#12#13#12#12#12#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#14#14#15#14#14#20#23#23#23#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#14#23#23#23
+ +#23#23#22#16#14#14#14#15#14#14#14#14#13#14#13#13#14#13#14#14#14#14#14#14#15
+ +#14#15#21#23#23#23#23#23#23#22#15#19#23#23#23#23#23#23#23#23#23#19#15#14#15
+ +#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#13#12#13#13
+ +#13#13#12#13#13#12#13#13#13#14#14#15#14#14#14#15#14#15#14#14#14#14#14#15#14
+ +#14#14#14#15#14#13#13#12#12#12#12#12#12#12#13#12#12#13#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#13#14#14#15#14#17#23#23#23#23#11#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#14#23#23#23#23#23#22#16#15#14#14#14#15#14#14#14#13#14#13#14#14#14#15#14
+ +#15#14#14#14#19#23#23#23#23#23#23#23#17#11#0#0#12#19#23#23#23#23#23#23#23#21
+ +#14#14#14#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#13#12#13#13#13#13#12#13#13#12#13#14#14#14#14#14#15#14#14#14#14#15#14#15#14
+ +#14#14#15#14#15#14#14#14#14#13#13#12#13#12#12#13#12#12#12#12#12#12#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#15#14#14#15#15#23#23#23#23#13#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#14#22#23#23#23#23#23#17#14#15#14#14#14#14#14#14#13#14#14#15#14
+ +#14#14#14#15#16#22#22#23#23#23#23#23#21#12#0#0#0#0#0#0#11#16#22#23#23#23#23
+ +#23#14#15#14#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13#12
+ +#13#13#13#13#12#13#13#13#13#13#12#13#14#15#14#15#14#14#14#15#14#14#14#14#15
+ +#16#19#21#23#17#14#14#15#14#15#14#13#12#12#12#12#12#12#12#13#12#13#12#12#12
+ ,#12#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#15#14#14#22#23#23#23#16#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#12#21#23#23#23#23#23#20#14#14#15#14#14#15#14#14#15#14#14
+ +#14#15#14#15#19#23#23#23#23#23#23#23#16#0#0#0#0#0#0#0#0#0#0#11#15#23#23#23#23
+ +#15#14#15#14#14#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#13#12#13#13#13
+ +#12#13#13#13#13#12#13#13#12#13#14#14#14#14#14#14#15#14#14#16#19#20#21#23#23
+ +#23#23#23#23#17#14#14#14#14#14#14#14#12#13#12#12#13#12#12#12#12#13#12#12#12
+ +#12#12#12#12#12#12#12#12#12#12#12#12#12#14#14#14#14#15#20#23#23#23#20#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#11'Transparent'#8#0#0#6'TLabel'#6'Label1'#4
+ +'Left'#2#8#6'Height'#2#17#3'Top'#3#254#0#5'Width'#3#207#1#7'Caption'#6'?Copy'
+ +'right RemObjects Software, 2002-2008. All rights reserved.'#10#10'Font.Colo'
+ +'r'#7#7'clWhite'#11'Font.Height'#2#247#9'Font.Name'#6#6'Tahoma'#11'ParentCol'
+ +'or'#8#7'OnClick'#7#12'OnCloseClick'#0#0#6'TLabel'#11'lbl_Version'#6'Height'
+ +#2#16#3'Top'#2#31#5'Width'#3#244#1#9'Alignment'#7#8'taCenter'#8'AutoSize'#8#7
+ +'Caption'#6#2'[]'#10'Font.Color'#7#7'clWhite'#11'Font.Height'#2#243#9'Font.N'
+ +'ame'#6#6'Tahoma'#11'ParentColor'#8#0#0#6'TLabel'#6'Label7'#4'Left'#2#8#6'He'
+ +'ight'#2#17#3'Top'#3#24#1#5'Width'#3#138#0#7'Caption'#6#20'Visit our website'
+ +' at'#10'Font.Color'#7#7'clWhite'#11'Font.Height'#2#247#9'Font.Name'#6#6'Tah'
+ +'oma'#11'ParentColor'#8#0#0#6'TLabel'#6'Label3'#6'Cursor'#7#11'crHandPoint'#4
+ +'Left'#3#152#0#6'Height'#2#17#3'Top'#3#24#1#5'Width'#3#198#0#7'Caption'#6#25
+ +'http://www.remobjects.com'#10'Font.Color'#7#7'clWhite'#11'Font.Height'#2#245
+ +#9'Font.Name'#6#6'Tahoma'#10'Font.Style'#11#11'fsUnderline'#0#11'ParentColor'
+ +#8#7'OnClick'#7#11'Label3Click'#0#0#7'TButton'#10'btn_Cancel'#4'Left'#3#162#1
+ +#6'Height'#2#25#3'Top'#3#16#1#5'Width'#2'M'#6'Cancel'#9#7'Caption'#6#10'btn_'
+ +'Cancel'#7'Default'#9#10'Font.Color'#7#7'clWhite'#11'Font.Height'#2#245#9'Fo'
+ +'nt.Name'#6#6'Tahoma'#7'OnClick'#7#12'OnCloseClick'#8'TabOrder'#2#0#0#0#0
+]);
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.pas
new file mode 100644
index 0000000..098cd55
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWAbout.pas
@@ -0,0 +1,147 @@
+unit uEWAbout;
+
+{$I Everwood.inc}
+interface
+
+uses
+ {$IFDEF FPC}LCLIntf, LResources,{$ENDIF}
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF}
+ SysUtils, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, ExtCtrls;
+
+type
+
+ { TAboutForm }
+
+ TAboutForm = class(TForm)
+ Image1: TImage;
+ Label1: TLabel;
+ Label3: TLabel;
+ btn_Cancel: TButton;
+ lbl_Version: TLabel;
+ Label7: TLabel;
+ procedure FormCreate(Sender: TObject);
+ procedure OnCloseClick(Sender: TObject);
+ procedure Label3Click(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+function VersionBuildNo(iInstance:THandle):integer;
+
+var
+ AboutForm: TAboutForm;
+ sVersionName : string = '';
+
+implementation
+
+
+{$IFDEF FPC}
+uses uEWTools;
+{$ELSE}
+uses ShellAPI;
+{$ENDIF}
+
+{$IFNDEF FPC}
+ {$R *.dfm}
+{$ENDIF}
+
+{$IFNDEF FPC}
+type TVersion = record
+ Major,Minor,Release,Build:word;
+ end;
+
+function GetFileVersion(iFileName:string):TVersion;
+var whocares:dword;
+ Size:dword;
+ Data:pointer;
+ FixedData:pVSFixedFileInfo;
+begin
+ {$IFDEF FPC}
+ Data := nil;
+ FixedData := nil;
+ whocares := 0;
+ {$ENDIF}
+ Size := GetFileVersionInfoSize(pChar(iFileName), whocares);
+ if Size > 0 then begin
+ GetMem(Data,Size);
+ try
+ if GetFileVersionInfo(pChar(iFileName),0,Size,Data) then begin
+ Size := sizeof(TVSFixedFileInfo);
+ if VerQueryValue(Data,'\',pointer(FixedData),Size) then begin
+ result.Major := HiWord(FixedData^.dwFileVersionMS);
+ result.Minor := LoWord(FixedData^.dwFileVersionMS);
+ result.Release := HiWord(FixedData^.dwFileVersionLS);
+ result.Build := LoWord(FixedData^.dwFileVersionLS);
+ end;
+ end;
+ finally
+ FreeMem(Data);
+ end;
+ end;
+end;
+
+function GetModuleName(iInstance:THandle):string;
+var Buffer: array[0..MAX_PATH] of Char;
+begin
+ SetString(result, Buffer, GetModuleFileName(iInstance, Buffer, MAX_PATH));
+end;
+
+function VersionStringLong:string;
+var Version:TVersion;
+begin
+ Version := GetFileVersion(GetModuleName(hInstance));
+ result := IntToStr(Version.Major)+'.'+IntToStr(Version.Minor)+'.'+
+ IntToStr(Version.Release)+'.'+IntToStr(Version.Build){+'.'+
+ FormatDateTime('yymmdd', CompileTime);}
+end;
+
+function VersionBuildNo(iInstance:THandle):integer;
+var Version:TVersion;
+begin
+ Version := GetFileVersion(GetModuleName(iInstance));
+ result := Version.Build;
+end;
+
+{$ELSE}
+function VersionBuildNo(iInstance:THandle):integer;
+begin
+ Result := 0;
+end;
+{$ENDIF}
+
+procedure TAboutForm.OnCloseClick(Sender: TObject);
+begin
+ Close();
+end;
+
+procedure TAboutForm.FormCreate(Sender: TObject);
+begin
+ {$IFDEF FPC}
+ // hide lbl_version: we can't correctly detect version!
+ lbl_Version.Visible:= False;
+ {$ELSE}
+ lbl_Version.Caption := 'Version '+VersionStringLong();
+ if sVersionName <> '' then
+ lbl_Version.Caption := sVersionName+' - '+lbl_Version.Caption;
+ {$ENDIF}
+ btn_Cancel.Left := Width + 10;
+end;
+
+procedure TAboutForm.Label3Click(Sender: TObject);
+begin
+ {$IFDEF FPC}
+ RO_ShellExecute
+ {$ELSE}
+ ShellExecute
+ {$ENDIF}
+ (Handle,'open','http://www.remobjects.com',nil,nil,SW_SHOWNORMAL);
+end;
+
+{$IFDEF FPC}
+initialization
+ {$i uEWAbout.lrs}
+{$ENDIF FPC}
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWHelpers.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWHelpers.pas
new file mode 100644
index 0000000..83a9d2a
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWHelpers.pas
@@ -0,0 +1,108 @@
+unit uEWHelpers;
+
+{$I Everwood.inc}
+
+interface
+
+{$IFDEF DELPHI5}
+uses
+ FileCtrl;
+
+type
+ THandle = Integer;
+{$ENDIF}
+
+function SelectDirectory(const AppHandle: THandle; const Caption: string;
+ const Root: WideString; var Directory: string): Boolean;
+
+implementation
+
+{$IFDEF FPC}
+uses Dialogs;
+{$ELSE}
+uses {$IFDEF MSWINDOWS}Windows, ActiveX, ShlObj, {$ENDIF} SysUtils, Forms;
+{$ENDIF}
+
+{$IFDEF FPC}
+function SelectDirectory(const AppHandle: THandle; const Caption: string;
+ const Root: WideString; var Directory: string): Boolean;
+var
+ str: Ansistring;
+begin
+ // now only Ansi version
+ str := Directory;
+ Result := Dialogs.SelectDirectory(Caption, Root, str);
+ if Result then Directory := str;
+end;
+{$ELSE}
+function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
+begin
+ if (uMsg = BFFM_INITIALIZED) and (lpData <> 0) then
+ SendMessage(Wnd, BFFM_SETSELECTION, Integer(True), lpdata);
+ result := 0;
+end;
+
+function SelectDirectory(const AppHandle: THandle; const Caption: string;
+ const Root: WideString; var Directory: string): Boolean;
+var
+ WindowList: Pointer;
+ BrowseInfo: TBrowseInfo;
+ Buffer: PChar;
+ OldErrorMode: Cardinal;
+ RootItemIDList, ItemIDList: PItemIDList;
+ ShellMalloc: IMalloc;
+ IDesktopFolder: IShellFolder;
+ Eaten, Flags: LongWord;
+begin
+ Result := False;
+ if not DirectoryExists(Directory) then
+ Directory := '';
+ FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
+ if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
+ begin
+ Buffer := ShellMalloc.Alloc(MAX_PATH);
+ try
+ RootItemIDList := nil;
+ if Root <> '' then
+ begin
+ SHGetDesktopFolder(IDesktopFolder);
+ IDesktopFolder.ParseDisplayName(AppHandle, nil,
+ POleStr(Root), Eaten, RootItemIDList, Flags);
+ end;
+ with BrowseInfo do
+ begin
+ hwndOwner := AppHandle;
+ pidlRoot := RootItemIDList;
+ pszDisplayName := Buffer;
+ lpszTitle := PChar(Caption);
+ ulFlags := BIF_RETURNONLYFSDIRS or
+ {$IFDEF DELPHI7UP} BIF_NEWDIALOGSTYLE {$ELSE} $0040 {$ENDIF};
+ if Directory <> '' then
+ begin
+ lpfn := SelectDirCB;
+ lParam := Integer(PChar(Directory));
+ end;
+ end;
+ WindowList := DisableTaskWindows(0);
+ OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
+ try
+ ItemIDList := ShBrowseForFolder(BrowseInfo);
+ finally
+ SetErrorMode(OldErrorMode);
+ EnableTaskWindows(WindowList);
+ end;
+ Result := ItemIDList <> nil;
+ if Result then
+ begin
+ ShGetPathFromIDList(ItemIDList, Buffer);
+ ShellMalloc.Free(ItemIDList);
+ Directory := Buffer;
+ end;
+ finally
+ ShellMalloc.Free(Buffer);
+ end;
+ end;
+end;
+{$ENDIF}
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWMenuManager.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWMenuManager.pas
new file mode 100644
index 0000000..a485aea
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWMenuManager.pas
@@ -0,0 +1,346 @@
+unit uEWMenuManager;
+
+{$INCLUDE eDefines.inc}
+
+interface
+
+uses
+ Classes, Menus, ToolsAPI, ExtCtrls, Controls;
+
+const
+ sPersonalityDelphiWin32 = 'Delphi.Personality';
+ sPersonalityDelphiDotNet = 'DelphiDotNet.Personality';
+ sPersonalityCSharpDotNet = 'CSharp.Personality';
+ sPersonalityCppBuilderWin32 = 'CPlusPlusBuilder.Personality';
+ sPersonalityVisualBasicDotNet = 'VB.Personality';
+
+type
+ TEWPersonality = (pAny, pNone, pUnknown, pDelphiWin32, pDelphiDotNet, pCSharpDotNet, pCppBuilderWin32, pVisualBasicDotNet);
+ TEWPersonalitySet = set of TEWPersonality;
+
+ TMenuItemEx = class;
+
+ TEWMenuItem = class
+ private
+ fMenuItem: TMenuItemEx;
+ fPersonality: TEWPersonalitySet;
+ fVisible: boolean;
+ public
+ constructor Create(aMenuItem: TMenuItemEx);
+ procedure SetGlyph(aImageList: TImageList; aIndex: integer);
+ property MenuItem: TMenuItemEx read fMenuItem;
+ property Personality: TEWPersonalitySet read fPersonality write fPersonality;
+ property Visible: boolean read fVisible write fVisible;
+ end;
+
+ TMenuItemEx = class(TMenuItem)
+ private
+ fInfo: TEWMenuItem;
+ public
+ property Info: TEWMenuItem read fInfo write fInfo;
+ end;
+
+ TEWMenu = class
+ private
+ fName: string;
+ fMenu: TMenuItem;
+ fRefCount: integer;
+ fOnPopup: TNotifyEvent;
+ procedure _OnPopup(aSender: TObject);
+ public
+ constructor Create(const aName: string);
+ destructor Destroy; override;
+
+ function CreateMenuItem(const aCaption: string; aImageIndex: integer; aPersonality: TEWPersonalitySet): TEWMenuItem;
+ function DestroyMenuItem(var aMenu: TEWMenuItem): boolean;
+
+ property Name: string read fName;
+ property Menu: TMenuItem read fMenu;
+
+ property OnPopup: TNotifyEvent read fOnPopup write fOnPopup;
+
+ end;
+
+ TEWMenuManager = class
+ private
+ fMenus: TStringList;
+ fEWMenu: TMenuItem;
+ procedure OnABoutclick(Sender: TObject);
+ public
+ constructor Create;
+ Destructor Destroy; override;
+ procedure Initialize;
+
+ function CreateMenu(const aName: string): TEWMenu;
+ function DestroyMenu(var aMenu: TEWMenu): boolean;
+ end;
+
+var
+ MenuManager: TEWMenuManager;
+
+implementation
+
+uses
+ {$IFDEF DELPHI5}DsgnIntf, Windows,{$ENDIF}
+ {$IFDEF DELPHI6UP}DesignEditors, DesignIntf, ExtActns,{$ENDIF}
+ Forms, SysUtils, Dialogs, uEWAbout, Graphics, uEWOTAHelpers;
+
+{ TEWMenuManager }
+
+{ TODO: use
+
+ procedure MenuBeginUpdate;
+ procedure MenuEndUpdate;
+}
+
+constructor TEWMenuManager.Create;
+begin
+ {fTimer := TTimer.Create(nil);
+ fTimer.OnTimer := TimerInitialize;
+ fTimer.Interval := 60000;
+ fTimer.Enabled := true;
+ ShowMessage('Create!');}
+end;
+
+procedure TEWMenuManager.Initialize;
+var
+ lMainMenu: TMainMenu;
+ lHelpMenu: TMenuItem;
+ lServices: INTAServices;
+ i: integer;
+begin
+ if Assigned(fMenus) then exit;
+
+ fMenus := TStringList.Create();
+
+ //try
+
+ if not Assigned(BorlandIDEServices) then
+ raise Exception.Create('Cannot access BorlandIDEServices.');
+
+ //{$IFDEF BDS}
+ //lServices := BorlandIDEServices.GetService(INTAServices) as INTAServices;
+ //{$ELSE}
+ lServices := (BorlandIDEServices as INTAServices);
+ //{$ENDIF}
+
+ if not Assigned(lServices) then
+ raise Exception.Create('Cannot access INTAServices.');
+
+ lMainMenu := lServices.MainMenu;
+
+ for i := 0 to lMainMenu.Items.Count-1 do begin
+
+ if lMainMenu.Items[i].Name = 'HelpMenu' then begin
+ lHelpMenu := lMainMenu.Items[i];
+
+ fEWMenu := TMenuItem.Create(nil);
+ fEWMenu.Caption := 'About RemObjects Everwood™';
+ fEWMenu.OnClick := OnAboutClick;
+
+ lHelpMenu.Insert(lHelpMenu.Count-1, fEWMenu);
+ end;
+ end; { for }
+ {except
+ ShowMessage('Error getting Main Menu');
+ end;}
+
+end;
+
+destructor TEWMenuManager.Destroy;
+var
+ i: Integer;
+begin
+ if Assigned(fMenus) then begin
+ for i := 0 to fMenus.Count-1 do begin
+ fMenus.Objects[i].Free();
+ fMenus.Objects[i] := nil;
+ end; { for }
+ end;
+ FreeAndNil(fMenus);
+ FreeAndNil(fEWMenu);
+end;
+
+function TEWMenuManager.CreateMenu(const aName: string): TEWMenu;
+var
+ lIndex: integer;
+begin
+ Initialize();
+ lIndex := fMenus.IndexOf(aName);
+ if lIndex > -1 then begin
+ result := fMenus.Objects[lIndex] as TEWMenu
+ end
+ else begin
+ result := TEWMenu.Create(aName);
+ fMenus.AddObject(aName, result);
+ end;
+end;
+
+
+function TEWMenuManager.DestroyMenu(var aMenu: TEWMenu): boolean;
+var
+ lIndex: integer;
+begin
+ Initialize();
+ lIndex := fMenus.IndexOfObject(aMenu);
+ if lIndex > -1 then begin
+ dec(aMenu.fRefCount);
+ if aMenu.fRefCount = 0 then begin
+ fMenus.Delete(lIndex);
+ aMenu.Free();
+ result := true;
+ end
+ else begin
+ result := false;
+ end;
+ end
+ else
+ result := false;
+ aMenu := nil;
+end;
+
+{ TEWMenu }
+
+constructor TEWMenu.Create(const aName: string);
+var
+ lMainMenu: TMainMenu;
+begin
+ inherited Create();
+ fName := aName;
+ fRefCount := 1;
+
+ fMenu := TMenuItem.Create(nil);
+ fMenu.Caption := aName;
+ fMenu.OnClick := _OnPopup;
+
+ lMainMenu := (BorlandIDEServices as INTAServices).MainMenu;
+ lMainMenu.Items.Insert(lMainMenu.Items.Count-2, fMenu);
+
+ with CreateMenuItem('NOOPTIONS', -1, [pAny]) do begin
+ MenuItem.Enabled := false;
+ end;
+
+end;
+
+function TEWMenu.CreateMenuItem(const aCaption: string; aImageIndex: integer; aPersonality: TEWPersonalitySet): TEWMenuItem;
+var
+ lMenuItem: TMenuItemEx;
+begin
+ lMenuItem := TMenuItemEx.Create(fMenu);
+ lMenuItem.Caption := aCaption;
+ lMenuItem.ImageIndex := aImageIndex;
+ result := TEWMenuItem.Create(lMenuItem);
+ result.Personality := aPersonality;
+ lMenuItem.Info := result;
+ fMenu.Add(lMenuItem);
+end;
+
+destructor TEWMenu.Destroy;
+begin
+ FreeAndNil(fMenu);
+ inherited;
+end;
+
+function TEWMenu.DestroyMenuItem(var aMenu: TEWMenuItem): boolean;
+begin
+ result := false;
+end;
+
+procedure TEWMenu._OnPopup(aSender: TObject);
+var
+ i: integer;
+ s: string;
+ lPersonality: TEWPersonality;
+ lAnyMenusVisible: boolean;
+begin
+ if assigned(OnPopup) then OnPopup(self);
+
+ //ToDo: optimize 2 calls to CurrentProject
+ if CurrentProject <> nil then begin
+ {$IFDEF DELPHI9UP}
+ s := CurrentProject.Personality;
+
+ if SameText(s, sPersonalityDelphiWin32) then
+ lPersonality := pDelphiWin32
+ else if SameText(s, sPersonalityDelphiDotNet) then
+ lPersonality := pDelphiDotNet
+ else if SameText(s, sPersonalityDelphiDotNet) then
+ lPersonality := pDelphiDotNet
+ else if SameText(s, sPersonalityCSharpDotNet) then
+ lPersonality := pCSharpDotNet
+ else if SameText(s, sPersonalityVisualBasicDotNet) then
+ lPersonality := pVisualBasicDotNet
+ else if SameText(s, sPersonalityCppBuilderWin32) then
+ lPersonality := pCppBuilderWin32
+ else
+ lPersonality := pUnknown;
+
+ s := LanguageFromPersonality(CurrentProject);
+
+ fMenu.Items[0].Caption := Format('',[s]);
+ {$ELSE}
+ lPersonality := pDelphiWin32;
+ fMenu.Items[0].Caption := Format('',[s]);
+ {$ENDIF DELPHI9UP}
+ end
+ else begin
+ lPersonality := pNone;
+ fMenu.Items[0].Caption := '';
+ end;
+
+ lAnyMenusVisible := false;
+ for i := 1 to fMenu.Count-1 do begin
+ if fMenu.Items[i] is TMenuItemEx then begin
+ with (fMenu.Items[i] as TMenuItemEx).Info do begin
+ fMenu.Items[i].Visible := Visible
+ and
+ ((pAny in Personality) or (lPersonality in Personality));
+ if fMenu.Items[i].Visible then lAnyMenusVisible := true;
+
+ end;
+ end;
+ end;
+
+ fMenu.Items[0].Visible := not lAnyMenusVisible;
+
+end;
+
+{ TEWMenuItem }
+
+constructor TEWMenuItem.Create(aMenuItem: TMenuItemEx);
+begin
+ inherited Create();
+ fMenuItem := aMenuItem;
+ fVisible := true;
+end;
+
+procedure TEWMenuManager.OnABoutclick(Sender: TObject);
+begin
+ with TAboutForm.Create(Application) do try
+ Position := poScreenCenter;
+ ShowModal();
+ finally
+ Free();
+ end
+end;
+
+procedure TEWMenuItem.SetGlyph(aImageList: TImageList; aIndex: integer);
+var
+ lBitmap: TBitmap;
+begin
+ lBitmap := TBitmap.Create();
+ try
+ aImageList.GetBitmap(aIndex ,lBitmap);
+ MenuItem.ImageIndex := (BorlandIDEServices as INTAServices).AddMasked(lBitmap, clFuchsia);
+ finally
+ lBitmap.Free();
+ end;
+end;
+
+initialization
+ MenuManager := TEWMenuManager.Create();
+finalization
+ FreeAndNil(MenuManager);
+end.
+
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWMenuManager_laz.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWMenuManager_laz.pas
new file mode 100644
index 0000000..24bf371
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWMenuManager_laz.pas
@@ -0,0 +1,252 @@
+unit uEWMenuManager_laz;
+
+{$I Everwood.inc}
+
+interface
+
+uses
+ MenuIntf, IDECommands,
+ Classes, Menus, ExtCtrls, Controls;
+
+type
+ TEWPersonality = (pAny, pNone, pUnknown, pDelphiWin32, pDelphiDotNet, pCSharpDotNet, pCppBuilderWin32, pVisualBasicDotNet, pLazarusWin, pLazarusUnix);
+ TEWPersonalitySet = set of TEWPersonality;
+ TEWMenu = class;
+
+ TEWMenuItem = class(TIDEMenuCommand)
+ private
+ fPersonality: TEWPersonalitySet;
+ public
+ procedure SetGlyph(aImageList: TImageList; aIndex: integer);
+ property Personality: TEWPersonalitySet read fPersonality write fPersonality;
+ end;
+
+ { TEWMenu }
+
+ TEWMenu = class(TIDEMenuSection)
+ private
+ fOnPopup: TNotifyEvent;
+ fCat : TIDECommandCategory;
+ function GetOnPopup: TNotifyEvent;
+ procedure SetOnPopup(const AValue: TNotifyEvent);
+ procedure _OnPopup(aSender: TObject);
+ public
+ constructor Create(const aName: string);override;
+ function CreateMenuItem(const aCaption: string; aImageIndex: integer; aPersonality: TEWPersonalitySet; AutoAdd: boolean = True): TEWMenuItem; overload;
+ function DestroyMenuItem(var aMenu: TEWMenuItem): boolean;
+ property OnPopup: TNotifyEvent read fOnPopup write fOnPopup;
+ property CommandCategory: TIDECommandCategory read fCat;
+ end;
+
+ TEWMenuManager = class
+ private
+ fMenus: TStringList;
+ procedure OnAboutClick(Sender: TObject);
+ public
+ constructor Create;
+ Destructor Destroy; override;
+ procedure Initialize;
+
+ function CreateMenu(const aName: string): TEWMenu;
+ function DestroyMenu(var aMenu: TEWMenu): boolean;
+ end;
+
+var
+ MenuManager: TEWMenuManager;
+
+procedure Register;
+implementation
+
+uses
+ Forms, SysUtils, Dialogs, uEWAbout, Graphics, uEWOTAHelpers_laz,IDEImagesIntf;
+
+
+procedure Register;
+begin
+ RegisterIDEMenuCommand(mnuHelp,'EverWood','About RemObjects Everwood',MenuManager.OnAboutClick)
+end;
+
+{ TEWMenuManager }
+
+{ TODO: use
+
+ procedure MenuBeginUpdate;
+ procedure MenuEndUpdate;
+}
+
+constructor TEWMenuManager.Create;
+begin
+ fMenus := TStringList.Create();
+end;
+
+procedure TEWMenuManager.Initialize;
+begin
+ // nothing, for compatibility with Delphi version
+end;
+
+destructor TEWMenuManager.Destroy;
+//var i: Integer;
+begin
+(* if Assigned(fMenus) then begin
+ for i := 0 to fMenus.Count-1 do begin
+ fMenus.Objects[i].Free();
+ fMenus.Objects[i] := nil;
+ end; { for }
+ end; *)
+ FreeAndNil(fMenus);
+// FreeAndNil(fEWMenu);
+end;
+
+function TEWMenuManager.CreateMenu(const aName: string): TEWMenu;
+var
+ lIndex: integer;
+begin
+ Initialize();
+ lIndex := fMenus.IndexOf(aName);
+ if lIndex > -1 then begin
+ Result := fMenus.Objects[lIndex] as TEWMenu
+ end
+ else begin
+ // similar to RegisterIDESubMenu
+ Result := TEWMenu.Create(aName);
+ Result.ChildsAsSubMenu:=true;
+ Result.SubMenuImages := IDEImages.Images_16;
+ fMenus.AddObject(aName, result);
+ end;
+end;
+
+
+function TEWMenuManager.DestroyMenu(var aMenu: TEWMenu): boolean;
+{var lIndex: integer;}
+begin
+ // only static packages in lazarus
+ Result := (aMenu <> nil) and False; // always false
+ {
+ Initialize();
+ lIndex := fMenus.IndexOfObject(aMenu);
+ if lIndex > -1 then begin
+ dec(aMenu.fRefCount);
+ if aMenu.fRefCount = 0 then begin
+ fMenus.Delete(lIndex);
+ aMenu.Free();
+ result := true;
+ end
+ else begin
+ result := false;
+ end;
+ end
+ else
+ result := false;
+ aMenu := nil;
+ }
+end;
+
+{ TEWMenu }
+
+constructor TEWMenu.Create(const aName: string);
+begin
+ inherited Create(aName);
+ Caption := aName;
+ OnClick := _OnPopup;
+ CreateMenuItem;
+ mnuMain.Insert(mnuWindow.SectionIndex, self);
+ fcat := RegisterIDECommandCategory(nil, Caption,'');
+ with CreateMenuItem('NOOPTIONS', -1, [pAny]) do begin
+ MenuItem.Enabled := false;
+ end;
+end;
+
+function TEWMenu.CreateMenuItem(const aCaption: string; aImageIndex: integer; aPersonality: TEWPersonalitySet; AutoAdd: boolean = True): TEWMenuItem;
+begin
+ // same as RegisterIDEMenuCommand
+ Result := TEWMenuItem.Create(aCaption);
+ Result.Caption := aCaption;
+ result.Personality := aPersonality;
+ Result.CreateMenuItem;
+ Result.MenuItem.ImageIndex:=aImageIndex;
+ if AutoAdd then Self.AddLast(Result);
+end;
+
+function TEWMenu.DestroyMenuItem(var aMenu: TEWMenuItem): boolean;
+begin
+ result := (aMenu<> nil) and false;
+end;
+
+procedure TEWMenu._OnPopup(aSender: TObject);
+var
+ i: integer;
+ lPersonality: TEWPersonality;
+ lAnyMenusVisible: boolean;
+begin
+ if assigned(fOnPopup) then fOnPopup(aSender); // aSender = Self
+
+ if CurrentProject <> nil then begin
+ {$IFDEF MSWINDOWS}
+ lPersonality := pLazarusWin;
+ {$ELSE}
+ lPersonality := pLazarusUnix;
+ {$ENDIF}
+ Items[0].Caption := '';
+ end
+ else begin
+ lPersonality := pNone;
+ Items[0].Caption := '';
+ end;
+
+ lAnyMenusVisible := false;
+ for i := 1 to Count-1 do begin
+ if Items[i] is TEWMenuItem then begin
+ with (Items[i] as TEWMenuItem) do begin
+ Items[i].Visible := Visible and ((pAny in Personality) or (lPersonality in Personality));
+ if Items[i].Visible then lAnyMenusVisible := true;
+ end;
+ end;
+ end;
+
+ Items[0].Visible := not lAnyMenusVisible;
+end;
+
+function TEWMenu.GetOnPopup: TNotifyEvent;
+begin
+ Result := OnClick;
+end;
+
+procedure TEWMenu.SetOnPopup(const AValue: TNotifyEvent);
+begin
+ OnClick := AValue;
+end;
+
+{ TEWMenuItem }
+
+
+procedure TEWMenuManager.OnAboutClick(Sender: TObject);
+begin
+ with TAboutForm.Create(Application) do try
+ Position := poScreenCenter;
+ ShowModal();
+ finally
+ release();
+ end;
+end;
+
+procedure TEWMenuItem.SetGlyph(aImageList: TImageList; aIndex: integer);
+var
+ lBitmap: TBitmap;
+begin
+ lBitmap := TBitmap.Create();
+ try
+ aImageList.GetBitmap(aIndex ,lBitmap);
+ if Section.SubMenuImages <> nil then
+ MenuItem.ImageIndex := Section.SubMenuImages.AddMasked(lBitmap, clFuchsia);
+ finally
+ lBitmap.Free();
+ end;
+end;
+
+initialization
+ MenuManager := TEWMenuManager.Create();
+finalization
+ FreeAndNil(MenuManager);
+end.
+
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAHelpers.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAHelpers.pas
new file mode 100644
index 0000000..f74087c
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAHelpers.pas
@@ -0,0 +1,418 @@
+unit uEWOTAHelpers;
+
+{$I Everwood.inc}
+
+interface
+
+uses
+ {$IFDEF DELPHI5}ComObj,{$ENDIF}
+ ToolsAPI, Classes;
+
+function GetDelphiVersion: Integer;
+
+function GetDllPath: String;
+
+function ModuleServices: IOTAModuleServices;
+function CurrentProject: IOTAProject;
+function ProjectByName(const aName: string): IOTAProject;
+function CurrentProjectGroup: IOTAProjectGroup;
+
+function GetUniqueProjectFilename(aProject: IOTAProject; aName: string): string;
+
+function FindModuleByUnitName(const aProject: IOTAProject; const aModuleName: string): IOTAModule;
+
+function RemoveInitialT(const aString:string):string;
+function AddInitialT(const aString:string):string;
+
+function ProjectName: string;
+
+function LoadStringFromFile(iFilename:string):string;
+procedure SaveStringToFile(const iFilename,iString:string);
+
+function ReplaceVariables(const aString: string; aVariables: TStrings): string;
+
+function ReadModuleSource(const aModule: IOTAModule): string;
+procedure WriteModuleSource(const aModule: IOTAModule; const aCode, aHeader: string);
+procedure AddOrReplaceNamedModule(const aProject: IOTAProject; aName, aCode: string);
+
+function LanguageFromPersonality(aProject: IOTAProject): string;
+function LanguageFromPersonalityEx(aProject: IOTAProject): string;
+
+implementation
+
+uses {$IFDEF MSWINDOWS}Windows, ActiveX, {$ENDIF} SysUtils, Forms, uEWHelpers;
+
+function LoadStringFromFile(iFilename:string):string;
+{$IFDEF DELPHI2009UP}
+begin
+ With TStringList.Create do try
+ LoadFromFile(iFilename);
+ Result := Text;
+ finally
+ Free;
+ end;
+end;
+{$ELSE}
+var t:text;
+ s:string;
+begin
+ try
+ AssignFile(t,iFilename);
+ Reset(t);
+ try
+ result := '';
+ while not Eof(t) do begin
+ Readln(t,s);
+ result := result+s+#13#10;
+ end;
+ finally
+ CloseFile(t);
+ end;
+ except
+ on E:Exception do
+ raise EInOutError.Create('Error loading file '+iFilename+' ('+E.ClassName+': '+E.Message+')');
+ end;
+end;
+{$ENDIF}
+
+procedure SaveStringToFile(const iFilename,iString:string);
+{$IFDEF DELPHI2009UP}
+begin
+ With TStringList.Create do try
+ Text := iString;
+ SaveToFile(iFilename);
+ finally
+ free;
+ end;
+end;
+{$ELSE}
+var t:TextFile;
+begin
+ try
+ AssignFile(t,iFilename);
+ Rewrite(t);
+ try
+ Write(t,iString);
+ finally
+ CloseFile(t);
+ end;
+ except
+ on E:Exception do
+ raise EInOutError.Create('Error saving file '+iFilename+' ('+E.ClassName+': '+E.Message+')');
+ end;
+end;
+{$ENDIF}
+
+function NewGuid:TGUID;
+begin
+ {$IFDEF MSWINDOWS}
+ CoCreateGuid(result);
+ {$ENDIF MSWINDOWS}
+ {$IFDEF LINUX}
+ CreateGuid(result);
+ {$ENDIF}
+end;
+
+function NewGuidAsString:string;
+begin
+ result := GuidToString(NewGuid());
+end;
+
+function NewGuidAsStringNoBrackets:string;
+begin
+ result := GuidToString(NewGuid());
+ result := Copy(result,2,Length(result)-2);
+end;
+
+function ReplaceVariables(const aString: string; aVariables: TStrings): string;
+var
+ i:integer;
+begin
+ { No, this isn't efficient code. But given the fact that this is used at designtime and
+ in a place where the execution is abolutely not time-critical, clarity is preferable to
+ efficiency, imho. mh. }
+
+ result := aString;
+ if Assigned(aVariables) then begin
+ for i := 0 to aVariables.Count-1 do begin
+ result := StringReplace(result,'$('+aVariables.Names[i]+')',aVariables.Values[aVariables.Names[i]],[rfReplaceAll,rfIgnoreCase]);
+ end;
+ end;
+ result := StringReplace(result,'$(NewID)',NewGuidAsString(),[rfReplaceAll,rfIgnoreCase]);
+ result := StringReplace(result,'$(NewID2)',NewGuidAsStringNoBrackets(),[rfReplaceAll,rfIgnoreCase]);
+end;
+
+function ProjectName: string;
+var
+ lProjectName:string;
+begin
+ if Assigned(CurrentProject()) then begin
+ lProjectName := (CurrentProject as IOTAModule).FileName;
+ lProjectName := ChangeFileExt(ExtractFileName(lProjectName),'');
+ end
+ else begin
+ lProjectName := '';
+ end;
+ result := lProjectName;
+end;
+
+function RemoveInitialT(const aString:string):string;
+begin
+ result := aString;
+ if (result <> '') and (result[1] = 'T') then Delete(result,1,1);
+end;
+
+function AddInitialT(const aString:string):string;
+begin
+ result := aString;
+ if (result <> '') and (result[1] <> 'T') then result := 'T'+result;
+end;
+
+function GetDllPath: String;
+var TheFileName : array[0..MAX_PATH] of char;
+begin
+ FillChar(TheFileName, SizeOf(TheFileName), #0);
+ {$IFDEF KYLIX}System.{$ENDIF}GetModuleFileName(hInstance, TheFileName, sizeof(TheFileName));
+ Result := ExtractFilePath(TheFileName);
+end;
+
+function ModuleServices: IOTAModuleServices;
+begin
+ result := (BorlandIDEServices as IOTAModuleServices);
+end;
+
+function CurrentProject: IOTAProject;
+var
+ services: IOTAModuleServices;
+ module: IOTAModule;
+ project: IOTAProject;
+ projectgroup: IOTAProjectGroup;
+ multipleprojects: Boolean;
+ i: Integer;
+begin
+ result := nil;
+
+ multipleprojects := False;
+ services := ModuleServices;
+
+ if (services = nil) then Exit;
+
+ for I := 0 to (services.ModuleCount - 1) do begin
+ module := services.Modules[I];
+ if (module.QueryInterface(IOTAProjectGroup, ProjectGroup) = S_OK) then begin
+ result := ProjectGroup.ActiveProject;
+ Exit;
+ end
+
+ else if module.QueryInterface(IOTAProject, Project) = S_OK then begin
+ if (result = nil) then
+ result := Project // Found the first project, so save it
+ else
+ multipleprojects := True; // It doesn't look good, but keep searching for a project group
+ end;
+ end;
+
+ if multipleprojects then result := nil;
+end;
+
+function ProjectByName(const aName: string): IOTAProject;
+var
+ services: IOTAModuleServices;
+ module: IOTAModule;
+ project: IOTAProject;
+ i: Integer;
+begin
+ result := nil;
+
+ services := ModuleServices;
+
+ if (services = nil) then Exit;
+
+ for I := 0 to (services.ModuleCount - 1) do begin
+ module := services.Modules[I];
+ if module.QueryInterface(IOTAProject, Project) = S_OK then begin
+ if module.FileName = aName then begin
+ result := Project;
+ exit;
+ end;
+ end;
+ end;
+end;
+
+function CurrentProjectGroup: IOTAProjectGroup;
+var
+ services: IOTAModuleServices;
+ i: Integer;
+begin
+ Result := nil;
+ services := ModuleServices;
+ for i := 0 to ModuleServices.ModuleCount - 1 do begin
+ if Supports(ModuleServices.Modules[i], IOTAProjectGroup, Result) then begin
+ Break;
+ end;
+ end;
+end;
+
+function GetUniqueProjectFilename(aProject: IOTAProject; aName: string): string;
+var
+ lBaseName, lName: string;
+ lCount: integer;
+
+ function ProjectHasFile: boolean;
+ var
+ i: integer;
+ begin
+ result := false;
+ for i := 0 to aProject.GetModuleCount-1 do begin
+ if (aProject.GetModule(i).Name = lName) or (aProject.GetModule(i).Name = ChangeFileExt(lName, '')) then begin
+ result := true;
+ break;
+ end;
+ end;
+ end;
+
+begin
+ lName := aName;
+ lBaseName := ChangeFileExt(aName, '');
+ lCount := 0;
+ while ProjectHasFile() do begin
+ inc(lCount);
+ lName := lBaseName+IntToStr(lCount)+ExtractFileExt(aName);
+ end;
+ result := lName;
+end;
+
+function FindModuleByUnitName(const aProject: IOTAProject; const aModuleName: string): IOTAModule;
+var
+ i: integer;
+begin
+ result := nil;
+ for i := 0 to aProject.GetModuleCount - 1 do
+ if (CompareText(ExtractFileName(aModuleName), ExtractFileName(aProject.GetModule(i).FileName)) = 0) then begin
+ result := aProject.GetModule(i).OpenModule;
+ Exit;
+ end;
+end;
+
+
+const
+ MaxSourceSize = 10000;
+
+function ReadModuleSource(const aModule: IOTAModule): String;
+var
+ l, i: integer;
+ editor: IOTASourceEditor;
+ reader: IOTAEditReader;
+ lSource: AnsiString;
+begin
+ result := '';
+ with aModule do
+ for i := 0 to GetModuleFileCount - 1 do begin
+ if Supports(GetModuleFileEditor(i), IOTASourceEditor, editor) then begin
+ // TODO: find a way not to depend on files smaller than 10k... I only use this for DPRs so it's fine for now
+ SetLength(lSource, MaxSourceSize);
+ //l := 0; to remove warning
+
+ reader := editor.CreateReader;
+ l := reader.GetText(0, @lSource[1], MaxSourceSize);
+ reader := nil;
+ SetLength(lSource, l);
+
+ result := {$IFDEF DELPHI2009UP}UTF8ToString{$ENDIF}(lSource);
+ Exit;
+ end;
+ end;
+end;
+
+procedure WriteModuleSource(const aModule: IOTAModule; const aCode, aHeader: string);
+var
+ i: integer;
+ lEditor: IOTASourceEditor;
+ writer: IOTAEditWriter;
+begin
+ with aModule do begin
+ for i := 0 to GetModuleFileCount - 1 do begin
+ if Supports(GetModuleFileEditor(i), IOTASourceEditor, lEditor) then begin
+ if LowerCase(ExtractFileExt(GetModuleFileEditor(i).FileName)) = '.h' then begin
+ if aHeader <> '' then begin
+ writer := lEditor.CreateWriter;
+ writer.DeleteTo(MaxInt);
+ writer.Insert(PAnsiChar({$IFDEF DELPHI2009UP}UTF8Encode{$ENDIF}(aHeader)));
+ writer := nil;
+ end;
+ end
+ else begin
+ writer := lEditor.CreateWriter;
+ writer.DeleteTo(MaxInt);
+ writer.Insert(PAnsiChar({$IFDEF DELPHI2009UP}UTF8Encode{$ENDIF}(aCode)));
+ writer := nil;
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure AddOrReplaceNamedModule(const aProject: IOTAProject; aName, aCode: string);
+var
+ lModule: IOTAModule;
+begin
+ lModule := FindModuleByUnitName(aProject, aName);
+ if assigned(lModule) then begin
+ WriteModuleSource(lModule, aCode, '');
+ end
+ else begin
+ aName := ExtractFilePath(CurrentProject.FileName)+aName;
+ SaveStringToFile(aName, aCode);
+ CurrentProject.AddFile(aName, true);
+ lModule := FindModuleByUnitName(CurrentProject, aName);
+ {$IFDEF DELPHI9UP}
+ if assigned(lModule) then lModule.Show();
+ {$ENDIF DELPHI9UP}
+ end;
+end;
+
+function GetDelphiVersion: Integer;
+begin
+{$IFDEF DELPHI5}
+ result := 5;
+{$ELSE}
+{$IFDEF DELPHI2007}
+ result := 11;
+{$ELSE}
+{$IFDEF DELPHI2010}
+ result := 14;
+{$ELSE}
+ result := Trunc(RTLVersion)-8;
+{$ENDIF}
+{$ENDIF}
+{$ENDIF}
+end;
+
+function LanguageFromPersonality(aProject: IOTAProject): string;
+{$IFDEF BDS}
+var s: string;
+{$ENDIF}
+begin
+ {$IFDEF BDS}
+ s := aProject.Personality;
+ if s = sDelphiPersonality then result := 'Delphi for Win32'
+ else if s = sDelphiDotNetPersonality then result := 'Delphi for .NET'
+ else if s = sCSharpPersonality then result := 'C#'
+ else if s = sVBPersonality then result := 'Visual Basic'
+ else if s = sCBuilderPersonality then result := 'C++'
+ else result := 'Unknown';
+ {$ELSE}
+ result := 'Delphi for Win32';
+ {$ENDIF}
+end;
+
+function LanguageFromPersonalityEx(aProject: IOTAProject): string;
+begin
+ result := LanguageFromPersonality(aProject);
+ {$IFDEF BDS}
+ if result = 'Delphi for .NET' then
+ result := result+'/'+IntToStr(GetDelphiVersion);
+ {$ENDIF}
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAHelpers_laz.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAHelpers_laz.pas
new file mode 100644
index 0000000..14766f3
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAHelpers_laz.pas
@@ -0,0 +1,242 @@
+unit uEWOTAHelpers_laz;
+
+{$I Everwood.inc}
+
+interface
+
+uses
+ LazIDEIntf, ProjectIntf, SrcEditorIntf, Classes;
+
+function GetDllPath: String;
+function CurrentProject: TLazProject;
+function ProjectByName(const aName: string): TLazProject;
+
+function GetUniqueProjectFilename(aProject: TLazProject; aName: string): string;
+
+function FindModuleByUnitName(const aProject: TLazProject; const aModuleName: string): TLazProjectFile;
+
+function RemoveInitialT(const aString:string):string;
+function AddInitialT(const aString:string):string;
+
+function ProjectName: string;
+
+function LoadStringFromFile(iFilename:string):string;
+procedure SaveStringToFile(const iFilename,iString:string);
+
+function ReplaceVariables(const aString: string; aVariables: TStrings): string;
+
+function ReadModuleSource(const aModule: TLazProjectFile): string;
+procedure WriteModuleSource(const aModule: TLazProjectFile; const aCode, aHeader: string);
+procedure AddOrReplaceNamedModule(const aProject: TLazProject; aName, aCode: string);
+
+implementation
+
+uses {$IFDEF MSWINDOWS}Windows, ActiveX, {$ENDIF} SysUtils;
+
+function LoadStringFromFile(iFilename:string):string;
+var t:text;
+ s:string;
+begin
+ try
+ AssignFile(t,iFilename);
+ Reset(t);
+ try
+ result := '';
+ while not Eof(t) do begin
+ Readln(t,s);
+ result := result+s+#13#10;
+ end;
+ finally
+ CloseFile(t);
+ end;
+ except
+ on E:Exception do
+ raise EInOutError.Create('Error loading file '+iFilename+' ('+E.ClassName+': '+E.Message+')');
+ end;
+end;
+
+procedure SaveStringToFile(const iFilename,iString:string);
+var t:TextFile;
+begin
+ try
+ AssignFile(t,iFilename);
+ Rewrite(t);
+ try
+ Write(t,iString);
+ finally
+ CloseFile(t);
+ end;
+ except
+ on E:Exception do
+ raise EInOutError.Create('Error saving file '+iFilename+' ('+E.ClassName+': '+E.Message+')');
+ end;
+end;
+
+function NewGuid:TGUID;
+begin
+ {$IFDEF MSWINDOWS}
+ CoCreateGuid(result);
+ {$ENDIF MSWINDOWS}
+ {$IFDEF LINUX}
+ CreateGuid(result);
+ {$ENDIF}
+end;
+
+function NewGuidAsString:string;
+begin
+ result := GuidToString(NewGuid());
+end;
+
+function NewGuidAsStringNoBrackets:string;
+begin
+ result := GuidToString(NewGuid());
+ result := Copy(result,2,Length(result)-2);
+end;
+
+function ReplaceVariables(const aString: string; aVariables: TStrings): string;
+var
+ i:integer;
+begin
+ { No, this isn't efficient code. But given the fact that this is used at designtime and
+ in a place where the execution is abolutely not time-critical, clarity is preferable to
+ efficiency, imho. mh. }
+
+ result := aString;
+ if Assigned(aVariables) then begin
+ for i := 0 to aVariables.Count-1 do begin
+ result := StringReplace(result,'$('+aVariables.Names[i]+')',aVariables.Values[aVariables.Names[i]],[rfReplaceAll,rfIgnoreCase]);
+ end;
+ end;
+ result := StringReplace(result,'$(NewID)',NewGuidAsString(),[rfReplaceAll,rfIgnoreCase]);
+ result := StringReplace(result,'$(NewID2)',NewGuidAsStringNoBrackets(),[rfReplaceAll,rfIgnoreCase]);
+end;
+
+function ProjectName: string;
+begin
+ if Assigned(CurrentProject) and Assigned(CurrentProject.MainFile) then
+ Result := ChangeFileExt(ExtractFileName(CurrentProject.MainFile.Filename),'')
+ else
+ Result := '';
+end;
+
+function RemoveInitialT(const aString:string):string;
+begin
+ result := aString;
+ if (result <> '') and (result[1] = 'T') then Delete(result,1,1);
+end;
+
+function AddInitialT(const aString:string):string;
+begin
+ result := aString;
+ if (result <> '') and (result[1] <> 'T') then result := 'T'+result;
+end;
+
+function GetDllPath: String;
+{$IFDEF MSWINDOWS}
+var
+ TheFileName : array[0..MAX_PATH] of char;
+{$ENDIF}
+begin
+ {$IFDEF MSWINDOWS}
+ {$IFDEF FPC}
+ TheFileName[0]:=#0;
+ {$ENDIF}
+ FillChar(TheFileName, SizeOf(TheFileName), #0);
+ GetModuleFileName(hInstance, TheFileName, sizeof(TheFileName));
+ Result := ExtractFilePath(TheFileName);
+ {$ELSE}
+ Result := '';
+ {$ENDIF}
+end;
+
+function CurrentProject: TLazProject;
+begin
+ result := LazarusIDE.ActiveProject;
+end;
+
+function ProjectByName(const aName: string): TLazProject;
+begin
+ if CurrentProject.MainFile.Filename = aName then
+ Result := CurrentProject
+ else
+ Result := nil;
+end;
+
+
+function GetUniqueProjectFilename(aProject: TLazProject; aName: string): string;
+var
+ lBaseName, lName: string;
+ lCount: integer;
+
+ function ProjectHasFile: boolean;
+ var
+ i: integer;
+ begin
+ result := false;
+ for i := 0 to aProject.FileCount - 1 do begin
+ if (aProject.Files[i].Filename = lName) or (aProject.Files[i].Filename = ChangeFileExt(lName, '')) then begin
+ result := true;
+ break;
+ end;
+ end;
+ end;
+
+begin
+ lName := aName;
+ lBaseName := ChangeFileExt(aName, '');
+ lCount := 0;
+ while ProjectHasFile() do begin
+ inc(lCount);
+ lName := lBaseName+IntToStr(lCount)+ExtractFileExt(aName);
+ end;
+ result := lName;
+end;
+
+function FindModuleByUnitName(const aProject: TLazProject; const aModuleName: string): TLazProjectFile;
+begin
+ Result := aProject.FindFile(aModuleName,[pfsfOnlyProjectFiles]);
+end;
+
+function ReadModuleSource(const aModule: TLazProjectFile): string;
+begin
+ result := aModule.GetSourceText;
+end;
+
+procedure WriteModuleSource(const aModule: TLazProjectFile; const aCode, aHeader: string);
+var
+ l: TSourceEditorInterface;
+ i: integer;
+begin
+ with TStringList.Create do try
+ Text:= aCode;
+ SaveToFile(aModule.Filename);
+ finally
+ Free;
+ end;
+ if SourceEditorWindow.SourceEditorIntfWithFilename(aModule.Filename) = nil then
+ LazarusIDE.DoOpenEditorFile(aModule.Filename,-1,[ofOnlyIfExists]);
+ for i := 0 to SourceEditorWindow.Count-1 do begin
+ if SourceEditorWindow.Items[i].GetProjectFile = aModule then begin
+ LazarusIDE.DoOpenEditorFile(aModule.Filename,i,[ofRevert]);
+ break;
+ end;
+ end;
+end;
+
+procedure AddOrReplaceNamedModule(const aProject: TLazProject; aName, aCode: string);
+var
+ lModule: TLazProjectFile;
+begin
+ lModule := FindModuleByUnitName(aProject, aName);
+ if assigned(lModule) then begin
+ WriteModuleSource(lModule, aCode, '');
+ end
+ else begin
+ aName := ExtractFilePath(CurrentProject.MainFile.Filename)+aName;
+ SaveStringToFile(aName, aCode);
+ lModule:= CurrentProject.CreateProjectFile(aName);
+ CurrentProject.AddFile(lModule, False);
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAMessages.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAMessages.pas
new file mode 100644
index 0000000..13097d0
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAMessages.pas
@@ -0,0 +1,56 @@
+unit uEWOTAMessages;
+
+{$INCLUDE eDefines.inc}
+
+interface
+
+procedure ClearIDEMessages(const aGroupName: string);
+procedure AddIDEMessage(const aGroupName: string; const aMessageStr: string; aLine : integer = -1; aColumn: integer = -1; const aFileName: string = ''; const aPrefixStr: string = '');
+
+implementation
+
+uses
+ ToolsAPI;
+
+{$IFDEF DELPHI7UP}
+procedure ClearIDEMessages(const aGroupName: string);
+var
+ lGroup: IOTAMessageGroup;
+begin
+ with BorlandIDEServices as IOTAMessageServices60 do begin
+ lGroup := GetGroup(aGroupName);
+ if Assigned(lGroup) then
+ RemoveMessageGroup(lGroup);
+ end;
+end;
+
+procedure AddIDEMessage(const aGroupName: string; const aMessageStr: string; aLine: integer = -1; aColumn: integer = -1; const aFileName: string = ''; const aPrefixStr: string = '');
+var
+ lGroup: IOTAMessageGroup;
+ lDummyLineRef: pointer;
+ lPrefix: string;
+begin
+ with BorlandIDEServices as IOTAMessageServices60 do begin
+ lGroup := GetGroup(aGroupName);
+ ShowMessageView(lGroup);
+ if not Assigned(lGroup) then lGroup := AddMessageGroup(aGroupName);
+
+ lPrefix := aPrefixStr;
+ if lPrefix = '' then lPrefix := 'Note';
+ AddToolMessage(aFilename, aMessageStr, lPrefix, aLine, aColumn, nil, lDummyLineRef, lGroup);
+ end;
+end;
+
+{$ELSE}
+
+procedure ClearIDEMessages(const aGroupName: string);
+begin
+end;
+
+procedure AddIDEMessage(const aGroupName: string; const aMessageStr: string; aLine : integer = -1; aColumn: integer = -1; const aFileName: string = ''; const aPrefixStr: string = '');
+begin
+end;
+
+{$ENDIF}
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTANewModuleExpert.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTANewModuleExpert.pas
new file mode 100644
index 0000000..bd6e6ea
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTANewModuleExpert.pas
@@ -0,0 +1,16 @@
+unit uEWOTANewModuleExpert;
+
+interface
+
+uses
+ {$IFDEF DELPHI5}DsgnIntf,{$ENDIF}
+ {$IFDEF DELPHI6UP}DesignEditors,{$ENDIF}
+ ToolsAPI, Classes, uEWOTARepositoryExpert;
+
+type
+ TEWNewModuleExpert = class(TEWRepositoryExpert, IOTAFormWizard)
+ end;
+
+implementation
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTANewProjectExpert.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTANewProjectExpert.pas
new file mode 100644
index 0000000..a089160
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTANewProjectExpert.pas
@@ -0,0 +1,16 @@
+unit uEWOTANewProjectExpert;
+
+interface
+
+uses
+ {$IFDEF DELPHI5}DsgnIntf,{$ENDIF}
+ {$IFDEF DELPHI6UP}DesignEditors,{$ENDIF}
+ ToolsAPI, Classes, uEWOTARepositoryExpert;
+
+type
+ TEWNewProjectExpert = class(TEWRepositoryExpert, IOTAProjectWizard)
+ end;
+
+implementation
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTARepositoryExpert.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTARepositoryExpert.pas
new file mode 100644
index 0000000..7b7ecde
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTARepositoryExpert.pas
@@ -0,0 +1,284 @@
+unit uEWOTARepositoryExpert;
+
+{$I Everwood.inc}
+
+interface
+
+uses
+ {$IFDEF DELPHI5}DsgnIntf,{$ENDIF}
+ {$IFDEF DELPHI6UP}DesignEditors,{$ENDIF}
+ Windows, Classes, ToolsAPI;
+
+{$IFNDEF BDS}
+const
+ sDelphiPersonality = 'Delphi.Personality';
+{$ENDIF}
+
+{$IFDEF DELPHI5}
+ dAny = 'Any';
+{$ENDIF}
+
+type
+ TEWRepositoryExpert = class(TInterfacedObject, IOTAWizard, IOTARepositoryWizard{$IFDEF DELPHI6UP}, IOTARepositoryWizard60{$ENDIF} {$IFDEF BDS}, IOTARepositoryWizard80{$ENDIF})
+ private
+ fIcon: Cardinal;
+ fPersonality: string;
+ protected
+ procedure AfterSave; virtual;
+ procedure BeforeSave; virtual;
+ procedure Destroyed; virtual;
+ procedure Modified; virtual;
+
+ procedure Execute; virtual;
+ function GetAuthor: String; virtual;
+ function GetComment: String; virtual;
+ function GetGlyph: {$IFDEF DELPHI5}HICON{$ELSE}Cardinal{$ENDIF};
+ function GetIDString: String;
+ function GetInternalIDString: String; virtual; abstract;
+ function GetName: String; virtual; abstract;
+ function GetPage: String; virtual; abstract;
+ function GetState: TWizardState; virtual;
+ function GetDesigner: String; virtual;
+
+ {$IFDEF BDS}
+ function GetGalleryCategory: IOTAGalleryCategory; virtual;
+ {$ENDIF}
+ function GetPersonality: string; virtual;
+
+ function LoadGlyph: Cardinal; virtual;
+
+ function CreateNewModuleFromTemplateFile(const aTemplateFile: string; const aName, aAncestor: string; aVariables: TStrings=nil):IOTAModule;
+ function CreateNewModuleFromString(const aTemplateString: string; const aName, aAncestor: string; aVariables: TStrings=nil):IOTAModule;
+ function CreateNewProject:IOTAProject;
+ function CreateNewProjectFromTemplateFile(aTemplateFile: string; aProjectFileName: string; aVariables: TStrings=nil):IOTAProject;
+ function CreateNewProjectFromTemplateFolder(const aTemplateFileName: string; const aProjectFileName: string; aVariables: TStrings=nil):IOTAProject;
+
+ public
+ constructor Create(aPersonality: string = sDelphiPersonality);
+ end;
+
+
+implementation
+
+uses
+ SysUtils, uEWOTAWizards, Dialogs, uEWOTAHelpers;
+
+{ TEWRepositoryExpert }
+
+procedure TEWRepositoryExpert.AfterSave;
+begin
+
+end;
+
+procedure TEWRepositoryExpert.BeforeSave;
+begin
+
+end;
+
+constructor TEWRepositoryExpert.Create(aPersonality: string);
+begin
+ fPersonality := aPersonality;
+end;
+
+function TEWRepositoryExpert.CreateNewModuleFromString(const aTemplateString, aName, aAncestor: string; aVariables: TStrings): IOTAModule;
+var
+ lModuleServices: IOTAModuleServices;
+// lSourceTemplate,lDfmTemplate: string;
+// lDfmTemplateFile: string;
+begin
+ if BorlandIDEServices.QueryInterface(IOTAModuleServices, lModuleServices) = S_OK then
+ result := lModuleServices.CreateModule(TEWFormCreator.Create(aTemplateString,
+ '',
+ aName, aAncestor, aVariables));
+end;
+
+function TEWRepositoryExpert.CreateNewModuleFromTemplateFile(const aTemplateFile: string; const aName, aAncestor: string; aVariables: TStrings):IOTAModule;
+var
+ lModuleServices: IOTAModuleServices;
+ lSourceTemplate,lDfmTemplate: string;
+ lDfmTemplateFile: string;
+begin
+ lSourceTemplate := LoadStringFromFile(aTemplateFile);
+
+ lDfmTemplate := '';
+ lDfmTemplateFile := ChangeFileExt(aTemplateFile,'.dfm');
+ if FileExists(lDfmTemplateFile) then begin
+ lDfmTemplate := LoadStringFromFile(lDfmTemplateFile);
+ end;
+
+ if BorlandIDEServices.QueryInterface(IOTAModuleServices, lModuleServices) = S_OK then
+ result := lModuleServices.CreateModule(TEWFormCreator.Create(lSourceTemplate,
+ lDfmTemplate,
+ aName, aAncestor, aVariables));
+end;
+
+function TEWRepositoryExpert.CreateNewProject: IOTAProject;
+var
+ lModuleServices: IOTAModuleServices;
+begin
+ if BorlandIDEServices.QueryInterface(IOTAModuleServices, lModuleServices) = S_OK then
+ result := lModuleServices.CreateModule(TEWProjectCreator.Create('', '', nil)) as IOTAProject;
+end;
+
+function TEWRepositoryExpert.CreateNewProjectFromTemplateFile(aTemplateFile: string; aProjectFileName: string; aVariables: TStrings): IOTAProject;
+{$IFNDEF BDS}
+var
+ lModuleServices: IOTAModuleServices;
+{$ENDIF}
+begin
+ result := NIL;
+ {$IFDEF BDS} // AleF: Fixed a typo here. It said BSD!!!
+ aProjectFileName := ChangeFileExt(aProjectFileName, '.bdsproj');
+ if FileExists(aProjectFileName) then begin
+ (BorlandIDEServices as IOTAActionServices).OpenProject(aProjectFileName, false); // Vynnyk: Rolled back - because not compilable
+ result := (BorlandIDEServices as IOTAModuleServices).GetActiveProject;
+ end;
+ {$ELSE}
+ if BorlandIDEServices.QueryInterface(IOTAModuleServices, lModuleServices) = S_OK then begin
+ result := lModuleServices.CreateModule(TEWProjectCreator.Create(aTemplateFile, aProjectFileName, aVariables)) as IOTAProject;
+ end;
+ {$ENDIF}
+end;
+
+function TEWRepositoryExpert.CreateNewProjectFromTemplateFolder(const aTemplateFileName: string; const aProjectFileName: string; aVariables: TStrings): IOTAProject;
+var
+ lString, lName, lFileExt: string;
+ lOk: dword;
+ lTemplateFolder, lProjectFolder: string;
+ lSearch: TSearchRec;
+begin
+ lTemplateFolder := ExtractFilePath(aTemplateFileName);
+ lProjectFolder := ExtractFilePath(aProjectFileName);
+
+ if not FileExists(aTemplateFileName) then
+ raise Exception.Create('Template not found at '+ExtractFilePath(aTemplateFileName));
+
+ lOk := FindFirst(lTemplateFolder+'*.*',faAnyFile,lSearch);
+ try
+ while lOk = 0 do try
+ if (lSearch.Attr and faDirectory) = 0 then begin
+ {$IFNDEF BDS}
+ if ExtractFileExt(lSearch.Name) = '.bdsproj' then
+ Continue;
+ {$ENDIF}
+
+ lFileExt := ExtractFileExt(lSearch.Name);
+ lName := ReplaceVariables(lSearch.Name, aVariables);
+ if SameText(lFileExt,'.res') then begin
+ CopyFile(pChar(lTemplateFolder+lSearch.Name), pChar(lProjectFolder+lName),false);
+ end
+ else begin
+ lString := ReplaceVariables(LoadStringFromFile(lTemplateFolder+lSearch.Name), aVariables);
+ SaveStringToFile(lProjectFolder+lName,lString);
+ end;
+ end;
+ finally
+ lOk := FindNext(lSearch);
+ end; { while }
+ finally
+ FindClose(lSearch);
+ end;
+ result := CreateNewProjectFromTemplateFile(aTemplateFileName, aProjectFileName, aVariables);
+end;
+
+procedure TEWRepositoryExpert.Destroyed;
+begin
+end;
+
+procedure TEWRepositoryExpert.Execute;
+begin
+end;
+
+function TEWRepositoryExpert.GetAuthor: String;
+begin
+ result := 'RemObjects Software'
+end;
+
+function TEWRepositoryExpert.GetComment: String;
+begin
+
+end;
+
+function TEWRepositoryExpert.GetDesigner: String;
+begin
+ Result := dAny;
+end;
+
+function TEWRepositoryExpert.GetGlyph: {$IFDEF DELPHI5}HICON{$ELSE}Cardinal{$ENDIF};
+begin
+ { We'll cache the Glpyh locally so it won't be loaded again and again.
+ Apparently Delphi doesn't free the Glpyh, so this would leak otherwise }
+
+ if fIcon = 0 then fIcon := LoadGlyph();
+ result := fIcon;
+end;
+
+function TEWRepositoryExpert.GetIDString: String;
+begin
+ result := GetInternalIDString+'.'+fPersonality;
+end;
+
+function TEWRepositoryExpert.LoadGlyph: Cardinal;
+begin
+ result := LoadIcon(hInstance,'EverwoodWizardStandardIcon');
+end;
+
+
+function TEWRepositoryExpert.GetState: TWizardState;
+begin
+ result := [wsEnabled];
+end;
+
+procedure TEWRepositoryExpert.Modified;
+begin
+
+end;
+
+{$IFDEF BDS}
+function TEWRepositoryExpert.GetGalleryCategory: IOTAGalleryCategory;
+var
+ lGalleryCategory: string;
+ lGalleryManager: IOTAGalleryCategoryManager;
+ lGallery: IOTAGalleryCategory;
+begin
+ if fPersonality = sDelphiPersonality then
+ lGalleryCategory := sCategoryDelphiNew
+ else if fPersonality = sCBuilderPersonality then
+ lGalleryCategory := sCategoryCBuilderNew
+ else if fPersonality = sDelphiDotNetPersonality then
+ lGalleryCategory := sCategoryDelphiDotNetNew
+ else if fPersonality = sCSharpPersonality then
+ lGalleryCategory := sCategoryCSharpNew
+ else if fPersonality = sVBPersonality then
+ lGalleryCategory := sCategoryVBNew
+ else
+ exit;
+
+ lGalleryManager := (BorlandIDEServices as IOTAGalleryCategoryManager);
+
+ lGallery := lGalleryManager.FindCategory(lGalleryCategory);
+ if assigned(lGallery) then begin
+
+ if fPersonality = sVBPersonality then
+ ShowMessage(lGalleryCategory+' '+fPersonality+' '+GetName+ ' - '+lGallery.DisplayName);
+
+ result := lGalleryManager.FindCategory(GetPage());
+ if not assigned(result) then begin
+ lGalleryManager.AddCategory(lGallery, GetPage()+'.'+fPersonality, GetPage());
+ end;
+ end
+ else begin
+ result := lGalleryManager.FindCategory(sCategoryGalileoOther);
+ end;
+
+end;
+{$ENDIF}
+
+function TEWRepositoryExpert.GetPersonality: string;
+begin
+ result := fPersonality;
+end;
+
+end.
+
+
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAWizards.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAWizards.pas
new file mode 100644
index 0000000..987617c
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWOTAWizards.pas
@@ -0,0 +1,345 @@
+unit uEWOTAWizards;
+
+{----------------------------------------------------------------------------}
+{ RemObjects' Everwood - IDE Library
+{
+{ compiler: Delphi 6 and up, Kylix 3 and up
+{ platform: Win32, Linux
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of Everwood
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$I Everwood.inc}
+
+interface
+
+uses
+ {$IFDEF DELPHI5}DsgnIntf,{$ENDIF}
+ {$IFDEF DELPHI6UP}DesignEditors,{$ENDIF}
+ SysUtils, Classes,
+ Dialogs, ToolsAPI;
+
+type
+ TEWSourceFile = class(TInterfacedObject, IOTAFile)
+ private
+ fAge: TDateTime;
+ fSource:string;
+ public
+ function GetSource: string;
+ function GetAge: TDateTime;
+ constructor Create(const iSource:string);
+ end;
+
+ TEWCreator = class(TInterfacedObject, IOTACreator)
+ private
+ fVariables: TStrings;
+ fAncestorName: String;
+ fName: string;
+ public
+ constructor Create(const aName, aAncestorName:string; aVariables:TStrings);
+ destructor Destroy; override;
+
+ function GetCreatorType: string; virtual; abstract;
+ function GetExisting: Boolean;
+ function GetFileSystem: string;
+ function GetOwner: IOTAModule; virtual;
+ function GetUnnamed: Boolean; virtual;
+
+ function CreateOTAFile(const aTemplate: string; const ModuleIdent: string=''; const FormIdent: string =''; const AncestorIdent: string=''): IOTAFile;
+
+ end;
+
+ TEWFormCreator = class(TEWCreator, IOTAModuleCreator)
+ public
+ constructor Create(const aCodeTemplate, aDfmTemplate, aName, aAncestor:string; aVariables:TStrings);
+
+ function GetCreatorType: string; override;
+
+ function GetAncestorName: string;
+ function GetImplFileName: string;
+ function GetIntfFileName: string;
+ function GetFormName: string;
+ function GetMainForm: Boolean;
+ function GetShowForm: Boolean;
+ function GetShowSource: Boolean;
+ function NewFormFile(const FormIdent, AncestorIdent: string): IOTAFile;
+ function NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;
+ function NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;
+
+ procedure FormCreated(const FormEditor: IOTAFormEditor);
+
+ private
+ fCodeTemplate, fDfmTemplate: String;
+ end;
+
+ TEWProjectCreator = class(TEWCreator, IOTAProjectCreator, IOTAProjectCreator50{$IFDEF BDS}, IOTAProjectCreator80{$ENDIF})
+ public
+ constructor Create(const aCodeTemplateFile, aName:string; aVariables:TStrings);
+
+ function GetCreatorType: string; override;
+ function GetOwner: IOTAModule; override;
+ function GetUnnamed: Boolean; override;
+
+ function GetFileName: string;
+ function GetOptionFileName: string;
+ function GetShowSource: Boolean;
+ procedure NewDefaultModule;
+ function NewOptionSource(const ProjectName: string): IOTAFile;
+ procedure NewProjectResource(const Project: IOTAProject);
+ function NewProjectSource(const ProjectName: string): IOTAFile;
+
+ procedure NewDefaultProjectModule(const Project: IOTAProject); virtual;
+
+ {$IFDEF BDS}
+ function GetProjectPersonality: string;
+ {$ENDIF}
+
+ private
+ fCodeTemplateFile: string;
+ end;
+
+implementation
+
+uses
+ uEWOTAHelpers, Windows;
+
+{ TEWCreator }
+
+constructor TEWCreator.Create(const aName, aAncestorName:string; aVariables:TStrings);
+begin
+ fName := aName;
+ fAncestorName := aAncestorName;
+ fVariables := aVariables;
+end;
+
+destructor TEWCreator.Destroy;
+begin
+ inherited;
+end;
+
+function TEWCreator.GetExisting: Boolean;
+begin
+ result := false;
+end;
+
+function TEWCreator.GetFileSystem: string;
+begin
+ result := '';
+end;
+
+function TEWCreator.GetOwner: IOTAModule;
+begin
+ result := CurrentProject();
+end;
+
+function TEWCreator.GetUnnamed: Boolean;
+begin
+ result := true;
+end;
+
+function TEWCreator.CreateOTAFile(const aTemplate: string; const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;
+var
+ i: integer;
+ lCode: string;
+begin
+ lCode := aTemplate;
+
+ { No, this isn't efficient code. But given the fact that this is used at designtime and
+ in a place where the execution is abolutely not time-critical, clarity is preferable to
+ efficiency, imho. mh. }
+
+ if ModuleIdent <> '' then begin
+ lCode := StringReplace(lCode,'$(Module)',ModuleIdent,[rfReplaceAll,rfIgnoreCase]);
+ end;
+ if FormIdent <> '' then begin
+ lCode := StringReplace(lCode,'$(FormName)',RemoveInitialT(FormIdent),[rfReplaceAll,rfIgnoreCase]);
+ lCode := StringReplace(lCode,'$(FormClass)',AddInitialT(FormIdent),[rfReplaceAll,rfIgnoreCase]);
+ end;
+ if AncestorIdent <> ''then begin
+ lCode := StringReplace(lCode,'$(Ancestor)',AncestorIdent,[rfReplaceAll,rfIgnoreCase]);
+ end;
+ lCode := StringReplace(lCode,'$(Project)',ProjectName,[rfReplaceAll,rfIgnoreCase]);
+ if Assigned(fVariables) then begin
+ for i := 0 to fVariables.Count-1 do begin
+ lCode := StringReplace(lCode,'$('+fVariables.Names[i]+')',fVariables.Values[fVariables.Names[i]],[rfReplaceAll,rfIgnoreCase]);
+ end;
+ end;
+ lCode := StringReplace(lCode,'$((','$(',[rfReplaceAll,rfIgnoreCase]);
+ {$IFDEF DEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+ ShowMessage(lCode);
+ {$ENDIF DEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+ result := TEWSourceFile.Create(lCode);
+end;
+
+{ TEWFormCreator }
+
+constructor TEWFormCreator.Create(const aCodeTemplate, aDfmTemplate, aName, aAncestor: string; aVariables: TStrings);
+begin
+ inherited Create(aName, aAncestor, aVariables);
+ fCodeTemplate := aCodeTemplate;
+ fDfmTemplate := aDfmTemplate;
+end;
+
+function TEWFormCreator.GetCreatorType: string;
+begin
+ result := sForm;
+end;
+
+procedure TEWFormCreator.FormCreated(const FormEditor: IOTAFormEditor);
+begin
+
+end;
+
+function TEWFormCreator.GetAncestorName: string;
+begin
+ result := fAncestorName;
+end;
+
+function TEWFormCreator.GetFormName: string;
+begin
+ result := '';
+end;
+
+function TEWFormCreator.GetImplFileName: string;
+begin
+ result := IncludeTrailingBackslash(ExtractFilePath(CurrentProject.FileName))+GetUniqueProjectFilename(CurrentProject, fName);
+end;
+
+function TEWFormCreator.GetIntfFileName: string;
+begin
+ result := '';
+end;
+
+function TEWFormCreator.GetMainForm: Boolean;
+begin
+ result := false;
+end;
+
+function TEWFormCreator.GetShowForm: Boolean;
+begin
+ result := true;
+end;
+
+function TEWFormCreator.GetShowSource: Boolean;
+begin
+ result := true;
+end;
+
+function TEWFormCreator.NewFormFile(const FormIdent, AncestorIdent: string): IOTAFile;
+begin
+ {$IFDEF DEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+ ShowMessage('dfm: '+FormIdent+' - '+AncestorIdent);
+ {$ENDIF DEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+ result := TEWSourceFile.Create(Format(fDfmTemplate,['',RemoveInitialT(FormIdent),ProjectName]));
+ result := CreateOTAFile(fDfmTemplate, '$(Module)', FormIdent, AncestorIdent);
+end;
+
+function TEWFormCreator.NewImplSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;
+begin
+ {$IFDEF DEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+ ShowMessage('pas: '+ModuleIdent+' - '+FormIdent+' - '+AncestorIdent);
+ {$ENDIF DEBUG_EVERWOOD_SHOW_NEW_MODULE_CODE}
+ result := CreateOTAFile(fCodeTemplate, ModuleIdent, FormIdent, AncestorIdent);
+end;
+
+function TEWFormCreator.NewIntfSource(const ModuleIdent, FormIdent, AncestorIdent: string): IOTAFile;
+begin
+ result := nil;
+end;
+
+{ TEWProjectCreator }
+
+constructor TEWProjectCreator.Create(const aCodeTemplateFile, aName: string; aVariables: TStrings);
+begin
+ inherited Create(aName, '', aVariables);
+ fCodeTemplateFile := aCodeTemplateFile;
+end;
+
+function TEWProjectCreator.GetCreatorType: string;
+begin
+ result := sLibrary;
+end;
+
+function TEWProjectCreator.GetFileName: string;
+begin
+ result := fName;
+end;
+
+function TEWProjectCreator.GetOptionFileName: string;
+begin
+ result := '';
+end;
+
+function TEWProjectCreator.GetOwner: IOTAModule;
+begin
+ result := CurrentProjectGroup;
+end;
+
+function TEWProjectCreator.GetShowSource: Boolean;
+begin
+ result := false;
+end;
+
+function TEWProjectCreator.GetUnnamed: Boolean;
+begin
+ result := (fName = '');
+end;
+
+procedure TEWProjectCreator.NewDefaultModule;
+begin
+
+end;
+
+procedure TEWProjectCreator.NewDefaultProjectModule(const Project: IOTAProject);
+begin
+end;
+
+{$IFDEF BDS}
+function TEWProjectCreator.GetProjectPersonality: string;
+begin
+ result := sDelphiPersonality;
+end;
+{$ENDIF}
+
+function TEWProjectCreator.NewOptionSource(const ProjectName: string): IOTAFile;
+begin
+ result := nil;
+end;
+
+procedure TEWProjectCreator.NewProjectResource(const Project: IOTAProject);
+begin
+ CopyFile(pChar(ChangeFileExt(fCodeTemplateFile,'.res')),pChar(ChangeFileExt(Project.FileName,'.res')),false);
+end;
+
+function TEWProjectCreator.NewProjectSource(const ProjectName: string): IOTAFile;
+begin
+ //ShowMessage('x:'+ProjectName);
+ if fCodeTemplateFile <> '' then
+ result := CreateOTAFile(LoadStringFromFile(fCodeTemplateFile),ProjectName)
+ else
+ result := nil;
+end;
+
+{ TEWSourceFile }
+
+constructor TEWSourceFile.Create(const iSource: string);
+begin
+ inherited Create();
+ fSource := iSource;
+ fAge := Now;
+end;
+
+function TEWSourceFile.GetAge: TDateTime;
+begin
+ result := fAge;
+end;
+
+function TEWSourceFile.GetSource: string;
+begin
+ result := fSource;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWSampleInfo.dfm b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWSampleInfo.dfm
new file mode 100644
index 0000000..4b59d08
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWSampleInfo.dfm
@@ -0,0 +1,566 @@
+object SampleInfoForm: TSampleInfoForm
+ Left = 283
+ Top = 227
+ AutoScroll = False
+ BorderWidth = 3
+ Caption = 'SampleInfoForm'
+ ClientHeight = 358
+ ClientWidth = 578
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ FormStyle = fsStayOnTop
+ Icon.Data = {
+ 0000010003003030000001002000A8250000360000002020000001002000A810
+ 0000DE2500001010000001002000680400008636000028000000300000006000
+ 0000010020000000000080250000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000001616163F1414144F1212127F1111117F0F0F0F7F0D0D
+ 0D7F0C0C0C7F0A0A0A6F0909093F0808080F0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000001E1E1E1F1C1C
+ 1C6F1A1A1ABF181818FF171717FF151515FF131313FF121212FF101010FF0F0F
+ 0FFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF060606DF0505059F0404044F0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000002222225F202020BF1F1F1FFF1D1D
+ 1DFF1C1C1CFF1A1A1AFF181818FF171717FF151515FF131313FF121212FF1010
+ 10FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF060606FF050505FF0303
+ 03DF0202027F0202020F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000002727273F252525CF242424FF222222FF202020FF1F1F
+ 1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF171717FF151515FF131313FF1212
+ 12FF101010FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF060606FF0505
+ 05FF030303FF020202EF0000007F000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00002C2C2C0F2A2A2AAF292929FF272727FF252525FF242424FF222222FF2020
+ 20FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF171717FF151515FF1313
+ 13FF121212FF101010FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF0606
+ 06FF050505FF030303FF020202FF000000CF0000002F00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000002F2F
+ 2F2F2E2E2EDF2C2C2CFF2A2A2AFF292929FF272727FF252525FF242424FF2222
+ 22FF202020FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF171717FF1515
+ 15FF131313FF121212FF101010FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0AFF0808
+ 08FF060606FF050505FF030303FF020202FF000000FF0000006F000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000003232324F3131
+ 31EF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF252525FF2424
+ 24FF222222FF202020FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF1717
+ 17FF151515FF131313FF121212FF101010FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A
+ 0AFF080808FF060606FF050505FF030303FF020202FF000000FF0000009F0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000003636365F343434FF3232
+ 32FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF2525
+ 25FF242424FF222222FF202020FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1AFF1818
+ 18FF171717FF151515FF131313FF121212FF101010FF0F0F0FFF0D0D0DFF0B0B
+ 0BFF0A0A0AFF080808FF060606FF050505FF030303FF020202FF000000FF0000
+ 009F000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000003939393F373737FF363636FF3434
+ 34FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF2727
+ 27FF252525FF242424FF222222FF202020FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A
+ 1AFF181818FF171717FF151515FF131313FF121212FF101010FF0F0F0FFF0D0D
+ 0DFF0B0B0BFF0A0A0AFF080808FF060606FF050505FF030303FF020202FF0000
+ 00FF0000009F0000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000003C3C3C1F3B3B3BEF393939FF373737FF3636
+ 36FF343434FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF2929
+ 29FF272727FF252525FF242424FF222222FF202020FF1F1F1FFF1D1D1DFF1C1C
+ 1CFF1A1A1AFF181818FF171717FF151515FF131313FF121212FF101010FF0F0F
+ 0FFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF060606FF050505FF030303FF0202
+ 02FF000000FF0000005F00000000000000000000000000000000000000000000
+ 00000000000000000000000000003E3E3ECF3C3C3CFF3B3B3BFF393939FF3737
+ 37FF363636FF343434FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A
+ 2AFF292929FF272727FF252525FF242424FF222222FF202020FF1F1F1FFF1D1D
+ 1DFF1C1C1CFF1A1A1AFF181818FF171717FF151515FF131313FF121212FF1010
+ 10FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF060606FF050505FF0303
+ 03FF020202FF000000FF0000002F000000000000000000000000000000000000
+ 000000000000000000004141417F404040FF3E3E3EFF3C3C3CFF3B3B3BFF3939
+ 39FF373737FF363636FF343434FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C
+ 2CFF2A2A2AFF292929FF272727FF252525FF242424FF222222FF202020FF1F1F
+ 1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF171717FF151515FF131313FF1212
+ 12FF101010FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF060606FF0505
+ 05FF030303FF020202FF000000CF000000000000000000000000000000000000
+ 0000000000004444441F424242EF414141FF404040FF3E3E3EFF3C3C3CFF3B3B
+ 3BFF393939FF373737FF363636FF343434FF323232FF313131FF2F2F2FFF2E2E
+ 2EFF2C2C2CFF2A2A2AFF292929FF272727FF252525FF242424FF222222FF2020
+ 20FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF171717FF151515FF1313
+ 13FF121212FF101010FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF0606
+ 06FF050505FF030303FF020202FF0101015F0000000000000000000000000000
+ 0000000000004646469F444444FF424242FF414141FF404040FF3E3E3EFF3C3C
+ 3CFF3B3B3BFF393939FF373737FF363636FF343434FF323232FF313131FF2F2F
+ 2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF252525FF242424FF2222
+ 22FF202020FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF171717FF1515
+ 15FF131313FF121212FF101010FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0AFF0808
+ 08FF060606FF050505FF030303FF020202EF0202020F00000000000000000000
+ 00004949491F474747FF464646FF444444FF424242FF414141FF404040FF3E3E
+ 3EFF3C3C3CFF3B3B3BFF393939FF373737FF363636FF343434FF323232FF3131
+ 31FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF252525FF2424
+ 24FF222222FF202020FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF1717
+ 17FF151515FF131313FF121212FF101010FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A
+ 0AFF080808FF060606FF050505FF030303FF0202025F00000000000000000000
+ 00004B4B4B7F494949FF474747FF464646FF444444FF424242FF414141FF4040
+ 40FF3E3E3EFF3C3C3CFF3B3B3BFF393939FF373737FF363636FF343434FF3232
+ 32FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF2525
+ 25FF242424FF222222FF202020FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1AFF1818
+ 18FF171717FF151515FF131313FF121212FF101010FF0F0F0FFF0D0D0DFF0B0B
+ 0BFF0A0A0AFF080808FF060606FF050505FF030303DF00000000000000000000
+ 00004C4C4CDF4B4B4BFF494949FF474747FF464646FF444444FF424242FF4141
+ 41FF404040FF3E3E3EFF3C3C3CFF3B3B3BFF393939FF373737FF363636FF3434
+ 34FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF2727
+ 27FF252525FF242424FF222222FF202020FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A
+ 1AFF181818FF171717FF151515FF131313FF121212FF101010FF0F0F0FFF0D0D
+ 0DFF0B0B0BFF0A0A0AFF080808FF060606FF050505FF0404042F000000004F4F
+ 4F2F4E4E4EFF4C4C4CFF4B4B4BFF494949FF474747FF464646FF444444FF4242
+ 42FF414141FF404040FF3E3E3EFF3C3C3CFF3B3B3BFF393939FF373737FF3636
+ 36FF343434FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF2929
+ 29FF272727FF252525FF242424FF222222FF202020FF1F1F1FFF1D1D1DFF1C1C
+ 1CFF1A1A1AFF181818FF171717FF151515FF131313FF121212FF101010FF0F0F
+ 0FFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF060606FF0505058F000000005151
+ 516F505050FF4E4E4EFF4C4C4CFF4B4B4BFF494949FF474747FF464646FF4444
+ 44FF424242FF414141FF404040FF3E3E3EFF3C3C3CFF3B3B3BFF393939FF3737
+ 37FF363636FF343434FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A
+ 2AFF292929FF272727FF252525FF242424FF222222FF202020FF1F1F1FFF1D1D
+ 1DFF1C1C1CFF1A1A1AFF181818FF171717FF151515FF131313FF121212FF1010
+ 10FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF070707CF000000005353
+ 53AF515151FF505050FF4E4E4EFF4C4C4CFF4B4B4BFF494949FF474747FF4646
+ 46FF444444FF424242FF414141FF404040FF3E3E3EFF3C3C3CFF3B3B3BFF3939
+ 39FF373737FF363636FF343434FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C
+ 2CFF2A2A2AFF292929FF272727FF252525FF242424FF222222FF202020FF1F1F
+ 1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF171717FF151515FF131313FF1212
+ 12FF0F170FFF0C230CFF0D0D0DFF0B0B0BFF0A0A0AFF080808FF000000005454
+ 54CF535353FF515151FF505050FF61624CFF7C8246FF4B4B4BFF494949FF4747
+ 47FF464646FF444444FF424242FF414141FF404040FF3E3E3EFF3C3C3CFF3B3B
+ 3BFF393939FF373737FF363636FF343434FF323232FF313131FF2F2F2FFF2E2E
+ 2EFF2C2C2CFF2A2A2AFF292929FF272727FF252525FF242424FF222222FF2020
+ 20FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF171717FF151515FF121A
+ 12FF056A04FF065406FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0AFF0909092F5656
+ 56FF545454FF535353FF515151FF83864AFFB2BA42FF9AA342FF5C5F48FF4949
+ 49FF474747FF464646FF444444FF424242FF414141FF404040FF3E3E3EFF3C3C
+ 3CFF3B3B3BFF393939FF373737FF363636FF343434FF323232FF313131FF2F2F
+ 2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF252525FF242424FF2222
+ 22FF202020FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1AFF181818FF161D15FF0A6C
+ 06FF057F01FF066305FF101010FF0F0F0FFF0D0D0DFF0B0B0BFF0A0A0A3F5858
+ 58FF565656FF545454FF535353FF87874CFFB8BC44FFB2BA42FFABB73FFF7880
+ 44FF494949FF474747FF464646FF444444FF424242FF414141FF404040FF3E3E
+ 3EFF3C3C3CFF3B3B3BFF393939FF373737FF363636FF343434FF323232FF3131
+ 31FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF252525FF2424
+ 24FF222222FF202020FF1F1F1FFF1D1D1DFF1C1C1CFF192019FF0F6E08FF0A81
+ 03FF078002FF057802FF121212FF101010FF0F0F0FFF0D0D0DFF0C0C0C7F5959
+ 59FF585858FF565656FF545454FF8B894EFFBEBE47FFB8BC44FFB2BA42FFABB7
+ 3FFF9AA83FFF5F6446FF474747FF464646FF444444FF424242FF414141FF4040
+ 40FF3E3E3EFF3C3C3CFF3B3B3BFF393939FF373737FF363636FF343434FF3232
+ 32FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF272727FF2525
+ 25FF242424FF222222FF202020FF1F1F1FFF1D1D1DFF156A0CFF108306FF0C82
+ 04FF0A8103FF078002FF131313FF121212FF101010FF0F0F0FFF0D0D0D7F5B5B
+ 5BFF595959FF585858FF565656FF9E994FFFC5C049FFBEBE47FFB8BC44FFB2BA
+ 42FFABB73FFFA5B53DFF7A8541FF4D4E46FF464646FF444444FF424242FF4141
+ 41FF404040FF3E3E3EFF3C3C3CFF3B3B3BFF393939FF373737FF363636FF3434
+ 34FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF292929FF2727
+ 27FF252525FF242424FF222222FF202020FF1C5913FF168508FF138407FF1083
+ 06FF0C8204FF0A8103FF151515FF131313FF121212FF101010FF0F0F0F7F5D5D
+ 5DFF5B5B5BFF595959FF585858FF938D52FFCCC24CFFC5C049FFBEBE47FFB8BC
+ 44FFB2BA42FFABB73FFFA5B53DFF94A63DFF5C6244FF464646FF444444FF4242
+ 42FF414141FF404040FF3E3E3EFF3C3C3CFF3B3B3BFF393939FF373737FF3636
+ 36FF343434FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A2AFF2929
+ 29FF272727FF252525FF242424FF22421BFF1E880BFF1A8609FF168508FF1384
+ 07FF108306FF0C8204FF171717FF151515FF131313FF121212FF1111117F5E5E
+ 5EFF5D5D5DFF5B5B5BFF595959FF988F54FFD2C54EFFCCC24CFFC5C049FFBEBE
+ 47FFB8BC44FFB2BA42FFABB73FFFA5B53DFF9FB33BFF80903DFF4B4C45FF4444
+ 44FF424242FF414141FF404040FF3E3E3EFF506335FF64942AFF64A025FF5E9E
+ 23FF4A6F2AFF363A32FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C2CFF2A2A
+ 2AFF292929FF272727FF263222FF26840FFF22890CFF1E880BFF1A8609FF1685
+ 08FF138407FF126F09FF181818FF171717FF151515FF131313FF1212124F6060
+ 60EF5E5E5EFF5D5D5DFF5B5B5BFF8B8357FFD9C751FFD2C54EFFCCC24CFFC5C0
+ 49FFBEBE47FFB8BC44FFB2BA42FFABB73FFFA5B53DFF9FB33BFF94AA3AFF6D7A
+ 3EFF444444FF424242FF494E3FFF6C8D32FF75A52BFF6FA329FF6AA127FF64A0
+ 25FF5E9E23FF518226FF343434FF323232FF313131FF2F2F2FFF2E2E2EFF2C2C
+ 2CFF2A2A2AFF292929FF2C7416FF2A8C0FFF268B0EFF22890CFF1E880BFF1A86
+ 09FF168508FF156A0CFF1A1A1AFF181818FF171717FF151515FF1414143F6161
+ 61BF606060FF5E5E5EFF5D5D5DFF75705AFFE0C953FFD9C751FFD2C54EFFCCC2
+ 4CFFC5C049FFBEBE47FFB8BC44FFB2BA42FFABB73FFFA5B53DFF9FB33BFF98B1
+ 39FF89A238FF7B9338FF86AB32FF80A930FF7BA72DFF75A52BFF6FA329FF6AA1
+ 27FF64A025FF5E9E23FF48692BFF343434FF323232FF313131FF2F2F2FFF2E2E
+ 2EFF2C2C2CFF305D1FFF338F13FF2E8D11FF2A8C0FFF268B0EFF22890CFF1E88
+ 0BFF1A8609FF1A5113FF1C1C1CFF1A1A1AFF181818FF171717FF1515150F6363
+ 638F616161FF606060FF5E5E5EFF5D5D5DFFDEC456FFE0C953FFD9C751FFD2C5
+ 4EFFCCC24CFFC5C049FFBEBE47FFB8BC44FFB2BA42FFABB73FFFA5B53DFF9FB3
+ 3BFF98B139FF92AF36FF8CAD34FF86AB32FF80A930FF7BA72DFF75A52BFF6FA3
+ 29FF6AA127FF64A025FF5E9E23FF3A4233FF343434FF323232FF313131FF2F2F
+ 2FFF324728FF3C9216FF379014FF338F13FF2E8D11FF2A8C0FFF268B0EFF2289
+ 0CFF1E880BFF1E3919FF1D1D1DFF1C1C1CFF1A1A1AFF181818DF000000006464
+ 644F636363FF616161FF606060FF5E5E5EFFB6A35AFFE7CB56FFE0C953FFD9C7
+ 51FFD2C54EFFCCC24CFFC5C049FFBEBE47FFB8BC44FFB2BA42FFABB73FFFA5B5
+ 3DFF9FB33BFF98B139FF92AF36FF8CAD34FF86AB32FF80A930FF7BA72DFF75A5
+ 2BFF6FA329FF6AA127FF64A025FF558428FF363636FF343434FF323232FF3237
+ 2FFF448F1BFF409318FF3C9216FF379014FF338F13FF2E8D11FF2A8C0FFF268B
+ 0EFF22820EFF202020FF1F1F1FFF1D1D1DFF1C1C1CFF1A1A1A9F000000006666
+ 660F656565FF636363FF616161FF606060FF837B5DFFEDCE58FFE7CB56FFE0C9
+ 53FFD9C751FFD2C54EFFCCC24CFFC5C049FFBEBE47FFB8BC44FFB2BA42FFABB7
+ 3FFFA5B53DFF9FB33BFF98B139FF92AF36FF8CAD34FF86AB32FF80A930FF7BA7
+ 2DFF75A52BFF6FA329FF6AA127FF64A025FF50772BFF363636FF363A33FF4A85
+ 21FF4A971BFF459519FF409318FF3C9216FF379014FF338F13FF2E8D11FF2A8C
+ 0FFF256416FF222222FF202020FF1F1F1FFF1D1D1DFF1C1C1C5F000000000000
+ 0000666666AF656565FF636363FF616161FF606060FFE1C25BFFEDCE58FFE7CB
+ 56FFE0C953FFD9C751FFD2C54EFFCCC24CFFC5C049FFBEBE47FFB8BC44FFB2BA
+ 42FFABB73FFFA5B53DFF9FB33BFF98B139FF92AF36FF8CAD34FF86AB32FF80A9
+ 30FF7BA72DFF75A52BFF6FA329FF6AA127FF64A025FF578B27FF579522FF549A
+ 1FFF4F981DFF4A971BFF459519FF409318FF3C9216FF379014FF338F13FF2E8D
+ 11FF263222FF242424FF222222FF202020FF1F1F1FFF1E1E1E0F000000000000
+ 00006767674F666666FF656565FF636363FF616161FF90845FFFF4D05BFFEDCE
+ 58FFE7CB56FFE0C953FFD9C751FFD2C54EFFCCC24CFFC5C049FFBEBE47FFB8BC
+ 44FFB2BA42FFABB73FFFA5B53DFF9FB33BFF98B139FF92AF36FF8CAD34FF86AB
+ 32FF80A930FF7BA72DFF75A52BFF6FA329FF6AA127FF64A025FF5E9E23FF599C
+ 21FF549A1FFF4F981DFF4A971BFF459519FF409318FF3C9216FF379014FF2F68
+ 1BFF272727FF252525FF242424FF222222FF2121219F00000000000000000000
+ 000000000000686868DF666666FF656565FF636363FF616161FFD4B65EFFF4D0
+ 5BFFEDCE58FFE7CB56FFE0C953FFD9C751FFD2C54EFFCCC24CFFC5C049FFBEBE
+ 47FFB8BC44FFB2BA42FFABB73FFFA5B53DFF9FB33BFF98B139FF92AF36FF8CAD
+ 34FF86AB32FF80A930FF7BA72DFF75A52BFF6FA329FF6AA127FF64A025FF5E9E
+ 23FF599C21FF549A1FFF4F981DFF4A971BFF459519FF409318FF3B8B17FF2C37
+ 27FF292929FF272727FF252525FF242424FF2222221F00000000000000000000
+ 0000000000006969695F686868FF666666FF656565FF636363FF757061FFF2CB
+ 5DFFF4D05BFFEDCE58FFE7CB56FFE0C953FFD9C751FFD2C54EFFCCC24CFFC5C0
+ 49FFBEBE47FFB8BC44FFB2BA42FFABB73FFFA5B53DFF9FB33BFF98B139FF92AF
+ 36FF8CAD34FF86AB32FF80A930FF7BA72DFF75A52BFF6FA329FF6AA127FF64A0
+ 25FF5E9E23FF599C21FF549A1FFF4F981DFF4A971BFF459519FF345425FF2C2C
+ 2CFF2A2A2AFF292929FF272727FF2525259F0000000000000000000000000000
+ 00000000000000000000696969BF686868FF666666FF656565FF636363FF9385
+ 61FFFBD35DFFF4D05BFFEDCE58FFE7CB56FFE0C953FFD9C751FFD2C54EFFCCC2
+ 4CFFC5C049FFBEBE47FFB8BC44FFB2BA42FFABB73FFFA5B53DFF9FB33BFF98B1
+ 39FF92AF36FF8CAD34FF86AB32FF80A930FF7BA72DFF75A52BFF6FA329FF6AA1
+ 27FF64A025FF5E9E23FF599C21FF549A1FFF4F981DFF417023FF2F2F2FFF2E2E
+ 2EFF2C2C2CFF2A2A2AFF292929FF2727271F0000000000000000000000000000
+ 000000000000000000006B6B6B2F6A6A6AFF686868FF666666FF656565FF6363
+ 63FF9D8C61FFFBD35DFFF4D05BFFEDCE58FFE7CB56FFE0C953FFD9C751FFD2C5
+ 4EFFCCC24CFFC5C049FFBEBE47FFB8BC44FFB2BA42FFABB73FFFA5B53DFF9FB3
+ 3BFF98B139FF92AF36FF8CAD34FF86AB32FF80A930FF7BA72DFF75A52BFF6FA3
+ 29FF6AA127FF64A025FF5E9E23FF599C21FF4C8124FF323232FF313131FF2F2F
+ 2FFF2E2E2EFF2C2C2CFF2A2A2A7F000000000000000000000000000000000000
+ 00000000000000000000000000006B6B6B6F6A6A6AFF686868FF666666FF6565
+ 65FF636363FF9D8C61FFFBD35DFFF4D05BFFEDCE58FFE7CB56FFE0C953FFD9C7
+ 51FFD2C54EFFCCC24CFFC5C049FFBEBE47FFB8BC44FFB2BA42FFABB73FFFA5B5
+ 3DFF9FB33BFF98B139FF92AF36FF8CAD34FF86AB32FF80A930FF7BA72DFF75A5
+ 2BFF6FA329FF6AA127FF64A025FF50772BFF383C34FF343434FF323232FF3131
+ 31FF2F2F2FFF2E2E2EBF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000006B6B6B9F6A6A6AFF686868FF6666
+ 66FF656565FF636363FF938561FFF2CB5DFFF4D05BFFEDCE58FFE7CB56FFE0C9
+ 53FFD9C751FFD2C54EFFCCC24CFFC5C049FFBEBE47FFB8BC44FFB2BA42FFABB7
+ 3FFFA5B53DFF9FB33BFF98B139FF92AF36FF8CAD34FF86AB32FF80A930FF7BA7
+ 2DFF75A52BFF6FA329FF557430FF393939FF373737FF363636FF343434FF3232
+ 32FF313131EF3030300F00000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000006B6B6BCF6A6A6AFF6868
+ 68FF666666FF656565FF636363FF6B6961FFCAAF5EFFF4D05BFFEDCE58FFE7CB
+ 56FFE0C953FFD9C751FFD2C54EFFCCC24CFFC5C049FFBEBE47FFB8BC44FFB2BA
+ 42FFABB73FFFA5B53DFF9FB33BFF98B139FF92AF36FF8CAD34FF86AB32FF80A9
+ 30FF739A30FF4B5839FF3C3C3CFF3B3B3BFF393939FF373737FF363636FF3434
+ 34EF3232322F0000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000006B6B6B0F6B6B6BBF6A6A
+ 6AFF686868FF666666FF656565FF636363FF616161FF867D5FFFCEB45BFFEDCE
+ 58FFE7CB56FFE0C953FFD9C751FFD2C54EFFCCC24CFFC5C049FFBEBE47FFB8BC
+ 44FFB2BA42FFABB73FFFA5B53DFF9FB33BFF98B139FF92AF36FF83A036FF6477
+ 3AFF414141FF404040FF3E3E3EFF3C3C3CFF3B3B3BFF393939FF373737EF3636
+ 362F000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000006B6B
+ 6B9F6A6A6AFF686868FF666666FF656565FF636363FF616161FF606060FF7A74
+ 5EFFAD9C5AFFD5BD56FFE0C953FFD9C751FFD2C54EFFCCC24CFFC5C049FFBEBE
+ 47FFB8BC44FFB2BA42FFABB73FFF9FAF3EFF83923FFF606843FF464646FF4444
+ 44FF424242FF414141FF404040FF3E3E3EFF3C3C3CFF3B3B3BCF3939392F0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00006B6B6B6F6A6A6AEF686868FF666666FF656565FF636363FF616161FF6060
+ 60FF5E5E5EFF5D5D5DFF6C695AFF7A7558FF988F54FF938D52FF8F8B50FF8B89
+ 4EFF87874CFF70714CFF61624CFF4C4C4CFF4B4B4BFF494949FF474747FF4646
+ 46FF444444FF424242FF414141FF404040FF3E3E3EAF3D3D3D0F000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000006B6B6B1F696969BF686868FF666666FF656565FF636363FF6161
+ 61FF606060FF5E5E5EFF5D5D5DFF5B5B5BFF595959FF585858FF565656FF5454
+ 54FF535353FF515151FF505050FF4E4E4EFF4C4C4CFF4B4B4BFF494949FF4747
+ 47FF464646FF444444FF424242DF4141414F0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000006969693F686868BF666666FF656565FF6363
+ 63FF616161FF606060FF5E5E5EFF5D5D5DFF5B5B5BFF595959FF585858FF5656
+ 56FF545454FF535353FF515151FF505050FF4E4E4EFF4C4C4CFF4B4B4BFF4949
+ 49FF474747EF4646467F4545450F000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000006767673F6666669F6565
+ 65EF636363FF616161FF606060FF5E5E5EFF5D5D5DFF5B5B5BFF595959FF5858
+ 58FF565656FF545454FF535353FF515151FF505050FF4E4E4EFF4C4C4CAF4A4A
+ 4A5F000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00006464643F6363637F616161AF606060CF5E5E5EFF5D5D5DFF5B5B5BFF5959
+ 59FF585858FF565656DF545454BF5252528F5151514F5050500F000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000FFFF
+ E007FFFF0000FFFE0000FFFF0000FFF800001FFF0000FFE000000FFF0000FF80
+ 000003FF0000FF00000001FF0000FE00000000FF0000FC000000007F0000F800
+ 0000003F0000F0000000001F0000F0000000000F0000E0000000000F0000C000
+ 000000070000C000000000030000800000000003000080000000000300008000
+ 0000000100000000000000010000000000000001000000000000000100000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000010000000000000001000000000000000100008000
+ 0000000100008000000000030000C000000000030000C000000000070000E000
+ 000000070000E0000000000F0000F0000000001F0000F8000000001F0000FC00
+ 0000003F0000FC000000007F0000FF00000000FF0000FF80000001FF0000FFC0
+ 000007FF0000FFF000000FFF0000FFFC00007FFF0000FFFF8001FFFF00002800
+ 0000200000004000000001002000000000008010000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000001A1A1A2F1717176F1515158F1212
+ 12BF101010BF0D0D0DBF0B0B0BAF0909097F0707074F0505050F000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000002424240F2121217F1E1E1EDF1C1C1CFF191919FF171717FF1414
+ 14FF121212FF101010FF0D0D0DFF0B0B0BFF080808FF060606FF040404AF0202
+ 023F000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00002828287F252525EF232323FF212121FF1E1E1EFF1C1C1CFF191919FF1717
+ 17FF141414FF121212FF101010FF0D0D0DFF0B0B0BFF080808FF060606FF0303
+ 03FF010101BF0000002F00000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000003030301F2D2D
+ 2DCF2A2A2AFF282828FF252525FF232323FF212121FF1E1E1EFF1C1C1CFF1919
+ 19FF171717FF141414FF121212FF101010FF0D0D0DFF0B0B0BFF080808FF0606
+ 06FF030303FF010101FF0000007F000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000003434342F323232EF2F2F
+ 2FFF2D2D2DFF2A2A2AFF282828FF252525FF232323FF212121FF1E1E1EFF1C1C
+ 1CFF191919FF171717FF141414FF121212FF101010FF0D0D0DFF0B0B0BFF0808
+ 08FF060606FF030303FF010101FF0000009F0000000000000000000000000000
+ 0000000000000000000000000000000000003939392F373737EF343434FF3232
+ 32FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF252525FF232323FF212121FF1E1E
+ 1EFF1C1C1CFF191919FF171717FF141414FF121212FF101010FF0D0D0DFF0B0B
+ 0BFF080808FF060606FF030303FF010101FF0000009F00000000000000000000
+ 00000000000000000000000000003E3E3E0F3C3C3CCF393939FF373737FF3434
+ 34FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF252525FF232323FF2121
+ 21FF1E1E1EFF1C1C1CFF191919FF171717FF141414FF121212FF101010FF0D0D
+ 0DFF0B0B0BFF080808FF060606FF030303FF010101FF0000007F000000000000
+ 00000000000000000000000000004040408F3E3E3EFF3C3C3CFF393939FF3737
+ 37FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF252525FF2323
+ 23FF212121FF1E1E1EFF1C1C1CFF191919FF171717FF141414FF121212FF1010
+ 10FF0D0D0DFF0B0B0BFF080808FF060606FF030303FF010101FF0000002F0000
+ 000000000000000000004545453F434343FF404040FF3E3E3EFF3C3C3CFF3939
+ 39FF373737FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF2525
+ 25FF232323FF212121FF1E1E1EFF1C1C1CFF191919FF171717FF141414FF1212
+ 12FF101010FF0D0D0DFF0B0B0BFF080808FF060606FF030303FF010101BF0000
+ 00000000000000000000474747BF454545FF434343FF404040FF3E3E3EFF3C3C
+ 3CFF393939FF373737FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF2828
+ 28FF252525FF232323FF212121FF1E1E1EFF1C1C1CFF191919FF171717FF1414
+ 14FF121212FF101010FF0D0D0DFF0B0B0BFF080808FF060606FF030303FF0202
+ 023F000000004C4C4C1F4A4A4AFF484848FF454545FF434343FF404040FF3E3E
+ 3EFF3C3C3CFF393939FF373737FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A
+ 2AFF282828FF252525FF232323FF212121FF1E1E1EFF1C1C1CFF191919FF1717
+ 17FF141414FF121212FF101010FF0D0D0DFF0B0B0BFF080808FF060606FF0404
+ 04AF000000004E4E4E6F4D4D4DFF4A4A4AFF484848FF454545FF434343FF4040
+ 40FF3E3E3EFF3C3C3CFF393939FF373737FF343434FF323232FF2F2F2FFF2D2D
+ 2DFF2A2A2AFF282828FF252525FF232323FF212121FF1E1E1EFF1C1C1CFF1919
+ 19FF171717FF141414FF121212FF101010FF0D0D0DFF0B0B0BFF080808FF0606
+ 06FF0505050F515151BF4F4F4FFF4D4D4DFF4A4A4AFF484848FF454545FF4343
+ 43FF404040FF3E3E3EFF3C3C3CFF393939FF373737FF343434FF323232FF2F2F
+ 2FFF2D2D2DFF2A2A2AFF282828FF252525FF232323FF212121FF1E1E1EFF1C1C
+ 1CFF191919FF171717FF141414FF121212FF101010FF0D0D0DFF0B0B0BFF0808
+ 08FF0707073F545454EF515151FF4F4F4FFF777B47FF4A4A4AFF484848FF4545
+ 45FF434343FF404040FF3E3E3EFF3C3C3CFF393939FF373737FF343434FF3232
+ 32FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF252525FF232323FF212121FF1E1E
+ 1EFF1C1C1CFF191919FF171717FF141414FF0C3B0BFF093F08FF0D0D0DFF0B0B
+ 0BFF0909097F565656FF545454FF515151FFB5BB44FF9BA442FF5B5E47FF4848
+ 48FF454545FF434343FF404040FF3E3E3EFF3C3C3CFF393939FF373737FF3434
+ 34FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF252525FF232323FF2121
+ 21FF1E1E1EFF1C1C1CFF191919FF0F530CFF068002FF094F08FF101010FF0D0D
+ 0DFF0B0B0B8F595959FF565656FF545454FFBFBE47FFB5BB44FFACB840FF7D86
+ 43FF4D4E47FF454545FF434343FF404040FF3E3E3EFF3C3C3CFF393939FF3737
+ 37FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF252525FF2323
+ 23FF212121FF1E1E1EFF194314FF0E8305FF0A8103FF0A6506FF121212FF1010
+ 10FF0D0D0DBF5B5B5BFF595959FF565656FFC9C24BFFBFBE47FFB5BB44FFACB8
+ 40FF98A73EFF5D6244FF454545FF434343FF404040FF3E3E3EFF3C3C3CFF3939
+ 39FF373737FF343434FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF282828FF2525
+ 25FF232323FF203A1BFF198609FF138407FF0E8305FF0D6608FF141414FF1212
+ 12FF101010BF5E5E5EFF5B5B5BFF595959FFD3C54FFFC9C24BFFBFBE47FFB5BB
+ 44FFACB840FFA2B43CFF7B8A3EFF4A4C44FF434343FF404040FF3E3E3EFF4F62
+ 34FF5B862AFF517D29FF3B4730FF323232FF2F2F2FFF2D2D2DFF2A2A2AFF2828
+ 28FF262C24FF24830FFF1E880BFF198609FF138407FF135B0DFF171717FF1414
+ 14FF1212129F606060FF5E5E5EFF5B5B5BFFD5C153FFD3C54FFFC9C24BFFBFBE
+ 47FFB5BB44FFACB840FFA2B43CFF94AB3AFF67733FFF58633DFF6F8E33FF76A5
+ 2CFF6DA228FF65A025FF5A9724FF363B33FF323232FF2F2F2FFF2D2D2DFF2A2A
+ 2AFF2E6E19FF2A8C10FF248A0DFF1E880BFF198609FF185011FF191919FF1717
+ 17FF1515157F626262BF606060FF5E5E5EFFBBA857FFDDC852FFD3C54FFFC9C2
+ 4BFFBFBE47FFB5BB44FFACB840FFA2B43CFF99B139FF90AE35FF87AB32FF7EA8
+ 2FFF76A52CFF6DA228FF65A025FF517D29FF343434FF323232FF2F2F2FFF3459
+ 23FF389115FF318E12FF2A8C10FF248A0DFF1E880BFF1D3819FF1C1C1CFF1919
+ 19FF1717175F6464648F626262FF606060FF94885CFFE7CC56FFDDC852FFD3C5
+ 4FFFC9C24BFFBFBE47FFB5BB44FFACB840FFA2B43CFF99B139FF90AE35FF87AB
+ 32FF7EA82FFF76A52CFF6DA228FF65A025FF465D2FFF343434FF37452EFF4695
+ 1AFF3F9317FF389115FF318E12FF2A8C10FF24830FFF212121FF1E1E1EFF1C1C
+ 1CFF1919191F6666662F656565FF626262FF6A6760FFE8C85AFFE7CC56FFDDC8
+ 52FFD3C54FFFC9C24BFFBFBE47FFB5BB44FFACB840FFA2B43CFF99B139FF90AE
+ 35FF87AB32FF7EA82FFF76A52CFF6DA228FF65A025FF4F772AFF539421FF4E98
+ 1DFF46951AFF3F9317FF389115FF318E12FF296618FF232323FF212121FF1E1E
+ 1ECF0000000000000000676767DF656565FF626262FFAD995FFFF2D05AFFE7CC
+ 56FFDDC852FFD3C54FFFC9C24BFFBFBE47FFB5BB44FFACB840FFA2B43CFF99B1
+ 39FF90AE35FF87AB32FF7EA82FFF76A52CFF6DA228FF65A025FF5D9D22FF559A
+ 1FFF4E981DFF46951AFF3F9317FF378A16FF293525FF252525FF232323FF2121
+ 215F00000000000000006969695F676767FF656565FF6C6A62FFE8C45EFFF2D0
+ 5AFFE7CC56FFDDC852FFD3C54FFFC9C24BFFBFBE47FFB5BB44FFACB840FFA2B4
+ 3CFF99B139FF90AE35FF87AB32FF7EA82FFF76A52CFF6DA228FF65A025FF5D9D
+ 22FF559A1FFF4E981DFF46951AFF355923FF2A2A2AFF282828FF252525DF2424
+ 240F000000000000000000000000696969CF676767FF656565FF807862FFF2CC
+ 5DFFF2D05AFFE7CC56FFDDC852FFD3C54FFFC9C24BFFBFBE47FFB5BB44FFACB8
+ 40FFA2B43CFF99B139FF90AE35FF87AB32FF7EA82FFF76A52CFF6DA228FF65A0
+ 25FF5D9D22FF559A1FFF437124FF2F2F2FFF2D2D2DFF2A2A2AFF2929295F0000
+ 00000000000000000000000000006B6B6B2F6A6A6AFF676767FF656565FF8078
+ 62FFF2CC5DFFF2D05AFFE7CC56FFDDC852FFD3C54FFFC9C24BFFBFBE47FFB5BB
+ 44FFACB840FFA2B43CFF99B139FF90AE35FF87AB32FF7EA82FFF76A52CFF6DA2
+ 28FF65A025FF517D29FF363B33FF323232FF2F2F2FFF2D2D2DAF000000000000
+ 0000000000000000000000000000000000006B6B6B5F6A6A6AFF676767FF6565
+ 65FF807862FFDEBD5EFFF2D05AFFE7CC56FFDDC852FFD3C54FFFC9C24BFFBFBE
+ 47FFB5BB44FFACB840FFA2B43CFF99B139FF90AE35FF87AB32FF7EA82FFF76A5
+ 2CFF577531FF393939FF373737FF343434FF323232CF3030300F000000000000
+ 000000000000000000000000000000000000000000006B6B6B5F6A6A6AFF6767
+ 67FF656565FF626262FFAD995FFFE8C85AFFE7CC56FFDDC852FFD3C54FFFC9C2
+ 4BFFBFBE47FFB5BB44FFACB840FFA2B43CFF99B139FF90AE35FF769136FF505A
+ 3CFF3E3E3EFF3C3C3CFF393939FF363636DF3535350F00000000000000000000
+ 00000000000000000000000000000000000000000000000000006B6B6B5F6A6A
+ 6AEF676767FF656565FF626262FF6A6760FF94885CFFBBA857FFCCBA53FFD3C5
+ 4FFFC9C24BFFBFBE47FFB5BB44FF939D43FF7B8642FF575B45FF454545FF4343
+ 43FF404040FF3E3E3EFF3C3C3CCF3939390F0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000006B6B
+ 6B2F696969BF676767FF656565FF626262FF606060FF5E5E5EFF5B5B5BFF5959
+ 59FF565656FF545454FF515151FF4F4F4FFF4D4D4DFF4A4A4AFF484848FF4545
+ 45FF434343FF4040407F00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000006969695F676767CF656565FF626262FF606060FF5E5E5EFF5B5B
+ 5BFF595959FF565656FF545454FF515151FF4F4F4FFF4D4D4DFF4A4A4AFF4747
+ 479F4545451F0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000006666662F6464647F626262BF606060EF5E5E
+ 5EFF5B5B5BFF595959FF565656FF545454CF5151519F4E4E4E5F4D4D4D0F0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000FFE007FFFF0001FFFE00007FF800003FF000001FE000000FC000
+ 0007C00000038000000380000001000000010000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000018000
+ 000180000001C0000003C0000007E0000007F000000FF800001FFC00007FFF00
+ 00FFFFC003FF2800000010000000200000000100200000000000400400000000
+ 0000000000000000000000000000000000000000000000000000000000002222
+ 223F1D1D1D9F181818CF131313FF0E0E0EFF090909BF0505058F0202021F0000
+ 000000000000000000000000000000000000000000003030300F2B2B2BAF2626
+ 26FF212121FF1C1C1CFF171717FF131313FF0E0E0EFF090909FF040404FF0101
+ 017F000000000000000000000000000000003A3A3A0F353535CF303030FF2B2B
+ 2BFF262626FF212121FF1C1C1CFF171717FF131313FF0E0E0EFF090909FF0404
+ 04FF0101019F0000000000000000000000003E3E3EBF3A3A3AFF353535FF3030
+ 30FF2B2B2BFF262626FF212121FF1C1C1CFF171717FF131313FF0E0E0EFF0909
+ 09FF040404FF0101017F000000004747475F434343FF3E3E3EFF3A3A3AFF3535
+ 35FF303030FF2B2B2BFF262626FF212121FF1C1C1CFF171717FF131313FF0E0E
+ 0EFF090909FF040404FF0202021F4D4D4DAF484848FF434343FF3E3E3EFF3A3A
+ 3AFF353535FF303030FF2B2B2BFF262626FF212121FF1C1C1CFF171717FF1313
+ 13FF0E0E0EFF090909FF0505057F525252FF595B4CFF484848FF434343FF3E3E
+ 3EFF3A3A3AFF353535FF303030FF2B2B2BFF262626FF212121FF1C1C1CFF1717
+ 17FF10270FFF0C1B0CFF090909BF575757FF88884DFF9DA443FF5F6345FF4343
+ 43FF3E3E3EFF3A3A3AFF353535FF303030FF2B2B2BFF262626FF212121FF1B30
+ 18FF0C7B05FF0C420BFF0E0E0EEF5C5C5CFF948E53FFC2BF48FFAEB841FF7984
+ 40FF484A42FF3E3E3EFF4C6032FF41552EFF303030FF2B2B2BFF262C25FF207C
+ 0EFF158508FF12460FFF131313EF616161FFA19459FFD6C64FFFC2BF48FFAEB8
+ 41FF97AB3BFF819F35FF78A62DFF67A126FF3F4E30FF303030FF346B1DFF2C8D
+ 10FF20890CFF1B3617FF181818BF656565CF7D7660FFEACD57FFD6C64FFFC2BF
+ 48FFAEB841FF9BB23AFF89AC33FF78A62DFF659A28FF496E29FF48961AFF3991
+ 15FF2C8611FF212121FF1D1D1D8F6969695F656565FFD5B65EFFEACD57FFD6C6
+ 4FFFC2BF48FFAEB841FF9BB23AFF89AC33FF78A62DFF67A126FF579B20FF4896
+ 1AFF335E20FF262626FF2222221F000000006A6A6ACF6F6D65FFDEBE5EFFEACD
+ 57FFD6C64FFFC2BF48FFAEB841FF9BB23AFF89AC33FF78A62DFF67A126FF4C7B
+ 26FF303030FF2B2B2B8F00000000000000006B6B6B2F6A6A6AEF6F6D65FFD5B6
+ 5EFFEACD57FFD6C64FFFC2BF48FFAEB841FF9BB23AFF89AC33FF5E7934FF3A3A
+ 3AFF353535CF3030300F0000000000000000000000006B6B6B2F6A6A6ACF6565
+ 65FF7D7660FFA19459FF948E53FF88884DFF767C47FF525546FF434343FF3E3E
+ 3EAF3A3A3A0F0000000000000000000000000000000000000000000000006969
+ 695F656565BF616161FF5C5C5CFF575757FF525252EF4D4D4DAF4848483F0000
+ 0000000000000000000000000000F00F0000C007000080030000800100000000
+ 0000000000000000000000000000000000000000000000000000000000008001
+ 000080010000C0030000F00F0000}
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnClose = FormClose
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Panel1: TPanel
+ Left = 0
+ Top = 333
+ Width = 578
+ Height = 25
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 0
+ DesignSize = (
+ 578
+ 25)
+ object sbPrint: TSpeedButton
+ Left = 0
+ Top = 4
+ Width = 52
+ Height = 21
+ Caption = 'Print'
+ Flat = True
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FF6C6A6A6C6A6AFF00FFFF00FF6C6A6A6C6A6AFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6C6A6AAAA7A7A19F9F6C6A6A6C
+ 6A6A6C6A6AE5E3E36C6A6A6C6A6A6C6A6AFF00FFFF00FFFF00FFFF00FFFF00FF
+ 6C6A6ADAD9D9A19F9FA19F9FA19F9F3736363535356C6D6DBFBFBFE1E2E2B7B6
+ B66C6A6A6C6A6A6C6A6AFF00FF6C6A6AD4D3D3CACACA8E8C8C8E8C8C8E8C8C3C
+ 3B3B0A090A0707070B0B0B0707077A7A7ABBBBBB6C6A6AFF00FF6C6A6ACACACA
+ CACACA8E8C8CD7D4D4CECBCBBFBCBCB1AFAFA3A0A08886865E5B5C0707070909
+ 090808086C6A6A7673736C6A6ACACACA8E8C8CEFEEEEFFFEFEFBFAFAE3E0E1DE
+ DEDEDEDDDDCFCECEBDBCBCADABAB8B89895856567A78787573736C6A6A8E8C8C
+ FFFFFFFEFCFCFAFAFAD5D4D5989193A09899B2ABACC4C0C1D7D7D7D8D8D8C7C6
+ C6B7B6B6918F8F6C6969FF00FF6C6A6A6C6A6AEDEBEBB1A6A77A6F728A838896
+ 92959690919D97989A93959E9899BBBABAD1D1D1C2C2C26C6A6AFF00FFFF00FF
+ FF00FF6C6A6ABB897FA7876D8B6F647D67606F62657973798F8B8EA9A3A4CBCA
+ CAC1C1C16C6A6AFF00FFFF00FFFF00FFFF00FFFF00FFBD8281FFE3B4FFD39FE9
+ B281C99973BA916CBD8281807D7E6C6A6A6C6A6AFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFBD8281FFE0B8FFD3A7FFD09DFFCE90FFC688BD8281FF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC08683FFE7CFFFE0C0FFD9B2FF
+ D3A5FFD099BD8281FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFBD8281FEEBD8FFE6CCFFDEBDFFD8B1FED3A4BD8281FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFBD8281FFFFF2FFFFF2FFEBD8FFE5CAFF
+ E1BDF3C7A7BD8281FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ BD8281BD8281BD8281FBEFE2FBE3CFFBDDC2BD8281FF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFBD8281BD8281BD
+ 8281FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ OnClick = sbPrintClick
+ end
+ object cb_DontShow: TCheckBox
+ Left = 451
+ Top = 5
+ Width = 126
+ Height = 18
+ Anchors = [akTop, akRight]
+ Caption = 'Don'#39't Show This Again'
+ TabOrder = 0
+ OnClick = cb_DontShowClick
+ end
+ end
+ object wb_Browser: TWebBrowser
+ Left = 0
+ Top = 0
+ Width = 578
+ Height = 333
+ Align = alClient
+ TabOrder = 1
+ ControlData = {
+ 4C000000BD3B00006B2200000000000000000000000000000000000000000000
+ 000000004C000000000000000000000001000000E0D057007335CF11AE690800
+ 2B2E126208000000000000004C0000000114020000000000C000000000000046
+ 8000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000100000000000000000000000000000000000000}
+ end
+end
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWSampleInfo.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWSampleInfo.pas
new file mode 100644
index 0000000..7eeb3d5
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWSampleInfo.pas
@@ -0,0 +1,140 @@
+unit uEWSampleInfo;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, OleCtrls, SHDocVw, ExtCtrls, ToolsApi, Buttons;
+
+type
+ TSampleInfoForm = class(TForm)
+ Panel1: TPanel;
+ wb_Browser: TWebBrowser;
+ cb_DontShow: TCheckBox;
+ sbPrint: TSpeedButton;
+ procedure FormClose(Sender: TObject; var Action: TCloseAction);
+ procedure sbPrintClick(Sender: TObject);
+ procedure cb_DontShowClick(Sender: TObject);
+ private
+ fIniFile: string;
+ public
+ class procedure RunSampleInfo(const aFilename:string);
+ end;
+
+ TProjectNotification = class(TInterfacedObject, IOTAIDENotifier)
+ public
+ procedure AfterCompile(Succeeded: Boolean);
+ procedure AfterSave;
+ procedure BeforeCompile(const Project: IOTAProject; var Cancel: Boolean);
+ procedure BeforeSave;
+ procedure Destroyed;
+ procedure FileNotification(NotifyCode: TOTAFileNotification; const FileName: String; var Cancel: Boolean);
+ procedure Modified;
+ end;
+
+implementation
+
+uses
+ IniFiles;
+
+{$R *.dfm}
+
+{ TProjectNotification }
+
+procedure TProjectNotification.AfterCompile(Succeeded: Boolean);
+begin
+end;
+
+procedure TProjectNotification.AfterSave;
+begin
+end;
+
+procedure TProjectNotification.BeforeCompile(const Project: IOTAProject; var Cancel: Boolean);
+begin
+end;
+
+procedure TProjectNotification.BeforeSave;
+begin
+end;
+
+procedure TProjectNotification.Destroyed;
+begin
+end;
+
+procedure TProjectNotification.FileNotification(NotifyCode: TOTAFileNotification; const FileName: String; var Cancel: Boolean);
+var
+ lFileExt: string;
+begin
+ case NotifyCode of { }
+ ofnFileOpened:begin
+ lFileExt := ExtractFileExt(Filename);
+ if SameText(lFileExt,'.dpr') or SameText(lFileExt,'.dpk') or SameText(lFileExt,'.bpg') or SameText(lFileExt,'.bdsproj') or SameText(lFileExt,'.bdsgroup') or SameText(lFileExt,'.dproj') or SameText(lFileExt,'.groupproj') then begin
+ TSampleInfoForm.RunSampleInfo(Filename);
+ end;
+ end;
+ end; { case }
+end;
+
+procedure TProjectNotification.Modified;
+begin
+end;
+
+{ TSampleInfoForm }
+
+var
+ gLastForm: TSampleInfoForm;
+
+class procedure TSampleInfoForm.RunSampleInfo(const aFilename: string);
+var
+ lHelpFile,lIniFile: string;
+begin
+ lHelpFile := ChangeFileExt(aFilename,'.sample.html');
+ lIniFile := ChangeFileExt(lHelpFile,'.ini');
+ if FileExists(lHelpFile) then begin
+
+ with TMemIniFile.Create(lIniFile) do try
+ if ReadBool('Options','DontShow',false) then exit;
+ finally
+ Free();
+ end;
+
+ FreeAndNil(gLastForm);
+ gLastForm := self.Create(Application);
+ with gLastForm do begin
+ Caption := 'Helpful tips about the '+ChangeFileExt(ExtractFileName(aFilename),'')+' project';
+ wb_Browser.Navigate(lHelpFile);
+ fIniFile := lIniFile;
+ Show();
+ end;
+ end;
+end;
+
+procedure TSampleInfoForm.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+ gLastForm := nil;
+ Release();
+end;
+
+var gNotify:integer;
+
+procedure TSampleInfoForm.sbPrintClick(Sender: TObject);
+var temp : OleVariant;
+begin
+ wb_Browser.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, temp, temp);
+end;
+
+procedure TSampleInfoForm.cb_DontShowClick(Sender: TObject);
+begin
+ with TMemIniFile.Create(fIniFile) do try
+ WriteBool('Options','DontShow',cb_DontShow.Checked);
+ UpdateFile();
+ finally
+ Free();
+ end;
+end;
+
+initialization
+ gNotify := (BorlandIDEServices as IOTAServices).AddNotifier(TProjectNotification.Create());
+finalization
+ (BorlandIDEServices as IOTAServices).RemoveNotifier(gNotify);
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWStringTools.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWStringTools.pas
new file mode 100644
index 0000000..2397b22
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWStringTools.pas
@@ -0,0 +1,49 @@
+unit uEWStringTools;
+
+{$I Everwood.inc}
+
+interface
+
+type
+ TStringArray = array of string;
+
+function SplitString(const iString:string; iSeparator:char):TStringArray; overload;
+
+implementation
+
+uses
+ SysUtils;
+
+function SplitString(const iString:string; iSeparator:char):TStringArray;
+var i,Len,Start,Count:integer;
+begin
+ if iString = '' then begin
+ SetLength(result,0);
+ exit;
+ end;
+
+ SetLength(result,2);
+ i := 1;//0;
+ Len := Length(iString);
+ Start := 1;
+ Count := 0;
+ while i <= Len do begin
+ if iString[i] = iSeparator then begin
+ if Count > Length(result)-1 then SetLength(result,Length(result)*2);
+ result[Count] := Trim(Copy(iString,Start,i-Start));
+ Start := i+1;
+ inc(Count);
+ end;
+ inc(i);
+ end;
+
+ if Count < Length(result)+1 then SetLength(result,Length(result)*2);
+ result[Count] := Trim(Copy(iString,Start,Len-Start+1));
+ inc(Count);
+
+ if Count > 0 then begin
+ SetLength(result,Count);
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWTools.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWTools.pas
new file mode 100644
index 0000000..c9bbb02
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWTools.pas
@@ -0,0 +1,83 @@
+unit uEWTools;
+
+{$I Everwood.inc}
+
+interface
+{$IFDEF MSWINDOWS}
+uses
+ Windows;
+function IsKeyDown(VirtualKeyCode:Integer=VK_SHIFT): Boolean;
+{$ENDIF}
+
+{$IFDEF FPC}
+
+{$IFNDEF MSWINDOWS}
+type
+ HWND = cardinal;
+ HINST = integer;
+const
+ SW_NORMAL = 1;
+ SW_SHOWNORMAL = 1;
+{$ENDIF}
+function RO_ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST;
+function RO_ShellExecuteA(hWnd: HWND; Operation, FileName, Parameters, Directory: PAnsiChar; ShowCmd: Integer): HINST;
+function RO_ShellExecuteW(hWnd: HWND; Operation, FileName, Parameters, Directory: PWideChar; ShowCmd: Integer): HINST;
+{$ENDIF}
+
+implementation
+
+{$IFDEF FPC}
+uses
+ {$IFDEF MSWINDOWS}
+ ShellAPI;
+ {$ELSE}
+ SysUtils;
+ {$ENDIF}
+{$ENDIF}
+
+{$IFDEF MSWINDOWS}
+function IsKeyDown(VirtualKeyCode:Integer=VK_SHIFT): Boolean;
+begin
+ Result := GetKeyState(VirtualKeyCode) and $80 <> 0;
+end;
+{$ENDIF}
+
+{$IFDEF FPC}
+function RO_ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST;
+begin
+ {$IFDEF MSWINDOWS}
+ Result:=ShellExecute(hWnd, Operation,FileName,Parameters,Directory,ShowCmd);
+ {$ELSE}
+ if Parameters <> nil then
+ Result:=ExecuteProcess(String(Directory),String(Filename)+' '+String(Parameters))
+ else
+ Result:=ExecuteProcess(String(Directory),String(Filename))
+ {$ENDIF}
+end;
+
+function RO_ShellExecuteA(hWnd: HWND; Operation, FileName, Parameters,Directory: PAnsiChar; ShowCmd: Integer): HINST;
+begin
+ {$IFDEF MSWINDOWS}
+ Result:=ShellExecuteA(hWnd, Operation,FileName,Parameters,Directory,ShowCmd);
+ {$ELSE}
+ if Parameters <> nil then
+ Result:=ExecuteProcess(Ansistring(Directory),Ansistring(Filename)+' '+Ansistring(Parameters))
+ else
+ Result:=ExecuteProcess(Ansistring(Directory),Ansistring(Filename))
+ {$ENDIF}
+end;
+
+function RO_ShellExecuteW(hWnd: HWND; Operation, FileName, Parameters,Directory: PWideChar; ShowCmd: Integer): HINST;
+begin
+ {$IFDEF MSWINDOWS}
+ Result:=ShellExecuteW(hWnd, Operation,FileName,Parameters,Directory,ShowCmd);
+ {$ELSE}
+ if Parameters <> nil then
+ Result:=ExecuteProcess(WideString(Directory),WideString(Filename)+' '+WideString(Parameters))
+ else
+ Result:=ExecuteProcess(WideString(Directory),WideString(Filename))
+ {$ENDIF}
+end;
+{$ENDIF}
+
+end.
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.dfm b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.dfm
new file mode 100644
index 0000000..4f8e8cb
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.dfm
@@ -0,0 +1,412 @@
+object EWWizardForm: TEWWizardForm
+ Left = 344
+ Top = 238
+ BorderStyle = bsDialog
+ Caption = 'New Wizard...'
+ ClientHeight = 292
+ ClientWidth = 452
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Bevel1: TBevel
+ Left = 0
+ Top = 42
+ Width = 452
+ Height = 2
+ Align = alTop
+ Shape = bsBottomLine
+ end
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 452
+ Height = 42
+ Align = alTop
+ BevelOuter = bvNone
+ Color = clWhite
+ TabOrder = 0
+ object Image1: TImage
+ Left = 5
+ Top = 5
+ Width = 32
+ Height = 32
+ AutoSize = True
+ end
+ object Label1: TLabel
+ Left = 43
+ Top = 5
+ Width = 111
+ Height = 13
+ Caption = 'RemObjects Wizard'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label2: TLabel
+ Left = 45
+ Top = 21
+ Width = 48
+ Height = 13
+ Caption = 'Bla Bla Bla'
+ end
+ end
+ object pc_Pages: TPageControl
+ Left = 0
+ Top = 44
+ Width = 452
+ Height = 213
+ ActivePage = ts_Welcome
+ Align = alClient
+ Style = tsFlatButtons
+ TabOrder = 1
+ object ts_Welcome: TTabSheet
+ Caption = 'Welcome'
+ object Label3: TLabel
+ Left = 8
+ Top = 8
+ Width = 201
+ Height = 13
+ Caption = 'Welcome to the New Project Wizard'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label4: TLabel
+ Left = 24
+ Top = 24
+ Width = 31
+ Height = 13
+ Caption = 'Bla Bla'
+ end
+ end
+ object ts_Finish: TTabSheet
+ Caption = 'Finish'
+ ImageIndex = 2
+ object Label5: TLabel
+ Left = 8
+ Top = 8
+ Width = 32
+ Height = 13
+ Caption = 'Done!'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object Label6: TLabel
+ Left = 24
+ Top = 24
+ Width = 413
+ Height = 13
+ Caption =
+ 'The Wizard is now ready to create your with the optio' +
+ 'ns selected below:'
+ end
+ object lv_Options: TListView
+ Left = 24
+ Top = 40
+ Width = 393
+ Height = 161
+ Color = clBtnFace
+ Columns = <
+ item
+ Caption = 'Option'
+ Width = -1
+ WidthType = (
+ -1)
+ end
+ item
+ Caption = 'Value'
+ Width = -1
+ WidthType = (
+ -1)
+ end>
+ ColumnClick = False
+ ReadOnly = True
+ RowSelect = True
+ TabOrder = 0
+ ViewStyle = vsReport
+ end
+ end
+ end
+ object Panel2: TPanel
+ Left = 0
+ Top = 257
+ Width = 452
+ Height = 35
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 2
+ object btn_Finish: TBitBtn
+ Left = 372
+ Top = 5
+ Width = 75
+ Height = 25
+ Hint = 'This is Finish, but not the End'
+ Anchors = [akTop, akRight]
+ Caption = 'Finish'
+ Default = True
+ ModalResult = 1
+ TabOrder = 0
+ Visible = False
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000220B0000220B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00FF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00
+ 811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FF787878787878FF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 811E00811E00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF787878787878787878FF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF811E0095440F811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878898989787878FF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF811E00A7632F811E00811E00FF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF7878789F9F9F78787878
+ 7878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF811E00BF8B62CCA17E811E00811E00FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878B8B8B8C6
+ C6C6787878787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00D8B69CE6D1BFE7D3C4811E00FF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878D1
+ D1D1E0E0E0E2E2E2787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00F0E2D9FCF7F2FAF0E6811E00811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878EBEBEBF5F5F5F1F1F1787878787878FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00D8AF96F4E2CFF0D7BDD8A784811E
+ 00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878D0D0D0E9E9E9E3E3E3CACACA787878787878FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00F3DECAEFD4B8EBC9A7DAA67D811E00FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878E7
+ E7E7E1E1E1DBDBDBC9C9C9787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00E7BB92E3B081E0A672D5925A811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878D3D3D3CDCDCDC6C6C6BCBCBC787878FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00DA995ED78F50D38441CF7B
+ 35811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FF787878BFBFBFB8B8B8B2B2B2ACACAC787878FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00811E00811E00811E
+ 00811E00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF787878787878787878787878787878787878FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object btn_Cancel: TBitBtn
+ Left = 5
+ Top = 5
+ Width = 75
+ Height = 25
+ Cancel = True
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 1
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object btn_Next: TBitBtn
+ Left = 372
+ Top = 5
+ Width = 75
+ Height = 25
+ Anchors = [akTop, akRight]
+ Caption = '&Next'
+ Default = True
+ TabOrder = 2
+ OnClick = btn_NextClick
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000130B0000130B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 0B7C15097A14087110056A0C04670B04670C04670C04670C04670C04670C0467
+ 0C045709FF00FFFF00FFFF00FFFF00FF9C9C9C9C9C9C98989896969695959595
+ 9595959595959595959595959595959595909090FF00FFFF00FFFF00FF129A28
+ 1AB03A15AF3211AB270DA81F08A61808A51608A51608A61708A61708A51708AB
+ 18078D12045708FF00FFFF00FFA8A8A8B0B0B0AEAEAEACACACAAAAAAA8A8A8A8
+ A8A8A8A8A8A8A8A8A8A8A8A8A8A8A9A9A9A0A0A0909090FF00FFFF00FF1BAD3C
+ 25C5541EC0451ABE3A15BD3110BA270BB81D09B81909B81A09B81A09B71A09BE
+ 1C08AB1704670CFF00FFFF00FFB0B0B0B9B9B9B5B5B5B4B4B4B2B2B2B0B0B0AD
+ ADADADADADADADADADADADADADADAFAFAFA9A9A9959595FF00FFFF00FF20B445
+ 31C46429BF5322BB481BBA3D17B73312B4290DB3200AB21909B11809B01809B7
+ 1A08A61704680CFF00FFFF00FFB3B3B3BCBCBCB8B8B8B5B5B5B3B3B3B1B1B1AF
+ AFAFADADADACACACACACACABABABADADADA8A8A8959595FF00FFFF00FF22B548
+ 3FC87635C367FEFEFE23BC4E1DBA4218B838FEFEFE0EB4240AB31C09B11809B8
+ 1A08A61704670CFF00FFFF00FFB3B3B3C0C0C0BCBCBCFEFEFEB5B5B5B3B3B3B1
+ B1B1FEFEFEADADADACACACACACACADADADA8A8A8959595FF00FFFF00FF21B548
+ 58D08A46C97AFEFEFEFEFEFE24BD501FBB46FEFEFEFEFEFE10B4290CB21F09B7
+ 1A08A61604670CFF00FFFF00FFB3B3B3CACACAC3C3C3FEFEFEFEFEFEB6B6B6B4
+ B4B4FEFEFEFEFEFEAEAEAEACACACADADADA8A8A8959595FF00FFFF00FF21B548
+ 77D89F52CC813BC772FEFEFEFEFEFE26BE5421BD4AFEFEFEFEFEFE13B52D0DBA
+ 230AA71804680BFF00FFFF00FFB3B3B3D5D5D5C8C8C8C0C0C0FEFEFEFEFEFEB7
+ B7B7B5B5B5FEFEFEFEFEFEB0B0B0AFAFAFA8A8A8959595FF00FFFF00FF21B548
+ 8ADEAC5DD08A42C87637C56EFEFEFEFEFEFE27BF5822BD4FFEFEFEFEFEFE14BB
+ 310EA922066F0EFF00FFFF00FFB3B3B3DCDCDCCCCCCCC2C2C2BEBEBEFEFEFEFE
+ FEFEB8B8B8B5B5B5FEFEFEFEFEFEB1B1B1AAAAAA989898FF00FFFF00FF21B548
+ 95E0B365D28F48CA7AFEFEFEFEFEFE30C3692EC265FEFEFEFEFEFE1FBB461BBE
+ 3E14AE2F0A7A14FF00FFFF00FFB3B3B3E0E0E0CECECEC4C4C4FEFEFEFEFEFEBB
+ BBBBBBBBBBFEFEFEFEFEFEB4B4B4B4B4B4ADADAD9C9C9CFF00FFFF00FF21B548
+ 9DE3B96FD597FEFEFEFEFEFE40C87439C570FEFEFEFEFEFE2BC16027BF5523C0
+ 4E1BB23C0D851AFF00FFFF00FFB3B3B3E3E3E3D2D2D2FEFEFEFEFEFEC1C1C1BF
+ BFBFFEFEFEFEFEFEB9B9B9B8B8B8B7B7B7B0B0B0A0A0A0FF00FFFF00FF21B548
+ A9E6C280DAA3FEFEFE59CF874DCC7E44C978FEFEFE39C57032C36B2DC1632AC2
+ 5D20B548108F1FFF00FFFF00FFB3B3B3E7E7E7D8D8D8FEFEFECACACAC6C6C6C2
+ C2C2FEFEFEBFBFBFBCBCBCBABABAB9B9B9B3B3B3A4A4A4FF00FFFF00FF21B549
+ AEE8C5A6E5BF91DFAF86DBA778D79D67D39159CF8744C97836C56E32C36C30C5
+ 6A27BB57139C26FF00FFFF00FFB3B3B3E9E9E9E6E6E6DFDFDFDADADAD5D5D5D0
+ D0D0CACACAC2C2C2BDBDBDBCBCBCBCBCBCB7B7B7A8A8A8FF00FFFF00FF22B548
+ 92E0B3AEE8C6B1E9C8A9E6C29BE3B887DDAA6AD5964FCD823BC77436C57034C8
+ 732BBF5E14A428FF00FFFF00FFB3B3B3DFDFDFE9E9E9EAEAEAE7E7E7E2E2E2DB
+ DBDBD0D0D0C7C7C7C0C0C0BDBDBDBEBEBEB9B9B9ABABABFF00FFFF00FFFF00FF
+ 38BB5A51C57053C57151C56F4CC36B42C06437BC5A2EB95325B74A23B54B23B7
+ 4A1AAF39FF00FFFF00FFFF00FFFF00FFBBBBBBC5C5C5C6C6C6C5C5C5C3C3C3C0
+ C0C0BBBBBBB8B8B8B5B5B5B4B4B4B4B4B4B0B0B0FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ Layout = blGlyphRight
+ NumGlyphs = 2
+ end
+ object btn_Back: TBitBtn
+ Left = 292
+ Top = 5
+ Width = 75
+ Height = 25
+ Anchors = [akTop, akRight]
+ Caption = 'Back'
+ Enabled = False
+ TabOrder = 3
+ OnClick = btn_BackClick
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000130B0000130B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 0B7C15097A14087110056A0C04670B04670C04670C04670C04670C04670C0467
+ 0C045709FF00FFFF00FFFF00FFFF00FF9D9D9D9C9C9C99999996969695959595
+ 9595959595959595959595959595959595919191FF00FFFF00FFFF00FF129A28
+ 1AB03A15AF3211AB270DA81F08A61808A51608A51608A61708A61708A51708AB
+ 18078D12045708FF00FFFF00FFA8A8A8B1B1B1AEAEAEADADADAAAAAAA9A9A9A8
+ A8A8A8A8A8A9A9A9A9A9A9A8A8A8A9A9A9A1A1A1919191FF00FFFF00FF1BAD3C
+ 25C5541EC0451ABE3A15BD3110BA270BB81D09B81909B81A09B81A09B71A09BE
+ 1C08AB1704670CFF00FFFF00FFB0B0B0B9B9B9B6B6B6B4B4B4B2B2B2B1B1B1AE
+ AEAEADADADADADADADADADADADADAFAFAFA9A9A9959595FF00FFFF00FF20B445
+ 31C46429BF5322BB481BBA3D17B73312B4290DB3200AB21909B11809B01809B7
+ 1A08A61704680CFF00FFFF00FFB3B3B3BCBCBCB9B9B9B5B5B5B3B3B3B1B1B1AF
+ AFAFADADADADADADACACACABABABADADADA9A9A9969696FF00FFFF00FF22B548
+ 3FC87635C3672BBF5723BC4E1DBA42FEFEFE13B72E0EB4240AB31CFEFEFE09B8
+ 1A08A61704670CFF00FFFF00FFB4B4B4C1C1C1BDBDBDB9B9B9B6B6B6B4B4B4FE
+ FEFEB1B1B1AEAEAEADADADFEFEFEADADADA9A9A9959595FF00FFFF00FF21B548
+ 58D08A46C97A34C5692CBF5DFEFEFEFEFEFE1ABA3D16B733FEFEFEFEFEFE09B7
+ 1A08A61604670CFF00FFFF00FFB4B4B4CBCBCBC3C3C3BDBDBDB9B9B9FEFEFEFE
+ FEFEB3B3B3B1B1B1FEFEFEFEFEFEADADADA9A9A9959595FF00FFFF00FF21B548
+ 77D89F52CC813BC772FEFEFEFEFEFE26BE5421BD4AFEFEFEFEFEFE13B52D0DBA
+ 230AA71804680BFF00FFFF00FFB4B4B4D5D5D5C8C8C8C0C0C0FEFEFEFEFEFEB8
+ B8B8B6B6B6FEFEFEFEFEFEB0B0B0AFAFAFA9A9A9969696FF00FFFF00FF21B548
+ 8ADEAC5DD08AFEFEFEFEFEFE2FC3682CC162FEFEFEFEFEFE1EBB4418B93A14BB
+ 310EA922066F0EFF00FFFF00FFB4B4B4DDDDDDCCCCCCFEFEFEFEFEFEBCBCBCBA
+ BABAFEFEFEFEFEFEB4B4B4B2B2B2B1B1B1ABABAB989898FF00FFFF00FF21B548
+ 95E0B365D28F48CA7AFEFEFEFEFEFE30C3692EC265FEFEFEFEFEFE1FBB461BBE
+ 3E14AE2F0A7A14FF00FFFF00FFB4B4B4E0E0E0CECECEC5C5C5FEFEFEFEFEFEBC
+ BCBCBBBBBBFEFEFEFEFEFEB5B5B5B4B4B4AEAEAE9D9D9DFF00FFFF00FF21B548
+ 9DE3B96FD59757CE854ECC7FFEFEFEFEFEFE35C56D30C368FEFEFEFEFEFE23C0
+ 4E1BB23C0D851AFF00FFFF00FFB4B4B4E3E3E3D2D2D2C9C9C9C7C7C7FEFEFEFE
+ FEFEBDBDBDBCBCBCFEFEFEFEFEFEB7B7B7B1B1B1A1A1A1FF00FFFF00FF21B548
+ A9E6C280DAA35ED08A59CF874DCC7EFEFEFE43C87739C57032C36BFEFEFE2AC2
+ 5D20B548108F1FFF00FFFF00FFB4B4B4E7E7E7D9D9D9CDCDCDCBCBCBC6C6C6FE
+ FEFEC2C2C2BFBFBFBCBCBCFEFEFEBABABAB3B3B3A4A4A4FF00FFFF00FF21B549
+ AEE8C5A6E5BF91DFAF86DBA778D79D67D39159CF8744C97836C56E32C36C30C5
+ 6A27BB57139C26FF00FFFF00FFB4B4B4E9E9E9E6E6E6DFDFDFDADADAD5D5D5D0
+ D0D0CBCBCBC3C3C3BDBDBDBCBCBCBCBCBCB7B7B7A9A9A9FF00FFFF00FF22B548
+ 92E0B3AEE8C6B1E9C8A9E6C29BE3B887DDAA6AD5964FCD823BC77436C57034C8
+ 732BBF5E14A428FF00FFFF00FFB4B4B4E0E0E0E9E9E9EBEBEBE7E7E7E3E3E3DC
+ DCDCD1D1D1C7C7C7C0C0C0BDBDBDBEBEBEB9B9B9ABABABFF00FFFF00FFFF00FF
+ 38BB5A51C57053C57151C56F4CC36B42C06437BC5A2EB95325B74A23B54B23B7
+ 4A1AAF39FF00FFFF00FFFF00FFFF00FFBCBCBCC5C5C5C6C6C6C5C5C5C3C3C3C0
+ C0C0BCBCBCB8B8B8B5B5B5B4B4B4B5B5B5B0B0B0FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ end
+end
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.lfm b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.lfm
new file mode 100644
index 0000000..0863322
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.lfm
@@ -0,0 +1,410 @@
+object EWWizardForm: TEWWizardForm
+ Left = 344
+ Height = 310
+ Top = 238
+ Width = 484
+ HorzScrollBar.Page = 483
+ VertScrollBar.Page = 309
+ ActiveControl = pc_Pages
+ BorderStyle = bsDialog
+ Caption = 'New Wizard...'
+ ClientHeight = 310
+ ClientWidth = 484
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ Position = poScreenCenter
+ LCLVersion = '0.9.25'
+ object Bevel1: TBevel
+ Height = 2
+ Top = 42
+ Width = 484
+ Align = alTop
+ Shape = bsBottomLine
+ end
+ object Panel1: TPanel
+ Height = 42
+ Width = 484
+ Align = alTop
+ BevelOuter = bvNone
+ ClientHeight = 42
+ ClientWidth = 484
+ Color = clWhite
+ ParentColor = False
+ TabOrder = 0
+ object Image1: TImage
+ Left = 5
+ Height = 32
+ Top = 5
+ Width = 32
+ AutoSize = True
+ Transparent = False
+ end
+ object Label1: TLabel
+ Left = 43
+ Height = 14
+ Top = 5
+ Width = 112
+ Caption = 'RemObjects Wizard'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label2: TLabel
+ Left = 45
+ Height = 16
+ Top = 21
+ Width = 55
+ Caption = 'Bla Bla Bla'
+ ParentColor = False
+ end
+ end
+ object pc_Pages: TPageControl
+ Height = 231
+ Top = 44
+ Width = 484
+ ActivePage = ts_Welcome
+ Align = alClient
+ TabIndex = 0
+ TabOrder = 1
+ object ts_Welcome: TTabSheet
+ Caption = 'Welcome'
+ ClientHeight = 205
+ ClientWidth = 476
+ object Label3: TLabel
+ Left = 8
+ Height = 14
+ Top = 8
+ Width = 202
+ Caption = 'Welcome to the New Project Wizard'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label4: TLabel
+ Left = 24
+ Height = 16
+ Top = 24
+ Width = 36
+ Caption = 'Bla Bla'
+ ParentColor = False
+ end
+ end
+ object ts_Finish: TTabSheet
+ Caption = 'Finish'
+ ClientHeight = 205
+ ClientWidth = 476
+ ImageIndex = 2
+ object Label5: TLabel
+ Left = 8
+ Height = 14
+ Top = 8
+ Width = 33
+ Caption = 'Done!'
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ ParentColor = False
+ end
+ object Label6: TLabel
+ Left = 24
+ Height = 16
+ Top = 24
+ Width = 445
+ Caption = 'The Wizard is now ready to create your with the options selected below:'
+ ParentColor = False
+ end
+ object lv_Options: TListView
+ Left = 24
+ Height = 161
+ Top = 40
+ Width = 445
+ Color = clBtnFace
+ Columns = <
+ item
+ Caption = 'Option'
+ Width = 25
+ end
+ item
+ Caption = 'Value'
+ Width = 25
+ end>
+ ColumnClick = False
+ ReadOnly = True
+ RowSelect = True
+ TabOrder = 0
+ ViewStyle = vsReport
+ end
+ end
+ end
+ object Panel2: TPanel
+ Height = 35
+ Top = 275
+ Width = 484
+ Align = alBottom
+ BevelOuter = bvNone
+ ClientHeight = 35
+ ClientWidth = 484
+ TabOrder = 2
+ object btn_Finish: TBitBtn
+ Left = 404
+ Height = 25
+ Hint = 'This is Finish, but not the End'
+ Top = 5
+ Width = 75
+ Anchors = [akTop, akRight]
+ Caption = 'Finish'
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000220B0000220B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00FF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00
+ 811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FF787878787878FF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 811E00811E00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF787878787878787878FF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF811E0095440F811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878898989787878FF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF811E00A7632F811E00811E00FF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF7878789F9F9F78787878
+ 7878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF811E00BF8B62CCA17E811E00811E00FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878B8B8B8C6
+ C6C6787878787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00D8B69CE6D1BFE7D3C4811E00FF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878D1
+ D1D1E0E0E0E2E2E2787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00F0E2D9FCF7F2FAF0E6811E00811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878EBEBEBF5F5F5F1F1F1787878787878FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00D8AF96F4E2CFF0D7BDD8A784811E
+ 00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878D0D0D0E9E9E9E3E3E3CACACA787878787878FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00F3DECAEFD4B8EBC9A7DAA67D811E00FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF787878E7
+ E7E7E1E1E1DBDBDBC9C9C9787878FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00E7BB92E3B081E0A672D5925A811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF78
+ 7878D3D3D3CDCDCDC6C6C6BCBCBC787878FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00DA995ED78F50D38441CF7B
+ 35811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FF787878BFBFBFB8B8B8B2B2B2ACACAC787878FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00811E00811E00811E
+ 00811E00811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF787878787878787878787878787878787878FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ ModalResult = 1
+ NumGlyphs = 2
+ TabOrder = 0
+ Visible = False
+ end
+ object btn_Cancel: TBitBtn
+ Left = 5
+ Height = 25
+ Top = 5
+ Width = 75
+ Cancel = True
+ Caption = 'Cancel'
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ ModalResult = 2
+ NumGlyphs = 2
+ TabOrder = 1
+ end
+ object btn_Next: TBitBtn
+ Left = 404
+ Height = 25
+ Top = 5
+ Width = 75
+ Anchors = [akTop, akRight]
+ Caption = '&Next'
+ Default = True
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000130B0000130B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 0B7C15097A14087110056A0C04670B04670C04670C04670C04670C04670C0467
+ 0C045709FF00FFFF00FFFF00FFFF00FF9C9C9C9C9C9C98989896969695959595
+ 9595959595959595959595959595959595909090FF00FFFF00FFFF00FF129A28
+ 1AB03A15AF3211AB270DA81F08A61808A51608A51608A61708A61708A51708AB
+ 18078D12045708FF00FFFF00FFA8A8A8B0B0B0AEAEAEACACACAAAAAAA8A8A8A8
+ A8A8A8A8A8A8A8A8A8A8A8A8A8A8A9A9A9A0A0A0909090FF00FFFF00FF1BAD3C
+ 25C5541EC0451ABE3A15BD3110BA270BB81D09B81909B81A09B81A09B71A09BE
+ 1C08AB1704670CFF00FFFF00FFB0B0B0B9B9B9B5B5B5B4B4B4B2B2B2B0B0B0AD
+ ADADADADADADADADADADADADADADAFAFAFA9A9A9959595FF00FFFF00FF20B445
+ 31C46429BF5322BB481BBA3D17B73312B4290DB3200AB21909B11809B01809B7
+ 1A08A61704680CFF00FFFF00FFB3B3B3BCBCBCB8B8B8B5B5B5B3B3B3B1B1B1AF
+ AFAFADADADACACACACACACABABABADADADA8A8A8959595FF00FFFF00FF22B548
+ 3FC87635C367FEFEFE23BC4E1DBA4218B838FEFEFE0EB4240AB31C09B11809B8
+ 1A08A61704670CFF00FFFF00FFB3B3B3C0C0C0BCBCBCFEFEFEB5B5B5B3B3B3B1
+ B1B1FEFEFEADADADACACACACACACADADADA8A8A8959595FF00FFFF00FF21B548
+ 58D08A46C97AFEFEFEFEFEFE24BD501FBB46FEFEFEFEFEFE10B4290CB21F09B7
+ 1A08A61604670CFF00FFFF00FFB3B3B3CACACAC3C3C3FEFEFEFEFEFEB6B6B6B4
+ B4B4FEFEFEFEFEFEAEAEAEACACACADADADA8A8A8959595FF00FFFF00FF21B548
+ 77D89F52CC813BC772FEFEFEFEFEFE26BE5421BD4AFEFEFEFEFEFE13B52D0DBA
+ 230AA71804680BFF00FFFF00FFB3B3B3D5D5D5C8C8C8C0C0C0FEFEFEFEFEFEB7
+ B7B7B5B5B5FEFEFEFEFEFEB0B0B0AFAFAFA8A8A8959595FF00FFFF00FF21B548
+ 8ADEAC5DD08A42C87637C56EFEFEFEFEFEFE27BF5822BD4FFEFEFEFEFEFE14BB
+ 310EA922066F0EFF00FFFF00FFB3B3B3DCDCDCCCCCCCC2C2C2BEBEBEFEFEFEFE
+ FEFEB8B8B8B5B5B5FEFEFEFEFEFEB1B1B1AAAAAA989898FF00FFFF00FF21B548
+ 95E0B365D28F48CA7AFEFEFEFEFEFE30C3692EC265FEFEFEFEFEFE1FBB461BBE
+ 3E14AE2F0A7A14FF00FFFF00FFB3B3B3E0E0E0CECECEC4C4C4FEFEFEFEFEFEBB
+ BBBBBBBBBBFEFEFEFEFEFEB4B4B4B4B4B4ADADAD9C9C9CFF00FFFF00FF21B548
+ 9DE3B96FD597FEFEFEFEFEFE40C87439C570FEFEFEFEFEFE2BC16027BF5523C0
+ 4E1BB23C0D851AFF00FFFF00FFB3B3B3E3E3E3D2D2D2FEFEFEFEFEFEC1C1C1BF
+ BFBFFEFEFEFEFEFEB9B9B9B8B8B8B7B7B7B0B0B0A0A0A0FF00FFFF00FF21B548
+ A9E6C280DAA3FEFEFE59CF874DCC7E44C978FEFEFE39C57032C36B2DC1632AC2
+ 5D20B548108F1FFF00FFFF00FFB3B3B3E7E7E7D8D8D8FEFEFECACACAC6C6C6C2
+ C2C2FEFEFEBFBFBFBCBCBCBABABAB9B9B9B3B3B3A4A4A4FF00FFFF00FF21B549
+ AEE8C5A6E5BF91DFAF86DBA778D79D67D39159CF8744C97836C56E32C36C30C5
+ 6A27BB57139C26FF00FFFF00FFB3B3B3E9E9E9E6E6E6DFDFDFDADADAD5D5D5D0
+ D0D0CACACAC2C2C2BDBDBDBCBCBCBCBCBCB7B7B7A8A8A8FF00FFFF00FF22B548
+ 92E0B3AEE8C6B1E9C8A9E6C29BE3B887DDAA6AD5964FCD823BC77436C57034C8
+ 732BBF5E14A428FF00FFFF00FFB3B3B3DFDFDFE9E9E9EAEAEAE7E7E7E2E2E2DB
+ DBDBD0D0D0C7C7C7C0C0C0BDBDBDBEBEBEB9B9B9ABABABFF00FFFF00FFFF00FF
+ 38BB5A51C57053C57151C56F4CC36B42C06437BC5A2EB95325B74A23B54B23B7
+ 4A1AAF39FF00FFFF00FFFF00FFFF00FFBBBBBBC5C5C5C6C6C6C5C5C5C3C3C3C0
+ C0C0BBBBBBB8B8B8B5B5B5B4B4B4B4B4B4B0B0B0FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ Layout = blGlyphRight
+ NumGlyphs = 2
+ OnClick = btn_NextClick
+ TabOrder = 2
+ end
+ object btn_Back: TBitBtn
+ Left = 324
+ Height = 25
+ Top = 5
+ Width = 75
+ Anchors = [akTop, akRight]
+ Caption = 'Back'
+ Enabled = False
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000130B0000130B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ 0B7C15097A14087110056A0C04670B04670C04670C04670C04670C04670C0467
+ 0C045709FF00FFFF00FFFF00FFFF00FF9D9D9D9C9C9C99999996969695959595
+ 9595959595959595959595959595959595919191FF00FFFF00FFFF00FF129A28
+ 1AB03A15AF3211AB270DA81F08A61808A51608A51608A61708A61708A51708AB
+ 18078D12045708FF00FFFF00FFA8A8A8B1B1B1AEAEAEADADADAAAAAAA9A9A9A8
+ A8A8A8A8A8A9A9A9A9A9A9A8A8A8A9A9A9A1A1A1919191FF00FFFF00FF1BAD3C
+ 25C5541EC0451ABE3A15BD3110BA270BB81D09B81909B81A09B81A09B71A09BE
+ 1C08AB1704670CFF00FFFF00FFB0B0B0B9B9B9B6B6B6B4B4B4B2B2B2B1B1B1AE
+ AEAEADADADADADADADADADADADADAFAFAFA9A9A9959595FF00FFFF00FF20B445
+ 31C46429BF5322BB481BBA3D17B73312B4290DB3200AB21909B11809B01809B7
+ 1A08A61704680CFF00FFFF00FFB3B3B3BCBCBCB9B9B9B5B5B5B3B3B3B1B1B1AF
+ AFAFADADADADADADACACACABABABADADADA9A9A9969696FF00FFFF00FF22B548
+ 3FC87635C3672BBF5723BC4E1DBA42FEFEFE13B72E0EB4240AB31CFEFEFE09B8
+ 1A08A61704670CFF00FFFF00FFB4B4B4C1C1C1BDBDBDB9B9B9B6B6B6B4B4B4FE
+ FEFEB1B1B1AEAEAEADADADFEFEFEADADADA9A9A9959595FF00FFFF00FF21B548
+ 58D08A46C97A34C5692CBF5DFEFEFEFEFEFE1ABA3D16B733FEFEFEFEFEFE09B7
+ 1A08A61604670CFF00FFFF00FFB4B4B4CBCBCBC3C3C3BDBDBDB9B9B9FEFEFEFE
+ FEFEB3B3B3B1B1B1FEFEFEFEFEFEADADADA9A9A9959595FF00FFFF00FF21B548
+ 77D89F52CC813BC772FEFEFEFEFEFE26BE5421BD4AFEFEFEFEFEFE13B52D0DBA
+ 230AA71804680BFF00FFFF00FFB4B4B4D5D5D5C8C8C8C0C0C0FEFEFEFEFEFEB8
+ B8B8B6B6B6FEFEFEFEFEFEB0B0B0AFAFAFA9A9A9969696FF00FFFF00FF21B548
+ 8ADEAC5DD08AFEFEFEFEFEFE2FC3682CC162FEFEFEFEFEFE1EBB4418B93A14BB
+ 310EA922066F0EFF00FFFF00FFB4B4B4DDDDDDCCCCCCFEFEFEFEFEFEBCBCBCBA
+ BABAFEFEFEFEFEFEB4B4B4B2B2B2B1B1B1ABABAB989898FF00FFFF00FF21B548
+ 95E0B365D28F48CA7AFEFEFEFEFEFE30C3692EC265FEFEFEFEFEFE1FBB461BBE
+ 3E14AE2F0A7A14FF00FFFF00FFB4B4B4E0E0E0CECECEC5C5C5FEFEFEFEFEFEBC
+ BCBCBBBBBBFEFEFEFEFEFEB5B5B5B4B4B4AEAEAE9D9D9DFF00FFFF00FF21B548
+ 9DE3B96FD59757CE854ECC7FFEFEFEFEFEFE35C56D30C368FEFEFEFEFEFE23C0
+ 4E1BB23C0D851AFF00FFFF00FFB4B4B4E3E3E3D2D2D2C9C9C9C7C7C7FEFEFEFE
+ FEFEBDBDBDBCBCBCFEFEFEFEFEFEB7B7B7B1B1B1A1A1A1FF00FFFF00FF21B548
+ A9E6C280DAA35ED08A59CF874DCC7EFEFEFE43C87739C57032C36BFEFEFE2AC2
+ 5D20B548108F1FFF00FFFF00FFB4B4B4E7E7E7D9D9D9CDCDCDCBCBCBC6C6C6FE
+ FEFEC2C2C2BFBFBFBCBCBCFEFEFEBABABAB3B3B3A4A4A4FF00FFFF00FF21B549
+ AEE8C5A6E5BF91DFAF86DBA778D79D67D39159CF8744C97836C56E32C36C30C5
+ 6A27BB57139C26FF00FFFF00FFB4B4B4E9E9E9E6E6E6DFDFDFDADADAD5D5D5D0
+ D0D0CBCBCBC3C3C3BDBDBDBCBCBCBCBCBCB7B7B7A9A9A9FF00FFFF00FF22B548
+ 92E0B3AEE8C6B1E9C8A9E6C29BE3B887DDAA6AD5964FCD823BC77436C57034C8
+ 732BBF5E14A428FF00FFFF00FFB4B4B4E0E0E0E9E9E9EBEBEBE7E7E7E3E3E3DC
+ DCDCD1D1D1C7C7C7C0C0C0BDBDBDBEBEBEB9B9B9ABABABFF00FFFF00FFFF00FF
+ 38BB5A51C57053C57151C56F4CC36B42C06437BC5A2EB95325B74A23B54B23B7
+ 4A1AAF39FF00FFFF00FFFF00FFFF00FFBCBCBCC5C5C5C6C6C6C5C5C5C3C3C3C0
+ C0C0BCBCBCB8B8B8B5B5B5B4B4B4B5B5B5B0B0B0FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ }
+ NumGlyphs = 2
+ OnClick = btn_BackClick
+ TabOrder = 3
+ end
+ end
+end
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.lrs b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.lrs
new file mode 100644
index 0000000..1300661
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.lrs
@@ -0,0 +1,337 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TEWWizardForm','FORMDATA',[
+ 'TPF0'#13'TEWWizardForm'#12'EWWizardForm'#4'Left'#3'X'#1#6'Height'#3'6'#1#3'T'
+ +'op'#3#238#0#5'Width'#3#228#1#18'HorzScrollBar.Page'#3#227#1#18'VertScrollBa'
+ +'r.Page'#3'5'#1#13'ActiveControl'#7#8'pc_Pages'#11'BorderStyle'#7#8'bsDialog'
+ +#7'Caption'#6#13'New Wizard...'#12'ClientHeight'#3'6'#1#11'ClientWidth'#3#228
+ +#1#11'Font.Height'#2#245#9'Font.Name'#6#6'Tahoma'#8'OnCreate'#7#10'FormCreat'
+ +'e'#9'OnDestroy'#7#11'FormDestroy'#8'Position'#7#14'poScreenCenter'#10'LCLVe'
+ +'rsion'#6#6'0.9.25'#0#6'TBevel'#6'Bevel1'#6'Height'#2#2#3'Top'#2'*'#5'Width'
+ +#3#228#1#5'Align'#7#5'alTop'#5'Shape'#7#12'bsBottomLine'#0#0#6'TPanel'#6'Pan'
+ +'el1'#6'Height'#2'*'#5'Width'#3#228#1#5'Align'#7#5'alTop'#10'BevelOuter'#7#6
+ +'bvNone'#12'ClientHeight'#2'*'#11'ClientWidth'#3#228#1#5'Color'#7#7'clWhite'
+ +#11'ParentColor'#8#8'TabOrder'#2#0#0#6'TImage'#6'Image1'#4'Left'#2#5#6'Heigh'
+ +'t'#2' '#3'Top'#2#5#5'Width'#2' '#8'AutoSize'#9#11'Transparent'#8#0#0#6'TLab'
+ +'el'#6'Label1'#4'Left'#2'+'#6'Height'#2#14#3'Top'#2#5#5'Width'#2'p'#7'Captio'
+ +'n'#6#17'RemObjects Wizard'#11'Font.Height'#2#245#9'Font.Name'#6#6'Tahoma'#10
+ +'Font.Style'#11#6'fsBold'#0#11'ParentColor'#8#0#0#6'TLabel'#6'Label2'#4'Left'
+ +#2'-'#6'Height'#2#16#3'Top'#2#21#5'Width'#2'7'#7'Caption'#6#11'Bla Bla Bla'
+ +#11'ParentColor'#8#0#0#0#12'TPageControl'#8'pc_Pages'#6'Height'#3#231#0#3'To'
+ +'p'#2','#5'Width'#3#228#1#10'ActivePage'#7#10'ts_Welcome'#5'Align'#7#8'alCli'
+ +'ent'#8'TabIndex'#2#0#8'TabOrder'#2#1#0#9'TTabSheet'#10'ts_Welcome'#7'Captio'
+ +'n'#6#7'Welcome'#12'ClientHeight'#3#205#0#11'ClientWidth'#3#220#1#0#6'TLabel'
+ +#6'Label3'#4'Left'#2#8#6'Height'#2#14#3'Top'#2#8#5'Width'#3#202#0#7'Caption'
+ +#6'!Welcome to the New Project Wizard'#11'Font.Height'#2#245#9'Font.Name'#6#6
+ +'Tahoma'#10'Font.Style'#11#6'fsBold'#0#11'ParentColor'#8#0#0#6'TLabel'#6'Lab'
+ +'el4'#4'Left'#2#24#6'Height'#2#16#3'Top'#2#24#5'Width'#2'$'#7'Caption'#6#7'B'
+ +'la Bla'#11'ParentColor'#8#0#0#0#9'TTabSheet'#9'ts_Finish'#7'Caption'#6#6'Fi'
+ +'nish'#12'ClientHeight'#3#205#0#11'ClientWidth'#3#220#1#10'ImageIndex'#2#2#0
+ +#6'TLabel'#6'Label5'#4'Left'#2#8#6'Height'#2#14#3'Top'#2#8#5'Width'#2'!'#7'C'
+ +'aption'#6#5'Done!'#11'Font.Height'#2#245#9'Font.Name'#6#6'Tahoma'#10'Font.S'
+ +'tyle'#11#6'fsBold'#0#11'ParentColor'#8#0#0#6'TLabel'#6'Label6'#4'Left'#2#24
+ +#6'Height'#2#16#3'Top'#2#24#5'Width'#3#189#1#7'Caption'#6'RThe Wizard is now'
+ +' ready to create your with the options selected below:'#11'Paren'
+ +'tColor'#8#0#0#9'TListView'#10'lv_Options'#4'Left'#2#24#6'Height'#3#161#0#3
+ +'Top'#2'('#5'Width'#3#189#1#5'Color'#7#9'clBtnFace'#7'Columns'#14#1#7'Captio'
+ +'n'#6#6'Option'#5'Width'#2#25#0#1#7'Caption'#6#5'Value'#5'Width'#2#25#0#0#11
+ +'ColumnClick'#8#8'ReadOnly'#9#9'RowSelect'#9#8'TabOrder'#2#0#9'ViewStyle'#7#8
+ +'vsReport'#0#0#0#0#6'TPanel'#6'Panel2'#6'Height'#2'#'#3'Top'#3#19#1#5'Width'
+ +#3#228#1#5'Align'#7#8'alBottom'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2
+ +'#'#11'ClientWidth'#3#228#1#8'TabOrder'#2#2#0#7'TBitBtn'#10'btn_Finish'#4'Le'
+ +'ft'#3#148#1#6'Height'#2#25#4'Hint'#6#31'This is Finish, but not the End'#3
+ +'Top'#2#5#5'Width'#2'K'#7'Anchors'#11#5'akTop'#7'akRight'#0#7'Caption'#6#6'F'
+ +'inish'#10'Glyph.Data'#10':'#6#0#0'6'#6#0#0'BM6'#6#0#0#0#0#0#0'6'#0#0#0'('#0
+ +#0#0' '#0#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0#6#0#0'"'#11#0#0'"'#11#0#0#0#0#0#0#0
+ +#0#0#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255'xxx'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#129#30#0#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxxxxx'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#129#30
+ +#0#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxxxxxxxx'
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#149
+ +'D'#15#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxx'
+ +#137#137#137'xxx'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#129#30#0#167'c/'#129#30#0#129#30#0#255#0#255#255#0#255#255#0#255#255#0
+ ,#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255'xxx'#159#159#159'xxxxxx'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#129#30#0#191#139'b'#204#161'~'#129#30#0#129#30#0#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255'xxx'#184#184#184#198#198#198'xxxxxx'#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#129#30#0#216#182#156#230#209#191#231#211#196#129#30
+ +#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255'xxx'#209#209#209#224#224#224#226#226#226
+ +'xxx'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#240#226#217#252
+ +#247#242#250#240#230#129#30#0#129#30#0#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxx'#235#235
+ +#235#245#245#245#241#241#241'xxxxxx'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#216#175
+ +#150#244#226#207#240#215#189#216#167#132#129#30#0#129#30#0#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'x'
+ +'xx'#208#208#208#233#233#233#227#227#227#202#202#202'xxxxxx'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#243
+ +#222#202#239#212#184#235#201#167#218#166'}'#129#30#0#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +'xxx'#231#231#231#225#225#225#219#219#219#201#201#201'xxx'#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#129#30#0#231#187#146#227#176#129#224#166'r'#213#146'Z'
+ +#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255'xxx'#211#211#211#205#205#205#198#198#198
+ +#188#188#188'xxx'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#129#30#0#218#153'^'#215
+ +#143'P'#211#132'A'#207'{5'#129#30#0#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'xxx'#191#191#191
+ +#184#184#184#178#178#178#172#172#172'xxx'#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#129#30#0#129#30#0#129#30#0#129#30#0#129#30#0#129#30#0#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255'xxxxxxxxxxxxxxxxxx'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#11
+ +'ModalResult'#2#1#9'NumGlyphs'#2#2#8'TabOrder'#2#0#7'Visible'#8#0#0#7'TBitBt'
+ +'n'#10'btn_Cancel'#4'Left'#2#5#6'Height'#2#25#3'Top'#2#5#5'Width'#2'K'#6'Can'
+ +'cel'#9#7'Caption'#6#6'Cancel'#10'Glyph.Data'#10':'#6#0#0'6'#6#0#0'BM6'#6#0#0
+ +#0#0#0#0'6'#0#0#0'('#0#0#0' '#0#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0#6#0#0#196#14
+ +#0#0#196#14#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#0#0#154#0#0#154#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#0#0#154#0#0#154#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255'kkkkkk'#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255'kkkkkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0
+ +#0#154#23'J'#253#16';'#244#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#0
+ +#0#154#0','#248#0'0'#252#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255'kkk'
+ +#168#168#168#160#160#160'kkk'#255#0#255#255#0#255#255#0#255#255#0#255'kkk'
+ ,#154#154#154#156#156#156'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#0#0#154
+ +#26'G'#248#26'L'#255#18';'#241#0#0#154#255#0#255#255#0#255#0#0#154#1'-'#246#1
+ +'2'#255#0'*'#243#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255'kkk'#167#167
+ +#167#170#170#170#159#159#159'kkk'#255#0#255#255#0#255'kkk'#153#153#153#158
+ +#158#158#151#151#151'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0
+ +#0#154#28'G'#246#27'M'#255#20'>'#244#0#0#154#0#0#154#0'-'#248#1'4'#255#3'+'
+ +#242#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'kkk'
+ +#167#167#167#171#171#171#162#162#162'kkkkkk'#154#154#154#158#158#158#152#152
+ +#152'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#0#0#154#29'H'#246#29'P'#255#16'='#251#4'1'#254#1'2'#255#0','#246#0#0#154
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255'kkk'#167#167#167#172#172#172#163#163#163#159#159#159#158#158#158#153#153
+ +#153'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#0#0#154#26'H'#249#19'B'#255#12'<'#255#7'3'#246#0#0
+ +#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255'kkk'#167#167#167#167#167#167#163#163#163#156
+ +#156#156'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#0#0#154'!N'#252#29'K'#255#24'G'#255#23
+ +'C'#246#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255'kkk'#172#172#172#172#172#172#169#169
+ +#169#164#164#164'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#0#0#154'.['#249',_'#255'"M'#248' K'#248'#'
+ +'U'#255#27'F'#246#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255'kkk'#177#177#177#179#179#179#171#171#171#170
+ +#170#170#175#175#175#166#166#166'kkk'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#0#0#154'6d'#250'8k'#255'-Y'#244#0#0#154#0#0
+ +#154'"L'#244'%X'#255#29'I'#246#0#0#154#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255'kkk'#182#182#182#185#185#185#174#174#174'kkkkkk'#169
+ +#169#169#176#176#176#167#167#167'kkk'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#0#0#154'@q'#250'Bt'#255'2]'#241#0#0#154#255#0#255#255#0#255#0#0
+ +#154'"M'#241'''Z'#255' L'#248#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255
+ +'kkk'#187#187#187#190#190#190#175#175#175'kkk'#255#0#255#255#0#255'kkk'#167
+ +#167#167#177#177#177#170#170#170'kkk'#255#0#255#255#0#255#255#0#255#255#0#255
+ +#0#0#154'Iz'#252';f'#243#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#0#0
+ +#154'%P'#244'&U'#250#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255'kkk'#192
+ +#192#192#181#181#181'kkk'#255#0#255#255#0#255#255#0#255#255#0#255'kkk'#170
+ +#170#170#174#174#174'kkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0
+ +#0#154#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#0
+ +#0#154#0#0#154#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'k'
+ +'kkkkk'#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255'kkkkkk'
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#11'Mo'
+ +'dalResult'#2#2#9'NumGlyphs'#2#2#8'TabOrder'#2#1#0#0#7'TBitBtn'#8'btn_Next'#4
+ +'Left'#3#148#1#6'Height'#2#25#3'Top'#2#5#5'Width'#2'K'#7'Anchors'#11#5'akTop'
+ +#7'akRight'#0#7'Caption'#6#5'&Next'#7'Default'#9#10'Glyph.Data'#10':'#6#0#0
+ +'6'#6#0#0'BM6'#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0' '#0#0#0#16#0#0#0#1#0#24#0#0#0
+ +#0#0#0#6#0#0#19#11#0#0#19#11#0#0#0#0#0#0#0#0#0#0#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#11'|'#21#9'z'#20#8'q'#16#5'j'#12#4'g'#11#4'g'#12#4'g'#12#4'g'
+ +#12#4'g'#12#4'g'#12#4'g'#12#4'W'#9#255#0#255#255#0#255#255#0#255#255#0#255
+ +#156#156#156#156#156#156#152#152#152#150#150#150#149#149#149#149#149#149#149
+ +#149#149#149#149#149#149#149#149#149#149#149#149#149#149#144#144#144#255#0
+ +#255#255#0#255#255#0#255#18#154'('#26#176':'#21#175'2'#17#171''''#13#168#31#8
+ +#166#24#8#165#22#8#165#22#8#166#23#8#166#23#8#165#23#8#171#24#7#141#18#4'W'#8
+ ,#255#0#255#255#0#255#168#168#168#176#176#176#174#174#174#172#172#172#170#170
+ +#170#168#168#168#168#168#168#168#168#168#168#168#168#168#168#168#168#168#168
+ +#169#169#169#160#160#160#144#144#144#255#0#255#255#0#255#27#173'<%'#197'T'#30
+ +#192'E'#26#190':'#21#189'1'#16#186''''#11#184#29#9#184#25#9#184#26#9#184#26#9
+ +#183#26#9#190#28#8#171#23#4'g'#12#255#0#255#255#0#255#176#176#176#185#185#185
+ +#181#181#181#180#180#180#178#178#178#176#176#176#173#173#173#173#173#173#173
+ +#173#173#173#173#173#173#173#173#175#175#175#169#169#169#149#149#149#255#0
+ +#255#255#0#255' '#180'E1'#196'd)'#191'S"'#187'H'#27#186'='#23#183'3'#18#180
+ +')'#13#179' '#10#178#25#9#177#24#9#176#24#9#183#26#8#166#23#4'h'#12#255#0#255
+ +#255#0#255#179#179#179#188#188#188#184#184#184#181#181#181#179#179#179#177
+ +#177#177#175#175#175#173#173#173#172#172#172#172#172#172#171#171#171#173#173
+ +#173#168#168#168#149#149#149#255#0#255#255#0#255'"'#181'H?'#200'v5'#195'g'
+ +#254#254#254'#'#188'N'#29#186'B'#24#184'8'#254#254#254#14#180'$'#10#179#28#9
+ +#177#24#9#184#26#8#166#23#4'g'#12#255#0#255#255#0#255#179#179#179#192#192#192
+ +#188#188#188#254#254#254#181#181#181#179#179#179#177#177#177#254#254#254#173
+ +#173#173#172#172#172#172#172#172#173#173#173#168#168#168#149#149#149#255#0
+ +#255#255#0#255'!'#181'HX'#208#138'F'#201'z'#254#254#254#254#254#254'$'#189'P'
+ +#31#187'F'#254#254#254#254#254#254#16#180')'#12#178#31#9#183#26#8#166#22#4'g'
+ +#12#255#0#255#255#0#255#179#179#179#202#202#202#195#195#195#254#254#254#254
+ +#254#254#182#182#182#180#180#180#254#254#254#254#254#254#174#174#174#172#172
+ +#172#173#173#173#168#168#168#149#149#149#255#0#255#255#0#255'!'#181'Hw'#216
+ +#159'R'#204#129';'#199'r'#254#254#254#254#254#254'&'#190'T!'#189'J'#254#254
+ +#254#254#254#254#19#181'-'#13#186'#'#10#167#24#4'h'#11#255#0#255#255#0#255
+ +#179#179#179#213#213#213#200#200#200#192#192#192#254#254#254#254#254#254#183
+ +#183#183#181#181#181#254#254#254#254#254#254#176#176#176#175#175#175#168#168
+ +#168#149#149#149#255#0#255#255#0#255'!'#181'H'#138#222#172']'#208#138'B'#200
+ +'v7'#197'n'#254#254#254#254#254#254''''#191'X"'#189'O'#254#254#254#254#254
+ +#254#20#187'1'#14#169'"'#6'o'#14#255#0#255#255#0#255#179#179#179#220#220#220
+ +#204#204#204#194#194#194#190#190#190#254#254#254#254#254#254#184#184#184#181
+ +#181#181#254#254#254#254#254#254#177#177#177#170#170#170#152#152#152#255#0
+ +#255#255#0#255'!'#181'H'#149#224#179'e'#210#143'H'#202'z'#254#254#254#254#254
+ +#254'0'#195'i.'#194'e'#254#254#254#254#254#254#31#187'F'#27#190'>'#20#174'/'
+ +#10'z'#20#255#0#255#255#0#255#179#179#179#224#224#224#206#206#206#196#196#196
+ +#254#254#254#254#254#254#187#187#187#187#187#187#254#254#254#254#254#254#180
+ +#180#180#180#180#180#173#173#173#156#156#156#255#0#255#255#0#255'!'#181'H'
+ +#157#227#185'o'#213#151#254#254#254#254#254#254'@'#200't9'#197'p'#254#254#254
+ +#254#254#254'+'#193'`'''#191'U#'#192'N'#27#178'<'#13#133#26#255#0#255#255#0
+ +#255#179#179#179#227#227#227#210#210#210#254#254#254#254#254#254#193#193#193
+ +#191#191#191#254#254#254#254#254#254#185#185#185#184#184#184#183#183#183#176
+ +#176#176#160#160#160#255#0#255#255#0#255'!'#181'H'#169#230#194#128#218#163
+ +#254#254#254'Y'#207#135'M'#204'~D'#201'x'#254#254#254'9'#197'p2'#195'k-'#193
+ +'c*'#194'] '#181'H'#16#143#31#255#0#255#255#0#255#179#179#179#231#231#231#216
+ +#216#216#254#254#254#202#202#202#198#198#198#194#194#194#254#254#254#191#191
+ +#191#188#188#188#186#186#186#185#185#185#179#179#179#164#164#164#255#0#255
+ +#255#0#255'!'#181'I'#174#232#197#166#229#191#145#223#175#134#219#167'x'#215
+ +#157'g'#211#145'Y'#207#135'D'#201'x6'#197'n2'#195'l0'#197'j'''#187'W'#19#156
+ +'&'#255#0#255#255#0#255#179#179#179#233#233#233#230#230#230#223#223#223#218
+ +#218#218#213#213#213#208#208#208#202#202#202#194#194#194#189#189#189#188#188
+ +#188#188#188#188#183#183#183#168#168#168#255#0#255#255#0#255'"'#181'H'#146
+ +#224#179#174#232#198#177#233#200#169#230#194#155#227#184#135#221#170'j'#213
+ +#150'O'#205#130';'#199't6'#197'p4'#200's+'#191'^'#20#164'('#255#0#255#255#0
+ +#255#179#179#179#223#223#223#233#233#233#234#234#234#231#231#231#226#226#226
+ +#219#219#219#208#208#208#199#199#199#192#192#192#189#189#189#190#190#190#185
+ +#185#185#171#171#171#255#0#255#255#0#255#255#0#255'8'#187'ZQ'#197'pS'#197'qQ'
+ +#197'oL'#195'kB'#192'd7'#188'Z.'#185'S%'#183'J#'#181'K#'#183'J'#26#175'9'#255
+ +#0#255#255#0#255#255#0#255#255#0#255#187#187#187#197#197#197#198#198#198#197
+ +#197#197#195#195#195#192#192#192#187#187#187#184#184#184#181#181#181#180#180
+ +#180#180#180#180#176#176#176#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#6'Lay'
+ +'out'#7#12'blGlyphRight'#9'NumGlyphs'#2#2#7'OnClick'#7#13'btn_NextClick'#8'T'
+ +'abOrder'#2#2#0#0#7'TBitBtn'#8'btn_Back'#4'Left'#3'D'#1#6'Height'#2#25#3'Top'
+ ,#2#5#5'Width'#2'K'#7'Anchors'#11#5'akTop'#7'akRight'#0#7'Caption'#6#4'Back'#7
+ +'Enabled'#8#10'Glyph.Data'#10':'#6#0#0'6'#6#0#0'BM6'#6#0#0#0#0#0#0'6'#0#0#0
+ +'('#0#0#0' '#0#0#0#16#0#0#0#1#0#24#0#0#0#0#0#0#6#0#0#19#11#0#0#19#11#0#0#0#0
+ +#0#0#0#0#0#0#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255
+ +#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#11'|'#21#9'z'#20#8'q'#16#5
+ +'j'#12#4'g'#11#4'g'#12#4'g'#12#4'g'#12#4'g'#12#4'g'#12#4'g'#12#4'W'#9#255#0
+ +#255#255#0#255#255#0#255#255#0#255#157#157#157#156#156#156#153#153#153#150
+ +#150#150#149#149#149#149#149#149#149#149#149#149#149#149#149#149#149#149#149
+ +#149#149#149#149#145#145#145#255#0#255#255#0#255#255#0#255#18#154'('#26#176
+ +':'#21#175'2'#17#171''''#13#168#31#8#166#24#8#165#22#8#165#22#8#166#23#8#166
+ +#23#8#165#23#8#171#24#7#141#18#4'W'#8#255#0#255#255#0#255#168#168#168#177#177
+ +#177#174#174#174#173#173#173#170#170#170#169#169#169#168#168#168#168#168#168
+ +#169#169#169#169#169#169#168#168#168#169#169#169#161#161#161#145#145#145#255
+ +#0#255#255#0#255#27#173'<%'#197'T'#30#192'E'#26#190':'#21#189'1'#16#186''''
+ +#11#184#29#9#184#25#9#184#26#9#184#26#9#183#26#9#190#28#8#171#23#4'g'#12#255
+ +#0#255#255#0#255#176#176#176#185#185#185#182#182#182#180#180#180#178#178#178
+ +#177#177#177#174#174#174#173#173#173#173#173#173#173#173#173#173#173#173#175
+ +#175#175#169#169#169#149#149#149#255#0#255#255#0#255' '#180'E1'#196'd)'#191
+ +'S"'#187'H'#27#186'='#23#183'3'#18#180')'#13#179' '#10#178#25#9#177#24#9#176
+ +#24#9#183#26#8#166#23#4'h'#12#255#0#255#255#0#255#179#179#179#188#188#188#185
+ +#185#185#181#181#181#179#179#179#177#177#177#175#175#175#173#173#173#173#173
+ +#173#172#172#172#171#171#171#173#173#173#169#169#169#150#150#150#255#0#255
+ +#255#0#255'"'#181'H?'#200'v5'#195'g+'#191'W#'#188'N'#29#186'B'#254#254#254#19
+ +#183'.'#14#180'$'#10#179#28#254#254#254#9#184#26#8#166#23#4'g'#12#255#0#255
+ +#255#0#255#180#180#180#193#193#193#189#189#189#185#185#185#182#182#182#180
+ +#180#180#254#254#254#177#177#177#174#174#174#173#173#173#254#254#254#173#173
+ +#173#169#169#169#149#149#149#255#0#255#255#0#255'!'#181'HX'#208#138'F'#201'z'
+ +'4'#197'i,'#191']'#254#254#254#254#254#254#26#186'='#22#183'3'#254#254#254
+ +#254#254#254#9#183#26#8#166#22#4'g'#12#255#0#255#255#0#255#180#180#180#203
+ +#203#203#195#195#195#189#189#189#185#185#185#254#254#254#254#254#254#179#179
+ +#179#177#177#177#254#254#254#254#254#254#173#173#173#169#169#169#149#149#149
+ +#255#0#255#255#0#255'!'#181'Hw'#216#159'R'#204#129';'#199'r'#254#254#254#254
+ +#254#254'&'#190'T!'#189'J'#254#254#254#254#254#254#19#181'-'#13#186'#'#10#167
+ +#24#4'h'#11#255#0#255#255#0#255#180#180#180#213#213#213#200#200#200#192#192
+ +#192#254#254#254#254#254#254#184#184#184#182#182#182#254#254#254#254#254#254
+ +#176#176#176#175#175#175#169#169#169#150#150#150#255#0#255#255#0#255'!'#181
+ +'H'#138#222#172']'#208#138#254#254#254#254#254#254'/'#195'h,'#193'b'#254#254
+ +#254#254#254#254#30#187'D'#24#185':'#20#187'1'#14#169'"'#6'o'#14#255#0#255
+ +#255#0#255#180#180#180#221#221#221#204#204#204#254#254#254#254#254#254#188
+ +#188#188#186#186#186#254#254#254#254#254#254#180#180#180#178#178#178#177#177
+ +#177#171#171#171#152#152#152#255#0#255#255#0#255'!'#181'H'#149#224#179'e'#210
+ +#143'H'#202'z'#254#254#254#254#254#254'0'#195'i.'#194'e'#254#254#254#254#254
+ +#254#31#187'F'#27#190'>'#20#174'/'#10'z'#20#255#0#255#255#0#255#180#180#180
+ +#224#224#224#206#206#206#197#197#197#254#254#254#254#254#254#188#188#188#187
+ +#187#187#254#254#254#254#254#254#181#181#181#180#180#180#174#174#174#157#157
+ +#157#255#0#255#255#0#255'!'#181'H'#157#227#185'o'#213#151'W'#206#133'N'#204
+ +''#254#254#254#254#254#254'5'#197'm0'#195'h'#254#254#254#254#254#254'#'#192
+ +'N'#27#178'<'#13#133#26#255#0#255#255#0#255#180#180#180#227#227#227#210#210
+ +#210#201#201#201#199#199#199#254#254#254#254#254#254#189#189#189#188#188#188
+ +#254#254#254#254#254#254#183#183#183#177#177#177#161#161#161#255#0#255#255#0
+ +#255'!'#181'H'#169#230#194#128#218#163'^'#208#138'Y'#207#135'M'#204'~'#254
+ +#254#254'C'#200'w9'#197'p2'#195'k'#254#254#254'*'#194'] '#181'H'#16#143#31
+ +#255#0#255#255#0#255#180#180#180#231#231#231#217#217#217#205#205#205#203#203
+ +#203#198#198#198#254#254#254#194#194#194#191#191#191#188#188#188#254#254#254
+ +#186#186#186#179#179#179#164#164#164#255#0#255#255#0#255'!'#181'I'#174#232
+ +#197#166#229#191#145#223#175#134#219#167'x'#215#157'g'#211#145'Y'#207#135'D'
+ +#201'x6'#197'n2'#195'l0'#197'j'''#187'W'#19#156'&'#255#0#255#255#0#255#180
+ +#180#180#233#233#233#230#230#230#223#223#223#218#218#218#213#213#213#208#208
+ +#208#203#203#203#195#195#195#189#189#189#188#188#188#188#188#188#183#183#183
+ +#169#169#169#255#0#255#255#0#255'"'#181'H'#146#224#179#174#232#198#177#233
+ +#200#169#230#194#155#227#184#135#221#170'j'#213#150'O'#205#130';'#199't6'#197
+ ,'p4'#200's+'#191'^'#20#164'('#255#0#255#255#0#255#180#180#180#224#224#224#233
+ +#233#233#235#235#235#231#231#231#227#227#227#220#220#220#209#209#209#199#199
+ +#199#192#192#192#189#189#189#190#190#190#185#185#185#171#171#171#255#0#255
+ +#255#0#255#255#0#255'8'#187'ZQ'#197'pS'#197'qQ'#197'oL'#195'kB'#192'd7'#188
+ +'Z.'#185'S%'#183'J#'#181'K#'#183'J'#26#175'9'#255#0#255#255#0#255#255#0#255
+ +#255#0#255#188#188#188#197#197#197#198#198#198#197#197#197#195#195#195#192
+ +#192#192#188#188#188#184#184#184#181#181#181#180#180#180#181#181#181#176#176
+ +#176#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255
+ +#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0#255#255#0
+ +#255#255#0#255#255#0#255#255#0#255#255#0#255#9'NumGlyphs'#2#2#7'OnClick'#7#13
+ +'btn_BackClick'#8'TabOrder'#2#3#0#0#0#0
+]);
diff --git a/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.pas b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.pas
new file mode 100644
index 0000000..28d5587
--- /dev/null
+++ b/internal/6.0.43.801/1/Everwood/Source/Delphi/uEWWizard.pas
@@ -0,0 +1,259 @@
+unit uEWWizard;
+
+{----------------------------------------------------------------------------}
+{ RemObjects' Hydra - IDE Library }
+{ }
+{ compiler: Delphi 6 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of Hydra }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$I Everwood.inc}
+
+interface
+
+uses
+ {$IFDEF FPC}LCLIntf, LResources,{$ENDIF}
+ SysUtils, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls;
+
+type
+ TEWWizardForm = class(TForm)
+ Panel1: TPanel;
+ Image1: TImage;
+ Label1: TLabel;
+ Label2: TLabel;
+ Bevel1: TBevel;
+ pc_Pages: TPageControl;
+ ts_Welcome: TTabSheet;
+ ts_Finish: TTabSheet;
+ Panel2: TPanel;
+ btn_Finish: TBitBtn;
+ btn_Cancel: TBitBtn;
+ Label3: TLabel;
+ Label4: TLabel;
+ btn_Next: TBitBtn;
+ btn_Back: TBitBtn;
+ Label5: TLabel;
+ Label6: TLabel;
+ lv_Options: TListView;
+ procedure btn_NextClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure btn_BackClick(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ private
+ fInEnterPage: boolean;
+ fActiveControl: TWinControl;
+ fValues: TStrings;
+ fNextPage: integer;
+ fPreviousPage: integer;
+ function GetActiveControl: TWinControl;
+ procedure SetActiveControl(const Value: TWinControl);
+ function GetNextPage: integer;
+ function GetPreviousPage: integer;
+ protected
+ procedure OnEnterPage(aPage:TTabSheet; aMovingForward:boolean); virtual;
+ procedure OnLeavePage(aPage:TTabSheet; aMovingForward:boolean); virtual;
+ procedure AfterEnterPage(aPage:TTabSheet; aMovingForward:boolean); virtual;
+
+ function CleanPascalString(const aString: string): string;
+ public
+ property Values:TStrings read fValues;
+ function Execute:boolean; overload;
+ class function Execute(aOwner: TComponent): boolean; overload;
+ property ActiveControl: TWinControl read GetActiveControl write SetActiveControl;
+ property NextPage: integer read GetNextPage write fNextPage;
+ property PreviousPage: integer read GetPreviousPage write fPreviousPage;
+ end;
+
+implementation
+
+// uses FileCtrl;
+{$IFNDEF FPC}
+{$R *.dfm}
+{$ENDIF FPC}
+
+{ THYNewProjectWizardForm }
+
+procedure TEWWizardForm.FormCreate(Sender: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to ComponentCount-1 do begin
+ if Components[i] is TTabSheet then TTabSheet(Components[i]).TabVisible := false;
+ end;
+
+ fValues := TStringList.Create();
+
+ Height := Height-16;
+ pc_Pages.ActivePageIndex := 0;
+ OnEnterPage(pc_Pages.Pages[0],true);
+
+ fNextPage := -1;
+ fPreviousPage := -1;
+end;
+
+procedure TEWWizardForm.FormDestroy(Sender: TObject);
+begin
+ FreeAndNil(fValues);
+end;
+
+function TEWWizardForm.CleanPascalString(const aString:string):string;
+begin
+ result := aString;
+ result := StringReplace(result,'''','''''',[rfReplaceAll]); { replace quotes with double quotes }
+ result := StringReplace(result,#13#10,'''#13#10''',[rfReplaceAll]);
+ result := ''''+result+'''';
+end;
+
+
+procedure TEWWizardForm.btn_NextClick(Sender: TObject);
+begin
+ if pc_Pages.ActivePageIndex+1 < pc_Pages.PageCount then begin
+ fInEnterPage := true;
+ try
+ OnLeavePage(pc_Pages.Pages[pc_Pages.ActivePageIndex],true);
+ OnEnterPage(pc_Pages.Pages[NextPage],true);
+ finally
+ fInEnterPage := false;
+ end;
+ fPreviousPage := pc_Pages.ActivePageIndex;
+ pc_Pages.ActivePageIndex := NextPage;
+ if Assigned(fActiveControl) then begin
+ inherited ActiveControl := fActiveControl;
+ fActiveControl := nil;
+ end;
+ end;
+ fNextPage := -1;
+ AfterEnterPage(pc_Pages.ActivePage, true);
+end;
+
+procedure TEWWizardForm.btn_BackClick(Sender: TObject);
+begin
+ if pc_Pages.ActivePageIndex > 0 then begin
+ fInEnterPage := true;
+ try
+ OnLeavePage(pc_Pages.Pages[pc_Pages.ActivePageIndex],false);
+ OnEnterPage(pc_Pages.Pages[PreviousPage],false);
+ finally
+ fInEnterPage := false;
+ end;
+ pc_Pages.ActivePageIndex := PreviousPage;
+ if Assigned(fActiveControl) then begin
+ inherited ActiveControl := fActiveControl;
+ fActiveControl := nil;
+ end;
+ end;
+ fNextPage := -1;
+ fPreviousPage := -1;
+ AfterEnterPage(pc_Pages.ActivePage, false);
+end;
+
+
+procedure TEWWizardForm.OnEnterPage(aPage: TTabSheet; aMovingForward: boolean);
+var
+ i: integer;
+begin
+ {$IFDEF FPC}
+ if aMovingForward then btn_Finish.Visible := false else // for prevent warnings
+ {$ENDIF}
+ btn_Finish.Visible := false;
+ btn_Next.Visible := true;
+ if aPage = ts_Welcome then begin
+ btn_Back.Enabled := false;
+ btn_Next.Enabled := true;
+ ActiveControl := btn_Next;
+ end
+ else if aPage = ts_Finish then begin
+ {$IFNDEF FPC}
+ lv_Options.Items.BeginUpdate();
+ {$ENDIF}
+ try
+ lv_Options.Items.Clear();
+ for i := 0 to Values.Count-1 do begin
+ with lv_Options.Items.Add() do begin
+ Caption := Values.Names[i];
+ SubItems.Add(Values.Values[Values.Names[i]]);
+ end;
+ end; { for }
+ btn_Finish.Visible := true;
+ btn_Finish.Enabled := true;
+ btn_Next.Visible := false;
+ ActiveControl := btn_Finish;
+ finally
+ {$IFNDEF FPC}
+ lv_Options.Items.EndUpdate();
+ {$ENDIF}
+ end;
+ end
+ else { default for custom added pages } begin
+ btn_Back.Enabled := true;
+ btn_Next.Enabled := true;
+ end;
+end;
+
+procedure TEWWizardForm.OnLeavePage(aPage: TTabSheet; aMovingForward: boolean);
+begin
+end;
+
+function TEWWizardForm.Execute: boolean;
+begin
+ result := (ShowModal() = 1); // idOk=1
+end;
+
+class function TEWWizardForm.Execute(aOwner: TComponent): boolean;
+begin
+ with self.Create(aOwner) do try
+ result := Execute();
+ finally
+ Free();
+ end;
+end;
+
+function TEWWizardForm.GetActiveControl: TWinControl;
+begin
+ if Assigned(fActiveControl) then
+ result := fActiveControl
+ else
+ result := inherited ActiveControl;
+end;
+
+procedure TEWWizardForm.SetActiveControl(const Value: TWinControl);
+begin
+ if fInEnterPage then begin
+ fActiveControl := Value;
+ end
+ else begin
+ inherited ActiveControl := Value;
+ fActiveControl := nil;
+ end;
+end;
+
+function TEWWizardForm.GetNextPage: integer;
+begin
+ Result := fNextPage;
+ if result = -1 then result := pc_Pages.ActivePageIndex+1;
+end;
+
+function TEWWizardForm.GetPreviousPage: integer;
+begin
+ Result := fPreviousPage;
+ if result = -1 then result := pc_Pages.ActivePageIndex-1;
+end;
+
+procedure TEWWizardForm.AfterEnterPage(aPage: TTabSheet;
+ aMovingForward: boolean);
+begin
+
+end;
+
+{$IFDEF FPC}
+initialization
+ {$i uEWWizard.lrs}
+{$ENDIF}
+end.
+
diff --git a/internal/6.0.43.801/1/Everwood/Welcome/Data Abstract/Welcome.png b/internal/6.0.43.801/1/Everwood/Welcome/Data Abstract/Welcome.png
new file mode 100644
index 0000000..752b4e3
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Welcome/Data Abstract/Welcome.png differ
diff --git a/internal/6.0.43.801/1/Everwood/Welcome/RemObjects SDK/Welcome.png b/internal/6.0.43.801/1/Everwood/Welcome/RemObjects SDK/Welcome.png
new file mode 100644
index 0000000..8c74989
Binary files /dev/null and b/internal/6.0.43.801/1/Everwood/Welcome/RemObjects SDK/Welcome.png differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Bin/PSUnitImporter.exe b/internal/6.0.43.801/1/Pascal Script for Delphi/Bin/PSUnitImporter.exe
new file mode 100644
index 0000000..fa363a1
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Bin/PSUnitImporter.exe differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Changes.txt b/internal/6.0.43.801/1/Pascal Script for Delphi/Changes.txt
new file mode 100644
index 0000000..386b89d
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Changes.txt
@@ -0,0 +1,187 @@
+==========
+ 3.0.3.57
+==========
+
+- NEW Support for Borland Developer Studio 2006
+
+==========
+ 3.0.3.53
+==========
+- Updated RemObjects SDk integration for Indy 10 / RO .349
+
+==========
+ 3.0.3.51
+==========
+- Support for Delphi 2005
+- Allow overriding internal procs.
+- Add importdecl to old style AddFunction ImportDecl.
+- New compiletime support functions
+- getconst/getconstcount
+- allow interface to be registered more than once and in any order
+- widestring published properties support.
+- Fix. Var parameter types weren't always checked.
+- fixes for CHAR consts.
+- Eliminate "Comparing signed and unsigned types" warnings (on D5) (jr)
+
+
+==========
+ 3.0.3.39
+==========
+- strtoint now throws an exception for invalid numbers.
+- Compiler fix: Check var parameters.
+- Docs update
+- Fixes in the import tool
+- Added a few new functions to make it earlier to add variable pointers to the script.
+- Added a few new samples
+- New Help system
+
+==========
+ 3.0.3.37
+==========
+
+- Classes and units renamed
+- product integrated into RemObjects Software product line
+
+==========
+ 3.0.1.33 (17 January 2004)
+==========
+- IDispatch Support now uses Variant for dynamic invocation
+- Smaller tweaks related to IDispatch
+
+==========
+ 3.0.1.32 (16 January 2004)
+==========
+- IDispatch type support
+- Dynamic Invoke using IDispatch
+- Removed Export mode, no need to set it anymore
+- RunProcP, RunProcPN functions, invoke IFPS3 functions with with 1 command
+- TIFPS3CompExec.ExecuteFunction wrapper for RunProcPN
+- Small Fix
+- Included missing .dpk
+
+==========
+ 3.0.1.31 (16 December 2003)
+==========
+- Fixes release
+
+==========
+ 3.0.1.30 (25 November 2003)
+==========
+- Better Interface support
+- Lot's of fixes and improvements
+- Records and other complex types passing to events
+- Adding regular variables to the script
+- PreProcessing
+
+==========
+ 3.0.1.21 (28 August 2003)
+==========
+- Speed Improvements
+- Default array properties
+- A few D5/BCC5 compatiblity changes
+- Help files update
+- SET properties
+- A few other fixes
+- Static arrays
+- With
+- Sets
+- Calling Interfaces (IUnknown etc)
+- AS/IS support (classes)
+- fixes
+- Speed Improvements
+- A small fix.
+
+==========
+ 3.0.1.20 beta 5 (31 July 2003)
+==========
+- Fix in codegen with some expressions
+- All Get* and Add* Method of the exec are now uppercasing their params
+- Removed AddExportVariable, now all variables are "exported"
+- Added an VGetAsString function that returns the string value of any variant.
+- Default array properties.
+
+==========
+ 3.0.1.20 beta 4 (26 July 2003)
+==========
+This release doesn't contain any new features, only fixes.
+
+==========
+ 3.0.1.20 beta 3 (05 May 2003)
+==========
+Changes since last beta:
+- A few D5/BCC5 compatiblity changes
+- Help files update
+- SET properties
+- A few other fixes
+
+==========
+ 3.0.1.20 beta 2 (02 April 2003)
+==========
+What's new: - Static arrays
+- With
+- Sets
+- Calling Interfaces (IUnknown etc)
+- AS/IS support (classes)
+- Assigned fixed
+- IFPS3 raises an exception when one of the Add* functions fail or when a scripted Event fails
+- A lot of fixes
+
+==========
+ 3.0.1.04 stable (09 March 2003)
+==========
+- A few fixes
+
+==========
+ 3.0.1.03 stable (14 January 2003)
+==========
+- New datetime library
+- Besides Open Array now also Dynamic Array (D4+) support
+- A few fixes
+
+==========
+ 3.0.1.02.1 stable (07 November 2002)
+==========
+- WideString/WideChar support
+- Some small fixes
+
+==========
+ 3.0.1.02 stable (26 August 2002)
+==========
+- Compiler speed improvements.
+- Couple of small changes.
+
+==========
+ 3.0.1.01.1 (08 July 2002)
+==========
+- Additions/Changes: Variant and Int64 support in calling library
+- Forward procedures
+- Automaticly adding published properties
+- Try/Finally/Except/End support
+- Open Array parameters in calling library
+- Component Wrapper
+
+==========
+ 3.0.1.01 (20 June 2002)
+==========
+- Added a lot of new imported classes
+- Added support for casting
+- Some fixes and changes
+
+==========
+ 3.0.1.00.3 stable (07 June 2002)
+==========
+- Kylix Demo
+- Dll Library updated for Kylix
+- Variant type
+- array constants
+- Procedural Variables
+- Nil
+- Events
+- Some fixes
+
+==========
+ 3.0.1.00.2 (15 May 2002)
+==========
+- Record support for class calling library.
+- Couple of new support functions.
+- Couple of fixes.
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_D11.bpl b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_D11.bpl
new file mode 100644
index 0000000..64994aa
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_D11.dcp b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_D11.dcp
new file mode 100644
index 0000000..d965146
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_D11.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_D11.dcu
new file mode 100644
index 0000000..f8e4be0
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_D11.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_Reg.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_Reg.dcu
new file mode 100644
index 0000000..69d30a7
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_Core_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_RO_D11.bpl b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_RO_D11.bpl
new file mode 100644
index 0000000..aef1ff0
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_RO_D11.bpl differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_RO_D11.dcp b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_RO_D11.dcp
new file mode 100644
index 0000000..b8136d8
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/PascalScript_RO_D11.dcp differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_DB.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_DB.dcu
new file mode 100644
index 0000000..20431d4
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_DB.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_buttons.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_buttons.dcu
new file mode 100644
index 0000000..9488ba8
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_buttons.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_classes.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_classes.dcu
new file mode 100644
index 0000000..fded99b
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_classes.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_comobj.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_comobj.dcu
new file mode 100644
index 0000000..4544e62
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_comobj.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_controls.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_controls.dcu
new file mode 100644
index 0000000..c0593d0
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_controls.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_dateutils.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_dateutils.dcu
new file mode 100644
index 0000000..bafcae0
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_dateutils.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_dll.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_dll.dcu
new file mode 100644
index 0000000..2629c15
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_dll.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_extctrls.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_extctrls.dcu
new file mode 100644
index 0000000..975d0b5
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_extctrls.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_forms.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_forms.dcu
new file mode 100644
index 0000000..3fba245
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_forms.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_graphics.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_graphics.dcu
new file mode 100644
index 0000000..9190d39
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_graphics.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_menus.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_menus.dcu
new file mode 100644
index 0000000..1359f4c
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_menus.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_std.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_std.dcu
new file mode 100644
index 0000000..114e147
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_std.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_stdctrls.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_stdctrls.dcu
new file mode 100644
index 0000000..e641f59
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSC_stdctrls.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSCompiler.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSCompiler.dcu
new file mode 100644
index 0000000..ba5fad0
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSCompiler.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent.dcu
new file mode 100644
index 0000000..fc40004
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_COM.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_COM.dcu
new file mode 100644
index 0000000..f22816e
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_COM.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_Controls.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_Controls.dcu
new file mode 100644
index 0000000..f5c8dc2
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_Controls.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_DB.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_DB.dcu
new file mode 100644
index 0000000..3a5eaf5
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_DB.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_Default.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_Default.dcu
new file mode 100644
index 0000000..d0b54e1
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_Default.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_Forms.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_Forms.dcu
new file mode 100644
index 0000000..e5b45ba
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_Forms.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_StdCtrls.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_StdCtrls.dcu
new file mode 100644
index 0000000..761b21d
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSComponent_StdCtrls.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSDebugger.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSDebugger.dcu
new file mode 100644
index 0000000..e33ddc8
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSDebugger.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSDisassembly.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSDisassembly.dcu
new file mode 100644
index 0000000..9b89b90
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSDisassembly.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSPreProcessor.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSPreProcessor.dcu
new file mode 100644
index 0000000..9d03948
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSPreProcessor.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_DB.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_DB.dcu
new file mode 100644
index 0000000..8d3f3f6
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_DB.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_buttons.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_buttons.dcu
new file mode 100644
index 0000000..cfa66d6
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_buttons.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_classes.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_classes.dcu
new file mode 100644
index 0000000..41fb79f
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_classes.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_comobj.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_comobj.dcu
new file mode 100644
index 0000000..8e9b7aa
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_comobj.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_controls.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_controls.dcu
new file mode 100644
index 0000000..7bd4aee
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_controls.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_dateutils.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_dateutils.dcu
new file mode 100644
index 0000000..fd18721
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_dateutils.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_dll.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_dll.dcu
new file mode 100644
index 0000000..f310c9f
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_dll.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_extctrls.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_extctrls.dcu
new file mode 100644
index 0000000..4d0f855
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_extctrls.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_forms.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_forms.dcu
new file mode 100644
index 0000000..8aa4f46
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_forms.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_graphics.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_graphics.dcu
new file mode 100644
index 0000000..80a975b
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_graphics.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_menus.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_menus.dcu
new file mode 100644
index 0000000..d95b5bc
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_menus.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_std.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_std.dcu
new file mode 100644
index 0000000..245a702
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_std.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_stdctrls.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_stdctrls.dcu
new file mode 100644
index 0000000..bfc8e8b
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSR_stdctrls.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSRuntime.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSRuntime.dcu
new file mode 100644
index 0000000..075e755
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSRuntime.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSUtils.dcu b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSUtils.dcu
new file mode 100644
index 0000000..666898d
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D11/uPSUtils.dcu differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_Core_D12.bpl b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_Core_D12.bpl
new file mode 100644
index 0000000..3acac61
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_Core_D12.bpl differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_Core_D12.dcp b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_Core_D12.dcp
new file mode 100644
index 0000000..e9f15a5
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_Core_D12.dcp differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_RO_D12.bpl b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_RO_D12.bpl
new file mode 100644
index 0000000..e58bf30
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_RO_D12.bpl differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_RO_D12.dcp b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_RO_D12.dcp
new file mode 100644
index 0000000..b9c8481
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D12/PascalScript_RO_D12.dcp differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_Core_D14.bpl b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_Core_D14.bpl
new file mode 100644
index 0000000..82a5232
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_Core_D14.bpl differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_Core_D14.dcp b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_Core_D14.dcp
new file mode 100644
index 0000000..da347e0
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_Core_D14.dcp differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_RO_D14.bpl b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_RO_D14.bpl
new file mode 100644
index 0000000..42c528e
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_RO_D14.bpl differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_RO_D14.dcp b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_RO_D14.dcp
new file mode 100644
index 0000000..e06154b
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D14/PascalScript_RO_D14.dcp differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_Core_D7.bpl b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_Core_D7.bpl
new file mode 100644
index 0000000..60990cf
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_Core_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_Core_D7.dcp b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_Core_D7.dcp
new file mode 100644
index 0000000..132a7f9
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_Core_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_RO_D7.bpl b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_RO_D7.bpl
new file mode 100644
index 0000000..c96352b
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_RO_D7.bpl differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_RO_D7.dcp b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_RO_D7.dcp
new file mode 100644
index 0000000..81ff70f
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Dcu/D7/PascalScript_RO_D7.dcp differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Help/RegisterDelphiHelp.exe b/internal/6.0.43.801/1/Pascal Script for Delphi/Help/RegisterDelphiHelp.exe
new file mode 100644
index 0000000..9536667
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Help/RegisterDelphiHelp.exe differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Launch.exe b/internal/6.0.43.801/1/Pascal Script for Delphi/Launch.exe
new file mode 100644
index 0000000..4b346d2
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Launch.exe differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/License.txt b/internal/6.0.43.801/1/Pascal Script for Delphi/License.txt
new file mode 100644
index 0000000..9b07198
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/License.txt
@@ -0,0 +1,85 @@
+*** REMOBJECTS SOFTWARE END USER LICENSE AGREEMENT ***
+
+Updated January 8, 2009
+
+IMPORTANT: PLEASE READ THIS DOCUMENT CAREFULLY AND IN ITS ENTIRETY BEFORE USING ANY SOFTWARE PRODUCT ACQUIRED FROM REMOBJECTS SOFTWARE.
+
+This document constitutes a LEGAL AGREEMENT between you, the End User (either an individual or an entity), and RemObjects Software, LLC.
+
+
+1. SCOPE
+
+This End User License Agreement ("EULA") covers all SOFTWARE PRODUCTS produced and sold by RemObjects Software, LLC. The sections of this EULA that contain information that pertain specifically to a certain product are properly marked as such.
+
+SOFTWARE PRODUCTS covered this EULA:
+
+* RemObjects AnyDAC
+* RemObjects Data Abstract
+* RemObjects DebugServer
+* RemObjects Developer Studio
+* RemObjects Everwood
+* RemObjects Internet Pack
+* RemObjects Hydra
+* RemObjects Oxygene
+* RemObjects Pascal Script
+* RemObjects SDK
+
+
+2. DEFINITIONS
+
+SOFTWARE PRODUCTS: refers to one or more product as made available as a unified installation package.
+
+(LIBRARY) SOURCE CODE: refers to the source code shipped with any of the SOFTWARE PRODUCTS licensed to you, the End User, in the “Source” folder of the product installation.
+
+TOOLS: refers to ANY of the applications deployed with the SOFTWARE PRODUCTS in executable form, whether as auxiliary helper programs of a Library product or as main product. This includes but is not limited to any .EXE files and IDE integration.
+
+SAMPLE CODE: sample code is provided to you as part of the SOFTWARE PRODUCT license inside the “Samples” folder
+
+EXECUTABLE FORMAT refers to executable files such as .EXE and .DLL files build from your own source code, linking in code provided as part of the LIBRARY SOURCE CODE. It does not encompass Delphi .DCU or .BPL/.DCP files or any other format that would allow a third party to the provided file as a replacement for the LIBRARY SOURCE CODE
+
+
+3. COPYRIGHT
+
+This SOFTWARE PRODUCT is owned by RemObjects Software, LLC and is protected by copyright laws and international copyright treaties.
+
+All copyrights of this SOFTWARE PRODUCT, including but not limited to any source code, tools, documentation, images, text, and samples incorporated into the SOFTWARE PRODUCT, as well as those provided via Support Services or any of the RemObjects websites, are proprietary products of RemObjects Software, LLC and are protected by copyright law. You acquire only the right to use the SOFTWARE PRODUCT and do not acquire any rights of ownership. You acknowledge that the SOFTWARE PRODUCT and its source code remains a confidential trade secret of RemObjects Software, LLC. RemObjects Software, LLC may have trademarks, copyrights, patents or other intellectual property rights covering the SOFTWARE PRODUCT. You are not granted any license to these patents, trademarks, copyrights, or other intellectual property rights except as expressly provided herein. RemObjects Software, LLC reserves all rights not expressly granted.
+
+All names and logos of the SOFTWARE PRODUCTS defined in the SCOPE section of this EULA are trademarks or registered trademarks of RemObjects Software, LLC. These names and logos may only be used by the End User when referring to RemObjects Software, LLC or any of its products. These names and logos may not be used by the End User for branding or marketing purposes, without written consent from RemObjects Software, LLC.
+
+
+2. GRANT OF LICENSE
+
+BY INSTALLING, COPYING, OR OTHERWISE USING THE SOFTWARE PRODUCT, YOU AGREE TO BE BOUND BY ALL OF THE TERMS AND CONDITIONS OF THIS END USER LICENSE AGREEMENT. IF YOU DO NOT AGREE TO THE TERMS OF THIS AGREEMENT, YOU ARE NOT PERMITTED TO INSTALL, COPY, OR USE THE SOFTWARE PRODUCT. IF YOU REJECT THE TERMS OF THIS AGREEMENT WITHIN THIRTY (30) DAYS AFTER PURCHASING THE SOFTWARE PRODUCT, YOU MAY SEND AN EMAIL TO sales@remobjects.com AND REQUEST A FULL REFUND OF THE PURCHASE PRICE. IN ORDER TO RECEIVE THE REFUND, YOU MUST IRREVOCABLY UNINSTALL AND/OR DELETE ANY AND ALL COPIES OF THE SOFTWARE PRODUCT(S) YOU HAVE PURCHASED, AND PROVIDE CERTIFICATION OF SUCH TO REMOBJECTS.
+You may make one copy of the SOFTWARE PRODUCT solely for backup or archival purposes or transfer the SOFTWARE PRODUCT to a single hard disk provided you keep the original solely for backup or archival purposes.
+
+You may install the software on up to five computers, providing you are the only person using the software on these computers.
+
+You may not alter any of the programs or accompanying files without written permission from RemObjects Software, LLC. Any resale or commercial distribution of the SOFTWARE PRODUCT is strictly prohibited, unless RemObjects Software, LLC has given explicit written permission.
+
+You are not obtaining title to the SOFTWARE PRODUCT or any copyrights. You may not sublicense, rent, lease, convey, modify, translate, convert to another programming language, decompile, or disassemble the SOFTWARE PRODUCT for any purpose. RemObjects Software, LLC grants you as an individual, a personal, non exclusive license to install and use the SOFTWARE PRODUCT for the sole purpose of developing systems that are not in competition with the SOFTWARE PRODUCT, or any other products developed and sold by RemObjects Software, LLC.
+
+If you are an entity, RemObjects Software, LLC grants you the right to designate one individual within your organization to have the right to use the SOFTWARE PRODUCT in the manner described above.
+The named License you acquired is not transferrable to another individual or entity, unless you are given written permission by RemObjects Software, LLC.
+
+You may link against the LIBRARY SOURCE CODE and deploy it in EXECUTABLE FORMAT as part of your application; you may make changes to the LIBRARY SOURCE CODE and write extensions for your own use, and link against and deploy your changes in EXECUTABLE FORMAT. You may NOT deploy RemObjects Software’s source code to anyone.
+SAMPLE CODE for provided for your convenience and you may use it at your discretion. You may create your own products starting from the samples provided and consider this derived work as your own. You may also deploy such derived work in any way you see fit, including in source code form.
+
+Unless specifically stated on a per-tool basis, you may not deploy the TOOLS included with the SOFTWARE PRODUCT to anyone, neither standalone or as part of your own application; the tools are intended solely for use by yourself.
+In general, you may not distribute any part of the installed product, nor any license codes, license files or your website login to third parties.
+
+
+3. SUPPORT SERVICES
+
+RemObjects Software, LLC may provide the End User with Support Services related to the SOFTWARE PRODUCT. Support Services include free downloading of upgrades as covered by the original purchase, as well as technical support offered via NNTP-based newsgroups, e-mail or telephone. Use of Support Services is governed by RemObjects Software policies and programs described on the RemObjects website (www.remobjects.com/support) and may be subject to additional support charges depending on the type and level of support provided. Any supplemental software code provided to you as part of the Support Services shall be considered part of the SOFTWARE PRODUCT and is subject to the terms and conditions of this EULA.
+
+
+4. TERMINATION
+
+This License shall remain in effect only for so long as you are in compliance with the terms and conditions of this EULA. This License will terminate if you fail to comply with any of its terms or conditions. You may terminate it at any time by destroying your copies of the SOFTWARE PRODUCT. You agree, upon termination, to destroy all copies of the Product. Without prejudice to any other rights, RemObjects Software, LLC may terminate this EULA if you fail to comply with the terms. The provisions of this EULA that protect the proprietary rights of RemObjects Software, LLC and the LIMITATIONS OF WARRANTIES will continue to be in force even after any termination. Upon termination, RemObjects Software, LLC may also enforce any rights provided by law.
+
+
+5. LIMITATIONS OF WARRANTIES AND LIABILITY
+
+THIS SOFTWARE PRODUCT IS PROVIDED TO YOU "AS IS" WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE APPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. YOU ASSUME THE ENTIRE RISK AS TO THE ACCURACY AND THE USE OF THE SOFTWARE PRODUCT AND ALL OTHER RISK ARISING FROMTHE USE OR PERFORMANCE OF THIS SOFTWARE PRODUCT AND DOCUMENTATION.
+
+RemObjects Software, LLC SHALL NOT BE LIABLE FOR ANY DAMAGES WHATSOEVER ARISING FROM USE OF OR INABILITY TO USE THIS SOFTWARE PRODUCT, EVEN IF RemObjects Software, LLC HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL RemObjects Software, LLC BE LIABLE FOR ANY CONSEQUENTIAL, INCIDENTAL, DIRECT, INDIRECT, SPECIAL, PUNITIVE, OR OTHER DAMAGES WHATSOEVER, INCLUDING BUT NOT LIMITED TO DAMAGES OR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS, EVEN IF RemObjects Software, LLC HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME STATES/JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Pascal Script.ico b/internal/6.0.43.801/1/Pascal Script for Delphi/Pascal Script.ico
new file mode 100644
index 0000000..26e084f
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Pascal Script.ico differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/README.html b/internal/6.0.43.801/1/Pascal Script for Delphi/README.html
new file mode 100644
index 0000000..170180b
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/README.html
@@ -0,0 +1,64 @@
+
+
+Welcome to the RemObjects Pascal Script™ 3.0
+
+Support
+
+Support for RemObjects Pascal Script is available via our newsgroups at
+remobjects.public.pascalscript .
+
+You can use these newsgroups to report any problems or suggestions you might have in regards to PS, you can communicate with fellow Pascal Script users, and exchange ideas and solutions.
+
+
+ Updates, additional sample projects and additional third-party contributions for Pascal Script will be available on our website at www.remobjects.com/ps .
+
+
+Where to go from here
+
+ To get started using the Pascal Script, please visit our extensive article library available at
+ http://www.remobjects.com/articles .
+
+
+
+
+
+Thank you very much,
+
+Your RemObjects Team
+
+http://www.remobjects.com
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Samples.lnk b/internal/6.0.43.801/1/Pascal Script for Delphi/Samples.lnk
new file mode 100644
index 0000000..3e3d871
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Samples.lnk differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D10.bdsgroup b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D10.bdsgroup
new file mode 100644
index 0000000..2f606c0
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D10.bdsgroup
@@ -0,0 +1,23 @@
+
+
+
+
+ Default.Personality
+
+ 1.0
+ {1AAFA68F-D7AE-44BA-927F-310105A7A640}
+
+
+
+
+
+
+
+ PascalScript_Core_D10.bdsproj
+ PascalScript_RO_D10.bdsproj
+ PascalScript_Core_D10.bpl PascalScript_RO_D10.bpl
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D11.groupproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D11.groupproj
new file mode 100644
index 0000000..8bf0c0a
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D11.groupproj
@@ -0,0 +1,44 @@
+
+
+ {301d154e-a852-4e08-89a3-6bfb2774fb38}
+
+
+
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D12.groupproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D12.groupproj
new file mode 100644
index 0000000..4a8272f
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D12.groupproj
@@ -0,0 +1,44 @@
+
+
+ {301d154e-a852-4e08-89a3-6bfb2774fb38}
+
+
+
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D14.groupproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D14.groupproj
new file mode 100644
index 0000000..6756d58
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D14.groupproj
@@ -0,0 +1,50 @@
+
+
+ {301d154e-a852-4e08-89a3-6bfb2774fb38}
+
+
+
+
+
+
+
+
+
+
+ Default.Personality.12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D6.bpg b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D6.bpg
new file mode 100644
index 0000000..3fe0ddd
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D6.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+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 = PascalScript_Core_D6.bpl PascalScript_RO_D6.bpl
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+PascalScript_Core_D6.bpl: PascalScript_Core_D6.dpk
+ $(DCC)
+
+PascalScript_RO_D6.bpl: PascalScript_RO_D6.dpk
+ $(DCC)
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D7.bpg b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D7.bpg
new file mode 100644
index 0000000..8e45715
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/BuildPackages_D7.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+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 = PascalScript_Core_D7.bpl PascalScript_RO_D7.bpl
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+PascalScript_Core_D7.bpl: PascalScript_Core_D7.dpk
+ $(DCC)
+
+PascalScript_RO_D7.bpl: PascalScript_RO_D7.dpk
+ $(DCC)
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript.inc b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript.inc
new file mode 100644
index 0000000..7e30390
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript.inc
@@ -0,0 +1,62 @@
+{----------------------------------------------------------------------------}
+{ RemObjects Pascal Script }
+{ }
+{ compiler: Delphi 2 and up, Kylix 3 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{----------------------------------------------------------------------------}
+
+
+{$INCLUDE eDefines.inc}
+
+{$IFDEF FPC}{$MODE DELPHI}{$H+}{$ENDIF}
+
+{$IFDEF VER125}{C4}{$B-}{$X+}{$T-}{$H+}{$ENDIF}
+{$IFDEF VER110}{C3}{$B-}{$X+}{$T-}{$H+}{$ENDIF}
+{$IFDEF VER93}{C1}{$B-}{$X+}{$T-}{$H+}{$ENDIF}
+
+{$IFDEF DELPHI4UP}
+ {$DEFINE PS_HAVEVARIANT}
+ {$DEFINE PS_DYNARRAY}
+{$ENDIF}
+
+{$IFNDEF FPC}
+ {$B-}{$X+}{$T-}{$H+}
+{$ELSE}
+ {$R-}{$Q-}
+{$ENDIF}
+
+{$IFNDEF FPC}
+{$IFNDEF DELPHI4UP}
+{$IFNDEF LINUX}
+ {$DEFINE PS_NOINT64}
+{$ENDIF}
+{$ENDIF}
+
+{$IFDEF DELPHI2}
+ {$DEFINE PS_NOINT64}
+ {$DEFINE PS_NOWIDESTRING}
+ {$B-}{$X+}{$T-}{$H+}
+{$ENDIF}
+
+{$IFDEF LINUX}{KYLIX}{$DEFINE CLX}{$DEFINE DELPHI3UP}{$DEFINE DELPHI6UP}{$ENDIF}
+{$ENDIF}
+{$R-}{$Q-}
+
+
+{
+Defines:
+ IFPS3_NOSMARTLIST - Don't use the smart list option
+}
+
+{$UNDEF DEBUG}
+
+{$IFDEF CLX}
+{$DEFINE PS_NOIDISPATCH} // not implemented
+{$ENDIF}
+
+{$IFDEF FPC}
+ {$I PascalScriptFPC.inc}
+{$ENDIF}
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScriptFPC.inc b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScriptFPC.inc
new file mode 100644
index 0000000..880a117
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScriptFPC.inc
@@ -0,0 +1,15 @@
+
+ {$DEFINE PS_HAVEVARIANT}
+ {$DEFINE PS_DYNARRAY}
+ {$DEFINE PS_NOIDISPATCH}
+ {.$if (fpc_version=2) and (fpc_release>=3) and (fpc_patch>=1)}
+ {$if (fpc_version=2) and (fpc_release>=2) and (fpc_patch>=4)}
+ {$UNDEF FPC_OLD_FIX}
+ {$UNDEF PS_FPCSTRINGWORKAROUND}
+ {FreePascal 2.3.1 and above has much Delphi compatibility bugs fixed}
+ {$else}
+ {$DEFINE FPC_OLD_FIX}
+ {$DEFINE PS_FPCSTRINGWORKAROUND}
+ {$ifend}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI6UP}
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D10.bdsproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D10.bdsproj
new file mode 100644
index 0000000..b3b708b
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D10.bdsproj
@@ -0,0 +1,177 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {7803B416-C1B3-4801-BCDB-CB1C64840119}
+
+
+
+
+ PascalScript_Core_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Pascal Script - Core Package False
+
+
+
+ ..\Dcu\D10
+ ..\Dcu\D10
+ ..\Dcu\D10
+ ..\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ 0
+ 3
+ 0
+ 6
+ 442
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.6.442
+
+
+
+
+ Pascal Script
+ 3.0.0.0
+ Tuesday, March 21, 2006 1:32 PM Monday, February 28, 2005 3:33 PM
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D10.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D10.dpk
new file mode 100644
index 0000000..27aaec8
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D10.dpk
@@ -0,0 +1,76 @@
+package PascalScript_Core_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ uPSR_forms in 'uPSR_forms.pas',
+ uPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D10.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D10.res
new file mode 100644
index 0000000..bcbf747
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D10.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D11.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D11.dpk
new file mode 100644
index 0000000..f6dc948
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D11.dpk
@@ -0,0 +1,77 @@
+package PascalScript_Core_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO OFF}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS OFF}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+{$DEFINE RELEASE}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ uPSR_forms in 'uPSR_forms.pas',
+ uPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D11.dproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D11.dproj
new file mode 100644
index 0000000..84798a4
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D11.dproj
@@ -0,0 +1,596 @@
+
+
+
+ {634be604-b73a-4b3d-bc81-719c905199e6}
+ PascalScript_Core_D11.dpk
+ Release
+ AnyCPU
+ DCC32
+ ..\Dcu\D11\PascalScript_Core_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ 0
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ Delphi.Personality
+ Package
+
+False True False RemObjects Pascal Script - Core Package False True False True False 3 0 43 801 False False False False False 1033 1252 RemObjects Software 3.0.43.801 Pascal Script 3.0.0.0 Wednesday, December 02, 2009 4:28 PM Monday, February 28, 2005 3:33 PM PascalScript_Core_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D11.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D11.res
new file mode 100644
index 0000000..7ec979e
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D11.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D12.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D12.dpk
new file mode 100644
index 0000000..e75959d
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D12.dpk
@@ -0,0 +1,76 @@
+package PascalScript_Core_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ uPSR_forms in 'uPSR_forms.pas',
+ uPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D12.dproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D12.dproj
new file mode 100644
index 0000000..f1023cc
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D12.dproj
@@ -0,0 +1,126 @@
+
+
+ {634be604-b73a-4b3d-bc81-719c905199e6}
+ PascalScript_Core_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\Dcu\D12\PascalScript_Core_D12.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ RemObjects Pascal Script - Core Package
+ ..\Dcu\D12\PascalScript_Core_D12.bpl
+ ..\Dcu\D12;$(DCC_UnitSearchPath)
+ ..\Dcu\D12
+ ..\Dcu\D12
+ true
+ true
+ ..\Dcu\D12
+ 00400000
+ true
+ true
+ true
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 43
+ 801
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.43.801
+
+
+
+
+ Pascal Script
+ 3.0.0.0
+ Friday, March 21, 2008 1:24 PM
+ Monday, February 28, 2005 3:33 PM
+
+
+ PascalScript_Core_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D12.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D12.res
new file mode 100644
index 0000000..eaacb67
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D12.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D14.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D14.dpk
new file mode 100644
index 0000000..4c7a6a1
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D14.dpk
@@ -0,0 +1,152 @@
+package PascalScript_Core_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ uPSR_forms in 'uPSR_forms.pas',
+ uPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
+package PascalScript_Core_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ uPSR_forms in 'uPSR_forms.pas',
+ uPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D14.dproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D14.dproj
new file mode 100644
index 0000000..7d0e53b
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D14.dproj
@@ -0,0 +1,127 @@
+
+
+ {634be604-b73a-4b3d-bc81-719c905199e6}
+ PascalScript_Core_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\Dcu\D12\PascalScript_Core_D12.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ RemObjects Pascal Script - Core Package
+ ..\Dcu\D14\PascalScript_Core_D14.bpl
+ ..\Dcu\D14;$(DCC_UnitSearchPath)
+ ..\Dcu\D14
+ ..\Dcu\D14
+ true
+ true
+ ..\Dcu\D14
+ 00400000
+ true
+ true
+ true
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 43
+ 801
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.43.801
+
+
+
+
+ Pascal Script
+ 3.0.0.0
+ Friday, March 21, 2008 1:24 PM
+ Monday, February 28, 2005 3:33 PM
+
+
+ PascalScript_Core_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D14.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D14.res
new file mode 100644
index 0000000..34ee35f
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D14.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D3.dof b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D3.dof
new file mode 100644
index 0000000..a71ae03
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D3.dof
@@ -0,0 +1,115 @@
+[FileVersion]
+Version=3.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Pascal Script - Core Package
+
+[Directories]
+OutputDir=s:\exe
+UnitOutputDir=..\Dcu\D3
+PackageDLLOutputDir=..\Dcu\D3
+PackageDCPOutputDir=..\Dcu\D3
+SearchPath=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+ProductName=Pascal Script
+ProductVersion=3.0.0.0
+FileDescription=
+FileVersion=3.0.2.34
+OriginalFilename=
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D3.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D3.dpk
new file mode 100644
index 0000000..6fa0e11
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D3.dpk
@@ -0,0 +1,76 @@
+package PascalScript_Core_D3;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ uPSR_forms in 'uPSR_forms.pas',
+ uPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D4.dof b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D4.dof
new file mode 100644
index 0000000..735a460
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D4.dof
@@ -0,0 +1,114 @@
+[FileVersion]
+Version=4.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Pascal Script - Core Package
+
+[Directories]
+UnitOutputDir=..\Dcu\D4
+PackageDLLOutputDir=..\Dcu\D4
+PackageDCPOutputDir=..\Dcu\D4
+SearchPath=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+ProductName=Pascal Script
+ProductVersion=3.0.0.0
+FileDescription=
+FileVersion=3.0.2.34
+OriginalFilename=
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D4.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D4.dpk
new file mode 100644
index 0000000..d300a0e
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D4.dpk
@@ -0,0 +1,76 @@
+package PascalScript_Core_D4
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ uPSR_forms in 'uPSR_forms.pas',
+ uPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D5.dof b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D5.dof
new file mode 100644
index 0000000..5b2a54e
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D5.dof
@@ -0,0 +1,114 @@
+[FileVersion]
+Version=5.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Pascal Script - Core Package
+
+[Directories]
+UnitOutputDir=..\Dcu\D5
+PackageDLLOutputDir=..\Dcu\D5
+PackageDCPOutputDir=..\Dcu\D5
+SearchPath=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+ProductName=Pascal Script
+ProductVersion=3.0.0.0
+FileDescription=
+FileVersion=3.0.2.34
+OriginalFilename=
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D5.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D5.dpk
new file mode 100644
index 0000000..6c09f9a
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D5.dpk
@@ -0,0 +1,76 @@
+package PascalScript_Core_D5;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ uPSR_forms in 'uPSR_forms.pas',
+ uPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D6.dof b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D6.dof
new file mode 100644
index 0000000..5e1c515
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D6.dof
@@ -0,0 +1,114 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Pascal Script - Core Package
+
+[Directories]
+UnitOutputDir=..\Dcu\D6
+PackageDLLOutputDir=..\Dcu\D6
+PackageDCPOutputDir=..\Dcu\D6
+SearchPath=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+ProductName=Pascal Script
+ProductVersion=3.0.0.0
+FileDescription=
+FileVersion=3.0.2.36
+OriginalFilename=
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D6.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D6.dpk
new file mode 100644
index 0000000..4bf9c7b
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D6.dpk
@@ -0,0 +1,76 @@
+package PascalScript_Core_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ uPSR_forms in 'uPSR_forms.pas',
+ uPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D6.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D6.res
new file mode 100644
index 0000000..b0b3400
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D6.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D7.dof b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D7.dof
new file mode 100644
index 0000000..51d8004
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D7.dof
@@ -0,0 +1,123 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Pascal Script - Core Package
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\Dcu\D7
+PackageDLLOutputDir=..\Dcu\D7
+PackageDCPOutputDir=..\Dcu\D7
+SearchPath=
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+ProductName=Pascal Script
+ProductVersion=3.0.0.0
+FileDescription=
+FileVersion=3.0.43.801
+OriginalFilename=
+CompileDate=Tuesday, March 21, 2006 1:32 PM
+
+[Version Info]
+IncludeVerInfo=1
+MajorVer=3
+MinorVer=0
+Release=43
+Build=801
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D7.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D7.dpk
new file mode 100644
index 0000000..4695586
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D7.dpk
@@ -0,0 +1,76 @@
+package PascalScript_Core_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ uPSR_forms in 'uPSR_forms.pas',
+ uPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D7.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D7.res
new file mode 100644
index 0000000..eaacb67
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_D7.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_Glyphs.RES b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_Glyphs.RES
new file mode 100644
index 0000000..aa4c040
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_Glyphs.RES differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_K3.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_K3.dpk
new file mode 100644
index 0000000..bbc6bb3
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_K3.dpk
@@ -0,0 +1,76 @@
+package PascalScript_Core_K3;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - Core Package'}
+{$DESIGNONLY}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl,
+ dbrtl;
+
+contains
+ uPSC_extctrls in 'uPSC_extctrls.pas',
+ uPSC_forms in 'uPSC_forms.pas',
+ uPSC_graphics in 'uPSC_graphics.pas',
+ uPSC_menus in 'uPSC_menus.pas',
+ uPSC_std in 'uPSC_std.pas',
+ uPSC_stdctrls in 'uPSC_stdctrls.pas',
+ uPSCompiler in 'uPSCompiler.pas',
+ uPSComponent in 'uPSComponent.pas',
+ uPSComponent_COM in 'uPSComponent_COM.pas',
+ uPSComponent_Controls in 'uPSComponent_Controls.pas',
+ uPSComponent_DB in 'uPSComponent_DB.pas',
+ uPSComponent_Default in 'uPSComponent_Default.pas',
+ uPSComponent_Forms in 'uPSComponent_Forms.pas',
+ uPSComponent_StdCtrls in 'uPSComponent_StdCtrls.pas',
+ uPSDebugger in 'uPSDebugger.pas',
+ uPSDisassembly in 'uPSDisassembly.pas',
+ uPSPreProcessor in 'uPSPreProcessor.pas',
+ uPSR_buttons in 'uPSR_buttons.pas',
+ uPSR_classes in 'uPSR_classes.pas',
+ uPSR_comobj in 'uPSR_comobj.pas',
+ uPSR_controls in 'uPSR_controls.pas',
+ uPSR_dateutils in 'uPSR_dateutils.pas',
+ uPSR_DB in 'uPSR_DB.pas',
+ uPSR_dll in 'uPSR_dll.pas',
+ uPSR_extctrls in 'uPSR_extctrls.pas',
+ UPSR_forms in 'uPSR_forms.pas',
+ UPSR_graphics in 'uPSR_graphics.pas',
+ uPSR_menus in 'uPSR_menus.pas',
+ uPSR_std in 'uPSR_std.pas',
+ uPSR_stdctrls in 'uPSR_stdctrls.pas',
+ uPSRuntime in 'uPSRuntime.pas',
+ uPSUtils in 'uPSUtils.pas',
+ uPSC_buttons in 'uPSC_buttons.pas',
+ uPSC_classes in 'uPSC_classes.pas',
+ uPSC_comobj in 'uPSC_comobj.pas',
+ uPSC_controls in 'uPSC_controls.pas',
+ uPSC_dateutils in 'uPSC_dateutils.pas',
+ uPSC_DB in 'uPSC_DB.pas',
+ uPSC_dll in 'uPSC_dll.pas',
+ PascalScript_Core_Reg in 'PascalScript_Core_Reg.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_K3.kof b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_K3.kof
new file mode 100644
index 0000000..ee8a4da
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_K3.kof
@@ -0,0 +1,114 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Pascal Script - Core Package
+
+[Directories]
+UnitOutputDir=../Dcu/K3
+PackageDLLOutputDir=../Dcu/K3
+PackageDCPOutputDir=../Dcu/K3
+SearchPath=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+ProductName=Pascal Script
+ProductVersion=3.0.0.0
+FileDescription=
+FileVersion=3.0.2.34
+OriginalFilename=
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_Reg.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_Reg.pas
new file mode 100644
index 0000000..5987b51
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_Core_Reg.pas
@@ -0,0 +1,65 @@
+unit PascalScript_Core_Reg;
+
+{----------------------------------------------------------------------------
+/ RemObjects Pascal Script
+/
+/ compiler: Delphi 2 and up, Kylix 3 and up
+/ platform: Win32, Linux
+/
+/ (c)opyright RemObjects Software. all rights reserved.
+/
+----------------------------------------------------------------------------}
+
+{$I PascalScript.inc}
+
+interface
+
+{$IFNDEF FPC}
+{$R PascalScript_Core_Glyphs.res}
+{$ENDIF}
+
+procedure Register;
+
+implementation
+
+uses
+ Classes,
+ {$IFDEF FPC}
+ LResources,
+ {$ENDIF}
+ uPSComponent,
+ uPSDebugger,
+ uPSComponent_Default,
+ {$IFNDEF FPC}
+ uPSComponent_COM,
+ {$ENDIF}
+ uPSComponent_DB,
+ uPSComponent_Forms,
+ uPSComponent_Controls,
+ uPSComponent_StdCtrls;
+
+procedure Register;
+begin
+ RegisterComponents('Pascal Script', [TPSScript,
+ TPSScriptDebugger,
+ TPSDllPlugin,
+ TPSImport_Classes,
+ TPSImport_DateUtils,
+ {$IFNDEF FPC}
+ TPSImport_ComObj,
+ {$ENDIF}
+ TPSImport_DB,
+ TPSImport_Forms,
+ TPSImport_Controls,
+ TPSImport_StdCtrls,
+ TPSCustumPlugin]);
+end;
+
+
+{$IFDEF FPC}
+ initialization;
+ {$i pascalscript.lrs}
+{$ENDIF}
+
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D10.bdsproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D10.bdsproj
new file mode 100644
index 0000000..ce21b21
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D10.bdsproj
@@ -0,0 +1,179 @@
+
+
+
+
+ Delphi.Personality
+
+ 1.0
+ {5B47E7C8-6AAF-4215-8EC3-60B739B2B5F3}
+
+
+
+
+ PascalScript_RO_D10.dpk
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ True
+ True
+
+
+ False
+
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+ RemObjects Pascal Script - RemObjects SDK 4.0 Integration
+ False
+
+
+
+ ..\Dcu\D10
+ ..\Dcu\D10
+
+ ..\Dcu\D10;$(BDS)\lib\Indy9;..\..\RemObjects SDK for Dephi\Dcu\D10
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 3
+ 0
+ 38
+ 769
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.38.769
+
+
+
+
+ Pascal Script
+ 3.0.0.0
+ Friday, May 15, 2009 1:36 PM
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D10.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D10.dpk
new file mode 100644
index 0000000..414bd0c
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D10.dpk
@@ -0,0 +1,47 @@
+package PascalScript_RO_D10;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - RemObjects SDK 4.0 Integration'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ {$IFDEF RemObjects_INDY9}
+ Indy,
+ {$ELSE}
+ IndyCore, IndySystem, IndyProtocols,
+ {$ENDIF}
+ PascalScript_Core_D10,
+ RemObjects_Core_D10,
+ RemObjects_Indy_D10,
+ dbrtl,
+ vcl,
+ vclx;
+
+contains
+ PascalScript_RO_Reg in 'PascalScript_RO_Reg.pas',
+ uROPSServerLink in 'uROPSServerLink.pas',
+ uROPSImports in 'uROPSImports.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D10.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D10.res
new file mode 100644
index 0000000..bcbf747
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D10.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D11.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D11.dpk
new file mode 100644
index 0000000..f0e2e8a
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D11.dpk
@@ -0,0 +1,47 @@
+package PascalScript_RO_D11;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - RemObjects SDK 5.0 Integration'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ {$IFDEF RemObjects_INDY9}
+ Indy,
+ {$ELSE}
+ IndyCore, IndySystem, IndyProtocols,
+ {$ENDIF}
+ PascalScript_Core_D11,
+ RemObjects_Core_D11,
+ RemObjects_Indy_D11,
+ dbrtl,
+ vcl,
+ vclx;
+
+contains
+ PascalScript_RO_Reg in 'PascalScript_RO_Reg.pas',
+ uROPSServerLink in 'uROPSServerLink.pas',
+ uROPSImports in 'uROPSImports.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D11.dproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D11.dproj
new file mode 100644
index 0000000..b028407
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D11.dproj
@@ -0,0 +1,81 @@
+
+
+
+ {0eefdf9b-7853-40e5-9b29-b631f51beeda}
+ PascalScript_RO_D11.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\Dcu\D11\PascalScript_RO_D11.bpl
+
+
+ 7.0
+ False
+ False
+ True
+ 0
+ ..\Dcu\D9
+ ..\Dcu\D9
+ ..\Dcu\D9
+ ..\Dcu\D9
+ ..\Dcu\D9;$(BDS)\lib\Indy9;..\..\RemObjects SDK for Dephi\Dcu\D9
+ ..\Dcu\D9;$(BDS)\lib\Indy9;..\..\RemObjects SDK for Dephi\Dcu\D9
+ ..\Dcu\D9;$(BDS)\lib\Indy9;..\..\RemObjects SDK for Dephi\Dcu\D9
+ ..\Dcu\D9;$(BDS)\lib\Indy9;..\..\RemObjects SDK for Dephi\Dcu\D9
+ RELEASE
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+
+
+ 7.0
+ True
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D11
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D11
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D11
+ ..\Dcu\D11;..\..\RemObjects SDK for Dephi\Dcu\D11
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ ..\Dcu\D11
+
+
+ Delphi.Personality
+ Package
+
+ False True False RemObjects Pascal Script - RemObjects SDK 5.0 Integration False False False True False 3 0 43 801 False False False False False 1033 1252 RemObjects Software 3.0.43.801 Pascal Script 3.0.0.0 Tuesday, March 21, 2006 1:32 PM PascalScript_RO_D11.dpk
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D11.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D11.res
new file mode 100644
index 0000000..eaacb67
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D11.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D12.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D12.dpk
new file mode 100644
index 0000000..25dd8aa
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D12.dpk
@@ -0,0 +1,47 @@
+package PascalScript_RO_D12;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - RemObjects SDK 5.0 Integration'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ {$IFDEF RemObjects_INDY9}
+ Indy,
+ {$ELSE}
+ IndyCore, IndySystem, IndyProtocols,
+ {$ENDIF}
+ PascalScript_Core_D12,
+ RemObjects_Core_D12,
+ RemObjects_Indy_D12,
+ dbrtl,
+ vcl,
+ vclx;
+
+contains
+ PascalScript_RO_Reg in 'PascalScript_RO_Reg.pas',
+ uROPSServerLink in 'uROPSServerLink.pas',
+ uROPSImports in 'uROPSImports.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D12.dproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D12.dproj
new file mode 100644
index 0000000..5a69f7d
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D12.dproj
@@ -0,0 +1,96 @@
+
+
+ {0eefdf9b-7853-40e5-9b29-b631f51beeda}
+ PascalScript_RO_D12.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\Dcu\D12\PascalScript_RO_D12.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 0
+ RemObjects Pascal Script - RemObjects SDK 5.0 Integration
+ ..\Dcu\D12\PascalScript_RO_D12.bpl
+ ..\Dcu\D12;..\..\RemObjects SDK for Dephi\Dcu\D12;$(DCC_UnitSearchPath)
+ ..\Dcu\D12
+ ..\Dcu\D12
+ true
+ true
+ ..\Dcu\D12
+ 00400000
+ false
+ true
+ true
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 43
+ 801
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.43.801
+
+
+
+
+ Pascal Script
+ 3.0.0.0
+ Tuesday, March 21, 2006 1:32 PM
+
+
+ PascalScript_RO_D12.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D12.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D12.res
new file mode 100644
index 0000000..eaacb67
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D12.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D14.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D14.dpk
new file mode 100644
index 0000000..0dbbbae
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D14.dpk
@@ -0,0 +1,45 @@
+package PascalScript_RO_D14;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - RemObjects SDK 5.0 Integration'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ IndyCore,
+ IndySystem,
+ IndyProtocols,
+ PascalScript_Core_D14,
+ RemObjects_Core_D14,
+ RemObjects_Indy_D14,
+ dbrtl,
+ vcl,
+ vclx;
+
+contains
+ PascalScript_RO_Reg in 'PascalScript_RO_Reg.pas',
+ uROPSServerLink in 'uROPSServerLink.pas',
+ uROPSImports in 'uROPSImports.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D14.dproj b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D14.dproj
new file mode 100644
index 0000000..3ab1081
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D14.dproj
@@ -0,0 +1,101 @@
+
+
+ {0eefdf9b-7853-40e5-9b29-b631f51beeda}
+ PascalScript_RO_D14.dpk
+ Debug
+ AnyCPU
+ DCC32
+ ..\Dcu\D12\PascalScript_RO_D12.bpl
+ 11.1
+ Base
+
+
+ true
+
+
+ 1
+ RemObjects Pascal Script - RemObjects SDK 5.0 Integration
+ ..\Dcu\D14\PascalScript_RO_D14.bpl
+ ..\Dcu\D14;..\..\RemObjects SDK for Dephi\Dcu\D14;$(DCC_UnitSearchPath)
+ ..\Dcu\D14
+ ..\Dcu\D14
+ true
+ true
+ ..\Dcu\D14
+ 00400000
+ false
+ true
+ true
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Base
+
+
+
+
+ Delphi.Personality.12
+ Package
+
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 3
+ 0
+ 43
+ 801
+ False
+ False
+ False
+ False
+ False
+ 1033
+ 1252
+
+
+ RemObjects Software
+
+ 3.0.43.801
+
+
+
+
+ Pascal Script
+ 3.0.0.0
+ Tuesday, March 21, 2006 1:32 PM
+
+
+ PascalScript_RO_D14.dpk
+
+
+
+ 12
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D14.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D14.res
new file mode 100644
index 0000000..34ee35f
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D14.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D6.dof b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D6.dof
new file mode 100644
index 0000000..0706699
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D6.dof
@@ -0,0 +1,114 @@
+[FileVersion]
+Version=6.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Pascal Script - RemObjects SDK 3.0 Integration
+
+[Directories]
+UnitOutputDir=..\Dcu\D6
+PackageDLLOutputDir=..\Dcu\D6
+PackageDCPOutputDir=
+SearchPath=..\Dcu\D6
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+ProductName=Pascal Script
+ProductVersion=3.0.0.0
+FileDescription=
+FileVersion=3.0.2.36
+OriginalFilename=
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D6.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D6.dpk
new file mode 100644
index 0000000..4d22bec
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D6.dpk
@@ -0,0 +1,43 @@
+package PascalScript_RO_D6;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - RemObjects SDK 4.0 Integration'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ indy,
+ PascalScript_Core_D6,
+ RemObjects_Core_D6,
+ RemObjects_Indy_D6,
+ dbrtl,
+ vcl,
+ vclx;
+
+contains
+ PascalScript_RO_Reg in 'PascalScript_RO_Reg.pas',
+ uROPSServerLink in 'uROPSServerLink.pas',
+ uROPSImports in 'uROPSImports.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D6.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D6.res
new file mode 100644
index 0000000..30e8017
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D6.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D7.dof b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D7.dof
new file mode 100644
index 0000000..68687e0
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D7.dof
@@ -0,0 +1,123 @@
+[FileVersion]
+Version=7.0
+
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=1
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=0
+SymbolLibrary=0
+SymbolPlatform=0
+UnitLibrary=0
+UnitPlatform=0
+UnitDeprecated=0
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=RemObjects Pascal Script - RemObjects SDK 3.0 Integration
+
+[Directories]
+OutputDir=
+UnitOutputDir=..\Dcu\D7
+PackageDLLOutputDir=..\Dcu\D7
+PackageDCPOutputDir=
+SearchPath=..\Dcu\D7
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+
+[Version Info Keys]
+CompanyName=RemObjects Software
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+ProductName=Pascal Script
+ProductVersion=3.0.0.0
+FileDescription=
+FileVersion=3.0.43.801
+OriginalFilename=
+Compile Date=Monday, February 28, 2005 3:33 PM
+
+[Version Info]
+IncludeVerInfo=1
+MajorVer=3
+MinorVer=0
+Release=43
+Build=801
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D7.dpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D7.dpk
new file mode 100644
index 0000000..8ece2b8
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D7.dpk
@@ -0,0 +1,43 @@
+package PascalScript_RO_D7;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES ON}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'RemObjects Pascal Script - RemObjects SDK 4.0 Integration'}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ indy,
+ PascalScript_Core_D7,
+ RemObjects_Core_D7,
+ RemObjects_Indy_D7,
+ dbrtl,
+ vcl,
+ vclx;
+
+contains
+ PascalScript_RO_Reg in 'PascalScript_RO_Reg.pas',
+ uROPSServerLink in 'uROPSServerLink.pas',
+ uROPSImports in 'uROPSImports.pas';
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D7.res b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D7.res
new file mode 100644
index 0000000..eaacb67
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_D7.res differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_Glyphs.RES b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_Glyphs.RES
new file mode 100644
index 0000000..3fcd355
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_Glyphs.RES differ
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_Reg.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_Reg.pas
new file mode 100644
index 0000000..1369293
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/PascalScript_RO_Reg.pas
@@ -0,0 +1,34 @@
+unit PascalScript_RO_Reg;
+
+{----------------------------------------------------------------------------}
+{ RemObjects Pascal Script
+{
+{ compiler: Delphi 2 and up, Kylix 3 and up
+{ platform: Win32, Linux
+{
+{ (c)opyright RemObjects Software. all rights reserved.
+{
+{ Using this code requires a valid license of Pascal Script
+{ which can be obtained at http://www.remobjects.com.
+{----------------------------------------------------------------------------}
+
+{$I PascalScript.inc}
+
+interface
+
+{$R PascalScript_RO_Glyphs.res}
+
+procedure Register;
+
+implementation
+
+uses
+ Classes,
+ uROPSServerLink;
+
+procedure Register;
+begin
+ RegisterComponents('Pascal Script', [TPSRemObjectsSdkPlugin]);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/arm.inc b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/arm.inc
new file mode 100644
index 0000000..1765635
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/arm.inc
@@ -0,0 +1,312 @@
+{ implementation of the arm procedure call standard for function calls in pascal script
+ Copyright (c) 2008 by Henry Vermaak (henry.vermaak@gmail.com)
+
+ todo: add eabi (define FPC_ABI_EABI) and wince support
+
+ notes:
+
+ most arm cpus don't allow unaligned access. by default (?) the linux kernel
+ is set up to try and correct unaligned access, which can lead to strange behaviour.
+ to turn this off, try (as root):
+
+ echo 4 > /proc/cpu/alignment
+
+ if you have an alignment problem, you will now get a crash with a backtrace like this:
+ (make sure you compile with -O- -gl)
+
+ An unhandled exception occurred at $0006C014 :
+ EBusError : Bus error or misaligned data access
+ $0006C014 PROCESSREPEAT, line 9670 of upscompiler.pas
+ $00068AAC TPSPASCALCOMPILER__PROCESSSUB, line 10459 of upscompiler.pas
+ $0007D0B4 TPSPASCALCOMPILER__COMPILE, line 11704 of upscompiler.pas
+
+ you can fix this by using the "unaligned" keyword around the pointer operation.
+ search for occurances of "unaligned" to see how this is done,
+ (use $ifdef FPC_REQUIRES_PROPER_ALIGNMENT).
+
+ for more information, visit:
+
+ http://www.aleph1.co.uk/oldsite/armlinux/book/afaq.html
+}
+
+const
+ rtINT = 0;
+ rtINT64 = 1;
+ rtFLOAT = 2;
+
+type
+ Trint = array[1..4] of dword;
+ Trfloat = array[1..4] of double;
+
+{$goto on}
+{ define labels }
+label
+ stack_loop,
+ load_regs,
+ asmcall_end,
+ int_result,
+ int64_result,
+ float_result;
+
+{ call a function from a pointer }
+{ resulttype: 0 = int, 1 = int64, 2 = float }
+function armasmcall(rint: Trint; rfloat: Trfloat; proc, stack: pointer; stacksize, resulttype: integer): pointer; assembler; nostackframe;
+asm
+ mov r12, r13
+ stmfd r13!, {r4, r5, r6, r7, r8, r9, r10, r11, r12, r14, r15}
+ sub r11, r12, #4
+ mov r4, #80 (* space for preserved registers and parameters *)
+ ldr r5, [r11, #4] (* stacksize we need for subroutine *)
+ add r4, r4, r5
+ sub r13, r13, r4 (* create stack space *)
+
+ (* store parameters on stack *)
+ str r0, [r11, #-44] (* rint *)
+ str r1, [r11, #-48] (* rfloat *)
+ str r2, [r11, #-52] (* proc *)
+ str r3, [r11, #-56] (* stack *)
+ ldr r0, [r11, #4]
+ str r0, [r11, #-60] (* stacksize *)
+ ldr r0, [r11, #8]
+ str r0, [r11, #-64] (* resulttype *)
+
+ (* store params for sub-routine that don't fit into r0-r3 at start of stack *)
+ ldr r0, [r11, #-60] (* stacksize *)
+ cmp r0, #0
+ beq load_regs (* skip if no stack *)
+ mov r1, r13 (* this points to the bottom now *)
+ ldr r2, [r11, #-56] (* stack pointer *)
+stack_loop:
+ ldmia r2!, {r4} (* get stack + update pos *)
+ stmia r1!, {r4} (* store stack + update pos *)
+ subs r0, r0, #4
+ bne stack_loop
+
+load_regs:
+ (* load general regs *)
+ ldr r4, [r11, #-44] (* rint *)
+ ldr r0, [r4]
+ ldr r1, [r4, #4]
+ ldr r2, [r4, #8]
+ ldr r3, [r4, #12]
+
+{$ifdef FPUFPA}
+ (* load float regs *)
+ ldr r4, [r11, #-48] (* rfloat *)
+ ldfd f0, [r4]
+ ldfd f1, [r4, #8]
+ ldfd f2, [r4, #16]
+ ldfd f3, [r4, #24]
+{$endif}
+
+ (* branch to the proc pointer *)
+ ldr r4, [r11, #-52]
+ mov r14, r15
+ mov r15, r4
+(* blx r4 *)
+
+ ldr r4, [r11, #-64] (* get resulttype *)
+ cmp r4, #1
+ blt int_result
+ beq int64_result
+ bgt float_result
+
+int_result:
+ str r0, [r11, #-72]
+ b asmcall_end
+
+int64_result:
+ str r0, [r11, #-72]
+ str r1, [r11, #-68]
+ b asmcall_end
+
+float_result:
+{$ifdef FPUFPA}
+ stfd f0, [r11, #-72]
+{$else}
+ b int64_result
+{$endif}
+ b asmcall_end
+
+asmcall_end:
+ sub r0, r11, #72 (* return pointer to result on stack *)
+
+ ldmea r11,{r4,r5,r6,r7,r8,r9,r10,r11,r13,r15}
+end;
+
+function TPSExec.InnerfuseCall(_Self, Address: Pointer; CallingConv: TPSCallingConvention; Params: TPSList; res: PPSVariantIFC): Boolean;
+var
+ rint: Trint; { registers r0 to r3 }
+ rfloat: Trfloat; { registers f0 to f3 }
+ st: packed array of byte; { stack }
+ i, j, rindex, findex, stindex: integer;
+ fvar: PPSVariantIFC;
+ IsConstructor: Boolean;
+
+ { add a dword to stack }
+ procedure addstackdword(value: dword);
+ begin
+ setlength(st, stindex+4);
+ pdword(@st[stindex])^ := value;
+ inc(stindex, 4);
+ end;
+
+ { add a float to stack }
+ procedure addstackfloat(value: pointer; size: integer);
+ begin
+ setlength(st, stindex + (size * 4));
+ if size = 1
+ then psingle(@st[stindex])^ := single(value^)
+ else pdouble(@st[stindex])^ := double(value^);
+ inc(stindex, size*4);
+ end;
+
+ { add to the general registers or overflow to stack }
+ procedure addgen(value: dword);
+ begin
+ if rindex <= 4
+ then begin
+ rint[rindex] := value;
+ inc(rindex);
+ end
+ else begin
+ addstackdword(value);
+ end;
+ end;
+ { add to the float registers or overflow to stack }
+ { size = 1 for single, 2 for double }
+ procedure addfloat(value: pointer; size: integer);
+ begin
+ if findex <= 4
+ then begin
+ if size = 1
+ then rfloat[findex] := single(value^)
+ else rfloat[findex] := double(value^);
+ inc(findex);
+ end
+ else begin
+ addstackfloat(value, size);
+ end;
+ end;
+
+begin
+ if (Integer(CallingConv) and 64) <> 0 then begin
+ IsConstructor := true;
+ CAllingConv := TPSCallingConvention(Integer(CallingConv) and not 64);
+ end else IsConstructor := false;
+
+ rindex := 1;
+ findex := 1;
+ stindex := 0;
+ setlength(st, stindex);
+ Result := False;
+
+ { the pointer of the result needs to be passed first in the case of some result types }
+ if assigned(res)
+ then begin
+ case res.atype.basetype of
+ btStaticArray, btRecord: addgen(dword(res.dta));
+ end;
+ end;
+
+ { process all parameters }
+ for i := 0 to Params.Count-1 do begin
+ if Params[i] = nil
+ then Exit;
+ fvar := Params[i];
+
+ { cook dynamic arrays - fpc stores size-1 at @array-4 }
+ if (fvar.aType.BaseType = btArray)
+ then dec(pdword(pointer(fvar.dta^)-4)^);
+
+ if fvar.varparam
+ then begin { var param }
+ case fvar.aType.BaseType of
+ { add var params here }
+ btArray, btVariant, btSet, btStaticArray, btRecord, btInterface, btClass, {$IFNDEF PS_NOWIDESTRING} btUnicodeString, btWideString, btWideChar, {$ENDIF}
+ btU8, btS8, btU16, btS16, btU32, btS32, btSingle, btDouble, btExtended, btString, btPChar, btChar, btCurrency
+ {$IFNDEF PS_NOINT64}, bts64{$ENDIF}: addgen(dword(fvar.dta));
+ else begin
+ writeln(stderr, 'Parameter type not recognised!');
+ Exit;
+ end;
+ end; { case }
+ end else begin { not a var param }
+ case fvar.aType.BaseType of
+// btArray, btVariant, btSet, btStaticArray, btRecord, btInterface, btClass, {$IFNDEF PS_NOWIDESTRING} btWideString, btWideChar, {$ENDIF}
+// btU8, btS8, btU16, btS16, btU32, btS32, btSingle, btDouble, btExtended, btString, btPChar, btChar, btCurrency
+// {$IFNDEF PS_NOINT64}, bts64{$ENDIF}: writeln('normal param');
+
+ { add normal params here }
+ btString: addgen(dword(pstring(fvar.dta)^));
+ btU8, btS8: addgen(dword(pbyte(fvar.dta)^));
+ btU16, BtS16: addgen(dword(pword(fvar.dta)^));
+ btU32, btS32: addgen(dword(pdword(fvar.dta)^));
+ btSingle: {$ifdef FPUFPA}
+ addfloat(fvar.dta, 1);
+ {$else}
+ addgen(dword(psingle(fvar.dta)^));
+ {$endif}
+ btDouble{, btExtended}: {$ifdef FPUFPA}
+ addfloat(fvar.dta, 2);
+ {$else}
+ begin
+ addgen(lo(qword(pdouble(fvar.dta)^)));
+ addgen(hi(qword(pdouble(fvar.dta)^)));
+ end;
+ {$endif}
+ btPChar: addgen(dword(ppchar(fvar.dta)^));
+ btChar: addgen(dword(pchar(fvar.dta)^));
+ {$IFNDEF PS_NOINT64}bts64:{$ENDIF} begin
+ addgen(dword(pint64(fvar.dta)^ and $ffffffff));
+ addgen(dword(pint64(fvar.dta)^ shr 32));
+ end;
+ btStaticArray: addgen(dword(fvar.dta));
+ btRecord: for j := 0 to (fvar.atype.realsize div 4)-1 do
+ addgen(pdword(fvar.dta + j*4)^);
+ btArray: addstackdword(dword(fvar.dta^)); { this is a bit weird }
+
+{ btVariant, btSet, btInterface, btClass }
+
+ else begin
+ writeln(stderr, 'Parameter type not implemented!');
+ Exit;
+ end;
+ end; { case }
+ end; { else }
+ end; { for }
+
+ if not assigned(res)
+ then begin
+ armasmcall(rint, rfloat, address, st, stindex, rtINT); { ignore return }
+ end
+ else begin
+ case res.atype.basetype of
+ { add result types here }
+ btString: pstring(res.dta)^ := pstring(armasmcall(rint, rfloat, address, st, stindex, rtINT))^;
+ btU8, btS8: pbyte(res.dta)^ := byte(pdword(armasmcall(rint, rfloat, address, st, stindex, rtINT))^);
+ btU16, btS16: pword(res.dta)^ := word(pdword(armasmcall(rint, rfloat, address, st, stindex, rtINT))^);
+ btU32, btS32: pdword(res.dta)^ := pdword(armasmcall(rint, rfloat, address, st, stindex, rtINT))^;
+ btSingle: psingle(res.dta)^ := pdouble(armasmcall(rint, rfloat, address, st, stindex, rtFLOAT))^;
+ btDouble{, btExtended}: pdouble(res.dta)^ := pdouble(armasmcall(rint, rfloat, address, st, stindex, rtFLOAT))^;
+ btPChar: ppchar(res.dta)^ := pchar(pdword(armasmcall(rint, rfloat, address, st, stindex, rtINT))^);
+ btChar: pchar(res.dta)^ := char(pdword(armasmcall(rint, rfloat, address, st, stindex, rtINT))^);
+ btStaticArray, btRecord: armasmcall(rint, rfloat, address, st, stindex, rtINT);
+ btArray: res.dta := armasmcall(rint, rfloat, address, st, stindex, rtINT);
+
+ else begin
+ writeln(stderr, 'Result type not implemented!');
+ exit;
+ end; { else }
+ end; { case }
+ end;
+
+ { cook dynamic arrays - fpc stores size-1 at @array-4 }
+ for i := 0 to Params.Count-1 do begin
+ fvar := Params[i];
+ if (fvar.aType.BaseType = btArray)
+ then inc(pdword(pointer(fvar.dta^)-4)^);
+ end;
+
+ Result := True;
+end;
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/eDefines.inc b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/eDefines.inc
new file mode 100644
index 0000000..86fb1cf
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/eDefines.inc
@@ -0,0 +1,494 @@
+{----------------------------------------------------------------------------}
+{file: eDefines.inc }
+{type: Delphi include file }
+{ }
+{compiler: Borland Pascal 7, }
+{ Delphi 1-7, 2005-2007 for Win32 }
+{ Kylix 1-3, }
+{ C++Builder 1-6, 2006-2007 }
+{ Free Pascal Compiler 2.x }
+{ }
+{platforms: DOS, DPMI, Win16, Win32, Win64, Linux, Mac OS X }
+{ }
+{author: mh@elitedev.com }
+{ }
+{contents: Defines that can be flexibily used to determine the exact }
+{ compiler version used. }
+{ }
+{(c)opyright elitedevelopments software. all rights reserved. }
+{ http://www.elitedev.com }
+{ }
+{ Third Party component developers are encouraged to use the set of defines }
+{ established in this file, rather then their own system, for checking their }
+{ component libraries agains different versions of Delphi and C++Builder. }
+{ }
+{ This file may be distributed freely with both free and commercial source }
+{ libraries, but you are asked to please leave this comment in place, and }
+{ to return any improvements you make to this file to the maintainer that }
+{ is noted above. }
+{----------------------------------------------------------------------------}
+
+{----------------------------------------------------------------------------}
+{ Compiler and OS version defines: }
+{ }
+{ exact compiler versions: }
+{ }
+{ BP7 Borland Pascal 7.0 }
+{ DELPHI1 Delphi 1.0 (any Delphi) }
+{ DELPHI2 Delphi 2.0 }
+{ DELPHI3 Delphi 3.0 }
+{ DELPHI4 Delphi 4.0 }
+{ DELPHI5 Delphi 5.0 }
+{ DELPHI6 Delphi 6.0 }
+{ DELPHI7 Delphi 7.0 }
+{ DELPHI9 Delphi 2005 }
+{ DELPHI2005 Delphi 2005 }
+{ DELPHI2006 Delphi 2006 }
+{ DELPHI2007 Delphi 2007 }
+{ KYLIX1 Kylix 1.0 }
+{ KYLIX2 Kylix 2.0 }
+{ KYLIX3 Kylix 3.0 }
+{ CBUILDER1 C++Builder 1.0 }
+{ CBUILDER3 C++Builder 3.0 }
+{ CBUILDER4 C++Builder 4.0 }
+{ CBUILDER5 C++Builder 5.0 }
+{ }
+{ }
+{ minimum compiler versions: }
+{ }
+{ DELPHI1UP Delphi 1.0 and above (any Delphi) }
+{ DELPHI2UP Delphi 2.0 and above }
+{ DELPHI3UP Delphi 3.0 and above }
+{ DELPHI4UP Delphi 4.0 and above }
+{ DELPHI5UP Delphi 5.0 and above }
+{ DELPHI6UP Delphi 6.0 and above }
+{ DELPHI7UP Delphi 7.0 and above }
+{ DELPHI9UP Delphi 9.0 (2005) and above }
+{ DELPHI10UP Delphi 10.0 (2006) and above }
+{ DELPHI11UP Delphi 11.0 (2007) and above }
+{ DELPHI2005UP Delphi 2005 and above }
+{ DELPHI2006UP Delphi 2006 and above }
+{ DELPHI2007UP Delphi 2007 and above }
+{ KYLIX1UP Kylix 1.0 and above (any Kylix) }
+{ KYLIX2UP Kylix 2.0 and above (any Kylix) }
+{ KYLIX3UP Kylix 3.0 and above (any Kylix) }
+{ CBUILDER1UP C++Builder 1.0 and above or Delphi 2 and above }
+{ CBUILDER3UP C++Builder 3.0 and above or Delphi 3.0 and above }
+{ CBUILDER4UP C++Builder 4.0 and above or Delphi 4.0 and above }
+{ CBUILDER5UP C++Builder 5.0 and above or Delphi 5.0 and above }
+{ CBUILDER6UP C++Builder 5.0 and above or Delphi 5.0 and above }
+{ }
+{ }
+{ compiler types: }
+{ }
+{ BP Borland Pascal (not Delphi or C++Builder) }
+{ DELPHI any Delphi version (but not C++Builder or Kylix) }
+{ KYLIX any Kylix version (not Delphi or C++Builder for Windows) }
+{ CBUILDER any C++Builder for Windows (Pascal) }
+{ }
+{ }
+{ target platforms compiler types: }
+{ }
+{ DELPHI_16BIT 16bit Delphi (but not C++Builder!) }
+{ DELPHI_32BIT 32bit Delphi (but not C++Builder) }
+{ KYLIX_32BIT 32bit Kylix (but not C++Builder) }
+{ CBUILDER_32BIT 32bit C++Builer's Pascal (but not Delphi) }
+{ }
+{ }
+{ target cpu types }
+{ }
+{ CPU16 16bit Delphi or Borland Pascal }
+{ CPU32 32bit Delphi or Free Pascal }
+{ CPU64 64bit Free Pascal }
+{ }
+{ target platforms }
+{ }
+{ DOS any DOS (plain and DPMI) }
+{ REALMODE 16bit realmode DOS }
+{ PROTECTEDMODE 16bit DPMI DOS }
+{ }
+{ MSWINDOWS any Windows platform }
+{ WIN16 16bit Windows }
+{ WIN32 32bit Windows }
+{ WIN64 64bit Windows }
+{ DOTNET .NET }
+{ }
+{ LINUX any Linux platform }
+{ LINUX32 32bit Linux }
+{ LINUX64 64bit Linux }
+{ }
+{ DARWIN Any Mac OS X }
+{ DARWIN32 32bit Mac OS X }
+{ DARWIN64 64bit Mac OS X }
+{----------------------------------------------------------------------------}
+
+{ defines for Borland Pascal 7.0 }
+{$IFDEF VER70}
+ {$DEFINE BP}
+ {$DEFINE BP7}
+ {$DEFINE 16BIT}
+ {$DEFINE CPU16}
+
+ { defines for BP7 DOS real mode }
+ {$IFDEF MSDOS}
+ {$DEFINE DOS}
+ {$DEFINE REALMODE}
+ {$ENDIF}
+
+ { defines for BP7 DOS protected mode }
+ {$IFDEF DPMI}
+ {$DEFINE DOS}
+ {$DEFINE PROTECTEDMODE}
+ {$ENDIF}
+
+ { defines for BP7 Windows }
+ {$IFDEF WINDOWS}
+ {$DEFINE MSWINDOWS}
+ {$DEFINE WIN16}
+ {$ENDIF}
+{$ENDIF}
+
+{$IFDEF WIN32}
+ {$DEFINE MSWINDOWS} //not automatically defined for Delphi 2 thru 5
+ {$DEFINE 32BIT}
+ {$DEFINE CPU32}
+{$ENDIF}
+
+{ defines for Delphi 1.0 thru 7.0 }
+{$IFDEF MSWINDOWS}
+
+ { defines for Delphi 1.0 }
+ {$IFDEF VER80}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI1}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI_16BIT}
+ {$DEFINE WIN16}
+ {$DEFINE 16BIT}
+ {$DEFINE CPU16}
+ {$ENDIF}
+
+ { defines for Delphi 2.0 }
+ {$IFDEF VER90}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI2}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$ENDIF}
+
+ { defines for C++Builder 1.0 }
+ {$IFDEF VER93}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER1}
+ {$DEFINE CBUILDER1UP}
+ {$ENDIF}
+
+ { defines for Delphi 3.0 }
+ {$IFDEF VER100}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI3}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$ENDIF}
+
+ { defines for C++Builder 3.0 }
+ {$IFDEF VER110}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER3}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$ENDIF}
+
+ { defines for Delphi 4.0 }
+ {$IFDEF VER120}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI4}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$ENDIF}
+
+ { defines for C++Builder 4.0 }
+ {$IFDEF VER125}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER4}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$DEFINE CBUILDER4UP}
+ {$ENDIF}
+ { defines for Delphi 5.0 }
+ {$IFDEF VER130}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI5}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$ENDIF}
+
+ { defines for C++Builder 5.0 }
+ {$IFDEF VER135}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER5}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$DEFINE CBUILDER4UP}
+ {$DEFINE CBUILDER5UP}
+ {$ENDIF}
+
+ { defines for Delphi 6.0 }
+ {$IFDEF VER140}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI6}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$ENDIF}
+
+ { defines for Delphi 7.0 }
+ {$IFDEF VER150}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI7}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$ENDIF}
+
+ { defines for Delphi 2005 }
+ {$IFDEF VER170}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI9}
+ {$DEFINE DELPHI2005}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE BDS}
+ {$DEFINE BDS3}
+ {$DEFINE BDS3UP}
+ {$ENDIF}
+
+ { defines for Delphi 2006 }
+ {$IFDEF VER180}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI10}
+ {$DEFINE DELPHI10A}
+ {$DEFINE DELPHI2006}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE BDS}
+ {$DEFINE BDS4}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$ENDIF}
+
+ { defines for Delphi 2007 }
+ {$IFDEF VER185}
+ {$UNDEF DELPHI10A} // declared in VER180
+ {$UNDEF DELPHI2006} // declared in VER180
+ {$UNDEF BDS4} // declared in VER180
+
+ {$DEFINE DELPHI10B}
+ {$DEFINE DELPHI10BUP}
+ {$DEFINE DELPHI11}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI2007}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE BDS5}
+ {$DEFINE BDS5UP}
+ {$ENDIF}
+
+ { defines for Delphi 2009 }
+ {$IFDEF VER200}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+
+ {$DEFINE DELPHI12}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI12UP}
+
+ {$DEFINE DELPHI2009}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE DELPHI2009UP}
+
+ {$DEFINE BDS}
+ {$DEFINE BDS6}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$DEFINE BDS5UP}
+ {$DEFINE BDS6UP}
+ {$ENDIF}
+
+ { defines for Delphi 2010 }
+ {$IFDEF VER210}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+
+ {$DEFINE DELPHI14}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI12UP}
+ {$DEFINE DELPHI14UP}
+
+ {$DEFINE DELPHI2010}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE DELPHI2009UP}
+ {$DEFINE DELPHI2010UP}
+
+ {$DEFINE BDS}
+ {$DEFINE BDS7}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$DEFINE BDS5UP}
+ {$DEFINE BDS6UP}
+ {$DEFINE BDS7UP}
+ {$ENDIF}
+
+
+
+{$ENDIF MSWINDOWS}
+
+{ defines for "Delphi for .NET" }
+{$IFDEF CLR}
+ {$DEFINE DOTNET}
+{$ENDIF}
+
+{$IFDEF DELPHI}
+ {$IFDEF DELPHI2UP}
+ {$DEFINE DELPHI_32BIT}
+ {$ENDIF}
+{$ENDIF}
+
+{$IFDEF CBUILDER}
+ {$DEFINE CBUILDER_32BIT}
+{$ENDIF}
+
+{$IFNDEF FPC}
+
+ { Kylix 1.0 thru 3.0 }
+ {$IFDEF LINUX}
+
+ {$DEFINE VER140UP}
+
+ { Any Kylix }
+ {$DEFINE 32BIT}
+ {$DEFINE LINUX32}
+ {$DEFINE KYLIX_32BIT}
+ {$DEFINE KYLIX}
+ {$DEFINE KYLIX1UP}
+
+ {$IFDEF CONDITIONALEXPRESSIONS}
+ {$IF Declared(CompilerVersion)}
+
+ { Kylix 2.0 }
+ {$IF Declared(RTLVersion) and (RTLVersion = 14.1)}
+ {$DEFINE KYLIX2}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$IFEND}
+
+ { Kylix 3.0 - Delphi portion }
+ {$IF Declared(RTLVersion) and (RTLVersion = 14.5)}
+ {$DEFINE KYLIX3}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$DEFINE KYLIX3UP}
+ {$IFEND}
+
+ { Kylix 1.0 }
+ {$ELSE}
+ {$DEFINE KYLIX1}
+ {$IFEND}
+ {$ENDIF CONDITIONALEXPRESSIONS}
+
+ {$ENDIF LINUX}
+{$ENDIF}
+
+{ CPU }
+
+{$IFDEF FPC}
+ {$IFDEF MSWINDOWS}
+ {$IFDEF CPU64}
+ {$DEFINE WIN64}
+ {$ENDIF}
+ {$ENDIF}
+ {$IFDEF LINUX}
+ {$IFDEF CPU32}
+ {$DEFINE LINUX32}
+ {$ENDIF}
+ {$IFDEF CPU64}
+ {$DEFINE LINUX64}
+ {$ENDIF}
+ {$ENDIF}
+ {$IFDEF DARWIN}
+ {$IFDEF CPU32}
+ {$DEFINE DARWIN32}
+ {$ENDIF}
+ {$IFDEF CPU64}
+ {$DEFINE DARWIN64}
+ {$ENDIF}
+ {$ENDIF}
+{$ENDIF}
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/pascalscript.lpk b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/pascalscript.lpk
new file mode 100644
index 0000000..707082a
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/pascalscript.lpk
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/pascalscript.lrs b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/pascalscript.lrs
new file mode 100644
index 0000000..7e88ff2
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/pascalscript.lrs
@@ -0,0 +1,1001 @@
+LazarusResources.Add('tpsdllplugin','XPM',[
+ '/* XPM */'#10'static char *tpsdllplugin[] = {'#10'/* width height num_colors'
+ +' chars_per_pixel */'#10'" 24 24 256 2",'#10'/* colors'
+ +' */'#10'"`` c None",'#10'"`. c #824b00",'#10'"`# c #955c00",'#10'"`a c #e1a'
+ +'906",'#10'"`b c #cfb15c",'#10'"`c c #f8e9ab",'#10'"`d c #b67d02",'#10'"`e c'
+ +' #c19930",'#10'"`f c #c19d3a",'#10'"`g c #fff2ba",'#10'"`h c #fff2b7",'#10
+ +'"`i c #e3c66a",'#10'"`j c #aa7909",'#10'"`k c #bf8b06",'#10'"`l c #fff2b8",'
+ +#10'"`m c #ffeb9a",'#10'"`n c #ffe16a",'#10'"`o c #fed53e",'#10'"`p c #fecb1'
+ +'9",'#10'"`q c #c99305",'#10'"`r c #ead590",'#10'"`s c #ffed9f",'#10'"`t c #'
+ +'ffe16e",'#10'"`u c #fed742",'#10'"`v c #fecb1c",'#10'"`w c #fec60c",'#10'"`'
+ +'x c #c58b03",'#10'"`y c #ad7e0c",'#10'"`z c #ead383",'#10'"`A c #9d6a03",'
+ +#10'"`B c #bc8b0d",'#10'"`C c #feca18",'#10'"`D c #d5a61a",'#10'"`E c #8b530'
+ +'0",'#10'"`F c #bb8103",'#10'"`G c #b5891c",'#10'"`H c #ffeea7",'#10'"`I c #'
+ +'9c6602",'#10'"`J c #dca912",'#10'"`K c #fed02a",'#10'"`L c #fed540",'#10'"`'
+ +'M c #965f03",'#10'"`N c #c18a04",'#10'"`O c #d5ba69",'#10'"`P c #ffefab",'
+ +#10'"`Q c #ffe57b",'#10'"`R c #895100",'#10'"`S c #c79917",'#10'"`T c #ffdc5'
+ +'5",'#10'"`U c #00268c",'#10'"`V c #002c95",'#10'"`W c #0f3695",'#10'"`X c #'
+ +'9c6401",'#10'"`Y c #a6760b",'#10'"`Z c #d5b862",'#10'"`0 c #ffe681",'#10'"`'
+ +'1 c #ffda52",'#10'"`2 c #dcb12a",'#10'"`3 c #ffda53",'#10'"`4 c #f0d05a",'
+ +#10'"`5 c #182d5b",'#10'"`6 c #0073ee",'#10'"`7 c #0a3c9e",'#10'"`8 c #a1d9f'
+ +'f",'#10'".` c #001f83",'#10'".. c #9d6401",'#10'".# c #9d6903",'#10'".a c #'
+ +'f0cb49",'#10'".b c #fed02d",'#10'".c c #e9b40d",'#10'".d c #8c5a03",'#10'".'
+ +'e c #c0921b",'#10'".f c #feda50",'#10'".g c #ffe06a",'#10'".h c #957829",'
+ +#10'".i c #224995",'#10'".j c #11409e",'#10'".k c #0441ac",'#10'".l c #6ea3d'
+ +'e",'#10'".m c #70ace6",'#10'".n c #03359d",'#10'".o c #935b00",'#10'".p c #'
+ +'986403",'#10'".q c #f0c228",'#10'".r c #fec711",'#10'".s c #fece23",'#10'".'
+ +'t c #fed437",'#10'".u c #fed94e",'#10'".v c #ffe067",'#10'".w c #98d5ff",'
+ +#10'".x c #6ec2ff",'#10'".y c #43adff",'#10'".z c #1e99ff",'#10'".A c #90580'
+ +'0",'#10'".B c #996704",'#10'".C c #fec913",'#10'".D c #fec70f",'#10'".E c #'
+ +'fece21",'#10'".F c #fed335",'#10'".G c #fed94c",'#10'".H c #ffe065",'#10'".'
+ +'I c #ffe57f",'#10'".J c #4172bd",'#10'".K c #9ad7ff",'#10'".L c #73c4ff",'
+ +#10'".M c #46afff",'#10'".N c #219aff",'#10'".O c #0688ff",'#10'".P c #844d0'
+ +'0",'#10'".Q c #8a5702",'#10'".R c #b1810f",'#10'".S c #f0c940",'#10'".T c #'
+ +'ffde63",'#10'".U c #eacb5e",'#10'".V c #8e6618",'#10'".W c #7d6628",'#10'".'
+ +'X c #4b7dc5",'#10'".Y c #9dd7ff",'#10'".Z c #00309a",'#10'".0 c #0e42a5",'
+ +#10'".1 c #0943a9",'#10'".2 c #0782f7",'#10'".3 c #1182ee",'#10'".4 c #40404'
+ +'0",'#10'".5 c #9ed8ff",'#10'".6 c #000d68",'#10'".7 c #002d96",'#10'".8 c #'
+ +'0242b0",'#10'"#` c #1392ff",'#10'"#. c #259dff",'#10'"## c #004bbc",'#10'"#'
+ +'a c #001e81",'#10'"#b c #ffffff",'#10'"#c c #000000",'#10'"#d c #80caff",'
+ +#10'"#e c #00004c",'#10'"#f c #000e69",'#10'"#g c #043aa3",'#10'"#h c #239cf'
+ +'f",'#10'"#i c #37a7ff",'#10'"#j c #4eb2ff",'#10'"#k c #c0dcc0",'#10'"#l c #'
+ +'56b7ff",'#10'"#m c #00095f",'#10'"#n c #001b7d",'#10'"#o c #0941a7",'#10'"#'
+ +'p c #35a6ff",'#10'"#q c #4cb1ff",'#10'"#r c #052b8c",'#10'"#s c #32a4ff",'
+ +#10'"#t c #0f88f7",'#10'"#u c #001f82",'#10'"#v c #012489",'#10'"#w c #2989e'
+ +'6",'#10'"#x c #49b1ff",'#10'"#y c #3882d5",'#10'"#z c #0386ff",'#10'"#A c #'
+ +'0d8eff",'#10'"#B c #177fe6",'#10'"#C c #47b0ff",'#10'"#D c #5fbbff",'#10'"#'
+ +'E c #0c8cff",'#10'"#F c #1c98ff",'#10'"#G c #2fa3ff",'#10'"#H c #45afff",'
+ +#10'"#I c #5dbaff",'#10'"#J c #76c6ff",'#10'"#K c #034fbd",'#10'"#L c #0645a'
+ +'d",'#10'"#M c #1f7dde",'#10'"#N c #5ab8ff",'#10'"#O c #022588",'#10'"#P c #'
+ +'51acf7",'#10'"#Q c #000000",'#10'"#R c #000000",'#10'"#S c #000000",'#10'"#'
+ +'T c #000000",'#10'"#U c #000000",'#10'"#V c #000000",'#10'"#W c #000000",'
+ +#10'"#X c #000000",'#10'"#Y c #000000",'#10'"#Z c #000000",'#10'"#0 c #00000'
+ +'0",'#10'"#1 c #000000",'#10'"#2 c #000000",'#10'"#3 c #000000",'#10'"#4 c #'
+ +'000000",'#10'"#5 c #000000",'#10'"#6 c #000000",'#10'"#7 c #000000",'#10'"#'
+ +'8 c #000000",'#10'"a` c #000000",'#10'"a. c #000000",'#10'"a# c #000000",'
+ +#10'"aa c #000000",'#10'"ab c #000000",'#10'"ac c #000000",'#10'"ad c #00000'
+ +'0",'#10'"ae c #000000",'#10'"af c #000000",'#10'"ag c #000000",'#10'"ah c #'
+ +'000000",'#10'"ai c #000000",'#10'"aj c #000000",'#10'"ak c #000000",'#10'"a'
+ +'l c #000000",'#10'"am c #000000",'#10'"an c #000000",'#10'"ao c #000000",'
+ +#10'"ap c #000000",'#10'"aq c #000000",'#10'"ar c #000000",'#10'"as c #00000'
+ +'0",'#10'"at c #000000",'#10'"au c #000000",'#10'"av c #000000",'#10'"aw c #'
+ +'000000",'#10'"ax c #000000",'#10'"ay c #000000",'#10'"az c #000000",'#10'"a'
+ +'A c #000000",'#10'"aB c #000000",'#10'"aC c #000000",'#10'"aD c #000000",'
+ +#10'"aE c #000000",'#10'"aF c #000000",'#10'"aG c #000000",'#10'"aH c #00000'
+ +'0",'#10'"aI c #000000",'#10'"aJ c #000000",'#10'"aK c #000000",'#10'"aL c #'
+ ,'000000",'#10'"aM c #000000",'#10'"aN c #000000",'#10'"aO c #000000",'#10'"a'
+ +'P c #000000",'#10'"aQ c #000000",'#10'"aR c #000000",'#10'"aS c #000000",'
+ +#10'"aT c #000000",'#10'"aU c #000000",'#10'"aV c #000000",'#10'"aW c #00000'
+ +'0",'#10'"aX c #000000",'#10'"aY c #000000",'#10'"aZ c #000000",'#10'"a0 c #'
+ +'000000",'#10'"a1 c #000000",'#10'"a2 c #000000",'#10'"a3 c #000000",'#10'"a'
+ +'4 c #000000",'#10'"a5 c #000000",'#10'"a6 c #000000",'#10'"a7 c #000000",'
+ +#10'"a8 c #000000",'#10'/* pixels */'#10'"``````````````````````````````````'
+ +'``````````````",'#10'"`````````````.`.`.``````````````````````````````",'#10
+ +'"```````````#`a`b`c`.````````````````````````````",'#10'"`````d`.`.`e`f`g`h'
+ +'`i`.`.`j``````````````````````",'#10'"`````.`k`g`g`g`l`m`n`o`p`.```````````'
+ +'```````````",'#10'"`````.`q`r`g`l`s`t`u`v`w`.``````````````````````",'#10'"'
+ +'```.`x`y`c`g`z`.`A`B`w`C`D`.````````````````````",'#10'"`E`F`G`r`g`H`.```.`'
+ +'I`J`K`L`M````````````````````",'#10'"`.`N`O`g`P`Q`.```R`.`S`o`T`t`M`U`V`W``'
+ +'``````````",'#10'"`.`X`Y`Z`0`1`.```.`.`2`3`4`M`5`6`7`8.```````````",'#10'"`'
+ +'``....#.a.b.c`..d.e.f.g.h.i.j.k.l`8.m.`.`.n````",'#10'"````.o.p.q.r.r.s.t.u'
+ +'.v`0`M.l`8`8`8.w.x.y.z.`````",'#10'"````.A.B.C.D.E.F.G.H.I`m`M.J`8`8.K.L.M.'
+ +'N.O.`````",'#10'"````.P.Q`.`..R.S.T.U`M.V.W.X`8.Y.Z.0.1.2.O.3.```",'#10'".4'
+ +'.4.4.4.4.4.4.4.4.4.4.4.4`8.5.Z``.6.7.8#`#.###a",'#10'".4#b#b#b#b#b#b#b#b#b#'
+ +'b#b.4#c#d.Z``#e#f#g#h#i#j.`",'#10'".4#b#c#c#c#k#b#k#c#c#c#b.4#c#l.Z``#m#n#o'
+ +'#p#q###r",'#10'".4#b#c#b#k#c#b#c#k#b#b#b.4#c#s#t.Z#u#v#w#x#y.```",'#10'".4#'
+ +'b#c#c#c#k#b#k#c#c#k#b.4#c#`#z#A#B#s#C#D.`````",'#10'".4#b#c#k#b#b#b#b#b#k#c'
+ +'#b.4#c#z#E#F#G#H#I#J.`````",'#10'".4#b#c#b#b#c#c#c#c#c#k#b.4#c#K#L#M.y#N.`.'
+ +'`.`````",'#10'".4#b#b#b#b#b#b#b#b#b#b#b.4#c#a#a#O#P.```````````",'#10'".4.4'
+ +'.4.4.4.4.4.4.4.4.4.4.4#c``#a#a.`````````````",'#10'"``#c#c#c#c#c#c#c#c#c#c#'
+ +'c#c#c````````````````````"'#10'};'#10
+]);
+LazarusResources.Add('tpsimport_classes','XPM',[
+ '/* XPM */'#10'static char *tpsimport_classes[] = {'#10'/* width height num_c'
+ +'olors chars_per_pixel */'#10'" 24 24 256 2",'#10'/* c'
+ +'olors */'#10'"`` c None",'#10'"`. c #035501",'#10'"`# c #045702",'#10'"`a c'
+ +' #1b830f",'#10'"`b c #2daa18",'#10'"`c c #1d8b10",'#10'"`d c #014f00",'#10
+ +'"`e c #0b6a05",'#10'"`f c #27a313",'#10'"`g c #29a615",'#10'"`h c #17970c",'
+ +#10'"`i c #18780d",'#10'"`j c #139309",'#10'"`k c #35af1c",'#10'"`l c #2f9f1'
+ +'a",'#10'"`m c #289516",'#10'"`n c #218212",'#10'"`o c #0d8d05",'#10'"`p c #'
+ +'1f9f10",'#10'"`q c #3eb622",'#10'"`r c #43bb25",'#10'"`s c #4fc52c",'#10'"`'
+ +'t c #4fbf2d",'#10'"`u c #45af27",'#10'"`v c #097903",'#10'"`w c #0d9006",'
+ +#10'"`x c #3ab41f",'#10'"`y c #820000",'#10'"`z c #2a8c17",'#10'"`A c #10900'
+ +'7",'#10'"`B c #f3552d",'#10'"`C c #ff6a36",'#10'"`D c #ff5827",'#10'"`E c #'
+ +'ff4615",'#10'"`F c #f42805",'#10'"`G c #13740a",'#10'"`H c #147b0a",'#10'"`'
+ +'I c #eb4924",'#10'"`J c #ff4e20",'#10'"`K c #ff380e",'#10'"`L c #ff2803",'
+ +#10'"`M c #e71600",'#10'"`N c #379c1f",'#10'"`O c #eb3916",'#10'"`P c #ff360'
+ +'c",'#10'"`Q c #ff2401",'#10'"`R c #f81800",'#10'"`S c #d00e00",'#10'"`T c #'
+ +'126d09",'#10'"`U c #096205",'#10'"`V c #d81100",'#10'"`W c #af0801",'#10'"`'
+ +'X c #278916",'#10'"`Y c #3ca022",'#10'"`Z c #46ac28",'#10'"`0 c #404040",'
+ +#10'"`1 c #0f3500",'#10'"`2 c #39a11f",'#10'"`3 c #54bd2f",'#10'"`4 c #fffff'
+ +'f",'#10'"`5 c #000000",'#10'"`6 c #005300",'#10'"`7 c #004b00",'#10'"`8 c #'
+ +'c0dcc0",'#10'".` c #004600",'#10'".. c #6fdc3e",'#10'".# c #53c52d",'#10'".'
+ +'a c #46bf27",'#10'".b c #23a411",'#10'".c c #70de40",'#10'".d c #40b623",'
+ +#10'".e c #2eab18",'#10'".f c #31ad1a",'#10'".g c #000000",'#10'".h c #00000'
+ +'0",'#10'".i c #000000",'#10'".j c #000000",'#10'".k c #000000",'#10'".l c #'
+ +'000000",'#10'".m c #000000",'#10'".n c #000000",'#10'".o c #000000",'#10'".'
+ +'p c #000000",'#10'".q c #000000",'#10'".r c #000000",'#10'".s c #000000",'
+ +#10'".t c #000000",'#10'".u c #000000",'#10'".v c #000000",'#10'".w c #00000'
+ +'0",'#10'".x c #000000",'#10'".y c #000000",'#10'".z c #000000",'#10'".A c #'
+ +'000000",'#10'".B c #000000",'#10'".C c #000000",'#10'".D c #000000",'#10'".'
+ +'E c #000000",'#10'".F c #000000",'#10'".G c #000000",'#10'".H c #000000",'
+ +#10'".I c #000000",'#10'".J c #000000",'#10'".K c #000000",'#10'".L c #00000'
+ +'0",'#10'".M c #000000",'#10'".N c #000000",'#10'".O c #000000",'#10'".P c #'
+ +'000000",'#10'".Q c #000000",'#10'".R c #000000",'#10'".S c #000000",'#10'".'
+ +'T c #000000",'#10'".U c #000000",'#10'".V c #000000",'#10'".W c #000000",'
+ +#10'".X c #000000",'#10'".Y c #000000",'#10'".Z c #000000",'#10'".0 c #00000'
+ +'0",'#10'".1 c #000000",'#10'".2 c #000000",'#10'".3 c #000000",'#10'".4 c #'
+ +'000000",'#10'".5 c #000000",'#10'".6 c #000000",'#10'".7 c #000000",'#10'".'
+ +'8 c #000000",'#10'"#` c #000000",'#10'"#. c #000000",'#10'"## c #000000",'
+ +#10'"#a c #000000",'#10'"#b c #000000",'#10'"#c c #000000",'#10'"#d c #00000'
+ +'0",'#10'"#e c #000000",'#10'"#f c #000000",'#10'"#g c #000000",'#10'"#h c #'
+ +'000000",'#10'"#i c #000000",'#10'"#j c #000000",'#10'"#k c #000000",'#10'"#'
+ +'l c #000000",'#10'"#m c #000000",'#10'"#n c #000000",'#10'"#o c #000000",'
+ +#10'"#p c #000000",'#10'"#q c #000000",'#10'"#r c #000000",'#10'"#s c #00000'
+ +'0",'#10'"#t c #000000",'#10'"#u c #000000",'#10'"#v c #000000",'#10'"#w c #'
+ +'000000",'#10'"#x c #000000",'#10'"#y c #000000",'#10'"#z c #000000",'#10'"#'
+ +'A c #000000",'#10'"#B c #000000",'#10'"#C c #000000",'#10'"#D c #000000",'
+ +#10'"#E c #000000",'#10'"#F c #000000",'#10'"#G c #000000",'#10'"#H c #00000'
+ +'0",'#10'"#I c #000000",'#10'"#J c #000000",'#10'"#K c #000000",'#10'"#L c #'
+ +'000000",'#10'"#M c #000000",'#10'"#N c #000000",'#10'"#O c #000000",'#10'"#'
+ +'P c #000000",'#10'"#Q c #000000",'#10'"#R c #000000",'#10'"#S c #000000",'
+ +#10'"#T c #000000",'#10'"#U c #000000",'#10'"#V c #000000",'#10'"#W c #00000'
+ +'0",'#10'"#X c #000000",'#10'"#Y c #000000",'#10'"#Z c #000000",'#10'"#0 c #'
+ +'000000",'#10'"#1 c #000000",'#10'"#2 c #000000",'#10'"#3 c #000000",'#10'"#'
+ +'4 c #000000",'#10'"#5 c #000000",'#10'"#6 c #000000",'#10'"#7 c #000000",'
+ +#10'"#8 c #000000",'#10'"a` c #000000",'#10'"a. c #000000",'#10'"a# c #00000'
+ +'0",'#10'"aa c #000000",'#10'"ab c #000000",'#10'"ac c #000000",'#10'"ad c #'
+ +'000000",'#10'"ae c #000000",'#10'"af c #000000",'#10'"ag c #000000",'#10'"a'
+ +'h c #000000",'#10'"ai c #000000",'#10'"aj c #000000",'#10'"ak c #000000",'
+ +#10'"al c #000000",'#10'"am c #000000",'#10'"an c #000000",'#10'"ao c #00000'
+ +'0",'#10'"ap c #000000",'#10'"aq c #000000",'#10'"ar c #000000",'#10'"as c #'
+ +'000000",'#10'"at c #000000",'#10'"au c #000000",'#10'"av c #000000",'#10'"a'
+ +'w c #000000",'#10'"ax c #000000",'#10'"ay c #000000",'#10'"az c #000000",'
+ +#10'"aA c #000000",'#10'"aB c #000000",'#10'"aC c #000000",'#10'"aD c #00000'
+ +'0",'#10'"aE c #000000",'#10'"aF c #000000",'#10'"aG c #000000",'#10'"aH c #'
+ +'000000",'#10'"aI c #000000",'#10'"aJ c #000000",'#10'"aK c #000000",'#10'"a'
+ ,'L c #000000",'#10'"aM c #000000",'#10'"aN c #000000",'#10'"aO c #000000",'
+ +#10'"aP c #000000",'#10'"aQ c #000000",'#10'"aR c #000000",'#10'"aS c #00000'
+ +'0",'#10'"aT c #000000",'#10'"aU c #000000",'#10'"aV c #000000",'#10'"aW c #'
+ +'000000",'#10'"aX c #000000",'#10'"aY c #000000",'#10'"aZ c #000000",'#10'"a'
+ +'0 c #000000",'#10'"a1 c #000000",'#10'"a2 c #000000",'#10'"a3 c #000000",'
+ +#10'"a4 c #000000",'#10'"a5 c #000000",'#10'"a6 c #000000",'#10'"a7 c #00000'
+ +'0",'#10'"a8 c #000000",'#10'/* pixels */'#10'"`````````````````````````````'
+ +'```````````````````",'#10'"```````````````````.`.``````````````````````````'
+ +'",'#10'"`````````````````.`#`#``````````````````````````",'#10'"```````````'
+ +'````.`#`a`#``````````````````````````",'#10'"`````````````.`.`b`c`#````````'
+ +'``````````````````",'#10'"```````````d`e`f`g`h`.`.`.`.`.``````````````````"'
+ +','#10'"`````````.`i`j`h`f`b`k`l`l`m`i`.`.``````````````",'#10'"```````.`n`o'
+ +'`j`j`p`p`b`q`r`s`t`u`n`.````````````",'#10'"`````.`v`w`o`o`j`h`f`f`k`x`y`y`'
+ +'y`y`y`y`y````````",'#10'"`````.`z`v`o`o`A`h`p`f`b`k`y`B`C`D`E`F`y````````",'
+ +#10'"```````d`G`v`o`o`j`v`m`a`H`y`I`J`K`L`M`y`.``````",'#10'"`````````d`e`v`'
+ +'o`j`N`d`d`.`y`O`P`Q`R`S`y`T``````",'#10'"```````````.`U`v`A`l`d`````y`F`Q`R'
+ +'`V`W`y`X`.````",'#10'"`````````````.`U`v`Y`.`````y`y`y`y`y`y`y`Z`.````",'#10
+ +'"`0`0`0`0`0`0`0`0`0`0`0`0`0```````1```.`2`3`.````",'#10'"`0`4`4`4`4`4`4`4`4'
+ +'`4`4`4`0`5`6`6`7`6`6`7`7`#````",'#10'"`0`4`5`5`5`8`4`8`5`5`5`4`0`5`````````'
+ +'``U.``.````",'#10'"`0`4`5`4`8`5`4`5`8`4`4`4`0`5```````````.`7`#````",'#10'"'
+ +'`0`4`5`5`5`8`4`8`5`5`8`4`0`5```````````7..`7````",'#10'"`0`4`5`8`4`4`4`4`4`'
+ +'8`5`4`0`5`7```````7...#.a`7``",'#10'"`0`4`5`4`4`5`5`5`5`5`8`4`0`5.b`7```7.c'
+ +'.#.d.e.b`7",'#10'"`0`4`4`4`4`4`4`4`4`4`4`4`0`5`7```````7.a.f.b`7``",'#10'"`'
+ +'0`0`0`0`0`0`0`0`0`0`0`0`0`5```````````7.b`7````",'#10'"```5`5`5`5`5`5`5`5`5'
+ +'`5`5`5`5`````````````7``````"'#10'};'#10
+]);
+LazarusResources.Add('tpsimport_comobj','XPM',[
+ '/* XPM */'#10'static char *tpsimport_comobj[] = {'#10'/* width height num_co'
+ +'lors chars_per_pixel */'#10'" 24 24 256 2",'#10'/* co'
+ +'lors */'#10'"`` c None",'#10'"`. c #035501",'#10'"`# c #045702",'#10'"`a c '
+ +'#1b830f",'#10'"`b c #2daa18",'#10'"`c c #1d8b10",'#10'"`d c #014f00",'#10'"'
+ +'`e c #0b6a05",'#10'"`f c #27a313",'#10'"`g c #29a615",'#10'"`h c #17970c",'
+ +#10'"`i c #18780d",'#10'"`j c #139309",'#10'"`k c #35af1c",'#10'"`l c #2f9f1'
+ +'a",'#10'"`m c #289516",'#10'"`n c #218212",'#10'"`o c #0d8d05",'#10'"`p c #'
+ +'1f9f10",'#10'"`q c #3eb622",'#10'"`r c #43bb25",'#10'"`s c #4fc52c",'#10'"`'
+ +'t c #4fbf2d",'#10'"`u c #45af27",'#10'"`v c #097903",'#10'"`w c #0d9006",'
+ +#10'"`x c #3ab41f",'#10'"`y c #07409a",'#10'"`z c #0d469f",'#10'"`A c #10479'
+ +'f",'#10'"`B c #0f4195",'#10'"`C c #0a3f97",'#10'"`D c #0a398c",'#10'"`E c #'
+ +'2a8c17",'#10'"`F c #109007",'#10'"`G c #0341a3",'#10'"`H c #1354b2",'#10'"`'
+ +'I c #4989d5",'#10'"`J c #79ade5",'#10'"`K c #8ebbed",'#10'"`L c #7eb1e7",'
+ +#10'"`M c #5490d5",'#10'"`N c #2360b4",'#10'"`O c #11367f",'#10'"`P c #16286'
+ +'2",'#10'"`Q c #13740a",'#10'"`R c #05409f",'#10'"`S c #3179d0",'#10'"`T c #'
+ +'9fcbf8",'#10'"`U c #c5e1fc",'#10'"`V c #a9d1f8",'#10'"`W c #86baf0",'#10'"`'
+ +'X c #6caaea",'#10'"`Y c #599de3",'#10'"`Z c #3b87da",'#10'"`0 c #1165ce",'
+ +#10'"`1 c #093b90",'#10'"`2 c #162863",'#10'"`3 c #0341a4",'#10'"`4 c #3079d'
+ +'3",'#10'"`5 c #b4d8fc",'#10'"`6 c #c1e0fc",'#10'"`7 c #8cc1f7",'#10'"`8 c #'
+ +'88bff6",'#10'".` c #5ea4ee",'#10'".. c #418ee5",'#10'".# c #3280dc",'#10'".'
+ +'a c #1c6ccf",'#10'".b c #0959c4",'#10'".c c #0152c9",'#10'".d c #0a388e",'
+ +#10'".e c #1a2356",'#10'".f c #096205",'#10'".g c #0d52b4",'#10'".h c #90c2f'
+ +'6",'#10'".i c #bbdcfc",'#10'".j c #82bdfa",'#10'".k c #6cb0f6",'#10'".l c #'
+ +'79b7f4",'#10'".m c #67a9ef",'#10'".n c #4591e3",'#10'".o c #2c7dda",'#10'".'
+ +'p c #196acf",'#10'".q c #0958c4",'#10'".r c #014dbd",'#10'".s c #0050c9",'
+ +#10'".t c #152865",'#10'".u c #0541a0",'#10'".v c #357ed4",'#10'".w c #a6d0f'
+ +'a",'#10'".x c #82bcf7",'#10'".y c #6aaff6",'#10'".z c #6f96d0",'#10'".A c #'
+ +'b14f4d",'#10'".B c #e7280d",'#10'".C c #e5270c",'#10'".D c #923f44",'#10'".'
+ +'E c #1f57ac",'#10'".F c #0451c0",'#10'".G c #004cbc",'#10'".H c #004ec2",'
+ +#10'".I c #063f9e",'#10'".J c #1c1f4e",'#10'".K c #404040",'#10'".L c #ab4c4'
+ +'b",'#10'".M c #ff1e00",'#10'".N c #803440",'#10'".O c #004abc",'#10'".P c #'
+ +'0049bb",'#10'".Q c #004dbf",'#10'".R c #0248b5",'#10'".S c #1d1f4d",'#10'".'
+ +'T c #ffffff",'#10'".U c #000000",'#10'".V c #dd230a",'#10'".W c #024fbd",'
+ +#10'".X c #034ebd",'#10'".Y c #004bbf",'#10'".Z c #182359",'#10'".0 c #c0dcc'
+ +'0",'#10'".1 c #0450bf",'#10'".2 c #1c2051",'#10'".3 c #7b323e",'#10'".4 c #'
+ +'014bbc",'#10'".5 c #0249b5",'#10'".6 c #7d333e",'#10'".7 c #da230a",'#10'".'
+ +'8 c #7b313e",'#10'"#` c #0d45a3",'#10'"#. c #004bbc",'#10'"## c #0540a0",'
+ +#10'"#a c #0351bf",'#10'"#b c #0350bf",'#10'"#c c #132968",'#10'"#d c #064fb'
+ +'f",'#10'"#e c #0049bc",'#10'"#f c #0047bb",'#10'"#g c #0050c7",'#10'"#h c #'
+ +'083b93",'#10'"#i c #1d1e4b",'#10'"#j c #014dbf",'#10'"#k c #004cbd",'#10'"#'
+ +'l c #004cbf",'#10'"#m c #004ec1",'#10'"#n c #0051c9",'#10'"#o c #093a92",'
+ +#10'"#p c #0146b1",'#10'"#q c #004bbb",'#10'"#r c #0247b4",'#10'"#s c #122b6'
+ +'b",'#10'"#t c #1c1f4d",'#10'"#u c #1b2152",'#10'"#v c #1d1f4c",'#10'"#w c #'
+ +'000000",'#10'"#x c #000000",'#10'"#y c #000000",'#10'"#z c #000000",'#10'"#'
+ +'A c #000000",'#10'"#B c #000000",'#10'"#C c #000000",'#10'"#D c #000000",'
+ +#10'"#E c #000000",'#10'"#F c #000000",'#10'"#G c #000000",'#10'"#H c #00000'
+ +'0",'#10'"#I c #000000",'#10'"#J c #000000",'#10'"#K c #000000",'#10'"#L c #'
+ +'000000",'#10'"#M c #000000",'#10'"#N c #000000",'#10'"#O c #000000",'#10'"#'
+ +'P c #000000",'#10'"#Q c #000000",'#10'"#R c #000000",'#10'"#S c #000000",'
+ +#10'"#T c #000000",'#10'"#U c #000000",'#10'"#V c #000000",'#10'"#W c #00000'
+ +'0",'#10'"#X c #000000",'#10'"#Y c #000000",'#10'"#Z c #000000",'#10'"#0 c #'
+ +'000000",'#10'"#1 c #000000",'#10'"#2 c #000000",'#10'"#3 c #000000",'#10'"#'
+ +'4 c #000000",'#10'"#5 c #000000",'#10'"#6 c #000000",'#10'"#7 c #000000",'
+ +#10'"#8 c #000000",'#10'"a` c #000000",'#10'"a. c #000000",'#10'"a# c #00000'
+ +'0",'#10'"aa c #000000",'#10'"ab c #000000",'#10'"ac c #000000",'#10'"ad c #'
+ +'000000",'#10'"ae c #000000",'#10'"af c #000000",'#10'"ag c #000000",'#10'"a'
+ +'h c #000000",'#10'"ai c #000000",'#10'"aj c #000000",'#10'"ak c #000000",'
+ +#10'"al c #000000",'#10'"am c #000000",'#10'"an c #000000",'#10'"ao c #00000'
+ +'0",'#10'"ap c #000000",'#10'"aq c #000000",'#10'"ar c #000000",'#10'"as c #'
+ +'000000",'#10'"at c #000000",'#10'"au c #000000",'#10'"av c #000000",'#10'"a'
+ +'w c #000000",'#10'"ax c #000000",'#10'"ay c #000000",'#10'"az c #000000",'
+ +#10'"aA c #000000",'#10'"aB c #000000",'#10'"aC c #000000",'#10'"aD c #00000'
+ +'0",'#10'"aE c #000000",'#10'"aF c #000000",'#10'"aG c #000000",'#10'"aH c #'
+ +'000000",'#10'"aI c #000000",'#10'"aJ c #000000",'#10'"aK c #000000",'#10'"a'
+ ,'L c #000000",'#10'"aM c #000000",'#10'"aN c #000000",'#10'"aO c #000000",'
+ +#10'"aP c #000000",'#10'"aQ c #000000",'#10'"aR c #000000",'#10'"aS c #00000'
+ +'0",'#10'"aT c #000000",'#10'"aU c #000000",'#10'"aV c #000000",'#10'"aW c #'
+ +'000000",'#10'"aX c #000000",'#10'"aY c #000000",'#10'"aZ c #000000",'#10'"a'
+ +'0 c #000000",'#10'"a1 c #000000",'#10'"a2 c #000000",'#10'"a3 c #000000",'
+ +#10'"a4 c #000000",'#10'"a5 c #000000",'#10'"a6 c #000000",'#10'"a7 c #00000'
+ +'0",'#10'"a8 c #000000",'#10'/* pixels */'#10'"`````````````````````````````'
+ +'```````````````````",'#10'"```````````````````.`.``````````````````````````'
+ +'",'#10'"`````````````````.`#`#``````````````````````````",'#10'"```````````'
+ +'````.`#`a`#``````````````````````````",'#10'"`````````````.`.`b`c`#````````'
+ +'``````````````````",'#10'"```````````d`e`f`g`h`.`.`.`.`.``````````````````"'
+ +','#10'"`````````.`i`j`h`f`b`k`l`l`m`i`.`.``````````````",'#10'"```````.`n`o'
+ +'`j`j`p`p`b`q`r`s`t`u`n`.````````````",'#10'"`````.`v`w`o`o`j`h`f`f`k`x`y`z`'
+ +'A`B`C`D``````````",'#10'"`````.`E`v`o`o`F`h`p`f`G`H`I`J`K`L`M`N`O`P``````",'
+ +#10'"```````d`Q`v`o`o`j`v`R`S`T`U`V`W`X`Y`Z`0`1`2````",'#10'"`````````d`e`v`'
+ +'o`j`3`4`5`6`7`8.`...#.a.b.c.d.e``",'#10'"```````````..f`v`F.g.h.i.j.k.l.m.n'
+ +'.o.p.q.r.s.t``",'#10'"`````````````..f.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J",'#10
+ +'".K.K.K.K.K.K.K.K.K.K.K.K.K.L.M.M.M.M.N.O.P.Q.R.S",'#10'".K.T.T.T.T.T.T.T.T'
+ +'.T.T.T.K.U.M.M.M.M.V.W.X.O.Y.Z",'#10'".K.T.U.U.U.0.T.0.U.U.U.T.K.U.M.M.M.M.'
+ +'V.W.1.O.Y.2",'#10'".K.T.U.T.0.U.T.U.0.T.T.T.K.U.M.M.M.M.3.4.P.Q.5.J",'#10'"'
+ +'.K.T.U.U.U.0.T.0.U.U.0.T.K.U.6.7.7.8#`.P#..H##.J",'#10'".K.T.U.0.T.T.T.T.T.'
+ +'0.U.T.K.U#a.W#b.P#.#.#..s#c``",'#10'".K.T.U.T.T.U.U.U.U.U.0.T.K.U#d#e#f#.#.'
+ +'#.#g#h#i``",'#10'".K.T.T.T.T.T.T.T.T.T.T.T.K.U#j#e#k#l#m#n#o.J````",'#10'".'
+ +'K.K.K.K.K.K.K.K.K.K.K.K.K.U#p#q#.#r.I#s#t``````",'#10'"``.U.U.U.U.U.U.U.U.U'
+ +'.U.U.U.U#u#c#c#u#v``````````"'#10'};'#10
+]);
+LazarusResources.Add('tpsimport_controls','XPM',[
+ '/* XPM */'#10'static char *tpsimport_controls[] = {'#10'/* width height num_'
+ +'colors chars_per_pixel */'#10'" 24 24 256 2",'#10'/* '
+ +'colors */'#10'"`` c None",'#10'"`. c #035501",'#10'"`# c #045702",'#10'"`a '
+ +'c #1b830f",'#10'"`b c #2daa18",'#10'"`c c #1d8b10",'#10'"`d c #014f00",'#10
+ +'"`e c #0b6a05",'#10'"`f c #27a313",'#10'"`g c #29a615",'#10'"`h c #17970c",'
+ +#10'"`i c #18780d",'#10'"`j c #139309",'#10'"`k c #35af1c",'#10'"`l c #2f9f1'
+ +'a",'#10'"`m c #289516",'#10'"`n c #218212",'#10'"`o c #0d8d05",'#10'"`p c #'
+ +'1f9f10",'#10'"`q c #3eb622",'#10'"`r c #43bb25",'#10'"`s c #4fc52c",'#10'"`'
+ +'t c #4fbf2d",'#10'"`u c #45af27",'#10'"`v c #097903",'#10'"`w c #0d9006",'
+ +#10'"`x c #3ab41f",'#10'"`y c #5ed035",'#10'"`z c #5fca35",'#10'"`A c #3ca02'
+ +'2",'#10'"`B c #2a8c17",'#10'"`C c #109007",'#10'"`D c #48bc27",'#10'"`E c #'
+ +'52c42d",'#10'"`F c #6ad83c",'#10'"`G c #46ac28",'#10'"`H c #13740a",'#10'"`'
+ +'I c #147b0a",'#10'"`J c #2c9518",'#10'"`K c #64d338",'#10'"`L c #72dc41",'
+ +#10'"`M c #379c1f",'#10'"`N c #53536b",'#10'"`O c #68d13b",'#10'"`P c #126d0'
+ +'9",'#10'"`Q c #096205",'#10'"`R c #b8abbc",'#10'"`S c #b493a1",'#10'"`T c #'
+ +'b49fad",'#10'"`U c #b598a6",'#10'"`V c #5c5b78",'#10'"`W c #edeef4",'#10'"`'
+ +'X c #e9e5ed",'#10'"`Y c #d5b6c0",'#10'"`Z c #d0d3e7",'#10'"`0 c #404040",'
+ +#10'"`1 c #cfc5d3",'#10'"`2 c #d4c2cc",'#10'"`3 c #ebe0e5",'#10'"`4 c #e2d8d'
+ +'e",'#10'"`5 c #b8c2de",'#10'"`6 c #9f9ece",'#10'"`7 c #998bcc",'#10'"`8 c #'
+ +'968cc9",'#10'".` c #ffffff",'#10'".. c #000000",'#10'".# c #cbcede",'#10'".'
+ +'a c #cbcce0",'#10'".b c #9f9cc7",'#10'".c c #69898c",'#10'".d c #8390c0",'
+ +#10'".e c #c0dcc0",'#10'".f c #d4d0dc",'#10'".g c #d3d3e3",'#10'".h c #9fa0c'
+ +'6",'#10'".i c #908bc7",'#10'".j c #ddd8e7",'#10'".k c #a7a3d3",'#10'".l c #'
+ +'7e8eac",'#10'".m c #e0dcea",'#10'".n c #b0a5e0",'#10'".o c #8482c0",'#10'".'
+ +'p c #cecbd9",'#10'".q c #dad9ea",'#10'".r c #a4a6d0",'#10'".s c #cbc9d8",'
+ +#10'".t c #dcdaef",'#10'".u c #84a4a9",'#10'".v c #b1b0c9",'#10'".w c #c5c5d'
+ +'8",'#10'".x c #dcdcee",'#10'".y c #a1a6d4",'#10'".z c #8c8bcf",'#10'".A c #'
+ +'a3a3b8",'#10'".B c #bfbfd7",'#10'".C c #8c8cc6",'#10'".D c #000000",'#10'".'
+ +'E c #000000",'#10'".F c #000000",'#10'".G c #000000",'#10'".H c #000000",'
+ +#10'".I c #000000",'#10'".J c #000000",'#10'".K c #000000",'#10'".L c #00000'
+ +'0",'#10'".M c #000000",'#10'".N c #000000",'#10'".O c #000000",'#10'".P c #'
+ +'000000",'#10'".Q c #000000",'#10'".R c #000000",'#10'".S c #000000",'#10'".'
+ +'T c #000000",'#10'".U c #000000",'#10'".V c #000000",'#10'".W c #000000",'
+ +#10'".X c #000000",'#10'".Y c #000000",'#10'".Z c #000000",'#10'".0 c #00000'
+ +'0",'#10'".1 c #000000",'#10'".2 c #000000",'#10'".3 c #000000",'#10'".4 c #'
+ +'000000",'#10'".5 c #000000",'#10'".6 c #000000",'#10'".7 c #000000",'#10'".'
+ +'8 c #000000",'#10'"#` c #000000",'#10'"#. c #000000",'#10'"## c #000000",'
+ +#10'"#a c #000000",'#10'"#b c #000000",'#10'"#c c #000000",'#10'"#d c #00000'
+ +'0",'#10'"#e c #000000",'#10'"#f c #000000",'#10'"#g c #000000",'#10'"#h c #'
+ +'000000",'#10'"#i c #000000",'#10'"#j c #000000",'#10'"#k c #000000",'#10'"#'
+ +'l c #000000",'#10'"#m c #000000",'#10'"#n c #000000",'#10'"#o c #000000",'
+ +#10'"#p c #000000",'#10'"#q c #000000",'#10'"#r c #000000",'#10'"#s c #00000'
+ +'0",'#10'"#t c #000000",'#10'"#u c #000000",'#10'"#v c #000000",'#10'"#w c #'
+ +'000000",'#10'"#x c #000000",'#10'"#y c #000000",'#10'"#z c #000000",'#10'"#'
+ +'A c #000000",'#10'"#B c #000000",'#10'"#C c #000000",'#10'"#D c #000000",'
+ +#10'"#E c #000000",'#10'"#F c #000000",'#10'"#G c #000000",'#10'"#H c #00000'
+ +'0",'#10'"#I c #000000",'#10'"#J c #000000",'#10'"#K c #000000",'#10'"#L c #'
+ +'000000",'#10'"#M c #000000",'#10'"#N c #000000",'#10'"#O c #000000",'#10'"#'
+ +'P c #000000",'#10'"#Q c #000000",'#10'"#R c #000000",'#10'"#S c #000000",'
+ +#10'"#T c #000000",'#10'"#U c #000000",'#10'"#V c #000000",'#10'"#W c #00000'
+ +'0",'#10'"#X c #000000",'#10'"#Y c #000000",'#10'"#Z c #000000",'#10'"#0 c #'
+ +'000000",'#10'"#1 c #000000",'#10'"#2 c #000000",'#10'"#3 c #000000",'#10'"#'
+ +'4 c #000000",'#10'"#5 c #000000",'#10'"#6 c #000000",'#10'"#7 c #000000",'
+ +#10'"#8 c #000000",'#10'"a` c #000000",'#10'"a. c #000000",'#10'"a# c #00000'
+ +'0",'#10'"aa c #000000",'#10'"ab c #000000",'#10'"ac c #000000",'#10'"ad c #'
+ +'000000",'#10'"ae c #000000",'#10'"af c #000000",'#10'"ag c #000000",'#10'"a'
+ +'h c #000000",'#10'"ai c #000000",'#10'"aj c #000000",'#10'"ak c #000000",'
+ +#10'"al c #000000",'#10'"am c #000000",'#10'"an c #000000",'#10'"ao c #00000'
+ +'0",'#10'"ap c #000000",'#10'"aq c #000000",'#10'"ar c #000000",'#10'"as c #'
+ +'000000",'#10'"at c #000000",'#10'"au c #000000",'#10'"av c #000000",'#10'"a'
+ +'w c #000000",'#10'"ax c #000000",'#10'"ay c #000000",'#10'"az c #000000",'
+ +#10'"aA c #000000",'#10'"aB c #000000",'#10'"aC c #000000",'#10'"aD c #00000'
+ +'0",'#10'"aE c #000000",'#10'"aF c #000000",'#10'"aG c #000000",'#10'"aH c #'
+ +'000000",'#10'"aI c #000000",'#10'"aJ c #000000",'#10'"aK c #000000",'#10'"a'
+ ,'L c #000000",'#10'"aM c #000000",'#10'"aN c #000000",'#10'"aO c #000000",'
+ +#10'"aP c #000000",'#10'"aQ c #000000",'#10'"aR c #000000",'#10'"aS c #00000'
+ +'0",'#10'"aT c #000000",'#10'"aU c #000000",'#10'"aV c #000000",'#10'"aW c #'
+ +'000000",'#10'"aX c #000000",'#10'"aY c #000000",'#10'"aZ c #000000",'#10'"a'
+ +'0 c #000000",'#10'"a1 c #000000",'#10'"a2 c #000000",'#10'"a3 c #000000",'
+ +#10'"a4 c #000000",'#10'"a5 c #000000",'#10'"a6 c #000000",'#10'"a7 c #00000'
+ +'0",'#10'"a8 c #000000",'#10'/* pixels */'#10'"`````````````````````````````'
+ +'```````````````````",'#10'"```````````````````.`.``````````````````````````'
+ +'",'#10'"`````````````````.`#`#``````````````````````````",'#10'"```````````'
+ +'````.`#`a`#``````````````````````````",'#10'"`````````````.`.`b`c`#````````'
+ +'``````````````````",'#10'"```````````d`e`f`g`h`.`.`.`.`.``````````````````"'
+ +','#10'"`````````.`i`j`h`f`b`k`l`l`m`i`.`.``````````````",'#10'"```````.`n`o'
+ +'`j`j`p`p`b`q`r`s`t`u`n`.````````````",'#10'"`````.`v`w`o`o`j`h`f`f`k`x`r`s`'
+ +'y`z`A`.``````````",'#10'"`````.`B`v`o`o`C`h`p`f`b`k`q`D`E`y`F`G`.````````",'
+ +#10'"```````d`H`v`o`o`j`v`m`a`I`I`H`J`t`K`L`l`.``````",'#10'"`````````d`e`v`'
+ +'o`j`M`d`d`.`.`N`N`N`N`O`O`P``````",'#10'"```````````.`Q`v`C`l`d```N`N`R`S`T'
+ +'`U`N`N`V`.````",'#10'"`````````````.`Q`v`A`N`N`W`X`T`T`T`T`Y`Z`N`.````",'#10
+ +'"`0`0`0`0`0`0`0`0`0`0`0`0`0`1`2`3`4`5`6`7`8`N````",'#10'"`0.`.`.`.`.`.`.`.`'
+ +'.`.`.``0..`1.#.a.b.c.d.d`N````",'#10'"`0.`.......e.`.e.......``0..`1.f.g.h.'
+ +'d.d.d.i`N``",'#10'"`0.`...`.e...`...e.`.`.``0..`1.f.j.k.l.d.d.d`N``",'#10'"'
+ +'`0.`.......e.`.e.....e.``0..`1.f.m.n.d.d.d.d.o`N",'#10'"`0.`...e.`.`.`.`.`.'
+ +'e...``0..`1.p.q.r.d.d.d.d.d`N",'#10'"`0.`...`.`...........e.``0..`1.s.t.u.d'
+ +'.d.d.d`N`N",'#10'"`0.`.`.`.`.`.`.`.`.`.`.``0...v.w.x.y.d.z`N`N````",'#10'"`'
+ +'0`0`0`0`0`0`0`0`0`0`0`0`0..`N.A.B.C`N`N````````",'#10'"``..................'
+ +'........```V`N`N````````````"'#10'};'#10
+]);
+LazarusResources.Add('tpsimport_dateutils','XPM',[
+ '/* XPM */'#10'static char *tpsimport_dateutils[] = {'#10'/* width height num'
+ +'_colors chars_per_pixel */'#10'" 24 24 256 2",'#10'/*'
+ +' colors */'#10'"`` c None",'#10'"`. c #035501",'#10'"`# c #045702",'#10'"`a'
+ +' c #1b830f",'#10'"`b c #2daa18",'#10'"`c c #1d8b10",'#10'"`d c #014f00",'#10
+ +'"`e c #0b6a05",'#10'"`f c #27a313",'#10'"`g c #29a615",'#10'"`h c #17970c",'
+ +#10'"`i c #18780d",'#10'"`j c #139309",'#10'"`k c #35af1c",'#10'"`l c #2f9f1'
+ +'a",'#10'"`m c #289516",'#10'"`n c #218212",'#10'"`o c #0d8d05",'#10'"`p c #'
+ +'1f9f10",'#10'"`q c #3eb622",'#10'"`r c #43bb25",'#10'"`s c #4fc52c",'#10'"`'
+ +'t c #4fbf2d",'#10'"`u c #45af27",'#10'"`v c #097903",'#10'"`w c #0d9006",'
+ +#10'"`x c #3ab41f",'#10'"`y c #323232",'#10'"`z c #353232",'#10'"`A c #33333'
+ +'3",'#10'"`B c #2a8c17",'#10'"`C c #109007",'#10'"`D c #52c42d",'#10'"`E c #'
+ +'472624",'#10'"`F c #4a2121",'#10'"`G c #691e1e",'#10'"`H c #4a2222",'#10'"`'
+ +'I c #5c0909",'#10'"`J c #13740a",'#10'"`K c #482929",'#10'"`L c #631c1a",'
+ +#10'"`M c #691f1c",'#10'"`N c #7a2b28",'#10'"`O c #7b2623",'#10'"`P c #7e2a2'
+ +'8",'#10'"`Q c #452c2c",'#10'"`R c #813b3c",'#10'"`S c #7a4d52",'#10'"`T c #'
+ +'6e5358",'#10'"`U c #464143",'#10'"`V c #707478",'#10'"`W c #464646",'#10'"`'
+ +'X c #379c1f",'#10'"`Y c #706a69",'#10'"`Z c #c54f49",'#10'"`0 c #a7120e",'
+ +#10'"`1 c #785654",'#10'"`2 c #9a8687",'#10'"`3 c #aaa6a9",'#10'"`4 c #58636'
+ +'5",'#10'"`5 c #6e7374",'#10'"`6 c #d7e3e7",'#10'"`7 c #dae0e0",'#10'"`8 c #'
+ +'474a49",'#10'".` c #777777",'#10'".. c #ffffff",'#10'".# c #6b6c6d",'#10'".'
+ +'a c #096205",'#10'".b c #7f7877",'#10'".c c #d96960",'#10'".d c #9c1210",'
+ +#10'".e c #a3a1a3",'#10'".f c #8e8c8c",'#10'".g c #5e5e5e",'#10'".h c #d9d9d'
+ +'8",'#10'".i c #fbfafa",'#10'".j c #e7e7e7",'#10'".k c #a6a6a6",'#10'".l c #'
+ +'d1d0d0",'#10'".m c #3ca022",'#10'".n c #7d7675",'#10'".o c #d5665d",'#10'".'
+ +'p c #9d1210",'#10'".q c #a69fa0",'#10'".r c #a09f9f",'#10'".s c #989797",'
+ +#10'".t c #939292",'#10'".u c #a7a6a6",'#10'".v c #d8d7d7",'#10'".w c #40404'
+ +'0",'#10'".x c #8f8f8f",'#10'".y c #a9a9a9",'#10'".z c #898888",'#10'".A c #'
+ +'b7b6b6",'#10'".B c #b6b5b5",'#10'".C c #dad9d9",'#10'".D c #fefefe",'#10'".'
+ +'E c #000000",'#10'".F c #e2e2e2",'#10'".G c #d9d9d9",'#10'".H c #aaaaaa",'
+ +#10'".I c #8c8b8b",'#10'".J c #d7d5d5",'#10'".K c #fafafb",'#10'".L c #c0dcc'
+ +'0",'#10'".M c #fffefe",'#10'".N c #abaaaa",'#10'".O c #211f1f",'#10'".P c #'
+ +'fcfeff",'#10'".Q c #f2f7fb",'#10'".R c #fffffe",'#10'".S c #838282",'#10'".'
+ +'T c #646262",'#10'".U c #bcbdbd",'#10'".V c #fafeff",'#10'".W c #eaf3fb",'
+ +#10'".X c #696868",'#10'".Y c #8b8a8b",'#10'".Z c #e5eef6",'#10'".0 c #e2eef'
+ +'c",'#10'".1 c #bdbbbb",'#10'".2 c #eeeff2",'#10'".3 c #f7fcff",'#10'".4 c #'
+ +'d7e3ef",'#10'".5 c #d9ebfc",'#10'".6 c #565658",'#10'".7 c #5b6064",'#10'".'
+ +'8 c #e0f2ff",'#10'"#` c #d8eeff",'#10'"#. c #fcffff",'#10'"## c #bbc2ca",'
+ +#10'"#a c #a5afb8",'#10'"#b c #d3e5f3",'#10'"#c c #c4d7e7",'#10'"#d c #78838'
+ +'f",'#10'"#e c #494d50",'#10'"#f c #f8f8f8",'#10'"#g c #d1d7da",'#10'"#h c #'
+ +'bac0c4",'#10'"#i c #7d7f82",'#10'"#j c #646668",'#10'"#k c #56595d",'#10'"#'
+ +'l c #3e4042",'#10'"#m c #414141",'#10'"#n c #60676d",'#10'"#o c #000000",'
+ +#10'"#p c #000000",'#10'"#q c #000000",'#10'"#r c #000000",'#10'"#s c #00000'
+ +'0",'#10'"#t c #000000",'#10'"#u c #000000",'#10'"#v c #000000",'#10'"#w c #'
+ +'000000",'#10'"#x c #000000",'#10'"#y c #000000",'#10'"#z c #000000",'#10'"#'
+ +'A c #000000",'#10'"#B c #000000",'#10'"#C c #000000",'#10'"#D c #000000",'
+ +#10'"#E c #000000",'#10'"#F c #000000",'#10'"#G c #000000",'#10'"#H c #00000'
+ +'0",'#10'"#I c #000000",'#10'"#J c #000000",'#10'"#K c #000000",'#10'"#L c #'
+ +'000000",'#10'"#M c #000000",'#10'"#N c #000000",'#10'"#O c #000000",'#10'"#'
+ +'P c #000000",'#10'"#Q c #000000",'#10'"#R c #000000",'#10'"#S c #000000",'
+ +#10'"#T c #000000",'#10'"#U c #000000",'#10'"#V c #000000",'#10'"#W c #00000'
+ +'0",'#10'"#X c #000000",'#10'"#Y c #000000",'#10'"#Z c #000000",'#10'"#0 c #'
+ +'000000",'#10'"#1 c #000000",'#10'"#2 c #000000",'#10'"#3 c #000000",'#10'"#'
+ +'4 c #000000",'#10'"#5 c #000000",'#10'"#6 c #000000",'#10'"#7 c #000000",'
+ +#10'"#8 c #000000",'#10'"a` c #000000",'#10'"a. c #000000",'#10'"a# c #00000'
+ +'0",'#10'"aa c #000000",'#10'"ab c #000000",'#10'"ac c #000000",'#10'"ad c #'
+ +'000000",'#10'"ae c #000000",'#10'"af c #000000",'#10'"ag c #000000",'#10'"a'
+ +'h c #000000",'#10'"ai c #000000",'#10'"aj c #000000",'#10'"ak c #000000",'
+ +#10'"al c #000000",'#10'"am c #000000",'#10'"an c #000000",'#10'"ao c #00000'
+ +'0",'#10'"ap c #000000",'#10'"aq c #000000",'#10'"ar c #000000",'#10'"as c #'
+ +'000000",'#10'"at c #000000",'#10'"au c #000000",'#10'"av c #000000",'#10'"a'
+ +'w c #000000",'#10'"ax c #000000",'#10'"ay c #000000",'#10'"az c #000000",'
+ +#10'"aA c #000000",'#10'"aB c #000000",'#10'"aC c #000000",'#10'"aD c #00000'
+ +'0",'#10'"aE c #000000",'#10'"aF c #000000",'#10'"aG c #000000",'#10'"aH c #'
+ +'000000",'#10'"aI c #000000",'#10'"aJ c #000000",'#10'"aK c #000000",'#10'"a'
+ ,'L c #000000",'#10'"aM c #000000",'#10'"aN c #000000",'#10'"aO c #000000",'
+ +#10'"aP c #000000",'#10'"aQ c #000000",'#10'"aR c #000000",'#10'"aS c #00000'
+ +'0",'#10'"aT c #000000",'#10'"aU c #000000",'#10'"aV c #000000",'#10'"aW c #'
+ +'000000",'#10'"aX c #000000",'#10'"aY c #000000",'#10'"aZ c #000000",'#10'"a'
+ +'0 c #000000",'#10'"a1 c #000000",'#10'"a2 c #000000",'#10'"a3 c #000000",'
+ +#10'"a4 c #000000",'#10'"a5 c #000000",'#10'"a6 c #000000",'#10'"a7 c #00000'
+ +'0",'#10'"a8 c #000000",'#10'/* pixels */'#10'"`````````````````````````````'
+ +'```````````````````",'#10'"```````````````````.`.``````````````````````````'
+ +'",'#10'"`````````````````.`#`#``````````````````````````",'#10'"```````````'
+ +'````.`#`a`#``````````````````````````",'#10'"`````````````.`.`b`c`#````````'
+ +'``````````````````",'#10'"```````````d`e`f`g`h`.`.`.`.`.``````````````````"'
+ +','#10'"`````````.`i`j`h`f`b`k`l`l`m`i`.`.``````````````",'#10'"```````.`n`o'
+ +'`j`j`p`p`b`q`r`s`t`u`n`.````````````",'#10'"`````.`v`w`o`o`j`h`f`f`k`x`r`s`'
+ +'y`y`````z`A``````",'#10'"`````.`B`v`o`o`C`h`p`f`b`k`q`y`D`E`y`F`.`G`H`I``",'
+ +#10'"```````d`J`v`o`o`j`v`m`K`L`M`N`O`P`Q`R`S`T`U`V`W",'#10'"`````````d`e`v`'
+ +'o`j`X`Y`Z`0`1`2`3`4`5`6`7`8.`...#",'#10'"```````````..a`v`C`l.b.c.d.e.f...g'
+ +'.h.i.j.k.l...#",'#10'"`````````````..a`v.m.n.o.p.q.f...k.r.s.t.u.v...#",'#10
+ +'".w.w.w.w.w.w.w.w.w.w.w.w.w.q.f...x.y.z.A.B.C.D.#",'#10'".w................'
+ +'.......w.E.f.D.F.G.H.I.J...K.#",'#10'".w...E.E.E.L...L.E.E.E...w.E.f.M...N.'
+ +'O.O.O.P.Q.#",'#10'".w...E...L.E...E.L.......w.E.f.R...S.O.T.U.V.W.#",'#10'"'
+ +'.w...E.E.E.L...L.E.E.L...w.E.f.R...r.X.Y.O.Z.0.#",'#10'".w...E.L...........'
+ +'L.E...w.E.f.R...1.2.3.O.4.5.#",'#10'".w...E.....E.E.E.E.E.L...w.E.f.R...z.6'
+ +'.O.7.8#`.#",'#10'".w.......................w.E.f....#.###a#b#c#d#e",'#10'".'
+ +'w.w.w.w.w.w.w.w.w.w.w.w.w.E.f#f#g#h#i#j#k#l````",'#10'"``.E.E.E.E.E.E.E.E.E'
+ +'.E.E.E.E`y#m#n#n````````````"'#10'};'#10
+]);
+LazarusResources.Add('tpsimport_db','XPM',[
+ '/* XPM */'#10'static char *tpsimport_db[] = {'#10'/* width height num_colors'
+ +' chars_per_pixel */'#10'" 24 24 256 2",'#10'/* colors'
+ +' */'#10'"`` c None",'#10'"`. c #035501",'#10'"`# c #045702",'#10'"`a c #1b8'
+ +'30f",'#10'"`b c #2daa18",'#10'"`c c #1d8b10",'#10'"`d c #014f00",'#10'"`e c'
+ +' #0b6a05",'#10'"`f c #27a313",'#10'"`g c #29a615",'#10'"`h c #17970c",'#10
+ +'"`i c #18780d",'#10'"`j c #139309",'#10'"`k c #35af1c",'#10'"`l c #2f9f1a",'
+ +#10'"`m c #289516",'#10'"`n c #218212",'#10'"`o c #0d8d05",'#10'"`p c #1f9f1'
+ +'0",'#10'"`q c #3eb622",'#10'"`r c #43bb25",'#10'"`s c #4fc52c",'#10'"`t c #'
+ +'4fbf2d",'#10'"`u c #45af27",'#10'"`v c #097903",'#10'"`w c #0d9006",'#10'"`'
+ +'x c #a77302",'#10'"`y c #a97402",'#10'"`z c #3ca022",'#10'"`A c #2a8c17",'
+ +#10'"`B c #109007",'#10'"`C c #e9dab7",'#10'"`D c #fbfcd7",'#10'"`E c #ffffa'
+ +'5",'#10'"`F c #feff87",'#10'"`G c #fbfe84",'#10'"`H c #e7dc62",'#10'"`I c #'
+ +'46ac28",'#10'"`J c #13740a",'#10'"`K c #ffffc0",'#10'"`L c #fff68e",'#10'"`'
+ +'M c #fff777",'#10'"`N c #fefa7d",'#10'"`O c #f6f07b",'#10'"`P c #e0ca45",'
+ +#10'"`Q c #986802",'#10'"`R c #72dc41",'#10'"`S c #379c1f",'#10'"`T c #fff45'
+ +'7",'#10'"`U c #fece16",'#10'"`V c #fccb1a",'#10'"`W c #f7dc5b",'#10'"`X c #'
+ +'d7bf5e",'#10'"`Y c #a5790f",'#10'"`Z c #096205",'#10'"`0 c #fff45b",'#10'"`'
+ +'1 c #fece15",'#10'"`2 c #fbc918",'#10'"`3 c #edd057",'#10'"`4 c #c2ab54",'
+ +#10'"`5 c #eade63",'#10'"`6 c #d5b72a",'#10'"`7 c #eabb11",'#10'"`8 c #f7c71'
+ +'8",'#10'".` c #e3cc53",'#10'".. c #af953c",'#10'".# c #fffb7e",'#10'".a c #'
+ +'fef880",'#10'".b c #f0d94b",'#10'".c c #404040",'#10'".d c #ad7b08",'#10'".'
+ +'e c #9f7209",'#10'".f c #92721d",'#10'".g c #fecc1a",'#10'".h c #ffe35e",'
+ +#10'".i c #f2d76a",'#10'".j c #cc9713",'#10'".k c #ffffff",'#10'".l c #00000'
+ +'0",'#10'".m c #d8cea9",'#10'".n c #b6ac8a",'#10'".o c #fecb18",'#10'".p c #'
+ +'ffe15e",'#10'".q c #f3d569",'#10'".r c #ce9915",'#10'".s c #c0dcc0",'#10'".'
+ +'t c #e7d467",'#10'".u c #bdaa5c",'#10'".v c #faca18",'#10'".w c #fae05b",'
+ +#10'".x c #e3c14e",'#10'".y c #bc880a",'#10'".z c #e7cc54",'#10'".A c #bba55'
+ +'0",'#10'".B c #d1b44f",'#10'".C c #c0921a",'#10'".D c #b07d08",'#10'".E c #'
+ +'b07e0a",'#10'".F c #bf9326",'#10'".G c #c7a140",'#10'".H c #e7cf58",'#10'".'
+ +'I c #bda754",'#10'".J c #f7f0ab",'#10'".K c #f0e09e",'#10'".L c #eedead",'
+ +#10'".M c #eee2ba",'#10'".N c #eee1b4",'#10'".O c #e5ce89",'#10'".P c #dec14'
+ +'a",'#10'".Q c #aa903e",'#10'".R c #fff862",'#10'".S c #ffd723",'#10'".T c #'
+ +'ffd52c",'#10'".U c #ffea72",'#10'".V c #f7dd78",'#10'".W c #d09e18",'#10'".'
+ +'X c #a47002",'#10'".Y c #8e6002",'#10'".Z c #fff45c",'#10'".0 c #ffe15c",'
+ +#10'".1 c #f3d768",'#10'".2 c #ce9a15",'#10'".3 c #fffe64",'#10'".4 c #ffd41'
+ +'8",'#10'".5 c #ffcf1a",'#10'".6 c #ffe562",'#10'".7 c #f7da6e",'#10'".8 c #'
+ +'d19e17",'#10'"#` c #ac7d09",'#10'"#. c #cba41d",'#10'"## c #e5b814",'#10'"#'
+ +'a c #f0bf18",'#10'"#b c #f2d351",'#10'"#c c #debd51",'#10'"#d c #b8860c",'
+ +#10'"#e c #000000",'#10'"#f c #000000",'#10'"#g c #000000",'#10'"#h c #00000'
+ +'0",'#10'"#i c #000000",'#10'"#j c #000000",'#10'"#k c #000000",'#10'"#l c #'
+ +'000000",'#10'"#m c #000000",'#10'"#n c #000000",'#10'"#o c #000000",'#10'"#'
+ +'p c #000000",'#10'"#q c #000000",'#10'"#r c #000000",'#10'"#s c #000000",'
+ +#10'"#t c #000000",'#10'"#u c #000000",'#10'"#v c #000000",'#10'"#w c #00000'
+ +'0",'#10'"#x c #000000",'#10'"#y c #000000",'#10'"#z c #000000",'#10'"#A c #'
+ +'000000",'#10'"#B c #000000",'#10'"#C c #000000",'#10'"#D c #000000",'#10'"#'
+ +'E c #000000",'#10'"#F c #000000",'#10'"#G c #000000",'#10'"#H c #000000",'
+ +#10'"#I c #000000",'#10'"#J c #000000",'#10'"#K c #000000",'#10'"#L c #00000'
+ +'0",'#10'"#M c #000000",'#10'"#N c #000000",'#10'"#O c #000000",'#10'"#P c #'
+ +'000000",'#10'"#Q c #000000",'#10'"#R c #000000",'#10'"#S c #000000",'#10'"#'
+ +'T c #000000",'#10'"#U c #000000",'#10'"#V c #000000",'#10'"#W c #000000",'
+ +#10'"#X c #000000",'#10'"#Y c #000000",'#10'"#Z c #000000",'#10'"#0 c #00000'
+ +'0",'#10'"#1 c #000000",'#10'"#2 c #000000",'#10'"#3 c #000000",'#10'"#4 c #'
+ +'000000",'#10'"#5 c #000000",'#10'"#6 c #000000",'#10'"#7 c #000000",'#10'"#'
+ +'8 c #000000",'#10'"a` c #000000",'#10'"a. c #000000",'#10'"a# c #000000",'
+ +#10'"aa c #000000",'#10'"ab c #000000",'#10'"ac c #000000",'#10'"ad c #00000'
+ +'0",'#10'"ae c #000000",'#10'"af c #000000",'#10'"ag c #000000",'#10'"ah c #'
+ +'000000",'#10'"ai c #000000",'#10'"aj c #000000",'#10'"ak c #000000",'#10'"a'
+ +'l c #000000",'#10'"am c #000000",'#10'"an c #000000",'#10'"ao c #000000",'
+ +#10'"ap c #000000",'#10'"aq c #000000",'#10'"ar c #000000",'#10'"as c #00000'
+ +'0",'#10'"at c #000000",'#10'"au c #000000",'#10'"av c #000000",'#10'"aw c #'
+ +'000000",'#10'"ax c #000000",'#10'"ay c #000000",'#10'"az c #000000",'#10'"a'
+ +'A c #000000",'#10'"aB c #000000",'#10'"aC c #000000",'#10'"aD c #000000",'
+ +#10'"aE c #000000",'#10'"aF c #000000",'#10'"aG c #000000",'#10'"aH c #00000'
+ +'0",'#10'"aI c #000000",'#10'"aJ c #000000",'#10'"aK c #000000",'#10'"aL c #'
+ ,'000000",'#10'"aM c #000000",'#10'"aN c #000000",'#10'"aO c #000000",'#10'"a'
+ +'P c #000000",'#10'"aQ c #000000",'#10'"aR c #000000",'#10'"aS c #000000",'
+ +#10'"aT c #000000",'#10'"aU c #000000",'#10'"aV c #000000",'#10'"aW c #00000'
+ +'0",'#10'"aX c #000000",'#10'"aY c #000000",'#10'"aZ c #000000",'#10'"a0 c #'
+ +'000000",'#10'"a1 c #000000",'#10'"a2 c #000000",'#10'"a3 c #000000",'#10'"a'
+ +'4 c #000000",'#10'"a5 c #000000",'#10'"a6 c #000000",'#10'"a7 c #000000",'
+ +#10'"a8 c #000000",'#10'/* pixels */'#10'"``````````````````````````````````'
+ +'``````````````",'#10'"```````````````````.`.``````````````````````````",'#10
+ +'"`````````````````.`#`#``````````````````````````",'#10'"```````````````.`#'
+ +'`a`#``````````````````````````",'#10'"`````````````.`.`b`c`#```````````````'
+ +'```````````",'#10'"```````````d`e`f`g`h`.`.`.`.`.``````````````````",'#10'"'
+ +'`````````.`i`j`h`f`b`k`l`l`m`i`.`.``````````````",'#10'"```````.`n`o`j`j`p`'
+ +'p`b`q`r`s`t`u`n`.````````````",'#10'"`````.`v`w`o`o`j`h`f`f`x`y`y`y`y`y`z`.'
+ +'``````````",'#10'"`````.`A`v`o`o`B`h`p`y`C`D`E`F`G`H`x`I`.````````",'#10'"`'
+ +'``````d`J`v`o`o`j`v`y`K`L`M`N`O`P`Q`R`l`.``````",'#10'"`````````d`e`v`o`j`S'
+ +'`y`T`U`V`W`X`Y`x`y`y`y`y`y``",'#10'"```````````.`Z`v`B`l`y`0`1`2`3`4`y`C`D`'
+ +'E`F`G`5`y",'#10'"`````````````.`Z`v`z`y`6`7`8.`..`y`K`L`M.#.a.b`y",'#10'".c'
+ +'.c.c.c.c.c.c.c.c.c.c.c.c.d.e.f`y`T`U.g.h.i.j`y",'#10'".c.k.k.k.k.k.k.k.k.k.'
+ +'k.k.c.l.m.n`y`0`1.o.p.q.r`y",'#10'".c.k.l.l.l.s.k.s.l.l.l.k.c.l.t.u`y`6`7.v'
+ +'.w.x.y`y",'#10'".c.k.l.k.s.l.k.l.s.k.k.k.c.l.z.A`y.B.C.D.E.F.G`y",'#10'".c.'
+ +'k.l.l.l.s.k.s.l.l.s.k.c.l.H.I`y.J.K.L.M.N.O`y",'#10'".c.k.l.s.k.k.k.k.k.s.l'
+ +'.k.c.l.P.Q`y.R.S.T.U.V.W`y",'#10'".c.k.l.k.k.l.l.l.l.l.s.k.c.l.X.Y`y.Z`1.o.'
+ +'0.1.2`y",'#10'".c.k.k.k.k.k.k.k.k.k.k.k.c.l`````y.3.4.5.6.7.8`y",'#10'".c.c'
+ +'.c.c.c.c.c.c.c.c.c.c.c.l````#`#.###a#b#c#d`y",'#10'"``.l.l.l.l.l.l.l.l.l.l.'
+ +'l.l.l```````y`y`y`y`y`y``"'#10'};'#10
+]);
+LazarusResources.Add('tpsimport_forms','XPM',[
+ '/* XPM */'#10'static char *tpsimport_forms[] = {'#10'/* width height num_col'
+ +'ors chars_per_pixel */'#10'" 24 24 256 2",'#10'/* col'
+ +'ors */'#10'"`` c None",'#10'"`. c #035501",'#10'"`# c #045702",'#10'"`a c #'
+ +'1b830f",'#10'"`b c #2daa18",'#10'"`c c #1d8b10",'#10'"`d c #014f00",'#10'"`'
+ +'e c #0b6a05",'#10'"`f c #27a313",'#10'"`g c #29a615",'#10'"`h c #17970c",'
+ +#10'"`i c #18780d",'#10'"`j c #139309",'#10'"`k c #35af1c",'#10'"`l c #2f9f1'
+ +'a",'#10'"`m c #289516",'#10'"`n c #218212",'#10'"`o c #0d8d05",'#10'"`p c #'
+ +'1f9f10",'#10'"`q c #3eb622",'#10'"`r c #43bb25",'#10'"`s c #4fc52c",'#10'"`'
+ +'t c #4fbf2d",'#10'"`u c #45af27",'#10'"`v c #097903",'#10'"`w c #0d9006",'
+ +#10'"`x c #0041bb",'#10'"`y c #0042bb",'#10'"`z c #2a8c17",'#10'"`A c #10900'
+ +'7",'#10'"`B c #62a3e9",'#10'"`C c #599ce6",'#10'"`D c #599de6",'#10'"`E c #'
+ +'569ce6",'#10'"`F c #5299e6",'#10'"`G c #589fe9",'#10'"`H c #13740a",'#10'"`'
+ +'I c #ffffff",'#10'"`J c #effaff",'#10'"`K c #096205",'#10'"`L c #404040",'
+ +#10'"`M c #000000",'#10'"`N c #c0dcc0",'#10'"`O c #f7fbff",'#10'"`P c #eaf4f'
+ +'f",'#10'"`Q c #dcedff",'#10'"`R c #cae5fe",'#10'"`S c #d7efff",'#10'"`T c #'
+ +'feffff",'#10'"`U c #f6fbff",'#10'"`V c #e7f3fe",'#10'"`W c #d9eefe",'#10'"`'
+ +'X c #cae6ff",'#10'"`Y c #baddfe",'#10'"`Z c #c4e7ff",'#10'"`0 c #f4faff",'
+ +#10'"`1 c #e7f3ff",'#10'"`2 c #d8ebfe",'#10'"`3 c #c9e5ff",'#10'"`4 c #b8ddf'
+ +'e",'#10'"`5 c #aad5fe",'#10'"`6 c #b5e1ff",'#10'"`7 c #fbfeff",'#10'"`8 c #'
+ +'f2f8ff",'#10'".` c #e5f2ff",'#10'".. c #d5ebff",'#10'".# c #c5e3ff",'#10'".'
+ +'a c #b6dcff",'#10'".b c #a9d4ff",'#10'".c c #9cceff",'#10'".d c #acdcff",'
+ +#10'".e c #eff6ff",'#10'".f c #e2f0fe",'#10'".g c #d1eaff",'#10'".h c #c4e2f'
+ +'e",'#10'".i c #b4dafe",'#10'".j c #a5d3fe",'#10'".k c #9ccefe",'#10'".l c #'
+ +'95cafe",'#10'".m c #abdaff",'#10'".n c #faffff",'#10'".o c #eafaff",'#10'".'
+ +'p c #c7e7ff",'#10'".q c #b8e1ff",'#10'".r c #addaff",'#10'".s c #a9d9ff",'
+ +#10'".t c #a7d8ff",'#10'".u c #c2eaff",'#10'".v c #000000",'#10'".w c #00000'
+ +'0",'#10'".x c #000000",'#10'".y c #000000",'#10'".z c #000000",'#10'".A c #'
+ +'000000",'#10'".B c #000000",'#10'".C c #000000",'#10'".D c #000000",'#10'".'
+ +'E c #000000",'#10'".F c #000000",'#10'".G c #000000",'#10'".H c #000000",'
+ +#10'".I c #000000",'#10'".J c #000000",'#10'".K c #000000",'#10'".L c #00000'
+ +'0",'#10'".M c #000000",'#10'".N c #000000",'#10'".O c #000000",'#10'".P c #'
+ +'000000",'#10'".Q c #000000",'#10'".R c #000000",'#10'".S c #000000",'#10'".'
+ +'T c #000000",'#10'".U c #000000",'#10'".V c #000000",'#10'".W c #000000",'
+ +#10'".X c #000000",'#10'".Y c #000000",'#10'".Z c #000000",'#10'".0 c #00000'
+ +'0",'#10'".1 c #000000",'#10'".2 c #000000",'#10'".3 c #000000",'#10'".4 c #'
+ +'000000",'#10'".5 c #000000",'#10'".6 c #000000",'#10'".7 c #000000",'#10'".'
+ +'8 c #000000",'#10'"#` c #000000",'#10'"#. c #000000",'#10'"## c #000000",'
+ +#10'"#a c #000000",'#10'"#b c #000000",'#10'"#c c #000000",'#10'"#d c #00000'
+ +'0",'#10'"#e c #000000",'#10'"#f c #000000",'#10'"#g c #000000",'#10'"#h c #'
+ +'000000",'#10'"#i c #000000",'#10'"#j c #000000",'#10'"#k c #000000",'#10'"#'
+ +'l c #000000",'#10'"#m c #000000",'#10'"#n c #000000",'#10'"#o c #000000",'
+ +#10'"#p c #000000",'#10'"#q c #000000",'#10'"#r c #000000",'#10'"#s c #00000'
+ +'0",'#10'"#t c #000000",'#10'"#u c #000000",'#10'"#v c #000000",'#10'"#w c #'
+ +'000000",'#10'"#x c #000000",'#10'"#y c #000000",'#10'"#z c #000000",'#10'"#'
+ +'A c #000000",'#10'"#B c #000000",'#10'"#C c #000000",'#10'"#D c #000000",'
+ +#10'"#E c #000000",'#10'"#F c #000000",'#10'"#G c #000000",'#10'"#H c #00000'
+ +'0",'#10'"#I c #000000",'#10'"#J c #000000",'#10'"#K c #000000",'#10'"#L c #'
+ +'000000",'#10'"#M c #000000",'#10'"#N c #000000",'#10'"#O c #000000",'#10'"#'
+ +'P c #000000",'#10'"#Q c #000000",'#10'"#R c #000000",'#10'"#S c #000000",'
+ +#10'"#T c #000000",'#10'"#U c #000000",'#10'"#V c #000000",'#10'"#W c #00000'
+ +'0",'#10'"#X c #000000",'#10'"#Y c #000000",'#10'"#Z c #000000",'#10'"#0 c #'
+ +'000000",'#10'"#1 c #000000",'#10'"#2 c #000000",'#10'"#3 c #000000",'#10'"#'
+ +'4 c #000000",'#10'"#5 c #000000",'#10'"#6 c #000000",'#10'"#7 c #000000",'
+ +#10'"#8 c #000000",'#10'"a` c #000000",'#10'"a. c #000000",'#10'"a# c #00000'
+ +'0",'#10'"aa c #000000",'#10'"ab c #000000",'#10'"ac c #000000",'#10'"ad c #'
+ +'000000",'#10'"ae c #000000",'#10'"af c #000000",'#10'"ag c #000000",'#10'"a'
+ +'h c #000000",'#10'"ai c #000000",'#10'"aj c #000000",'#10'"ak c #000000",'
+ +#10'"al c #000000",'#10'"am c #000000",'#10'"an c #000000",'#10'"ao c #00000'
+ +'0",'#10'"ap c #000000",'#10'"aq c #000000",'#10'"ar c #000000",'#10'"as c #'
+ +'000000",'#10'"at c #000000",'#10'"au c #000000",'#10'"av c #000000",'#10'"a'
+ +'w c #000000",'#10'"ax c #000000",'#10'"ay c #000000",'#10'"az c #000000",'
+ +#10'"aA c #000000",'#10'"aB c #000000",'#10'"aC c #000000",'#10'"aD c #00000'
+ +'0",'#10'"aE c #000000",'#10'"aF c #000000",'#10'"aG c #000000",'#10'"aH c #'
+ +'000000",'#10'"aI c #000000",'#10'"aJ c #000000",'#10'"aK c #000000",'#10'"a'
+ ,'L c #000000",'#10'"aM c #000000",'#10'"aN c #000000",'#10'"aO c #000000",'
+ +#10'"aP c #000000",'#10'"aQ c #000000",'#10'"aR c #000000",'#10'"aS c #00000'
+ +'0",'#10'"aT c #000000",'#10'"aU c #000000",'#10'"aV c #000000",'#10'"aW c #'
+ +'000000",'#10'"aX c #000000",'#10'"aY c #000000",'#10'"aZ c #000000",'#10'"a'
+ +'0 c #000000",'#10'"a1 c #000000",'#10'"a2 c #000000",'#10'"a3 c #000000",'
+ +#10'"a4 c #000000",'#10'"a5 c #000000",'#10'"a6 c #000000",'#10'"a7 c #00000'
+ +'0",'#10'"a8 c #000000",'#10'/* pixels */'#10'"`````````````````````````````'
+ +'```````````````````",'#10'"```````````````````.`.``````````````````````````'
+ +'",'#10'"`````````````````.`#`#``````````````````````````",'#10'"```````````'
+ +'````.`#`a`#``````````````````````````",'#10'"`````````````.`.`b`c`#````````'
+ +'``````````````````",'#10'"```````````d`e`f`g`h`.`.`.`.`.``````````````````"'
+ +','#10'"`````````.`i`j`h`f`b`k`l`l`m`i`.`.``````````````",'#10'"```````.`n`o'
+ +'`j`j`p`p`b`q`r`s`t`u`n`.````````````",'#10'"`````.`v`w`o`o`j`h`x`y`y`y`y`y`'
+ +'y`y`y`y``````````",'#10'"`````.`z`v`o`o`A`y`B`C`C`C`C`C`D`E`F`G`y````````",'
+ +#10'"```````d`H`v`o`o`y`I`I`I`I`I`I`I`I`J`I`y`.``````",'#10'"`````````d`e`v`'
+ +'o`y`I`I`x`y`y`y`y`y`y`y`y`y``````",'#10'"```````````.`K`v`y`I`y`B`C`C`C`C`C'
+ +'`D`E`F`G`y````",'#10'"`````````````.`K`y`I`y`I`I`I`I`I`I`I`I`J`I`y````",'#10
+ +'"`L`L`L`L`L`L`L`L`L`L`L`L`L`x`y`y`y`y`y`y`y`y`y``",'#10'"`L`I`I`I`I`I`I`I`I'
+ +'`I`I`I`L`M`C`C`C`C`C`D`E`F`G`y",'#10'"`L`I`M`M`M`N`I`N`M`M`M`I`L`M`I`I`I`I`'
+ +'I`I`I`J`I`y",'#10'"`L`I`M`I`N`M`I`M`N`I`I`I`L`M`I`I`I`I`O`P`Q`R`S`y",'#10'"'
+ +'`L`I`M`M`M`N`I`N`M`M`N`I`L`M`I`I`T`U`V`W`X`Y`Z`y",'#10'"`L`I`M`N`I`I`I`I`I`'
+ +'N`M`I`L`M`I`T`0`1`2`3`4`5`6`y",'#10'"`L`I`M`I`I`M`M`M`M`M`N`I`L`M`7`8.`...#'
+ +'.a.b.c.d`y",'#10'"`L`I`I`I`I`I`I`I`I`I`I`I`L`M.e.f.g.h.i.j.k.l.m`y",'#10'"`'
+ +'L`L`L`L`L`L`L`L`L`L`L`L`L`M.n.o`S.p.q.r.s.t.u`y",'#10'"```M`M`M`M`M`M`M`M`M'
+ +'`M`M`M`M`y`y`y`y`y`y`y`y`y`y"'#10'};'#10
+]);
+LazarusResources.Add('tpsimport_stdctrls','XPM',[
+ '/* XPM */'#10'static char *tpsimport_stdctrls[] = {'#10'/* width height num_'
+ +'colors chars_per_pixel */'#10'" 24 24 256 2",'#10'/* '
+ +'colors */'#10'"`` c None",'#10'"`. c #035501",'#10'"`# c #045702",'#10'"`a '
+ +'c #1b830f",'#10'"`b c #2daa18",'#10'"`c c #1d8b10",'#10'"`d c #014f00",'#10
+ +'"`e c #0b6a05",'#10'"`f c #27a313",'#10'"`g c #29a615",'#10'"`h c #17970c",'
+ +#10'"`i c #18780d",'#10'"`j c #139309",'#10'"`k c #35af1c",'#10'"`l c #2f9f1'
+ +'a",'#10'"`m c #289516",'#10'"`n c #218212",'#10'"`o c #0d8d05",'#10'"`p c #'
+ +'1f9f10",'#10'"`q c #3eb622",'#10'"`r c #43bb25",'#10'"`s c #4fc52c",'#10'"`'
+ +'t c #4fbf2d",'#10'"`u c #45af27",'#10'"`v c #097903",'#10'"`w c #0d9006",'
+ +#10'"`x c #3ab41f",'#10'"`y c #5ed035",'#10'"`z c #5fca35",'#10'"`A c #3ca02'
+ +'2",'#10'"`B c #2a8c17",'#10'"`C c #109007",'#10'"`D c #48bc27",'#10'"`E c #'
+ +'52c42d",'#10'"`F c #6ad83c",'#10'"`G c #46ac28",'#10'"`H c #13740a",'#10'"`'
+ +'I c #147b0a",'#10'"`J c #2c9518",'#10'"`K c #64d338",'#10'"`L c #72dc41",'
+ +#10'"`M c #379c1f",'#10'"`N c #53536b",'#10'"`O c #68d13b",'#10'"`P c #126d0'
+ +'9",'#10'"`Q c #096205",'#10'"`R c #b8abbc",'#10'"`S c #b493a1",'#10'"`T c #'
+ +'b49fad",'#10'"`U c #b598a6",'#10'"`V c #5c5b78",'#10'"`W c #edeef4",'#10'"`'
+ +'X c #e9e5ed",'#10'"`Y c #ab4c50",'#10'"`Z c #8f1112",'#10'"`0 c #c57b7d",'
+ +#10'"`1 c #d5b6c0",'#10'"`2 c #d0d3e7",'#10'"`3 c #404040",'#10'"`4 c #cfc5d'
+ +'3",'#10'"`5 c #d4c2cc",'#10'"`6 c #ebe0e5",'#10'"`7 c #e2d8de",'#10'"`8 c #'
+ +'b8c2de",'#10'".` c #9f9ece",'#10'".. c #998bcc",'#10'".# c #968cc9",'#10'".'
+ +'a c #ffffff",'#10'".b c #000000",'#10'".c c #afb0cb",'#10'".d c #cbcede",'
+ +#10'".e c #cbcce0",'#10'".f c #9f9cc7",'#10'".g c #69898c",'#10'".h c #37874'
+ +'a",'#10'".i c #568e75",'#10'".j c #c0dcc0",'#10'".k c #487dc4",'#10'".l c #'
+ +'d4d0dc",'#10'".m c #d3d3e3",'#10'".n c #9fa0c6",'#10'".o c #006500",'#10'".'
+ +'p c #908bc7",'#10'".q c #4b7dc0",'#10'".r c #9db5d9",'#10'".s c #ddd8e7",'
+ +#10'".t c #a7a3d3",'#10'".u c #7e8eac",'#10'".v c #668e91",'#10'".w c #4679c'
+ +'0",'#10'".x c #9db4d8",'#10'".y c #e0dcea",'#10'".z c #b0a5e0",'#10'".A c #'
+ +'45895f",'#10'".B c #808eb6",'#10'".C c #8390c0",'#10'".D c #8482c0",'#10'".'
+ +'E c #3d76c1",'#10'".F c #cecbd9",'#10'".G c #dad9ea",'#10'".H c #a4a6d0",'
+ +#10'".I c #678b92",'#10'".J c #9a90de",'#10'".K c #9190d5",'#10'".L c #9192d'
+ +'9",'#10'".M c #9fa6c6",'#10'".N c #cbc9d8",'#10'".O c #dcdaef",'#10'".P c #'
+ +'84a4a9",'#10'".Q c #9c91e2",'#10'".R c #9292d9",'#10'".S c #8f8fd7",'#10'".'
+ +'T c #b1b0c9",'#10'".U c #c5c5d8",'#10'".V c #dcdcee",'#10'".W c #a1a6d4",'
+ +#10'".X c #9298cf",'#10'".Y c #8c8bcf",'#10'".Z c #a3a3b8",'#10'".0 c #bfbfd'
+ +'7",'#10'".1 c #8c8cc6",'#10'".2 c #000000",'#10'".3 c #000000",'#10'".4 c #'
+ +'000000",'#10'".5 c #000000",'#10'".6 c #000000",'#10'".7 c #000000",'#10'".'
+ +'8 c #000000",'#10'"#` c #000000",'#10'"#. c #000000",'#10'"## c #000000",'
+ +#10'"#a c #000000",'#10'"#b c #000000",'#10'"#c c #000000",'#10'"#d c #00000'
+ +'0",'#10'"#e c #000000",'#10'"#f c #000000",'#10'"#g c #000000",'#10'"#h c #'
+ +'000000",'#10'"#i c #000000",'#10'"#j c #000000",'#10'"#k c #000000",'#10'"#'
+ +'l c #000000",'#10'"#m c #000000",'#10'"#n c #000000",'#10'"#o c #000000",'
+ +#10'"#p c #000000",'#10'"#q c #000000",'#10'"#r c #000000",'#10'"#s c #00000'
+ +'0",'#10'"#t c #000000",'#10'"#u c #000000",'#10'"#v c #000000",'#10'"#w c #'
+ +'000000",'#10'"#x c #000000",'#10'"#y c #000000",'#10'"#z c #000000",'#10'"#'
+ +'A c #000000",'#10'"#B c #000000",'#10'"#C c #000000",'#10'"#D c #000000",'
+ +#10'"#E c #000000",'#10'"#F c #000000",'#10'"#G c #000000",'#10'"#H c #00000'
+ +'0",'#10'"#I c #000000",'#10'"#J c #000000",'#10'"#K c #000000",'#10'"#L c #'
+ +'000000",'#10'"#M c #000000",'#10'"#N c #000000",'#10'"#O c #000000",'#10'"#'
+ +'P c #000000",'#10'"#Q c #000000",'#10'"#R c #000000",'#10'"#S c #000000",'
+ +#10'"#T c #000000",'#10'"#U c #000000",'#10'"#V c #000000",'#10'"#W c #00000'
+ +'0",'#10'"#X c #000000",'#10'"#Y c #000000",'#10'"#Z c #000000",'#10'"#0 c #'
+ +'000000",'#10'"#1 c #000000",'#10'"#2 c #000000",'#10'"#3 c #000000",'#10'"#'
+ +'4 c #000000",'#10'"#5 c #000000",'#10'"#6 c #000000",'#10'"#7 c #000000",'
+ +#10'"#8 c #000000",'#10'"a` c #000000",'#10'"a. c #000000",'#10'"a# c #00000'
+ +'0",'#10'"aa c #000000",'#10'"ab c #000000",'#10'"ac c #000000",'#10'"ad c #'
+ +'000000",'#10'"ae c #000000",'#10'"af c #000000",'#10'"ag c #000000",'#10'"a'
+ +'h c #000000",'#10'"ai c #000000",'#10'"aj c #000000",'#10'"ak c #000000",'
+ +#10'"al c #000000",'#10'"am c #000000",'#10'"an c #000000",'#10'"ao c #00000'
+ +'0",'#10'"ap c #000000",'#10'"aq c #000000",'#10'"ar c #000000",'#10'"as c #'
+ +'000000",'#10'"at c #000000",'#10'"au c #000000",'#10'"av c #000000",'#10'"a'
+ +'w c #000000",'#10'"ax c #000000",'#10'"ay c #000000",'#10'"az c #000000",'
+ +#10'"aA c #000000",'#10'"aB c #000000",'#10'"aC c #000000",'#10'"aD c #00000'
+ +'0",'#10'"aE c #000000",'#10'"aF c #000000",'#10'"aG c #000000",'#10'"aH c #'
+ +'000000",'#10'"aI c #000000",'#10'"aJ c #000000",'#10'"aK c #000000",'#10'"a'
+ ,'L c #000000",'#10'"aM c #000000",'#10'"aN c #000000",'#10'"aO c #000000",'
+ +#10'"aP c #000000",'#10'"aQ c #000000",'#10'"aR c #000000",'#10'"aS c #00000'
+ +'0",'#10'"aT c #000000",'#10'"aU c #000000",'#10'"aV c #000000",'#10'"aW c #'
+ +'000000",'#10'"aX c #000000",'#10'"aY c #000000",'#10'"aZ c #000000",'#10'"a'
+ +'0 c #000000",'#10'"a1 c #000000",'#10'"a2 c #000000",'#10'"a3 c #000000",'
+ +#10'"a4 c #000000",'#10'"a5 c #000000",'#10'"a6 c #000000",'#10'"a7 c #00000'
+ +'0",'#10'"a8 c #000000",'#10'/* pixels */'#10'"`````````````````````````````'
+ +'```````````````````",'#10'"```````````````````.`.``````````````````````````'
+ +'",'#10'"`````````````````.`#`#``````````````````````````",'#10'"```````````'
+ +'````.`#`a`#``````````````````````````",'#10'"`````````````.`.`b`c`#````````'
+ +'``````````````````",'#10'"```````````d`e`f`g`h`.`.`.`.`.``````````````````"'
+ +','#10'"`````````.`i`j`h`f`b`k`l`l`m`i`.`.``````````````",'#10'"```````.`n`o'
+ +'`j`j`p`p`b`q`r`s`t`u`n`.````````````",'#10'"`````.`v`w`o`o`j`h`f`f`k`x`r`s`'
+ +'y`z`A`.``````````",'#10'"`````.`B`v`o`o`C`h`p`f`b`k`q`D`E`y`F`G`.````````",'
+ +#10'"```````d`H`v`o`o`j`v`m`a`I`I`H`J`t`K`L`l`.``````",'#10'"`````````d`e`v`'
+ +'o`j`M`d`d`.`.`N`N`N`N`O`O`P``````",'#10'"```````````.`Q`v`C`l`d```N`N`R`S`T'
+ +'`U`N`N`V`.````",'#10'"`````````````.`Q`v`A`N`N`W`X`Y`Z`Z`0`1`2`N`.````",'#10
+ +'"`3`3`3`3`3`3`3`3`3`3`3`3`3`4`5`6`7`8.`...#`N````",'#10'"`3.a.a.a.a.a.a.a.a'
+ +'.a.a.a`3.b.c.d.e.f.g.h.i`N````",'#10'"`3.a.b.b.b.j.a.j.b.b.b.a`3.b.k.l.m.n.'
+ +'o.o.o.p`N``",'#10'"`3.a.b.a.j.b.a.b.j.a.a.a`3.b.q.r.s.t.u.o.o.v`N``",'#10'"'
+ +'`3.a.b.b.b.j.a.j.b.b.j.a`3.b.w.x.y.z.A.o.B.C.D`N",'#10'"`3.a.b.j.a.a.a.a.a.'
+ +'j.b.a`3.b.E.F.G.H.o.I.J.K.L`N",'#10'"`3.a.b.a.a.b.b.b.b.b.j.a`3.b.M.N.O.P.o'
+ +'.Q.R.S`N`N",'#10'"`3.a.a.a.a.a.a.a.a.a.a.a`3.b.T.U.V.W.X.Y`N`N````",'#10'"`'
+ +'3`3`3`3`3`3`3`3`3`3`3`3`3.b`N.Z.0.1`N`N````````",'#10'"``.b.b.b.b.b.b.b.b.b'
+ +'.b.b.b.b```V`N`N````````````"'#10'};'#10
+]);
+LazarusResources.Add('tpsscript','XPM',[
+ '/* XPM */'#10'static char *tpsscript[] = {'#10'/* width height num_colors ch'
+ +'ars_per_pixel */'#10'" 24 24 256 2",'#10'/* colors */'
+ +#10'"`` c None",'#10'"`. c #515151",'#10'"`# c #535353",'#10'"`a c #4b4b4b",'
+ +#10'"`b c #d8d8d8",'#10'"`c c #efefef",'#10'"`d c #f2f2f2",'#10'"`e c #f3f3f'
+ +'3",'#10'"`f c #f4f4f4",'#10'"`g c #f2f2f3",'#10'"`h c #f0f0f2",'#10'"`i c #'
+ +'ebebeb",'#10'"`j c #e6e6e6",'#10'"`k c #e0e0e1",'#10'"`l c #d9d9d9",'#10'"`'
+ +'m c #d3d3d3",'#10'"`n c #cfcfcf",'#10'"`o c #cacacb",'#10'"`p c #c7c7c7",'
+ +#10'"`q c #c5c5c5",'#10'"`r c #c2c2c2",'#10'"`s c #676768",'#10'"`t c #31313'
+ +'1",'#10'"`u c #e9e9e9",'#10'"`v c #eeeeee",'#10'"`w c #ededed",'#10'"`x c #'
+ +'eaeaea",'#10'"`y c #e3e3e3",'#10'"`z c #dadada",'#10'"`A c #cecece",'#10'"`'
+ +'B c #c1c1c1",'#10'"`C c #b1b1b1",'#10'"`D c #a4a4a5",'#10'"`E c #9c9c9c",'
+ +#10'"`F c #959595",'#10'"`G c #8c8c8c",'#10'"`H c #888889",'#10'"`I c #83838'
+ +'3",'#10'"`J c #efeff0",'#10'"`K c #e7e7e7",'#10'"`L c #e2e2e2",'#10'"`M c #'
+ +'d0d0d0",'#10'"`N c #c6c6c6",'#10'"`O c #b6b6b7",'#10'"`P c #aaaaaa",'#10'"`'
+ +'Q c #9d9d9d",'#10'"`R c #939395",'#10'"`S c #888888",'#10'"`T c #7f7f82",'
+ +#10'"`U c #67676b",'#10'"`V c #dadadc",'#10'"`W c #d5d5d5",'#10'"`X c #ccccc'
+ +'e",'#10'"`Y c #c6c6c7",'#10'"`Z c #bdbdbf",'#10'"`0 c #b6b6b6",'#10'"`1 c #'
+ +'ababab",'#10'"`2 c #9e9e9f",'#10'"`3 c #959596",'#10'"`4 c #8f8f8f",'#10'"`'
+ +'5 c #878787",'#10'"`6 c #828282",'#10'"`7 c #7f7f87",'#10'"`8 c #66676d",'
+ +#10'".` c #cfcfd0",'#10'".. c #cccccc",'#10'".# c #c4c4c5",'#10'".a c #bcbcb'
+ +'d",'#10'".b c #b5b5b5",'#10'".c c #acacad",'#10'".d c #a9a9aa",'#10'".e c #'
+ +'9f9f9f",'#10'".f c #979797",'#10'".g c #8e8e8e",'#10'".h c #868686",'#10'".'
+ +'i c #7f7f83",'#10'".j c #7f7f88",'#10'".k c #7e7f8e",'#10'".l c #676770",'
+ +#10'".m c #e0e0e0",'#10'".n c #bcbcbc",'#10'".o c #b2b2b4",'#10'".p c #a1a1a'
+ +'3",'#10'".q c #939393",'#10'".r c #818182",'#10'".s c #7e7e89",'#10'".t c #'
+ +'7e7f8f",'#10'".u c #7e7e92",'#10'".v c #666675",'#10'".w c #c4c4c4",'#10'".'
+ +'x c #e3e3e4",'#10'".y c #ffffff",'#10'".z c #b9b9bb",'#10'".A c #7e7f89",'
+ +#10'".B c #7f7f8f",'#10'".C c #7e7e98",'#10'".D c #656677",'#10'".E c #d3d3d'
+ +'4",'#10'".F c #e5e5e5",'#10'".G c #e4e4e4",'#10'".H c #7f7f84",'#10'".I c #'
+ +'7e7f8a",'#10'".J c #7e7e93",'#10'".K c #7d7e9e",'#10'".L c #65657a",'#10'".'
+ +'M c #f0f0f0",'#10'".N c #e1e1e1",'#10'".O c #bebebf",'#10'".P c #989899",'
+ +#10'".Q c #7b7da3",'#10'".R c #65657e",'#10'".S c #afafb0",'#10'".T c #aaaaa'
+ +'b",'#10'".U c #9e9e9e",'#10'".V c #a6a6a6",'#10'".W c #7e7f8b",'#10'".X c #'
+ +'7f7f90",'#10'".Y c #7e7e95",'#10'".Z c #7d7d99",'#10'".0 c #7d7e9f",'#10'".'
+ +'1 c #7a7ba9",'#10'".2 c #656580",'#10'".3 c #e9e9ea",'#10'".4 c #d0d0d1",'
+ +#10'".5 c #a7a7a7",'#10'".6 c #a3a3a3",'#10'".7 c #c1c1c2",'#10'".8 c #a3a3a'
+ +'6",'#10'"#` c #eeeff0",'#10'"#. c #7f7f91",'#10'"## c #7e7e97",'#10'"#a c #'
+ +'7d7d9a",'#10'"#b c #7d7ea0",'#10'"#c c #7b7da4",'#10'"#d c #7a7baa",'#10'"#'
+ +'e c #7b7baf",'#10'"#f c #646584",'#10'"#g c #999999",'#10'"#h c #909090",'
+ +#10'"#i c #d1d1d1",'#10'"#j c #a3a3a9",'#10'"#k c #efeff1",'#10'"#l c #7b7ba'
+ +'a",'#10'"#m c #7b7daf",'#10'"#n c #7a7bb4",'#10'"#o c #646587",'#10'"#p c #'
+ +'404040",'#10'"#q c #b8b8c9",'#10'"#r c #cbccda",'#10'"#s c #a0a2bf",'#10'"#'
+ +'t c #7b7bab",'#10'"#u c #7b7db0",'#10'"#v c #7a7bb5",'#10'"#w c #7a7bb8",'
+ +#10'"#x c #000000",'#10'"#y c #dddee8",'#10'"#z c #7b7bac",'#10'"#A c #7b7db'
+ +'1",'#10'"#B c #c0dcc0",'#10'"#C c #7b7da7",'#10'"#D c #7a7bb7",'#10'"#E c #'
+ +'7a7bb2",'#10'"#F c #626283",'#10'"#G c #000000",'#10'"#H c #000000",'#10'"#'
+ +'I c #000000",'#10'"#J c #000000",'#10'"#K c #000000",'#10'"#L c #000000",'
+ +#10'"#M c #000000",'#10'"#N c #000000",'#10'"#O c #000000",'#10'"#P c #00000'
+ +'0",'#10'"#Q c #000000",'#10'"#R c #000000",'#10'"#S c #000000",'#10'"#T c #'
+ +'000000",'#10'"#U c #000000",'#10'"#V c #000000",'#10'"#W c #000000",'#10'"#'
+ +'X c #000000",'#10'"#Y c #000000",'#10'"#Z c #000000",'#10'"#0 c #000000",'
+ +#10'"#1 c #000000",'#10'"#2 c #000000",'#10'"#3 c #000000",'#10'"#4 c #00000'
+ +'0",'#10'"#5 c #000000",'#10'"#6 c #000000",'#10'"#7 c #000000",'#10'"#8 c #'
+ +'000000",'#10'"a` c #000000",'#10'"a. c #000000",'#10'"a# c #000000",'#10'"a'
+ +'a c #000000",'#10'"ab c #000000",'#10'"ac c #000000",'#10'"ad c #000000",'
+ +#10'"ae c #000000",'#10'"af c #000000",'#10'"ag c #000000",'#10'"ah c #00000'
+ +'0",'#10'"ai c #000000",'#10'"aj c #000000",'#10'"ak c #000000",'#10'"al c #'
+ +'000000",'#10'"am c #000000",'#10'"an c #000000",'#10'"ao c #000000",'#10'"a'
+ +'p c #000000",'#10'"aq c #000000",'#10'"ar c #000000",'#10'"as c #000000",'
+ +#10'"at c #000000",'#10'"au c #000000",'#10'"av c #000000",'#10'"aw c #00000'
+ +'0",'#10'"ax c #000000",'#10'"ay c #000000",'#10'"az c #000000",'#10'"aA c #'
+ +'000000",'#10'"aB c #000000",'#10'"aC c #000000",'#10'"aD c #000000",'#10'"a'
+ +'E c #000000",'#10'"aF c #000000",'#10'"aG c #000000",'#10'"aH c #000000",'
+ +#10'"aI c #000000",'#10'"aJ c #000000",'#10'"aK c #000000",'#10'"aL c #00000'
+ ,'0",'#10'"aM c #000000",'#10'"aN c #000000",'#10'"aO c #000000",'#10'"aP c #'
+ +'000000",'#10'"aQ c #000000",'#10'"aR c #000000",'#10'"aS c #000000",'#10'"a'
+ +'T c #000000",'#10'"aU c #000000",'#10'"aV c #000000",'#10'"aW c #000000",'
+ +#10'"aX c #000000",'#10'"aY c #000000",'#10'"aZ c #000000",'#10'"a0 c #00000'
+ +'0",'#10'"a1 c #000000",'#10'"a2 c #000000",'#10'"a3 c #000000",'#10'"a4 c #'
+ +'000000",'#10'"a5 c #000000",'#10'"a6 c #000000",'#10'"a7 c #000000",'#10'"a'
+ +'8 c #000000",'#10'/* pixels */'#10'"```````````````````````````````````````'
+ +'`````````",'#10'"`````.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`#`.`.`.`.````",'#10'"``'
+ +'`a`b`c`d`e`f`e`g`h`c`i`j`k`l`m`n`o`p`q`r`s`t``",'#10'"```a`c`u`v`h`h`c`w`x`'
+ +'y`z`A`B`C`D`E`F`G`H`I`s`t``",'#10'"```a`d`v`g`J`v`i`K`L`z`M`N`O`P`Q`R`G`S`I'
+ +'`T`U`t``",'#10'"```a`e`J`v`V`b`W`X`Y`Z`O`0`1`2`3`4`5`6`T`7`8`t``",'#10'"```'
+ +'a`e`v`j.``m...#.a.b.c.d.e.f.g.h`6.i.j.k.l`t``",'#10'"```a`e`i.m`X`n`p.n.o`1'
+ +'.p`E.q`G.h.r.i.s.t.u.v`t``",'#10'"```a`g`u`z.w.#.x.y.y.y.y.y.y.y.y.z.A.B.u.'
+ +'C.D`t``",'#10'"```a`d`j.E`Z..`x`z.F.G.g.y.y.r.H.I.B.J.C.K.L`t``",'#10'"```a'
+ +'.M.N`X`0`p.O.P`y`L`S.y.y.H.I.B.J.C.K.Q.R`t``",'#10'"```a`v`z`N.S.T.U`C`L`M.'
+ +'V.y`J.W.X.Y.Z.0.Q.1.2`t``",'#10'"```a.3.4.a.5.6.f.7.M`A.8.y#`#.###a#b#c#d#e'
+ +'#f`t``",'#10'"```a`L`B`C.e#g#h#i.y.z#j.y#k###a#b#c#l#m#n#o`t``",'#10'"#p#p#'
+ +'p#p#p#p#p#p#p#p#p#p#p.y#q#r#s#t#u#v#w#o`t``",'#10'"#p.y.y.y.y.y.y.y.y.y.y.y'
+ +'#p#x.y#y#z#A#v#w#w#o`t``",'#10'"#p.y#x#x#x#B.y#B#x#x#x.y#p#x#C#z#A#D#w#w#w#'
+ +'o`t``",'#10'"#p.y#x.y#B#x.y#x#B.y.y.y#p#x#z#E#w#w#w#w#w#o`t``",'#10'"#p.y#x'
+ +'#x#x#B.y#B#x#x#B.y#p#x#E#w#w#w#w#w#w#o`t``",'#10'"#p.y#x#B.y.y.y.y.y#B#x.y#'
+ +'p#x#w#w#w#w#w#w#w#o`t``",'#10'"#p.y#x.y.y#x#x#x#x#x#B.y#p#x#w#w#w#w#w#w#w#o'
+ +'`t``",'#10'"#p.y.y.y.y.y.y.y.y.y.y.y#p#x#o#o#o#o#o#o#o#F`t``",'#10'"#p#p#p#'
+ +'p#p#p#p#p#p#p#p#p#p#x`t`t`t`t`t`t`t`t````",'#10'"``#x#x#x#x#x#x#x#x#x#x#x#x'
+ +'#x````````````````````"'#10'};'#10
+]);
+LazarusResources.Add('tpsscriptdebugger','XPM',[
+ '/* XPM */'#10'static char *tpsscriptdebugger[] = {'#10'/* width height num_c'
+ +'olors chars_per_pixel */'#10'" 24 24 256 2",'#10'/* c'
+ +'olors */'#10'"`` c #000000",'#10'"`. c #000055",'#10'"`# c #0000aa",'#10'"`'
+ +'a c #0000ff",'#10'"`b c #002400",'#10'"`c c #002455",'#10'"`d c #0024aa",'
+ +#10'"`e c #0024ff",'#10'"`f c #004800",'#10'"`g c #004855",'#10'"`h c #0048a'
+ +'a",'#10'"`i c #0048ff",'#10'"`j c #006d00",'#10'"`k c #006d55",'#10'"`l c #'
+ +'006daa",'#10'"`m c #006dff",'#10'"`n c #009100",'#10'"`o c #009155",'#10'"`'
+ +'p c #0091aa",'#10'"`q c #0091ff",'#10'"`r c #00b600",'#10'"`s c #00b655",'
+ +#10'"`t c #00b6aa",'#10'"`u c #00b6ff",'#10'"`v c #00da00",'#10'"`w c #00da5'
+ +'5",'#10'"`x c #00daaa",'#10'"`y c #00daff",'#10'"`z c #00ff00",'#10'"`A c #'
+ +'00ff55",'#10'"`B c #00ffaa",'#10'"`C c #00ffff",'#10'"`D c #240000",'#10'"`'
+ +'E c #240055",'#10'"`F c #2400aa",'#10'"`G c #2400ff",'#10'"`H c #242400",'
+ +#10'"`I c #242455",'#10'"`J c #2424aa",'#10'"`K c #2424ff",'#10'"`L c #24480'
+ +'0",'#10'"`M c #244855",'#10'"`N c #2448aa",'#10'"`O c #2448ff",'#10'"`P c #'
+ +'246d00",'#10'"`Q c #246d55",'#10'"`R c #246daa",'#10'"`S c #246dff",'#10'"`'
+ +'T c #249100",'#10'"`U c #249155",'#10'"`V c #2491aa",'#10'"`W c #2491ff",'
+ +#10'"`X c #24b600",'#10'"`Y c #24b655",'#10'"`Z c #24b6aa",'#10'"`0 c #24b6f'
+ +'f",'#10'"`1 c #24da00",'#10'"`2 c #24da55",'#10'"`3 c #24daaa",'#10'"`4 c #'
+ +'24daff",'#10'"`5 c #24ff00",'#10'"`6 c #24ff55",'#10'"`7 c #24ffaa",'#10'"`'
+ +'8 c #24ffff",'#10'".` c #480000",'#10'".. c #480055",'#10'".# c #4800aa",'
+ +#10'".a c #4800ff",'#10'".b c #482400",'#10'".c c #482455",'#10'".d c #4824a'
+ +'a",'#10'".e c #4824ff",'#10'".f c #484800",'#10'".g c #484855",'#10'".h c #'
+ +'4848aa",'#10'".i c #4848ff",'#10'".j c #486d00",'#10'".k c #486d55",'#10'".'
+ +'l c #486daa",'#10'".m c #486dff",'#10'".n c #489100",'#10'".o c #489155",'
+ +#10'".p c #4891aa",'#10'".q c #4891ff",'#10'".r c #48b600",'#10'".s c #48b65'
+ +'5",'#10'".t c #48b6aa",'#10'".u c #48b6ff",'#10'".v c #48da00",'#10'".w c #'
+ +'48da55",'#10'".x c #48daaa",'#10'".y c #48daff",'#10'".z c #48ff00",'#10'".'
+ +'A c #48ff55",'#10'".B c #48ffaa",'#10'".C c #48ffff",'#10'".D c #6d0000",'
+ +#10'".E c #6d0055",'#10'".F c #6d00aa",'#10'".G c #6d00ff",'#10'".H c #6d240'
+ +'0",'#10'".I c #6d2455",'#10'".J c #6d24aa",'#10'".K c #6d24ff",'#10'".L c #'
+ +'6d4800",'#10'".M c #6d4855",'#10'".N c #6d48aa",'#10'".O c #6d48ff",'#10'".'
+ +'P c #6d6d00",'#10'".Q c #6d6d55",'#10'".R c #6d6daa",'#10'".S c #6d6dff",'
+ +#10'".T c #6d9100",'#10'".U c #6d9155",'#10'".V c #6d91aa",'#10'".W c #6d91f'
+ +'f",'#10'".X c #6db600",'#10'".Y c #6db655",'#10'".Z c #6db6aa",'#10'".0 c #'
+ +'6db6ff",'#10'".1 c #6dda00",'#10'".2 c #6dda55",'#10'".3 c #6ddaaa",'#10'".'
+ +'4 c #6ddaff",'#10'".5 c #6dff00",'#10'".6 c #6dff55",'#10'".7 c #6dffaa",'
+ +#10'".8 c #6dffff",'#10'"#` c #910000",'#10'"#. c #910055",'#10'"## c #9100a'
+ +'a",'#10'"#a c #9100ff",'#10'"#b c #912400",'#10'"#c c #912455",'#10'"#d c #'
+ +'9124aa",'#10'"#e c #9124ff",'#10'"#f c #914800",'#10'"#g c #914855",'#10'"#'
+ +'h c #9148aa",'#10'"#i c #9148ff",'#10'"#j c #916d00",'#10'"#k c #916d55",'
+ +#10'"#l c #916daa",'#10'"#m c #916dff",'#10'"#n c #919100",'#10'"#o c #91915'
+ +'5",'#10'"#p c #9191aa",'#10'"#q c #9191ff",'#10'"#r c #91b600",'#10'"#s c #'
+ +'91b655",'#10'"#t c #91b6aa",'#10'"#u c #91b6ff",'#10'"#v c #91da00",'#10'"#'
+ +'w c #91da55",'#10'"#x c #91daaa",'#10'"#y c #91daff",'#10'"#z c #91ff00",'
+ +#10'"#A c #91ff55",'#10'"#B c #91ffaa",'#10'"#C c #91ffff",'#10'"#D c #b6000'
+ +'0",'#10'"#E c #b60055",'#10'"#F c #b600aa",'#10'"#G c #b600ff",'#10'"#H c #'
+ +'b62400",'#10'"#I c #b62455",'#10'"#J c #b624aa",'#10'"#K c #b624ff",'#10'"#'
+ +'L c #b64800",'#10'"#M c #b64855",'#10'"#N c #b648aa",'#10'"#O c #b648ff",'
+ +#10'"#P c #b66d00",'#10'"#Q c #b66d55",'#10'"#R c #b66daa",'#10'"#S c #b66df'
+ +'f",'#10'"#T c #b69100",'#10'"#U c #b69155",'#10'"#V c #b691aa",'#10'"#W c #'
+ +'b691ff",'#10'"#X c #b6b600",'#10'"#Y c #b6b655",'#10'"#Z c #b6b6aa",'#10'"#'
+ +'0 c #b6b6ff",'#10'"#1 c #b6da00",'#10'"#2 c #b6da55",'#10'"#3 c #b6daaa",'
+ +#10'"#4 c #b6daff",'#10'"#5 c #b6ff00",'#10'"#6 c #b6ff55",'#10'"#7 c #b6ffa'
+ +'a",'#10'"#8 c #b6ffff",'#10'"a` c #da0000",'#10'"a. c #da0055",'#10'"a# c #'
+ +'da00aa",'#10'"aa c #da00ff",'#10'"ab c #da2400",'#10'"ac c #da2455",'#10'"a'
+ +'d c #da24aa",'#10'"ae c #da24ff",'#10'"af c #da4800",'#10'"ag c #da4855",'
+ +#10'"ah c #da48aa",'#10'"ai c #da48ff",'#10'"aj c #da6d00",'#10'"ak c #da6d5'
+ +'5",'#10'"al c #da6daa",'#10'"am c #da6dff",'#10'"an c #da9100",'#10'"ao c #'
+ +'da9155",'#10'"ap c #da91aa",'#10'"aq c #da91ff",'#10'"ar c #dab600",'#10'"a'
+ +'s c #dab655",'#10'"at c #dab6aa",'#10'"au c #dab6ff",'#10'"av c #dada00",'
+ +#10'"aw c #dada55",'#10'"ax c #dadaaa",'#10'"ay c #dadaff",'#10'"az c #daff0'
+ +'0",'#10'"aA c #daff55",'#10'"aB c #daffaa",'#10'"aC c #daffff",'#10'"aD c #'
+ +'ff0000",'#10'"aE c #ff0055",'#10'"aF c #ff00aa",'#10'"aG c None",'#10'"aH c'
+ +' #ff2400",'#10'"aI c #ff2455",'#10'"aJ c #ff24aa",'#10'"aK c #ff24ff",'#10
+ ,'"aL c #ff4800",'#10'"aM c #ff4855",'#10'"aN c #ff48aa",'#10'"aO c #ff48ff",'
+ +#10'"aP c #ff6d00",'#10'"aQ c #ff6d55",'#10'"aR c #ff6daa",'#10'"aS c #ff6df'
+ +'f",'#10'"aT c #ff9100",'#10'"aU c #ff9155",'#10'"aV c #ff91aa",'#10'"aW c #'
+ +'ff91ff",'#10'"aX c #ffb600",'#10'"aY c #ffb655",'#10'"aZ c #ffb6aa",'#10'"a'
+ +'0 c #ffb6ff",'#10'"a1 c #ffda00",'#10'"a2 c #ffda55",'#10'"a3 c #ffdaaa",'
+ +#10'"a4 c #ffdaff",'#10'"a5 c #ffff00",'#10'"a6 c #ffff55",'#10'"a7 c #ffffa'
+ +'a",'#10'"a8 c #ffffff",'#10'/* pixels */'#10'"aGaGaGaGaGaGaGaGaGaGaGaGaGaGa'
+ +'GaGaGaGaGaGaGaGaGaG",'#10'"aGaG.g.g.g.g.g.g.g.Q.g.g.g.g.g.g.g.Q.g.g.g.gaGaG'
+ +'",'#10'"aG.gayaya8aya8aya8aya8aya8axayaxay#Zay#Zay.Q.gaG",'#10'"aG.ga8a8aya'
+ +'8a8a8aya8ayayax#Z#Z#Z#p#p#p#p#o.Q`IaG",'#10'"aG.ga8aya8aya8axa8ayay#Zay#Z#Z'
+ +'#p#Z#p#p.Q#p.Q.gaG",'#10'"aG.ga8a8a8ayaxayaxay#Z#Z#Z#Z#p#p#p#p.Q#p#p.R`IaG"'
+ +','#10'"aG.ga8aya8#Zay#Zay#Z#0#Z#Z#p#Z#o#p.Q#p.Q#p.Q.gaG",'#10'"aG.ga8a8ayay'
+ +'axay#Z#Z#Z#Z#p#p#p#p#o#p.R#p.R.R`IaG",'#10'"aG.ga8axay#Zayaxa8a8a8a8a8a8a8a'
+ +'8ay.Q#p.Q#p.Q.gaG",'#10'"aG.ga8ayay#Z#Za8aya8ay#pa8a8.Q#p#p#p.R#p.V.R`HaG",'
+ +#10'"aG.ga8axay#Zay#Z#Zaxa8#oa8atao#Laj#Laj#P#p.Q.gaG",'#10'"aG.ga8ay#Z#Z#Z#'
+ +'Z#Zayax#ZaoafaYaZaZaYaUaUaf#k`IaG",'#10'"aG.ga8#Zay#p#Z#oayayayakajaZa3aUaU'
+ +'aPaUaPaQ#L.gaG",'#10'"aG.gay#Z#Z#Z#p#paya8atafaZaZaPaPaPaPaPaPaPaP#LaG",'#10
+ +'".g.g.g.g.g.g.g.g.g.g.g.g.gaPaPa8aYaUa8afaPafaj.H",'#10'".ga8a8a8a8a8a8a8a8'
+ +'a8a8a8.g``aPa8aUaUa8aPafafaf#f",'#10'".ga8``````#3a8#3``````a8.g``aPa8aYaUa'
+ +'8afajafaj#b",'#10'".ga8``a8#3``a8``#3a8a8a8.g``aPa8aUaUa8afafaf#L#f",'#10'"'
+ +'.ga8``````#3a8#3````aya8.g``aPa8aUaoa8afaj#Laf.H",'#10'".ga8``aya8a8a8a8a8#'
+ +'3``a8.g``aja8aoaoa8afafaf.baG",'#10'".ga8``a8a8``````````aya8.g``ajafajafaj'
+ +'#Laj#f.HaG",'#10'".ga8a8a8a8a8a8a8a8a8a8a8.g``afaf#Laf#L#L#f.baGaG",'#10'".'
+ +'g.g.g.g.g.g.g.g.g.g.g.g.g``.L#L#L#f#L.b.HaGaGaG",'#10'"aG``````````````````'
+ +'````````aG.H.H.H.HaGaGaGaGaG"'#10'};'#10
+]);
+LazarusResources.Add('tpsscriptextension','XPM',[
+ '/* XPM */'#10'static char *tpsscriptdebugger[] = {'#10'/* width height num_c'
+ +'olors chars_per_pixel */'#10'" 24 24 256 2",'#10'/* c'
+ +'olors */'#10'"`` c #000000",'#10'"`. c #000055",'#10'"`# c #0000aa",'#10'"`'
+ +'a c #0000ff",'#10'"`b c #002400",'#10'"`c c #002455",'#10'"`d c #0024aa",'
+ +#10'"`e c #0024ff",'#10'"`f c #004800",'#10'"`g c #004855",'#10'"`h c #0048a'
+ +'a",'#10'"`i c #0048ff",'#10'"`j c #006d00",'#10'"`k c #006d55",'#10'"`l c #'
+ +'006daa",'#10'"`m c #006dff",'#10'"`n c #009100",'#10'"`o c #009155",'#10'"`'
+ +'p c #0091aa",'#10'"`q c #0091ff",'#10'"`r c #00b600",'#10'"`s c #00b655",'
+ +#10'"`t c #00b6aa",'#10'"`u c #00b6ff",'#10'"`v c #00da00",'#10'"`w c #00da5'
+ +'5",'#10'"`x c #00daaa",'#10'"`y c #00daff",'#10'"`z c #00ff00",'#10'"`A c #'
+ +'00ff55",'#10'"`B c #00ffaa",'#10'"`C c #00ffff",'#10'"`D c #240000",'#10'"`'
+ +'E c #240055",'#10'"`F c #2400aa",'#10'"`G c #2400ff",'#10'"`H c #242400",'
+ +#10'"`I c #242455",'#10'"`J c #2424aa",'#10'"`K c #2424ff",'#10'"`L c #24480'
+ +'0",'#10'"`M c #244855",'#10'"`N c #2448aa",'#10'"`O c #2448ff",'#10'"`P c #'
+ +'246d00",'#10'"`Q c #246d55",'#10'"`R c #246daa",'#10'"`S c #246dff",'#10'"`'
+ +'T c #249100",'#10'"`U c #249155",'#10'"`V c #2491aa",'#10'"`W c #2491ff",'
+ +#10'"`X c #24b600",'#10'"`Y c #24b655",'#10'"`Z c #24b6aa",'#10'"`0 c #24b6f'
+ +'f",'#10'"`1 c #24da00",'#10'"`2 c #24da55",'#10'"`3 c #24daaa",'#10'"`4 c #'
+ +'24daff",'#10'"`5 c #24ff00",'#10'"`6 c #24ff55",'#10'"`7 c #24ffaa",'#10'"`'
+ +'8 c #24ffff",'#10'".` c #480000",'#10'".. c #480055",'#10'".# c #4800aa",'
+ +#10'".a c #4800ff",'#10'".b c #482400",'#10'".c c #482455",'#10'".d c #4824a'
+ +'a",'#10'".e c #4824ff",'#10'".f c #484800",'#10'".g c #484855",'#10'".h c #'
+ +'4848aa",'#10'".i c #4848ff",'#10'".j c #486d00",'#10'".k c #486d55",'#10'".'
+ +'l c #486daa",'#10'".m c #486dff",'#10'".n c #489100",'#10'".o c #489155",'
+ +#10'".p c #4891aa",'#10'".q c #4891ff",'#10'".r c #48b600",'#10'".s c #48b65'
+ +'5",'#10'".t c #48b6aa",'#10'".u c #48b6ff",'#10'".v c #48da00",'#10'".w c #'
+ +'48da55",'#10'".x c #48daaa",'#10'".y c #48daff",'#10'".z c #48ff00",'#10'".'
+ +'A c #48ff55",'#10'".B c #48ffaa",'#10'".C c #48ffff",'#10'".D c #6d0000",'
+ +#10'".E c #6d0055",'#10'".F c #6d00aa",'#10'".G c #6d00ff",'#10'".H c #6d240'
+ +'0",'#10'".I c #6d2455",'#10'".J c #6d24aa",'#10'".K c #6d24ff",'#10'".L c #'
+ +'6d4800",'#10'".M c #6d4855",'#10'".N c #6d48aa",'#10'".O c #6d48ff",'#10'".'
+ +'P c #6d6d00",'#10'".Q c #6d6d55",'#10'".R c #6d6daa",'#10'".S c #6d6dff",'
+ +#10'".T c #6d9100",'#10'".U c #6d9155",'#10'".V c #6d91aa",'#10'".W c #6d91f'
+ +'f",'#10'".X c #6db600",'#10'".Y c #6db655",'#10'".Z c #6db6aa",'#10'".0 c #'
+ +'6db6ff",'#10'".1 c #6dda00",'#10'".2 c #6dda55",'#10'".3 c #6ddaaa",'#10'".'
+ +'4 c #6ddaff",'#10'".5 c #6dff00",'#10'".6 c #6dff55",'#10'".7 c #6dffaa",'
+ +#10'".8 c #6dffff",'#10'"#` c #910000",'#10'"#. c #910055",'#10'"## c #9100a'
+ +'a",'#10'"#a c #9100ff",'#10'"#b c #912400",'#10'"#c c #912455",'#10'"#d c #'
+ +'9124aa",'#10'"#e c #9124ff",'#10'"#f c #914800",'#10'"#g c #914855",'#10'"#'
+ +'h c #9148aa",'#10'"#i c #9148ff",'#10'"#j c #916d00",'#10'"#k c #916d55",'
+ +#10'"#l c #916daa",'#10'"#m c #916dff",'#10'"#n c #919100",'#10'"#o c #91915'
+ +'5",'#10'"#p c #9191aa",'#10'"#q c #9191ff",'#10'"#r c #91b600",'#10'"#s c #'
+ +'91b655",'#10'"#t c #91b6aa",'#10'"#u c #91b6ff",'#10'"#v c #91da00",'#10'"#'
+ +'w c #91da55",'#10'"#x c #91daaa",'#10'"#y c #91daff",'#10'"#z c #91ff00",'
+ +#10'"#A c #91ff55",'#10'"#B c #91ffaa",'#10'"#C c #91ffff",'#10'"#D c #b6000'
+ +'0",'#10'"#E c #b60055",'#10'"#F c #b600aa",'#10'"#G c #b600ff",'#10'"#H c #'
+ +'b62400",'#10'"#I c #b62455",'#10'"#J c #b624aa",'#10'"#K c #b624ff",'#10'"#'
+ +'L c #b64800",'#10'"#M c #b64855",'#10'"#N c #b648aa",'#10'"#O c #b648ff",'
+ +#10'"#P c #b66d00",'#10'"#Q c #b66d55",'#10'"#R c #b66daa",'#10'"#S c #b66df'
+ +'f",'#10'"#T c #b69100",'#10'"#U c #b69155",'#10'"#V c #b691aa",'#10'"#W c #'
+ +'b691ff",'#10'"#X c #b6b600",'#10'"#Y c #b6b655",'#10'"#Z c #b6b6aa",'#10'"#'
+ +'0 c #b6b6ff",'#10'"#1 c #b6da00",'#10'"#2 c #b6da55",'#10'"#3 c #b6daaa",'
+ +#10'"#4 c #b6daff",'#10'"#5 c #b6ff00",'#10'"#6 c #b6ff55",'#10'"#7 c #b6ffa'
+ +'a",'#10'"#8 c #b6ffff",'#10'"a` c #da0000",'#10'"a. c #da0055",'#10'"a# c #'
+ +'da00aa",'#10'"aa c #da00ff",'#10'"ab c #da2400",'#10'"ac c #da2455",'#10'"a'
+ +'d c #da24aa",'#10'"ae c #da24ff",'#10'"af c #da4800",'#10'"ag c #da4855",'
+ +#10'"ah c #da48aa",'#10'"ai c #da48ff",'#10'"aj c #da6d00",'#10'"ak c #da6d5'
+ +'5",'#10'"al c #da6daa",'#10'"am c #da6dff",'#10'"an c #da9100",'#10'"ao c #'
+ +'da9155",'#10'"ap c #da91aa",'#10'"aq c #da91ff",'#10'"ar c #dab600",'#10'"a'
+ +'s c #dab655",'#10'"at c #dab6aa",'#10'"au c #dab6ff",'#10'"av c #dada00",'
+ +#10'"aw c #dada55",'#10'"ax c #dadaaa",'#10'"ay c #dadaff",'#10'"az c #daff0'
+ +'0",'#10'"aA c #daff55",'#10'"aB c #daffaa",'#10'"aC c #daffff",'#10'"aD c #'
+ +'ff0000",'#10'"aE c #ff0055",'#10'"aF c #ff00aa",'#10'"aG c None",'#10'"aH c'
+ +' #ff2400",'#10'"aI c #ff2455",'#10'"aJ c #ff24aa",'#10'"aK c #ff24ff",'#10
+ ,'"aL c #ff4800",'#10'"aM c #ff4855",'#10'"aN c #ff48aa",'#10'"aO c #ff48ff",'
+ +#10'"aP c #ff6d00",'#10'"aQ c #ff6d55",'#10'"aR c #ff6daa",'#10'"aS c #ff6df'
+ +'f",'#10'"aT c #ff9100",'#10'"aU c #ff9155",'#10'"aV c #ff91aa",'#10'"aW c #'
+ +'ff91ff",'#10'"aX c #ffb600",'#10'"aY c #ffb655",'#10'"aZ c #ffb6aa",'#10'"a'
+ +'0 c #ffb6ff",'#10'"a1 c #ffda00",'#10'"a2 c #ffda55",'#10'"a3 c #ffdaaa",'
+ +#10'"a4 c #ffdaff",'#10'"a5 c #ffff00",'#10'"a6 c #ffff55",'#10'"a7 c #ffffa'
+ +'a",'#10'"a8 c #ffffff",'#10'/* pixels */'#10'"aGaGaGaGaGaGaGaGaGaGaGaGaGaGa'
+ +'GaGaGaGaGaGaGaGaGaG",'#10'"aGaG.g.g.g.g.g.g.g.Q.g.g.g.g.g.g.g.Q.g.g.g.gaGaG'
+ +'",'#10'"aG.gayaya8aya8aya8aya8aya8axayaxay#Zay#Zay.Q.gaG",'#10'"aG.ga8a8aya'
+ +'8a8a8aya8ayayax#Z#Z#Z#p#p#p#p#o.Q`IaG",'#10'"aG.ga8aya8aya8axa8ayay#Zay#Z#Z'
+ +'#p#Z#p#p.Q#p.Q.gaG",'#10'"aG.ga8a8a8ayaxayaxay#Z#Z#Z#Z#p#p#p#p.Q#p#p.R`IaG"'
+ +','#10'"aG.ga8aya8#Zay#Zay#Z#0#Z#Z#p#Z#o#p.Q#p.Q#p.Q.gaG",'#10'"aG.ga8a8ayay'
+ +'axay#Z#Z#Z#Z#p#p#p#p#o#p.R#p.R.R`IaG",'#10'"aG.ga8axay#Zayaxa8a8a8a8a8a8a8a'
+ +'8ay.Q#p.Q#p.Q.gaG",'#10'"aG.ga8ayay#Z#Za8aya8ay#pa8a8.Q#p#p#p.R#p.V.R`HaG",'
+ +#10'"aG.ga8axay#Zay#Z#Zaxa8#oa8atao#Laj#Laj#P#p.Q.gaG",'#10'"aG.ga8ay#Z#Z#Z#'
+ +'Z#Zayax#ZaoafaYaZaZaYaUaUaf#k`IaG",'#10'"aG.ga8#Zay#p#Z#oayayayakajaZa3aUaU'
+ +'aPaUaPaQ#L.gaG",'#10'"aG.gay#Z#Z#Z#p#paya8atafaZaZaPaPaPaPaPaPaPaP#LaG",'#10
+ +'".g.g.g.g.g.g.g.g.g.g.g.g.gaPaPa8aYaUa8afaPafaj.H",'#10'".ga8a8a8a8a8a8a8a8'
+ +'a8a8a8.g``aPa8aUaUa8aPafafaf#f",'#10'".ga8``````#3a8#3``````a8.g``aPa8aYaUa'
+ +'8afajafaj#b",'#10'".ga8``a8#3``a8``#3a8a8a8.g``aPa8aUaUa8afafaf#L#f",'#10'"'
+ +'.ga8``````#3a8#3````aya8.g``aPa8aUaoa8afaj#Laf.H",'#10'".ga8``aya8a8a8a8a8#'
+ +'3``a8.g``aja8aoaoa8afafaf.baG",'#10'".ga8``a8a8``````````aya8.g``ajafajafaj'
+ +'#Laj#f.HaG",'#10'".ga8a8a8a8a8a8a8a8a8a8a8.g``afaf#Laf#L#L#f.baGaG",'#10'".'
+ +'g.g.g.g.g.g.g.g.g.g.g.g.g``.L#L#L#f#L.b.HaGaGaG",'#10'"aG``````````````````'
+ +'````````aG.H.H.H.HaGaGaGaGaG"'#10'};'#10
+]);
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/pascalscript.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/pascalscript.pas
new file mode 100644
index 0000000..d5bf447
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/pascalscript.pas
@@ -0,0 +1,29 @@
+{ This file was automatically created by Lazarus. Do not edit!
+This source is only used to compile and install the package.
+ }
+
+unit PascalScript;
+
+interface
+
+uses
+ uPSRuntime, PascalScript_Core_Reg, uPSC_buttons, uPSC_classes, uPSC_controls,
+ uPSC_dateutils, uPSC_DB, uPSC_dll, uPSC_extctrls, uPSC_forms,
+ uPSC_graphics, uPSC_menus, uPSC_std, uPSC_stdctrls, uPSCompiler,
+ uPSComponent, uPSComponent_Controls, uPSComponent_DB, uPSComponent_Default,
+ uPSComponent_Forms, uPSComponent_StdCtrls, uPSComponentExt, uPSDebugger,
+ uPSDisassembly, uPSPreProcessor, uPSR_buttons, uPSR_classes, uPSR_controls,
+ uPSR_dateutils, uPSR_DB, uPSR_dll, uPSR_extctrls, uPSR_forms,
+ uPSR_graphics, uPSR_menus, uPSR_std, uPSR_stdctrls, uPSUtils,
+ LazarusPackageIntf;
+
+implementation
+
+procedure Register;
+begin
+ RegisterUnit('PascalScript_Core_Reg', @PascalScript_Core_Reg.Register);
+end;
+
+initialization
+ RegisterPackage('PascalScript', @Register);
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/powerpc.inc b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/powerpc.inc
new file mode 100644
index 0000000..ec0c779
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/powerpc.inc
@@ -0,0 +1,343 @@
+{ implementation of the powerpc osx abi for function calls in pascal script
+ Copyright (c) 2007 by Henry Vermaak (henry.vermaak@gmail.com) }
+
+{$ifndef darwin}
+ {$fatal This code is Darwin specific at the moment!}
+{$endif}
+
+{$ifndef cpu32}
+ {$fatal This code is 32bit specific at the moment!}
+{$endif}
+
+const
+ rtINT = 0;
+ rtINT64 = 1;
+ rtFLOAT = 2;
+
+type
+ Trint = array[1..8] of dword;
+ Trfloat = array[1..13] of double;
+
+{$goto on}
+{ define labels }
+label
+ rfloat_loop,
+ stack_loop,
+ load_regs,
+ int_result,
+ int64_result,
+ float_result,
+ asmcall_end;
+
+{ call a function from a pointer }
+{ resulttype: 0 = int, 1 = int64, 2 = float }
+function ppcasmcall(rint: Trint; rfloat: Trfloat; proc, stack: pointer; stacksize, resulttype: integer): pointer; assembler; nostackframe;
+asm
+ mflr r0
+ stw r0, 8(r1)
+
+ { save non-volatile register/s - make sure the stack size is sufficient! }
+ stw r31, -4(r1) { stacksize }
+
+ stwu r1, -240(r1) { create stack }
+
+ { get all the params into the stack }
+ stw r3, 48(r1) { rint }
+ stw r4, 52(r1) { rfloat }
+ stw r5, 56(r1) { proc }
+ stw r6, 60(r1) { stack }
+ stw r7, 64(r1) { stacksize }
+ stw r8, 68(r1) { resulttype }
+ { result is stored in 72(r1) and 76(r1) (if returning int64) }
+
+ { write rint array into stack }
+ lwz r2, 48(r1) { rint }
+ lfd f0, 0(r2)
+ stfd f0, 80(r1) { rint[1], rint[2] }
+ lfd f0, 8(r2)
+ stfd f0, 88(r1) { rint[3], rint[4] }
+ lfd f0, 16(r2)
+ stfd f0, 96(r1) { rint[5], rint[6] }
+ lfd f0, 24(r2)
+ stfd f0, 104(r1) { rint[7], rint[8] }
+
+ { write rfloat array into stack }
+ lwz r2, 52(r1) { rfloat }
+ addi r4, r1, 112 { rfloat[1] from here upwards (8 bytes apart) }
+ subi r2, r2, 8 { src }
+ subi r4, r4, 8 { dest }
+ li r3, 13 { counter }
+
+rfloat_loop:
+ subic. r3, r3, 1 { dec counter }
+ lfdu f0, 8(r2) { load rfloat[x] + update }
+ stfdu f0, 8(r4) { store rfloat[x] + update }
+ bne cr0, rfloat_loop
+
+ { create new stack }
+ mflr r0
+ stw r0, 8(r1)
+ mr r12, r1 { remember previous stack to fill in regs later }
+
+ lwz r31, 64(r12) { load stacksize into r31 }
+ neg r3, r31 { negate }
+ stwux r1, r1, r3 { create new stack }
+
+ { build up the stack here }
+ mr r3, r31 { counter }
+ subic. r3, r3, 24 { don't write first 24 }
+ blt cr0, load_regs { don't fill in stack if there is none }
+
+ lwz r2, 60(r12) { pointer to stack }
+ addi r2, r2, 24 { start of params }
+ subi r2, r2, 1 { src }
+
+ addi r4, r1, 24 { start of params }
+ subi r4, r4, 1 { dest }
+
+stack_loop:
+ subic. r3, r3, 1 { dec counter }
+ lbzu r5, 1(r2) { load stack + update }
+ stbu r5, 1(r4) { store stack + update }
+ bne cr0, stack_loop
+
+load_regs: { now load the registers from the previous stack in r12 }
+ lwz r3, 80(r12)
+ lwz r4, 84(r12)
+ lwz r5, 88(r12)
+ lwz r6, 92(r12)
+ lwz r7, 96(r12)
+ lwz r8, 100(r12)
+ lwz r9, 104(r12)
+ lwz r10, 108(r12)
+
+ lfd f1, 112(r12)
+ lfd f2, 120(r12)
+ lfd f3, 128(r12)
+ lfd f4, 136(r12)
+ lfd f5, 144(r12)
+ lfd f6, 152(r12)
+ lfd f7, 160(r12)
+ lfd f8, 168(r12)
+ lfd f9, 176(r12)
+ lfd f10, 184(r12)
+ lfd f11, 192(r12)
+ lfd f12, 200(r12)
+ lfd f13, 208(r12)
+
+ { now call this function }
+ lwz r2, 56(r12) { proc }
+ mtctr r2 { move to ctr }
+ bctrl { branch and link to ctr }
+
+ { restore stack - use stacksize in r31 }
+ add r1, r1, r31
+ lwz r0, 8(r1)
+ mtlr r0
+
+ { check resulttype and put appropriate pointer into r3 }
+ lwz r2, 68(r1) { resulttype }
+ cmpwi cr0, r2, 0 { int result? }
+ beq cr0, int_result { branch if equal }
+
+ cmpwi cr0, r2, 1 { single result? }
+ beq cr0, int64_result { branch if equal }
+
+
+float_result: { the result is a double}
+ stfd f1, 72(r1) { write f1 to result on stack }
+ b asmcall_end
+
+
+int64_result: { the result is a single }
+ stw r3, 72(r1) { write high dword to result on stack }
+ stw r4, 76(r1) { write low dword to result on stack }
+ b asmcall_end
+
+
+int_result: { the result is dword }
+ stw r3, 72(r1) { write r3 to result on stack }
+
+
+asmcall_end: { epilogue }
+ addi r3, r1, 72 { pointer to result on the stack }
+ addi r1, r1, 240 { restore stack }
+
+ { restore non-volatile register/s }
+ lwz r31, -4(r1)
+
+ lwz r0, 8(r1)
+ mtlr r0
+ blr
+end;
+
+function TPSExec.InnerfuseCall(_Self, Address: Pointer; CallingConv: TPSCallingConvention; Params: TPSList; res: PPSVariantIFC): Boolean;
+var
+ rint: Trint; { registers r3 to r10 }
+ rfloat: Trfloat; { registers f1 to f13 }
+ st: packed array of byte; { stack }
+ i, j, rindex, findex, stindex: integer;
+ fvar: PPSVariantIFC;
+ IsConstructor: Boolean;
+ { add a dword to stack }
+ procedure addstackdword(value: dword);
+ begin
+ setlength(st, stindex+4);
+ pdword(@st[stindex])^ := value;
+ inc(stindex, 4);
+ end;
+
+ { add a float to stack }
+ procedure addstackfloat(value: pointer; size: integer);
+ begin
+ setlength(st, stindex + (size * 4));
+ if size = 1
+ then psingle(@st[stindex])^ := single(value^)
+ else pdouble(@st[stindex])^ := double(value^);
+ inc(stindex, size*4);
+ end;
+
+ { add to the general registers or overflow to stack }
+ procedure addgen(value: dword);
+ begin
+ if rindex <= 8
+ then begin
+ rint[rindex] := value;
+ inc(rindex);
+ addstackdword(value);
+ end
+ else begin
+ addstackdword(value);
+ end;
+ end;
+ { add to the float registers or overflow to stack }
+ { size = 1 for single, 2 for double }
+ procedure addfloat(value: pointer; size: integer);
+ begin
+ if findex <= 13
+ then begin
+ if size = 1
+ then rfloat[findex] := single(value^)
+ else rfloat[findex] := double(value^);
+ inc(findex);
+ inc(rindex, size);
+ addstackfloat(value, size);
+ end
+ else begin
+ addstackfloat(value, size);
+ end;
+ end;
+
+begin
+ if (Integer(CallingConv) and 64) <> 0 then begin
+ IsConstructor := true;
+ CAllingConv := TPSCallingConvention(Integer(CallingConv) and not 64);
+ end else IsConstructor := false;
+
+ rindex := 1;
+ findex := 1;
+ stindex := 24;
+ setlength(st, stindex);
+ Result := False;
+
+ { the pointer of the result needs to be passed first in the case of some result types }
+ if assigned(res)
+ then begin
+ case res.atype.basetype of
+ btStaticArray, btRecord: addgen(dword(res.dta));
+ end;
+ end;
+
+ { process all parameters }
+ for i := 0 to Params.Count-1 do begin
+ if Params[i] = nil
+ then Exit;
+ fvar := Params[i];
+
+ { cook dynamic arrays - fpc stores size-1 at @array-4 }
+ if (fvar.aType.BaseType = btArray)
+ then dec(pdword(pointer(fvar.dta^)-4)^);
+
+ if fvar.varparam
+ then begin { var param }
+ case fvar.aType.BaseType of
+ { add var params here }
+ btArray, btVariant, btSet, btStaticArray, btRecord, btInterface, btClass, {$IFNDEF PS_NOWIDESTRING} btWideString, btWideChar, {$ENDIF}
+ btU8, btS8, btU16, btS16, btU32, btS32, btSingle, btDouble, btExtended, btString, btPChar, btChar, btCurrency
+ {$IFNDEF PS_NOINT64}, bts64{$ENDIF}: addgen(dword(fvar.dta)); { TODO: test all }
+ else begin
+ writeln(stderr, 'Parameter type not recognised!');
+ Exit;
+ end;
+ end; { case }
+ end else begin { not a var param }
+ case fvar.aType.BaseType of
+// btArray, btVariant, btSet, btStaticArray, btRecord, btInterface, btClass, {$IFNDEF PS_NOWIDESTRING} btWideString, btWideChar, {$ENDIF}
+// btU8, btS8, btU16, btS16, btU32, btS32, btSingle, btDouble, btExtended, btString, btPChar, btChar, btCurrency
+// {$IFNDEF PS_NOINT64}, bts64{$ENDIF}: writeln('normal param');
+
+ { add normal params here }
+ btString: addgen(dword(pstring(fvar.dta)^));
+ btU8, btS8: addgen(dword(pbyte(fvar.dta)^));
+ btU16, BtS16: addgen(dword(pword(fvar.dta)^));
+ btU32, btS32: addgen(dword(pdword(fvar.dta)^));
+ btSingle: addfloat(fvar.dta, 1);
+ btDouble, btExtended: addfloat(fvar.dta, 2);
+ btPChar: addgen(dword(ppchar(fvar.dta)^));
+ btChar: addgen(dword(pchar(fvar.dta)^));
+ {$IFNDEF PS_NOINT64}bts64:{$ENDIF} begin
+ addgen(dword(pint64(fvar.dta)^ shr 32));
+ addgen(dword(pint64(fvar.dta)^ and $ffffffff));
+ end;
+ btStaticArray: addgen(dword(fvar.dta));
+ btRecord: for j := 0 to (fvar.atype.realsize div 4)-1 do
+ addgen(pdword(fvar.dta + j*4)^);
+ btArray: addgen(dword(fvar.dta^));
+
+ { TODO add and test }
+{ btVariant, btSet, btInterface, btClass }
+
+ else begin
+ writeln(stderr, 'Parameter type not implemented!');
+ Exit;
+ end;
+ end; { case }
+ end; { else }
+ end; { for }
+
+ if not assigned(res)
+ then begin
+ ppcasmcall(rint, rfloat, address, st, stindex, rtINT); { ignore return }
+ end
+ else begin
+ case res.atype.basetype of
+ { add result types here }
+ btString: pstring(res.dta)^ := pstring(ppcasmcall(rint, rfloat, address, st, stindex, rtINT))^;
+ btU8, btS8: pbyte(res.dta)^ := byte(pdword(ppcasmcall(rint, rfloat, address, st, stindex, rtINT))^);
+ btU16, btS16: pword(res.dta)^ := word(pdword(ppcasmcall(rint, rfloat, address, st, stindex, rtINT))^);
+ btU32, btS32: pdword(res.dta)^ := pdword(ppcasmcall(rint, rfloat, address, st, stindex, rtINT))^;
+ btSingle: psingle(res.dta)^ := pdouble(ppcasmcall(rint, rfloat, address, st, stindex, rtFLOAT))^;
+ btDouble, btExtended: pdouble(res.dta)^ := pdouble(ppcasmcall(rint, rfloat, address, st, stindex, rtFLOAT))^;
+ btPChar: ppchar(res.dta)^ := pchar(pdword(ppcasmcall(rint, rfloat, address, st, stindex, rtINT))^);
+ btChar: pchar(res.dta)^ := char(pdword(ppcasmcall(rint, rfloat, address, st, stindex, rtINT))^);
+ btStaticArray, btRecord: ppcasmcall(rint, rfloat, address, st, stindex, rtINT);
+ btArray: res.dta := ppcasmcall(rint, rfloat, address, st, stindex, rtINT);
+
+ { TODO add and test }
+
+ else begin
+ writeln(stderr, 'Result type not implemented!');
+ exit;
+ end; { else }
+ end; { case }
+ end;
+
+ { cook dynamic arrays - fpc stores size-1 at @array-4 }
+ for i := 0 to Params.Count-1 do begin
+ fvar := Params[i];
+ if (fvar.aType.BaseType = btArray)
+ then inc(pdword(pointer(fvar.dta^)-4)^);
+ end;
+
+ Result := True;
+end;
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_DB.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_DB.pas
new file mode 100644
index 0000000..c79e415
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_DB.pas
@@ -0,0 +1,897 @@
+{ Compiletime DB support }
+Unit uPSC_DB;
+{
+This file has been generated by UnitParser v0.4, written by M. Knight.
+Source Code from Carlo Kok has been used to implement various sections of
+UnitParser. Components of ifps3 are used in the construction of UnitParser,
+code implementing the class wrapper is taken from Carlo Kok''s conv unility
+
+Licence :
+This software is provided 'as-is', without any expressed or implied
+warranty. In no event will the author be held liable for any damages
+arising from the use of this software.
+Permission is granted to anyone to use this software for any kind of
+application, and to alter it and redistribute it freely, subject to
+the following restrictions:
+1. The origin of this software must not be misrepresented, you must
+ not claim that you wrote the original software.
+2. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+3. You may not create a library that uses this library as a main part
+ of the program and sell that library.
+4. You must have a visible line in your programs aboutbox or
+ documentation that it is made using Innerfuse Script and where
+ Innerfuse Pascal Script can be found.
+5. This notice may not be removed or altered from any source
+ distribution.
+
+If you have any questions concerning this license write to Carlo Kok:
+ ck@carlo-kok.com or try the newsserver:
+ news://news.carlo-kok.com/
+}
+{$I PascalScript.inc}
+Interface
+uses
+ uPSCompiler;
+
+procedure SIRegisterTDATASET(CL: TPSPascalCompiler);
+procedure SIRegisterTPARAMS(CL: TPSPascalCompiler);
+procedure SIRegisterTPARAM(CL: TPSPascalCompiler);
+procedure SIRegisterTGUIDFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTVARIANTFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTREFERENCEFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTDATASETFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTARRAYFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTADTFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTOBJECTFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTGRAPHICFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTMEMOFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTBLOBFIELD(CL: TPSPascalCompiler);
+{$IFDEF DELPHI6UP}
+procedure SIRegisterTFMTBCDFIELD(CL: TPSPascalCompiler);
+{$ENDIF}
+procedure SIRegisterTBCDFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTVARBYTESFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTBYTESFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTBINARYFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTTIMEFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTDATEFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTDATETIMEFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTBOOLEANFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTCURRENCYFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTFLOATFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTAUTOINCFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTWORDFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTLARGEINTFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTSMALLINTFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTINTEGERFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTNUMERICFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTWIDESTRINGFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTSTRINGFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTFIELD(CL: TPSPascalCompiler);
+procedure SIRegisterTLOOKUPLIST(CL: TPSPascalCompiler);
+procedure SIRegisterTFIELDS(CL: TPSPascalCompiler);
+procedure SIRegisterTFIELDLIST(CL: TPSPascalCompiler);
+procedure SIRegisterTFIELDDEFLIST(CL: TPSPascalCompiler);
+procedure SIRegisterTFLATLIST(CL: TPSPascalCompiler);
+procedure SIRegisterTINDEXDEFS(CL: TPSPascalCompiler);
+procedure SIRegisterTINDEXDEF(CL: TPSPascalCompiler);
+procedure SIRegisterTFIELDDEFS(CL: TPSPascalCompiler);
+procedure SIRegisterTFIELDDEF(CL: TPSPascalCompiler);
+procedure SIRegisterTDEFCOLLECTION(CL: TPSPascalCompiler);
+procedure SIRegisterTNAMEDITEM(CL: TPSPascalCompiler);
+procedure SIRegister_DB(Cl: TPSPascalCompiler);
+
+implementation
+Uses Sysutils;
+
+Function RegClassS(cl : TPSPascalCompiler;Const InheritsFrom,Classname : String) : TPSCompileTimeClass;
+begin
+Result := cl.FindClass(Classname);
+if Result = nil then
+ Result := cl.AddClassN(cl.FindClass(InheritsFrom),Classname)
+else
+ Result.ClassInheritsFrom := cl.FindClass(InheritsFrom);
+end;
+
+procedure SIRegisterTDATASET(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TCOMPONENT','TDATASET') do
+ begin
+ RegisterMethod('Function ACTIVEBUFFER : PCHAR');
+ RegisterMethod('Procedure APPEND');
+ RegisterMethod('Procedure APPENDRECORD( const VALUES : array of const)');
+// RegisterMethod('Function BOOKMARKVALID( BOOKMARK : TBOOKMARK) : BOOLEAN');
+ RegisterMethod('Procedure CANCEL');
+ RegisterMethod('Procedure CHECKBROWSEMODE');
+ RegisterMethod('Procedure CLEARFIELDS');
+ RegisterMethod('Procedure CLOSE');
+ RegisterMethod('Function CONTROLSDISABLED : BOOLEAN');
+// RegisterMethod('Function COMPAREBOOKMARKS( BOOKMARK1, BOOKMARK2 : TBOOKMARK) : INTEGER');
+ RegisterMethod('Function CREATEBLOBSTREAM( FIELD : TFIELD; MODE : TBLOBSTREAMMODE) : TSTREAM');
+ RegisterMethod('Procedure CURSORPOSCHANGED');
+ RegisterMethod('Procedure DELETE');
+ RegisterMethod('Procedure DISABLECONTROLS');
+ RegisterMethod('Procedure EDIT');
+ RegisterMethod('Procedure ENABLECONTROLS');
+{$IFDEF DELPHI2006UP}
+{$IFDEF DELPHI2009UP}
+ RegisterMethod('Function FIELDBYNAME( const FIELDNAME : String): TFIELD');
+ RegisterMethod('Function FINDFIELD( const FIELDNAME : String) : TFIELD');
+{$ELSE}
+ RegisterMethod('Function FIELDBYNAME( const FIELDNAME : WIDESTRING) : TFIELD');
+ RegisterMethod('Function FINDFIELD( const FIELDNAME : WideString) : TFIELD');
+{$ENDIF}
+{$ELSE}
+ RegisterMethod('Function FIELDBYNAME( const FIELDNAME : STRING) : TFIELD');
+ RegisterMethod('Function FINDFIELD( const FIELDNAME : STRING) : TFIELD');
+{$ENDIF}
+ RegisterMethod('Function FINDFIRST : BOOLEAN');
+ RegisterMethod('Function FINDLAST : BOOLEAN');
+ RegisterMethod('Function FINDNEXT : BOOLEAN');
+ RegisterMethod('Function FINDPRIOR : BOOLEAN');
+ RegisterMethod('Procedure FIRST');
+// RegisterMethod('Procedure FREEBOOKMARK( BOOKMARK : TBOOKMARK)');
+// RegisterMethod('Function GETBOOKMARK : TBOOKMARK');
+ RegisterMethod('Function GETCURRENTRECORD( BUFFER : PCHAR) : BOOLEAN');
+// RegisterMethod('Procedure GETDETAILDATASETS( LIST : TLIST)');
+// RegisterMethod('Procedure GETFIELDLIST( LIST : TLIST; const FIELDNAMES : STRING)');
+// RegisterMethod('Procedure GETDETAILLINKFIELDS( MASTERFIELDS, DETAILFIELDS : TLIST)');
+// RegisterMethod('Function GETBLOBFIELDDATA( FIELDNO : INTEGER; var BUFFER : TBLOBBYTEDATA) : INTEGER');
+ RegisterMethod('Procedure GETFIELDNAMES( LIST : TSTRINGS)');
+// RegisterMethod('Procedure GOTOBOOKMARK( BOOKMARK : TBOOKMARK)');
+ RegisterMethod('Procedure INSERT');
+ RegisterMethod('Procedure INSERTRECORD( const VALUES : array of const)');
+ RegisterMethod('Function ISEMPTY : BOOLEAN');
+ RegisterMethod('Function ISLINKEDTO( DATASOURCE : TDATASOURCE) : BOOLEAN');
+ RegisterMethod('Function ISSEQUENCED : BOOLEAN');
+ RegisterMethod('Procedure LAST');
+ RegisterMethod('Function LOCATE( const KEYFIELDS : String; const KEYVALUES : VARIANT; OPTIONS : TLOCATEOPTIONS) : BOOLEAN');
+ RegisterMethod('Function LOOKUP( const KEYFIELDS : String; const KEYVALUES : VARIANT; const RESULTFIELDS : String) : VARIANT');
+ RegisterMethod('Function MOVEBY( DISTANCE : INTEGER) : INTEGER');
+ RegisterMethod('Procedure NEXT');
+ RegisterMethod('Procedure OPEN');
+ RegisterMethod('Procedure POST');
+ RegisterMethod('Procedure PRIOR');
+ RegisterMethod('Procedure REFRESH');
+// RegisterMethod('Procedure RESYNC( MODE : TRESYNCMODE)');
+ RegisterMethod('Procedure SETFIELDS( const VALUES : array of const)');
+ RegisterMethod('Function TRANSLATE( SRC, DEST : PCHAR; TOOEM : BOOLEAN) : INTEGER');
+ RegisterMethod('Procedure UPDATECURSORPOS');
+ RegisterMethod('Procedure UPDATERECORD');
+ RegisterMethod('Function UPDATESTATUS : TUPDATESTATUS');
+ RegisterProperty('AGGFIELDS', 'TFIELDS', iptr);
+ RegisterProperty('BOF', 'BOOLEAN', iptr);
+// RegisterProperty('BOOKMARK', 'TBOOKMARKSTR', iptrw);
+ RegisterProperty('CANMODIFY', 'BOOLEAN', iptr);
+ RegisterProperty('DATASETFIELD', 'TDATASETFIELD', iptrw);
+ RegisterProperty('DATASOURCE', 'TDATASOURCE', iptr);
+ RegisterProperty('DEFAULTFIELDS', 'BOOLEAN', iptr);
+ RegisterProperty('DESIGNER', 'TDATASETDESIGNER', iptr);
+ RegisterProperty('EOF', 'BOOLEAN', iptr);
+ RegisterProperty('BLOCKREADSIZE', 'INTEGER', iptrw);
+ RegisterProperty('FIELDCOUNT', 'INTEGER', iptr);
+ RegisterProperty('FIELDDEFS', 'TFIELDDEFS', iptrw);
+ RegisterProperty('FIELDDEFLIST', 'TFIELDDEFLIST', iptr);
+ RegisterProperty('FIELDS', 'TFIELDS', iptr);
+ RegisterProperty('FIELDLIST', 'TFIELDLIST', iptr);
+ RegisterProperty('FIELDVALUES', 'VARIANT String', iptrw);
+ RegisterProperty('FOUND', 'BOOLEAN', iptr);
+{$IFDEF DELPHI6UP}
+ RegisterProperty('ISUNIDIRECTIONAL', 'BOOLEAN', iptr);
+{$ENDIF}
+ RegisterProperty('MODIFIED', 'BOOLEAN', iptr);
+ RegisterProperty('OBJECTVIEW', 'BOOLEAN', iptrw);
+ RegisterProperty('RECORDCOUNT', 'INTEGER', iptr);
+ RegisterProperty('RECNO', 'INTEGER', iptrw);
+ RegisterProperty('RECORDSIZE', 'WORD', iptr);
+ RegisterProperty('SPARSEARRAYS', 'BOOLEAN', iptrw);
+ RegisterProperty('STATE', 'TDATASETSTATE', iptr);
+ RegisterProperty('FILTER', 'String', iptrw);
+ RegisterProperty('FILTERED', 'BOOLEAN', iptrw);
+ RegisterProperty('FILTEROPTIONS', 'TFILTEROPTIONS', iptrw);
+ RegisterProperty('ACTIVE', 'BOOLEAN', iptrw);
+ RegisterProperty('AUTOCALCFIELDS', 'BOOLEAN', iptrw);
+ RegisterProperty('BEFOREOPEN', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('AFTEROPEN', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('BEFORECLOSE', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('AFTERCLOSE', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('BEFOREINSERT', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('AFTERINSERT', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('BEFOREEDIT', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('AFTEREDIT', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('BEFOREPOST', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('AFTERPOST', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('BEFORECANCEL', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('AFTERCANCEL', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('BEFOREDELETE', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('AFTERDELETE', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('BEFORESCROLL', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('AFTERSCROLL', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('BEFOREREFRESH', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('AFTERREFRESH', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('ONCALCFIELDS', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('ONDELETEERROR', 'TDATASETERROREVENT', iptrw);
+ RegisterProperty('ONEDITERROR', 'TDATASETERROREVENT', iptrw);
+ RegisterProperty('ONFILTERRECORD', 'TFILTERRECORDEVENT', iptrw);
+ RegisterProperty('ONNEWRECORD', 'TDATASETNOTIFYEVENT', iptrw);
+ RegisterProperty('ONPOSTERROR', 'TDATASETERROREVENT', iptrw);
+ end;
+end;
+
+procedure SIRegisterTPARAMS(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TCOLLECTION','TPARAMS') do
+ begin
+ RegisterMethod('Procedure ASSIGNVALUES( VALUE : TPARAMS)');
+ RegisterMethod('Procedure ADDPARAM( VALUE : TPARAM)');
+ RegisterMethod('Procedure REMOVEPARAM( VALUE : TPARAM)');
+ RegisterMethod('Function CREATEPARAM( FLDTYPE : TFIELDTYPE; const PARAMNAME : String; PARAMTYPE : TPARAMTYPE) : TPARAM');
+// RegisterMethod('Procedure GETPARAMLIST( LIST : TLIST; const PARAMNAMES : STRING)');
+ RegisterMethod('Function ISEQUAL( VALUE : TPARAMS) : BOOLEAN');
+ RegisterMethod('Function PARSESQL( SQL : String; DOCREATE : BOOLEAN) : String');
+ RegisterMethod('Function PARAMBYNAME( const VALUE : String) : TPARAM');
+ RegisterMethod('Function FINDPARAM( const VALUE : String) : TPARAM');
+ RegisterProperty('ITEMS', 'TPARAM INTEGER', iptrw);
+ RegisterProperty('PARAMVALUES', 'VARIANT String', iptrw);
+ end;
+end;
+
+procedure SIRegisterTPARAM(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TCOLLECTIONITEM','TPARAM') do
+ begin
+ RegisterMethod('Procedure ASSIGNFIELD( FIELD : TFIELD)');
+ RegisterMethod('Procedure ASSIGNFIELDVALUE( FIELD : TFIELD; const VALUE : VARIANT)');
+ RegisterMethod('Procedure CLEAR');
+// RegisterMethod('Procedure GETDATA( BUFFER : POINTER)');
+ RegisterMethod('Function GETDATASIZE : INTEGER');
+ RegisterMethod('Procedure LOADFROMFILE( const FILENAME : String; BLOBTYPE : TBLOBTYPE)');
+ RegisterMethod('Procedure LOADFROMSTREAM( STREAM : TSTREAM; BLOBTYPE : TBLOBTYPE)');
+// RegisterMethod('Procedure SETBLOBDATA( BUFFER : POINTER; SIZE : INTEGER)');
+// RegisterMethod('Procedure SETDATA( BUFFER : POINTER)');
+{$IFDEF DELPHI6UP}
+ RegisterProperty('ASBCD', 'CURRENCY', iptrw);
+{$ENDIF}
+{$IFDEF DELPHI6UP}
+ RegisterProperty('ASFMTBCD', 'TBCD', iptrw);
+{$ENDIF}
+ RegisterProperty('ASBLOB', 'TBLOBDATA', iptrw);
+ RegisterProperty('ASBOOLEAN', 'BOOLEAN', iptrw);
+ RegisterProperty('ASCURRENCY', 'CURRENCY', iptrw);
+ RegisterProperty('ASDATE', 'TDATETIME', iptrw);
+ RegisterProperty('ASDATETIME', 'TDATETIME', iptrw);
+ RegisterProperty('ASFLOAT', 'DOUBLE', iptrw);
+ RegisterProperty('ASINTEGER', 'LONGINT', iptrw);
+ RegisterProperty('ASSMALLINT', 'LONGINT', iptrw);
+ RegisterProperty('ASMEMO', 'String', iptrw);
+ RegisterProperty('ASSTRING', 'String', iptrw);
+ RegisterProperty('ASTIME', 'TDATETIME', iptrw);
+ RegisterProperty('ASWORD', 'LONGINT', iptrw);
+ RegisterProperty('BOUND', 'BOOLEAN', iptrw);
+ RegisterProperty('ISNULL', 'BOOLEAN', iptr);
+ RegisterProperty('NATIVESTR', 'String', iptrw);
+ RegisterProperty('TEXT', 'String', iptrw);
+ RegisterProperty('DATATYPE', 'TFIELDTYPE', iptrw);
+{$IFDEF DELPHI6UP}
+ RegisterProperty('PRECISION', 'INTEGER', iptrw);
+ RegisterProperty('NUMERICSCALE', 'INTEGER', iptrw);
+ RegisterProperty('SIZE', 'INTEGER', iptrw);
+{$ENDIF}
+ RegisterProperty('NAME', 'String', iptrw);
+ RegisterProperty('PARAMTYPE', 'TPARAMTYPE', iptrw);
+ RegisterProperty('VALUE', 'VARIANT', iptrw);
+ end;
+end;
+
+procedure SIRegisterTGUIDFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFIELD','TGUIDFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTVARIANTFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFIELD','TVARIANTFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTREFERENCEFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TDATASETFIELD','TREFERENCEFIELD') do
+ begin
+ RegisterProperty('REFERENCETABLENAME', 'String', iptrw);
+ end;
+end;
+
+procedure SIRegisterTDATASETFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TOBJECTFIELD','TDATASETFIELD') do
+ begin
+ RegisterProperty('NESTEDDATASET', 'TDATASET', iptr);
+ RegisterProperty('INCLUDEOBJECTFIELD', 'BOOLEAN', iptrw);
+ end;
+end;
+
+procedure SIRegisterTARRAYFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TOBJECTFIELD','TARRAYFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTADTFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TOBJECTFIELD','TADTFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTOBJECTFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFIELD','TOBJECTFIELD') do
+ begin
+ RegisterProperty('FIELDCOUNT', 'INTEGER', iptr);
+ RegisterProperty('FIELDS', 'TFIELDS', iptr);
+ RegisterProperty('FIELDVALUES', 'VARIANT INTEGER', iptrw);
+ RegisterProperty('UNNAMED', 'BOOLEAN', iptr);
+ RegisterProperty('OBJECTTYPE', 'String', iptrw);
+ end;
+end;
+
+procedure SIRegisterTGRAPHICFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TBLOBFIELD','TGRAPHICFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTMEMOFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TBLOBFIELD','TMEMOFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTBLOBFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFIELD','TBLOBFIELD') do
+ begin
+ RegisterMethod('Procedure LOADFROMFILE( const FILENAME : String)');
+ RegisterMethod('Procedure LOADFROMSTREAM( STREAM : TSTREAM)');
+ RegisterMethod('Procedure SAVETOFILE( const FILENAME : String)');
+ RegisterMethod('Procedure SAVETOSTREAM( STREAM : TSTREAM)');
+ RegisterProperty('BLOBSIZE', 'INTEGER', iptr);
+ RegisterProperty('MODIFIED', 'BOOLEAN', iptrw);
+ RegisterProperty('VALUE', 'String', iptrw);
+ RegisterProperty('TRANSLITERATE', 'BOOLEAN', iptrw);
+ RegisterProperty('BLOBTYPE', 'TBLOBTYPE', iptrw);
+{$IFDEF DELPHI6UP}
+ RegisterProperty('GRAPHICHEADER', 'BOOLEAN', iptrw);
+{$ENDIF}
+ end;
+end;
+
+{$IFDEF DELPHI6UP}
+procedure SIRegisterTFMTBCDFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TNUMERICFIELD','TFMTBCDFIELD') do
+ begin
+ RegisterProperty('VALUE', 'TBCD', iptrw);
+ RegisterProperty('CURRENCY', 'BOOLEAN', iptrw);
+ RegisterProperty('MAXVALUE', 'String', iptrw);
+ RegisterProperty('MINVALUE', 'String', iptrw);
+ RegisterProperty('PRECISION', 'INTEGER', iptrw);
+ end;
+end;
+{$ENDIF}
+
+procedure SIRegisterTBCDFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TNUMERICFIELD','TBCDFIELD') do
+ begin
+ RegisterProperty('VALUE', 'CURRENCY', iptrw);
+ RegisterProperty('CURRENCY', 'BOOLEAN', iptrw);
+ RegisterProperty('MAXVALUE', 'CURRENCY', iptrw);
+ RegisterProperty('MINVALUE', 'CURRENCY', iptrw);
+ RegisterProperty('PRECISION', 'INTEGER', iptrw);
+ end;
+end;
+
+procedure SIRegisterTVARBYTESFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TBYTESFIELD','TVARBYTESFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTBYTESFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TBINARYFIELD','TBYTESFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTBINARYFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFIELD','TBINARYFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTTIMEFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TDATETIMEFIELD','TTIMEFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTDATEFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TDATETIMEFIELD','TDATEFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTDATETIMEFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFIELD','TDATETIMEFIELD') do
+ begin
+ RegisterProperty('VALUE', 'TDATETIME', iptrw);
+ RegisterProperty('DISPLAYFORMAT', 'String', iptrw);
+ end;
+end;
+
+procedure SIRegisterTBOOLEANFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFIELD','TBOOLEANFIELD') do
+ begin
+ RegisterProperty('VALUE', 'BOOLEAN', iptrw);
+ RegisterProperty('DISPLAYVALUES', 'String', iptrw);
+ end;
+end;
+
+procedure SIRegisterTCURRENCYFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFLOATFIELD','TCURRENCYFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTFLOATFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TNUMERICFIELD','TFLOATFIELD') do
+ begin
+ RegisterProperty('VALUE', 'DOUBLE', iptrw);
+ RegisterProperty('CURRENCY', 'BOOLEAN', iptrw);
+ RegisterProperty('MAXVALUE', 'DOUBLE', iptrw);
+ RegisterProperty('MINVALUE', 'DOUBLE', iptrw);
+ RegisterProperty('PRECISION', 'INTEGER', iptrw);
+ end;
+end;
+
+procedure SIRegisterTAUTOINCFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TINTEGERFIELD','TAUTOINCFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTWORDFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TINTEGERFIELD','TWORDFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTLARGEINTFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TNUMERICFIELD','TLARGEINTFIELD') do
+ begin
+ RegisterProperty('ASLARGEINT', 'LARGEINT', iptrw);
+ RegisterProperty('VALUE', 'LARGEINT', iptrw);
+ RegisterProperty('MAXVALUE', 'LARGEINT', iptrw);
+ RegisterProperty('MINVALUE', 'LARGEINT', iptrw);
+ end;
+end;
+
+procedure SIRegisterTSMALLINTFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TINTEGERFIELD','TSMALLINTFIELD') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTINTEGERFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TNUMERICFIELD','TINTEGERFIELD') do
+ begin
+ RegisterProperty('VALUE', 'LONGINT', iptrw);
+ RegisterProperty('MAXVALUE', 'LONGINT', iptrw);
+ RegisterProperty('MINVALUE', 'LONGINT', iptrw);
+ end;
+end;
+
+procedure SIRegisterTNUMERICFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFIELD','TNUMERICFIELD') do
+ begin
+ RegisterProperty('DISPLAYFORMAT', 'String', iptrw);
+ RegisterProperty('EDITFORMAT', 'String', iptrw);
+ end;
+end;
+
+procedure SIRegisterTWIDESTRINGFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TSTRINGFIELD','TWIDESTRINGFIELD') do
+ begin
+ RegisterProperty('VALUE', 'WIDESTRING', iptrw);
+ end;
+end;
+
+procedure SIRegisterTSTRINGFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFIELD','TSTRINGFIELD') do
+ begin
+ RegisterProperty('VALUE', 'String', iptrw);
+ RegisterProperty('FIXEDCHAR', 'BOOLEAN', iptrw);
+ RegisterProperty('TRANSLITERATE', 'BOOLEAN', iptrw);
+ end;
+end;
+
+procedure SIRegisterTFIELD(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TCOMPONENT','TFIELD') do
+ begin
+//RegisterMethod('Procedure ASSIGNVALUE( const VALUE : TVARREC)');
+ RegisterMethod('Procedure CLEAR');
+ RegisterMethod('Procedure FOCUSCONTROL');
+// RegisterMethod('Function GETDATA( BUFFER : POINTER; NATIVEFORMAT : BOOLEAN) : BOOLEAN');
+ RegisterMethod('Function ISVALIDCHAR( INPUTCHAR : CHAR) : BOOLEAN');
+ RegisterMethod('Procedure REFRESHLOOKUPLIST');
+// RegisterMethod('Procedure SETDATA( BUFFER : POINTER; NATIVEFORMAT : BOOLEAN)');
+ RegisterMethod('Procedure SETFIELDTYPE( VALUE : TFIELDTYPE)');
+// RegisterMethod('Procedure VALIDATE( BUFFER : POINTER)');
+{$IFDEF DELPHI6UP}
+ RegisterProperty('ASBCD', 'TBCD', iptrw);
+{$ENDIF}
+ RegisterProperty('ASBOOLEAN', 'BOOLEAN', iptrw);
+ RegisterProperty('ASCURRENCY', 'CURRENCY', iptrw);
+ RegisterProperty('ASDATETIME', 'TDATETIME', iptrw);
+ RegisterProperty('ASFLOAT', 'DOUBLE', iptrw);
+ RegisterProperty('ASINTEGER', 'LONGINT', iptrw);
+ RegisterProperty('ASSTRING', 'String', iptrw);
+ RegisterProperty('ASVARIANT', 'VARIANT', iptrw);
+ RegisterProperty('ATTRIBUTESET', 'String', iptrw);
+ RegisterProperty('CALCULATED', 'BOOLEAN', iptrw);
+ RegisterProperty('CANMODIFY', 'BOOLEAN', iptr);
+ RegisterProperty('CURVALUE', 'VARIANT', iptr);
+ RegisterProperty('DATASET', 'TDATASET', iptrw);
+ RegisterProperty('DATASIZE', 'INTEGER', iptr);
+ RegisterProperty('DATATYPE', 'TFIELDTYPE', iptr);
+ RegisterProperty('DISPLAYNAME', 'String', iptr);
+ RegisterProperty('DISPLAYTEXT', 'String', iptr);
+ RegisterProperty('EDITMASK', 'TEDITMASK', iptrw);
+ RegisterProperty('EDITMASKPTR', 'TEDITMASK', iptr);
+ RegisterProperty('EDITMASK', 'String', iptrw);
+ RegisterProperty('EDITMASKPTR', 'String', iptr);
+ RegisterProperty('FIELDNO', 'INTEGER', iptr);
+ RegisterProperty('FULLNAME', 'String', iptr);
+ RegisterProperty('ISINDEXFIELD', 'BOOLEAN', iptr);
+ RegisterProperty('ISNULL', 'BOOLEAN', iptr);
+ RegisterProperty('LOOKUP', 'BOOLEAN', iptrw);
+ RegisterProperty('LOOKUPLIST', 'TLOOKUPLIST', iptr);
+ RegisterProperty('NEWVALUE', 'VARIANT', iptrw);
+ RegisterProperty('OFFSET', 'INTEGER', iptr);
+ RegisterProperty('OLDVALUE', 'VARIANT', iptr);
+ RegisterProperty('PARENTFIELD', 'TOBJECTFIELD', iptrw);
+ RegisterProperty('SIZE', 'INTEGER', iptrw);
+ RegisterProperty('TEXT', 'String', iptrw);
+ RegisterProperty('VALIDCHARS', 'TFIELDCHARS', iptrw);
+ RegisterProperty('VALUE', 'VARIANT', iptrw);
+ RegisterProperty('ALIGNMENT', 'TALIGNMENT', iptrw);
+ RegisterProperty('AUTOGENERATEVALUE', 'TAUTOREFRESHFLAG', iptrw);
+ RegisterProperty('CUSTOMCONSTRAINT', 'String', iptrw);
+ RegisterProperty('CONSTRAINTERRORMESSAGE', 'String', iptrw);
+ RegisterProperty('DEFAULTEXPRESSION', 'String', iptrw);
+ RegisterProperty('DISPLAYLABEL', 'String', iptrw);
+ RegisterProperty('DISPLAYWIDTH', 'INTEGER', iptrw);
+ RegisterProperty('FIELDKIND', 'TFIELDKIND', iptrw);
+ RegisterProperty('FIELDNAME', 'String', iptrw);
+ RegisterProperty('HASCONSTRAINTS', 'BOOLEAN', iptr);
+ RegisterProperty('INDEX', 'INTEGER', iptrw);
+ RegisterProperty('IMPORTEDCONSTRAINT', 'String', iptrw);
+ RegisterProperty('LOOKUPDATASET', 'TDATASET', iptrw);
+ RegisterProperty('LOOKUPKEYFIELDS', 'String', iptrw);
+ RegisterProperty('LOOKUPRESULTFIELD', 'String', iptrw);
+ RegisterProperty('KEYFIELDS', 'String', iptrw);
+ RegisterProperty('LOOKUPCACHE', 'BOOLEAN', iptrw);
+ RegisterProperty('ORIGIN', 'String', iptrw);
+ RegisterProperty('PROVIDERFLAGS', 'TPROVIDERFLAGS', iptrw);
+ RegisterProperty('READONLY', 'BOOLEAN', iptrw);
+ RegisterProperty('REQUIRED', 'BOOLEAN', iptrw);
+ RegisterProperty('VISIBLE', 'BOOLEAN', iptrw);
+ RegisterProperty('ONCHANGE', 'TFIELDNOTIFYEVENT', iptrw);
+ RegisterProperty('ONGETTEXT', 'TFIELDGETTEXTEVENT', iptrw);
+ RegisterProperty('ONSETTEXT', 'TFIELDSETTEXTEVENT', iptrw);
+ RegisterProperty('ONVALIDATE', 'TFIELDNOTIFYEVENT', iptrw);
+ end;
+end;
+
+procedure SIRegisterTLOOKUPLIST(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TOBJECT','TLOOKUPLIST') do
+ begin
+ RegisterMethod('Constructor CREATE');
+ RegisterMethod('Procedure ADD( const AKEY, AVALUE : VARIANT)');
+ RegisterMethod('Procedure CLEAR');
+ RegisterMethod('Function VALUEOFKEY( const AKEY : VARIANT) : VARIANT');
+ end;
+end;
+
+procedure SIRegisterTFIELDS(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TOBJECT','TFIELDS') do
+ begin
+ RegisterMethod('Constructor CREATE( ADATASET : TDATASET)');
+ RegisterMethod('Procedure ADD( FIELD : TFIELD)');
+ RegisterMethod('Procedure CHECKFIELDNAME( const FIELDNAME : String)');
+ RegisterMethod('Procedure CHECKFIELDNAMES( const FIELDNAMES : String)');
+ RegisterMethod('Procedure CLEAR');
+ RegisterMethod('Function FINDFIELD( const FIELDNAME : String) : TFIELD');
+ RegisterMethod('Function FIELDBYNAME( const FIELDNAME : String) : TFIELD');
+ RegisterMethod('Function FIELDBYNUMBER( FIELDNO : INTEGER) : TFIELD');
+ RegisterMethod('Procedure GETFIELDNAMES( LIST : TSTRINGS)');
+ RegisterMethod('Function INDEXOF( FIELD : TFIELD) : INTEGER');
+ RegisterMethod('Procedure REMOVE( FIELD : TFIELD)');
+ RegisterProperty('COUNT', 'INTEGER', iptr);
+ RegisterProperty('DATASET', 'TDATASET', iptr);
+ RegisterProperty('FIELDS', 'TFIELD INTEGER', iptrw);
+ end;
+end;
+
+procedure SIRegisterTFIELDLIST(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFLATLIST','TFIELDLIST') do
+ begin
+ RegisterMethod('Function FIELDBYNAME( const NAME : String) : TFIELD');
+ RegisterMethod('Function FIND( const NAME : String) : TFIELD');
+ RegisterProperty('FIELDS', 'TFIELD INTEGER', iptr);
+ end;
+end;
+
+procedure SIRegisterTFIELDDEFLIST(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TFLATLIST','TFIELDDEFLIST') do
+ begin
+ RegisterMethod('Function FIELDBYNAME( const NAME : String) : TFIELDDEF');
+ RegisterMethod('Function FIND( const NAME : String) : TFIELDDEF');
+ RegisterProperty('FIELDDEFS', 'TFIELDDEF INTEGER', iptr);
+ end;
+end;
+
+procedure SIRegisterTFLATLIST(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TSTRINGLIST','TFLATLIST') do
+ begin
+ RegisterMethod('Constructor CREATE( ADATASET : TDATASET)');
+ RegisterMethod('Procedure UPDATE');
+ RegisterProperty('DATASET', 'TDATASET', iptr);
+ end;
+end;
+
+procedure SIRegisterTINDEXDEFS(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TDEFCOLLECTION','TINDEXDEFS') do
+ begin
+ RegisterMethod('Constructor CREATE( ADATASET : TDATASET)');
+ RegisterMethod('Function ADDINDEXDEF : TINDEXDEF');
+ RegisterMethod('Function FIND( const NAME : String) : TINDEXDEF');
+ RegisterMethod('Procedure UPDATE');
+ RegisterMethod('Function FINDINDEXFORFIELDS( const FIELDS : String) : TINDEXDEF');
+ RegisterMethod('Function GETINDEXFORFIELDS( const FIELDS : String; CASEINSENSITIVE : BOOLEAN) : TINDEXDEF');
+ RegisterMethod('Procedure ADD( const NAME, FIELDS : String; OPTIONS : TINDEXOPTIONS)');
+ RegisterProperty('ITEMS', 'TINDEXDEF INTEGER', iptrw);
+ end;
+end;
+
+procedure SIRegisterTINDEXDEF(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TNAMEDITEM','TINDEXDEF') do
+ begin
+ RegisterMethod('Constructor CREATE( OWNER : TINDEXDEFS; const NAME, FIELDS : String; OPTIONS : TINDEXOPTIONS)');
+ RegisterProperty('FIELDEXPRESSION', 'String', iptr);
+ RegisterProperty('CASEINSFIELDS', 'String', iptrw);
+ RegisterProperty('DESCFIELDS', 'String', iptrw);
+ RegisterProperty('EXPRESSION', 'String', iptrw);
+ RegisterProperty('FIELDS', 'String', iptrw);
+ RegisterProperty('OPTIONS', 'TINDEXOPTIONS', iptrw);
+ RegisterProperty('SOURCE', 'String', iptrw);
+ RegisterProperty('GROUPINGLEVEL', 'INTEGER', iptrw);
+ end;
+end;
+
+procedure SIRegisterTFIELDDEFS(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TDEFCOLLECTION','TFIELDDEFS') do
+ begin
+ RegisterMethod('Constructor CREATE( AOWNER : TPERSISTENT)');
+ RegisterMethod('Function ADDFIELDDEF : TFIELDDEF');
+ RegisterMethod('Function FIND( const NAME : String) : TFIELDDEF');
+ RegisterMethod('Procedure UPDATE');
+ RegisterMethod('Procedure ADD( const NAME : String; DATATYPE : TFIELDTYPE; SIZE : INTEGER; REQUIRED : BOOLEAN)');
+ RegisterProperty('HIDDENFIELDS', 'BOOLEAN', iptrw);
+ RegisterProperty('ITEMS', 'TFIELDDEF INTEGER', iptrw);
+ RegisterProperty('PARENTDEF', 'TFIELDDEF', iptr);
+ end;
+end;
+
+procedure SIRegisterTFIELDDEF(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TNAMEDITEM','TFIELDDEF') do
+ begin
+// RegisterMethod('Constructor CREATE( OWNER : TFIELDDEFS; const NAME : STRING; DATATYPE : TFIELDTYPE; SIZE : INTEGER; REQUIRED : BOOLEAN; FIELDNO : INTEGER)');
+ RegisterMethod('Function ADDCHILD : TFIELDDEF');
+ RegisterMethod('Function CREATEFIELD( OWNER : TCOMPONENT; PARENTFIELD : TOBJECTFIELD; const FIELDNAME : String; CREATECHILDREN : BOOLEAN) : TFIELD');
+ RegisterMethod('Function HASCHILDDEFS : BOOLEAN');
+ RegisterProperty('FIELDCLASS', 'TFIELDCLASS', iptr);
+ RegisterProperty('FIELDNO', 'INTEGER', iptrw);
+ RegisterProperty('INTERNALCALCFIELD', 'BOOLEAN', iptrw);
+ RegisterProperty('PARENTDEF', 'TFIELDDEF', iptr);
+ RegisterProperty('REQUIRED', 'BOOLEAN', iptrw);
+ RegisterProperty('ATTRIBUTES', 'TFIELDATTRIBUTES', iptrw);
+ RegisterProperty('CHILDDEFS', 'TFIELDDEFS', iptrw);
+ RegisterProperty('DATATYPE', 'TFIELDTYPE', iptrw);
+ RegisterProperty('PRECISION', 'INTEGER', iptrw);
+ RegisterProperty('SIZE', 'INTEGER', iptrw);
+ end;
+end;
+
+procedure SIRegisterTDEFCOLLECTION(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TOWNEDCOLLECTION','TDEFCOLLECTION') do
+ begin
+// RegisterMethod('Constructor CREATE( ADATASET : TDATASET; AOWNER : TPERSISTENT; ACLASS : TCOLLECTIONITEMCLASS)');
+ RegisterMethod('Function FIND( const ANAME : String) : TNAMEDITEM');
+ RegisterMethod('Procedure GETITEMNAMES( LIST : TSTRINGS)');
+ RegisterMethod('Function INDEXOF( const ANAME : String) : INTEGER');
+ RegisterProperty('DATASET', 'TDATASET', iptr);
+ RegisterProperty('UPDATED', 'BOOLEAN', iptrw);
+ end;
+end;
+
+procedure SIRegisterTNAMEDITEM(CL: TPSPascalCompiler);
+Begin
+With RegClassS(cl,'TCOLLECTIONITEM','TNAMEDITEM') do
+ begin
+ RegisterProperty('NAME', 'String', iptrw);
+ end;
+end;
+
+procedure SIRegister_DB(Cl: TPSPascalCompiler);
+Begin
+cl.AddTypeS('TFieldType', '(ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime,'+
+ 'ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString,'+
+ 'ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd)');
+
+ CL.AddTypeS('TDataSetState', '(dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc, dsOpening)');
+
+cl.addTypeS('TLocateOption','(loCaseInsensitive, loPartialKey)');
+cl.addtypes('TLocateOptions','set of TLocateOption');
+cl.addtypes('TUpdateStatus','(usUnmodified, usModified, usInserted, usDeleted)');
+cl.addtypes('TUpdateStatusSet', 'set of TUpdateStatus');
+
+ cl.addTypeS('TPARAMTYPE', 'BYTE');
+RegClassS(cl,'TComponent','TDATASET');
+RegClassS(cl,'TComponent','TFIELD');
+RegClassS(cl,'TComponent','TFIELDDEFS');
+RegClassS(cl,'TComponent','TINDEXDEFS');
+RegClassS(cl, 'TComponent', 'TObjectField');
+RegClassS(cl, 'TComponent', 'TDataLink');
+RegClassS(cl, 'TComponent', 'TDataSource');
+RegClassS(cl, 'TComponent', 'TParam');
+
+SIRegisterTNAMEDITEM(Cl);
+Cl.addTypeS('TDEFUPDATEMETHOD', 'Procedure');
+SIRegisterTDEFCOLLECTION(Cl);
+cl.AddConstantN('FAHIDDENCOL','LONGINT').Value.tu32 := 1;
+cl.AddConstantN('FAREADONLY','LONGINT').Value.tu32 := 2;
+cl.AddConstantN('FAREQUIRED','LONGINT').Value.tu32 := 4;
+cl.AddConstantN('FALINK','LONGINT').Value.tu32 := 8;
+cl.AddConstantN('FAUNNAMED','LONGINT').Value.tu32 := 16;
+cl.AddConstantN('FAFIXED','LONGINT').Value.tu32 := 32;
+cl.addTypeS('TFIELDATTRIBUTES', 'BYTE');
+SIRegisterTFIELDDEF(Cl);
+SIRegisterTFIELDDEFS(Cl);
+cl.AddConstantN('IXPRIMARY','LONGINT').Value.tu32 := 1;
+cl.AddConstantN('IXUNIQUE','LONGINT').Value.tu32 := 2;
+cl.AddConstantN('IXDESCENDING','LONGINT').Value.tu32 := 4;
+cl.AddConstantN('IXCASEINSENSITIVE','LONGINT').Value.tu32 := 8;
+cl.AddConstantN('IXEXPRESSION','LONGINT').Value.tu32 := 16;
+cl.AddConstantN('IXNONMAINTAINED','LONGINT').Value.tu32 := 32;
+cl.addTypeS('TINDEXOPTIONS', 'BYTE');
+SIRegisterTINDEXDEF(Cl);
+SIRegisterTINDEXDEFS(Cl);
+SIRegisterTFLATLIST(Cl);
+SIRegisterTFIELDDEFLIST(Cl);
+SIRegisterTFIELDLIST(Cl);
+cl.AddConstantN('FKDATA','LONGINT').Value.tu32 := 1;
+cl.AddConstantN('FKCALCULATED','LONGINT').Value.tu32 := 2;
+cl.AddConstantN('FKLOOKUP','LONGINT').Value.tu32 := 4;
+cl.AddConstantN('FKINTERNALCALC','LONGINT').Value.tu32 := 8;
+cl.AddConstantN('FKAGGREGATE','LONGINT').Value.tu32 := 16;
+cl.addTypeS('TFIELDKINDS', 'BYTE');
+SIRegisterTFIELDS(Cl);
+cl.AddConstantN('PFINUPDATE','LONGINT').Value.tu32 := 1;
+cl.AddConstantN('PFINWHERE','LONGINT').Value.tu32 := 2;
+cl.AddConstantN('PFINKEY','LONGINT').Value.tu32 := 4;
+cl.AddConstantN('PFHIDDEN','LONGINT').Value.tu32 :=8;
+cl.addTypeS('TPROVIDERFLAGS', 'BYTE');
+cl.addTypeS('TFIELDNOTIFYEVENT', 'Procedure ( SENDER : TFIELD)');
+cl.addTypeS('TFIELDGETTEXTEVENT', 'Procedure ( SENDER : TFIELD; var TEXT : S'
+ +'TRING; DISPLAYTEXT : BOOLEAN)');
+cl.addTypeS('TFIELDSETTEXTEVENT', 'Procedure ( SENDER : TFIELD; const TEXT :'
+ +' String)');
+cl.addTypeS('TAUTOREFRESHFLAG', '( ARNONE, ARAUTOINC, ARDEFAULT )');
+SIRegisterTLOOKUPLIST(Cl);
+SIRegisterTFIELD(Cl);
+SIRegisterTSTRINGFIELD(Cl);
+SIRegisterTWIDESTRINGFIELD(Cl);
+SIRegisterTNUMERICFIELD(Cl);
+SIRegisterTINTEGERFIELD(Cl);
+SIRegisterTSMALLINTFIELD(Cl);
+cl.addTypeS('LARGEINT', 'INT64');
+SIRegisterTLARGEINTFIELD(Cl);
+SIRegisterTWORDFIELD(Cl);
+SIRegisterTAUTOINCFIELD(Cl);
+SIRegisterTFLOATFIELD(Cl);
+SIRegisterTCURRENCYFIELD(Cl);
+SIRegisterTBOOLEANFIELD(Cl);
+SIRegisterTDATETIMEFIELD(Cl);
+SIRegisterTDATEFIELD(Cl);
+SIRegisterTTIMEFIELD(Cl);
+SIRegisterTBINARYFIELD(Cl);
+SIRegisterTBYTESFIELD(Cl);
+SIRegisterTVARBYTESFIELD(Cl);
+SIRegisterTBCDFIELD(Cl);
+{$IFDEF DELPHI6UP}
+SIRegisterTFMTBCDFIELD(Cl);
+{$ENDIF}
+cl.addTypeS('TBLOBTYPE', 'BYTE');
+SIRegisterTBLOBFIELD(Cl);
+SIRegisterTMEMOFIELD(Cl);
+SIRegisterTGRAPHICFIELD(Cl);
+SIRegisterTOBJECTFIELD(Cl);
+SIRegisterTADTFIELD(Cl);
+SIRegisterTARRAYFIELD(Cl);
+SIRegisterTDATASETFIELD(Cl);
+SIRegisterTREFERENCEFIELD(Cl);
+SIRegisterTVARIANTFIELD(Cl);
+SIRegisterTGUIDFIELD(Cl);
+cl.addTypeS('TBLOBDATA', 'STRING');
+cl.AddConstantN('PTUNKNOWN','LONGINT').Value.tu32 := 1;
+cl.AddConstantN('PTINPUT','LONGINT').Value.tu32 := 2;
+cl.AddConstantN('PTOUTPUT','LONGINT').Value.tu32 := 4;
+cl.AddConstantN('PTINPUTOUTPUT','LONGINT').Value.tu32 := 8;
+cl.AddConstantN('PTRESULT','LONGINT').Value.tu32 := 16;
+RegClassS(cl,'TObject','TPARAMS');
+SIRegisterTPARAM(Cl);
+SIRegisterTPARAMS(Cl);
+cl.addTypeS('TDATAACTION', '( DAFAIL, DAABORT, DARETRY )');
+cl.addTypeS('TBLOBSTREAMMODE', '( BMREAD, BMWRITE, BMREADWRITE )');
+cl.addTypeS('TDATAOPERATION', 'Procedure');
+cl.addTypeS('TDATASETNOTIFYEVENT', 'Procedure ( DATASET : TDATASET)');
+cl.addTypeS('TDATASETERROREVENT', 'Procedure ( DATASET : TDATASET; E : TObject'
+ +'; var ACTION : TDATAACTION)');
+cl.addTypeS('TFILTERRECORDEVENT', 'Procedure ( DATASET : TDATASET; var ACCEP'
+ +'T : BOOLEAN)');
+SIRegisterTDATASET(Cl);
+end;
+
+{$IFDEF USEIMPORTER}
+initialization
+CIImporter.AddCallBack(@SIRegister_DB,PT_ClassImport);
+{$ENDIF}
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_buttons.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_buttons.pas
new file mode 100644
index 0000000..52c0873
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_buttons.pas
@@ -0,0 +1,87 @@
+{ Compiletime Buttons support }
+unit uPSC_buttons;
+{$I PascalScript.inc}
+interface
+uses
+ uPSCompiler, uPSUtils;
+
+{
+ Will register files from:
+ Buttons
+
+ Requires
+ STD, classes, controls and graphics and StdCtrls
+}
+procedure SIRegister_Buttons_TypesAndConsts(Cl: TPSPascalCompiler);
+
+procedure SIRegisterTSPEEDBUTTON(Cl: TPSPascalCompiler);
+procedure SIRegisterTBITBTN(Cl: TPSPascalCompiler);
+
+procedure SIRegister_Buttons(Cl: TPSPascalCompiler);
+
+implementation
+
+procedure SIRegisterTSPEEDBUTTON(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TGRAPHICCONTROL'), 'TSPEEDBUTTON') do
+ begin
+ RegisterProperty('ALLOWALLUP', 'BOOLEAN', iptrw);
+ RegisterProperty('GROUPINDEX', 'INTEGER', iptrw);
+ RegisterProperty('DOWN', 'BOOLEAN', iptrw);
+ RegisterProperty('CAPTION', 'String', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('GLYPH', 'TBITMAP', iptrw);
+ RegisterProperty('LAYOUT', 'TBUTTONLAYOUT', iptrw);
+ RegisterProperty('MARGIN', 'INTEGER', iptrw);
+ RegisterProperty('NUMGLYPHS', 'BYTE', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('SPACING', 'INTEGER', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ end;
+end;
+
+procedure SIRegisterTBITBTN(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TBUTTON'), 'TBITBTN') do
+ begin
+ RegisterProperty('GLYPH', 'TBITMAP', iptrw);
+ RegisterProperty('KIND', 'TBITBTNKIND', iptrw);
+ RegisterProperty('LAYOUT', 'TBUTTONLAYOUT', iptrw);
+ RegisterProperty('MARGIN', 'INTEGER', iptrw);
+ RegisterProperty('NUMGLYPHS', 'BYTE', iptrw);
+ RegisterProperty('STYLE', 'TBUTTONSTYLE', iptrw);
+ RegisterProperty('SPACING', 'INTEGER', iptrw);
+ end;
+end;
+
+
+
+procedure SIRegister_Buttons_TypesAndConsts(Cl: TPSPascalCompiler);
+begin
+ Cl.AddTypeS('TButtonLayout', '(blGlyphLeft, blGlyphRight, blGlyphTop, blGlyphBottom)');
+ Cl.AddTypeS('TButtonState', '(bsUp, bsDisabled, bsDown, bsExclusive)');
+ Cl.AddTypeS('TButtonStyle', '(bsAutoDetect, bsWin31, bsNew)');
+ Cl.AddTypeS('TBitBtnKind', '(bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose, bkAbort, bkRetry, bkIgnore, bkAll)');
+
+end;
+
+procedure SIRegister_Buttons(Cl: TPSPascalCompiler);
+begin
+ SIRegister_Buttons_TypesAndConsts(cl);
+ SIRegisterTSPEEDBUTTON(cl);
+ SIRegisterTBITBTN(cl);
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+
+end.
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_classes.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_classes.pas
new file mode 100644
index 0000000..ff86334
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_classes.pas
@@ -0,0 +1,320 @@
+{ Compiletime Classes support }
+unit uPSC_classes;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSCompiler, uPSUtils;
+
+{
+ Will register files from:
+ Classes (exception TPersistent and TComponent)
+
+ Register STD first
+
+}
+
+procedure SIRegister_Classes_TypesAndConsts(Cl: TPSPascalCompiler);
+
+procedure SIRegisterTStrings(cl: TPSPascalCompiler; Streams: Boolean);
+procedure SIRegisterTStringList(cl: TPSPascalCompiler);
+{$IFNDEF PS_MINIVCL}
+procedure SIRegisterTBITS(Cl: TPSPascalCompiler);
+{$ENDIF}
+procedure SIRegisterTSTREAM(Cl: TPSPascalCompiler);
+procedure SIRegisterTHANDLESTREAM(Cl: TPSPascalCompiler);
+{$IFNDEF PS_MINIVCL}
+procedure SIRegisterTMEMORYSTREAM(Cl: TPSPascalCompiler);
+{$ENDIF}
+procedure SIRegisterTFILESTREAM(Cl: TPSPascalCompiler);
+{$IFNDEF PS_MINIVCL}
+procedure SIRegisterTCUSTOMMEMORYSTREAM(Cl: TPSPascalCompiler);
+procedure SIRegisterTRESOURCESTREAM(Cl: TPSPascalCompiler);
+procedure SIRegisterTPARSER(Cl: TPSPascalCompiler);
+procedure SIRegisterTCOLLECTIONITEM(CL: TPSPascalCompiler);
+procedure SIRegisterTCOLLECTION(CL: TPSPascalCompiler);
+{$IFDEF DELPHI3UP}
+procedure SIRegisterTOWNEDCOLLECTION(CL: TPSPascalCompiler);
+{$ENDIF}
+{$ENDIF}
+
+procedure SIRegister_Classes(Cl: TPSPascalCompiler; Streams: Boolean{$IFDEF D4PLUS}=True{$ENDIF});
+
+implementation
+
+procedure SIRegisterTStrings(cl: TPSPascalCompiler; Streams: Boolean); // requires TPersistent
+begin
+ with Cl.AddClassN(cl.FindClass('TPersistent'), 'TStrings') do
+ begin
+ IsAbstract := True;
+ RegisterMethod('function Add(S: string): Integer;');
+ RegisterMethod('procedure Append(S: string);');
+ RegisterMethod('procedure AddStrings(Strings: TStrings);');
+ RegisterMethod('procedure Clear;');
+ RegisterMethod('procedure Delete(Index: Integer);');
+ RegisterMethod('function IndexOf(const S: string): Integer; ');
+ RegisterMethod('procedure Insert(Index: Integer; S: string); ');
+ RegisterProperty('Count', 'Integer', iptR);
+ RegisterProperty('Text', 'String', iptrw);
+ RegisterProperty('CommaText', 'String', iptrw);
+ if Streams then
+ begin
+ RegisterMethod('procedure LoadFromFile(FileName: string); ');
+ RegisterMethod('procedure SaveToFile(FileName: string); ');
+ end;
+ RegisterProperty('Strings', 'String Integer', iptRW);
+ SetDefaultPropery('Strings');
+ RegisterProperty('Objects', 'TObject Integer', iptRW);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod('procedure BeginUpdate;');
+ RegisterMethod('procedure EndUpdate;');
+ RegisterMethod('function Equals(Strings: TStrings): Boolean;');
+ RegisterMethod('procedure Exchange(Index1, Index2: Integer);');
+ RegisterMethod('function IndexOfName(Name: string): Integer;');
+ if Streams then
+ RegisterMethod('procedure LoadFromStream(Stream: TStream); ');
+ RegisterMethod('procedure Move(CurIndex, NewIndex: Integer); ');
+ if Streams then
+ RegisterMethod('procedure SaveToStream(Stream: TStream); ');
+ RegisterMethod('procedure SetText(Text: PChar); ');
+ RegisterProperty('Names', 'String Integer', iptr);
+ RegisterProperty('Values', 'String String', iptRW);
+ RegisterMethod('function AddObject(S:String;AObject:TObject):integer');
+ RegisterMethod('function GetText:PChar');
+ RegisterMethod('function IndexofObject(AObject:tObject):Integer');
+ RegisterMethod('procedure InsertObject(Index:Integer;S:String;AObject:TObject)');
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegisterTSTRINGLIST(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TStrings'), 'TStringList') do
+ begin
+ RegisterMethod('function Find(S:String;var Index:Integer):Boolean');
+ RegisterMethod('procedure Sort');
+ RegisterProperty('Duplicates', 'TDuplicates', iptrw);
+ RegisterProperty('Sorted', 'Boolean', iptrw);
+ RegisterProperty('OnChange', 'TNotifyEvent', iptrw);
+ RegisterProperty('OnChanging', 'TNotifyEvent', iptrw);
+ end;
+end;
+
+{$IFNDEF PS_MINIVCL}
+procedure SIRegisterTBITS(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TObject'), 'TBits') do
+ begin
+ RegisterMethod('function OpenBit:Integer');
+ RegisterProperty('Bits', 'Boolean Integer', iptrw);
+ RegisterProperty('Size', 'Integer', iptrw);
+ end;
+end;
+{$ENDIF}
+
+procedure SIRegisterTSTREAM(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TOBJECT'), 'TStream') do
+ begin
+ IsAbstract := True;
+ RegisterMethod('function Read(Buffer:String;Count:LongInt):LongInt');
+ RegisterMethod('function Write(Buffer:String;Count:LongInt):LongInt');
+ RegisterMethod('function Seek(Offset:LongInt;Origin:Word):LongInt');
+ RegisterMethod('procedure ReadBuffer(Buffer:String;Count:LongInt)');
+ RegisterMethod('procedure WriteBuffer(Buffer:String;Count:LongInt)');
+ {$IFDEF DELPHI4UP}
+ RegisterMethod('function CopyFrom(Source:TStream;Count:Int64):LongInt');
+ {$ELSE}
+ RegisterMethod('function CopyFrom(Source:TStream;Count:Integer):LongInt');
+ {$ENDIF}
+ RegisterProperty('Position', 'LongInt', iptrw);
+ RegisterProperty('Size', 'LongInt', iptrw);
+ end;
+end;
+
+procedure SIRegisterTHANDLESTREAM(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TSTREAM'), 'THandleStream') do
+ begin
+ RegisterMethod('constructor Create(AHandle:Integer)');
+ RegisterProperty('Handle', 'Integer', iptr);
+ end;
+end;
+
+{$IFNDEF PS_MINIVCL}
+procedure SIRegisterTMEMORYSTREAM(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMMEMORYSTREAM'), 'TMemoryStream') do
+ begin
+ RegisterMethod('procedure Clear');
+ RegisterMethod('procedure LoadFromStream(Stream:TStream)');
+ RegisterMethod('procedure LoadFromFile(FileName:String)');
+ RegisterMethod('procedure SetSize(NewSize:LongInt)');
+ end;
+end;
+{$ENDIF}
+
+procedure SIRegisterTFILESTREAM(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('THandleStream'), 'TFileStream') do
+ begin
+ RegisterMethod('constructor Create(FileName:String;Mode:Word)');
+ end;
+end;
+
+{$IFNDEF PS_MINIVCL}
+procedure SIRegisterTCUSTOMMEMORYSTREAM(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TSTREAM'), 'TCustomMemoryStream') do
+ begin
+ IsAbstract := True;
+ RegisterMethod('procedure SaveToStream(Stream:TStream)');
+ RegisterMethod('procedure SaveToFile(FileName:String)');
+ end;
+end;
+
+procedure SIRegisterTRESOURCESTREAM(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMMEMORYSTREAM'), 'TResourceStream') do
+ begin
+ RegisterMethod('constructor Create(Instance:THandle;ResName:String;ResType:PChar)');
+ RegisterMethod('constructor CreateFromId(Instance:THandle;ResId:Integer;ResType:PChar)');
+ end;
+end;
+
+procedure SIRegisterTPARSER(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TOBJECT'), 'TParser') do
+ begin
+ RegisterMethod('constructor Create(Stream:TStream)');
+ RegisterMethod('procedure CheckToken(t:char)');
+ RegisterMethod('procedure CheckTokenSymbol(s:string)');
+ RegisterMethod('procedure Error(Ident:Integer)');
+ RegisterMethod('procedure ErrorStr(Message:String)');
+ RegisterMethod('procedure HexToBinary(Stream:TStream)');
+ RegisterMethod('function NextToken:Char');
+ RegisterMethod('function SourcePos:LongInt');
+ RegisterMethod('function TokenComponentIdent:String');
+ RegisterMethod('function TokenFloat:Extended');
+ RegisterMethod('function TokenInt:LongInt');
+ RegisterMethod('function TokenString:String');
+ RegisterMethod('function TokenSymbolIs(S:String):Boolean');
+ RegisterProperty('SourceLine', 'Integer', iptr);
+ RegisterProperty('Token', 'Char', iptr);
+ end;
+end;
+
+procedure SIRegisterTCOLLECTIONITEM(CL: TPSPascalCompiler);
+Begin
+ if cl.FindClass('TCOLLECTION') = nil then cl.AddClassN(cl.FindClass('TPERSISTENT'), 'TCollection');
+ With cl.AddClassN(cl.FindClass('TPERSISTENT'),'TCollectionItem') do
+ begin
+ RegisterMethod('Constructor Create( Collection : TCollection)');
+ RegisterProperty('Collection', 'TCollection', iptrw);
+{$IFDEF DELPHI3UP} RegisterProperty('Id', 'Integer', iptr); {$ENDIF}
+ RegisterProperty('Index', 'Integer', iptrw);
+{$IFDEF DELPHI3UP} RegisterProperty('DisplayName', 'String', iptrw); {$ENDIF}
+ end;
+end;
+
+procedure SIRegisterTCOLLECTION(CL: TPSPascalCompiler);
+var
+ cr: TPSCompileTimeClass;
+Begin
+ cr := CL.FindClass('TCOLLECTION');
+ if cr = nil then cr := cl.AddClassN(cl.FindClass('TPERSISTENT'), 'TCollection');
+With cr do
+ begin
+// RegisterMethod('constructor Create( ItemClass : TCollectionItemClass)');
+{$IFDEF DELPHI3UP} RegisterMethod('function Owner : TPersistent'); {$ENDIF}
+ RegisterMethod('function Add : TCollectionItem');
+ RegisterMethod('procedure BeginUpdate');
+ RegisterMethod('procedure Clear');
+{$IFDEF DELPHI5UP} RegisterMethod('procedure Delete( Index : Integer)'); {$ENDIF}
+ RegisterMethod('procedure EndUpdate');
+{$IFDEF DELPHI3UP} RegisterMethod('function FindItemId( Id : Integer) : TCollectionItem'); {$ENDIF}
+{$IFDEF DELPHI3UP} RegisterMethod('function Insert( Index : Integer) : TCollectionItem'); {$ENDIF}
+ RegisterProperty('Count', 'Integer', iptr);
+{$IFDEF DELPHI3UP} RegisterProperty('ItemClass', 'TCollectionItemClass', iptr); {$ENDIF}
+ RegisterProperty('Items', 'TCollectionItem Integer', iptrw);
+ end;
+end;
+
+{$IFDEF DELPHI3UP}
+procedure SIRegisterTOWNEDCOLLECTION(CL: TPSPascalCompiler);
+Begin
+With Cl.AddClassN(cl.FindClass('TCOLLECTION'),'TOwnedCollection') do
+ begin
+// RegisterMethod('Constructor CREATE( AOWNER : TPERSISTENT; ITEMCLASS : TCOLLECTIONITEMCLASS)');
+ end;
+end;
+{$ENDIF}
+{$ENDIF}
+
+procedure SIRegister_Classes_TypesAndConsts(Cl: TPSPascalCompiler);
+begin
+ cl.AddConstantN('soFromBeginning', 'Longint').Value.ts32 := 0;
+ cl.AddConstantN('soFromCurrent', 'Longint').Value.ts32 := 1;
+ cl.AddConstantN('soFromEnd', 'Longint').Value.ts32 := 2;
+ cl.AddConstantN('toEOF', 'Char').SetString(#0);
+ cl.AddConstantN('toSymbol', 'Char').SetString(#1);
+ cl.AddConstantN('toString', 'Char').SetString(#2);
+ cl.AddConstantN('toInteger', 'Char').SetString(#3);
+ cl.AddConstantN('toFloat', 'Char').SetString(#4);
+ cl.AddConstantN('fmCreate', 'Longint').Value.ts32 := $FFFF;
+ cl.AddConstantN('fmOpenRead', 'Longint').Value.ts32 := 0;
+ cl.AddConstantN('fmOpenWrite', 'Longint').Value.ts32 := 1;
+ cl.AddConstantN('fmOpenReadWrite', 'Longint').Value.ts32 := 2;
+ cl.AddConstantN('fmShareCompat', 'Longint').Value.ts32 := 0;
+ cl.AddConstantN('fmShareExclusive', 'Longint').Value.ts32 := $10;
+ cl.AddConstantN('fmShareDenyWrite', 'Longint').Value.ts32 := $20;
+ cl.AddConstantN('fmShareDenyRead', 'Longint').Value.ts32 := $30;
+ cl.AddConstantN('fmShareDenyNone', 'Longint').Value.ts32 := $40;
+ cl.AddConstantN('SecsPerDay', 'Longint').Value.ts32 := 86400;
+ cl.AddConstantN('MSecPerDay', 'Longint').Value.ts32 := 86400000;
+ cl.AddConstantN('DateDelta', 'Longint').Value.ts32 := 693594;
+ cl.AddTypeS('TAlignment', '(taLeftJustify, taRightJustify, taCenter)');
+ cl.AddTypeS('THelpEvent', 'function (Command: Word; Data: Longint; var CallHelp: Boolean): Boolean');
+ cl.AddTypeS('TGetStrProc', 'procedure(const S: string)');
+ cl.AddTypeS('TDuplicates', '(dupIgnore, dupAccept, dupError)');
+ cl.AddTypeS('TOperation', '(opInsert, opRemove)');
+ cl.AddTypeS('THANDLE', 'Longint');
+
+ cl.AddTypeS('TNotifyEvent', 'procedure (Sender: TObject)');
+end;
+
+procedure SIRegister_Classes(Cl: TPSPascalCompiler; Streams: Boolean);
+begin
+ SIRegister_Classes_TypesAndConsts(Cl);
+ if Streams then
+ SIRegisterTSTREAM(Cl);
+ SIRegisterTStrings(cl, Streams);
+ SIRegisterTStringList(cl);
+ {$IFNDEF PS_MINIVCL}
+ SIRegisterTBITS(cl);
+ {$ENDIF}
+ if Streams then
+ begin
+ SIRegisterTHANDLESTREAM(Cl);
+ SIRegisterTFILESTREAM(Cl);
+ {$IFNDEF PS_MINIVCL}
+ SIRegisterTCUSTOMMEMORYSTREAM(Cl);
+ SIRegisterTMEMORYSTREAM(Cl);
+ SIRegisterTRESOURCESTREAM(Cl);
+ {$ENDIF}
+ end;
+ {$IFNDEF PS_MINIVCL}
+ SIRegisterTPARSER(Cl);
+ SIRegisterTCOLLECTIONITEM(Cl);
+ SIRegisterTCOLLECTION(Cl);
+ {$IFDEF DELPHI3UP}
+ SIRegisterTOWNEDCOLLECTION(Cl);
+ {$ENDIF}
+ {$ENDIF}
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_comobj.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_comobj.pas
new file mode 100644
index 0000000..b436468
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_comobj.pas
@@ -0,0 +1,39 @@
+{ compiletime ComObj support }
+unit uPSC_comobj;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSCompiler, uPSUtils;
+
+{
+
+Will register:
+
+function CreateOleObject(const ClassName: String): IDispatch;
+function GetActiveOleObject(const ClassName: String): IDispatch;
+
+}
+
+procedure SIRegister_ComObj(cl: TPSPascalCompiler);
+
+implementation
+
+procedure SIRegister_ComObj(cl: TPSPascalCompiler);
+begin
+ cl.AddTypeS('HResult', 'LongInt');
+ cl.AddTypeS('TGUID', 'record D1: LongWord; D2: Word; D3: Word; D4: array[0..7] of Byte; end;');
+ cl.AddTypeS('TCLSID', 'TGUID');
+ cl.AddTypeS('TIID', 'TGUID');
+ cl.AddDelphiFunction('procedure OleCheck(Result: HResult);');
+{$IFNDEF PS_NOINTERFACES}
+{$IFDEF DELPHI3UP}
+ cl.AddDelphiFunction('function StringToGUID(const S: string): TGUID;');
+ cl.AddDelphiFunction('function CreateComObject(const ClassID: TGUID): IUnknown;');
+{$ENDIF}
+{$ENDIF}
+ cl.AddDelphiFunction('function CreateOleObject(const ClassName: String): IDispatch;');
+ cl.AddDelphiFunction('function GetActiveOleObject(const ClassName: String): IDispatch;');
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_controls.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_controls.pas
new file mode 100644
index 0000000..14d734b
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_controls.pas
@@ -0,0 +1,236 @@
+{ Compiletime Controls support }
+unit uPSC_controls;
+{$I PascalScript.inc}
+interface
+uses
+ uPSCompiler, uPSUtils;
+
+{
+ Will register files from:
+ Controls
+
+ Register the STD, Classes (at least the types&consts) and Graphics libraries first
+
+}
+
+procedure SIRegister_Controls_TypesAndConsts(Cl: TPSPascalCompiler);
+
+procedure SIRegisterTControl(Cl: TPSPascalCompiler);
+procedure SIRegisterTWinControl(Cl: TPSPascalCompiler);
+procedure SIRegisterTGraphicControl(cl: TPSPascalCompiler);
+procedure SIRegisterTCustomControl(cl: TPSPascalCompiler);
+procedure SIRegisterTDragObject(cl: TPSPascalCompiler);
+
+procedure SIRegister_Controls(Cl: TPSPascalCompiler);
+
+
+implementation
+
+procedure SIRegisterTControl(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TComponent'), 'TCONTROL') do
+ begin
+ RegisterMethod('constructor Create(AOwner: TComponent);');
+ RegisterMethod('procedure BringToFront;');
+ RegisterMethod('procedure Hide;');
+ RegisterMethod('procedure Invalidate;virtual;');
+ RegisterMethod('procedure refresh;');
+ RegisterMethod('procedure Repaint;virtual;');
+ RegisterMethod('procedure SendToBack;');
+ RegisterMethod('procedure Show;');
+ RegisterMethod('procedure Update;virtual;');
+ RegisterMethod('procedure SetBounds(x,y,w,h: Integer);virtual;');
+ RegisterProperty('Left', 'Integer', iptRW);
+ RegisterProperty('Top', 'Integer', iptRW);
+ RegisterProperty('Width', 'Integer', iptRW);
+ RegisterProperty('Height', 'Integer', iptRW);
+ RegisterProperty('Hint', 'String', iptRW);
+ RegisterProperty('Align', 'TAlign', iptRW);
+ RegisterProperty('ClientHeight', 'Longint', iptRW);
+ RegisterProperty('ClientWidth', 'Longint', iptRW);
+ RegisterProperty('ShowHint', 'Boolean', iptRW);
+ RegisterProperty('Visible', 'Boolean', iptRW);
+ RegisterProperty('ENABLED', 'BOOLEAN', iptrw);
+ RegisterProperty('CURSOR', 'TCURSOR', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod('function Dragging: Boolean;');
+ RegisterMethod('function HasParent: Boolean');
+ RegisterMethod('procedure BEGINDRAG(IMMEDIATE:BOOLEAN)');
+ RegisterMethod('function CLIENTTOSCREEN(POINT:TPOINT):TPOINT');
+ RegisterMethod('procedure ENDDRAG(DROP:BOOLEAN)');
+ {$IFNDEF CLX}
+ RegisterMethod('function GETTEXTBUF(BUFFER:PCHAR;BUFSIZE:INTEGER):INTEGER');
+ RegisterMethod('function GETTEXTLEN:INTEGER');
+ RegisterMethod('procedure SETTEXTBUF(BUFFER:PCHAR)');
+ RegisterMethod('function PERFORM(MSG:CARDINAL;WPARAM,LPARAM:LONGINT):LONGINT');
+ {$ENDIF}
+ RegisterMethod('function SCREENTOCLIENT(POINT:TPOINT):TPOINT');
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegisterTWinControl(Cl: TPSPascalCompiler); // requires TControl
+begin
+ with Cl.AddClassN(cl.FindClass('TControl'), 'TWINCONTROL') do
+ begin
+
+ with Cl.FindClass('TControl') do
+ begin
+ RegisterProperty('Parent', 'TWinControl', iptRW);
+ end;
+
+ {$IFNDEF CLX}
+ RegisterProperty('Handle', 'Longint', iptR);
+ {$ENDIF}
+ RegisterProperty('Showing', 'Boolean', iptR);
+ RegisterProperty('TabOrder', 'Integer', iptRW);
+ RegisterProperty('TabStop', 'Boolean', iptRW);
+ RegisterMethod('function CANFOCUS:BOOLEAN');
+ RegisterMethod('function FOCUSED:BOOLEAN');
+ RegisterProperty('CONTROLS', 'TCONTROL INTEGER', iptr);
+ RegisterProperty('CONTROLCOUNT', 'INTEGER', iptr);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod('function HandleAllocated: Boolean;');
+ RegisterMethod('procedure HandleNeeded;');
+ RegisterMethod('procedure EnableAlign;');
+ RegisterMethod('procedure RemoveControl(AControl: TControl);');
+ RegisterMethod('procedure InsertControl(AControl: TControl);');
+ RegisterMethod('procedure Realign;');
+ RegisterMethod('procedure ScaleBy(M, D: Integer);');
+ RegisterMethod('procedure ScrollBy(DeltaX, DeltaY: Integer);');
+ RegisterMethod('procedure SetFocus; virtual;');
+ {$IFNDEF CLX}
+ RegisterMethod('procedure PAINTTO(DC:Longint;X,Y:INTEGER)');
+ {$ENDIF}
+
+ RegisterMethod('function CONTAINSCONTROL(CONTROL:TCONTROL):BOOLEAN');
+ RegisterMethod('procedure DISABLEALIGN');
+ RegisterMethod('procedure UPDATECONTROLSTATE');
+
+ RegisterProperty('BRUSH', 'TBRUSH', iptr);
+ RegisterProperty('HELPCONTEXT', 'LONGINT', iptrw);
+ {$ENDIF}
+ end;
+end;
+procedure SIRegisterTGraphicControl(cl: TPSPascalCompiler); // requires TControl
+begin
+ Cl.AddClassN(cl.FindClass('TControl'), 'TGRAPHICCONTROL');
+end;
+
+procedure SIRegisterTCustomControl(cl: TPSPascalCompiler); // requires TWinControl
+begin
+ Cl.AddClassN(cl.FindClass('TWinControl'), 'TCUSTOMCONTROL');
+end;
+
+procedure SIRegister_Controls_TypesAndConsts(Cl: TPSPascalCompiler);
+begin
+{$IFNDEF FPC}
+ Cl.addTypeS('TEShiftState','(ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble)');
+ {$ELSE}
+ Cl.addTypeS('TEShiftState','(ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble,' +
+ 'ssMeta, ssSuper, ssHyper, ssAltGr, ssCaps, ssNum,ssScroll,ssTriple,ssQuad)');
+ {$ENDIF}
+ Cl.addTypeS('TShiftState','set of TEShiftState');
+ cl.AddTypeS('TMouseButton', '(mbLeft, mbRight, mbMiddle)');
+ cl.AddTypeS('TDragMode', '(dmManual, dmAutomatic)');
+ cl.AddTypeS('TDragState', '(dsDragEnter, dsDragLeave, dsDragMove)');
+ cl.AddTypeS('TDragKind', '(dkDrag, dkDock)');
+ cl.AddTypeS('TMouseEvent', 'procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);');
+ cl.AddTypeS('TMouseMoveEvent', 'procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer);');
+ cl.AddTypeS('TKeyEvent', 'procedure (Sender: TObject; var Key: Word; Shift: TShiftState);');
+ cl.AddTypeS('TKeyPressEvent', 'procedure(Sender: TObject; var Key: Char);');
+ cl.AddTypeS('TDragOverEvent', 'procedure(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean)');
+ cl.AddTypeS('TDragDropEvent', 'procedure(Sender, Source: TObject;X, Y: Integer)');
+ cl.AddTypeS('HWND', 'Longint');
+
+ cl.AddTypeS('TEndDragEvent', 'procedure(Sender, Target: TObject; X, Y: Integer)');
+
+ cl.addTypeS('TAlign', '(alNone, alTop, alBottom, alLeft, alRight, alClient)');
+
+ cl.addTypeS('TAnchorKind', '(akTop, akLeft, akRight, akBottom)');
+ cl.addTypeS('TAnchors','set of TAnchorKind');
+ cl.AddTypeS('TModalResult', 'Integer');
+ cl.AddTypeS('TCursor', 'Integer');
+ cl.AddTypeS('TPoint', 'record x,y: Longint; end;');
+
+ cl.AddConstantN('mrNone', 'Integer').Value.ts32 := 0;
+ cl.AddConstantN('mrOk', 'Integer').Value.ts32 := 1;
+ cl.AddConstantN('mrCancel', 'Integer').Value.ts32 := 2;
+ cl.AddConstantN('mrAbort', 'Integer').Value.ts32 := 3;
+ cl.AddConstantN('mrRetry', 'Integer').Value.ts32 := 4;
+ cl.AddConstantN('mrIgnore', 'Integer').Value.ts32 := 5;
+ cl.AddConstantN('mrYes', 'Integer').Value.ts32 := 6;
+ cl.AddConstantN('mrNo', 'Integer').Value.ts32 := 7;
+ cl.AddConstantN('mrAll', 'Integer').Value.ts32 := 8;
+ cl.AddConstantN('mrNoToAll', 'Integer').Value.ts32 := 9;
+ cl.AddConstantN('mrYesToAll', 'Integer').Value.ts32 := 10;
+ cl.AddConstantN('crDefault', 'Integer').Value.ts32 := 0;
+ cl.AddConstantN('crNone', 'Integer').Value.ts32 := -1;
+ cl.AddConstantN('crArrow', 'Integer').Value.ts32 := -2;
+ cl.AddConstantN('crCross', 'Integer').Value.ts32 := -3;
+ cl.AddConstantN('crIBeam', 'Integer').Value.ts32 := -4;
+ cl.AddConstantN('crSizeNESW', 'Integer').Value.ts32 := -6;
+ cl.AddConstantN('crSizeNS', 'Integer').Value.ts32 := -7;
+ cl.AddConstantN('crSizeNWSE', 'Integer').Value.ts32 := -8;
+ cl.AddConstantN('crSizeWE', 'Integer').Value.ts32 := -9;
+ cl.AddConstantN('crUpArrow', 'Integer').Value.ts32 := -10;
+ cl.AddConstantN('crHourGlass', 'Integer').Value.ts32 := -11;
+ cl.AddConstantN('crDrag', 'Integer').Value.ts32 := -12;
+ cl.AddConstantN('crNoDrop', 'Integer').Value.ts32 := -13;
+ cl.AddConstantN('crHSplit', 'Integer').Value.ts32 := -14;
+ cl.AddConstantN('crVSplit', 'Integer').Value.ts32 := -15;
+ cl.AddConstantN('crMultiDrag', 'Integer').Value.ts32 := -16;
+ cl.AddConstantN('crSQLWait', 'Integer').Value.ts32 := -17;
+ cl.AddConstantN('crNo', 'Integer').Value.ts32 := -18;
+ cl.AddConstantN('crAppStart', 'Integer').Value.ts32 := -19;
+ cl.AddConstantN('crHelp', 'Integer').Value.ts32 := -20;
+{$IFDEF DELPHI3UP}
+ cl.AddConstantN('crHandPoint', 'Integer').Value.ts32 := -21;
+{$ENDIF}
+{$IFDEF DELPHI4UP}
+ cl.AddConstantN('crSizeAll', 'Integer').Value.ts32 := -22;
+{$ENDIF}
+end;
+
+procedure SIRegisterTDragObject(cl: TPSPascalCompiler);
+begin
+ with CL.AddClassN(CL.FindClass('TObject'),'TDragObject') do
+ begin
+{$IFNDEF PS_MINIVCL}
+{$IFDEF DELPHI4UP}
+ RegisterMethod('Procedure Assign( Source : TDragObject)');
+{$ENDIF}
+{$IFNDEF FPC}
+ RegisterMethod('Function GetName : String');
+ RegisterMethod('Function Instance : Longint');
+{$ENDIF}
+ RegisterMethod('Procedure HideDragImage');
+ RegisterMethod('Procedure ShowDragImage');
+{$IFDEF DELPHI4UP}
+ RegisterProperty('Cancelling', 'Boolean', iptrw);
+ RegisterProperty('DragHandle', 'Longint', iptrw);
+ RegisterProperty('DragPos', 'TPoint', iptrw);
+ RegisterProperty('DragTargetPos', 'TPoint', iptrw);
+ RegisterProperty('MouseDeltaX', 'Double', iptr);
+ RegisterProperty('MouseDeltaY', 'Double', iptr);
+{$ENDIF}
+{$ENDIF}
+ end;
+ Cl.AddTypeS('TStartDragEvent', 'procedure (Sender: TObject; var DragObject: TDragObject)');
+end;
+
+procedure SIRegister_Controls(Cl: TPSPascalCompiler);
+begin
+ SIRegister_Controls_TypesAndConsts(cl);
+ SIRegisterTDragObject(cl);
+ SIRegisterTControl(Cl);
+ SIRegisterTWinControl(Cl);
+ SIRegisterTGraphicControl(cl);
+ SIRegisterTCustomControl(cl);
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_dateutils.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_dateutils.pas
new file mode 100644
index 0000000..f6213c7
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_dateutils.pas
@@ -0,0 +1,34 @@
+{ Compile time Date Time library }
+unit uPSC_dateutils;
+
+interface
+uses
+ SysUtils, uPSCompiler, uPSUtils;
+
+
+procedure RegisterDateTimeLibrary_C(S: TPSPascalCompiler);
+
+implementation
+
+procedure RegisterDatetimeLibrary_C(S: TPSPascalCompiler);
+begin
+ s.AddType('TDateTime', btDouble).ExportName := True;
+ s.AddDelphiFunction('function EncodeDate(Year, Month, Day: Word): TDateTime;');
+ s.AddDelphiFunction('function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;');
+ s.AddDelphiFunction('function TryEncodeDate(Year, Month, Day: Word; var Date: TDateTime): Boolean;');
+ s.AddDelphiFunction('function TryEncodeTime(Hour, Min, Sec, MSec: Word; var Time: TDateTime): Boolean;');
+ s.AddDelphiFunction('procedure DecodeDate(const DateTime: TDateTime; var Year, Month, Day: Word);');
+ s.AddDelphiFunction('procedure DecodeTime(const DateTime: TDateTime; var Hour, Min, Sec, MSec: Word);');
+ s.AddDelphiFunction('function DayOfWeek(const DateTime: TDateTime): Word;');
+ s.AddDelphiFunction('function Date: TDateTime;');
+ s.AddDelphiFunction('function Time: TDateTime;');
+ s.AddDelphiFunction('function Now: TDateTime;');
+ s.AddDelphiFunction('function DateTimeToUnix(D: TDateTime): Int64;');
+ s.AddDelphiFunction('function UnixToDateTime(U: Int64): TDateTime;');
+
+ s.AddDelphiFunction('function DateToStr(D: TDateTime): String;');
+ s.AddDelphiFunction('function StrToDate(const s: String): TDateTime;');
+ s.AddDelphiFunction('function FormatDateTime(const fmt: String; D: TDateTime): String;');
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_dll.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_dll.pas
new file mode 100644
index 0000000..dd5fcd6
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_dll.pas
@@ -0,0 +1,158 @@
+{ Compiletime DLL importing support }
+unit uPSC_dll;
+
+{$I PascalScript.inc}
+interface
+{
+
+ Function FindWindow(c1, c2: PChar): Cardinal; external 'FindWindow@user32.dll stdcall';
+
+}
+uses
+ uPSCompiler, uPSUtils;
+
+
+{$IFDEF DELPHI3UP }
+resourceString
+{$ELSE }
+const
+{$ENDIF }
+
+ RPS_Invalid_External = 'Invalid External';
+ RPS_InvalidCallingConvention = 'Invalid Calling Convention';
+
+
+
+function DllExternalProc(Sender: TPSPascalCompiler; Decl: TPSParametersDecl; const OriginalName, FExternal: tbtstring): TPSRegProc;
+type
+
+ TDllCallingConvention = (clRegister
+ , clPascal
+ , ClCdecl
+ , ClStdCall
+ );
+
+var
+ DefaultCC: TDllCallingConvention;
+
+procedure RegisterDll_Compiletime(cs: TPSPascalCompiler);
+
+implementation
+
+function rpos(ch: tbtchar; const s: tbtstring): Longint;
+var
+ i: Longint;
+begin
+ for i := length(s) downto 1 do
+ if s[i] = ch then begin Result := i; exit; end;
+ result := 0;
+end;
+
+function RemoveQuotes(s: tbtstring): tbtstring;
+begin
+ result := s;
+ if result = '' then exit;
+ if Result[1] = '"' then delete(result ,1,1);
+ if (Result <> '') and (Result[Length(result)] = '"') then delete(result, length(result), 1);
+end;
+
+function DllExternalProc(Sender: TPSPascalCompiler; Decl: TPSParametersDecl; const OriginalName, FExternal: tbtstring): TPSRegProc;
+var
+ FuncName,
+ Name,
+ FuncCC, s, s2: AnsiString;
+ CC: TDllCallingConvention;
+ DelayLoad, LoadWithAlteredSearchPath: Boolean;
+
+begin
+ Name := FastUpperCase(OriginalName);
+ DelayLoad := False;
+ LoadWithAlteredSearchPath := false;
+ FuncCC := FExternal;
+
+ if (pos(tbtChar('@'), FuncCC) = 0) then
+ begin
+ Sender.MakeError('', ecCustomError, tbtString(RPS_Invalid_External));
+ Result := nil;
+ exit;
+ end;
+ FuncName := copy(FuncCC, 1, rpos('@', FuncCC)-1)+#0;
+ delete(FuncCc, 1, length(FuncName));
+ if pos(tbtchar(' '), Funccc) <> 0 then
+ begin
+ if FuncCC[1] = '"' then
+ begin
+ Delete(FuncCC, 1, 1);
+ FuncName := RemoveQuotes(copy(FuncCC, 1, pos(tbtchar('"'), FuncCC)-1))+#0+FuncName;
+ Delete(FuncCC,1, pos(tbtchar('"'), FuncCC));
+ if (FuncCC <> '') and( FuncCC[1] = ' ') then delete(FuncCC,1,1);
+ end else
+ begin
+ FuncName := copy(FuncCc, 1, pos(tbtchar(' '),FuncCC)-1)+#0+FuncName;
+ Delete(FuncCC, 1, pos(tbtchar(' '), FuncCC));
+ end;
+ if pos(tbtchar(' '), FuncCC) > 0 then
+ begin
+ s := Copy(FuncCC, pos(tbtchar(' '), Funccc)+1, MaxInt);
+ FuncCC := FastUpperCase(Copy(FuncCC, 1, pos(tbtchar(' '), FuncCC)-1));
+ Delete(FuncCC, pos(tbtchar(' '), Funccc), MaxInt);
+ repeat
+ if pos(tbtchar(' '), s) > 0 then begin
+ s2 := Copy(s, 1, pos(tbtchar(' '), s)-1);
+ delete(s, 1, pos(tbtchar(' '), s));
+ end else begin
+ s2 := s;
+ s := '';
+ end;
+ if FastUppercase(s2) = 'DELAYLOAD' then
+ DelayLoad := True
+ {$IFNDEF LINUX}
+ else
+ if FastUppercase(s2) = 'LOADWITHALTEREDSEARCHPATH' then
+ LoadWithAlteredSearchPath := True
+ {$ENDIF}
+ else
+ begin
+ Sender.MakeError('', ecCustomError, 'Invalid External');
+ Result := nil;
+ exit;
+ end;
+ until s = '';
+
+ end else
+ FuncCC := FastUpperCase(FuncCC);
+ if FuncCC = 'STDCALL' then cc := ClStdCall else
+ if FuncCC = 'CDECL' then cc := ClCdecl else
+ if FuncCC = 'REGISTER' then cc := clRegister else
+ if FuncCC = 'PASCAL' then cc := clPascal else
+ begin
+ Sender.MakeError('', ecCustomError, tbtstring(RPS_InvalidCallingConvention));
+ Result := nil;
+ exit;
+ end;
+ end else
+ begin
+ FuncName := RemoveQuotes(FuncCC)+#0+FuncName;
+ FuncCC := '';
+ cc := DefaultCC;
+ end;
+ FuncName := 'dll:'+FuncName+tbtchar(cc)+tbtchar(bytebool(DelayLoad)) +tbtchar(bytebool(LoadWithAlteredSearchPath))+ declToBits(Decl);
+ Result := TPSRegProc.Create;
+ Result.ImportDecl := FuncName;
+ Result.Decl.Assign(Decl);
+ Result.Name := Name;
+ Result.OrgName := OriginalName;
+ Result.ExportName := False;
+end;
+
+procedure RegisterDll_Compiletime(cs: TPSPascalCompiler);
+begin
+ cs.OnExternalProc := DllExternalProc;
+ cs.AddFunction('procedure UnloadDll(s: string)');
+ cs.AddFunction('function DLLGetLastError: Longint');
+end;
+
+begin
+ DefaultCc := clRegister;
+end.
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_extctrls.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_extctrls.pas
new file mode 100644
index 0000000..785b5d3
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_extctrls.pas
@@ -0,0 +1,327 @@
+{ Compiletime Extctrls support }
+unit uPSC_extctrls;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSCompiler, uPSUtils;
+
+(*
+ Will register files from:
+ ExtCtrls
+
+Requires:
+ STD, classes, controls, graphics {$IFNDEF PS_MINIVCL}, stdctrls {$ENDIF}
+*)
+
+procedure SIRegister_ExtCtrls_TypesAndConsts(cl: TPSPascalCompiler);
+
+procedure SIRegisterTSHAPE(Cl: TPSPascalCompiler);
+procedure SIRegisterTIMAGE(Cl: TPSPascalCompiler);
+procedure SIRegisterTPAINTBOX(Cl: TPSPascalCompiler);
+procedure SIRegisterTBEVEL(Cl: TPSPascalCompiler);
+procedure SIRegisterTTIMER(Cl: TPSPascalCompiler);
+procedure SIRegisterTCUSTOMPANEL(Cl: TPSPascalCompiler);
+procedure SIRegisterTPANEL(Cl: TPSPascalCompiler);
+{$IFNDEF CLX}
+procedure SIRegisterTPAGE(Cl: TPSPascalCompiler);
+procedure SIRegisterTNOTEBOOK(Cl: TPSPascalCompiler);
+procedure SIRegisterTHEADER(Cl: TPSPascalCompiler);
+{$ENDIF}
+procedure SIRegisterTCUSTOMRADIOGROUP(Cl: TPSPascalCompiler);
+procedure SIRegisterTRADIOGROUP(Cl: TPSPascalCompiler);
+
+procedure SIRegister_ExtCtrls(cl: TPSPascalCompiler);
+
+implementation
+procedure SIRegisterTSHAPE(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TGRAPHICCONTROL'), 'TSHAPE') do
+ begin
+ RegisterProperty('BRUSH', 'TBRUSH', iptrw);
+ RegisterProperty('PEN', 'TPEN', iptrw);
+ RegisterProperty('SHAPE', 'TSHAPETYPE', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod('procedure STYLECHANGED(SENDER:TOBJECT)');
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegisterTIMAGE(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TGRAPHICCONTROL'), 'TIMAGE') do
+ begin
+ RegisterProperty('CANVAS', 'TCANVAS', iptr);
+ RegisterProperty('AUTOSIZE', 'BOOLEAN', iptrw);
+ RegisterProperty('CENTER', 'BOOLEAN', iptrw);
+ RegisterProperty('PICTURE', 'TPICTURE', iptrw);
+ RegisterProperty('STRETCH', 'BOOLEAN', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegisterTPAINTBOX(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TGRAPHICCONTROL'), 'TPAINTBOX') do
+ begin
+ RegisterProperty('CANVAS', 'TCanvas', iptr);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONPAINT', 'TNOTIFYEVENT', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegisterTBEVEL(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TGRAPHICCONTROL'), 'TBEVEL') do
+ begin
+ RegisterProperty('SHAPE', 'TBEVELSHAPE', iptrw);
+ RegisterProperty('STYLE', 'TBEVELSTYLE', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegisterTTIMER(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCOMPONENT'), 'TTIMER') do
+ begin
+ RegisterProperty('ENABLED', 'BOOLEAN', iptrw);
+ RegisterProperty('INTERVAL', 'CARDINAL', iptrw);
+ RegisterProperty('ONTIMER', 'TNOTIFYEVENT', iptrw);
+ end;
+end;
+
+procedure SIRegisterTCUSTOMPANEL(Cl: TPSPascalCompiler);
+begin
+ Cl.AddClassN(cl.FindClass('TCUSTOMCONTROL'), 'TCUSTOMPANEL');
+end;
+
+procedure SIRegisterTPANEL(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMPANEL'), 'TPANEL') do
+ begin
+ RegisterProperty('ALIGNMENT', 'TAlignment', iptrw);
+ RegisterProperty('BEVELINNER', 'TPanelBevel', iptrw);
+ RegisterProperty('BEVELOUTER', 'TPanelBevel', iptrw);
+ RegisterProperty('BEVELWIDTH', 'TBevelWidth', iptrw);
+ RegisterProperty('BORDERWIDTH', 'TBorderWidth', iptrw);
+ RegisterProperty('BORDERSTYLE', 'TBorderStyle', iptrw);
+ RegisterProperty('CAPTION', 'String', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('LOCKED', 'Boolean', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONRESIZE', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+{$IFNDEF CLX}
+procedure SIRegisterTPAGE(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMCONTROL'), 'TPAGE') do
+ begin
+ RegisterProperty('CAPTION', 'String', iptrw);
+ end;
+end;
+procedure SIRegisterTNOTEBOOK(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMCONTROL'), 'TNOTEBOOK') do
+ begin
+ RegisterProperty('ACTIVEPAGE', 'String', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('PAGEINDEX', 'INTEGER', iptrw);
+ RegisterProperty('PAGES', 'TSTRINGS', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONPAGECHANGED', 'TNOTIFYEVENT', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegisterTHEADER(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMCONTROL'), 'THEADER') do
+ begin
+ RegisterProperty('SECTIONWIDTH', 'INTEGER INTEGER', iptrw);
+ RegisterProperty('ALLOWRESIZE', 'BOOLEAN', iptrw);
+ RegisterProperty('BORDERSTYLE', 'TBORDERSTYLE', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('SECTIONS', 'TSTRINGS', iptrw);
+ RegisterProperty('ONSIZING', 'TSECTIONEVENT', iptrw);
+ RegisterProperty('ONSIZED', 'TSECTIONEVENT', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ {$ENDIF}
+ end;
+end;
+{$ENDIF}
+
+procedure SIRegisterTCUSTOMRADIOGROUP(Cl: TPSPascalCompiler);
+begin
+ Cl.AddClassN(cl.FindClass('TCUSTOMGROUPBOX'), 'TCUSTOMRADIOGROUP');
+end;
+
+procedure SIRegisterTRADIOGROUP(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMRADIOGROUP'), 'TRADIOGROUP') do
+ begin
+ RegisterProperty('CAPTION', 'String', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('COLUMNS', 'Integer', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('ITEMINDEX', 'Integer', iptrw);
+ RegisterProperty('ITEMS', 'TStrings', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegister_ExtCtrls_TypesAndConsts(cl: TPSPascalCompiler);
+begin
+ cl.AddTypeS('TShapeType', '(stRectangle, stSquare, stRoundRect, stRoundSquare, stEllipse, stCircle)');
+ cl.AddTypeS('TBevelStyle', '(bsLowered, bsRaised)');
+ cl.AddTypeS('TBevelShape', '(bsBox, bsFrame, bsTopLine, bsBottomLine, bsLeftLine, bsRightLine,bsSpacer)');
+ cl.AddTypeS('TPanelBevel', '(bvNone, bvLowered, bvRaised,bvSpace)');
+ cl.AddTypeS('TBevelWidth', 'Longint');
+ cl.AddTypeS('TBorderWidth', 'Longint');
+ cl.AddTypeS('TSectionEvent', 'procedure(Sender: TObject; ASection, AWidth: Integer)');
+end;
+
+procedure SIRegister_ExtCtrls(cl: TPSPascalCompiler);
+begin
+ SIRegister_ExtCtrls_TypesAndConsts(cl);
+
+ {$IFNDEF PS_MINIVCL}
+ SIRegisterTSHAPE(Cl);
+ SIRegisterTIMAGE(Cl);
+ SIRegisterTPAINTBOX(Cl);
+ {$ENDIF}
+ SIRegisterTBEVEL(Cl);
+ {$IFNDEF PS_MINIVCL}
+ SIRegisterTTIMER(Cl);
+ {$ENDIF}
+ SIRegisterTCUSTOMPANEL(Cl);
+ SIRegisterTPANEL(Cl);
+ {$IFNDEF PS_MINIVCL}
+ {$IFNDEF CLX}
+ SIRegisterTPAGE(Cl);
+ SIRegisterTNOTEBOOK(Cl);
+ SIRegisterTHEADER(Cl);
+ {$ENDIF}
+ SIRegisterTCUSTOMRADIOGROUP(Cl);
+ SIRegisterTRADIOGROUP(Cl);
+ {$ENDIF}
+end;
+
+end.
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_forms.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_forms.pas
new file mode 100644
index 0000000..7969094
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_forms.pas
@@ -0,0 +1,271 @@
+{ Compiletime Forms support }
+unit uPSC_forms;
+{$I PascalScript.inc}
+
+interface
+uses
+ uPSCompiler, uPSUtils;
+
+procedure SIRegister_Forms_TypesAndConsts(Cl: TPSPascalCompiler);
+
+
+procedure SIRegisterTCONTROLSCROLLBAR(Cl: TPSPascalCompiler);
+procedure SIRegisterTSCROLLINGWINCONTROL(Cl: TPSPascalCompiler);
+procedure SIRegisterTSCROLLBOX(Cl: TPSPascalCompiler);
+procedure SIRegisterTFORM(Cl: TPSPascalCompiler);
+procedure SIRegisterTAPPLICATION(Cl: TPSPascalCompiler);
+
+procedure SIRegister_Forms(Cl: TPSPascalCompiler);
+
+implementation
+
+procedure SIRegisterTCONTROLSCROLLBAR(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TPERSISTENT'), 'TCONTROLSCROLLBAR') do
+ begin
+ RegisterProperty('KIND', 'TSCROLLBARKIND', iptr);
+ RegisterProperty('SCROLLPOS', 'INTEGER', iptr);
+ RegisterProperty('MARGIN', 'WORD', iptrw);
+ RegisterProperty('INCREMENT', 'TSCROLLBARINC', iptrw);
+ RegisterProperty('RANGE', 'INTEGER', iptrw);
+ RegisterProperty('POSITION', 'INTEGER', iptrw);
+ RegisterProperty('TRACKING', 'BOOLEAN', iptrw);
+ RegisterProperty('VISIBLE', 'BOOLEAN', iptrw);
+ end;
+end;
+
+procedure SIRegisterTSCROLLINGWINCONTROL(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TWINCONTROL'), 'TSCROLLINGWINCONTROL') do
+ begin
+ RegisterMethod('procedure SCROLLINVIEW(ACONTROL:TCONTROL)');
+ RegisterProperty('HORZSCROLLBAR', 'TCONTROLSCROLLBAR', iptrw);
+ RegisterProperty('VERTSCROLLBAR', 'TCONTROLSCROLLBAR', iptrw);
+ end;
+end;
+
+procedure SIRegisterTSCROLLBOX(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TSCROLLINGWINCONTROL'), 'TSCROLLBOX') do
+ begin
+ RegisterProperty('BORDERSTYLE', 'TBORDERSTYLE', iptrw);
+ RegisterProperty('COLOR', 'TCOLOR', iptrw);
+ RegisterProperty('FONT', 'TFONT', iptrw);
+ RegisterProperty('AUTOSCROLL', 'BOOLEAN', iptrw);
+ RegisterProperty('PARENTCOLOR', 'BOOLEAN', iptrw);
+ RegisterProperty('PARENTFONT', 'BOOLEAN', iptrw);
+ RegisterProperty('ONCLICK', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONENTER', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONEXIT', 'TNOTIFYEVENT', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('ONRESIZE', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('DRAGCURSOR', 'TCURSOR', iptrw);
+ RegisterProperty('DRAGMODE', 'TDRAGMODE', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'BOOLEAN', iptrw);
+ RegisterProperty('POPUPMENU', 'TPOPUPMENU', iptrw);
+ RegisterProperty('CTL3D', 'BOOLEAN', iptrw);
+ RegisterProperty('PARENTCTL3D', 'BOOLEAN', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDRAGDROPEVENT', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDRAGOVEREVENT', iptrw);
+ RegisterProperty('ONENDDRAG', 'TENDDRAGEVENT', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMOUSEEVENT', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMOUSEMOVEEVENT', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMOUSEEVENT', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegisterTFORM(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TSCROLLINGWINCONTROL'), 'TFORM') do
+ begin
+ {$IFDEF DELPHI4UP}
+ RegisterMethod('constructor CREATENEW(AOWNER:TCOMPONENT; Dummy: Integer)');
+ {$ELSE}
+ RegisterMethod('constructor CREATENEW(AOWNER:TCOMPONENT)');
+ {$ENDIF}
+ RegisterMethod('procedure CLOSE');
+ RegisterMethod('procedure HIDE');
+ RegisterMethod('procedure SHOW');
+ RegisterMethod('function SHOWMODAL:INTEGER');
+ RegisterMethod('procedure RELEASE');
+ RegisterProperty('ACTIVE', 'BOOLEAN', iptr);
+ RegisterProperty('ACTIVECONTROL', 'TWINCONTROL', iptrw);
+ RegisterProperty('BORDERICONS', 'TBorderIcons', iptrw);
+ RegisterProperty('BORDERSTYLE', 'TFORMBORDERSTYLE', iptrw);
+ RegisterProperty('CAPTION', 'NativeString', iptrw);
+ RegisterProperty('AUTOSCROLL', 'BOOLEAN', iptrw);
+ RegisterProperty('COLOR', 'TCOLOR', iptrw);
+ RegisterProperty('FONT', 'TFONT', iptrw);
+ RegisterProperty('FORMSTYLE', 'TFORMSTYLE', iptrw);
+ RegisterProperty('KEYPREVIEW', 'BOOLEAN', iptrw);
+ RegisterProperty('POSITION', 'TPOSITION', iptrw);
+ RegisterProperty('ONACTIVATE', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONCLICK', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONCLOSE', 'TCLOSEEVENT', iptrw);
+ RegisterProperty('ONCLOSEQUERY', 'TCLOSEQUERYEVENT', iptrw);
+ RegisterProperty('ONCREATE', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONDESTROY', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONDEACTIVATE', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONHIDE', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONKEYDOWN', 'TKEYEVENT', iptrw);
+ RegisterProperty('ONKEYPRESS', 'TKEYPRESSEVENT', iptrw);
+ RegisterProperty('ONKEYUP', 'TKEYEVENT', iptrw);
+ RegisterProperty('ONRESIZE', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONSHOW', 'TNOTIFYEVENT', iptrw);
+
+
+ {$IFNDEF PS_MINIVCL}
+ {$IFNDEF CLX}
+ RegisterMethod('procedure ARRANGEICONS');
+// RegisterMethod('function GETFORMIMAGE:TBITMAP');
+ RegisterMethod('procedure PRINT');
+ RegisterMethod('procedure SENDCANCELMODE(SENDER:TCONTROL)');
+ RegisterProperty('ACTIVEOLECONTROL', 'TWINCONTROL', iptrw);
+ RegisterProperty('OLEFORMOBJECT', 'TOLEFORMOBJECT', iptrw);
+ RegisterProperty('CLIENTHANDLE', 'LONGINT', iptr);
+ RegisterProperty('TILEMODE', 'TTILEMODE', iptrw);
+ {$ENDIF}
+ RegisterMethod('procedure CASCADE');
+ RegisterMethod('function CLOSEQUERY:BOOLEAN');
+ RegisterMethod('procedure DEFOCUSCONTROL(CONTROL:TWINCONTROL;REMOVING:BOOLEAN)');
+ RegisterMethod('procedure FOCUSCONTROL(CONTROL:TWINCONTROL)');
+ RegisterMethod('procedure NEXT');
+ RegisterMethod('procedure PREVIOUS');
+ RegisterMethod('function SETFOCUSEDCONTROL(CONTROL:TWINCONTROL):BOOLEAN');
+ RegisterMethod('procedure TILE');
+ RegisterProperty('ACTIVEMDICHILD', 'TFORM', iptr);
+ RegisterProperty('CANVAS', 'TCANVAS', iptr);
+ RegisterProperty('DROPTARGET', 'BOOLEAN', iptrw);
+ RegisterProperty('MODALRESULT', 'Longint', iptrw);
+ RegisterProperty('MDICHILDCOUNT', 'INTEGER', iptr);
+ RegisterProperty('MDICHILDREN', 'TFORM INTEGER', iptr);
+ RegisterProperty('ICON', 'TICON', iptrw);
+ RegisterProperty('MENU', 'TMAINMENU', iptrw);
+ RegisterProperty('OBJECTMENUITEM', 'TMENUITEM', iptrw);
+ RegisterProperty('PIXELSPERINCH', 'INTEGER', iptrw);
+ RegisterProperty('PRINTSCALE', 'TPRINTSCALE', iptrw);
+ RegisterProperty('SCALED', 'BOOLEAN', iptrw);
+ RegisterProperty('WINDOWSTATE', 'TWINDOWSTATE', iptrw);
+ RegisterProperty('WINDOWMENU', 'TMENUITEM', iptrw);
+ RegisterProperty('CTL3D', 'BOOLEAN', iptrw);
+ RegisterProperty('POPUPMENU', 'TPOPUPMENU', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDRAGDROPEVENT', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDRAGOVEREVENT', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMOUSEEVENT', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMOUSEMOVEEVENT', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMOUSEEVENT', iptrw);
+ RegisterProperty('ONPAINT', 'TNOTIFYEVENT', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegisterTAPPLICATION(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCOMPONENT'), 'TAPPLICATION') do
+ begin
+ RegisterMethod('procedure BRINGTOFRONT');
+{$IFDEF PS_PANSICHAR}
+ RegisterMethod('function MESSAGEBOX(TEXT,CAPTION:PANSICHAR;FLAGS:WORD):INTEGER');
+{$ELSE}
+ RegisterMethod('function MESSAGEBOX(TEXT,CAPTION:PCHAR;FLAGS:WORD):INTEGER');
+{$ENDIF}
+ RegisterMethod('procedure MINIMIZE');
+ RegisterMethod('procedure PROCESSMESSAGES');
+ RegisterMethod('procedure RESTORE');
+ RegisterMethod('procedure TERMINATE');
+ RegisterProperty('ACTIVE', 'BOOLEAN', iptr);
+ RegisterProperty('EXENAME', 'NativeString', iptr);
+ {$IFNDEF CLX}
+ RegisterProperty('HANDLE', 'LONGINT', iptrw);
+ RegisterProperty('UPDATEFORMATSETTINGS', 'BOOLEAN', iptrw);
+ {$ENDIF}
+ RegisterProperty('HINT', 'NativeString', iptrw);
+ RegisterProperty('MAINFORM', 'TFORM', iptr);
+ RegisterProperty('SHOWHINT', 'BOOLEAN', iptrw);
+ RegisterProperty('SHOWMAINFORM', 'BOOLEAN', iptrw);
+ RegisterProperty('TERMINATED', 'BOOLEAN', iptr);
+ RegisterProperty('TITLE', 'NativeString', iptrw);
+ RegisterProperty('ONACTIVATE', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONDEACTIVATE', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONIDLE', 'TIDLEEVENT', iptrw);
+ RegisterProperty('ONHINT', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONMINIMIZE', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONRESTORE', 'TNOTIFYEVENT', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod('procedure CONTROLDESTROYED(CONTROL:TCONTROL)');
+ RegisterMethod('procedure CANCELHINT');
+ RegisterMethod('procedure HANDLEEXCEPTION(SENDER:TOBJECT)');
+ RegisterMethod('procedure HANDLEMESSAGE');
+ RegisterMethod('procedure HIDEHINT');
+// RegisterMethod('procedure HINTMOUSEMESSAGE(CONTROL:TCONTROL;var MESSAGE:TMESSAGE)');
+ RegisterMethod('procedure INITIALIZE');
+ RegisterMethod('procedure NORMALIZETOPMOSTS');
+ RegisterMethod('procedure RESTORETOPMOSTS');
+ RegisterMethod('procedure RUN');
+// RegisterMethod('procedure SHOWEXCEPTION(E:EXCEPTION)');
+ {$IFNDEF CLX}
+ RegisterMethod('function HELPCOMMAND(COMMAND:INTEGER;DATA:LONGINT):BOOLEAN');
+ RegisterMethod('function HELPCONTEXT(CONTEXT:THELPCONTEXT):BOOLEAN');
+ RegisterMethod('function HELPJUMP(JUMPID:NativeString):BOOLEAN');
+ RegisterProperty('DIALOGHANDLE', 'LONGINT', iptrw);
+ RegisterMethod('procedure CREATEHANDLE');
+// RegisterMethod('procedure HOOKMAINWINDOW(HOOK:TWINDOWHOOK)');
+// RegisterMethod('procedure UNHOOKMAINWINDOW(HOOK:TWINDOWHOOK)');
+ {$ENDIF}
+ RegisterProperty('HELPFILE', 'NativeString', iptrw);
+ RegisterProperty('HINTCOLOR', 'TCOLOR', iptrw);
+ RegisterProperty('HINTPAUSE', 'INTEGER', iptrw);
+ RegisterProperty('HINTSHORTPAUSE', 'INTEGER', iptrw);
+ RegisterProperty('HINTHIDEPAUSE', 'INTEGER', iptrw);
+ RegisterProperty('ICON', 'TICON', iptrw);
+ RegisterProperty('ONHELP', 'THELPEVENT', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegister_Forms_TypesAndConsts(Cl: TPSPascalCompiler);
+begin
+ Cl.AddTypeS('TIdleEvent', 'procedure (Sender: TObject; var Done: Boolean)');
+ cl.AddTypeS('TScrollBarKind', '(sbHorizontal, sbVertical)');
+ cl.AddTypeS('TScrollBarInc', 'SmallInt');
+ cl.AddTypeS('TFormBorderStyle', '(bsNone, bsSingle, bsSizeable, bsDialog, bsToolWindow, bsSizeToolWin)');
+ cl.AddTypeS('TBorderStyle', 'TFormBorderStyle');
+ cl.AddTypeS('TWindowState', '(wsNormal, wsMinimized, wsMaximized)');
+ cl.AddTypeS('TFormStyle', '(fsNormal, fsMDIChild, fsMDIForm, fsStayOnTop)');
+ cl.AddTypeS('TPosition', '(poDesigned, poDefault, poDefaultPosOnly, poDefaultSizeOnly, poScreenCenter, poDesktopCenter, poMainFormCenter, poOwnerFormCenter)');
+ cl.AddTypeS('TPrintScale', '(poNone, poProportional, poPrintToFit)');
+ cl.AddTypeS('TCloseAction', '(caNone, caHide, caFree, caMinimize)');
+ cl.AddTypeS('TCloseEvent' ,'procedure(Sender: TObject; var Action: TCloseAction)');
+ cl.AddTypeS('TCloseQueryEvent' ,'procedure(Sender: TObject; var CanClose: Boolean)');
+ cl.AddTypeS('TBorderIcon' ,'(biSystemMenu, biMinimize, biMaximize, biHelp)');
+ cl.AddTypeS('TBorderIcons', 'set of TBorderIcon');
+ cl.AddTypeS('THELPCONTEXT', 'Longint');
+end;
+
+procedure SIRegister_Forms(Cl: TPSPascalCompiler);
+begin
+ SIRegister_Forms_TypesAndConsts(cl);
+
+ {$IFNDEF PS_MINIVCL}
+ SIRegisterTCONTROLSCROLLBAR(cl);
+ {$ENDIF}
+ SIRegisterTScrollingWinControl(cl);
+ {$IFNDEF PS_MINIVCL}
+ SIRegisterTSCROLLBOX(cl);
+ {$ENDIF}
+ SIRegisterTForm(Cl);
+ {$IFNDEF PS_MINIVCL}
+ SIRegisterTApplication(Cl);
+ {$ENDIF}
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+
+end.
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_graphics.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_graphics.pas
new file mode 100644
index 0000000..e96bbe2
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_graphics.pas
@@ -0,0 +1,275 @@
+{ Compiletime Graphics support }
+unit uPSC_graphics;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSCompiler, uPSUtils;
+
+
+
+procedure SIRegister_Graphics_TypesAndConsts(Cl: TPSPascalCompiler);
+procedure SIRegisterTGRAPHICSOBJECT(Cl: TPSPascalCompiler);
+procedure SIRegisterTFont(Cl: TPSPascalCompiler);
+procedure SIRegisterTPEN(Cl: TPSPascalCompiler);
+procedure SIRegisterTBRUSH(Cl: TPSPascalCompiler);
+procedure SIRegisterTCanvas(cl: TPSPascalCompiler);
+procedure SIRegisterTGraphic(CL: TPSPascalCompiler);
+procedure SIRegisterTBitmap(CL: TPSPascalCompiler; Streams: Boolean);
+
+procedure SIRegister_Graphics(Cl: TPSPascalCompiler; Streams: Boolean);
+
+implementation
+{$IFNDEF PS_NOGRAPHCONST}
+uses
+ {$IFDEF CLX}QGraphics{$ELSE}Graphics{$ENDIF};
+{$ELSE}
+{$IFNDEF CLX}
+{$IFNDEF FPC}
+uses
+ Windows;
+{$ENDIF}
+{$ENDIF}
+{$ENDIF}
+
+procedure SIRegisterTGRAPHICSOBJECT(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TPERSISTENT'), 'TGRAPHICSOBJECT') do
+ begin
+ RegisterProperty('ONCHANGE', 'TNOTIFYEVENT', iptrw);
+ end;
+end;
+
+procedure SIRegisterTFont(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TGraphicsObject'), 'TFONT') do
+ begin
+ RegisterMethod('constructor Create;');
+{$IFNDEF CLX}
+ RegisterProperty('Handle', 'Integer', iptRW);
+{$ENDIF}
+ RegisterProperty('Color', 'TColor', iptRW);
+ RegisterProperty('Height', 'Integer', iptRW);
+ RegisterProperty('Name', 'String', iptRW);
+ RegisterProperty('Pitch', 'Byte', iptRW);
+ RegisterProperty('Size', 'Integer', iptRW);
+ RegisterProperty('PixelsPerInch', 'Integer', iptRW);
+ RegisterProperty('Style', 'TFontStyles', iptrw);
+ end;
+end;
+
+procedure SIRegisterTCanvas(cl: TPSPascalCompiler); // requires TPersistent
+begin
+ with Cl.AddClassN(cl.FindClass('TPersistent'), 'TCANVAS') do
+ begin
+ RegisterMethod('procedure Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);');
+ RegisterMethod('procedure Chord(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);');
+// RegisterMethod('procedure Draw(X, Y: Integer; Graphic: TGraphic);');
+ RegisterMethod('procedure Ellipse(X1, Y1, X2, Y2: Integer);');
+ RegisterMethod('procedure FillRect(const Rect: TRect);');
+{$IFNDEF CLX}
+ RegisterMethod('procedure FloodFill(X, Y: Integer; Color: TColor; FillStyle: Byte);');
+{$ENDIF}
+ RegisterMethod('procedure LineTo(X, Y: Integer);');
+ RegisterMethod('procedure MoveTo(X, Y: Integer);');
+ RegisterMethod('procedure Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer);');
+ RegisterMethod('procedure Rectangle(X1, Y1, X2, Y2: Integer);');
+ RegisterMethod('procedure Refresh;');
+ RegisterMethod('procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer);');
+ RegisterMethod('function TextHeight(Text: String): Integer;');
+ RegisterMethod('procedure TextOut(X, Y: Integer; Text: String);');
+ RegisterMethod('function TextWidth(Text: String): Integer;');
+{$IFNDEF CLX}
+ RegisterProperty('Handle', 'Integer', iptRw);
+{$ENDIF}
+ RegisterProperty('Pixels', 'Integer Integer Integer', iptRW);
+ RegisterProperty('Brush', 'TBrush', iptR);
+ RegisterProperty('CopyMode', 'Byte', iptRw);
+ RegisterProperty('Font', 'TFont', iptR);
+ RegisterProperty('Pen', 'TPen', iptR);
+ end;
+end;
+
+procedure SIRegisterTPEN(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TGRAPHICSOBJECT'), 'TPEN') do
+ begin
+ RegisterMethod('constructor CREATE');
+ RegisterProperty('COLOR', 'TCOLOR', iptrw);
+ RegisterProperty('MODE', 'TPENMODE', iptrw);
+ RegisterProperty('STYLE', 'TPENSTYLE', iptrw);
+ RegisterProperty('WIDTH', 'INTEGER', iptrw);
+ end;
+end;
+
+procedure SIRegisterTBRUSH(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TGRAPHICSOBJECT'), 'TBRUSH') do
+ begin
+ RegisterMethod('constructor CREATE');
+ RegisterProperty('COLOR', 'TCOLOR', iptrw);
+ RegisterProperty('STYLE', 'TBRUSHSTYLE', iptrw);
+ end;
+end;
+
+procedure SIRegister_Graphics_TypesAndConsts(Cl: TPSPascalCompiler);
+{$IFDEF PS_NOGRAPHCONST}
+const
+ clSystemColor = {$IFDEF DELPHI7UP} $FF000000 {$ELSE} $80000000 {$ENDIF};
+{$ENDIF}
+begin
+{$IFNDEF PS_NOGRAPHCONST}
+ cl.AddConstantN('clScrollBar', 'Integer').Value.ts32 := clScrollBar;
+ cl.AddConstantN('clBackground', 'Integer').Value.ts32 := clBackground;
+ cl.AddConstantN('clActiveCaption', 'Integer').Value.ts32 := clActiveCaption;
+ cl.AddConstantN('clInactiveCaption', 'Integer').Value.ts32 := clInactiveCaption;
+ cl.AddConstantN('clMenu', 'Integer').Value.ts32 := clMenu;
+ cl.AddConstantN('clWindow', 'Integer').Value.ts32 := clWindow;
+ cl.AddConstantN('clWindowFrame', 'Integer').Value.ts32 := clWindowFrame;
+ cl.AddConstantN('clMenuText', 'Integer').Value.ts32 := clMenuText;
+ cl.AddConstantN('clWindowText', 'Integer').Value.ts32 := clWindowText;
+ cl.AddConstantN('clCaptionText', 'Integer').Value.ts32 := clCaptionText;
+ cl.AddConstantN('clActiveBorder', 'Integer').Value.ts32 := clActiveBorder;
+ cl.AddConstantN('clInactiveBorder', 'Integer').Value.ts32 := clInactiveCaption;
+ cl.AddConstantN('clAppWorkSpace', 'Integer').Value.ts32 := clAppWorkSpace;
+ cl.AddConstantN('clHighlight', 'Integer').Value.ts32 := clHighlight;
+ cl.AddConstantN('clHighlightText', 'Integer').Value.ts32 := clHighlightText;
+ cl.AddConstantN('clBtnFace', 'Integer').Value.ts32 := clBtnFace;
+ cl.AddConstantN('clBtnShadow', 'Integer').Value.ts32 := clBtnShadow;
+ cl.AddConstantN('clGrayText', 'Integer').Value.ts32 := clGrayText;
+ cl.AddConstantN('clBtnText', 'Integer').Value.ts32 := clBtnText;
+ cl.AddConstantN('clInactiveCaptionText', 'Integer').Value.ts32 := clInactiveCaptionText;
+ cl.AddConstantN('clBtnHighlight', 'Integer').Value.ts32 := clBtnHighlight;
+ cl.AddConstantN('cl3DDkShadow', 'Integer').Value.ts32 := cl3DDkShadow;
+ cl.AddConstantN('cl3DLight', 'Integer').Value.ts32 := cl3DLight;
+ cl.AddConstantN('clInfoText', 'Integer').Value.ts32 := clInfoText;
+ cl.AddConstantN('clInfoBk', 'Integer').Value.ts32 := clInfoBk;
+{$ELSE}
+{$IFNDEF CLX} // These are VCL-only; CLX uses different constant values
+ cl.AddConstantN('clScrollBar', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_SCROLLBAR);
+ cl.AddConstantN('clBackground', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_BACKGROUND);
+ cl.AddConstantN('clActiveCaption', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_ACTIVECAPTION);
+ cl.AddConstantN('clInactiveCaption', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_INACTIVECAPTION);
+ cl.AddConstantN('clMenu', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_MENU);
+ cl.AddConstantN('clWindow', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_WINDOW);
+ cl.AddConstantN('clWindowFrame', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_WINDOWFRAME);
+ cl.AddConstantN('clMenuText', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_MENUTEXT);
+ cl.AddConstantN('clWindowText', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_WINDOWTEXT);
+ cl.AddConstantN('clCaptionText', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_CAPTIONTEXT);
+ cl.AddConstantN('clActiveBorder', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_ACTIVEBORDER);
+ cl.AddConstantN('clInactiveBorder', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_INACTIVEBORDER);
+ cl.AddConstantN('clAppWorkSpace', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_APPWORKSPACE);
+ cl.AddConstantN('clHighlight', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_HIGHLIGHT);
+ cl.AddConstantN('clHighlightText', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_HIGHLIGHTTEXT);
+ cl.AddConstantN('clBtnFace', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_BTNFACE);
+ cl.AddConstantN('clBtnShadow', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_BTNSHADOW);
+ cl.AddConstantN('clGrayText', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_GRAYTEXT);
+ cl.AddConstantN('clBtnText', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_BTNTEXT);
+ cl.AddConstantN('clInactiveCaptionText', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_INACTIVECAPTIONTEXT);
+ cl.AddConstantN('clBtnHighlight', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_BTNHIGHLIGHT);
+ cl.AddConstantN('cl3DDkShadow', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_3DDKSHADOW);
+ cl.AddConstantN('cl3DLight', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_3DLIGHT);
+ cl.AddConstantN('clInfoText', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_INFOTEXT);
+ cl.AddConstantN('clInfoBk', 'Integer').Value.ts32 := Integer(clSystemColor or COLOR_INFOBK);
+{$ENDIF}
+{$ENDIF}
+ cl.AddConstantN('clBlack', 'Integer').Value.ts32 := $000000;
+ cl.AddConstantN('clMaroon', 'Integer').Value.ts32 := $000080;
+ cl.AddConstantN('clGreen', 'Integer').Value.ts32 := $008000;
+ cl.AddConstantN('clOlive', 'Integer').Value.ts32 := $008080;
+ cl.AddConstantN('clNavy', 'Integer').Value.ts32 := $800000;
+ cl.AddConstantN('clPurple', 'Integer').Value.ts32 := $800080;
+ cl.AddConstantN('clTeal', 'Integer').Value.ts32 := $808000;
+ cl.AddConstantN('clGray', 'Integer').Value.ts32 := $808080;
+ cl.AddConstantN('clSilver', 'Integer').Value.ts32 := $C0C0C0;
+ cl.AddConstantN('clRed', 'Integer').Value.ts32 := $0000FF;
+ cl.AddConstantN('clLime', 'Integer').Value.ts32 := $00FF00;
+ cl.AddConstantN('clYellow', 'Integer').Value.ts32 := $00FFFF;
+ cl.AddConstantN('clBlue', 'Integer').Value.ts32 := $FF0000;
+ cl.AddConstantN('clFuchsia', 'Integer').Value.ts32 := $FF00FF;
+ cl.AddConstantN('clAqua', 'Integer').Value.ts32 := $FFFF00;
+ cl.AddConstantN('clLtGray', 'Integer').Value.ts32 := $C0C0C0;
+ cl.AddConstantN('clDkGray', 'Integer').Value.ts32 := $808080;
+ cl.AddConstantN('clWhite', 'Integer').Value.ts32 := $FFFFFF;
+ cl.AddConstantN('clNone', 'Integer').Value.ts32 := $1FFFFFFF;
+ cl.AddConstantN('clDefault', 'Integer').Value.ts32 := $20000000;
+
+ Cl.addTypeS('TFONTSTYLE', '(FSBOLD, FSITALIC, FSUNDERLINE, FSSTRIKEOUT)');
+ Cl.addTypeS('TFONTSTYLES', 'set of TFONTSTYLE');
+
+ cl.AddTypeS('TFontPitch', '(fpDefault, fpVariable, fpFixed)');
+ cl.AddTypeS('TPenStyle', '(psSolid, psDash, psDot, psDashDot, psDashDotDot, psClear, psInsideFrame)');
+ cl.AddTypeS('TPenMode', '(pmBlack, pmWhite, pmNop, pmNot, pmCopy, pmNotCopy, pmMergePenNot, pmMaskPenNot, pmMergeNotPen, pmMaskNotPen, pmMerge, pmNotMerge, pmMask, pmNotMask, pmXor, pmNotXor)');
+ cl.AddTypeS('TBrushStyle', '(bsSolid, bsClear, bsHorizontal, bsVertical, bsFDiagonal, bsBDiagonal, bsCross, bsDiagCross)');
+ cl.addTypeS('TColor', 'integer');
+
+{$IFNDEF CLX}
+ cl.addTypeS('HBITMAP', 'Integer');
+ cl.addTypeS('HPALETTE', 'Integer');
+{$ENDIF}
+end;
+
+procedure SIRegisterTGraphic(CL: TPSPascalCompiler);
+begin
+ with CL.AddClassN(CL.FindClass('TPersistent'),'TGraphic') do
+ begin
+ RegisterMethod('constructor Create');
+ RegisterMethod('Procedure LoadFromFile( const Filename : String)');
+ RegisterMethod('Procedure SaveToFile( const Filename : String)');
+ RegisterProperty('Empty', 'Boolean', iptr);
+ RegisterProperty('Height', 'Integer', iptrw);
+ RegisterProperty('Modified', 'Boolean', iptrw);
+ RegisterProperty('Width', 'Integer', iptrw);
+ RegisterProperty('OnChange', 'TNotifyEvent', iptrw);
+ end;
+end;
+
+procedure SIRegisterTBitmap(CL: TPSPascalCompiler; Streams: Boolean);
+begin
+ with CL.AddClassN(CL.FindClass('TGraphic'),'TBitmap') do
+ begin
+ if Streams then begin
+ RegisterMethod('Procedure LoadFromStream( Stream : TStream)');
+ RegisterMethod('Procedure SaveToStream( Stream : TStream)');
+ end;
+ RegisterProperty('Canvas', 'TCanvas', iptr);
+{$IFNDEF CLX}
+ RegisterProperty('Handle', 'HBITMAP', iptrw);
+{$ENDIF}
+
+ {$IFNDEF IFPS_MINIVCL}
+ RegisterMethod('Procedure Dormant');
+ RegisterMethod('Procedure FreeImage');
+{$IFNDEF CLX}
+ RegisterMethod('Procedure LoadFromClipboardFormat( AFormat : Word; AData : THandle; APalette : HPALETTE)');
+{$ENDIF}
+ RegisterMethod('Procedure LoadFromResourceName( Instance : THandle; const ResName : String)');
+ RegisterMethod('Procedure LoadFromResourceID( Instance : THandle; ResID : Integer)');
+{$IFNDEF CLX}
+ RegisterMethod('Function ReleaseHandle : HBITMAP');
+ RegisterMethod('Function ReleasePalette : HPALETTE');
+ RegisterMethod('Procedure SaveToClipboardFormat( var Format : Word; var Data : THandle; var APalette : HPALETTE)');
+ RegisterProperty('Monochrome', 'Boolean', iptrw);
+ RegisterProperty('Palette', 'HPALETTE', iptrw);
+ RegisterProperty('IgnorePalette', 'Boolean', iptrw);
+{$ENDIF}
+ RegisterProperty('TransparentColor', 'TColor', iptr);
+ {$ENDIF}
+ end;
+end;
+
+procedure SIRegister_Graphics(Cl: TPSPascalCompiler; Streams: Boolean);
+begin
+ SIRegister_Graphics_TypesAndConsts(Cl);
+ SIRegisterTGRAPHICSOBJECT(Cl);
+ SIRegisterTFont(Cl);
+ SIRegisterTPEN(cl);
+ SIRegisterTBRUSH(cl);
+ SIRegisterTCanvas(cl);
+ SIRegisterTGraphic(Cl);
+ SIRegisterTBitmap(Cl, Streams);
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+End.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_menus.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_menus.pas
new file mode 100644
index 0000000..698f16b
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_menus.pas
@@ -0,0 +1,214 @@
+{ Menus Import Unit }
+Unit uPSC_menus;
+{$I PascalScript.inc}
+Interface
+Uses uPSCompiler;
+
+procedure SIRegisterTMENUITEMSTACK(CL: TPSPascalCompiler);
+procedure SIRegisterTPOPUPLIST(CL: TPSPascalCompiler);
+procedure SIRegisterTPOPUPMENU(CL: TPSPascalCompiler);
+procedure SIRegisterTMAINMENU(CL: TPSPascalCompiler);
+procedure SIRegisterTMENU(CL: TPSPascalCompiler);
+procedure SIRegisterTMENUITEM(CL: TPSPascalCompiler);
+procedure SIRegister_Menus(Cl: TPSPascalCompiler);
+
+implementation
+
+procedure SIRegisterTMENUITEMSTACK(CL: TPSPascalCompiler);
+begin
+ With cl.AddClassN(Cl.FindClass('TSTACK'),'TMENUITEMSTACK') do
+ begin
+ RegisterMethod('Procedure CLEARITEM( AITEM : TMENUITEM)');
+ end;
+end;
+
+procedure SIRegisterTPOPUPLIST(CL: TPSPascalCompiler);
+begin
+ With cl.AddClassN(Cl.FindClass('TLIST'),'TPOPUPLIST') do
+ begin
+ RegisterProperty('WINDOW', 'HWND', iptr);
+ RegisterMethod('Procedure ADD( POPUP : TPOPUPMENU)');
+ RegisterMethod('Procedure REMOVE( POPUP : TPOPUPMENU)');
+ end;
+end;
+
+procedure SIRegisterTPOPUPMENU(CL: TPSPascalCompiler);
+var
+ cc: TPSCompileTimeClass;
+begin
+ With cl.AddClassN(Cl.FindClass('TMENU'),'TPOPUPMENU') do
+ begin
+ cc := Cl.FindClass('TLabel');
+ if cc <> nil then
+ RegisterProperty('POPUPMENU', 'TPOPUPMENU', iptRW);
+ with Cl.FindClass('TForm') do
+ begin
+ RegisterProperty('POPUPMENU', 'TPOPUPMENU', iptRW);
+ end;
+ RegisterMethod('Constructor CREATE( AOWNER : TCOMPONENT)');
+ RegisterMethod('Procedure POPUP( X, Y : INTEGER)');
+ RegisterProperty('POPUPCOMPONENT', 'TCOMPONENT', iptrw);
+ RegisterProperty('ALIGNMENT', 'TPOPUPALIGNMENT', iptrw);
+ RegisterProperty('AUTOPOPUP', 'BOOLEAN', iptrw);
+ RegisterProperty('HELPCONTEXT', 'THELPCONTEXT', iptrw);
+ RegisterProperty('MENUANIMATION', 'TMENUANIMATION', iptrw);
+ RegisterProperty('TRACKBUTTON', 'TTRACKBUTTON', iptrw);
+ RegisterProperty('ONPOPUP', 'TNOTIFYEVENT', iptrw);
+ end;
+end;
+
+procedure SIRegisterTMAINMENU(CL: TPSPascalCompiler);
+begin
+ With cl.AddClassN(Cl.FindClass('TMENU'),'TMAINMENU') do
+ begin
+ RegisterMethod('Procedure MERGE( MENU : TMAINMENU)');
+ RegisterMethod('Procedure UNMERGE( MENU : TMAINMENU)');
+ RegisterMethod('Procedure POPULATEOLE2MENU( SHAREDMENU : HMENU; GROUPS : array of INTEGER; var WIDTHS : array of LONGINT)');
+ RegisterMethod('Procedure GETOLE2ACCELERATORTABLE( var ACCELTABLE : HACCEL; var ACCELCOUNT : INTEGER; GROUPS : array of INTEGER)');
+ RegisterMethod('Procedure SETOLE2MENUHANDLE( HANDLE : HMENU)');
+ RegisterProperty('AUTOMERGE', 'BOOLEAN', iptrw);
+ end;
+end;
+
+procedure SIRegisterTMENU(CL: TPSPascalCompiler);
+begin
+ With cl.AddClassN(Cl.FindClass('TCOMPONENT'),'TMENU') do
+ begin
+ RegisterMethod('Constructor CREATE( AOWNER : TCOMPONENT)');
+ RegisterMethod('Function DISPATCHCOMMAND( ACOMMAND : WORD) : BOOLEAN');
+ RegisterMethod('Function DISPATCHPOPUP( AHANDLE : HMENU) : BOOLEAN');
+ RegisterMethod('Function FINDITEM( VALUE : INTEGER; KIND : TFINDITEMKIND) : TMENUITEM');
+ RegisterMethod('Function GETHELPCONTEXT( VALUE : INTEGER; BYCOMMAND : BOOLEAN) : THELPCONTEXT');
+ RegisterProperty('IMAGES', 'TCUSTOMIMAGELIST', iptrw);
+ RegisterMethod('Function ISRIGHTTOLEFT : BOOLEAN');
+ RegisterMethod('Procedure PARENTBIDIMODECHANGED( ACONTROL : TOBJECT)');
+ RegisterMethod('Procedure PROCESSMENUCHAR( var MESSAGE : TWMMENUCHAR)');
+ RegisterProperty('AUTOHOTKEYS', 'TMENUAUTOFLAG', iptrw);
+ RegisterProperty('AUTOLINEREDUCTION', 'TMENUAUTOFLAG', iptrw);
+ RegisterProperty('BIDIMODE', 'TBIDIMODE', iptrw);
+ RegisterProperty('HANDLE', 'HMENU', iptr);
+ RegisterProperty('OWNERDRAW', 'BOOLEAN', iptrw);
+ RegisterProperty('PARENTBIDIMODE', 'BOOLEAN', iptrw);
+ RegisterProperty('WINDOWHANDLE', 'HWND', iptrw);
+ RegisterProperty('ITEMS', 'TMENUITEM', iptr);
+ end;
+end;
+
+procedure SIRegisterTMENUITEM(CL: TPSPascalCompiler);
+begin
+ With cl.AddClassN(Cl.FindClass('TCOMPONENT'),'TMENUITEM') do
+ begin
+ RegisterMethod('Constructor CREATE( AOWNER : TCOMPONENT)');
+ RegisterMethod('Procedure INITIATEACTION');
+ RegisterMethod('Procedure INSERT( INDEX : INTEGER; ITEM : TMENUITEM)');
+ RegisterMethod('Procedure DELETE( INDEX : INTEGER)');
+ RegisterMethod('Procedure CLEAR');
+ RegisterMethod('Procedure CLICK');
+ RegisterMethod('Function FIND( ACAPTION : String) : TMENUITEM');
+ RegisterMethod('Function INDEXOF( ITEM : TMENUITEM) : INTEGER');
+ RegisterMethod('Function ISLINE : BOOLEAN');
+ RegisterMethod('Function GETIMAGELIST : TCUSTOMIMAGELIST');
+ RegisterMethod('Function GETPARENTCOMPONENT : TCOMPONENT');
+ RegisterMethod('Function GETPARENTMENU : TMENU');
+ RegisterMethod('Function HASPARENT : BOOLEAN');
+ RegisterMethod('Function NEWTOPLINE : INTEGER');
+ RegisterMethod('Function NEWBOTTOMLINE : INTEGER');
+ RegisterMethod('Function INSERTNEWLINEBEFORE( AITEM : TMENUITEM) : INTEGER');
+ RegisterMethod('Function INSERTNEWLINEAFTER( AITEM : TMENUITEM) : INTEGER');
+ RegisterMethod('Procedure ADD( ITEM : TMENUITEM)');
+ RegisterMethod('Procedure REMOVE( ITEM : TMENUITEM)');
+ RegisterMethod('Function RETHINKHOTKEYS : BOOLEAN');
+ RegisterMethod('Function RETHINKLINES : BOOLEAN');
+ RegisterProperty('COMMAND', 'WORD', iptr);
+ RegisterProperty('HANDLE', 'HMENU', iptr);
+ RegisterProperty('COUNT', 'INTEGER', iptr);
+ RegisterProperty('ITEMS', 'TMENUITEM INTEGER', iptr);
+ RegisterProperty('MENUINDEX', 'INTEGER', iptrw);
+ RegisterProperty('PARENT', 'TMENUITEM', iptr);
+ {$IFDEF DELPHI5UP}
+ RegisterProperty('ACTION', 'TBASICACTION', iptrw);
+ {$ENDIF}
+ RegisterProperty('AUTOHOTKEYS', 'TMENUITEMAUTOFLAG', iptrw);
+ RegisterProperty('AUTOLINEREDUCTION', 'TMENUITEMAUTOFLAG', iptrw);
+ RegisterProperty('BITMAP', 'TBITMAP', iptrw);
+ RegisterProperty('CAPTION', 'String', iptrw);
+ RegisterProperty('CHECKED', 'BOOLEAN', iptrw);
+ RegisterProperty('SUBMENUIMAGES', 'TCUSTOMIMAGELIST', iptrw);
+ RegisterProperty('DEFAULT', 'BOOLEAN', iptrw);
+ RegisterProperty('ENABLED', 'BOOLEAN', iptrw);
+ RegisterProperty('GROUPINDEX', 'BYTE', iptrw);
+ RegisterProperty('HELPCONTEXT', 'THELPCONTEXT', iptrw);
+ RegisterProperty('HINT', 'String', iptrw);
+ RegisterProperty('IMAGEINDEX', 'TIMAGEINDEX', iptrw);
+ RegisterProperty('RADIOITEM', 'BOOLEAN', iptrw);
+ RegisterProperty('SHORTCUT', 'TSHORTCUT', iptrw);
+ RegisterProperty('VISIBLE', 'BOOLEAN', iptrw);
+ RegisterProperty('ONCLICK', 'TNOTIFYEVENT', iptrw);
+ {$IFNDEF FPC} RegisterProperty('ONDRAWITEM', 'TMENUDRAWITEMEVENT', iptrw);
+ RegisterProperty('ONADVANCEDDRAWITEM', 'TADVANCEDMENUDRAWITEMEVENT', iptrw);
+ RegisterProperty('ONMEASUREITEM', 'TMENUMEASUREITEMEVENT', iptrw);{$ENDIF}
+ end;
+end;
+
+procedure SIRegister_Menus(Cl: TPSPascalCompiler);
+begin
+ Cl.AddTypeS('HMenu', 'Cardinal');
+ Cl.AddTypeS('HACCEL', 'Cardinal');
+
+ cl.addClassN(cl.FindClass('EXCEPTION'),'EMENUERROR');
+ Cl.addTypeS('TMENUBREAK', '( MBNONE, MBBREAK, MBBARBREAK )');
+{$IFNDEF FPC}
+ Cl.addTypeS('TMENUDRAWITEMEVENT', 'Procedure ( SENDER : TOBJECT; ACANVAS : TC'
+ +'ANVAS; ARECT : TRECT; SELECTED : BOOLEAN)');
+ Cl.addTypeS('TADVANCEDMENUDRAWITEMEVENT', 'Procedure ( SENDER : TOBJECT; ACAN'
+ +'VAS : TCANVAS; ARECT : TRECT; STATE : TOWNERDRAWSTATE)');
+ Cl.addTypeS('TMENUMEASUREITEMEVENT', 'Procedure ( SENDER : TOBJECT; ACANVAS :'
+ +' TCANVAS; var WIDTH, HEIGHT : INTEGER)');
+{$ENDIF}
+ Cl.addTypeS('TMENUITEMAUTOFLAG', '( MAAUTOMATIC, MAMANUAL, MAPARENT )');
+ Cl.AddTypeS('TMenuAutoFlag', 'TMENUITEMAUTOFLAG');
+ Cl.addTypeS('TSHORTCUT', 'WORD');
+ cl.addClassN(cl.FindClass('TACTIONLINK'),'TMENUACTIONLINK');
+ SIRegisterTMENUITEM(Cl);
+ Cl.addTypeS('TMENUCHANGEEVENT', 'Procedure ( SENDER : TOBJECT; SOURCE : TMENU'
+ +'ITEM; REBUILD : BOOLEAN)');
+ Cl.addTypeS('TFINDITEMKIND', '( FKCOMMAND, FKHANDLE, FKSHORTCUT )');
+ SIRegisterTMENU(Cl);
+ SIRegisterTMAINMENU(Cl);
+ Cl.addTypeS('TPOPUPALIGNMENT', '( PALEFT, PARIGHT, PACENTER )');
+ Cl.addTypeS('TTRACKBUTTON', '( TBRIGHTBUTTON, TBLEFTBUTTON )');
+ Cl.addTypeS('TMENUANIMATIONS', '( MALEFTTORIGHT, MARIGHTTOLEFT, MATOPTOBOTTOM'
+ +', MABOTTOMTOTOP, MANONE )');
+ Cl.addTypeS('TMENUANIMATION', 'set of TMENUANIMATIONS');
+ SIRegisterTPOPUPMENU(Cl);
+ SIRegisterTPOPUPLIST(Cl);
+ SIRegisterTMENUITEMSTACK(Cl);
+ Cl.addTypeS('TCMENUITEM', 'TMENUITEM');
+{$IFNDEF FPC}
+//TODO: it should work,but somehow TShiftState is not defined
+ Cl.AddDelphiFunction('Function SHORTCUT( KEY : WORD; SHIFT : TSHIFTSTATE) : T'
+ +'SHORTCUT');
+ Cl.AddDelphiFunction('Procedure SHORTCUTTOKEY( SHORTCUT : TSHORTCUT; var KEY '
+ +': WORD; var SHIFT : TSHIFTSTATE)');
+{$ENDIF}
+ Cl.AddDelphiFunction('Function SHORTCUTTOTEXT( SHORTCUT : TSHORTCUT) : String'
+ +'');
+ Cl.AddDelphiFunction('Function TEXTTOSHORTCUT( TEXT : String) : TSHORTCUT');
+ Cl.AddDelphiFunction('Function NEWMENU( OWNER : TCOMPONENT; const ANAME : STR'
+ +'ING; ITEMS : array of TMenuItem) : TMAINMENU');
+ Cl.AddDelphiFunction('Function NEWPOPUPMENU( OWNER : TCOMPONENT; const ANAME '
+ +': String; ALIGNMENT : TPOPUPALIGNMENT; AUTOPOPUP : BOOLEAN; const ITEMS : array of '
+ +'TCMENUITEM) : TPOPUPMENU');
+ Cl.AddDelphiFunction('Function NEWSUBMENU( const ACAPTION : String; HCTX : WO'
+ +'RD; const ANAME : String; ITEMS : array of TMenuItem; AENABLED : BOOLEAN) : TMENUITEM');
+ Cl.AddDelphiFunction('Function NEWITEM( const ACAPTION : String; ASHORTCUT : '
+ +'TSHORTCUT; ACHECKED, AENABLED : BOOLEAN; AONCLICK : TNOTIFYEVENT; HCTX : W'
+ +'ORD; const ANAME : String) : TMENUITEM');
+ Cl.AddDelphiFunction('Function NEWLINE : TMENUITEM');
+{$IFNDEF FPC}
+ Cl.AddDelphiFunction('Procedure DRAWMENUITEM( MENUITEM : TMENUITEM; ACANVAS :'
+ +' TCANVAS; ARECT : TRECT; STATE : TOWNERDRAWSTATE)');
+{$ENDIF}
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_std.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_std.pas
new file mode 100644
index 0000000..460ba64
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_std.pas
@@ -0,0 +1,87 @@
+{ Compiletime TObject, TPersistent and TComponent definitions }
+unit uPSC_std;
+{$I PascalScript.inc}
+interface
+uses
+ uPSCompiler, uPSUtils;
+
+{
+ Will register files from:
+ System
+ Classes (Only TComponent and TPersistent)
+
+}
+
+procedure SIRegister_Std_TypesAndConsts(Cl: TPSPascalCompiler);
+procedure SIRegisterTObject(CL: TPSPascalCompiler);
+procedure SIRegisterTPersistent(Cl: TPSPascalCompiler);
+procedure SIRegisterTComponent(Cl: TPSPascalCompiler);
+
+procedure SIRegister_Std(Cl: TPSPascalCompiler);
+
+implementation
+
+procedure SIRegisterTObject(CL: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(nil, 'TObject') do
+ begin
+ RegisterMethod('constructor Create');
+ RegisterMethod('procedure Free');
+ end;
+end;
+
+procedure SIRegisterTPersistent(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TObject'), 'TPersistent') do
+ begin
+ RegisterMethod('procedure Assign(Source: TPersistent)');
+ end;
+end;
+
+procedure SIRegisterTComponent(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TPersistent'), 'TComponent') do
+ begin
+ RegisterMethod('function FindComponent(AName: String): TComponent;');
+ RegisterMethod('constructor Create(AOwner: TComponent); virtual;');
+
+ RegisterProperty('Owner', 'TComponent', iptRW);
+ RegisterMethod('procedure DestroyComponents');
+ RegisterMethod('procedure Destroying');
+ RegisterMethod('procedure FreeNotification(AComponent:TComponent)');
+ RegisterMethod('procedure InsertComponent(AComponent:TComponent)');
+ RegisterMethod('procedure RemoveComponent(AComponent:TComponent)');
+ RegisterProperty('Components', 'TComponent Integer', iptr);
+ RegisterProperty('ComponentCount', 'Integer', iptr);
+ RegisterProperty('ComponentIndex', 'Integer', iptrw);
+ RegisterProperty('ComponentState', 'Byte', iptr);
+ RegisterProperty('Designinfo', 'LongInt', iptrw);
+ RegisterProperty('Name', 'String', iptrw);
+ RegisterProperty('Tag', 'LongInt', iptrw);
+ end;
+end;
+
+
+
+
+procedure SIRegister_Std_TypesAndConsts(Cl: TPSPascalCompiler);
+begin
+ Cl.AddTypeS('TComponentStateE', '(csLoading, csReading, csWriting, csDestroying, csDesigning, csAncestor, csUpdating, csFixups, csFreeNotification, csInline, csDesignInstance)');
+ cl.AddTypeS('TComponentState', 'set of TComponentStateE');
+ Cl.AddTypeS('TRect', 'record Left, Top, Right, Bottom: Integer; end;');
+end;
+
+procedure SIRegister_Std(Cl: TPSPascalCompiler);
+begin
+ SIRegister_Std_TypesAndConsts(Cl);
+ SIRegisterTObject(CL);
+ SIRegisterTPersistent(Cl);
+ SIRegisterTComponent(Cl);
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+
+End.
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_stdctrls.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_stdctrls.pas
new file mode 100644
index 0000000..52ff4bc
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSC_stdctrls.pas
@@ -0,0 +1,633 @@
+{ Compiletime STDCtrls support }
+unit uPSC_stdctrls;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSCompiler, uPSUtils;
+
+{
+ Will register files from:
+ stdctrls
+
+Requires:
+ STD, classes, controls and graphics
+}
+
+procedure SIRegister_StdCtrls_TypesAndConsts(cl: TPSPascalCompiler);
+
+
+
+procedure SIRegisterTCUSTOMGROUPBOX(Cl: TPSPascalCompiler);
+procedure SIRegisterTGROUPBOX(Cl: TPSPascalCompiler);
+procedure SIRegisterTCUSTOMLABEL(Cl: TPSPascalCompiler);
+procedure SIRegisterTLABEL(Cl: TPSPascalCompiler);
+procedure SIRegisterTCUSTOMEDIT(Cl: TPSPascalCompiler);
+procedure SIRegisterTEDIT(Cl: TPSPascalCompiler);
+procedure SIRegisterTCUSTOMMEMO(Cl: TPSPascalCompiler);
+procedure SIRegisterTMEMO(Cl: TPSPascalCompiler);
+procedure SIRegisterTCUSTOMCOMBOBOX(Cl: TPSPascalCompiler);
+procedure SIRegisterTCOMBOBOX(Cl: TPSPascalCompiler);
+procedure SIRegisterTBUTTONCONTROL(Cl: TPSPascalCompiler);
+procedure SIRegisterTBUTTON(Cl: TPSPascalCompiler);
+procedure SIRegisterTCUSTOMCHECKBOX(Cl: TPSPascalCompiler);
+procedure SIRegisterTCHECKBOX(Cl: TPSPascalCompiler);
+procedure SIRegisterTRADIOBUTTON(Cl: TPSPascalCompiler);
+procedure SIRegisterTCUSTOMLISTBOX(Cl: TPSPascalCompiler);
+procedure SIRegisterTLISTBOX(Cl: TPSPascalCompiler);
+procedure SIRegisterTSCROLLBAR(Cl: TPSPascalCompiler);
+
+procedure SIRegister_StdCtrls(cl: TPSPascalCompiler);
+
+
+implementation
+
+procedure SIRegisterTCUSTOMGROUPBOX(Cl: TPSPascalCompiler);
+begin
+ Cl.AddClassN(cl.FindClass('TCUSTOMCONTROL'), 'TCUSTOMGROUPBOX');
+end;
+
+
+procedure SIRegisterTGROUPBOX(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMGROUPBOX'), 'TGROUPBOX') do
+ begin
+ RegisterProperty('CAPTION', 'String', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+
+
+
+procedure SIRegisterTCUSTOMLABEL(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TGRAPHICCONTROL'), 'TCUSTOMLABEL') do
+ begin
+ {$IFNDEF PS_MINIVCL}
+{$IFNDEF CLX}
+ RegisterProperty('CANVAS', 'TCANVAS', iptr);
+{$ENDIF}
+ {$ENDIF}
+ end;
+end;
+
+
+procedure SIRegisterTLABEL(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMLABEL'), 'TLABEL') do
+ begin
+ RegisterProperty('ALIGNMENT', 'TAlignment', iptrw);
+ RegisterProperty('AUTOSIZE', 'Boolean', iptrw);
+ RegisterProperty('CAPTION', 'String', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('FOCUSCONTROL', 'TWinControl', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('LAYOUT', 'TTextLayout', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('SHOWACCELCHAR', 'Boolean', iptrw);
+ RegisterProperty('TRANSPARENT', 'Boolean', iptrw);
+ RegisterProperty('WORDWRAP', 'Boolean', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ end;
+end;
+
+
+
+
+
+
+
+procedure SIRegisterTCUSTOMEDIT(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TWINCONTROL'), 'TCUSTOMEDIT') do
+ begin
+ RegisterMethod('procedure CLEAR');
+ RegisterMethod('procedure CLEARSELECTION');
+ RegisterMethod('procedure SELECTALL');
+ RegisterProperty('MODIFIED', 'BOOLEAN', iptrw);
+ RegisterProperty('SELLENGTH', 'INTEGER', iptrw);
+ RegisterProperty('SELSTART', 'INTEGER', iptrw);
+ RegisterProperty('SELTEXT', 'String', iptrw);
+ RegisterProperty('TEXT', 'String', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod('procedure COPYTOCLIPBOARD');
+ RegisterMethod('procedure CUTTOCLIPBOARD');
+ RegisterMethod('procedure PASTEFROMCLIPBOARD');
+ RegisterMethod('function GETSELTEXTBUF(BUFFER:PCHAR;BUFSIZE:INTEGER):INTEGER');
+ RegisterMethod('procedure SETSELTEXTBUF(BUFFER:PCHAR)');
+ {$ENDIF}
+ end;
+end;
+
+
+
+
+procedure SIRegisterTEDIT(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMEDIT'), 'TEDIT') do
+ begin
+ RegisterProperty('AUTOSELECT', 'Boolean', iptrw);
+ RegisterProperty('AUTOSIZE', 'Boolean', iptrw);
+ RegisterProperty('BORDERSTYLE', 'TBorderStyle', iptrw);
+ RegisterProperty('CHARCASE', 'TEditCharCase', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('HIDESELECTION', 'Boolean', iptrw);
+ RegisterProperty('MAXLENGTH', 'Integer', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('PASSWORDCHAR', 'Char', iptrw);
+ RegisterProperty('READONLY', 'Boolean', iptrw);
+ RegisterProperty('TEXT', 'String', iptrw);
+ RegisterProperty('ONCHANGE', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONKEYDOWN', 'TKeyEvent', iptrw);
+ RegisterProperty('ONKEYPRESS', 'TKeyPressEvent', iptrw);
+ RegisterProperty('ONKEYUP', 'TKeyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('OEMCONVERT', 'Boolean', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+
+
+procedure SIRegisterTCUSTOMMEMO(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMEDIT'), 'TCUSTOMMEMO') do
+ begin
+ {$IFNDEF CLX}
+ RegisterProperty('LINES', 'TSTRINGS', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+procedure SIRegisterTMEMO(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMMEMO'), 'TMEMO') do
+ begin
+ {$IFDEF CLX}
+ RegisterProperty('LINES', 'TSTRINGS', iptrw);
+ {$ENDIF}
+ RegisterProperty('ALIGNMENT', 'TAlignment', iptrw);
+ RegisterProperty('BORDERSTYLE', 'TBorderStyle', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('HIDESELECTION', 'Boolean', iptrw);
+ RegisterProperty('MAXLENGTH', 'Integer', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('READONLY', 'Boolean', iptrw);
+ RegisterProperty('SCROLLBARS', 'TScrollStyle', iptrw);
+ RegisterProperty('WANTRETURNS', 'Boolean', iptrw);
+ RegisterProperty('WANTTABS', 'Boolean', iptrw);
+ RegisterProperty('WORDWRAP', 'Boolean', iptrw);
+ RegisterProperty('ONCHANGE', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONKEYDOWN', 'TKeyEvent', iptrw);
+ RegisterProperty('ONKEYPRESS', 'TKeyPressEvent', iptrw);
+ RegisterProperty('ONKEYUP', 'TKeyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('OEMCONVERT', 'Boolean', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+
+
+
+procedure SIRegisterTCUSTOMCOMBOBOX(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TWINCONTROL'), 'TCUSTOMCOMBOBOX') do
+ begin
+ RegisterProperty('DROPPEDDOWN', 'BOOLEAN', iptrw);
+ RegisterProperty('ITEMS', 'TSTRINGS', iptrw);
+ RegisterProperty('ITEMINDEX', 'INTEGER', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod('procedure CLEAR');
+ RegisterMethod('procedure SELECTALL');
+ RegisterProperty('CANVAS', 'TCANVAS', iptr);
+ RegisterProperty('SELLENGTH', 'INTEGER', iptrw);
+ RegisterProperty('SELSTART', 'INTEGER', iptrw);
+ RegisterProperty('SELTEXT', 'String', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+procedure SIRegisterTCOMBOBOX(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMCOMBOBOX'), 'TCOMBOBOX') do
+ begin
+ RegisterProperty('STYLE', 'TComboBoxStyle', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('DROPDOWNCOUNT', 'Integer', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('MAXLENGTH', 'Integer', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('SORTED', 'Boolean', iptrw);
+ RegisterProperty('TEXT', 'String', iptrw);
+ RegisterProperty('ONCHANGE', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDROPDOWN', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONKEYDOWN', 'TKeyEvent', iptrw);
+ RegisterProperty('ONKEYPRESS', 'TKeyPressEvent', iptrw);
+ RegisterProperty('ONKEYUP', 'TKeyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('ITEMHEIGHT', 'Integer', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONDRAWITEM', 'TDrawItemEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMEASUREITEM', 'TMeasureItemEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+
+procedure SIRegisterTBUTTONCONTROL(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TWINCONTROL'), 'TBUTTONCONTROL') do
+ begin
+ end;
+end;
+
+
+
+procedure SIRegisterTBUTTON(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TBUTTONCONTROL'), 'TBUTTON') do
+ begin
+ RegisterProperty('CANCEL', 'BOOLEAN', iptrw);
+ RegisterProperty('CAPTION', 'String', iptrw);
+ RegisterProperty('DEFAULT', 'BOOLEAN', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('MODALRESULT', 'LONGINT', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONKEYDOWN', 'TKeyEvent', iptrw);
+ RegisterProperty('ONKEYPRESS', 'TKeyPressEvent', iptrw);
+ RegisterProperty('ONKEYUP', 'TKeyEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+
+procedure SIRegisterTCUSTOMCHECKBOX(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TBUTTONCONTROL'), 'TCUSTOMCHECKBOX') do
+ begin
+ end;
+end;
+
+
+
+procedure SIRegisterTCHECKBOX(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMCHECKBOX'), 'TCHECKBOX') do
+ begin
+ RegisterProperty('ALIGNMENT', 'TAlignment', iptrw);
+ RegisterProperty('ALLOWGRAYED', 'Boolean', iptrw);
+ RegisterProperty('CAPTION', 'String', iptrw);
+ RegisterProperty('CHECKED', 'Boolean', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('STATE', 'TCheckBoxState', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONKEYDOWN', 'TKeyEvent', iptrw);
+ RegisterProperty('ONKEYPRESS', 'TKeyPressEvent', iptrw);
+ RegisterProperty('ONKEYUP', 'TKeyEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+
+
+
+procedure SIRegisterTRADIOBUTTON(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TBUTTONCONTROL'), 'TRADIOBUTTON') do
+ begin
+ RegisterProperty('ALIGNMENT', 'TALIGNMENT', iptrw);
+ RegisterProperty('CAPTION', 'String', iptrw);
+ RegisterProperty('CHECKED', 'BOOLEAN', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONKEYDOWN', 'TKeyEvent', iptrw);
+ RegisterProperty('ONKEYPRESS', 'TKeyPressEvent', iptrw);
+ RegisterProperty('ONKEYUP', 'TKeyEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+
+procedure SIRegisterTCUSTOMLISTBOX(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TWINCONTROL'), 'TCUSTOMLISTBOX') do
+ begin
+ RegisterProperty('ITEMS', 'TSTRINGS', iptrw);
+ RegisterProperty('ITEMINDEX', 'INTEGER', iptrw);
+ RegisterProperty('SELCOUNT', 'INTEGER', iptr);
+ RegisterProperty('SELECTED', 'BOOLEAN INTEGER', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod('procedure CLEAR');
+ RegisterMethod('function ITEMATPOS(POS:TPOINT;EXISTING:BOOLEAN):INTEGER');
+ RegisterMethod('function ITEMRECT(INDEX:INTEGER):TRECT');
+ RegisterProperty('CANVAS', 'TCANVAS', iptr);
+ RegisterProperty('TOPINDEX', 'INTEGER', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+
+procedure SIRegisterTLISTBOX(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TCUSTOMLISTBOX'), 'TLISTBOX') do
+ begin
+ RegisterProperty('BORDERSTYLE', 'TBorderStyle', iptrw);
+ RegisterProperty('COLOR', 'TColor', iptrw);
+ RegisterProperty('FONT', 'TFont', iptrw);
+ RegisterProperty('MULTISELECT', 'Boolean', iptrw);
+ RegisterProperty('PARENTCOLOR', 'Boolean', iptrw);
+ RegisterProperty('PARENTFONT', 'Boolean', iptrw);
+ RegisterProperty('SORTED', 'Boolean', iptrw);
+ RegisterProperty('STYLE', 'TListBoxStyle', iptrw);
+ RegisterProperty('ONCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONDBLCLICK', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONKEYDOWN', 'TKeyEvent', iptrw);
+ RegisterProperty('ONKEYPRESS', 'TKeyPressEvent', iptrw);
+ RegisterProperty('ONKEYUP', 'TKeyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterProperty('COLUMNS', 'Integer', iptrw);
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('EXTENDEDSELECT', 'Boolean', iptrw);
+ RegisterProperty('INTEGRALHEIGHT', 'Boolean', iptrw);
+ RegisterProperty('ITEMHEIGHT', 'Integer', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('TABWIDTH', 'Integer', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONDRAWITEM', 'TDrawItemEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONMEASUREITEM', 'TMeasureItemEvent', iptrw);
+ RegisterProperty('ONMOUSEDOWN', 'TMouseEvent', iptrw);
+ RegisterProperty('ONMOUSEMOVE', 'TMouseMoveEvent', iptrw);
+ RegisterProperty('ONMOUSEUP', 'TMouseEvent', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+
+
+
+
+procedure SIRegisterTSCROLLBAR(Cl: TPSPascalCompiler);
+begin
+ with Cl.AddClassN(cl.FindClass('TWINCONTROL'), 'TSCROLLBAR') do
+ begin
+ RegisterProperty('KIND', 'TSCROLLBARKIND', iptrw);
+ RegisterProperty('MAX', 'INTEGER', iptrw);
+ RegisterProperty('MIN', 'INTEGER', iptrw);
+ RegisterProperty('POSITION', 'INTEGER', iptrw);
+ RegisterProperty('ONCHANGE', 'TNOTIFYEVENT', iptrw);
+ RegisterProperty('ONENTER', 'TNotifyEvent', iptrw);
+ RegisterProperty('ONEXIT', 'TNotifyEvent', iptrw);
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod('procedure SETPARAMS(APOSITION,AMIN,AMAX:INTEGER)');
+ RegisterProperty('CTL3D', 'Boolean', iptrw);
+ RegisterProperty('DRAGCURSOR', 'Longint', iptrw);
+ RegisterProperty('DRAGMODE', 'TDragMode', iptrw);
+ RegisterProperty('LARGECHANGE', 'TSCROLLBARINC', iptrw);
+ RegisterProperty('PARENTCTL3D', 'Boolean', iptrw);
+ RegisterProperty('PARENTSHOWHINT', 'Boolean', iptrw);
+ RegisterProperty('POPUPMENU', 'TPopupMenu', iptrw);
+ RegisterProperty('SMALLCHANGE', 'TSCROLLBARINC', iptrw);
+ RegisterProperty('ONDRAGDROP', 'TDragDropEvent', iptrw);
+ RegisterProperty('ONDRAGOVER', 'TDragOverEvent', iptrw);
+ RegisterProperty('ONENDDRAG', 'TEndDragEvent', iptrw);
+ RegisterProperty('ONKEYDOWN', 'TKeyEvent', iptrw);
+ RegisterProperty('ONKEYPRESS', 'TKeyPressEvent', iptrw);
+ RegisterProperty('ONKEYUP', 'TKeyEvent', iptrw);
+ RegisterProperty('ONSCROLL', 'TSCROLLEVENT', iptrw);
+ RegisterProperty('ONSTARTDRAG', 'TStartDragEvent', iptrw);
+ {$ENDIF}
+ end;
+end;
+
+
+
+procedure SIRegister_StdCtrls_TypesAndConsts(cl: TPSPascalCompiler);
+begin
+ cl.AddTypeS('TEditCharCase', '(ecNormal, ecUpperCase, ecLowerCase)');
+ cl.AddTypeS('TScrollStyle', '(ssNone, ssHorizontal, ssVertical, ssBoth)');
+ cl.AddTypeS('TComboBoxStyle', '(csDropDown, csSimple, csDropDownList, csOwnerDrawFixed, csOwnerDrawVariable)');
+ cl.AddTypeS('TDrawItemEvent', 'procedure(Control: TWinControl; Index: Integer; Rect: TRect; State: Byte)');
+ cl.AddTypeS('TMeasureItemEvent', 'procedure(Control: TWinControl; Index: Integer; var Height: Integer)');
+ cl.AddTypeS('TCheckBoxState', '(cbUnchecked, cbChecked, cbGrayed)');
+ cl.AddTypeS('TListBoxStyle', '(lbStandard, lbOwnerDrawFixed, lbOwnerDrawVariable)');
+ cl.AddTypeS('TScrollCode', '(scLineUp, scLineDown, scPageUp, scPageDown, scPosition, scTrack, scTop, scBottom, scEndScroll)');
+ cl.AddTypeS('TScrollEvent', 'procedure(Sender: TObject; ScrollCode: TScrollCode;var ScrollPos: Integer)');
+
+ Cl.addTypeS('TEOwnerDrawState', '(odSelected, odGrayed, odDisabled, odChecked,'
+ +' odFocused, odDefault, odHotLight, odInactive, odNoAccel, odNoFocusRect,'
+ +' odReserved1, odReserved2, odComboBoxEdit)');
+ cl.AddTypeS('TTextLayout', '( tlTop, tlCenter, tlBottom )');
+ cl.AddTypeS('TOwnerDrawState', 'set of TEOwnerDrawState');
+end;
+
+
+procedure SIRegister_stdctrls(cl: TPSPascalCompiler);
+begin
+ SIRegister_StdCtrls_TypesAndConsts(cl);
+ {$IFNDEF PS_MINIVCL}
+ SIRegisterTCUSTOMGROUPBOX(Cl);
+ SIRegisterTGROUPBOX(Cl);
+ {$ENDIF}
+ SIRegisterTCUSTOMLABEL(Cl);
+ SIRegisterTLABEL(Cl);
+ SIRegisterTCUSTOMEDIT(Cl);
+ SIRegisterTEDIT(Cl);
+ SIRegisterTCUSTOMMEMO(Cl);
+ SIRegisterTMEMO(Cl);
+ SIRegisterTCUSTOMCOMBOBOX(Cl);
+ SIRegisterTCOMBOBOX(Cl);
+ SIRegisterTBUTTONCONTROL(Cl);
+ SIRegisterTBUTTON(Cl);
+ SIRegisterTCUSTOMCHECKBOX(Cl);
+ SIRegisterTCHECKBOX(Cl);
+ SIRegisterTRADIOBUTTON(Cl);
+ SIRegisterTCUSTOMLISTBOX(Cl);
+ SIRegisterTLISTBOX(Cl);
+ {$IFNDEF PS_MINIVCL}
+ SIRegisterTSCROLLBAR(Cl);
+ {$ENDIF}
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+
+end.
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSCompiler.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSCompiler.pas
new file mode 100644
index 0000000..7c7a710
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSCompiler.pas
@@ -0,0 +1,15555 @@
+unit uPSCompiler;
+{$I PascalScript.inc}
+interface
+uses
+ {$IFNDEF DELPHI3UP}{$IFNDEF PS_NOINTERFACES}{$IFNDEF LINUX}Windows, Ole2,{$ENDIF}
+ {$ENDIF}{$ENDIF}SysUtils, uPSUtils;
+
+
+type
+{$IFNDEF PS_NOINTERFACES}
+ TPSInterface = class;
+{$ENDIF}
+
+ TPSParameterMode = (pmIn, pmOut, pmInOut);
+ TPSPascalCompiler = class;
+ TPSType = class;
+ TPSValue = class;
+ TPSParameters = class;
+
+ TPSSubOptType = (tMainBegin, tProcBegin, tSubBegin, tOneLiner, tifOneliner, tRepeat, tTry, tTryEnd
+ {$IFDEF PS_USESSUPPORT},tUnitInit, tUnitFinish {$ENDIF}); //nvds
+
+
+ {TPSExternalClass is used when external classes need to be called}
+ TPSCompileTimeClass = class;
+ TPSAttributes = class;
+ TPSAttribute = class;
+
+ EPSCompilerException = class(Exception) end;
+
+ TPSParameterDecl = class(TObject)
+ private
+ FName: tbtString;
+ FOrgName: tbtString;
+ FMode: TPSParameterMode;
+ FType: TPSType;
+ {$IFDEF PS_USESSUPPORT}
+ FDeclareUnit: tbtString;
+ {$ENDIF}
+ FDeclarePos: Cardinal;
+ FDeclareRow: Cardinal;
+ FDeclareCol: Cardinal;
+ procedure SetName(const s: tbtString);
+ public
+
+ property Name: tbtString read FName;
+
+ property OrgName: tbtString read FOrgName write SetName;
+
+ property aType: TPSType read FType write FType;
+
+ property Mode: TPSParameterMode read FMode write FMode;
+
+ {$IFDEF PS_USESSUPPORT}
+ property DeclareUnit: tbtString read FDeclareUnit write FDeclareUnit;
+ {$ENDIF}
+
+ property DeclarePos: Cardinal read FDeclarePos write FDeclarePos;
+
+ property DeclareRow: Cardinal read FDeclareRow write FDeclareRow;
+
+ property DeclareCol: Cardinal read FDeclareCol write FDeclareCol;
+
+ end;
+
+
+ TPSParametersDecl = class(TObject)
+ private
+ FParams: TPSList;
+ FResult: TPSType;
+ function GetParam(I: Longint): TPSParameterDecl;
+ function GetParamCount: Longint;
+ public
+
+ property Params[I: Longint]: TPSParameterDecl read GetParam;
+
+ property ParamCount: Longint read GetParamCount;
+
+
+ function AddParam: TPSParameterDecl;
+
+ procedure DeleteParam(I: Longint);
+
+
+ property Result : TPSType read FResult write FResult;
+
+
+ procedure Assign(Params: TPSParametersDecl);
+
+
+ function Same(d: TPSParametersDecl): boolean;
+
+
+ constructor Create;
+
+ destructor Destroy; override;
+ end;
+
+
+ TPSRegProc = class(TObject)
+ private
+ FNameHash: Longint;
+ FName: tbtString;
+ FDecl: TPSParametersDecl;
+ FExportName: Boolean;
+ FImportDecl: tbtString;
+ FOrgName: tbtString;
+ procedure SetName(const Value: tbtString);
+ public
+
+ property OrgName: tbtString read FOrgName write FOrgName;
+
+ property Name: tbtString read FName write SetName;
+
+ property NameHash: Longint read FNameHash;
+
+ property Decl: TPSParametersDecl read FDecl;
+
+ property ExportName: Boolean read FExportName write FExportName;
+
+ property ImportDecl: tbtString read FImportDecl write FImportDecl;
+
+
+ constructor Create;
+
+ destructor Destroy; override;
+ end;
+
+ PIFPSRegProc = TPSRegProc;
+
+ PIfRVariant = ^TIfRVariant;
+
+ TIfRVariant = record
+
+ FType: TPSType;
+ case Byte of
+ 1: (tu8: TbtU8);
+ 2: (tS8: TbtS8);
+ 3: (tu16: TbtU16);
+ 4: (ts16: TbtS16);
+ 5: (tu32: TbtU32);
+ 6: (ts32: TbtS32);
+ 7: (tsingle: TbtSingle);
+ 8: (tdouble: TbtDouble);
+ 9: (textended: TbtExtended);
+ 11: (tcurrency: tbtCurrency);
+ 10: (tstring: Pointer);
+ {$IFNDEF PS_NOINT64}
+ 17: (ts64: Tbts64);
+ {$ENDIF}
+ 19: (tchar: tbtChar);
+ {$IFNDEF PS_NOWIDESTRING}
+ 18: (twidestring: Pointer);
+ 20: (twidechar: tbtwidechar);
+ {$ENDIF}
+ 21: (ttype: TPSType);
+ 22: (tunistring: Pointer);
+ end;
+
+ TPSRecordFieldTypeDef = class(TObject)
+ private
+ FFieldOrgName: tbtString;
+ FFieldName: tbtString;
+ FFieldNameHash: Longint;
+ FType: TPSType;
+ procedure SetFieldOrgName(const Value: tbtString);
+ public
+
+ property FieldOrgName: tbtString read FFieldOrgName write SetFieldOrgName;
+
+ property FieldName: tbtString read FFieldName;
+
+ property FieldNameHash: Longint read FFieldNameHash;
+
+ property aType: TPSType read FType write FType;
+ end;
+
+ PIFPSRecordFieldTypeDef = TPSRecordFieldTypeDef;
+
+ TPSType = class(TObject)
+ private
+ FNameHash: Longint;
+ FName: tbtString;
+ FBaseType: TPSBaseType;
+ {$IFDEF PS_USESSUPPORT}
+ FDeclareUnit: tbtString;
+ {$ENDIF}
+ FDeclarePos: Cardinal;
+ FDeclareRow: Cardinal;
+ FDeclareCol: Cardinal;
+ FUsed: Boolean;
+ FExportName: Boolean;
+ FOriginalName: tbtString;
+ FAttributes: TPSAttributes;
+ FFinalTypeNo: cardinal;
+ procedure SetName(const Value: tbtString);
+ public
+
+ constructor Create;
+
+ destructor Destroy; override;
+
+ property Attributes: TPSAttributes read FAttributes;
+
+
+ property FinalTypeNo: cardinal read FFinalTypeNo;
+
+
+ property OriginalName: tbtString read FOriginalName write FOriginalName;
+
+ property Name: tbtString read FName write SetName;
+
+ property NameHash: Longint read FNameHash;
+
+ property BaseType: TPSBaseType read FBaseType write FBaseType;
+
+ {$IFDEF PS_USESSUPPORT}
+ property DeclareUnit: tbtString read FDeclareUnit write FDeclareUnit;
+ {$ENDIF}
+
+ property DeclarePos: Cardinal read FDeclarePos write FDeclarePos;
+
+ property DeclareRow: Cardinal read FDeclareRow write FDeclareRow;
+
+ property DeclareCol: Cardinal read FDeclareCol write FDeclareCol;
+
+ property Used: Boolean read FUsed;
+
+ property ExportName: Boolean read FExportName write FExportName;
+
+ procedure Use;
+ end;
+
+
+ PIFPSType = TPSType;
+
+ TPSVariantType = class(TPSType)
+ private
+ public
+ function GetDynInvokeProcNo(Owner: TPSPascalCompiler; const Name: tbtString; Params: TPSParameters): Cardinal; virtual;
+ function GetDynIvokeSelfType(Owner: TPSPascalCompiler): TPSType; virtual;
+ function GetDynInvokeParamType(Owner: TPSPascalCompiler): TPSType; virtual;
+ function GetDynIvokeResulType(Owner: TPSPascalCompiler): TPSType; virtual;
+ end;
+
+
+ TPSRecordType = class(TPSType)
+ private
+ FRecordSubVals: TPSList;
+ public
+
+ constructor Create;
+
+ destructor Destroy; override;
+
+ function RecValCount: Longint;
+
+ function RecVal(I: Longint): PIFPSRecordFieldTypeDef;
+
+ function AddRecVal: PIFPSRecordFieldTypeDef;
+ end;
+
+ TPSClassType = class(TPSType)
+ private
+ FCL: TPSCompiletimeClass;
+ public
+
+ property Cl: TPSCompileTimeClass read FCL write FCL;
+ end;
+ TPSExternalClass = class;
+ TPSUndefinedClassType = class(TPSType)
+ private
+ FExtClass: TPSExternalClass;
+ public
+ property ExtClass: TPSExternalClass read FExtClass write FExtClass;
+ end;
+{$IFNDEF PS_NOINTERFACES}
+
+ TPSInterfaceType = class(TPSType)
+ private
+ FIntf: TPSInterface;
+ public
+
+ property Intf: TPSInterface read FIntf write FIntf;
+ end;
+{$ENDIF}
+
+
+ TPSProceduralType = class(TPSType)
+ private
+ FProcDef: TPSParametersDecl;
+ public
+
+ property ProcDef: TPSParametersDecl read FProcDef;
+
+ constructor Create;
+
+ destructor Destroy; override;
+ end;
+
+ TPSArrayType = class(TPSType)
+ private
+ FArrayTypeNo: TPSType;
+ public
+
+ property ArrayTypeNo: TPSType read FArrayTypeNo write FArrayTypeNo;
+ end;
+
+ TPSStaticArrayType = class(TPSArrayType)
+ private
+ FStartOffset: Longint;
+ FLength: Cardinal;
+ public
+
+ property StartOffset: Longint read FStartOffset write FStartOffset;
+
+ property Length: Cardinal read FLength write FLength;
+ end;
+
+ TPSSetType = class(TPSType)
+ private
+ FSetType: TPSType;
+ function GetByteSize: Longint;
+ function GetBitSize: Longint;
+ public
+
+ property SetType: TPSType read FSetType write FSetType;
+
+ property ByteSize: Longint read GetByteSize;
+
+ property BitSize: Longint read GetBitSize;
+ end;
+
+ TPSTypeLink = class(TPSType)
+ private
+ FLinkTypeNo: TPSType;
+ public
+
+ property LinkTypeNo: TPSType read FLinkTypeNo write FLinkTypeNo;
+ end;
+
+ TPSEnumType = class(TPSType)
+ private
+ FHighValue: Cardinal;
+ public
+
+ property HighValue: Cardinal read FHighValue write FHighValue;
+ end;
+
+
+ TPSProcedure = class(TObject)
+ private
+ FAttributes: TPSAttributes;
+ public
+
+ property Attributes: TPSAttributes read FAttributes;
+
+
+ constructor Create;
+
+ destructor Destroy; override;
+ end;
+
+ TPSAttributeType = class;
+
+ TPSAttributeTypeField = class(TObject)
+ private
+ FOwner: TPSAttributeType;
+ FFieldOrgName: tbtString;
+ FFieldName: tbtString;
+ FFieldNameHash: Longint;
+ FFieldType: TPSType;
+ FHidden: Boolean;
+ procedure SetFieldOrgName(const Value: tbtString);
+ public
+
+ constructor Create(AOwner: TPSAttributeType);
+
+ property Owner: TPSAttributeType read FOwner;
+
+ property FieldOrgName: tbtString read FFieldOrgName write SetFieldOrgName;
+
+ property FieldName: tbtString read FFieldName;
+
+ property FieldNameHash: Longint read FFieldNameHash;
+
+ property FieldType: TPSType read FFieldType write FFieldType;
+
+ property Hidden: Boolean read FHidden write FHidden;
+ end;
+
+ TPSApplyAttributeToType = function (Sender: TPSPascalCompiler; aType: TPSType; Attr: TPSAttribute): Boolean;
+
+ TPSApplyAttributeToProc = function (Sender: TPSPascalCompiler; aProc: TPSProcedure; Attr: TPSAttribute): Boolean;
+ { An attribute type }
+ TPSAttributeType = class(TPSType)
+ private
+ FFields: TPSList;
+ FName: tbtString;
+ FOrgname: tbtString;
+ FNameHash: Longint;
+ FAAProc: TPSApplyAttributeToProc;
+ FAAType: TPSApplyAttributeToType;
+ function GetField(I: Longint): TPSAttributeTypeField;
+ function GetFieldCount: Longint;
+ procedure SetName(const s: tbtString);
+ public
+
+ property OnApplyAttributeToType: TPSApplyAttributeToType read FAAType write FAAType;
+
+ property OnApplyAttributeToProc: TPSApplyAttributeToProc read FAAProc write FAAProc;
+
+ property Fields[i: Longint]: TPSAttributeTypeField read GetField;
+
+ property FieldCount: Longint read GetFieldCount;
+
+ procedure DeleteField(I: Longint);
+
+ function AddField: TPSAttributeTypeField;
+
+ property Name: tbtString read FName;
+
+ property OrgName: tbtString read FOrgName write SetName;
+
+ property NameHash: Longint read FNameHash;
+
+ constructor Create;
+
+ destructor Destroy; override;
+ end;
+
+ TPSAttribute = class(TObject)
+ private
+ FAttribType: TPSAttributeType;
+ FValues: TPSList;
+ function GetValueCount: Longint;
+ function GetValue(I: Longint): PIfRVariant;
+ public
+
+ constructor Create(AttribType: TPSAttributeType);
+
+ procedure Assign(Item: TPSAttribute);
+
+ property AType: TPSAttributeType read FAttribType;
+
+ property Count: Longint read GetValueCount;
+
+ property Values[i: Longint]: PIfRVariant read GetValue; default;
+
+ procedure DeleteValue(i: Longint);
+
+ function AddValue(v: PIFRVariant): Longint;
+
+ destructor Destroy; override;
+ end;
+
+
+ TPSAttributes = class(TObject)
+ private
+ FItems: TPSList;
+ function GetCount: Longint;
+ function GetItem(I: Longint): TPSAttribute;
+ public
+
+ procedure Assign(attr: TPSAttributes; Move: Boolean);
+
+ property Count: Longint read GetCount;
+
+ property Items[i: Longint]: TPSAttribute read GetItem; default;
+
+ procedure Delete(i: Longint);
+
+ function Add(AttribType: TPSAttributeType): TPSAttribute;
+
+ function FindAttribute(const Name: tbtString): TPSAttribute;
+
+ constructor Create;
+
+ destructor Destroy; override;
+ end;
+
+
+ TPSProcVar = class(TObject)
+ private
+ FNameHash: Longint;
+ FName: tbtString;
+ FOrgName: tbtString;
+ FType: TPSType;
+ FUsed: Boolean;
+ {$IFDEF PS_USESSUPPORT}
+ FDeclareUnit: tbtString;
+ {$ENDIF}
+ FDeclarePos, FDeclareRow, FDeclareCol: Cardinal;
+ procedure SetName(const Value: tbtString);
+ public
+
+ property OrgName: tbtString read FOrgName write FOrgname;
+
+ property NameHash: Longint read FNameHash;
+
+ property Name: tbtString read FName write SetName;
+
+ property AType: TPSType read FType write FType;
+
+ property Used: Boolean read FUsed;
+
+ {$IFDEF PS_USESSUPPORT}
+ property DeclareUnit: tbtString read FDeclareUnit write FDeclareUnit;
+ {$ENDIF}
+
+ property DeclarePos: Cardinal read FDeclarePos write FDeclarePos;
+
+ property DeclareRow: Cardinal read FDeclareRow write FDeclareRow;
+
+ property DeclareCol: Cardinal read FDeclareCol write FDeclareCol;
+
+ procedure Use;
+ end;
+
+ PIFPSProcVar = TPSProcVar;
+
+ TPSExternalProcedure = class(TPSProcedure)
+ private
+ FRegProc: TPSRegProc;
+ public
+
+ property RegProc: TPSRegProc read FRegProc write FRegProc;
+ end;
+
+
+ TPSInternalProcedure = class(TPSProcedure)
+ private
+ FForwarded: Boolean;
+ FData: tbtString;
+ FNameHash: Longint;
+ FName: tbtString;
+ FDecl: TPSParametersDecl;
+ FProcVars: TPSList;
+ FUsed: Boolean;
+ FOutputDeclPosition: Cardinal;
+ FResultUsed: Boolean;
+ FLabels: TIfStringList;
+ FGotos: TIfStringList;
+ FDeclareRow: Cardinal;
+ {$IFDEF PS_USESSUPPORT}
+ FDeclareUnit: tbtString;
+ {$ENDIF}
+ FDeclarePos: Cardinal;
+ FDeclareCol: Cardinal;
+ FOriginalName: tbtString;
+ procedure SetName(const Value: tbtString);
+ public
+
+ constructor Create;
+
+ destructor Destroy; override;
+ {Attributes}
+
+
+ property Forwarded: Boolean read FForwarded write FForwarded;
+
+ property Data: tbtString read FData write FData;
+
+ property Decl: TPSParametersDecl read FDecl;
+
+ property OriginalName: tbtString read FOriginalName write FOriginalName;
+
+ property Name: tbtString read FName write SetName;
+
+ property NameHash: Longint read FNameHash;
+
+ property ProcVars: TPSList read FProcVars;
+
+ property Used: Boolean read FUsed;
+
+ {$IFDEF PS_USESSUPPORT}
+ property DeclareUnit: tbtString read FDeclareUnit write FDeclareUnit;
+ {$ENDIF}
+
+ property DeclarePos: Cardinal read FDeclarePos write FDeclarePos;
+
+ property DeclareRow: Cardinal read FDeclareRow write FDeclareRow;
+
+ property DeclareCol: Cardinal read FDeclareCol write FDeclareCol;
+
+ property OutputDeclPosition: Cardinal read FOutputDeclPosition write FOutputDeclPosition;
+
+ property ResultUsed: Boolean read FResultUsed;
+
+
+ property Labels: TIfStringList read FLabels;
+
+ property Gotos: TIfStringList read FGotos;
+
+ procedure Use;
+
+ procedure ResultUse;
+ end;
+
+ TPSVar = class(TObject)
+ private
+ FNameHash: Longint;
+ FOrgName: tbtString;
+ FName: tbtString;
+ FType: TPSType;
+ FUsed: Boolean;
+ FExportName: tbtString;
+ FDeclareRow: Cardinal;
+ {$IFDEF PS_USESSUPPORT}
+ FDeclareUnit: tbtString;
+ {$ENDIF}
+ FDeclarePos: Cardinal;
+ FDeclareCol: Cardinal;
+ FSaveAsPointer: Boolean;
+ procedure SetName(const Value: tbtString);
+ public
+
+ property SaveAsPointer: Boolean read FSaveAsPointer write FSaveAsPointer;
+
+ property ExportName: tbtString read FExportName write FExportName;
+
+ property Used: Boolean read FUsed;
+
+ property aType: TPSType read FType write FType;
+
+ property OrgName: tbtString read FOrgName write FOrgName;
+
+ property Name: tbtString read FName write SetName;
+
+ property NameHash: Longint read FNameHash;
+
+ {$IFDEF PS_USESSUPPORT}
+ property DeclareUnit: tbtString read FDeclareUnit write FDeclareUnit;
+ {$ENDIF}
+
+ property DeclarePos: Cardinal read FDeclarePos write FDeclarePos;
+
+ property DeclareRow: Cardinal read FDeclareRow write FDeclareRow;
+
+ property DeclareCol: Cardinal read FDeclareCol write FDeclareCol;
+
+ procedure Use;
+ end;
+
+ PIFPSVar = TPSVar;
+
+ TPSConstant = class(TObject)
+ private
+
+ FOrgName: tbtString;
+
+ FNameHash: Longint;
+
+ FName: tbtString;
+
+ FDeclareRow: Cardinal;
+ {$IFDEF PS_USESSUPPORT}
+ FDeclareUnit: tbtString;
+ {$ENDIF}
+ FDeclarePos: Cardinal;
+ FDeclareCol: Cardinal;
+
+ FValue: PIfRVariant;
+ procedure SetName(const Value: tbtString);
+ public
+
+ property OrgName: tbtString read FOrgName write FOrgName;
+
+ property Name: tbtString read FName write SetName;
+
+ property NameHash: Longint read FNameHash;
+
+ property Value: PIfRVariant read FValue write FValue;
+
+ {$IFDEF PS_USESSUPPORT}
+ property DeclareUnit: tbtString read FDeclareUnit write FDeclareUnit;
+ {$ENDIF}
+
+ property DeclarePos: Cardinal read FDeclarePos write FDeclarePos;
+
+ property DeclareRow: Cardinal read FDeclareRow write FDeclareRow;
+
+ property DeclareCol: Cardinal read FDeclareCol write FDeclareCol;
+
+
+ procedure SetSet(const val);
+
+
+ procedure SetInt(const Val: Longint);
+
+ procedure SetUInt(const Val: Cardinal);
+ {$IFNDEF PS_NOINT64}
+
+ procedure SetInt64(const Val: Int64);
+ {$ENDIF}
+
+ procedure SetString(const Val: tbtString);
+
+ procedure SetChar(c: tbtChar);
+ {$IFNDEF PS_NOWIDESTRING}
+
+ procedure SetWideChar(const val: WideChar);
+
+ procedure SetWideString(const val: tbtwidestring);
+ procedure SetUnicodeString(const val: tbtunicodestring);
+ {$ENDIF}
+
+ procedure SetExtended(const Val: Extended);
+
+
+ destructor Destroy; override;
+ end;
+
+ PIFPSConstant = TPSConstant;
+
+ TPSPascalCompilerErrorType = (
+ ecUnknownIdentifier,
+ ecIdentifierExpected,
+ ecCommentError,
+ ecStringError,
+ ecCharError,
+ ecSyntaxError,
+ ecUnexpectedEndOfFile,
+ ecSemicolonExpected,
+ ecBeginExpected,
+ ecPeriodExpected,
+ ecDuplicateIdentifier,
+ ecColonExpected,
+ ecUnknownType,
+ ecCloseRoundExpected,
+ ecTypeMismatch,
+ ecInternalError,
+ ecAssignmentExpected,
+ ecThenExpected,
+ ecDoExpected,
+ ecNoResult,
+ ecOpenRoundExpected,
+ ecCommaExpected,
+ ecToExpected,
+ ecIsExpected,
+ ecOfExpected,
+ ecCloseBlockExpected,
+ ecVariableExpected,
+ ecStringExpected,
+ ecEndExpected,
+ ecUnSetLabel,
+ ecNotInLoop,
+ ecInvalidJump,
+ ecOpenBlockExpected,
+ ecWriteOnlyProperty,
+ ecReadOnlyProperty,
+ ecClassTypeExpected,
+ ecCustomError,
+ ecDivideByZero,
+ ecMathError,
+ ecUnsatisfiedForward,
+ ecForwardParameterMismatch,
+ ecInvalidnumberOfParameters
+ {$IFDEF PS_USESSUPPORT}
+ , ecNotAllowed,
+ ecUnitNotFoundOrContainsErrors
+ {$ENDIF}
+ );
+
+ TPSPascalCompilerHintType = (
+ ehVariableNotUsed,
+ ehFunctionNotUsed,
+ ehCustomHint
+ );
+
+ TPSPascalCompilerWarningType = (
+ ewCalculationAlwaysEvaluatesTo,
+ ewIsNotNeeded,
+ ewAbstractClass,
+ ewCustomWarning
+ );
+
+ TPSPascalCompilerMessage = class(TObject)
+ protected
+
+ FRow: Cardinal;
+
+ FCol: Cardinal;
+
+ FModuleName: tbtString;
+
+ FParam: tbtString;
+
+ FPosition: Cardinal;
+
+ procedure SetParserPos(Parser: TPSPascalParser);
+ public
+
+ property ModuleName: tbtString read FModuleName write FModuleName;
+
+ property Param: tbtString read FParam write FParam;
+
+ property Pos: Cardinal read FPosition write FPosition;
+
+ property Row: Cardinal read FRow write FRow;
+
+ property Col: Cardinal read FCol write FCol;
+
+ function ErrorType: tbtString; virtual; abstract;
+
+ procedure SetCustomPos(Pos, Row, Col: Cardinal);
+
+ function MessageToString: tbtString; virtual;
+
+ function ShortMessageToString: tbtString; virtual; abstract;
+ end;
+
+ TPSPascalCompilerError = class(TPSPascalCompilerMessage)
+ protected
+
+ FError: TPSPascalCompilerErrorType;
+ public
+
+ property Error: TPSPascalCompilerErrorType read FError;
+
+ function ErrorType: tbtString; override;
+ function ShortMessageToString: tbtString; override;
+ end;
+
+ TPSPascalCompilerHint = class(TPSPascalCompilerMessage)
+ protected
+
+ FHint: TPSPascalCompilerHintType;
+ public
+
+ property Hint: TPSPascalCompilerHintType read FHint;
+
+ function ErrorType: tbtString; override;
+ function ShortMessageToString: tbtString; override;
+ end;
+
+ TPSPascalCompilerWarning = class(TPSPascalCompilerMessage)
+ protected
+
+ FWarning: TPSPascalCompilerWarningType;
+ public
+
+ property Warning: TPSPascalCompilerWarningType read FWarning;
+
+ function ErrorType: tbtString; override;
+ function ShortMessageToString: tbtString; override;
+ end;
+ TPSDuplicCheck = set of (dcTypes, dcProcs, dcVars, dcConsts);
+
+ TPSBlockInfo = class(TObject)
+ private
+ FOwner: TPSBlockInfo;
+ FWithList: TPSList;
+ FProcNo: Cardinal;
+ FProc: TPSInternalProcedure;
+ FSubType: TPSSubOptType;
+ public
+
+ property WithList: TPSList read FWithList;
+
+ property ProcNo: Cardinal read FProcNo write FProcNo;
+
+ property Proc: TPSInternalProcedure read FProc write FProc;
+
+ property SubType: TPSSubOptType read FSubType write FSubType;
+
+ procedure Clear;
+
+ constructor Create(Owner: TPSBlockInfo);
+
+ destructor Destroy; override;
+ end;
+
+
+
+ TPSBinOperatorType = (otAdd, otSub, otMul, otDiv, otMod, otShl, otShr, otAnd, otOr, otXor, otAs,
+ otGreaterEqual, otLessEqual, otGreater, otLess, otEqual,
+ otNotEqual, otIs, otIn);
+
+ TPSUnOperatorType = (otNot, otMinus, otCast);
+
+ TPSOnUseVariable = procedure (Sender: TPSPascalCompiler; VarType: TPSVariableType; VarNo: Longint; ProcNo, Position: Cardinal; const PropData: tbtString);
+
+ TPSOnUses = function(Sender: TPSPascalCompiler; const Name: tbtString): Boolean;
+
+ TPSOnExportCheck = function(Sender: TPSPascalCompiler; Proc: TPSInternalProcedure; const ProcDecl: tbtString): Boolean;
+
+ {$IFNDEF PS_USESSUPPORT}
+ TPSOnWriteLineEvent = function (Sender: TPSPascalCompiler; Position: Cardinal): Boolean;
+ {$ELSE}
+ TPSOnWriteLineEvent = function (Sender: TPSPascalCompiler; FileName: tbtString; Position: Cardinal): Boolean;
+ {$ENDIF}
+
+ TPSOnExternalProc = function (Sender: TPSPascalCompiler; Decl: TPSParametersDecl; const Name, FExternal: tbtString): TPSRegProc;
+
+ TPSOnTranslateLineInfoProc = procedure (Sender: TPSPascalCompiler; var Pos, Row, Col: Cardinal; var Name: tbtString);
+ TPSOnNotify = function (Sender: TPSPascalCompiler): Boolean;
+
+ TPSOnFunction = procedure(name: tbtString; Pos, Row, Col: Integer) of object;
+
+
+ TPSPascalCompiler = class
+ protected
+ FAnyString: TPSType;
+ FUnitName: tbtString;
+ FID: Pointer;
+ FOnExportCheck: TPSOnExportCheck;
+ FDefaultBoolType: TPSType;
+ FRegProcs: TPSList;
+ FConstants: TPSList;
+ FProcs: TPSList;
+ FTypes: TPSList;
+ FAttributeTypes: TPSList;
+ FVars: TPSList;
+ FOutput: tbtString;
+ FParser: TPSPascalParser;
+ FParserHadError: Boolean;
+ FMessages: TPSList;
+ FOnUses: TPSOnUses;
+ FUtf8Decode: Boolean;
+ FIsUnit: Boolean;
+ FAllowNoBegin: Boolean;
+ FAllowNoEnd: Boolean;
+ FAllowUnit: Boolean;
+ FBooleanShortCircuit: Boolean;
+ FDebugOutput: tbtString;
+ FOnExternalProc: TPSOnExternalProc;
+ FOnUseVariable: TPSOnUseVariable;
+ FOnBeforeOutput: TPSOnNotify;
+ FOnBeforeCleanup: TPSOnNotify;
+ FOnWriteLine: TPSOnWriteLineEvent;
+ FContinueOffsets, FBreakOffsets: TPSList;
+ FOnTranslateLineInfo: TPSOnTranslateLineInfoProc;
+ FAutoFreeList: TPSList;
+ FClasses: TPSList;
+ FOnFunctionStart: TPSOnFunction;
+ FOnFunctionEnd: TPSOnFunction;
+
+
+ FWithCount: Integer;
+ FTryCount: Integer;
+ FExceptFinallyCount: Integer;
+
+
+ {$IFDEF PS_USESSUPPORT}
+ FUnitInits : TPSList; //nvds
+ FUnitFinits: TPSList; //nvds
+ FUses : TIFStringList;
+ fModule : tbtString;
+ {$ENDIF}
+ fInCompile : Integer;
+{$IFNDEF PS_NOINTERFACES}
+ FInterfaces: TPSList;
+{$ENDIF}
+
+ FCurrUsedTypeNo: Cardinal;
+ FGlobalBlock: TPSBlockInfo;
+
+ function IsBoolean(aType: TPSType): Boolean;
+ {$IFNDEF PS_NOWIDESTRING}
+
+ function GetWideString(Src: PIfRVariant; var s: Boolean): tbtwidestring;
+ function GetUnicodeString(Src: PIfRVariant; var s: Boolean): tbtunicodestring;
+ {$ENDIF}
+ function PreCalc(FUseUsedTypes: Boolean; Var1Mod: Byte; var1: PIFRVariant; Var2Mod: Byte;
+ Var2: PIfRVariant; Cmd: TPSBinOperatorType; Pos, Row, Col: Cardinal): Boolean;
+
+ function FindBaseType(BaseType: TPSBaseType): TPSType;
+
+ function IsIntBoolType(aType: TPSType): Boolean;
+ function GetTypeCopyLink(p: TPSType): TPSType;
+
+ function at2ut(p: TPSType): TPSType;
+ procedure UseProc(procdecl: TPSParametersDecl);
+
+
+ function GetMsgCount: Longint;
+
+ function GetMsg(l: Longint): TPSPascalCompilerMessage;
+
+
+ function MakeExportDecl(decl: TPSParametersDecl): tbtString;
+
+
+ procedure DefineStandardTypes;
+
+ procedure DefineStandardProcedures;
+
+ function ReadReal(const s: tbtString): PIfRVariant;
+ function ReadString: PIfRVariant;
+ function ReadInteger(const s: tbtString): PIfRVariant;
+ function ReadAttributes(Dest: TPSAttributes): Boolean;
+ function ReadConstant(FParser: TPSPascalParser; StopOn: TPSPasToken): PIfRVariant;
+
+ function ApplyAttribsToFunction(func: TPSProcedure): boolean;
+ function ProcessFunction(AlwaysForward: Boolean; Att: TPSAttributes): Boolean;
+ function ValidateParameters(BlockInfo: TPSBlockInfo; Params: TPSParameters; ParamTypes: TPSParametersDecl): boolean;
+
+ function IsVarInCompatible(ft1, ft2: TPSType): Boolean;
+ function GetTypeNo(BlockInfo: TPSBlockInfo; p: TPSValue): TPSType;
+ function DoVarBlock(proc: TPSInternalProcedure): Boolean;
+ function DoTypeBlock(FParser: TPSPascalParser): Boolean;
+ function ReadType(const Name: tbtString; FParser: TPSPascalParser): TPSType;
+ function ProcessLabel(Proc: TPSInternalProcedure): Boolean;
+ function ProcessSub(BlockInfo: TPSBlockInfo): Boolean;
+ function ProcessLabelForwards(Proc: TPSInternalProcedure): Boolean;
+
+ procedure WriteDebugData(const s: tbtString);
+
+ procedure Debug_SavePosition(ProcNo: Cardinal; Proc: TPSInternalProcedure);
+
+ procedure Debug_WriteParams(ProcNo: Cardinal; Proc: TPSInternalProcedure);
+
+ procedure Debug_WriteLine(BlockInfo: TPSBlockInfo);
+
+
+ function IsCompatibleType(p1, p2: TPSType; Cast: Boolean): Boolean;
+
+ function IsDuplicate(const s: tbtString; const check: TPSDuplicCheck): Boolean;
+
+ function NewProc(const OriginalName, Name: tbtString): TPSInternalProcedure;
+
+ function AddUsedFunction(var Proc: TPSInternalProcedure): Cardinal;
+
+ function AddUsedFunction2(var Proc: TPSExternalProcedure): Cardinal;
+
+
+ function CheckCompatProc(P: TPSType; ProcNo: Cardinal): Boolean;
+
+
+ procedure ParserError(Parser: TObject; Kind: TPSParserErrorKind);
+
+ function ReadTypeAddProcedure(const Name: tbtString; FParser: TPSPascalParser): TPSType;
+
+ function VarIsDuplicate(Proc: TPSInternalProcedure; const VarNames, s: tbtString): Boolean;
+
+ function IsProcDuplicLabel(Proc: TPSInternalProcedure; const s: tbtString): Boolean;
+
+ procedure CheckForUnusedVars(Func: TPSInternalProcedure);
+ function ProcIsDuplic(Decl: TPSParametersDecl; const FunctionName, FunctionParamNames: tbtString; const s: tbtString; Func: TPSInternalProcedure): Boolean;
+ public
+ function GetConstant(const Name: tbtString): TPSConstant;
+
+ function UseExternalProc(const Name: tbtString): TPSParametersDecl;
+
+ function FindProc(const aName: tbtString): Cardinal;
+
+ function GetTypeCount: Longint;
+
+ function GetType(I: Longint): TPSType;
+
+ function GetVarCount: Longint;
+
+ function GetVar(I: Longint): TPSVar;
+
+ function GetProcCount: Longint;
+
+ function GetProc(I: Longint): TPSProcedure;
+
+ function GetConstCount: Longint;
+
+ function GetConst(I: Longint): TPSConstant;
+
+ function GetRegProcCount: Longint;
+
+ function GetRegProc(I: Longint): TPSRegProc;
+
+ function AddAttributeType: TPSAttributeType;
+ function FindAttributeType(const Name: tbtString): TPSAttributeType;
+
+ procedure AddToFreeList(Obj: TObject);
+
+ property ID: Pointer read FID write FID;
+
+ function MakeError(const Module: tbtString; E: TPSPascalCompilerErrorType; const
+ Param: tbtString): TPSPascalCompilerMessage;
+
+ function MakeWarning(const Module: tbtString; E: TPSPascalCompilerWarningType;
+ const Param: tbtString): TPSPascalCompilerMessage;
+
+ function MakeHint(const Module: tbtString; E: TPSPascalCompilerHintType;
+ const Param: tbtString): TPSPascalCompilerMessage;
+
+{$IFNDEF PS_NOINTERFACES}
+
+ function AddInterface(InheritedFrom: TPSInterface; Guid: TGuid; const Name: tbtString): TPSInterface;
+
+ function FindInterface(const Name: tbtString): TPSInterface;
+
+{$ENDIF}
+ function AddClass(InheritsFrom: TPSCompileTimeClass; aClass: TClass): TPSCompileTimeClass;
+
+ function AddClassN(InheritsFrom: TPSCompileTimeClass; const aClass: tbtString): TPSCompileTimeClass;
+
+
+ function FindClass(const aClass: tbtString): TPSCompileTimeClass;
+
+ function AddFunction(const Header: tbtString): TPSRegProc;
+
+ function AddDelphiFunction(const Decl: tbtString): TPSRegProc;
+
+ function AddType(const Name: tbtString; const BaseType: TPSBaseType): TPSType;
+
+ function AddTypeS(const Name, Decl: tbtString): TPSType;
+
+ function AddTypeCopy(const Name: tbtString; TypeNo: TPSType): TPSType;
+
+ function AddTypeCopyN(const Name, FType: tbtString): TPSType;
+
+ function AddConstant(const Name: tbtString; FType: TPSType): TPSConstant;
+
+ function AddConstantN(const Name, FType: tbtString): TPSConstant;
+
+ function AddVariable(const Name: tbtString; FType: TPSType): TPSVar;
+
+ function AddVariableN(const Name, FType: tbtString): TPSVar;
+
+ function AddUsedVariable(const Name: tbtString; FType: TPSType): TPSVar;
+
+ function AddUsedVariableN(const Name, FType: tbtString): TPSVar;
+
+ function AddUsedPtrVariable(const Name: tbtString; FType: TPSType): TPSVar;
+
+ function AddUsedPtrVariableN(const Name, FType: tbtString): TPSVar;
+
+ function FindType(const Name: tbtString): TPSType;
+
+ function MakeDecl(decl: TPSParametersDecl): tbtString;
+
+ function Compile(const s: tbtString): Boolean;
+
+ function GetOutput(var s: tbtString): Boolean;
+
+ function GetDebugOutput(var s: tbtString): Boolean;
+
+ procedure Clear;
+
+ constructor Create;
+
+ destructor Destroy; override;
+
+ property MsgCount: Longint read GetMsgCount;
+
+ property Msg[l: Longint]: TPSPascalCompilerMessage read GetMsg;
+
+ property OnTranslateLineInfo: TPSOnTranslateLineInfoProc read FOnTranslateLineInfo write FOnTranslateLineInfo;
+
+ property OnUses: TPSOnUses read FOnUses write FOnUses;
+
+ property OnExportCheck: TPSOnExportCheck read FOnExportCheck write FOnExportCheck;
+
+ property OnWriteLine: TPSOnWriteLineEvent read FOnWriteLine write FOnWriteLine;
+
+ property OnExternalProc: TPSOnExternalProc read FOnExternalProc write FOnExternalProc;
+
+ property OnUseVariable: TPSOnUseVariable read FOnUseVariable write FOnUseVariable;
+
+ property OnBeforeOutput: TPSOnNotify read FOnBeforeOutput write FOnBeforeOutput;
+
+ property OnBeforeCleanup: TPSOnNotify read FOnBeforeCleanup write FOnBeforeCleanup;
+
+ property OnFunctionStart: TPSOnFunction read FOnFunctionStart write FOnFunctionStart;
+
+ property OnFunctionEnd: TPSOnFunction read FOnFunctionEnd write FOnFunctionEnd;
+
+ property IsUnit: Boolean read FIsUnit;
+
+ property AllowNoBegin: Boolean read FAllowNoBegin write FAllowNoBegin;
+
+ property AllowUnit: Boolean read FAllowUnit write FAllowUnit;
+
+ property AllowNoEnd: Boolean read FAllowNoEnd write FAllowNoEnd;
+
+
+ property BooleanShortCircuit: Boolean read FBooleanShortCircuit write FBooleanShortCircuit;
+
+ property UTF8Decode: Boolean read FUtf8Decode write FUtf8Decode;
+
+ property UnitName: tbtString read FUnitName;
+ end;
+ TIFPSPascalCompiler = TPSPascalCompiler;
+
+ TPSValue = class(TObject)
+ private
+ FPos, FRow, FCol: Cardinal;
+ public
+
+ property Pos: Cardinal read FPos write FPos;
+
+ property Row: Cardinal read FRow write FRow;
+
+ property Col: Cardinal read FCol write FCol;
+
+ procedure SetParserPos(P: TPSPascalParser);
+
+ end;
+
+ TPSParameter = class(TObject)
+ private
+ FValue: TPSValue;
+ FTempVar: TPSValue;
+ FParamMode: TPSParameterMode;
+ FExpectedType: TPSType;
+ public
+
+ property Val: TPSValue read FValue write FValue;
+
+ property ExpectedType: TPSType read FExpectedType write FExpectedType;
+
+ property TempVar: TPSValue read FTempVar write FTempVar;
+
+ property ParamMode: TPSParameterMode read FParamMode write FParamMode;
+
+ destructor Destroy; override;
+ end;
+
+ TPSParameters = class(TObject)
+ private
+ FItems: TPSList;
+ function GetCount: Cardinal;
+ function GetItem(I: Longint): TPSParameter;
+ public
+
+ constructor Create;
+
+ destructor Destroy; override;
+
+ property Count: Cardinal read GetCount;
+
+ property Item[I: Longint]: TPSParameter read GetItem; default;
+
+ procedure Delete(I: Cardinal);
+
+ function Add: TPSParameter;
+ end;
+
+ TPSSubItem = class(TObject)
+ private
+ FType: TPSType;
+ public
+
+ property aType: TPSType read FType write FType;
+ end;
+
+ TPSSubNumber = class(TPSSubItem)
+ private
+ FSubNo: Cardinal;
+ public
+
+ property SubNo: Cardinal read FSubNo write FSubNo;
+ end;
+
+ TPSSubValue = class(TPSSubItem)
+ private
+ FSubNo: TPSValue;
+ public
+
+ property SubNo: TPSValue read FSubNo write FSubNo;
+
+ destructor Destroy; override;
+ end;
+
+ TPSValueVar = class(TPSValue)
+ private
+ FRecItems: TPSList;
+ function GetRecCount: Cardinal;
+ function GetRecItem(I: Cardinal): TPSSubItem;
+ public
+ constructor Create;
+ destructor Destroy; override;
+
+ function RecAdd(Val: TPSSubItem): Cardinal;
+
+ procedure RecDelete(I: Cardinal);
+
+ property RecItem[I: Cardinal]: TPSSubItem read GetRecItem;
+
+ property RecCount: Cardinal read GetRecCount;
+ end;
+
+ TPSValueGlobalVar = class(TPSValueVar)
+ private
+ FAddress: Cardinal;
+ public
+
+ property GlobalVarNo: Cardinal read FAddress write FAddress;
+ end;
+
+
+ TPSValueLocalVar = class(TPSValueVar)
+ private
+ FLocalVarNo: Longint;
+ public
+
+ property LocalVarNo: Longint read FLocalVarNo write FLocalVarNo;
+ end;
+
+ TPSValueParamVar = class(TPSValueVar)
+ private
+ FParamNo: Longint;
+ public
+
+ property ParamNo: Longint read FParamNo write FParamNo;
+ end;
+
+ TPSValueAllocatedStackVar = class(TPSValueLocalVar)
+ private
+ FProc: TPSInternalProcedure;
+ public
+
+ property Proc: TPSInternalProcedure read FProc write FProc;
+ destructor Destroy; override;
+ end;
+
+ TPSValueData = class(TPSValue)
+ private
+ FData: PIfRVariant;
+ public
+
+ property Data: PIfRVariant read FData write FData;
+ destructor Destroy; override;
+ end;
+
+ TPSValueReplace = class(TPSValue)
+ private
+ FPreWriteAllocated: Boolean;
+ FFreeOldValue: Boolean;
+ FFreeNewValue: Boolean;
+ FOldValue: TPSValue;
+ FNewValue: TPSValue;
+ FReplaceTimes: Longint;
+ public
+
+ property OldValue: TPSValue read FOldValue write FOldValue;
+
+ property NewValue: TPSValue read FNewValue write FNewValue;
+ {Should it free the old value when destroyed?}
+ property FreeOldValue: Boolean read FFreeOldValue write FFreeOldValue;
+ property FreeNewValue: Boolean read FFreeNewValue write FFreeNewValue;
+ property PreWriteAllocated: Boolean read FPreWriteAllocated write FPreWriteAllocated;
+
+ property ReplaceTimes: Longint read FReplaceTimes write FReplaceTimes;
+
+ constructor Create;
+ destructor Destroy; override;
+ end;
+
+
+ TPSUnValueOp = class(TPSValue)
+ private
+ FVal1: TPSValue;
+ FOperator: TPSUnOperatorType;
+ FType: TPSType;
+ public
+
+ property Val1: TPSValue read FVal1 write FVal1;
+ {The operator}
+ property Operator: TPSUnOperatorType read FOperator write FOperator;
+
+ property aType: TPSType read FType write FType;
+ destructor Destroy; override;
+ end;
+
+ TPSBinValueOp = class(TPSValue)
+ private
+ FVal1,
+ FVal2: TPSValue;
+ FOperator: TPSBinOperatorType;
+ FType: TPSType;
+ public
+
+ property Val1: TPSValue read FVal1 write FVal1;
+
+ property Val2: TPSValue read FVal2 write FVal2;
+ {The operator for this value}
+ property Operator: TPSBinOperatorType read FOperator write FOperator;
+
+ property aType: TPSType read FType write FType;
+
+ destructor Destroy; override;
+ end;
+
+ TPSValueNil = class(TPSValue)
+ end;
+
+ TPSValueProcPtr = class(TPSValue)
+ private
+ FProcNo: Cardinal;
+ public
+
+ property ProcPtr: Cardinal read FProcNo write FProcNo;
+ end;
+
+ TPSValueProc = class(TPSValue)
+ private
+ FSelfPtr: TPSValue;
+ FParameters: TPSParameters;
+ FResultType: TPSType;
+ public
+ property ResultType: TPSType read FResultType write FResultType;
+
+ property SelfPtr: TPSValue read FSelfPtr write FSelfPtr;
+
+ property Parameters: TPSParameters read FParameters write FParameters;
+ destructor Destroy; override;
+ end;
+
+ TPSValueProcNo = class(TPSValueProc)
+ private
+ FProcNo: Cardinal;
+ public
+
+ property ProcNo: Cardinal read FProcNo write FProcNo;
+ end;
+
+ TPSValueProcVal = class(TPSValueProc)
+ private
+ FProcNo: TPSValue;
+ public
+
+ property ProcNo: TPSValue read FProcNo write FProcNo;
+
+ destructor Destroy; override;
+ end;
+
+ TPSValueArray = class(TPSValue)
+ private
+ FItems: TPSList;
+ function GetCount: Cardinal;
+ function GetItem(I: Cardinal): TPSValue;
+ public
+ function Add(Item: TPSValue): Cardinal;
+ procedure Delete(I: Cardinal);
+ property Item[I: Cardinal]: TPSValue read GetItem;
+ property Count: Cardinal read GetCount;
+
+ constructor Create;
+ destructor Destroy; override;
+ end;
+
+ TPSDelphiClassItem = class;
+
+ TPSPropType = (iptRW, iptR, iptW);
+
+ TPSCompileTimeClass = class
+ private
+ FInheritsFrom: TPSCompileTimeClass;
+ FClass: TClass;
+ FClassName: tbtString;
+ FClassNameHash: Longint;
+ FClassItems: TPSList;
+ FDefaultProperty: Cardinal;
+ FIsAbstract: Boolean;
+ FCastProc,
+ FNilProc: Cardinal;
+ FType: TPSType;
+
+ FOwner: TPSPascalCompiler;
+ function GetCount: Longint;
+ function GetItem(i: Longint): TPSDelphiClassItem;
+ public
+
+ property aType: TPSType read FType;
+
+ property Items[i: Longint]: TPSDelphiClassItem read GetItem;
+
+ property Count: Longint read GetCount;
+
+ property IsAbstract: Boolean read FIsAbstract write FIsAbstract;
+
+
+ property ClassInheritsFrom: TPSCompileTimeClass read FInheritsFrom write FInheritsFrom;
+
+ function RegisterMethod(const Decl: tbtString): Boolean;
+
+ procedure RegisterProperty(const PropertyName, PropertyType: tbtString; PropAC: TPSPropType);
+
+ procedure RegisterPublishedProperties;
+
+ function RegisterPublishedProperty(const Name: tbtString): Boolean;
+
+ procedure SetDefaultPropery(const Name: tbtString);
+
+ constructor Create(ClassName: tbtString; aOwner: TPSPascalCompiler; aType: TPSType);
+
+ class function CreateC(FClass: TClass; aOwner: TPSPascalCompiler; aType: TPSType): TPSCompileTimeClass;
+
+
+ destructor Destroy; override;
+
+
+ function IsCompatibleWith(aType: TPSType): Boolean;
+
+ function SetNil(var ProcNo: Cardinal): Boolean;
+
+ function CastToType(IntoType: TPSType; var ProcNo: Cardinal): Boolean;
+
+
+ function Property_Find(const Name: tbtString; var Index: IPointer): Boolean;
+
+ function Property_Get(Index: IPointer; var ProcNo: Cardinal): Boolean;
+
+ function Property_Set(Index: IPointer; var ProcNo: Cardinal): Boolean;
+
+ function Property_GetHeader(Index: IPointer; Dest: TPSParametersDecl): Boolean;
+
+
+ function Func_Find(const Name: tbtString; var Index: IPointer): Boolean;
+
+ function Func_Call(Index: IPointer; var ProcNo: Cardinal): Boolean;
+
+
+ function ClassFunc_Find(const Name: tbtString; var Index: IPointer): Boolean;
+
+ function ClassFunc_Call(Index: IPointer; var ProcNo: Cardinal): Boolean;
+ end;
+
+ TPSDelphiClassItem = class(TObject)
+ private
+ FOwner: TPSCompileTimeClass;
+ FOrgName: tbtString;
+ FName: tbtString;
+ FNameHash: Longint;
+ FDecl: TPSParametersDecl;
+ procedure SetName(const s: tbtString);
+ public
+
+ constructor Create(Owner: TPSCompileTimeClass);
+
+ destructor Destroy; override;
+
+ property Decl: TPSParametersDecl read FDecl;
+
+ property Name: tbtString read FName;
+
+ property OrgName: tbtString read FOrgName write SetName;
+
+ property NameHash: Longint read FNameHash;
+
+ property Owner: TPSCompileTimeClass read FOwner;
+ end;
+
+ TPSDelphiClassItemMethod = class(TPSDelphiClassItem)
+ private
+ FMethodNo: Cardinal;
+ public
+
+ property MethodNo: Cardinal read FMethodNo write FMethodNo;
+ end;
+
+ TPSDelphiClassItemProperty = class(TPSDelphiClassItem)
+ private
+ FReadProcNo: Cardinal;
+ FWriteProcNo: Cardinal;
+ FAccessType: TPSPropType;
+ public
+
+ property AccessType: TPSPropType read FAccessType write FAccessType;
+
+ property ReadProcNo: Cardinal read FReadProcNo write FReadProcNo;
+
+ property WriteProcNo: Cardinal read FWriteProcNo write FWriteProcNo;
+ end;
+
+
+ TPSDelphiClassItemConstructor = class(TPSDelphiClassItemMethod)
+ end;
+
+{$IFNDEF PS_NOINTERFACES}
+
+ TPSInterface = class(TObject)
+ private
+ FOwner: TPSPascalCompiler;
+ FType: TPSType;
+ FInheritedFrom: TPSInterface;
+ FGuid: TGuid;
+ FCastProc,
+ FNilProc: Cardinal;
+ FItems: TPSList;
+ FName: tbtString;
+ FNameHash: Longint;
+ procedure SetInheritedFrom(p: TPSInterface);
+ public
+
+ constructor Create(Owner: TPSPascalCompiler; InheritedFrom: TPSInterface; Guid: TGuid; const Name: tbtString; aType: TPSType);
+
+ destructor Destroy; override;
+
+ property aType: TPSType read FType;
+
+ property InheritedFrom: TPSInterface read FInheritedFrom write SetInheritedFrom;
+
+ property Guid: TGuid read FGuid write FGuid;
+
+ property Name: tbtString read FName write FName;
+
+ property NameHash: Longint read FNameHash;
+
+
+ function RegisterMethod(const Declaration: tbtString; const cc: TPSCallingConvention): Boolean;
+
+ function RegisterMethodEx(const Declaration: tbtString; const cc: TPSCallingConvention; const CustomParser: TPSPascalParser): Boolean;
+
+ procedure RegisterDummyMethod;
+
+ function IsCompatibleWith(aType: TPSType): Boolean;
+
+ function SetNil(var ProcNo: Cardinal): Boolean;
+
+ function CastToType(IntoType: TPSType; var ProcNo: Cardinal): Boolean;
+
+ function Func_Find(const Name: tbtString; var Index: Cardinal): Boolean;
+
+ function Func_Call(Index: Cardinal; var ProcNo: Cardinal): Boolean;
+ end;
+
+
+ TPSInterfaceMethod = class(TObject)
+ private
+ FName: tbtString;
+ FDecl: TPSParametersDecl;
+ FNameHash: Longint;
+ FCC: TPSCallingConvention;
+ FScriptProcNo: Cardinal;
+ FOrgName: tbtString;
+ FOwner: TPSInterface;
+ FOffsetCache: Cardinal;
+ function GetAbsoluteProcOffset: Cardinal;
+ public
+
+ property AbsoluteProcOffset: Cardinal read GetAbsoluteProcOffset;
+
+ property ScriptProcNo: Cardinal read FScriptProcNo;
+
+ property OrgName: tbtString read FOrgName;
+
+ property Name: tbtString read FName;
+
+ property NameHash: Longint read FNameHash;
+
+ property Decl: TPSParametersDecl read FDecl;
+
+ property CC: TPSCallingConvention read FCC;
+
+
+ constructor Create(Owner: TPSInterface);
+
+ destructor Destroy; override;
+ end;
+{$ENDIF}
+
+
+ TPSExternalClass = class(TObject)
+ protected
+
+ SE: TPSPascalCompiler;
+
+ FTypeNo: TPSType;
+ public
+
+ function SelfType: TPSType; virtual;
+
+ constructor Create(Se: TPSPascalCompiler; TypeNo: TPSType);
+
+ function ClassFunc_Find(const Name: tbtString; var Index: Cardinal): Boolean; virtual;
+
+ function ClassFunc_Call(Index: Cardinal; var ProcNo: Cardinal): Boolean; virtual;
+
+ function Func_Find(const Name: tbtString; var Index: Cardinal): Boolean; virtual;
+
+ function Func_Call(Index: Cardinal; var ProcNo: Cardinal): Boolean; virtual;
+
+ function IsCompatibleWith(Cl: TPSExternalClass): Boolean; virtual;
+
+ function SetNil(var ProcNo: Cardinal): Boolean; virtual;
+
+ function CastToType(IntoType: TPSType; var ProcNo: Cardinal): Boolean; virtual;
+
+ function CompareClass(OtherTypeNo: TPSType; var ProcNo: Cardinal): Boolean; virtual;
+ end;
+
+
+function ExportCheck(Sender: TPSPascalCompiler; Proc: TPSInternalProcedure;
+ Types: array of TPSBaseType; Modes: array of TPSParameterMode): Boolean;
+
+
+procedure SetVarExportName(P: TPSVar; const ExpName: tbtString);
+
+function AddImportedClassVariable(Sender: TPSPascalCompiler; const VarName, VarType: tbtString): Boolean;
+
+const
+ {Invalid value, this is returned by most functions of pascal script that return a cardinal, when they fail}
+ InvalidVal = Cardinal(-1);
+
+type
+ TIFPSCompileTimeClass = TPSCompileTimeClass;
+ TIFPSInternalProcedure = TPSInternalProcedure;
+ TIFPSPascalCompilerError = TPSPascalCompilerError;
+
+ TPMFuncType = (mftProc
+ , mftConstructor
+ );
+
+
+function PS_mi2s(i: Cardinal): tbtString;
+
+function ParseMethod(Owner: TPSPascalCompiler; const FClassName: tbtString; Decl: tbtString; var OrgName: tbtString; DestDecl: TPSParametersDecl; var Func: TPMFuncType): Boolean;
+function ParseMethodEx(Owner: TPSPascalCompiler; const FClassName: tbtString; Decl: tbtString; var OrgName: tbtString; DestDecl: TPSParametersDecl; var Func: TPMFuncType; CustomParser: TPSPascalParser): Boolean;
+
+function DeclToBits(const Decl: TPSParametersDecl): tbtString;
+
+function NewVariant(FType: TPSType): PIfRVariant;
+procedure DisposeVariant(p: PIfRVariant);
+
+implementation
+
+uses Classes, typInfo;
+
+{$IFDEF DELPHI3UP}
+resourceString
+{$ELSE}
+const
+{$ENDIF}
+
+ RPS_OnUseEventOnly = 'This function can only be called from within the OnUses event';
+ RPS_UnableToRegisterFunction = 'Unable to register function %s';
+ RPS_UnableToRegisterConst = 'Unable to register constant %s';
+ RPS_InvalidTypeForVar = 'Invalid type for variable %s';
+ RPS_InvalidType = 'Invalid Type';
+ RPS_UnableToRegisterType = 'Unable to register type %s';
+ RPS_UnknownInterface = 'Unknown interface: %s';
+ RPS_ConstantValueMismatch = 'Constant Value Type Mismatch';
+ RPS_ConstantValueNotAssigned = 'Constant Value is not assigned';
+
+ RPS_Error = 'Error';
+ RPS_UnknownIdentifier = 'Unknown identifier ''%s''';
+ RPS_IdentifierExpected = 'Identifier expected';
+ RPS_CommentError = 'Comment error';
+ RPS_StringError = 'String error';
+ RPS_CharError = 'Char error';
+ RPS_SyntaxError = 'Syntax error';
+ RPS_EOF = 'Unexpected end of file';
+ RPS_SemiColonExpected = 'Semicolon ('';'') expected';
+ RPS_BeginExpected = '''BEGIN'' expected';
+ RPS_PeriodExpected = 'period (''.'') expected';
+ RPS_DuplicateIdent = 'Duplicate identifier ''%s''';
+ RPS_ColonExpected = 'colon ('':'') expected';
+ RPS_UnknownType = 'Unknown type ''%s''';
+ RPS_CloseRoundExpected = 'Closing parenthesis expected';
+ RPS_TypeMismatch = 'Type mismatch';
+ RPS_InternalError = 'Internal error (%s)';
+ RPS_AssignmentExpected = 'Assignment expected';
+ RPS_ThenExpected = '''THEN'' expected';
+ RPS_DoExpected = '''DO'' expected';
+ RPS_NoResult = 'No result';
+ RPS_OpenRoundExpected = 'opening parenthesis (''('')expected';
+ RPS_CommaExpected = 'comma ('','') expected';
+ RPS_ToExpected = '''TO'' expected';
+ RPS_IsExpected = 'is (''='') expected';
+ RPS_OfExpected = '''OF'' expected';
+ RPS_CloseBlockExpected = 'Closing square bracket ('']'') expected';
+ RPS_VariableExpected = 'Variable Expected';
+ RPS_StringExpected = 'String Expected';
+ RPS_EndExpected = '''END'' expected';
+ RPS_UnSetLabel = 'Label ''%s'' not set';
+ RPS_NotInLoop = 'Not in a loop';
+ RPS_InvalidJump = 'Invalid jump';
+ RPS_OpenBlockExpected = 'Opening square brackets (''['') expected';
+ RPS_WriteOnlyProperty = 'Write-only property';
+ RPS_ReadOnlyProperty = 'Read-only property';
+ RPS_ClassTypeExpected = 'Class type expected';
+ RPS_DivideByZero = 'Divide by Zero';
+ RPS_MathError = 'Math Error';
+ RPS_UnsatisfiedForward = 'Unsatisfied Forward %s';
+ RPS_ForwardParameterMismatch = 'Forward Parameter Mismatch';
+ RPS_InvalidNumberOfParameter = 'Invalid number of parameters';
+ RPS_UnknownError = 'Unknown error';
+ {$IFDEF PS_USESSUPPORT}
+ RPS_NotAllowed = '%s is not allowed at this position';
+ RPS_UnitNotFound = 'Unit ''%s'' not found or contains errors';
+ {$ENDIF}
+
+
+ RPS_Hint = 'Hint';
+ RPS_VariableNotUsed = 'Variable ''%s'' never used';
+ RPS_FunctionNotUsed = 'Function ''%s'' never used';
+ RPS_UnknownHint = 'Unknown hint';
+
+
+ RPS_Warning = 'Warning';
+ RPS_CalculationAlwaysEvaluatesTo = 'Calculation always evaluates to %s';
+ RPS_IsNotNeeded = '%s is not needed';
+ RPS_AbstractClass = 'Abstract Class Construction';
+ RPS_UnknownWarning = 'Unknown warning';
+
+
+ {$IFDEF DEBUG }
+ RPS_UnableToRegister = 'Unable to register %s';
+ {$ENDIF}
+
+ RPS_NotArrayProperty = 'Not an array property';
+ RPS_NotProperty = 'Not a property';
+ RPS_UnknownProperty = 'Unknown Property';
+
+function DeclToBits(const Decl: TPSParametersDecl): tbtString;
+var
+ i: longint;
+begin
+ Result := '';
+ if Decl.Result = nil then
+ begin
+ Result := Result + #0;
+ end else
+ Result := Result + #1;
+ for i := 0 to Decl.ParamCount -1 do
+ begin
+ if Decl.Params[i].Mode <> pmIn then
+ Result := Result + #1
+ else
+ Result := Result + #0;
+ end;
+end;
+
+
+procedure BlockWriteByte(BlockInfo: TPSBlockInfo; b: Byte);
+begin
+ BlockInfo.Proc.Data := BlockInfo.Proc.Data + tbtChar(b);
+end;
+
+procedure BlockWriteData(BlockInfo: TPSBlockInfo; const Data; Len: Longint);
+begin
+ SetLength(BlockInfo.Proc.FData, Length(BlockInfo.Proc.FData) + Len);
+ Move(Data, BlockInfo.Proc.FData[Length(BlockInfo.Proc.FData) - Len + 1], Len);
+end;
+
+procedure BlockWriteLong(BlockInfo: TPSBlockInfo; l: Cardinal);
+begin
+ BlockWriteData(BlockInfo, l, 4);
+end;
+
+procedure BlockWriteVariant(BlockInfo: TPSBlockInfo; p: PIfRVariant);
+var
+ du8: tbtu8;
+ du16: tbtu16;
+begin
+ BlockWriteLong(BlockInfo, p^.FType.FinalTypeNo);
+ case p.FType.BaseType of
+ btType: BlockWriteData(BlockInfo, p^.ttype.FinalTypeno, 4);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString:
+ begin
+ BlockWriteLong(BlockInfo, Length(tbtWideString(p^.twidestring)));
+ BlockWriteData(BlockInfo, tbtwidestring(p^.twidestring)[1], 2*Length(tbtWideString(p^.twidestring)));
+ end;
+ btUnicodeString:
+ begin
+ BlockWriteLong(BlockInfo, Length(tbtUnicodeString(p^.twidestring)));
+ BlockWriteData(BlockInfo, tbtUnicodeString(p^.twidestring)[1], 2*Length(tbtUnicodeString(p^.twidestring)));
+ end;
+ btWideChar: BlockWriteData(BlockInfo, p^.twidechar, 2);
+ {$ENDIF}
+ btSingle: BlockWriteData(BlockInfo, p^.tsingle, sizeof(tbtSingle));
+ btDouble: BlockWriteData(BlockInfo, p^.tdouble, sizeof(tbtDouble));
+ btExtended: BlockWriteData(BlockInfo, p^.textended, sizeof(tbtExtended));
+ btCurrency: BlockWriteData(BlockInfo, p^.tcurrency, sizeof(tbtCurrency));
+ btChar: BlockWriteData(BlockInfo, p^.tchar, 1);
+ btSet:
+ begin
+ BlockWriteData(BlockInfo, tbtString(p^.tstring)[1], Length(tbtString(p^.tstring)));
+ end;
+ btString:
+ begin
+ BlockWriteLong(BlockInfo, Length(tbtString(p^.tstring)));
+ BlockWriteData(BlockInfo, tbtString(p^.tstring)[1], Length(tbtString(p^.tstring)));
+ end;
+ btenum:
+ begin
+ if TPSEnumType(p^.FType).HighValue <=256 then
+ begin
+ du8 := tbtu8(p^.tu32);
+ BlockWriteData(BlockInfo, du8, 1)
+ end
+ else if TPSEnumType(p^.FType).HighValue <=65536 then
+ begin
+ du16 := tbtu16(p^.tu32);
+ BlockWriteData(BlockInfo, du16, 2)
+ end;
+ end;
+
+ bts8,btu8: BlockWriteData(BlockInfo, p^.tu8, 1);
+ bts16,btu16: BlockWriteData(BlockInfo, p^.tu16, 2);
+ bts32,btu32: BlockWriteData(BlockInfo, p^.tu32, 4);
+ {$IFNDEF PS_NOINT64}
+ bts64: BlockWriteData(BlockInfo, p^.ts64, 8);
+ {$ENDIF}
+ btProcPtr: BlockWriteData(BlockInfo, p^.tu32, 4);
+ {$IFDEF DEBUG}
+ {$IFNDEF FPC}
+ else
+ asm int 3; end;
+ {$ENDIF}
+ {$ENDIF}
+ end;
+end;
+
+
+
+function ExportCheck(Sender: TPSPascalCompiler; Proc: TPSInternalProcedure; Types: array of TPSBaseType; Modes: array of TPSParameterMode): Boolean;
+var
+ i: Longint;
+ ttype: TPSType;
+begin
+ if High(Types) <> High(Modes)+1 then
+ begin
+ Result := False;
+ exit;
+ end;
+ if High(Types) <> Proc.Decl.ParamCount then
+ begin
+ Result := False;
+ exit;
+ end;
+ TType := Proc.Decl.Result;
+ if TType = nil then
+ begin
+ if Types[0] <> btReturnAddress then
+ begin
+ Result := False;
+ exit;
+ end;
+ end else
+ begin
+ if TType.BaseType <> Types[0] then
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ for i := 0 to High(Modes) do
+ begin
+ TType := Proc.Decl.Params[i].aType;
+ if Modes[i] <> Proc.Decl.Params[i].Mode then
+ begin
+ Result := False;
+ exit;
+ end;
+ if TType.BaseType <> Types[i+1] then
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := True;
+end;
+
+procedure SetVarExportName(P: TPSVar; const ExpName: tbtString);
+begin
+ if p <> nil then
+ p.exportname := ExpName;
+end;
+
+function FindAndAddType(Owner: TPSPascalCompiler; const Name, Decl: tbtString): TPSType;
+var
+ tt: TPSType;
+begin
+ Result := Owner.FindType(Name);
+ if Result = nil then
+ begin
+ tt := Owner.AddTypeS(Name, Decl);
+ tt.ExportName := True;
+ Result := tt;
+ end;
+end;
+
+function ParseMethod(Owner: TPSPascalCompiler; const FClassName: tbtString; Decl: tbtString; var OrgName: tbtString; DestDecl: TPSParametersDecl; var Func: TPMFuncType): Boolean;
+begin
+ Result := ParseMethodEx(Owner, FClassName, Decl, OrgName, DestDecl, Func, nil);
+end;
+
+function ParseMethodEx(Owner: TPSPascalCompiler; const FClassName: tbtString; Decl: tbtString; var OrgName: tbtString; DestDecl: TPSParametersDecl; var Func: TPMFuncType; CustomParser: TPSPascalParser): Boolean;
+var
+ Parser: TPSPascalParser;
+ FuncType: Byte;
+ VNames: tbtString;
+ modifier: TPSParameterMode;
+ VCType: TPSType;
+ ERow, EPos, ECol: Integer;
+
+begin
+ if CustomParser = nil then begin
+ Parser := TPSPascalParser.Create;
+ Parser.SetText(Decl);
+ end else
+ Parser := CustomParser;
+ if Parser.CurrTokenId = CSTII_Function then
+ FuncType:= 0
+ else if Parser.CurrTokenId = CSTII_Procedure then
+ FuncType := 1
+ else if (Parser.CurrTokenId = CSTII_Constructor) and (FClassName <> '') then
+ FuncType := 2
+ else
+ begin
+ if Parser <> CustomParser then
+ Parser.Free;
+ Result := False;
+ exit;
+ end;
+ Parser.Next;
+ if Parser.CurrTokenId <> CSTI_Identifier then
+ begin
+ if Parser <> CustomParser then
+ Parser.Free
+ else
+ Owner.MakeError('', ecIdentifierExpected, '');
+ Result := False;
+ exit;
+ end; {if}
+ OrgName := Parser.OriginalToken;
+ Parser.Next;
+ if Parser.CurrTokenId = CSTI_OpenRound then
+ begin
+ Parser.Next;
+ if Parser.CurrTokenId <> CSTI_CloseRound then
+ begin
+ while True do
+ begin
+ if Parser.CurrTokenId = CSTII_Const then
+ begin
+ modifier := pmIn;
+ Parser.Next;
+ end
+ else
+ if Parser.CurrTokenId = CSTII_Var then
+ begin
+ modifier := pmInOut;
+ Parser.Next;
+ end
+ else
+ if Parser.CurrTokenId = CSTII_Out then
+ begin
+ modifier := pmOut;
+ Parser.Next;
+ end
+ else
+ modifier := pmIn;
+ if Parser.CurrTokenId <> CSTI_Identifier then
+ begin
+ if Parser <> CustomParser then
+ Parser.Free
+ else
+ Owner.MakeError('', ecIdentifierExpected, '');
+ Result := False;
+ exit;
+ end;
+ EPos:=Parser.CurrTokenPos;
+ ERow:=Parser.Row;
+ ECol:=Parser.Col;
+
+ VNames := Parser.OriginalToken + '|';
+ Parser.Next;
+ while Parser.CurrTokenId = CSTI_Comma do
+ begin
+ Parser.Next;
+ if Parser.CurrTokenId <> CSTI_Identifier then
+ begin
+ if Parser <> CustomParser then
+ Parser.Free
+ else
+ Owner.MakeError('', ecIdentifierExpected, '');
+ Result := False;
+ exit;
+ end;
+ VNames := VNames + Parser.OriginalToken + '|';
+ Parser.Next;
+ end;
+ if Parser.CurrTokenId <> CSTI_Colon then
+ begin
+ if Parser <> CustomParser then
+ Parser.Free
+ else
+ Owner.MakeError('', ecColonExpected, '');
+ Result := False;
+ exit;
+ end;
+ Parser.Next;
+ if Parser.CurrTokenID = CSTII_Array then
+ begin
+ Parser.nExt;
+ if Parser.CurrTokenId <> CSTII_Of then
+ begin
+ if Parser <> CustomParser then
+ Parser.Free
+ else
+ Owner.MakeError('', ecOfExpected, '');
+ Result := False;
+ exit;
+ end;
+ Parser.Next;
+ if Parser.CurrTokenId = CSTII_Const then
+ begin
+ VCType := FindAndAddType(Owner, '!OPENARRAYOFCONST', 'array of ___Pointer')
+ end
+ else begin
+ VCType := Owner.GetTypeCopyLink(Owner.FindType(Parser.GetToken));
+ if VCType = nil then
+ begin
+ if Parser <> CustomParser then
+ Parser.Free
+ else
+ Owner.MakeError('', ecUnknownType, Parser.GetToken);
+ Result := False;
+ exit;
+ end;
+ case VCType.BaseType of
+ btU8: VCType := FindAndAddType(Owner, '!OPENARRAYOFU8', 'array of byte');
+ btS8: VCType := FindAndAddType(Owner, '!OPENARRAYOFS8', 'array of ShortInt');
+ btU16: VCType := FindAndAddType(Owner, '!OPENARRAYOFU16', 'array of SmallInt');
+ btS16: VCType := FindAndAddType(Owner, '!OPENARRAYOFS16', 'array of Word');
+ btU32: VCType := FindAndAddType(Owner, '!OPENARRAYOFU32', 'array of Cardinal');
+ btS32: VCType := FindAndAddType(Owner, '!OPENARRAYOFS32', 'array of Longint');
+ btSingle: VCType := FindAndAddType(Owner, '!OPENARRAYOFSINGLE', 'array of Single');
+ btDouble: VCType := FindAndAddType(Owner, '!OPENARRAYOFDOUBLE', 'array of Double');
+ btExtended: VCType := FindAndAddType(Owner, '!OPENARRAYOFEXTENDED', 'array of Extended');
+ btString: VCType := FindAndAddType(Owner, '!OPENARRAYOFSTRING', 'array of String');
+ btPChar: VCType := FindAndAddType(Owner, '!OPENARRAYOFPCHAR', {$IFDEF PS_PANSICHAR}'array of PAnsiChar'{$ELSE}'array of PChar'{$ENDIF});
+ btNotificationVariant, btVariant: VCType := FindAndAddType(Owner, '!OPENARRAYOFVARIANT', 'array of variant');
+ {$IFNDEF PS_NOINT64}btS64: VCType := FindAndAddType(Owner, '!OPENARRAYOFS64', 'array of Int64');{$ENDIF}
+ btChar: VCType := FindAndAddType(Owner, '!OPENARRAYOFCHAR', 'array of Char');
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString: VCType := FindAndAddType(Owner, '!OPENARRAYOFWIDESTRING', 'array of WideString');
+ btUnicodeString: VCType := FindAndAddType(Owner, '!OPENARRAYOFUNICODESTRING', 'array of UnicodeString');
+ btWideChar: VCType := FindAndAddType(Owner, '!OPENARRAYOFWIDECHAR', 'array of WideChar');
+ {$ENDIF}
+ btClass: VCType := FindAndAddType(Owner, '!OPENARRAYOFTOBJECT', 'array of TObject');
+ btRecord: VCType := FindAndAddType(Owner, '!OPENARRAYOFRECORD_'+FastUpperCase(Parser.OriginalToken), 'array of ' +FastUpperCase(Parser.OriginalToken));
+ else
+ begin
+ if Parser <> CustomParser then
+ Parser.Free;
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ end else if Parser.CurrTokenID = CSTII_Const then
+ VCType := nil // any type
+ else begin
+ VCType := Owner.FindType(Parser.GetToken);
+ if VCType = nil then
+ begin
+ if Parser <> CustomParser then
+ Parser.Free
+ else
+ Owner.MakeError('', ecUnknownType, Parser.GetToken);
+ Result := False;
+ exit;
+ end;
+ end;
+ while Pos(tbtchar('|'), VNames) > 0 do
+ begin
+ with DestDecl.AddParam do
+ begin
+ {$IFDEF PS_USESSUPPORT}
+ DeclareUnit:=Owner.fModule;
+ {$ENDIF}
+ DeclarePos := EPos;
+ DeclareRow := ERow;
+ DeclareCol := ECol;
+ Mode := modifier;
+ OrgName := copy(VNames, 1, Pos(tbtchar('|'), VNames) - 1);
+ aType := VCType;
+ end;
+ Delete(VNames, 1, Pos(tbtchar('|'), VNames));
+ end;
+ Parser.Next;
+ if Parser.CurrTokenId = CSTI_CloseRound then
+ break;
+ if Parser.CurrTokenId <> CSTI_Semicolon then
+ begin
+ if Parser <> CustomParser then
+ Parser.Free
+ else
+ Owner.MakeError('', ecSemiColonExpected, '');
+ Result := False;
+ exit;
+ end;
+ Parser.Next;
+ end; {while}
+ end; {if}
+ Parser.Next;
+ end; {if}
+ if FuncType = 0 then
+ begin
+ if Parser.CurrTokenId <> CSTI_Colon then
+ begin
+ if Parser <> CustomParser then
+ Parser.Free
+ else
+ Owner.MakeError('', ecColonExpected, '');
+ Result := False;
+ exit;
+ end;
+
+ Parser.Next;
+ VCType := Owner.FindType(Parser.GetToken);
+ if VCType = nil then
+ begin
+ if Parser <> CustomParser then
+ Parser.Free
+ else
+ Owner.MakeError('', ecUnknownType, Parser.GetToken);
+ Result := False;
+ exit;
+ end;
+ Parser.Next;
+ end
+ else if FuncType = 2 then {constructor}
+ begin
+ VCType := Owner.FindType(FClassName)
+ end else
+ VCType := nil;
+ DestDecl.Result := VCType;
+ if Parser <> CustomParser then
+ Parser.Free;
+ if FuncType = 2 then
+ Func := mftConstructor
+ else
+ Func := mftProc;
+ Result := True;
+end;
+
+
+
+function TPSPascalCompiler.FindProc(const aName: tbtString): Cardinal;
+var
+ l, h: Longint;
+ x: TPSProcedure;
+ xr: TPSRegProc;
+ name: tbtString;
+
+begin
+ name := FastUpperCase(aName);
+ h := MakeHash(Name);
+ if FProcs = nil then
+ begin
+ result := InvalidVal;
+ Exit;
+ end;
+
+ for l := FProcs.Count - 1 downto 0 do
+ begin
+ x := FProcs.Data^[l];
+ if x.ClassType = TPSInternalProcedure then
+ begin
+ if (TPSInternalProcedure(x).NameHash = h) and
+ (TPSInternalProcedure(x).Name = Name) then
+ begin
+ Result := l;
+ exit;
+ end;
+ end
+ else
+ begin
+ if (TPSExternalProcedure(x).RegProc.NameHash = h) and
+ (TPSExternalProcedure(x).RegProc.Name = Name) then
+ begin
+ Result := l;
+ exit;
+ end;
+ end;
+ end;
+ for l := FRegProcs.Count - 1 downto 0 do
+ begin
+ xr := FRegProcs[l];
+ if (xr.NameHash = h) and (xr.Name = Name) then
+ begin
+ x := TPSExternalProcedure.Create;
+ TPSExternalProcedure(x).RegProc := xr;
+ FProcs.Add(x);
+ Result := FProcs.Count - 1;
+ exit;
+ end;
+ end;
+ Result := InvalidVal;
+end; {findfunc}
+
+function TPSPascalCompiler.UseExternalProc(const Name: tbtString): TPSParametersDecl;
+var
+ ProcNo: cardinal;
+ proc: TPSProcedure;
+begin
+ ProcNo := FindProc(FastUppercase(Name));
+ if ProcNo = InvalidVal then Result := nil
+ else
+ begin
+ proc := TPSProcedure(FProcs[ProcNo]);
+ if Proc is TPSExternalProcedure then
+ begin
+ Result := TPSExternalProcedure(Proc).RegProc.Decl;
+ end else result := nil;
+ end;
+end;
+
+
+
+function TPSPascalCompiler.FindBaseType(BaseType: TPSBaseType): TPSType;
+var
+ l: Longint;
+ x: TPSType;
+begin
+ for l := 0 to FTypes.Count -1 do
+ begin
+ X := FTypes[l];
+ if (x.BaseType = BaseType) and (x.ClassType = TPSType) then
+ begin
+ Result := at2ut(x);
+ exit;
+ end;
+ end;
+ X := TPSType.Create;
+ x.Name := '';
+ x.BaseType := BaseType;
+ {$IFDEF PS_USESSUPPORT}
+ x.DeclareUnit:=fModule;
+ {$ENDIF}
+ x.DeclarePos := InvalidVal;
+ x.DeclareCol := 0;
+ x.DeclareRow := 0;
+ FTypes.Add(x);
+ Result := at2ut(x);
+end;
+
+function TPSPascalCompiler.MakeDecl(decl: TPSParametersDecl): tbtString;
+var
+ i: Longint;
+begin
+ if Decl.Result = nil then result := '0' else
+ result := Decl.Result.Name;
+
+ for i := 0 to decl.ParamCount -1 do
+ begin
+ if decl.GetParam(i).Mode = pmIn then
+ Result := Result + ' @'
+ else
+ Result := Result + ' !';
+ Result := Result + decl.GetParam(i).aType.Name;
+ end;
+end;
+
+
+{ TPSPascalCompiler }
+
+const
+ BtTypeCopy = 255;
+
+
+type
+ TFuncType = (ftProc, ftFunc);
+
+function PS_mi2s(i: Cardinal): tbtString;
+begin
+ SetLength(Result, 4);
+ Cardinal((@Result[1])^) := i;
+end;
+
+
+
+
+function TPSPascalCompiler.AddType(const Name: tbtString; const BaseType: TPSBaseType): TPSType;
+begin
+ if FProcs = nil then
+ begin
+ raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ end;
+
+ case BaseType of
+ btProcPtr: Result := TPSProceduralType.Create;
+ BtTypeCopy: Result := TPSTypeLink.Create;
+ btRecord: Result := TPSRecordType.Create;
+ btArray: Result := TPSArrayType.Create;
+ btStaticArray: Result := TPSStaticArrayType.Create;
+ btEnum: Result := TPSEnumType.Create;
+ btClass: Result := TPSClassType.Create;
+ btExtClass: REsult := TPSUndefinedClassType.Create;
+ btNotificationVariant, btVariant: Result := TPSVariantType.Create;
+{$IFNDEF PS_NOINTERFACES}
+ btInterface: Result := TPSInterfaceType.Create;
+{$ENDIF}
+ else
+ Result := TPSType.Create;
+ end;
+ Result.Name := FastUppercase(Name);
+ Result.OriginalName := Name;
+ Result.BaseType := BaseType;
+ {$IFDEF PS_USESSUPPORT}
+ Result.DeclareUnit:=fModule;
+ {$ENDIF}
+ Result.DeclarePos := InvalidVal;
+ Result.DeclareCol := 0;
+ Result.DeclareRow := 0;
+ FTypes.Add(Result);
+end;
+
+
+function TPSPascalCompiler.AddFunction(const Header: tbtString): TPSRegProc;
+var
+ Parser: TPSPascalParser;
+ i: Integer;
+ IsFunction: Boolean;
+ VNames, Name: tbtString;
+ Decl: TPSParametersDecl;
+ modifier: TPSParameterMode;
+ VCType: TPSType;
+ x: TPSRegProc;
+begin
+ if FProcs = nil then
+ raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+
+ Parser := TPSPascalParser.Create;
+ Parser.SetText(Header);
+ Decl := TPSParametersDecl.Create;
+ x := nil;
+ try
+ if Parser.CurrTokenId = CSTII_Function then
+ IsFunction := True
+ else if Parser.CurrTokenId = CSTII_Procedure then
+ IsFunction := False
+ else
+ Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterFunction, ['']);
+ Parser.Next;
+ if Parser.CurrTokenId <> CSTI_Identifier then
+ Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterFunction, ['']);
+ Name := Parser.OriginalToken;
+ Parser.Next;
+ if Parser.CurrTokenId = CSTI_OpenRound then
+ begin
+ Parser.Next;
+ if Parser.CurrTokenId <> CSTI_CloseRound then
+ begin
+ while True do
+ begin
+ if Parser.CurrTokenId = CSTII_Out then
+ begin
+ Modifier := pmOut;
+ Parser.Next;
+ end else
+ if Parser.CurrTokenId = CSTII_Const then
+ begin
+ Modifier := pmIn;
+ Parser.Next;
+ end else
+ if Parser.CurrTokenId = CSTII_Var then
+ begin
+ modifier := pmInOut;
+ Parser.Next;
+ end
+ else
+ modifier := pmIn;
+ if Parser.CurrTokenId <> CSTI_Identifier then
+ raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterFunction, [Name]);
+ VNames := Parser.OriginalToken + '|';
+ Parser.Next;
+ while Parser.CurrTokenId = CSTI_Comma do
+ begin
+ Parser.Next;
+ if Parser.CurrTokenId <> CSTI_Identifier then
+ Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterFunction, [Name]);
+ VNames := VNames + Parser.OriginalToken + '|';
+ Parser.Next;
+ end;
+ if Parser.CurrTokenId <> CSTI_Colon then
+ begin
+ Parser.Free;
+ Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterFunction, [Name]);
+ end;
+ Parser.Next;
+ VCType := FindType(Parser.GetToken);
+ if VCType = nil then
+ Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterFunction, [Name]);
+ while Pos(tbtchar('|'), VNames) > 0 do
+ begin
+ with Decl.AddParam do
+ begin
+ Mode := modifier;
+ OrgName := copy(VNames, 1, Pos(tbtchar('|'), VNames) - 1);
+ aType := VCType;
+ end;
+ Delete(VNames, 1, Pos(tbtchar('|'), VNames));
+ end;
+ Parser.Next;
+ if Parser.CurrTokenId = CSTI_CloseRound then
+ break;
+ if Parser.CurrTokenId <> CSTI_Semicolon then
+ Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterFunction, [Name]);
+ Parser.Next;
+ end; {while}
+ end; {if}
+ Parser.Next;
+ end; {if}
+ if IsFunction then
+ begin
+ if Parser.CurrTokenId <> CSTI_Colon then
+ Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterFunction, [Name]);
+
+ Parser.Next;
+ VCType := FindType(Parser.GetToken);
+ if VCType = nil then
+ Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterFunction, [Name]);
+ end
+ else
+ VCType := nil;
+ Decl.Result := VCType;
+ X := TPSRegProc.Create;
+ x.OrgName := Name;
+ x.Name := FastUpperCase(Name);
+ x.ExportName := True;
+ x.Decl.Assign(decl);
+ if Decl.Result = nil then
+ begin
+ x.ImportDecl := x.ImportDecl + #0;
+ end else
+ x.ImportDecl := x.ImportDecl + #1;
+ for i := 0 to Decl.ParamCount -1 do
+ begin
+ if Decl.Params[i].Mode <> pmIn then
+ x.ImportDecl := x.ImportDecl + #1
+ else
+ x.ImportDecl := x.ImportDecl + #0;
+ end;
+
+ FRegProcs.Add(x);
+ finally
+ Decl.Free;
+ Parser.Free;
+ end;
+ Result := x;
+end;
+
+function TPSPascalCompiler.MakeHint(const Module: tbtString; E: TPSPascalCompilerHintType; const Param: tbtString): TPSPascalCompilerMessage;
+var
+ n: TPSPascalCompilerHint;
+begin
+ N := TPSPascalCompilerHint.Create;
+ n.FHint := e;
+ n.SetParserPos(FParser);
+ n.FModuleName := Module;
+ n.FParam := Param;
+ FMessages.Add(n);
+ Result := n;
+end;
+
+function TPSPascalCompiler.MakeError(const Module: tbtString; E:
+ TPSPascalCompilerErrorType; const Param: tbtString): TPSPascalCompilerMessage;
+var
+ n: TPSPascalCompilerError;
+begin
+ N := TPSPascalCompilerError.Create;
+ n.FError := e;
+ n.SetParserPos(FParser);
+ {$IFNDEF PS_USESSUPPORT}
+ n.FModuleName := Module;
+ {$ELSE}
+ if Module <> '' then
+ n.FModuleName := Module
+ else
+ n.FModuleName := fModule;
+ {$ENDIF}
+ n.FParam := Param;
+ FMessages.Add(n);
+ Result := n;
+end;
+
+function TPSPascalCompiler.MakeWarning(const Module: tbtString; E:
+ TPSPascalCompilerWarningType; const Param: tbtString): TPSPascalCompilerMessage;
+var
+ n: TPSPascalCompilerWarning;
+begin
+ N := TPSPascalCompilerWarning.Create;
+ n.FWarning := e;
+ n.SetParserPos(FParser);
+ n.FModuleName := Module;
+ n.FParam := Param;
+ FMessages.Add(n);
+ Result := n;
+end;
+
+procedure TPSPascalCompiler.Clear;
+var
+ l: Longint;
+begin
+ FDebugOutput := '';
+ FOutput := '';
+ for l := 0 to FMessages.Count - 1 do
+ TPSPascalCompilerMessage(FMessages[l]).Free;
+ FMessages.Clear;
+ for L := FAutoFreeList.Count -1 downto 0 do
+ begin
+ TObject(FAutoFreeList[l]).Free;
+ end;
+ FAutoFreeList.Clear;
+end;
+
+procedure CopyVariantContents(Src, Dest: PIfRVariant);
+begin
+ case src.FType.BaseType of
+ btu8, bts8: dest^.tu8 := src^.tu8;
+ btu16, bts16: dest^.tu16 := src^.tu16;
+ btenum, btu32, bts32: dest^.tu32 := src^.tu32;
+ btsingle: Dest^.tsingle := src^.tsingle;
+ btdouble: Dest^.tdouble := src^.tdouble;
+ btextended: Dest^.textended := src^.textended;
+ btCurrency: Dest^.tcurrency := Src^.tcurrency;
+ btchar: Dest^.tchar := src^.tchar;
+ {$IFNDEF PS_NOINT64}bts64: dest^.ts64 := src^.ts64;{$ENDIF}
+ btset, btstring: tbtstring(dest^.tstring) := tbtstring(src^.tstring);
+ {$IFNDEF PS_NOWIDESTRING}
+ btunicodestring: tbtunicodestring(dest^.tunistring) := tbtunicodestring(src^.tunistring);
+ btwidestring: tbtwidestring(dest^.twidestring) := tbtwidestring(src^.twidestring);
+ btwidechar: Dest^.tchar := src^.tchar;
+ {$ENDIF}
+ end;
+end;
+
+function DuplicateVariant(Src: PIfRVariant): PIfRVariant;
+begin
+ New(Result);
+ FillChar(Result^, SizeOf(TIfRVariant), 0);
+ CopyVariantContents(Src, Result);
+end;
+
+
+procedure InitializeVariant(Vari: PIfRVariant; FType: TPSType);
+begin
+ FillChar(vari^, SizeOf(TIfRVariant), 0);
+ if FType.BaseType = btSet then
+ begin
+ SetLength(tbtstring(vari^.tstring), TPSSetType(FType).ByteSize);
+ fillchar(tbtstring(vari^.tstring)[1], length(tbtstring(vari^.tstring)), 0);
+ end;
+ vari^.FType := FType;
+end;
+
+function NewVariant(FType: TPSType): PIfRVariant;
+begin
+ New(Result);
+ InitializeVariant(Result, FType);
+end;
+
+procedure FinalizeA(var s: tbtString); overload; begin s := ''; end;
+procedure FinalizeW(var s: tbtwidestring); overload; begin s := ''; end;
+procedure FinalizeU(var s: tbtunicodestring); overload; begin s := ''; end;
+
+procedure FinalizeVariant(var p: TIfRVariant);
+begin
+ if (p.FType.BaseType = btString) or (p.FType.basetype = btSet) then
+ finalizeA(tbtstring(p.tstring))
+ {$IFNDEF PS_NOWIDESTRING}
+ else if p.FType.BaseType = btWideString then
+ finalizeW(tbtWideString(p.twidestring)) // tbtwidestring
+ else if p.FType.BaseType = btUnicodeString then
+ finalizeU(tbtUnicodeString(p.tunistring)); // tbtwidestring
+ {$ENDIF}
+end;
+
+procedure DisposeVariant(p: PIfRVariant);
+begin
+ if p <> nil then
+ begin
+ FinalizeVariant(p^);
+ Dispose(p);
+ end;
+end;
+
+
+
+function TPSPascalCompiler.GetTypeCopyLink(p: TPSType): TPSType;
+begin
+ if p = nil then
+ Result := nil
+ else
+ if p.BaseType = BtTypeCopy then
+ begin
+ Result := TPSTypeLink(p).LinkTypeNo;
+ end else Result := p;
+end;
+
+function IsIntType(b: TPSBaseType): Boolean;
+begin
+ case b of
+ btU8, btS8, btU16, btS16, btU32, btS32{$IFNDEF PS_NOINT64}, btS64{$ENDIF}: Result := True;
+ else
+ Result := False;
+ end;
+end;
+
+function IsRealType(b: TPSBaseType): Boolean;
+begin
+ case b of
+ btSingle, btDouble, btCurrency, btExtended: Result := True;
+ else
+ Result := False;
+ end;
+end;
+
+function IsIntRealType(b: TPSBaseType): Boolean;
+begin
+ case b of
+ btSingle, btDouble, btCurrency, btExtended, btU8, btS8, btU16, btS16, btU32, btS32{$IFNDEF PS_NOINT64}, btS64{$ENDIF}:
+ Result := True;
+ else
+ Result := False;
+ end;
+
+end;
+
+function DiffRec(p1, p2: TPSSubItem): Boolean;
+begin
+ if p1.ClassType = p2.ClassType then
+ begin
+ if P1.ClassType = TPSSubNumber then
+ Result := TPSSubNumber(p1).SubNo <> TPSSubNumber(p2).SubNo
+ else if P1.ClassType = TPSSubValue then
+ Result := TPSSubValue(p1).SubNo <> TPSSubValue(p2).SubNo
+ else
+ Result := False;
+ end else Result := True;
+end;
+
+function SameReg(x1, x2: TPSValue): Boolean;
+var
+ I: Longint;
+begin
+ if (x1.ClassType = x2.ClassType) and (X1 is TPSValueVar) then
+ begin
+ if
+ ((x1.ClassType = TPSValueGlobalVar) and (TPSValueGlobalVar(x1).GlobalVarNo = TPSValueGlobalVar(x2).GlobalVarNo)) or
+ ((x1.ClassType = TPSValueLocalVar) and (TPSValueLocalVar(x1).LocalVarNo = TPSValueLocalVar(x2).LocalVarNo)) or
+ ((x1.ClassType = TPSValueParamVar) and (TPSValueParamVar(x1).ParamNo = TPSValueParamVar(x2).ParamNo)) or
+ ((x1.ClassType = TPSValueAllocatedStackVar) and (TPSValueAllocatedStackVar(x1).LocalVarNo = TPSValueAllocatedStackVar(x2).LocalVarNo)) then
+ begin
+ if TPSValueVar(x1).GetRecCount <> TPSValueVar(x2).GetRecCount then
+ begin
+ Result := False;
+ exit;
+ end;
+ for i := 0 to TPSValueVar(x1).GetRecCount -1 do
+ begin
+ if DiffRec(TPSValueVar(x1).RecItem[i], TPSValueVar(x2).RecItem[i]) then
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := True;
+ end else Result := False;
+ end
+ else
+ Result := False;
+end;
+
+function GetUInt(Src: PIfRVariant; var s: Boolean): Cardinal;
+begin
+ case Src.FType.BaseType of
+ btU8: Result := Src^.tu8;
+ btS8: Result := Src^.ts8;
+ btU16: Result := Src^.tu16;
+ btS16: Result := Src^.ts16;
+ btU32: Result := Src^.tu32;
+ btS32: Result := Src^.ts32;
+ {$IFNDEF PS_NOINT64}
+ bts64: Result := src^.ts64;
+ {$ENDIF}
+ btChar: Result := ord(Src^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: Result := ord(tbtwidechar(src^.twidechar));
+ {$ENDIF}
+ btEnum: Result := src^.tu32;
+ else
+ begin
+ s := False;
+ Result := 0;
+ end;
+ end;
+end;
+
+function GetInt(Src: PIfRVariant; var s: Boolean): Longint;
+begin
+ case Src.FType.BaseType of
+ btU8: Result := Src^.tu8;
+ btS8: Result := Src^.ts8;
+ btU16: Result := Src^.tu16;
+ btS16: Result := Src^.ts16;
+ btU32: Result := Src^.tu32;
+ btS32: Result := Src^.ts32;
+ {$IFNDEF PS_NOINT64}
+ bts64: Result := src^.ts64;
+ {$ENDIF}
+ btChar: Result := ord(Src^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: Result := ord(tbtwidechar(src^.twidechar));
+ {$ENDIF}
+ btEnum: Result := src^.tu32;
+ else
+ begin
+ s := False;
+ Result := 0;
+ end;
+ end;
+end;
+{$IFNDEF PS_NOINT64}
+function GetInt64(Src: PIfRVariant; var s: Boolean): Int64;
+begin
+ case Src.FType.BaseType of
+ btU8: Result := Src^.tu8;
+ btS8: Result := Src^.ts8;
+ btU16: Result := Src^.tu16;
+ btS16: Result := Src^.ts16;
+ btU32: Result := Src^.tu32;
+ btS32: Result := Src^.ts32;
+ bts64: Result := src^.ts64;
+ btChar: Result := ord(Src^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: Result := ord(tbtwidechar(src^.twidechar));
+ {$ENDIF}
+ btEnum: Result := src^.tu32;
+ else
+ begin
+ s := False;
+ Result := 0;
+ end;
+ end;
+end;
+{$ENDIF}
+
+function GetReal(Src: PIfRVariant; var s: Boolean): Extended;
+begin
+ case Src.FType.BaseType of
+ btU8: Result := Src^.tu8;
+ btS8: Result := Src^.ts8;
+ btU16: Result := Src^.tu16;
+ btS16: Result := Src^.ts16;
+ btU32: Result := Src^.tu32;
+ btS32: Result := Src^.ts32;
+ {$IFNDEF PS_NOINT64}
+ bts64: Result := src^.ts64;
+ {$ENDIF}
+ btChar: Result := ord(Src^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: Result := ord(tbtwidechar(src^.twidechar));
+ {$ENDIF}
+ btSingle: Result := Src^.tsingle;
+ btDouble: Result := Src^.tdouble;
+ btCurrency: Result := SRc^.tcurrency;
+ btExtended: Result := Src^.textended;
+ else
+ begin
+ s := False;
+ Result := 0;
+ end;
+ end;
+end;
+
+function GetString(Src: PIfRVariant; var s: Boolean): tbtString;
+begin
+ case Src.FType.BaseType of
+ btChar: Result := Src^.tchar;
+ btString: Result := tbtstring(src^.tstring);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: Result := tbtstring(src^.twidechar);
+ btWideString: Result := tbtstring(tbtWideString(src^.twidestring));
+ btUnicodeString: Result := tbtstring(tbtUnicodeString(src^.tunistring));
+ {$ENDIF}
+ else
+ begin
+ s := False;
+ Result := '';
+ end;
+ end;
+end;
+
+{$IFNDEF PS_NOWIDESTRING}
+function TPSPascalCompiler.GetWideString(Src: PIfRVariant; var s: Boolean): tbtwidestring;
+begin
+ case Src.FType.BaseType of
+ btChar: Result := tbtWidestring(Src^.tchar);
+ btString: Result := tbtWidestring(tbtstring(src^.tstring));
+ btWideChar: Result := src^.twidechar;
+ btWideString: Result := tbtWideString(src^.twidestring);
+ btUnicodeString: result := tbtUnicodeString(src^.tunistring);
+ else
+ begin
+ s := False;
+ Result := '';
+ end;
+ end;
+end;
+function TPSPascalCompiler.GetUnicodeString(Src: PIfRVariant; var s: Boolean): tbtunicodestring;
+begin
+ case Src.FType.BaseType of
+ btChar: Result := tbtWidestring(Src^.tchar);
+ btString: Result := tbtWidestring(tbtstring(src^.tstring));
+ btWideChar: Result := src^.twidechar;
+ btWideString: Result := tbtWideString(src^.twidestring);
+ btUnicodeString: result := tbtUnicodeString(src^.tunistring);
+ else
+ begin
+ s := False;
+ Result := '';
+ end;
+ end;
+end;
+{$ENDIF}
+
+function ab(b: Longint): Longint;
+begin
+ ab := Longint(b = 0);
+end;
+
+procedure Set_Union(Dest, Src: PByteArray; ByteSize: Integer);
+var
+ i: Longint;
+begin
+ for i := ByteSize -1 downto 0 do
+ Dest^[i] := Dest^[i] or Src^[i];
+end;
+
+procedure Set_Diff(Dest, Src: PByteArray; ByteSize: Integer);
+var
+ i: Longint;
+begin
+ for i := ByteSize -1 downto 0 do
+ Dest^[i] := Dest^[i] and not Src^[i];
+end;
+
+procedure Set_Intersect(Dest, Src: PByteArray; ByteSize: Integer);
+var
+ i: Longint;
+begin
+ for i := ByteSize -1 downto 0 do
+ Dest^[i] := Dest^[i] and Src^[i];
+end;
+
+procedure Set_Subset(Dest, Src: PByteArray; ByteSize: Integer; var Val: Boolean);
+var
+ i: Integer;
+begin
+ for i := ByteSize -1 downto 0 do
+ begin
+ if not (Src^[i] and Dest^[i] = Dest^[i]) then
+ begin
+ Val := False;
+ exit;
+ end;
+ end;
+ Val := True;
+end;
+
+procedure Set_Equal(Dest, Src: PByteArray; ByteSize: Integer; var Val: Boolean);
+var
+ i: Longint;
+begin
+ for i := ByteSize -1 downto 0 do
+ begin
+ if Dest^[i] <> Src^[i] then
+ begin
+ Val := False;
+ exit;
+ end;
+ end;
+ val := True;
+end;
+
+procedure Set_membership(Item: Longint; Src: PByteArray; var Val: Boolean);
+begin
+ Val := (Src^[Item shr 3] and (1 shl (Item and 7))) <> 0;
+end;
+
+procedure Set_MakeMember(Item: Longint; Src: PByteArray);
+begin
+ Src^[Item shr 3] := Src^[Item shr 3] or (1 shl (Item and 7));
+end;
+
+procedure ConvertToBoolean(SE: TPSPascalCompiler; FUseUsedTypes: Boolean; var1: PIFRVariant; b: Boolean);
+begin
+ FinalizeVariant(var1^);
+ if FUseUsedTypes then
+ Var1^.FType := se.at2ut(se.FDefaultBoolType)
+ else
+ Var1^.FType := Se.FDefaultBoolType;
+ var1^.tu32 := Ord(b);
+end;
+
+procedure ConvertToString(SE: TPSPascalCompiler; FUseUsedTypes: Boolean; var1: PIFRVariant; const s: tbtString);
+var
+ atype: TPSType;
+begin
+ FinalizeVariant(var1^);
+ atype := se.FindBaseType(btString);
+ if FUseUsedTypes then
+ InitializeVariant(var1, se.at2ut(atype))
+ else
+ InitializeVariant(var1, atype);
+ tbtstring(var1^.tstring) := s;
+end;
+{$IFNDEF PS_NOWIDESTRING}
+procedure ConvertToUnicodeString(SE: TPSPascalCompiler; FUseUsedTypes: Boolean; var1: PIFRVariant; const s: tbtunicodestring);
+var
+ atype: TPSType;
+begin
+ FinalizeVariant(var1^);
+ atype := se.FindBaseType(btUnicodeString);
+ if FUseUsedTypes then
+ InitializeVariant(var1, se.at2ut(atype))
+ else
+ InitializeVariant(var1, atype);
+ tbtunicodestring(var1^.tunistring) := s;
+end;
+{$ENDIF}
+procedure ConvertToFloat(SE: TPSPascalCompiler; FUseUsedTypes: Boolean; var1: PIfRVariant; NewType: TPSType);
+var
+ vartemp: PIfRVariant;
+ b: Boolean;
+begin
+ New(vartemp);
+ b := false;
+ if FUseUsedTypes then
+ NewType := se.at2ut(NewType);
+ InitializeVariant(vartemp, var1.FType);
+ CopyVariantContents(var1, vartemp);
+ FinalizeVariant(var1^);
+ InitializeVariant(var1, newtype);
+ case var1.ftype.basetype of
+ btSingle:
+ begin
+ if (vartemp.ftype.BaseType = btu8) or (vartemp.ftype.BaseType = btu16) or (vartemp.ftype.BaseType = btu32) then
+ var1^.tsingle := GetUInt(vartemp, b)
+ else
+ var1^.tsingle := GetInt(vartemp, b)
+ end;
+ btDouble:
+ begin
+ if (vartemp.ftype.BaseType = btu8) or (vartemp.ftype.BaseType = btu16) or (vartemp.ftype.BaseType = btu32) then
+ var1^.tdouble := GetUInt(vartemp, b)
+ else
+ var1^.tdouble := GetInt(vartemp, b)
+ end;
+ btExtended:
+ begin
+ if (vartemp.ftype.BaseType = btu8) or (vartemp.ftype.BaseType = btu16) or (vartemp.ftype.BaseType = btu32) then
+ var1^.textended:= GetUInt(vartemp, b)
+ else
+ var1^.textended:= GetInt(vartemp, b)
+ end;
+ btCurrency:
+ begin
+ if (vartemp.ftype.BaseType = btu8) or (vartemp.ftype.BaseType = btu16) or (vartemp.ftype.BaseType = btu32) then
+ var1^.tcurrency:= GetUInt(vartemp, b)
+ else
+ var1^.tcurrency:= GetInt(vartemp, b)
+ end;
+ end;
+ DisposeVariant(vartemp);
+end;
+
+
+function TPSPascalCompiler.IsCompatibleType(p1, p2: TPSType; Cast: Boolean): Boolean;
+begin
+ if
+ ((p1.BaseType = btProcPtr) and (p2 = p1)) or
+ (p1.BaseType = btPointer) or
+ (p2.BaseType = btPointer) or
+ ((p1.BaseType = btNotificationVariant) or (p1.BaseType = btVariant)) or
+ ((p2.BaseType = btNotificationVariant) or (p2.BaseType = btVariant)) or
+ (IsIntType(p1.BaseType) and IsIntType(p2.BaseType)) or
+ (IsRealType(p1.BaseType) and IsIntRealType(p2.BaseType)) or
+ (((p1.basetype = btPchar) or (p1.BaseType = btString)) and ((p2.BaseType = btString) or (p2.BaseType = btPchar))) or
+ (((p1.basetype = btPchar) or (p1.BaseType = btString)) and (p2.BaseType = btChar)) or
+ (((p1.BaseType = btArray) or (p1.BaseType = btStaticArray)) and (
+ (p2.BaseType = btArray) or (p2.BaseType = btStaticArray)) and IsCompatibleType(TPSArrayType(p1).ArrayTypeNo, TPSArrayType(p2).ArrayTypeNo, False)) or
+ ((p1.BaseType = btChar) and (p2.BaseType = btChar)) or
+ ((p1.BaseType = btSet) and (p2.BaseType = btSet)) or
+ {$IFNDEF PS_NOWIDESTRING}
+ ((p1.BaseType = btWideChar) and (p2.BaseType = btChar)) or
+ ((p1.BaseType = btWideChar) and (p2.BaseType = btWideChar)) or
+ ((p1.BaseType = btWidestring) and (p2.BaseType = btChar)) or
+ ((p1.BaseType = btWidestring) and (p2.BaseType = btWideChar)) or
+ ((p1.BaseType = btWidestring) and ((p2.BaseType = btString) or (p2.BaseType = btPchar) or (p2.BaseType = btUnicodeString))) or
+ ((p1.BaseType = btWidestring) and ((p2.BaseType = btWidestring))) or
+ ((p1.BaseType = btUnicodeString) and (p2.BaseType = btChar)) or
+ ((p1.BaseType = btUnicodeString) and (p2.BaseType = btWideChar)) or
+ ((p1.BaseType = btUnicodeString) and ((p2.BaseType = btString) or (p2.BaseType = btPchar) or (p2.BaseType = btUnicodeString))) or
+ ((p1.BaseType = btUnicodeString) and (p2.BaseType = btWidestring)) or
+ (((p1.basetype = btPchar) or (p1.BaseType = btString)) and (p2.BaseType = btWideString)or (p2.BaseType = btUnicodeString)) or
+ (((p1.basetype = btPchar) or (p1.BaseType = btString)) and (p2.BaseType = btWidechar)) or
+ (((p1.basetype = btPchar) or (p1.BaseType = btString)) and (p2.BaseType = btchar)) or
+ {$ENDIF}
+ ((p1.BaseType = btRecord) and (p2.BaseType = btrecord) and (not IsVarInCompatible(p1, p2))) or
+ ((p1.BaseType = btEnum) and (p2.BaseType = btEnum)) or
+ (Cast and IsIntType(P1.BaseType) and (p2.baseType = btEnum)) or
+ (Cast and (p1.baseType = btEnum) and IsIntType(P2.BaseType))
+ then
+ Result := True
+ // nx change start - allow casting class -> integer and vice versa
+ else if p1.BaseType = btclass then
+ Result := TPSClassType(p1).cl.IsCompatibleWith(p2) or (p2.BaseType in [btU32, btS32])
+ else if (p1.BaseType in [btU32, btS32]) then
+ Result := (p2.BaseType = btClass)
+ // nx change end
+{$IFNDEF PS_NOINTERFACES}
+ else if p1.BaseType = btInterface then
+ Result := TPSInterfaceType(p1).Intf.IsCompatibleWith(p2)
+{$ENDIF}
+ else if ((p1.BaseType = btExtClass) and (p2.BaseType = btExtClass)) then
+ begin
+ Result := TPSUndefinedClassType(p1).ExtClass.IsCompatibleWith(TPSUndefinedClassType(p2).ExtClass);
+ end
+ else
+ Result := False;
+end;
+
+
+function TPSPascalCompiler.PreCalc(FUseUsedTypes: Boolean; Var1Mod: Byte; var1: PIFRVariant; Var2Mod: Byte; Var2: PIfRVariant; Cmd: TPSBinOperatorType; Pos, Row, Col: Cardinal): Boolean;
+ { var1=dest, var2=src }
+var
+ b: Boolean;
+
+begin
+ Result := True;
+ try
+ if (IsRealType(var2.FType.BaseType) and IsIntType(var1.FType.BaseType)) then
+ ConvertToFloat(Self, FUseUsedTypes, var1, var2^.FType);
+ case Cmd of
+ otAdd:
+ begin { + }
+ case var1.FType.BaseType of
+ btU8: var1^.tu8 := var1^.tu8 + GetUint(Var2, Result);
+ btS8: var1^.ts8 := var1^.ts8 + GetInt(Var2, Result);
+ btU16: var1^.tu16 := var1^.tu16 + GetUint(Var2, Result);
+ btS16: var1^.ts16 := var1^.ts16 + Getint(Var2, Result);
+ btEnum, btU32: var1^.tu32 := var1^.tu32 + GetUint(Var2, Result);
+ btS32: var1^.ts32 := var1^.ts32 + Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: var1^.ts64 := var1^.ts64 + GetInt64(Var2, Result); {$ENDIF}
+ btSingle: var1^.tsingle := var1^.tsingle + GetReal( Var2, Result);
+ btDouble: var1^.tdouble := var1^.tdouble + GetReal( Var2, Result);
+ btExtended: var1^.textended := var1^.textended + GetReal( Var2, Result);
+ btCurrency: var1^.tcurrency := var1^.tcurrency + GetReal( Var2, Result);
+ btSet:
+ begin
+ if (var1.FType = var2.FType) then
+ begin
+ Set_Union(var1.tstring, var2.tstring, TPSSetType(var1.FType).ByteSize);
+ end else Result := False;
+ end;
+ btChar:
+ begin
+ ConvertToString(Self, FUseUsedTypes, var1, getstring(Var1, b)+getstring(Var2, b));
+ end;
+ btString: tbtstring(var1^.tstring) := tbtstring(var1^.tstring) + GetString(Var2, Result);
+ {$IFNDEF PS_NOWIDESTRING}
+ btwideString: tbtwidestring(var1^.twidestring) := tbtwidestring(var1^.twidestring) + GetWideString(Var2, Result);
+ btUnicodeString: tbtunicodestring(var1^.tunistring) := tbtunicodestring(var1^.tunistring) + GetUnicodeString(Var2, Result);
+ btWidechar:
+ begin
+ ConvertToUnicodeString(Self, FUseUsedTypes, var1, GetUnicodeString(Var1, b)+GetUnicodeString(Var2, b));
+ end;
+ {$ENDIF}
+ else Result := False;
+ end;
+ end;
+ otSub:
+ begin { - }
+ case Var1.FType.BaseType of
+ btU8: var1^.tu8 := var1^.tu8 - GetUint(Var2, Result);
+ btS8: var1^.ts8 := var1^.ts8 - Getint(Var2, Result);
+ btU16: var1^.tu16 := var1^.tu16 - GetUint(Var2, Result);
+ btS16: var1^.ts16 := var1^.ts16 - Getint(Var2, Result);
+ btEnum, btU32: var1^.tu32 := var1^.tu32 - GetUint(Var2, Result);
+ btS32: var1^.ts32 := var1^.ts32 - Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: var1^.ts64 := var1^.ts64 - GetInt64(Var2, Result); {$ENDIF}
+ btSingle: var1^.tsingle := var1^.tsingle - GetReal( Var2, Result);
+ btDouble: var1^.tdouble := var1^.tdouble - GetReal(Var2, Result);
+ btExtended: var1^.textended := var1^.textended - GetReal(Var2, Result);
+ btCurrency: var1^.tcurrency := var1^.tcurrency - GetReal( Var2, Result);
+ btSet:
+ begin
+ if (var1.FType = var2.FType) then
+ begin
+ Set_Diff(var1.tstring, var2.tstring, TPSSetType(var1.FType).ByteSize);
+ end else Result := False;
+ end;
+ else Result := False;
+ end;
+ end;
+ otMul:
+ begin { * }
+ case Var1.FType.BaseType of
+ btU8: var1^.tu8 := var1^.tu8 * GetUint(Var2, Result);
+ btS8: var1^.ts8 := var1^.ts8 * Getint(Var2, Result);
+ btU16: var1^.tu16 := var1^.tu16 * GetUint(Var2, Result);
+ btS16: var1^.ts16 := var1^.ts16 * Getint(Var2, Result);
+ btU32: var1^.tu32 := var1^.tu32 * GetUint(Var2, Result);
+ btS32: var1^.ts32 := var1^.ts32 * Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: var1^.ts64 := var1^.ts64 * GetInt64(Var2, Result); {$ENDIF}
+ btSingle: var1^.tsingle := var1^.tsingle * GetReal(Var2, Result);
+ btDouble: var1^.tdouble := var1^.tdouble * GetReal(Var2, Result);
+ btExtended: var1^.textended := var1^.textended * GetReal( Var2, Result);
+ btCurrency: var1^.tcurrency := var1^.tcurrency * GetReal( Var2, Result);
+ btSet:
+ begin
+ if (var1.FType = var2.FType) then
+ begin
+ Set_Intersect(var1.tstring, var2.tstring, TPSSetType(var1.FType).ByteSize);
+ end else Result := False;
+ end;
+ else Result := False;
+ end;
+ end;
+ otDiv:
+ begin { / }
+ case Var1.FType.BaseType of
+ btU8: var1^.tu8 := var1^.tu8 div GetUint(Var2, Result);
+ btS8: var1^.ts8 := var1^.ts8 div Getint(Var2, Result);
+ btU16: var1^.tu16 := var1^.tu16 div GetUint(Var2, Result);
+ btS16: var1^.ts16 := var1^.ts16 div Getint(Var2, Result);
+ btU32: var1^.tu32 := var1^.tu32 div GetUint(Var2, Result);
+ btS32: var1^.ts32 := var1^.ts32 div Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: var1^.ts64 := var1^.ts64 div GetInt64(Var2, Result); {$ENDIF}
+ btSingle: var1^.tsingle := var1^.tsingle / GetReal( Var2, Result);
+ btDouble: var1^.tdouble := var1^.tdouble / GetReal( Var2, Result);
+ btExtended: var1^.textended := var1^.textended / GetReal( Var2, Result);
+ btCurrency: var1^.tcurrency := var1^.tcurrency / GetReal( Var2, Result);
+ else Result := False;
+ end;
+ end;
+ otMod:
+ begin { MOD }
+ case Var1.FType.BaseType of
+ btU8: var1^.tu8 := var1^.tu8 mod GetUint(Var2, Result);
+ btS8: var1^.ts8 := var1^.ts8 mod Getint(Var2, Result);
+ btU16: var1^.tu16 := var1^.tu16 mod GetUint(Var2, Result);
+ btS16: var1^.ts16 := var1^.ts16 mod Getint(Var2, Result);
+ btU32: var1^.tu32 := var1^.tu32 mod GetUint(Var2, Result);
+ btS32: var1^.ts32 := var1^.ts32 mod Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: var1^.ts64 := var1^.ts64 mod GetInt64(Var2, Result); {$ENDIF}
+ else Result := False;
+ end;
+ end;
+ otshl:
+ begin { SHL }
+ case Var1.FType.BaseType of
+ btU8: var1^.tu8 := var1^.tu8 shl GetUint(Var2, Result);
+ btS8: var1^.ts8 := var1^.ts8 shl Getint(Var2, Result);
+ btU16: var1^.tu16 := var1^.tu16 shl GetUint(Var2, Result);
+ btS16: var1^.ts16 := var1^.ts16 shl Getint(Var2, Result);
+ btU32: var1^.tu32 := var1^.tu32 shl GetUint(Var2, Result);
+ btS32: var1^.ts32 := var1^.ts32 shl Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: var1^.ts64 := var1^.ts64 shl GetInt64(Var2, Result); {$ENDIF}
+ else Result := False;
+ end;
+ end;
+ otshr:
+ begin { SHR }
+ case Var1.FType.BaseType of
+ btU8: var1^.tu8 := var1^.tu8 shr GetUint(Var2, Result);
+ btS8: var1^.ts8 := var1^.ts8 shr Getint(Var2, Result);
+ btU16: var1^.tu16 := var1^.tu16 shr GetUint(Var2, Result);
+ btS16: var1^.ts16 := var1^.ts16 shr Getint(Var2, Result);
+ btU32: var1^.tu32 := var1^.tu32 shr GetUint(Var2, Result);
+ btS32: var1^.ts32 := var1^.ts32 shr Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: var1^.ts64 := var1^.ts64 shr GetInt64( Var2, Result); {$ENDIF}
+ else Result := False;
+ end;
+ end;
+ otAnd:
+ begin { AND }
+ case Var1.FType.BaseType of
+ btU8: var1^.tu8 := var1^.tu8 and GetUint(Var2, Result);
+ btS8: var1^.ts8 := var1^.ts8 and Getint(Var2, Result);
+ btU16: var1^.tu16 := var1^.tu16 and GetUint(Var2, Result);
+ btS16: var1^.ts16 := var1^.ts16 and Getint(Var2, Result);
+ btU32: var1^.tu32 := var1^.tu32 and GetUint(Var2, Result);
+ btS32: var1^.ts32 := var1^.ts32 and Getint(Var2, Result);
+ btEnum: var1^.ts32 := var1^.ts32 and Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: var1^.ts64 := var1^.ts64 and GetInt64(Var2, Result); {$ENDIF}
+ else Result := False;
+ end;
+ end;
+ otor:
+ begin { OR }
+ case Var1.FType.BaseType of
+ btU8: var1^.tu8 := var1^.tu8 or GetUint(Var2, Result);
+ btS8: var1^.ts8 := var1^.ts8 or Getint(Var2, Result);
+ btU16: var1^.tu16 := var1^.tu16 or GetUint(Var2, Result);
+ btS16: var1^.ts16 := var1^.ts16 or Getint(Var2, Result);
+ btU32: var1^.tu32 := var1^.tu32 or GetUint(Var2, Result);
+ btS32: var1^.ts32 := var1^.ts32 or Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: var1^.ts64 := var1^.ts64 or GetInt64(Var2, Result); {$ENDIF}
+ btEnum: var1^.ts32 := var1^.ts32 or Getint(Var2, Result);
+ else Result := False;
+ end;
+ end;
+ otxor:
+ begin { XOR }
+ case Var1.FType.BaseType of
+ btU8: var1^.tu8 := var1^.tu8 xor GetUint(Var2, Result);
+ btS8: var1^.ts8 := var1^.ts8 xor Getint(Var2, Result);
+ btU16: var1^.tu16 := var1^.tu16 xor GetUint(Var2, Result);
+ btS16: var1^.ts16 := var1^.ts16 xor Getint(Var2, Result);
+ btU32: var1^.tu32 := var1^.tu32 xor GetUint(Var2, Result);
+ btS32: var1^.ts32 := var1^.ts32 xor Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: var1^.ts64 := var1^.ts64 xor GetInt64(Var2, Result); {$ENDIF}
+ btEnum: var1^.ts32 := var1^.ts32 xor Getint(Var2, Result);
+ else Result := False;
+ end;
+ end;
+ otGreaterEqual:
+ begin { >= }
+ case Var1.FType.BaseType of
+ btU8: b := var1^.tu8 >= GetUint(Var2, Result);
+ btS8: b := var1^.ts8 >= Getint(Var2, Result);
+ btU16: b := var1^.tu16 >= GetUint(Var2, Result);
+ btS16: b := var1^.ts16 >= Getint(Var2, Result);
+ btU32: b := var1^.tu32 >= GetUint(Var2, Result);
+ btS32: b := var1^.ts32 >= Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: b := var1^.ts64 >= GetInt64(Var2, Result); {$ENDIF}
+ btSingle: b := var1^.tsingle >= GetReal( Var2, Result);
+ btDouble: b := var1^.tdouble >= GetReal( Var2, Result);
+ btExtended: b := var1^.textended >= GetReal( Var2, Result);
+ btCurrency: b := var1^.tcurrency >= GetReal( Var2, Result);
+ btSet:
+ begin
+ if (var1.FType = var2.FType) then
+ begin
+ Set_Subset(var2.tstring, var1.tstring, TPSSetType(var1.FType).ByteSize, b);
+ end else Result := False;
+ end;
+ else
+ Result := False;
+ end;
+ ConvertToBoolean(Self, FUseUsedTypes, Var1, b);
+ end;
+ otLessEqual:
+ begin { <= }
+ case Var1.FType.BaseType of
+ btU8: b := var1^.tu8 <= GetUint(Var2, Result);
+ btS8: b := var1^.ts8 <= Getint(Var2, Result);
+ btU16: b := var1^.tu16 <= GetUint(Var2, Result);
+ btS16: b := var1^.ts16 <= Getint(Var2, Result);
+ btU32: b := var1^.tu32 <= GetUint(Var2, Result);
+ btS32: b := var1^.ts32 <= Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: b := var1^.ts64 <= GetInt64(Var2, Result); {$ENDIF}
+ btSingle: b := var1^.tsingle <= GetReal( Var2, Result);
+ btDouble: b := var1^.tdouble <= GetReal( Var2, Result);
+ btExtended: b := var1^.textended <= GetReal( Var2, Result);
+ btCurrency: b := var1^.tcurrency <= GetReal( Var2, Result);
+ btSet:
+ begin
+ if (var1.FType = var2.FType) then
+ begin
+ Set_Subset(var1.tstring, var2.tstring, TPSSetType(var1.FType).ByteSize, b);
+ end else Result := False;
+ end;
+ else
+ Result := False;
+ end;
+ ConvertToBoolean(Self, FUseUsedTypes, Var1, b);
+ end;
+ otGreater:
+ begin { > }
+ case Var1.FType.BaseType of
+ btU8: b := var1^.tu8 > GetUint(Var2, Result);
+ btS8: b := var1^.ts8 > Getint(Var2, Result);
+ btU16: b := var1^.tu16 > GetUint(Var2, Result);
+ btS16: b := var1^.ts16 > Getint(Var2, Result);
+ btU32: b := var1^.tu32 > GetUint(Var2, Result);
+ btS32: b := var1^.ts32 > Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: b := var1^.ts64 > GetInt64(Var2, Result); {$ENDIF}
+ btSingle: b := var1^.tsingle > GetReal( Var2, Result);
+ btDouble: b := var1^.tdouble > GetReal( Var2, Result);
+ btExtended: b := var1^.textended > GetReal( Var2, Result);
+ btCurrency: b := var1^.tcurrency > GetReal( Var2, Result);
+ else
+ Result := False;
+ end;
+ ConvertToBoolean(Self, FUseUsedTypes, Var1, b);
+ end;
+ otLess:
+ begin { < }
+ case Var1.FType.BaseType of
+ btU8: b := var1^.tu8 < GetUint(Var2, Result);
+ btS8: b := var1^.ts8 < Getint(Var2, Result);
+ btU16: b := var1^.tu16 < GetUint(Var2, Result);
+ btS16: b := var1^.ts16 < Getint(Var2, Result);
+ btU32: b := var1^.tu32 < GetUint(Var2, Result);
+ btS32: b := var1^.ts32 < Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: b := var1^.ts64 < GetInt64(Var2, Result); {$ENDIF}
+ btSingle: b := var1^.tsingle < GetReal( Var2, Result);
+ btDouble: b := var1^.tdouble < GetReal( Var2, Result);
+ btExtended: b := var1^.textended < GetReal( Var2, Result);
+ btCurrency: b := var1^.tcurrency < GetReal( Var2, Result);
+ else
+ Result := False;
+ end;
+ ConvertToBoolean(Self, FUseUsedTypes, Var1, b);
+ end;
+ otNotEqual:
+ begin { <> }
+ case Var1.FType.BaseType of
+ btU8: b := var1^.tu8 <> GetUint(Var2, Result);
+ btS8: b := var1^.ts8 <> Getint(Var2, Result);
+ btU16: b := var1^.tu16 <> GetUint(Var2, Result);
+ btS16: b := var1^.ts16 <> Getint(Var2, Result);
+ btU32: b := var1^.tu32 <> GetUint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: b := var1^.ts64 <> GetInt64(Var2, Result); {$ENDIF}
+ btS32: b := var1^.ts32 <> Getint(Var2, Result);
+ btSingle: b := var1^.tsingle <> GetReal( Var2, Result);
+ btDouble: b := var1^.tdouble <> GetReal( Var2, Result);
+ btExtended: b := var1^.textended <> GetReal( Var2, Result);
+ btCurrency: b := var1^.tcurrency <> GetReal( Var2, Result);
+ btEnum: b := var1^.ts32 <> Getint(Var2, Result);
+ btString: b := tbtstring(var1^.tstring) <> GetString(var2, Result);
+ btChar: b := var1^.tchar <> GetString(var2, Result);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString: b := tbtWideString(var1^.twidestring) <> GetWideString(var2, Result);
+ btUnicodeString: b := tbtUnicodeString(var1^.tunistring) <> GetUnicodeString(var2, Result);
+ btWideChar: b := var1^.twidechar <> GetUnicodeString(var2, Result);
+ {$ENDIF}
+ btSet:
+ begin
+ if (var1.FType = var2.FType) then
+ begin
+ Set_Equal(var1.tstring, var2.tstring, TPSSetType(var1.FType).GetByteSize, b);
+ b := not b;
+ end else Result := False;
+ end;
+ else
+ Result := False;
+ end;
+ ConvertToBoolean(Self, FUseUsedTypes, Var1, b);
+ end;
+ otEqual:
+ begin { = }
+ case Var1.FType.BaseType of
+ btU8: b := var1^.tu8 = GetUint(Var2, Result);
+ btS8: b := var1^.ts8 = Getint(Var2, Result);
+ btU16: b := var1^.tu16 = GetUint(Var2, Result);
+ btS16: b := var1^.ts16 = Getint(Var2, Result);
+ btU32: b := var1^.tu32 = GetUint(Var2, Result);
+ btS32: b := var1^.ts32 = Getint(Var2, Result);
+ {$IFNDEF PS_NOINT64}btS64: b := var1^.ts64 = GetInt64(Var2, Result); {$ENDIF}
+ btSingle: b := var1^.tsingle = GetReal( Var2, Result);
+ btDouble: b := var1^.tdouble = GetReal( Var2, Result);
+ btExtended: b := var1^.textended = GetReal( Var2, Result);
+ btCurrency: b := var1^.tcurrency = GetReal( Var2, Result);
+ btEnum: b := var1^.ts32 = Getint(Var2, Result);
+ btString: b := tbtstring(var1^.tstring) = GetString(var2, Result);
+ btChar: b := var1^.tchar = GetString(var2, Result);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString: b := tbtWideString(var1^.twidestring) = GetWideString(var2, Result);
+ btUnicodeString: b := tbtUnicodeString(var1^.twidestring) = GetUnicodeString(var2, Result);
+ btWideChar: b := var1^.twidechar = GetUnicodeString(var2, Result);
+ {$ENDIF}
+ btSet:
+ begin
+ if (var1.FType = var2.FType) then
+ begin
+ Set_Equal(var1.tstring, var2.tstring, TPSSetType(var1.FType).ByteSize, b);
+ end else Result := False;
+ end;
+ else
+ Result := False;
+ end;
+ ConvertToBoolean(Self, FUseUsedTypes, Var1, b);
+ end;
+ otIn:
+ begin
+ if (var2.Ftype.BaseType = btset) and (TPSSetType(var2).SetType = Var1.FType) then
+ begin
+ Set_membership(GetUint(var1, result), var2.tstring, b);
+ end else Result := False;
+ end;
+ else
+ Result := False;
+ end;
+ except
+ on E: EDivByZero do
+ begin
+ Result := False;
+ MakeError('', ecDivideByZero, '');
+ Exit;
+ end;
+ on E: EZeroDivide do
+ begin
+ Result := False;
+ MakeError('', ecDivideByZero, '');
+ Exit;
+ end;
+ on E: EMathError do
+ begin
+ Result := False;
+ MakeError('', ecMathError, tbtstring(e.Message));
+ Exit;
+ end;
+ on E: Exception do
+ begin
+ Result := False;
+ MakeError('', ecInternalError, tbtstring(E.Message));
+ Exit;
+ end;
+ end;
+ if not Result then
+ begin
+ with MakeError('', ecTypeMismatch, '') do
+ begin
+ FPosition := Pos;
+ FRow := Row;
+ FCol := Col;
+ end;
+ end;
+end;
+
+function TPSPascalCompiler.IsDuplicate(const s: tbtString; const check: TPSDuplicCheck): Boolean;
+var
+ h, l: Longint;
+ x: TPSProcedure;
+begin
+ h := MakeHash(s);
+ if (s = 'RESULT') then
+ begin
+ Result := True;
+ exit;
+ end;
+ if dcTypes in Check then
+ for l := FTypes.Count - 1 downto 0 do
+ begin
+ if (TPSType(FTypes.Data[l]).NameHash = h) and
+ (TPSType(FTypes.Data[l]).Name = s) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+
+ if dcProcs in Check then
+ for l := FProcs.Count - 1 downto 0 do
+ begin
+ x := FProcs.Data[l];
+ if x.ClassType = TPSInternalProcedure then
+ begin
+ if (h = TPSInternalProcedure(x).NameHash) and (s = TPSInternalProcedure(x).Name) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end
+ else
+ begin
+ if (TPSExternalProcedure(x).RegProc.NameHash = h) and
+ (TPSExternalProcedure(x).RegProc.Name = s) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ end;
+ if dcVars in Check then
+ for l := FVars.Count - 1 downto 0 do
+ begin
+ if (TPSVar(FVars.Data[l]).NameHash = h) and
+ (TPSVar(FVars.Data[l]).Name = s) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ if dcConsts in Check then
+ for l := FConstants.Count -1 downto 0 do
+ begin
+ if (TPSConstant(FConstants.Data[l]).NameHash = h) and
+ (TPSConstant(FConstants.Data[l]).Name = s) then
+ begin
+ Result := TRue;
+ exit;
+ end;
+ end;
+ Result := False;
+end;
+
+procedure ClearRecSubVals(RecSubVals: TPSList);
+var
+ I: Longint;
+begin
+ for I := 0 to RecSubVals.Count - 1 do
+ TPSRecordFieldTypeDef(RecSubVals[I]).Free;
+ RecSubVals.Free;
+end;
+
+function TPSPascalCompiler.ReadTypeAddProcedure(const Name: tbtString; FParser: TPSPascalParser): TPSType;
+var
+ IsFunction: Boolean;
+ VNames: tbtString;
+ modifier: TPSParameterMode;
+ Decl: TPSParametersDecl;
+ VCType: TPSType;
+begin
+ if FParser.CurrTokenId = CSTII_Function then
+ IsFunction := True
+ else
+ IsFunction := False;
+ Decl := TPSParametersDecl.Create;
+ try
+ FParser.Next;
+ if FParser.CurrTokenId = CSTI_OpenRound then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_CloseRound then
+ begin
+ while True do
+ begin
+ if FParser.CurrTokenId = CSTII_Const then
+ begin
+ Modifier := pmIn;
+ FParser.Next;
+ end else
+ if FParser.CurrTokenId = CSTII_Out then
+ begin
+ Modifier := pmOut;
+ FParser.Next;
+ end else
+ if FParser.CurrTokenId = CSTII_Var then
+ begin
+ modifier := pmInOut;
+ FParser.Next;
+ end
+ else
+ modifier := pmIn;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ Result := nil;
+ if FParser = Self.FParser then
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ VNames := FParser.OriginalToken + '|';
+ FParser.Next;
+ while FParser.CurrTokenId = CSTI_Comma do
+ begin
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ Result := nil;
+ if FParser = Self.FParser then
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ VNames := VNames + FParser.GetToken + '|';
+ FParser.Next;
+ end;
+ if FParser.CurrTokenId <> CSTI_Colon then
+ begin
+ Result := nil;
+ if FParser = Self.FParser then
+ MakeError('', ecColonExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ Result := nil;
+ if FParser = self.FParser then
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ VCType := FindType(FParser.GetToken);
+ if VCType = nil then
+ begin
+ if FParser = self.FParser then
+ MakeError('', ecUnknownIdentifier, FParser.OriginalToken);
+ Result := nil;
+ exit;
+ end;
+ while Pos(tbtchar('|'), VNames) > 0 do
+ begin
+ with Decl.AddParam do
+ begin
+ Mode := modifier;
+ OrgName := copy(VNames, 1, Pos(tbtchar('|'), VNames) - 1);
+ FType := VCType;
+ end;
+ Delete(VNames, 1, Pos(tbtchar('|'), VNames));
+ end;
+ FParser.Next;
+ if FParser.CurrTokenId = CSTI_CloseRound then
+ break;
+ if FParser.CurrTokenId <> CSTI_Semicolon then
+ begin
+ if FParser = Self.FParser then
+ MakeError('', ecSemicolonExpected, '');
+ Result := nil;
+ exit;
+ end;
+ FParser.Next;
+ end; {while}
+ end; {if}
+ FParser.Next;
+ end; {if}
+ if IsFunction then
+ begin
+ if FParser.CurrTokenId <> CSTI_Colon then
+ begin
+ if FParser = Self.FParser then
+ MakeError('', ecColonExpected, '');
+ Result := nil;
+ exit;
+ end;
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ Result := nil;
+ if FParser = Self.FParser then
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ VCType := self.FindType(FParser.GetToken);
+ if VCType = nil then
+ begin
+ if FParser = self.FParser then
+ MakeError('', ecUnknownIdentifier, FParser.OriginalToken);
+ Result := nil;
+ exit;
+ end;
+ FParser.Next;
+ end
+ else
+ VCType := nil;
+ Decl.Result := VcType;
+ VCType := TPSProceduralType.Create;
+ VCType.Name := FastUppercase(Name);
+ VCType.OriginalName := Name;
+ VCType.BaseType := btProcPtr;
+ {$IFDEF PS_USESSUPPORT}
+ VCType.DeclareUnit:=fModule;
+ {$ENDIF}
+ VCType.DeclarePos := FParser.CurrTokenPos;
+ VCType.DeclareRow := FParser.Row;
+ VCType.DeclareCol := FParser.Col;
+ TPSProceduralType(VCType).ProcDef.Assign(Decl);
+ FTypes.Add(VCType);
+ Result := VCType;
+ finally
+ Decl.Free;
+ end;
+end; {ReadTypeAddProcedure}
+
+
+function TPSPascalCompiler.ReadType(const Name: tbtString; FParser: TPSPascalParser): TPSType; // InvalidVal = Invalid
+var
+ TypeNo: TPSType;
+ h, l: Longint;
+ FieldName,fieldorgname,s: tbtString;
+ RecSubVals: TPSList;
+ FArrayStart, FArrayLength: Longint;
+ rvv: PIFPSRecordFieldTypeDef;
+ p, p2: TPSType;
+ tempf: PIfRVariant;
+{$IFNDEF PS_NOINTERFACES}
+ InheritedFrom: tbtString;
+ Guid: TGUID;
+ Intf: TPSInterface;
+{$ENDIF}
+begin
+ if (FParser.CurrTokenID = CSTII_Function) or (FParser.CurrTokenID = CSTII_Procedure) then
+ begin
+ Result := ReadTypeAddProcedure(Name, FParser);
+ Exit;
+ end else if FParser.CurrTokenId = CSTII_Set then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTII_Of then
+ begin
+ MakeError('', ecOfExpected, '');
+ Result := nil;
+ Exit;
+ end;
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ Result := nil;
+ exit;
+ end;
+ TypeNo := FindType(FParser.GetToken);
+ if TypeNo = nil then
+ begin
+ MakeError('', ecUnknownIdentifier, '');
+ Result := nil;
+ exit;
+ end;
+ if (TypeNo.BaseType = btEnum) or (TypeNo.BaseType = btChar) or (TypeNo.BaseType = btU8) then
+ begin
+ FParser.Next;
+ p2 := TPSSetType.Create;
+ p2.Name := FastUppercase(Name);
+ p2.OriginalName := Name;
+ p2.BaseType := btSet;
+ {$IFDEF PS_USESSUPPORT}
+ p2.DeclareUnit:=fModule;
+ {$ENDIF}
+ p2.DeclarePos := FParser.CurrTokenPos;
+ p2.DeclareRow := FParser.Row;
+ p2.DeclareCol := FParser.Col;
+ TPSSetType(p2).SetType := TypeNo;
+ FTypes.Add(p2);
+ Result := p2;
+ end else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := nil;
+ end;
+ exit;
+ end else if FParser.CurrTokenId = CSTI_OpenRound then
+ begin
+ FParser.Next;
+ L := 0;
+ P2 := TPSEnumType.Create;
+ P2.Name := FastUppercase(Name);
+ p2.OriginalName := Name;
+ p2.BaseType := btEnum;
+ {$IFDEF PS_USESSUPPORT}
+ p2.DeclareUnit:=fModule;
+ {$ENDIF}
+ p2.DeclarePos := FParser.CurrTokenPos;
+ p2.DeclareRow := FParser.Row;
+ p2.DeclareCol := FParser.Col;
+ FTypes.Add(p2);
+
+ repeat
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ if FParser = Self.FParser then
+ MakeError('', ecIdentifierExpected, '');
+ Result := nil;
+ exit;
+ end;
+ s := FParser.OriginalToken;
+ if IsDuplicate(FastUppercase(s), [dcTypes]) then
+ begin
+ if FParser = Self.FParser then
+ MakeError('', ecDuplicateIdentifier, s);
+ Result := nil;
+ Exit;
+ end;
+ with AddConstant(s, p2) do
+ begin
+ FValue.tu32 := L;
+ {$IFDEF PS_USESSUPPORT}
+ DeclareUnit:=fModule;
+ {$ENDIF}
+ DeclarePos:=FParser.CurrTokenPos;
+ DeclareRow:=FParser.Row;
+ DeclareCol:=FParser.Col;
+ end;
+ Inc(L);
+ FParser.Next;
+ if FParser.CurrTokenId = CSTI_CloseRound then
+ Break
+ else if FParser.CurrTokenId <> CSTI_Comma then
+ begin
+ if FParser = Self.FParser then
+ MakeError('', ecCloseRoundExpected, '');
+ Result := nil;
+ Exit;
+ end;
+ FParser.Next;
+ until False;
+ FParser.Next;
+ TPSEnumType(p2).HighValue := L-1;
+ Result := p2;
+ exit;
+ end else
+ if FParser.CurrTokenId = CSTII_Array then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenID = CSTI_OpenBlock then
+ begin
+ FParser.Next;
+ tempf := ReadConstant(FParser, CSTI_TwoDots);
+ if tempf = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ case tempf.FType.BaseType of
+ btU8: FArrayStart := tempf.tu8;
+ btS8: FArrayStart := tempf.ts8;
+ btU16: FArrayStart := tempf.tu16;
+ btS16: FArrayStart := tempf.ts16;
+ btU32: FArrayStart := tempf.tu32;
+ btS32: FArrayStart := tempf.ts32;
+ {$IFNDEF PS_NOINT64}
+ bts64: FArrayStart := tempf.ts64;
+ {$ENDIF}
+ else
+ begin
+ DisposeVariant(tempf);
+ MakeError('', ecTypeMismatch, '');
+ Result := nil;
+ exit;
+ end;
+ end;
+ DisposeVariant(tempf);
+ if FParser.CurrTokenID <> CSTI_TwoDots then
+ begin
+ MakeError('', ecPeriodExpected, '');
+ Result := nil;
+ exit;
+ end;
+ FParser.Next;
+ tempf := ReadConstant(FParser, CSTI_CloseBlock);
+ if tempf = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ case tempf.FType.BaseType of
+ btU8: FArrayLength := tempf.tu8;
+ btS8: FArrayLength := tempf.ts8;
+ btU16: FArrayLength := tempf.tu16;
+ btS16: FArrayLength := tempf.ts16;
+ btU32: FArrayLength := tempf.tu32;
+ btS32: FArrayLength := tempf.ts32;
+ {$IFNDEF PS_NOINT64}
+ bts64: FArrayLength := tempf.ts64;
+ {$ENDIF}
+ else
+ DisposeVariant(tempf);
+ MakeError('', ecTypeMismatch, '');
+ Result := nil;
+ exit;
+ end;
+ DisposeVariant(tempf);
+ FArrayLength := FArrayLength - FArrayStart + 1;
+ if (FArrayLength < 0) or (FArrayLength > MaxInt div 4) then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := nil;
+ exit;
+ end;
+ if FParser.CurrTokenID <> CSTI_CloseBlock then
+ begin
+ MakeError('', ecCloseBlockExpected, '');
+ Result := nil;
+ exit;
+ end;
+ FParser.Next;
+ end else
+ begin
+ FArrayStart := 0;
+ FArrayLength := -1;
+ end;
+ if FParser.CurrTokenId <> CSTII_Of then
+ begin
+ if FParser = Self.FParser then
+ MakeError('', ecOfExpected, '');
+ Result := nil;
+ exit;
+ end;
+ FParser.Next;
+ TypeNo := ReadType('', FParser);
+ if TypeNo = nil then
+ begin
+ if FParser = Self.FParser then
+ MakeError('', ecUnknownIdentifier, '');
+ Result := nil;
+ exit;
+ end;
+ if (Name = '') and (FArrayLength = -1) then
+ begin
+ if TypeNo.Used then
+ begin
+ for h := 0 to FTypes.Count -1 do
+ begin
+ p := FTypes[H];
+ if (p.BaseType = btArray) and (TPSArrayType(p).ArrayTypeNo = TypeNo) and (Copy(p.Name, 1, 1) <> '!') then
+ begin
+ Result := p;
+ exit;
+ end;
+ end;
+ end;
+ end;
+ if FArrayLength <> -1 then
+ begin
+ p := TPSStaticArrayType.Create;
+ TPSStaticArrayType(p).StartOffset := FArrayStart;
+ TPSStaticArrayType(p).Length := FArrayLength;
+ p.BaseType := btStaticArray;
+ end else
+ begin
+ p := TPSArrayType.Create;
+ p.BaseType := btArray;
+ end;
+ p.Name := FastUppercase(Name);
+ p.OriginalName := Name;
+ {$IFDEF PS_USESSUPPORT}
+ p.DeclareUnit:=fModule;
+ {$ENDIF}
+ p.DeclarePos := FParser.CurrTokenPos;
+ p.DeclareRow := FParser.Row;
+ p.DeclareCol := FParser.Col;
+ TPSArrayType(p).ArrayTypeNo := TypeNo;
+ FTypes.Add(p);
+ Result := p;
+ Exit;
+ end
+ else if FParser.CurrTokenId = CSTII_Record then
+ begin
+ FParser.Next;
+ RecSubVals := TPSList.Create;
+ repeat
+ repeat
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ ClearRecSubVals(RecSubVals);
+ if FParser = Self.FParser then
+ MakeError('', ecIdentifierExpected, '');
+ Result := nil;
+ exit;
+ end;
+ FieldName := FParser.GetToken;
+ s := S+FParser.OriginalToken+'|';
+ FParser.Next;
+ h := MakeHash(FieldName);
+ for l := 0 to RecSubVals.Count - 1 do
+ begin
+ if (PIFPSRecordFieldTypeDef(RecSubVals[l]).FieldNameHash = h) and
+ (PIFPSRecordFieldTypeDef(RecSubVals[l]).FieldName = FieldName) then
+ begin
+ if FParser = Self.FParser then
+ MakeError('', ecDuplicateIdentifier, FParser.OriginalToken);
+ ClearRecSubVals(RecSubVals);
+ Result := nil;
+ exit;
+ end;
+ end;
+ if FParser.CurrTokenID = CSTI_Colon then Break else
+ if FParser.CurrTokenID <> CSTI_Comma then
+ begin
+ if FParser = Self.FParser then
+ MakeError('', ecColonExpected, '');
+ ClearRecSubVals(RecSubVals);
+ Result := nil;
+ exit;
+ end;
+ FParser.Next;
+ until False;
+ FParser.Next;
+ p := ReadType('', FParser);
+ if p = nil then
+ begin
+ ClearRecSubVals(RecSubVals);
+ Result := nil;
+ exit;
+ end;
+ p := GetTypeCopyLink(p);
+ if FParser.CurrTokenId <> CSTI_Semicolon then
+ begin
+ ClearRecSubVals(RecSubVals);
+ if FParser = Self.FParser then
+ MakeError('', ecSemicolonExpected, '');
+ Result := nil;
+ exit;
+ end; {if}
+ FParser.Next;
+ while Pos(tbtchar('|'), s) > 0 do
+ begin
+ fieldorgname := copy(s, 1, Pos(tbtchar('|'), s)-1);
+ Delete(s, 1, length(FieldOrgName)+1);
+ rvv := TPSRecordFieldTypeDef.Create;
+ rvv.FieldOrgName := fieldorgname;
+ rvv.FType := p;
+ RecSubVals.Add(rvv);
+ end;
+ until FParser.CurrTokenId = CSTII_End;
+ FParser.Next; // skip CSTII_End
+ P := TPSRecordType.Create;
+ p.Name := FastUppercase(Name);
+ p.OriginalName := Name;
+ p.BaseType := btRecord;
+ {$IFDEF PS_USESSUPPORT}
+ p.DeclareUnit:=fModule;
+ {$ENDIF}
+ p.DeclarePos := FParser.CurrTokenPos;
+ p.DeclareRow := FParser.Row;
+ p.DeclareCol := FParser.Col;
+ for l := 0 to RecSubVals.Count -1 do
+ begin
+ rvv := RecSubVals[l];
+ with TPSRecordType(p).AddRecVal do
+ begin
+ FieldOrgName := rvv.FieldOrgName;
+ FType := rvv.FType;
+ end;
+ rvv.Free;
+ end;
+ RecSubVals.Free;
+ FTypes.Add(p);
+ Result := p;
+ Exit;
+{$IFNDEF PS_NOINTERFACES}
+ end else if FParser.CurrTokenId = CSTII_Interface then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_OpenRound then
+ begin
+ MakeError('', ecOpenRoundExpected, '');
+ Result := nil;
+ Exit;
+ end;
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ Result := nil;
+ exit;
+ end;
+ InheritedFrom := FParser.GetToken;
+ TypeNo := FindType(InheritedFrom);
+ if TypeNo = nil then
+ begin
+ MakeError('', ecUnknownType, FParser.GetToken);
+ Result := nil;
+ exit;
+ end;
+ if TypeNo.BaseType <> btInterface then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := nil;
+ Exit;
+ end;
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_CloseRound then
+ begin
+ MakeError('', ecCloseRoundExpected, '');
+ Result := nil;
+ Exit;
+ end;
+{$IFNDEF PS_NOINTERFACEGUIDBRACKETS}
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_OpenBlock then
+ begin
+ MakeError('', ecOpenBlockExpected, '');
+ Result := nil;
+ Exit;
+ end;
+{$ENDIF}
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_String then
+ begin
+ MakeError('', ecStringExpected, '');
+ Result := nil;
+ Exit;
+ end;
+ s := FParser.GetToken;
+ try
+ Guid := StringToGuid(String(Copy(s, 2, Length(s)-2)));
+ except
+ on e: Exception do
+ begin
+ MakeError('', ecCustomError, tbtstring(e.Message));
+ Result := nil;
+ Exit;
+ end;
+ end;
+{$IFNDEF PS_NOINTERFACEGUIDBRACKETS}
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_CloseBlock then
+ begin
+ MakeError('', ecCloseBlockExpected, '');
+ Result := nil;
+ Exit;
+ end;
+{$ENDIF}
+ Intf := AddInterface(FindInterface(InheritedFrom), Guid, Name);
+ FParser.Next;
+ repeat
+ if not Intf.RegisterMethodEx('', cdStdCall, FParser) then begin
+ MakeError('', ecCustomError, 'Invalid method');
+ Result := nil;
+ Exit;
+ end;
+ FParser.Next;
+ until FParser.CurrTokenId = CSTII_End;
+ FParser.Next; // skip CSTII_End
+ Result := Intf.FType;
+ Exit;
+{$ENDIF}
+ end else if FParser.CurrTokenId = CSTI_Identifier then
+ begin
+ s := FParser.GetToken;
+ h := MakeHash(s);
+ Typeno := nil;
+ for l := 0 to FTypes.Count - 1 do
+ begin
+ p2 := FTypes[l];
+ if (p2.NameHash = h) and (p2.Name = s) then
+ begin
+ FParser.Next;
+ Typeno := GetTypeCopyLink(p2);
+ Break;
+ end;
+ end;
+ if Typeno = nil then
+ begin
+ Result := nil;
+ if FParser = Self.FParser then
+ MakeError('', ecUnknownType, FParser.OriginalToken);
+ exit;
+ end;
+ if Name <> '' then
+ begin
+ p := TPSTypeLink.Create;
+ p.Name := FastUppercase(Name);
+ p.OriginalName := Name;
+ p.BaseType := BtTypeCopy;
+ {$IFDEF PS_USESSUPPORT}
+ p.DeclareUnit:=fModule;
+ {$ENDIF}
+ p.DeclarePos := FParser.CurrTokenPos;
+ p.DeclareRow := FParser.Row;
+ p.DeclareCol := FParser.Col;
+ TPSTypeLink(p).LinkTypeNo := TypeNo;
+ FTypes.Add(p);
+ Result := p;
+ Exit;
+ end else
+ begin
+ Result := TypeNo;
+ exit;
+ end;
+ end;
+ Result := nil;
+ if FParser = Self.FParser then
+ MakeError('', ecIdentifierExpected, '');
+ Exit;
+end;
+
+function TPSPascalCompiler.VarIsDuplicate(Proc: TPSInternalProcedure; const Varnames, s: tbtString): Boolean;
+var
+ h, l: Longint;
+ x: TPSProcedure;
+ v: tbtString;
+begin
+ h := MakeHash(s);
+ if (s = 'RESULT') then
+ begin
+ Result := True;
+ exit;
+ end;
+
+ for l := FProcs.Count - 1 downto 0 do
+ begin
+ x := FProcs.Data[l];
+ if x.ClassType = TPSInternalProcedure then
+ begin
+ if (h = TPSInternalProcedure(x).NameHash) and (s = TPSInternalProcedure(x).Name) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end
+ else
+ begin
+ if (TPSExternalProcedure(x).RegProc.NameHash = h) and (TPSExternalProcedure(x).RegProc.Name = s) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ end;
+ if proc <> nil then
+ begin
+ for l := proc.ProcVars.Count - 1 downto 0 do
+ begin
+ if (PIFPSProcVar(proc.ProcVars.Data[l]).NameHash = h) and
+ (PIFPSProcVar(proc.ProcVars.Data[l]).Name = s) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ for l := Proc.FDecl.ParamCount -1 downto 0 do
+ begin
+ if (Proc.FDecl.Params[l].Name = s) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ end
+ else
+ begin
+ for l := FVars.Count - 1 downto 0 do
+ begin
+ if (TPSVar(FVars.Data[l]).NameHash = h) and
+ (TPSVar(FVars.Data[l]).Name = s) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ end;
+ v := VarNames;
+ while Pos(tbtchar('|'), v) > 0 do
+ begin
+ if FastUppercase(copy(v, 1, Pos(tbtchar('|'), v) - 1)) = s then
+ begin
+ Result := True;
+ exit;
+ end;
+ Delete(v, 1, Pos(tbtchar('|'), v));
+ end;
+ for l := FConstants.Count -1 downto 0 do
+ begin
+ if (TPSConstant(FConstants.Data[l]).NameHash = h) and
+ (TPSConstant(FConstants.Data[l]).Name = s) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ Result := False;
+end;
+
+
+function TPSPascalCompiler.DoVarBlock(proc: TPSInternalProcedure): Boolean;
+var
+ VarName, s: tbtString;
+ VarType: TPSType;
+ VarNo: Cardinal;
+ v: TPSVar;
+ vp: PIFPSProcVar;
+ EPos, ERow, ECol: Integer;
+begin
+ Result := False;
+ FParser.Next; // skip CSTII_Var
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ repeat
+ VarNAme := '';
+ if VarIsDuplicate(proc, VarName, FParser.GetToken) then
+ begin
+ MakeError('', ecDuplicateIdentifier, FParser.OriginalToken);
+ exit;
+ end;
+ VarName := FParser.OriginalToken + '|';
+ Varno := 0;
+ if @FOnUseVariable <> nil then
+ begin
+ if Proc <> nil then
+ FOnUseVariable(Self, ivtVariable, Proc.ProcVars.Count + VarNo, FProcs.Count -1, FParser.CurrTokenPos, '')
+ else
+ FOnUseVariable(Self, ivtGlobal, FVars.Count + VarNo, InvalidVal, FParser.CurrTokenPos, '')
+ end;
+ EPos:=FParser.CurrTokenPos;
+ ERow:=FParser.Row;
+ ECol:=FParser.Col;
+ FParser.Next;
+ while FParser.CurrTokenId = CSTI_Comma do
+ begin
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ end;
+ if VarIsDuplicate(proc, VarName, FParser.GetToken) then
+ begin
+ MakeError('', ecDuplicateIdentifier, FParser.OriginalToken);
+ exit;
+ end;
+ VarName := VarName + FParser.OriginalToken + '|';
+ Inc(varno);
+ if @FOnUseVariable <> nil then
+ begin
+ if Proc <> nil then
+ FOnUseVariable(Self, ivtVariable, Proc.ProcVars.Count + VarNo, FProcs.Count -1, FParser.CurrTokenPos, '')
+ else
+ FOnUseVariable(Self, ivtGlobal, FVars.Count + VarNo, InvalidVal, FParser.CurrTokenPos, '')
+ end;
+ FParser.Next;
+ end;
+ if FParser.CurrTokenId <> CSTI_Colon then
+ begin
+ MakeError('', ecColonExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ VarType := at2ut(ReadType('', FParser));
+ if VarType = nil then
+ begin
+ exit;
+ end;
+ while Pos(tbtchar('|'), VarName) > 0 do
+ begin
+ s := copy(VarName, 1, Pos(tbtchar('|'), VarName) - 1);
+ Delete(VarName, 1, Pos(tbtchar('|'), VarName));
+ if proc = nil then
+ begin
+ v := TPSVar.Create;
+ v.OrgName := s;
+ v.Name := FastUppercase(s);
+ {$IFDEF PS_USESSUPPORT}
+ v.DeclareUnit:=fModule;
+ {$ENDIF}
+ v.DeclarePos := EPos;
+ v.DeclareRow := ERow;
+ v.DeclareCol := ECol;
+ v.FType := VarType;
+ FVars.Add(v);
+ end
+ else
+ begin
+ vp := TPSProcVar.Create;
+ vp.OrgName := s;
+ vp.Name := FastUppercase(s);
+ vp.aType := VarType;
+ {$IFDEF PS_USESSUPPORT}
+ vp.DeclareUnit:=fModule;
+ {$ENDIF}
+ vp.DeclarePos := EPos;
+ vp.DeclareRow := ERow;
+ vp.DeclareCol := ECol;
+ proc.ProcVars.Add(vp);
+ end;
+ end;
+ if FParser.CurrTokenId <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ until FParser.CurrTokenId <> CSTI_Identifier;
+ Result := True;
+end;
+
+function TPSPascalCompiler.NewProc(const OriginalName, Name: tbtString): TPSInternalProcedure;
+begin
+ Result := TPSInternalProcedure.Create;
+ Result.OriginalName := OriginalName;
+ Result.Name := Name;
+ {$IFDEF PS_USESSUPPORT}
+ Result.DeclareUnit:=fModule;
+ {$ENDIF}
+ Result.DeclarePos := FParser.CurrTokenPos;
+ Result.DeclareRow := FParser.Row;
+ Result.DeclareCol := FParser.Col;
+ FProcs.Add(Result);
+end;
+
+function TPSPascalCompiler.IsProcDuplicLabel(Proc: TPSInternalProcedure; const s: tbtString): Boolean;
+var
+ i: Longint;
+ h: Longint;
+ u: tbtString;
+begin
+ h := MakeHash(s);
+ if s = 'RESULT' then
+ Result := True
+ else if Proc.Name = s then
+ Result := True
+ else if IsDuplicate(s, [dcVars, dcConsts, dcProcs]) then
+ Result := True
+ else
+ begin
+ for i := 0 to Proc.Decl.ParamCount -1 do
+ begin
+ if Proc.Decl.Params[i].Name = s then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ for i := 0 to Proc.ProcVars.Count -1 do
+ begin
+ if (PIFPSProcVar(Proc.ProcVars[I]).NameHash = h) and (PIFPSProcVar(Proc.ProcVars[I]).Name = s) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ for i := 0 to Proc.FLabels.Count -1 do
+ begin
+ u := Proc.FLabels[I];
+ delete(u, 1, 4);
+ if Longint((@u[1])^) = h then
+ begin
+ delete(u, 1, 4);
+ if u = s then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ end;
+ Result := False;
+ end;
+end;
+
+
+function TPSPascalCompiler.ProcessLabel(Proc: TPSInternalProcedure): Boolean;
+var
+ CurrLabel: tbtString;
+begin
+ FParser.Next;
+ while true do
+ begin
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ Result := False;
+ exit;
+ end;
+ CurrLabel := FParser.GetToken;
+ if IsProcDuplicLabel(Proc, CurrLabel) then
+ begin
+ MakeError('', ecDuplicateIdentifier, CurrLabel);
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ Proc.FLabels.Add(#$FF#$FF#$FF#$FF+PS_mi2s(MakeHash(CurrLabel))+CurrLabel);
+ if FParser.CurrTokenId = CSTI_Semicolon then
+ begin
+ FParser.Next;
+ Break;
+ end;
+ if FParser.CurrTokenId <> CSTI_Comma then
+ begin
+ MakeError('', ecCommaExpected, '');
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ end;
+ Result := True;
+end;
+
+procedure TPSPascalCompiler.Debug_SavePosition(ProcNo: Cardinal; Proc: TPSInternalProcedure);
+var
+ Row,
+ Col,
+ Pos: Cardinal;
+ s: tbtString;
+begin
+ Row := FParser.Row;
+ Col := FParser.Col;
+ Pos := FParser.CurrTokenPos;
+ {$IFNDEF PS_USESSUPPORT}
+ s := '';
+ {$ELSE}
+ s := fModule;
+ {$ENDIF}
+ if @FOnTranslateLineInfo <> nil then
+ FOnTranslateLineInfo(Self, Pos, Row, Col, S);
+ {$IFDEF FPC}
+ WriteDebugData(#4 + s + #1);
+ WriteDebugData(Ps_mi2s(ProcNo));
+ WriteDebugData(Ps_mi2s(Length(Proc.Data)));
+ WriteDebugData(Ps_mi2s(Pos));
+ WriteDebugData(Ps_mi2s(Row));
+ WriteDebugData(Ps_mi2s(Col));
+ {$ELSE}
+ WriteDebugData(#4 + s + #1 + PS_mi2s(ProcNo) + PS_mi2s(Length(Proc.Data)) + PS_mi2s(Pos) + PS_mi2s(Row)+ PS_mi2s(Col));
+ {$ENDIF}
+end;
+
+procedure TPSPascalCompiler.Debug_WriteParams(ProcNo: Cardinal; Proc: TPSInternalProcedure);
+var
+ I: Longint;
+ s: tbtString;
+begin
+ s := #2 + PS_mi2s(ProcNo);
+ if Proc.Decl.Result <> nil then
+ begin
+ s := s + 'Result' + #1;
+ end;
+ for i := 0 to Proc.Decl.ParamCount -1 do
+ s := s + Proc.Decl.Params[i].OrgName + #1;
+ s := s + #0#3 + PS_mi2s(ProcNo);
+ for I := 0 to Proc.ProcVars.Count - 1 do
+ begin
+ s := s + PIFPSProcVar(Proc.ProcVars[I]).OrgName + #1;
+ end;
+ s := s + #0;
+ WriteDebugData(s);
+end;
+
+procedure TPSPascalCompiler.CheckForUnusedVars(Func: TPSInternalProcedure);
+var
+ i: Integer;
+ p: PIFPSProcVar;
+begin
+ for i := 0 to Func.ProcVars.Count -1 do
+ begin
+ p := Func.ProcVars[I];
+ if not p.Used then
+ begin
+ with MakeHint({$IFDEF PS_USESSUPPORT}p.DeclareUnit{$ELSE}''{$ENDIF}, ehVariableNotUsed, p.Name) do
+ begin
+ FRow := p.DeclareRow;
+ FCol := p.DeclareCol;
+ FPosition := p.DeclarePos;
+ end;
+ end;
+ end;
+ if (not Func.ResultUsed) and (Func.Decl.Result <> nil) then
+ begin
+ with MakeHint({$IFDEF PS_USESSUPPORT}Func.DeclareUnit{$ELSE}''{$ENDIF}, ehVariableNotUsed, 'Result') do
+ begin
+ FRow := Func.DeclareRow;
+ FCol := Func.DeclareCol;
+ FPosition := Func.DeclarePos;
+ end;
+ end;
+end;
+
+function TPSPascalCompiler.ProcIsDuplic(Decl: TPSParametersDecl; const FunctionName, FunctionParamNames: tbtString; const s: tbtString; Func: TPSInternalProcedure): Boolean;
+var
+ i: Longint;
+ u: tbtString;
+begin
+ if s = 'RESULT' then
+ Result := True
+ else if FunctionName = s then
+ Result := True
+ else
+ begin
+ for i := 0 to Decl.ParamCount -1 do
+ begin
+ if Decl.Params[i].Name = s then
+ begin
+ Result := True;
+ exit;
+ end;
+ GRFW(u);
+ end;
+ u := FunctionParamNames;
+ while Pos(tbtchar('|'), u) > 0 do
+ begin
+ if copy(u, 1, Pos(tbtchar('|'), u) - 1) = s then
+ begin
+ Result := True;
+ exit;
+ end;
+ Delete(u, 1, Pos(tbtchar('|'), u));
+ end;
+ if Func = nil then
+ begin
+ result := False;
+ exit;
+ end;
+ for i := 0 to Func.ProcVars.Count -1 do
+ begin
+ if s = PIFPSProcVar(Func.ProcVars[I]).Name then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ for i := 0 to Func.FLabels.Count -1 do
+ begin
+ u := Func.FLabels[I];
+ delete(u, 1, 4);
+ if u = s then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ Result := False;
+ end;
+end;
+procedure WriteProcVars(Func:TPSInternalProcedure; t: TPSList);
+var
+ l: Longint;
+ v: PIFPSProcVar;
+begin
+ for l := 0 to t.Count - 1 do
+ begin
+ v := t[l];
+ Func.Data := Func.Data + chr(cm_pt)+ PS_mi2s(v.AType.FinalTypeNo);
+ end;
+end;
+
+
+function TPSPascalCompiler.ApplyAttribsToFunction(func: TPSProcedure): boolean;
+var
+ i: Longint;
+begin
+ for i := 0 to Func.Attributes.Count -1 do
+ begin
+ if @Func.Attributes.Items[i].AType.OnApplyAttributeToProc <> nil then
+ begin
+ if not Func.Attributes.Items[i].AType.OnApplyAttributeToProc(Self, Func, Func.Attributes.Items[i]) then
+ begin
+ Result := false;
+ exit;
+ end;
+ end;
+ end;
+ result := true;
+end;
+
+
+function TPSPascalCompiler.ProcessFunction(AlwaysForward: Boolean; Att: TPSAttributes): Boolean;
+var
+ FunctionType: TFuncType;
+ OriginalName, FunctionName: tbtString;
+ FunctionParamNames: tbtString;
+ FunctionTempType: TPSType;
+ ParamNo: Cardinal;
+ FunctionDecl: TPSParametersDecl;
+ modifier: TPSParameterMode;
+ Func: TPSInternalProcedure;
+ F2: TPSProcedure;
+ EPos, ECol, ERow: Cardinal;
+ E2Pos, E2Col, E2Row: Cardinal;
+ pp: TPSRegProc;
+ pp2: TPSExternalProcedure;
+ FuncNo, I: Longint;
+ Block: TPSBlockInfo;
+begin
+ if att = nil then
+ begin
+ Att := TPSAttributes.Create;
+ if not ReadAttributes(Att) then
+ begin
+ att.free;
+ Result := false;
+ exit;
+ end;
+ end;
+
+ if FParser.CurrTokenId = CSTII_Procedure then
+ FunctionType := ftProc
+ else
+ FunctionType := ftFunc;
+ Func := nil;
+ EPos := FParser.CurrTokenPos;
+ ERow := FParser.Row;
+ ECol := FParser.Col;
+ FParser.Next;
+ Result := False;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ att.free;
+ exit;
+ end;
+ if assigned(FOnFunctionStart) then
+ {$IFDEF PS_USESSUPPORT}
+ FOnFunctionStart(fModule + '.' + FParser.OriginalToken, EPos, ERow, ECol);
+ {$ELSE}
+ FOnFunctionStart(FParser.OriginalToken, EPos, ERow, ECol);
+ {$ENDIF}
+ EPos := FParser.CurrTokenPos;
+ ERow := FParser.Row;
+ ECol := FParser.Col;
+ OriginalName := FParser.OriginalToken;
+ FunctionName := FParser.GetToken;
+ FuncNo := -1;
+ for i := 0 to FProcs.Count -1 do
+ begin
+ f2 := FProcs[I];
+ if (f2.ClassType = TPSInternalProcedure) and (TPSInternalProcedure(f2).Name = FunctionName) and (TPSInternalProcedure(f2).Forwarded) then
+ begin
+ Func := FProcs[I];
+ FuncNo := i;
+ Break;
+ end;
+ end;
+ if (Func = nil) and IsDuplicate(FunctionName, [dcTypes, dcProcs, dcVars, dcConsts]) then
+ begin
+ att.free;
+ MakeError('', ecDuplicateIdentifier, FunctionName);
+ exit;
+ end;
+ FParser.Next;
+ FunctionDecl := TPSParametersDecl.Create;
+ try
+ if FParser.CurrTokenId = CSTI_OpenRound then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenId = CSTI_CloseRound then
+ begin
+ FParser.Next;
+ end
+ else
+ begin
+ if FunctionType = ftFunc then
+ ParamNo := 1
+ else
+ ParamNo := 0;
+ while True do
+ begin
+ if FParser.CurrTokenId = CSTII_Const then
+ begin
+ modifier := pmIn;
+ FParser.Next;
+ end
+ else
+ if FParser.CurrTokenId = CSTII_Out then
+ begin
+ modifier := pmOut;
+ FParser.Next;
+ end
+ else
+ if FParser.CurrTokenId = CSTII_Var then
+ begin
+ modifier := pmInOut;
+ FParser.Next;
+ end
+ else
+ modifier := pmIn;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ E2Pos := FParser.CurrTokenPos;
+ E2Row := FParser.Row;
+ E2Col := FParser.Col;
+ FunctionParamNames := '';
+ if ProcIsDuplic(FunctionDecl, FunctionName, FunctionParamNames, FParser.GetToken, Func) then
+ begin
+ MakeError('', ecDuplicateIdentifier, FParser.OriginalToken);
+ exit;
+ end;
+ FunctionParamNames := FParser.OriginalToken + '|';
+ if @FOnUseVariable <> nil then
+ begin
+ FOnUseVariable(Self, ivtParam, ParamNo, FProcs.Count, FParser.CurrTokenPos, '');
+ end;
+ inc(ParamNo);
+ FParser.Next;
+ while FParser.CurrTokenId = CSTI_Comma do
+ begin
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ if ProcIsDuplic(FunctionDecl, FunctionName, FunctionParamNames, FParser.GetToken, Func) then
+ begin
+ MakeError('', ecDuplicateIdentifier, '');
+ exit;
+ end;
+ if @FOnUseVariable <> nil then
+ begin
+ FOnUseVariable(Self, ivtParam, ParamNo, FProcs.Count, FParser.CurrTokenPos, '');
+ end;
+ inc(ParamNo);
+ FunctionParamNames := FunctionParamNames + FParser.OriginalToken +
+ '|';
+ FParser.Next;
+ end;
+ if FParser.CurrTokenId <> CSTI_Colon then
+ begin
+ MakeError('', ecColonExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ FunctionTempType := at2ut(ReadType('', FParser));
+ if FunctionTempType = nil then
+ begin
+ exit;
+ end;
+ while Pos(tbtchar('|'), FunctionParamNames) > 0 do
+ begin
+ with FunctionDecl.AddParam do
+ begin
+ OrgName := copy(FunctionParamNames, 1, Pos(tbtchar('|'), FunctionParamNames) - 1);
+ Mode := modifier;
+ aType := FunctionTempType;
+ {$IFDEF PS_USESSUPPORT}
+ DeclareUnit:=fModule;
+ {$ENDIF}
+ DeclarePos:=E2Pos;
+ DeclareRow:=E2Row;
+ DeclareCol:=E2Col;
+ end;
+ Delete(FunctionParamNames, 1, Pos(tbtchar('|'), FunctionParamNames));
+ end;
+ if FParser.CurrTokenId = CSTI_CloseRound then
+ break;
+ if FParser.CurrTokenId <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ end;
+ FParser.Next;
+ end;
+ end;
+ if FunctionType = ftFunc then
+ begin
+ if FParser.CurrTokenId <> CSTI_Colon then
+ begin
+ MakeError('', ecColonExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ FunctionTempType := at2ut(ReadType('', FParser));
+ if FunctionTempType = nil then
+ exit;
+ FunctionDecl.Result := FunctionTempType;
+ end;
+ if FParser.CurrTokenId <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ if (Func = nil) and (FParser.CurrTokenID = CSTII_External) then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_String then
+ begin
+ MakeError('', ecStringExpected, '');
+ exit;
+ end;
+ FunctionParamNames := FParser.GetToken;
+ FunctionParamNames := copy(FunctionParamNames, 2, length(FunctionParamNames) - 2);
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ if @FOnExternalProc = nil then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ exit;
+ end;
+ pp := FOnExternalProc(Self, FunctionDecl, OriginalName, FunctionParamNames);
+ if pp = nil then
+ begin
+ MakeError('', ecCustomError, '');
+ exit;
+ end;
+ pp2 := TPSExternalProcedure.Create;
+ pp2.Attributes.Assign(att, true);
+ pp2.RegProc := pp;
+ FProcs.Add(pp2);
+ FRegProcs.Add(pp);
+ Result := ApplyAttribsToFunction(pp2);
+ Exit;
+ end else if (FParser.CurrTokenID = CSTII_Forward) or AlwaysForward then
+ begin
+ if Func <> nil then
+ begin
+ MakeError('', ecBeginExpected, '');
+ exit;
+ end;
+ if not AlwaysForward then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ Exit;
+ end;
+ FParser.Next;
+ end;
+ Func := NewProc(OriginalName, FunctionName);
+ Func.Attributes.Assign(Att, True);
+ Func.Forwarded := True;
+ {$IFDEF PS_USESSUPPORT}
+ Func.FDeclareUnit := fModule;
+ {$ENDIF}
+ Func.FDeclarePos := EPos;
+ Func.FDeclareRow := ERow;
+ Func.FDeclarePos := ECol;
+ Func.Decl.Assign(FunctionDecl);
+ Result := ApplyAttribsToFunction(Func);
+ exit;
+ end;
+ if (Func = nil) then
+ begin
+ Func := NewProc(OriginalName, FunctionName);
+ Func.Attributes.Assign(att, True);
+ Func.Decl.Assign(FunctionDecl);
+ {$IFDEF PS_USESSUPPORT}
+ Func.FDeclareUnit := fModule;
+ {$ENDIF}
+ Func.FDeclarePos := EPos;
+ Func.FDeclareRow := ERow;
+ Func.FDeclareCol := ECol;
+ FuncNo := FProcs.Count -1;
+ if not ApplyAttribsToFunction(Func) then
+ begin
+ result := false;
+ exit;
+ end;
+ end else begin
+ if not FunctionDecl.Same(Func.Decl) then
+ begin
+ MakeError('', ecForwardParameterMismatch, '');
+ Result := false;
+ exit;
+ end;
+ Func.Forwarded := False;
+ end;
+ if FParser.CurrTokenID = CSTII_Export then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ end;
+ while FParser.CurrTokenId <> CSTII_Begin do
+ begin
+ if FParser.CurrTokenId = CSTII_Var then
+ begin
+ if not DoVarBlock(Func) then
+ exit;
+ end else if FParser.CurrTokenId = CSTII_Label then
+ begin
+ if not ProcessLabel(Func) then
+ Exit;
+ end else
+ begin
+ MakeError('', ecBeginExpected, '');
+ exit;
+ end;
+ end;
+ Debug_WriteParams(FuncNo, Func);
+ WriteProcVars(Func, Func.ProcVars);
+ Block := TPSBlockInfo.Create(FGlobalBlock);
+ Block.SubType := tProcBegin;
+ Block.ProcNo := FuncNo;
+ Block.Proc := Func;
+ if not ProcessSub(Block) then
+ begin
+ Block.Free;
+ exit;
+ end;
+ Block.Free;
+ CheckForUnusedVars(Func);
+ Result := ProcessLabelForwards(Func);
+ if assigned(FOnFunctionEnd) then
+ {$IFDEF PS_USESSUPPORT}
+ OnFunctionEnd(fModule + '.' + OriginalName, FParser.CurrTokenPos, FParser.Row, FParser.Col);
+ {$ELSE}
+ OnFunctionEnd(OriginalName, FParser.CurrTokenPos, FParser.Row, FParser.Col);
+ {$ENDIF}
+ finally
+ FunctionDecl.Free;
+ att.Free;
+ end;
+end;
+
+function GetParamType(BlockInfo: TPSBlockInfo; I: Longint): TPSType;
+begin
+ if BlockInfo.Proc.Decl.Result <> nil then dec(i);
+ if i = -1 then
+ Result := BlockInfo.Proc.Decl.Result
+ else
+ begin
+ Result := BlockInfo.Proc.Decl.Params[i].aType;
+ end;
+end;
+
+function TPSPascalCompiler.GetTypeNo(BlockInfo: TPSBlockInfo; p: TPSValue): TPSType;
+begin
+ if p.ClassType = TPSUnValueOp then
+ Result := TPSUnValueOp(p).aType
+ else if p.ClassType = TPSBinValueOp then
+ Result := TPSBinValueOp(p).aType
+ else if p.ClassType = TPSValueArray then
+ Result := at2ut(FindType('TVariantArray'))
+ else if p.ClassType = TPSValueData then
+ Result := TPSValueData(p).Data.FType
+ else if p is TPSValueProc then
+ Result := TPSValueProc(p).ResultType
+ else if (p is TPSValueVar) and (TPSValueVar(p).RecCount > 0) then
+ Result := TPSValueVar(p).RecItem[TPSValueVar(p).RecCount - 1].aType
+ else if p.ClassType = TPSValueGlobalVar then
+ Result := TPSVar(FVars[TPSValueGlobalVar(p).GlobalVarNo]).FType
+ else if p.ClassType = TPSValueParamVar then
+ Result := GetParamType(BlockInfo, TPSValueParamVar(p).ParamNo)
+ else if p is TPSValueLocalVar then
+ Result := TPSProcVar(BlockInfo.Proc.ProcVars[TPSValueLocalVar(p).LocalVarNo]).AType
+ else if p.classtype = TPSValueReplace then
+ Result := GetTypeNo(BlockInfo, TPSValueReplace(p).NewValue)
+ else
+ Result := nil;
+end;
+
+function TPSPascalCompiler.IsVarInCompatible(ft1, ft2: TPSType): Boolean;
+begin
+ ft1 := GetTypeCopyLink(ft1);
+ ft2 := GetTypeCopyLink(ft2);
+ Result := (ft1 <> ft2) and (ft2 <> nil);
+end;
+
+function TPSPascalCompiler.ValidateParameters(BlockInfo: TPSBlockInfo; Params: TPSParameters; ParamTypes: TPSParametersDecl): boolean;
+var
+ i, c: Longint;
+ pType: TPSType;
+
+begin
+ UseProc(ParamTypes);
+ c := 0;
+ for i := 0 to ParamTypes.ParamCount -1 do
+ begin
+ while (c < Longint(Params.Count)) and (Params[c].Val = nil) do
+ Inc(c);
+ if c >= Longint(Params.Count) then
+ begin
+ MakeError('', ecInvalidnumberOfParameters, '');
+ Result := False;
+ exit;
+ end;
+ Params[c].ExpectedType := ParamTypes.Params[i].aType;
+ Params[c].ParamMode := ParamTypes.Params[i].Mode;
+ if ParamTypes.Params[i].Mode <> pmIn then
+ begin
+ if not (Params[c].Val is TPSValueVar) then
+ begin
+ with MakeError('', ecVariableExpected, '') do
+ begin
+ Row := Params[c].Val.Row;
+ Col := Params[c].Val.Col;
+ Pos := Params[c].Val.Pos;
+ end;
+ result := false;
+ exit;
+ end;
+ PType := Params[c].ExpectedType;
+ if (PType = nil) or ((PType.BaseType = btArray) and (TPSArrayType(PType).ArrayTypeNo = nil) and (GetTypeNo(BlockInfo, Params[c].Val).BaseType = btArray)) or
+ (PType = FAnyString) then
+ begin
+ Params[c].ExpectedType := GetTypeNo(BlockInfo, Params[c].Val);
+ if PType <> nil then
+ if (Params[c].ExpectedType = nil) or not (Params[c].ExpectedType.BaseType in [btString, btWideString, btUnicodeString, btChar, btWideChar]) then begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ exit;
+ end;
+ if Params[c].ExpectedType.BaseType = btChar then
+ Params[c].ExpectedType := FindBaseType(btString) else
+ if Params[c].ExpectedType.BaseType = btWideChar then
+ Params[c].ExpectedType := FindBaseType(btUnicodeString);
+ end else if (PType.BaseType = btArray) and (GetTypeNo(BlockInfo, Params[c].Val).BaseType = btArray) then
+ begin
+ if TPSArrayType(GetTypeNo(BlockInfo, Params[c].Val)).ArrayTypeNo <> TPSArrayType(PType).ArrayTypeNo then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ exit;
+ end;
+ end else if IsVarInCompatible(PType, GetTypeNo(BlockInfo, Params[c].Val)) then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ exit;
+ end;
+ end;
+ Inc(c);
+ end;
+ for i := c to Params.Count -1 do
+ begin
+ if Params[i].Val <> nil then
+ begin
+ MakeError('', ecInvalidnumberOfParameters, '');
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := true;
+end;
+
+function TPSPascalCompiler.DoTypeBlock(FParser: TPSPascalParser): Boolean;
+var
+ VOrg,VName: tbtString;
+ Attr: TPSAttributes;
+ FType: TPSType;
+ i: Longint;
+begin
+ Result := False;
+ FParser.Next;
+ repeat
+ Attr := TPSAttributes.Create;
+ if not ReadAttributes(Attr) then
+ begin
+ Attr.Free;
+ exit;
+ end;
+ if (FParser.CurrTokenID = CSTII_Procedure) or (FParser.CurrTokenID = CSTII_Function) then
+ begin
+ Result := ProcessFunction(false, Attr);
+ exit;
+ end;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ Attr.Free;
+ exit;
+ end;
+
+ VName := FParser.GetToken;
+ VOrg := FParser.OriginalToken;
+ if IsDuplicate(VName, [dcTypes, dcProcs, dcVars]) then
+ begin
+ MakeError('', ecDuplicateIdentifier, FParser.OriginalToken);
+ Attr.Free;
+ exit;
+ end;
+
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Equal then
+ begin
+ MakeError('', ecIsExpected, '');
+ Attr.Free;
+ exit;
+ end;
+ FParser.Next;
+ FType := ReadType(VOrg, FParser);
+ if Ftype = nil then
+ begin
+ Attr.Free;
+ Exit;
+ end;
+ FType.Attributes.Assign(Attr, True);
+ for i := 0 to FType.Attributes.Count -1 do
+ begin
+ if @FType.Attributes[i].FAttribType.FAAType <> nil then
+ FType.Attributes[i].FAttribType.FAAType(Self, FType, Attr[i]);
+ end;
+ Attr.Free;
+ if FParser.CurrTokenID <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ Exit;
+ end;
+ FParser.Next;
+ until (FParser.CurrTokenId <> CSTI_Identifier) and (FParser.CurrTokenID <> CSTI_OpenBlock);
+ Result := True;
+end;
+
+procedure TPSPascalCompiler.Debug_WriteLine(BlockInfo: TPSBlockInfo);
+var
+ b: Boolean;
+begin
+ if @FOnWriteLine <> nil then begin
+ {$IFNDEF PS_USESSUPPORT}
+ b := FOnWriteLine(Self, FParser.CurrTokenPos);
+ {$ELSE}
+ b := FOnWriteLine(Self, FModule, FParser.CurrTokenPos);
+ {$ENDIF}
+ end else
+ b := true;
+ if b then Debug_SavePosition(BlockInfo.ProcNo, BlockInfo.Proc);
+end;
+
+
+function TPSPascalCompiler.ReadReal(const s: tbtString): PIfRVariant;
+var
+ C: Integer;
+begin
+ New(Result);
+ InitializeVariant(Result, FindBaseType(btExtended));
+ Val(string(s), Result^.textended, C);
+end;
+
+function TPSPascalCompiler.ReadString: PIfRVariant;
+{$IFNDEF PS_NOWIDESTRING}var wchar: Boolean;{$ENDIF}
+
+ function ParseString({$IFNDEF PS_NOWIDESTRING}var res: tbtunicodestring{$ELSE}var res: tbtString{$ENDIF}): Boolean;
+ var
+ temp3: {$IFNDEF PS_NOWIDESTRING}tbtunicodestring{$ELSE}tbtString{$ENDIF};
+
+ function ChrToStr(s: tbtString): {$IFNDEF PS_NOWIDESTRING}widechar{$ELSE}tbtchar{$ENDIF};
+ var
+ w: Longint;
+ begin
+ Delete(s, 1, 1); {First char : #}
+ w := StrToInt(s);
+ Result := {$IFNDEF PS_NOWIDESTRING}widechar{$ELSE}tbtchar{$ENDIF}(w);
+ {$IFNDEF PS_NOWIDESTRING}if w > $FF then wchar := true;{$ENDIF}
+ end;
+
+ function PString(s: tbtString): tbtString;
+ var
+ i: Longint;
+ begin
+ s := copy(s, 2, Length(s) - 2);
+ i := length(s);
+ while i > 0 do
+ begin
+ if (i < length(s)) and (s[i] = #39) and (s[i + 1] = #39) then
+ begin
+ Delete(s, i, 1);
+ dec(i);
+ end;
+ dec(i);
+ end;
+ PString := s;
+ end;
+ var
+ lastwasstring: Boolean;
+ begin
+ temp3 := '';
+ while (FParser.CurrTokenId = CSTI_String) or (FParser.CurrTokenId = CSTI_Char) do
+ begin
+ lastwasstring := FParser.CurrTokenId = CSTI_String;
+ if FParser.CurrTokenId = CSTI_String then
+ begin
+ if UTF8Decode then
+ begin
+ temp3 := temp3 + {$IFNDEF PS_NOWIDESTRING}{$IFDEF DELPHI6UP}System.{$IFDEF DELPHI2009UP}UTF8ToWidestring{$ELSE}UTF8Decode{$ENDIF}{$ENDIF}{$ENDIF}(PString(FParser.GetToken));
+ {$IFNDEF PS_NOWIDESTRING}wchar:=true;{$ENDIF}
+ end else
+ temp3 := temp3 + tbtUnicodestring(PString(FParser.GetToken));
+
+ FParser.Next;
+ if FParser.CurrTokenId = CSTI_String then
+ temp3 := temp3 + #39;
+ end {if}
+ else
+ begin
+ temp3 := temp3 + ChrToStr(FParser.GetToken);
+ FParser.Next;
+ end; {else if}
+ if lastwasstring and (FParser.CurrTokenId = CSTI_String) then
+ begin
+ MakeError('', ecSyntaxError, '');
+ result := false;
+ exit;
+ end;
+ end; {while}
+ res := temp3;
+ result := true;
+ end;
+var
+{$IFNDEF PS_NOWIDESTRING}
+ w: tbtunicodestring;
+{$ENDIF}
+ s: tbtString;
+begin
+ {$IFNDEF PS_NOWIDESTRING}wchar:=false;{$ENDIF}
+ if not ParseString({$IFDEF PS_NOWIDESTRING} s {$ELSE} w {$ENDIF}) then
+ begin
+ result := nil;
+ exit;
+ end;
+{$IFNDEF PS_NOWIDESTRING}
+ if wchar then
+ begin
+ New(Result);
+ if Length(w) = 1 then
+ begin
+ InitializeVariant(Result, at2ut(FindBaseType(btwidechar)));
+ Result^.twidechar := w[1];
+ end else begin
+ InitializeVariant(Result, at2ut(FindBaseType(btUnicodeString)));
+ tbtunicodestring(Result^.tunistring) := w;
+ end;
+ end else begin
+ s := tbtstring(w);
+{$ENDIF}
+ New(Result);
+ if Length(s) = 1 then
+ begin
+ InitializeVariant(Result, at2ut(FindBaseType(btchar)));
+ Result^.tchar := s[1];
+ end else begin
+ InitializeVariant(Result, at2ut(FindBaseType(btstring)));
+ tbtstring(Result^.tstring) := s;
+ end;
+{$IFNDEF PS_NOWIDESTRING}
+ end;
+{$ENDIF}
+end;
+
+
+function TPSPascalCompiler.ReadInteger(const s: tbtString): PIfRVariant;
+var
+ R: {$IFNDEF PS_NOINT64}Int64;{$ELSE}Longint;{$ENDIF}
+begin
+ New(Result);
+{$IFNDEF PS_NOINT64}
+ r := StrToInt64Def(string(s), 0);
+ if (r >= Low(Integer)) and (r <= High(Integer)) then
+ begin
+ InitializeVariant(Result, at2ut(FindBaseType(bts32)));
+ Result^.ts32 := r;
+ end else if (r <= $FFFFFFFF) then
+ begin
+ InitializeVariant(Result, at2ut(FindBaseType(btu32)));
+ Result^.tu32 := r;
+ end else
+ begin
+ InitializeVariant(Result, at2ut(FindBaseType(bts64)));
+ Result^.ts64 := r;
+ end;
+{$ELSE}
+ r := StrToIntDef(s, 0);
+ InitializeVariant(Result, at2ut(FindBaseType(bts32)));
+ Result^.ts32 := r;
+{$ENDIF}
+end;
+
+function TPSPascalCompiler.ProcessSub(BlockInfo: TPSBlockInfo): Boolean;
+
+ function AllocStackReg2(MType: TPSType): TPSValue;
+ var
+ x: TPSProcVar;
+ begin
+{$IFDEF DEBUG}
+ if (mtype = nil) or (not mtype.Used) then asm int 3; end;
+{$ENDIF}
+ x := TPSProcVar.Create;
+ {$IFDEF PS_USESSUPPORT}
+ x.DeclareUnit:=fModule;
+ {$ENDIF}
+ x.DeclarePos := FParser.CurrTokenPos;
+ x.DeclareRow := FParser.Row;
+ x.DeclareCol := FParser.Col;
+ x.Name := '';
+ x.AType := MType;
+ x.Use;
+ BlockInfo.Proc.ProcVars.Add(x);
+ Result := TPSValueAllocatedStackVar.Create;
+ Result.SetParserPos(FParser);
+ TPSValueAllocatedStackVar(Result).Proc := BlockInfo.Proc;
+ with TPSValueAllocatedStackVar(Result) do
+ begin
+ LocalVarNo := proc.ProcVars.Count -1;
+ end;
+ end;
+
+ function AllocStackReg(MType: TPSType): TPSValue;
+ begin
+ Result := AllocStackReg2(MType);
+ BlockWriteByte(BlockInfo, Cm_Pt);
+ BlockWriteLong(BlockInfo, MType.FinalTypeNo);
+ end;
+
+ function AllocPointer(MDestType: TPSType): TPSValue;
+ begin
+ Result := AllocStackReg(at2ut(FindBaseType(btPointer)));
+ TPSProcVar(BlockInfo.Proc.ProcVars[TPSValueAllocatedStackVar(Result).LocalVarNo]).AType := MDestType;
+ end;
+
+ function WriteCalculation(InData, OutReg: TPSValue): Boolean; forward;
+ function PreWriteOutRec(var X: TPSValue; FArrType: TPSType): Boolean; forward;
+ function WriteOutRec(x: TPSValue; AllowData: Boolean): Boolean; forward;
+ procedure AfterWriteOutRec(var x: TPSValue); forward;
+
+ function CheckCompatType(V1, v2: TPSValue): Boolean;
+ var
+ p1, P2: TPSType;
+ begin
+ p1 := GetTypeNo(BlockInfo, V1);
+ P2 := GetTypeNo(BlockInfo, v2);
+ if (p1 = nil) or (p2 = nil) then
+ begin
+ if ((p1 <> nil) and ({$IFNDEF PS_NOINTERFACES}(p1.ClassType = TPSInterfaceType) or {$ENDIF}(p1.BaseType = btProcPtr)) and (v2.ClassType = TPSValueNil)) or
+ ((p2 <> nil) and ({$IFNDEF PS_NOINTERFACES}(p2.ClassType = TPSInterfaceType) or {$ENDIF}(p2.BaseType = btProcPtr)) and (v1.ClassType = TPSValueNil)) then
+ begin
+ Result := True;
+ exit;
+ end else
+ if ((p1 <> nil) and ({$IFNDEF PS_NOINTERFACES}(p1.ClassType = TPSInterfaceType) or {$ENDIF}(p1.ClassType = TPSClassType)) and (v2.ClassType = TPSValueNil)) or
+ ((p2 <> nil) and ({$IFNDEF PS_NOINTERFACES}(p2.ClassType = TPSInterfaceType) or {$ENDIF}(p2.ClassType = TPSClassType)) and (v1.ClassType = TPSValueNil)) then
+ begin
+ Result := True;
+ exit;
+ end else
+ if ((p1 <> nil) and ({$IFNDEF PS_NOINTERFACES}(p1.ClassType = TPSInterfaceType) or {$ENDIF}(p1.ClassType = TPSUndefinedClassType)) and (v2.ClassType = TPSValueNil)) or
+ ((p2 <> nil) and ({$IFNDEF PS_NOINTERFACES}(p2.ClassType = TPSInterfaceType) or {$ENDIF}(p2.ClassType = TPSUndefinedClassType)) and (v1.ClassType = TPSValueNil)) then
+ begin
+ Result := True;
+ exit;
+ end else
+ if (v1.ClassType = TPSValueProcPtr) and (p2 <> nil) and (p2.BaseType = btProcPtr) then
+ begin
+ Result := CheckCompatProc(p2, TPSValueProcPtr(v1).ProcPtr);
+ exit;
+ end else if (v2.ClassType = TPSValueProcPtr) and (p1 <> nil) and (p1.BaseType = btProcPtr) then
+ begin
+ Result := CheckCompatProc(p1, TPSValueProcPtr(v2).ProcPtr);
+ exit;
+ end;
+ Result := False;
+ end else
+ if (p1 <> nil) and (p1.BaseType = btSet) and (v2 is TPSValueArray) then
+ begin
+ Result := True;
+ end else
+ Result := IsCompatibleType(p1, p2, False);
+ end;
+
+ function _ProcessFunction(ProcCall: TPSValueProc; ResultRegister: TPSValue): Boolean; forward;
+ function ProcessFunction2(ProcNo: Cardinal; Par: TPSParameters; ResultReg: TPSValue): Boolean;
+ var
+ Temp: TPSValueProcNo;
+ i: Integer;
+ begin
+ Temp := TPSValueProcNo.Create;
+ Temp.Parameters := Par;
+ Temp.ProcNo := ProcNo;
+ if TObject(FProcs[ProcNo]).ClassType = TPSInternalProcedure then
+ Temp.ResultType := TPSInternalProcedure(FProcs[ProcNo]).Decl.Result
+ else
+ Temp.ResultType := TPSExternalProcedure(FProcs[ProcNo]).RegProc.Decl.Result;
+ if (Temp.ResultType <> nil) and (Temp.ResultType = FAnyString) then begin // workaround to make the result type match
+ for i := 0 to Par.Count -1 do begin
+ if Par[i].ExpectedType.BaseType in [btString, btWideString] then
+ Temp.ResultType := Par[i].ExpectedType;
+ end;
+ end;
+ Result := _ProcessFunction(Temp, ResultReg);
+ Temp.Parameters := nil;
+ Temp.Free;
+ end;
+
+ function MakeNil(NilPos, NilRow, nilCol: Cardinal;ivar: TPSValue): Boolean;
+ var
+ Procno: Cardinal;
+ PF: TPSType;
+ Par: TPSParameters;
+ begin
+ Pf := GetTypeNo(BlockInfo, IVar);
+ if not (Ivar is TPSValueVar) then
+ begin
+ with MakeError('', ecTypeMismatch, '') do
+ begin
+ FPosition := nilPos;
+ FRow := NilRow;
+ FCol := nilCol;
+ end;
+ Result := False;
+ exit;
+ end;
+ if (pf.BaseType = btProcPtr) then
+ begin
+ Result := True;
+ end else
+ if (pf.BaseType = btString) or (pf.BaseType = btPChar) then
+ begin
+ if not PreWriteOutRec(iVar, nil) then
+ begin
+ Result := false;
+ exit;
+ end;
+ BlockWriteByte(BlockInfo, CM_A);
+ WriteOutRec(ivar, False);
+ BlockWriteByte(BlockInfo, 1);
+ BlockWriteLong(BlockInfo, GetTypeNo(BlockInfo, IVar).FinalTypeNo);
+ BlockWriteLong(BlockInfo, 0); //empty tbtString
+ AfterWriteOutRec(ivar);
+ Result := True;
+ end else if (pf.BaseType = btClass) {$IFNDEF PS_NOINTERFACES}or (pf.BaseType = btInterface){$ENDIF} then
+ begin
+{$IFNDEF PS_NOINTERFACES}
+ if (pf.BaseType = btClass) then
+ begin
+{$ENDIF}
+ if not TPSClassType(pf).Cl.SetNil(ProcNo) then
+ begin
+ with MakeError('', ecTypeMismatch, '') do
+ begin
+ FPosition := nilPos;
+ FRow := NilRow;
+ FCol := nilCol;
+ end;
+ Result := False;
+ exit;
+ end;
+{$IFNDEF PS_NOINTERFACES}
+ end else
+ begin
+ if not TPSInterfaceType(pf).Intf.SetNil(ProcNo) then
+ begin
+ with MakeError('', ecTypeMismatch, '') do
+ begin
+ FPosition := nilPos;
+ FRow := NilRow;
+ FCol := nilCol;
+ end;
+ Result := False;
+ exit;
+ end;
+ end;
+{$ENDIF}
+ Par := TPSParameters.Create;
+ with par.Add do
+ begin
+ Val := IVar;
+ ExpectedType := GetTypeNo(BlockInfo, ivar);
+{$IFDEF DEBUG}
+ if not ExpectedType.Used then asm int 3; end;
+{$ENDIF}
+ ParamMode := pmInOut;
+ end;
+ Result := ProcessFunction2(ProcNo, Par, nil);
+
+ Par[0].Val := nil; // don't free IVAR
+
+ Par.Free;
+ end else if pf.BaseType = btExtClass then
+ begin
+ if not TPSUndefinedClassType(pf).ExtClass.SetNil(ProcNo) then
+ begin
+ with MakeError('', ecTypeMismatch, '') do
+ begin
+ FPosition := nilPos;
+ FRow := NilRow;
+ FCol := nilCol;
+ end;
+ Result := False;
+ exit;
+ end;
+ Par := TPSParameters.Create;
+ with par.Add do
+ begin
+ Val := IVar;
+ ExpectedType := GetTypeNo(BlockInfo, ivar);
+ ParamMode := pmInOut;
+ end;
+ Result := ProcessFunction2(ProcNo, Par, nil);
+
+ Par[0].Val := nil; // don't free IVAR
+
+ Par.Free;
+ end else begin
+ with MakeError('', ecTypeMismatch, '') do
+ begin
+ FPosition := nilPos;
+ FRow := NilRow;
+ FCol := nilCol;
+ end;
+ Result := False;
+ end;
+ end;
+ function DoBinCalc(BVal: TPSBinValueOp; Output: TPSValue): Boolean;
+ var
+ tmpp, tmpc: TPSValue;
+ jend, jover: Cardinal;
+ procno: Cardinal;
+
+ begin
+ if BVal.Operator >= otGreaterEqual then
+ begin
+ if BVal.FVal1.ClassType = TPSValueNil then
+ begin
+ tmpp := AllocStackReg(GetTypeNo(BlockInfo, BVal.FVal2));
+ if not MakeNil(BVal.FVal1.Pos, BVal.FVal1.Row, BVal.FVal1.Col, tmpp) then
+ begin
+ tmpp.Free;
+ Result := False;
+ exit;
+ end;
+ tmpc := TPSValueReplace.Create;
+ with TPSValueReplace(tmpc) do
+ begin
+ OldValue := BVal.FVal1;
+ NewValue := tmpp;
+ end;
+ BVal.FVal1 := tmpc;
+ end;
+ if BVal.FVal2.ClassType = TPSValueNil then
+ begin
+ tmpp := AllocStackReg(GetTypeNo(BlockInfo, BVal.FVal1));
+ if not MakeNil(BVal.FVal2.Pos, BVal.FVal2.Row, BVal.FVal2.Col, tmpp) then
+ begin
+ tmpp.Free;;
+ Result := False;
+ exit;
+ end;
+ tmpc := TPSValueReplace.Create;
+ with TPSValueReplace(tmpc) do
+ begin
+ OldValue := BVal.FVal2;
+ NewValue := tmpp;
+ end;
+ BVal.FVal2 := tmpc;
+ end;
+ if GetTypeNo(BlockInfo, BVal.FVal1).BaseType = btExtClass then
+ begin
+ if not TPSUndefinedClassType(GetTypeNo(BlockInfo, BVal.FVal1)).ExtClass.CompareClass(GetTypeNo(BlockInfo, Bval.FVal2), ProcNo) then
+ begin
+ Result := False;
+ exit;
+ end;
+ tmpp := TPSValueProcNo.Create;
+ with TPSValueProcNo(tmpp) do
+ begin
+ ResultType := at2ut(FDefaultBoolType);
+ Parameters := TPSParameters.Create;
+ ProcNo := procno;
+ Pos := BVal.Pos;
+ Col := BVal.Col;
+ Row := BVal.Row;
+ with parameters.Add do
+ begin
+ Val := BVal.FVal1;
+ ExpectedType := GetTypeNo(BlockInfo, Val);
+ end;
+ with parameters.Add do
+ begin
+ Val := BVal.FVal2;
+ ExpectedType := GetTypeNo(BlockInfo, Val);
+ end;
+ end;
+ if Bval.Operator = otNotEqual then
+ begin
+ tmpc := TPSUnValueOp.Create;
+ TPSUnValueOp(tmpc).Operator := otNot;
+ TPSUnValueOp(tmpc).Val1 := tmpp;
+ TPSUnValueOp(tmpc).aType := GetTypeNo(BlockInfo, tmpp);
+ end else tmpc := tmpp;
+ Result := WriteCalculation(tmpc, Output);
+ with TPSValueProcNo(tmpp) do
+ begin
+ Parameters[0].Val := nil;
+ Parameters[1].Val := nil;
+ end;
+ tmpc.Free;
+ if BVal.Val1.ClassType = TPSValueReplace then
+ begin
+ tmpp := TPSValueReplace(BVal.Val1).OldValue;
+ BVal.Val1.Free;
+ BVal.Val1 := tmpp;
+ end;
+ if BVal.Val2.ClassType = TPSValueReplace then
+ begin
+ tmpp := TPSValueReplace(BVal.Val2).OldValue;
+ BVal.Val2.Free;
+ BVal.Val2 := tmpp;
+ end;
+ exit;
+ end;
+ if not (PreWriteOutRec(Output, nil) and PreWriteOutRec(BVal.FVal1, GetTypeNo(BlockInfo, BVal.FVal2)) and PreWriteOutRec(BVal.FVal2, GetTypeNo(BlockInfo, BVal.FVal1))) then
+ begin
+ Result := False;
+ exit;
+ end;
+ BlockWriteByte(BlockInfo, CM_CO);
+ case BVal.Operator of
+ otGreaterEqual: BlockWriteByte(BlockInfo, 0);
+ otLessEqual: BlockWriteByte(BlockInfo, 1);
+ otGreater: BlockWriteByte(BlockInfo, 2);
+ otLess: BlockWriteByte(BlockInfo, 3);
+ otEqual: BlockWriteByte(BlockInfo, 5);
+ otNotEqual: BlockWriteByte(BlockInfo, 4);
+ otIn: BlockWriteByte(BlockInfo, 6);
+ otIs: BlockWriteByte(BlockInfo, 7);
+ end;
+
+ if not (WriteOutRec(Output, False) and writeOutRec(BVal.FVal1, True) and writeOutRec(BVal.FVal2, True)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ AfterWriteOutrec(BVal.FVal1);
+ AfterWriteOutrec(BVal.FVal2);
+ AfterWriteOutrec(Output);
+ if BVal.Val1.ClassType = TPSValueReplace then
+ begin
+ tmpp := TPSValueReplace(BVal.Val1).OldValue;
+ BVal.Val1.Free;
+ BVal.Val1 := tmpp;
+ end;
+ if BVal.Val2.ClassType = TPSValueReplace then
+ begin
+ tmpp := TPSValueReplace(BVal.Val2).OldValue;
+ BVal.Val2.Free;
+ BVal.Val2 := tmpp;
+ end;
+ end else begin
+ if not PreWriteOutRec(Output, nil) then
+ begin
+ Result := False;
+ exit;
+ end;
+ if not SameReg(Output, BVal.Val1) then
+ begin
+ if not WriteCalculation(BVal.FVal1, Output) then
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ if (FBooleanShortCircuit) and (IsBoolean(BVal.aType)) then
+ begin
+ if BVal.Operator = otAnd then
+ begin
+ BlockWriteByte(BlockInfo, Cm_CNG);
+ jover := Length(BlockInfo.Proc.FData);
+ BlockWriteLong(BlockInfo, 0);
+ WriteOutRec(Output, True);
+ jend := Length(BlockInfo.Proc.FData);
+ end else if BVal.Operator = otOr then
+ begin
+ BlockWriteByte(BlockInfo, Cm_CG);
+ jover := Length(BlockInfo.Proc.FData);
+ BlockWriteLong(BlockInfo, 0);
+ WriteOutRec(Output, True);
+ jend := Length(BlockInfo.Proc.FData);
+ end else
+ begin
+ jover := 0;
+ jend := 0;
+ end;
+ end else
+ begin
+ jover := 0;
+ jend := 0;
+ end;
+ if not PreWriteOutrec(BVal.FVal2, GetTypeNo(BlockInfo, Output)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ BlockWriteByte(BlockInfo, Cm_CA);
+ BlockWriteByte(BlockInfo, Ord(BVal.Operator));
+ if not (WriteOutRec(Output, False) and WriteOutRec(BVal.FVal2, True)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ AfterWriteOutRec(BVal.FVal2);
+ if FBooleanShortCircuit and (IsBoolean(BVal.aType)) and (JOver <> JEnd) then
+ begin
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Cardinal((@BlockInfo.Proc.FData[jover+1])^)) := Cardinal(Length(BlockInfo.Proc.FData)) - jend;
+ {$else}
+ Cardinal((@BlockInfo.Proc.FData[jover+1])^) := Cardinal(Length(BlockInfo.Proc.FData)) - jend;
+ {$endif}
+ end;
+ AfterWriteOutRec(Output);
+ end;
+ Result := True;
+ end;
+
+ function DoUnCalc(Val: TPSUnValueOp; Output: TPSValue): Boolean;
+ var
+ Tmp: TPSValue;
+ begin
+ if not PreWriteOutRec(Output, nil) then
+ begin
+ Result := False;
+ exit;
+ end;
+ case Val.Operator of
+ otNot:
+ begin
+ if not SameReg(Val.FVal1, Output) then
+ begin
+ if not WriteCalculation(Val.FVal1, Output) then
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ if IsBoolean(GetTypeNo(BlockInfo, Val)) then
+ BlockWriteByte(BlockInfo, cm_bn)
+ else
+ BlockWriteByte(BlockInfo, cm_in);
+ if not WriteOutRec(Output, True) then
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ otMinus:
+ begin
+ if not SameReg(Val.FVal1, Output) then
+ begin
+ if not WriteCalculation(Val.FVal1, Output) then
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ BlockWriteByte(BlockInfo, cm_vm);
+ if not WriteOutRec(Output, True) then
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ otCast:
+ begin
+ if ((Val.aType.BaseType = btChar) and (Val.aType.BaseType <> btU8)) {$IFNDEF PS_NOWIDESTRING}or
+ ((Val.aType.BaseType = btWideChar) and (Val.aType.BaseType <> btU16)){$ENDIF} then
+ begin
+ Tmp := AllocStackReg(Val.aType);
+ end else
+ Tmp := Output;
+ if not (PreWriteOutRec(Val.FVal1, GetTypeNo(BlockInfo, Tmp)) and PreWriteOutRec(Tmp, GetTypeNo(BlockInfo, Tmp))) then
+ begin
+ Result := False;
+ if tmp <> Output then Tmp.Free;
+ exit;
+ end;
+ BlockWriteByte(BlockInfo, CM_A);
+ if not (WriteOutRec(Tmp, False) and WriteOutRec(Val.FVal1, True)) then
+ begin
+ Result := false;
+ if tmp <> Output then Tmp.Free;
+ exit;
+ end;
+ AfterWriteOutRec(val.Fval1);
+ if Tmp <> Output then
+ begin
+ if not WriteCalculation(Tmp, Output) then
+ begin
+ Result := false;
+ Tmp.Free;
+ exit;
+ end;
+ end;
+ AfterWriteOutRec(Tmp);
+ if Tmp <> Output then
+ Tmp.Free;
+ end;
+ {else donothing}
+ end;
+ AfterWriteOutRec(Output);
+ Result := True;
+ end;
+
+
+ function GetAddress(Val: TPSValue): Cardinal;
+ begin
+ if Val.ClassType = TPSValueGlobalVar then
+ Result := TPSValueGlobalVar(val).GlobalVarNo
+ else if Val.ClassType = TPSValueLocalVar then
+ Result := PSAddrStackStart + TPSValueLocalVar(val).LocalVarNo + 1
+ else if Val.ClassType = TPSValueParamVar then
+ Result := PSAddrStackStart - TPSValueParamVar(val).ParamNo -1
+ else if Val.ClassType = TPSValueAllocatedStackVar then
+ Result := PSAddrStackStart + TPSValueAllocatedStackVar(val).LocalVarNo + 1
+ else
+ Result := InvalidVal;
+ end;
+
+
+ function PreWriteOutRec(var X: TPSValue; FArrType: TPSType): Boolean;
+ var
+ rr: TPSSubItem;
+ tmpp,
+ tmpc: TPSValue;
+ i: Longint;
+ function MakeSet(SetType: TPSSetType; arr: TPSValueArray): Boolean;
+ var
+ c, i: Longint;
+ dataval: TPSValueData;
+ mType: TPSType;
+ begin
+ Result := True;
+ dataval := TPSValueData.Create;
+ dataval.Data := NewVariant(FarrType);
+ for i := 0 to arr.count -1 do
+ begin
+ mType := GetTypeNo(BlockInfo, arr.Item[i]);
+ if mType <> SetType.SetType then
+ begin
+ with MakeError('', ecTypeMismatch, '') do
+ begin
+ FCol := arr.item[i].Col;
+ FRow := arr.item[i].Row;
+ FPosition := arr.item[i].Pos;
+ end;
+ DataVal.Free;
+ Result := False;
+ exit;
+ end;
+ if arr.Item[i] is TPSValueData then
+ begin
+ c := GetInt(TPSValueData(arr.Item[i]).Data, Result);
+ if not Result then
+ begin
+ dataval.Free;
+ exit;
+ end;
+ Set_MakeMember(c, dataval.Data.tstring);
+ end else
+ begin
+ DataVal.Free;
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ exit;
+ end;
+ end;
+ tmpc := TPSValueReplace.Create;
+ with TPSValueReplace(tmpc) do
+ begin
+ OldValue := x;
+ NewValue := dataval;
+ PreWriteAllocated := True;
+ end;
+ x := tmpc;
+ end;
+ begin
+ Result := True;
+ if x.ClassType = TPSValueReplace then
+ begin
+ if TPSValueReplace(x).PreWriteAllocated then
+ begin
+ inc(TPSValueReplace(x).FReplaceTimes);
+ end;
+ end else
+ if x.ClassType = TPSValueProcPtr then
+ begin
+ if FArrType = nil then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ Exit;
+ end;
+ tmpp := TPSValueData.Create;
+ TPSValueData(tmpp).Data := NewVariant(FArrType);
+ TPSValueData(tmpp).Data.tu32 := TPSValueProcPtr(x).ProcPtr;
+ tmpc := TPSValueReplace.Create;
+ with TPSValueReplace(tmpc) do
+ begin
+ PreWriteAllocated := True;
+ OldValue := x;
+ NewValue := tmpp;
+ end;
+ x := tmpc;
+ end else
+ if x.ClassType = TPSValueNil then
+ begin
+ if FArrType = nil then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ Exit;
+ end;
+ tmpp := AllocStackReg(FArrType);
+ if not MakeNil(x.Pos, x.Row, x.Col, tmpp) then
+ begin
+ tmpp.Free;
+ Result := False;
+ exit;
+ end;
+ tmpc := TPSValueReplace.Create;
+ with TPSValueReplace(tmpc) do
+ begin
+ PreWriteAllocated := True;
+ OldValue := x;
+ NewValue := tmpp;
+ end;
+ x := tmpc;
+ end else
+ if x.ClassType = TPSValueArray then
+ begin
+ if FArrType = nil then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ Exit;
+ end;
+ if TPSType(FArrType).BaseType = btSet then
+ begin
+ Result := MakeSet(TPSSetType(FArrType), TPSValueArray(x));
+ exit;
+ end;
+ if TPSType(FarrType).BaseType = btVariant then
+ FArrType := FindAndAddType(self, '', 'array of variant');
+ if TPSType(FarrType).BaseType <> btArray then
+ FArrType := FindAndAddType(self, '', 'array of variant');
+
+ tmpp := AllocStackReg(FArrType);
+ tmpc := AllocStackReg(FindBaseType(bts32));
+ BlockWriteByte(BlockInfo, CM_A);
+ WriteOutrec(tmpc, False);
+ BlockWriteByte(BlockInfo, 1);
+ BlockWriteLong(BlockInfo, FindBaseType(bts32).FinalTypeNo);
+ BlockWriteLong(BlockInfo, TPSValueArray(x).Count);
+ BlockWriteByte(BlockInfo, CM_PV);
+ WriteOutrec(tmpp, False);
+ BlockWriteByte(BlockInfo, CM_C);
+ BlockWriteLong(BlockInfo, FindProc('SETARRAYLENGTH'));
+ BlockWriteByte(BlockInfo, CM_PO);
+ tmpc.Free;
+ rr := TPSSubNumber.Create;
+ rr.aType := TPSArrayType(FArrType).ArrayTypeNo;
+ TPSValueVar(tmpp).RecAdd(rr);
+ for i := 0 to TPSValueArray(x).Count -1 do
+ begin
+ TPSSubNumber(rr).SubNo := i;
+ tmpc := TPSValueArray(x).Item[i];
+ if not PreWriteOutRec(tmpc, GetTypeNo(BlockInfo, tmpc)) then
+ begin
+ tmpp.Free;
+ Result := false;
+ exit;
+ end;
+ if TPSArrayType(FArrType).ArrayTypeNo.BaseType = btPointer then
+ BlockWriteByte(BlockInfo, cm_spc)
+ else
+ BlockWriteByte(BlockInfo, cm_a);
+ if not (WriteOutrec(tmpp, False) and WriteOutRec(tmpc, True)) then
+ begin
+ Tmpp.Free;
+ Result := false;
+ exit;
+ end;
+ AfterWriteOutRec(tmpc);
+ end;
+ TPSValueVar(tmpp).RecDelete(0);
+ tmpc := TPSValueReplace.Create;
+ with TPSValueReplace(tmpc) do
+ begin
+ PreWriteAllocated := True;
+ OldValue := x;
+ NewValue := tmpp;
+ end;
+ x := tmpc;
+ end else if (x.ClassType = TPSUnValueOp) then
+ begin
+ tmpp := AllocStackReg(GetTypeNo(BlockInfo, x));
+ if not DoUnCalc(TPSUnValueOp(x), tmpp) then
+ begin
+ Result := False;
+ exit;
+ end;
+ tmpc := TPSValueReplace.Create;
+ with TPSValueReplace(tmpc) do
+ begin
+ PreWriteAllocated := True;
+ OldValue := x;
+ NewValue := tmpp;
+ end;
+ x := tmpc;
+ end else if (x.ClassType = TPSBinValueOp) then
+ begin
+ tmpp := AllocStackReg(GetTypeNo(BlockInfo, x));
+ if not DoBinCalc(TPSBinValueOp(x), tmpp) then
+ begin
+ tmpp.Free;
+ Result := False;
+ exit;
+ end;
+ tmpc := TPSValueReplace.Create;
+ with TPSValueReplace(tmpc) do
+ begin
+ PreWriteAllocated := True;
+ OldValue := x;
+ NewValue := tmpp;
+ end;
+ x := tmpc;
+ end else if x is TPSValueProc then
+ begin
+ tmpp := AllocStackReg(TPSValueProc(x).ResultType);
+ if not WriteCalculation(x, tmpp) then
+ begin
+ tmpp.Free;
+ Result := False;
+ exit;
+ end;
+ tmpc := TPSValueReplace.Create;
+ with TPSValueReplace(tmpc) do
+ begin
+ PreWriteAllocated := True;
+ OldValue := x;
+ NewValue := tmpp;
+ end;
+ x := tmpc;
+ end else if (x is TPSValueVar) and (TPSValueVar(x).RecCount <> 0) then
+ begin
+ if TPSValueVar(x).RecCount = 1 then
+ begin
+ rr := TPSValueVar(x).RecItem[0];
+ if rr.ClassType <> TPSSubValue then
+ exit; // there is no need pre-calculate anything
+ if (TPSSubValue(rr).SubNo is TPSValueVar) and (TPSValueVar(TPSSubValue(rr).SubNo).RecCount = 0) then
+ exit;
+ end; //if
+ tmpp := AllocPointer(GetTypeNo(BlockInfo, x));
+ BlockWriteByte(BlockInfo, cm_sp);
+ WriteOutRec(tmpp, True);
+ BlockWriteByte(BlockInfo, 0);
+ BlockWriteLong(BlockInfo, GetAddress(x));
+ for i := 0 to TPSValueVar(x).RecCount - 1 do
+ begin
+ rr := TPSValueVar(x).RecItem[I];
+ if rr.ClassType = TPSSubNumber then
+ begin
+ BlockWriteByte(BlockInfo, cm_sp);
+ WriteOutRec(tmpp, false);
+ BlockWriteByte(BlockInfo, 2);
+ BlockWriteLong(BlockInfo, GetAddress(tmpp));
+ BlockWriteLong(BlockInfo, TPSSubNumber(rr).SubNo);
+ end else begin // if rr.classtype = TPSSubValue then begin
+ tmpc := AllocStackReg(FindBaseType(btU32));
+ if not WriteCalculation(TPSSubValue(rr).SubNo, tmpc) then
+ begin
+ tmpc.Free;
+ tmpp.Free;
+ Result := False;
+ exit;
+ end; //if
+ BlockWriteByte(BlockInfo, cm_sp);
+ WriteOutRec(tmpp, false);
+ BlockWriteByte(BlockInfo, 3);
+ BlockWriteLong(BlockInfo, GetAddress(tmpp));
+ BlockWriteLong(BlockInfo, GetAddress(tmpc));
+ tmpc.Free;
+ end;
+ end; // for
+ tmpc := TPSValueReplace.Create;
+ with TPSValueReplace(tmpc) do
+ begin
+ OldValue := x;
+ NewValue := tmpp;
+ PreWriteAllocated := True;
+ end;
+ x := tmpc;
+ end;
+
+ end;
+
+ procedure AfterWriteOutRec(var x: TPSValue);
+ var
+ tmp: TPSValue;
+ begin
+ if (x.ClassType = TPSValueReplace) and (TPSValueReplace(x).PreWriteAllocated) then
+ begin
+ Dec(TPSValueReplace(x).FReplaceTimes);
+ if TPSValueReplace(x).ReplaceTimes = 0 then
+ begin
+ tmp := TPSValueReplace(x).OldValue;
+ x.Free;
+ x := tmp;
+ end;
+ end;
+ end; //afterwriteoutrec
+
+ function WriteOutRec(x: TPSValue; AllowData: Boolean): Boolean;
+ var
+ rr: TPSSubItem;
+ begin
+ Result := True;
+ if x.ClassType = TPSValueReplace then
+ Result := WriteOutRec(TPSValueReplace(x).NewValue, AllowData)
+ else if x is TPSValueVar then
+ begin
+ if TPSValueVar(x).RecCount = 0 then
+ begin
+ BlockWriteByte(BlockInfo, 0);
+ BlockWriteLong(BlockInfo, GetAddress(x));
+ end
+ else
+ begin
+ rr := TPSValueVar(x).RecItem[0];
+ if rr.ClassType = TPSSubNumber then
+ begin
+ BlockWriteByte(BlockInfo, 2);
+ BlockWriteLong(BlockInfo, GetAddress(x));
+ BlockWriteLong(BlockInfo, TPSSubNumber(rr).SubNo);
+ end
+ else
+ begin
+ BlockWriteByte(BlockInfo, 3);
+ BlockWriteLong(BlockInfo, GetAddress(x));
+ BlockWriteLong(BlockInfo, GetAddress(TPSSubValue(rr).SubNo));
+ end;
+ end;
+ end else if x.ClassType = TPSValueData then
+ begin
+ if AllowData then
+ begin
+ BlockWriteByte(BlockInfo, 1);
+ BlockWriteVariant(BlockInfo, TPSValueData(x).Data)
+ end
+ else
+ begin
+ Result := False;
+ exit;
+ end;
+ end else
+ Result := False;
+ end;
+
+ function ReadParameters(IsProperty: Boolean; Dest: TPSParameters): Boolean; forward;
+{$IFNDEF PS_NOIDISPATCH}
+ function ReadIDispatchParameters(const ProcName: tbtString; aVariantType: TPSVariantType; FSelf: TPSValue): TPSValue; forward;
+{$ENDIF}
+ function ReadProcParameters(ProcNo: Cardinal; FSelf: TPSValue): TPSValue; forward;
+ function ReadVarParameters(ProcNoVar: TPSValue): TPSValue; forward;
+
+ function calc(endOn: TPSPasToken): TPSValue; forward;
+ procedure CheckNotificationVariant(var Val: TPSValue);
+ var
+ aType: TPSType;
+ Call: TPSValueProcNo;
+ tmp: TPSValue;
+ begin
+ if not (Val is TPSValueGlobalVar) then exit;
+ aType := GetTypeNo(BlockInfo, Val);
+ if (AType = nil) or (AType.BaseType <> btNotificationVariant) then exit;
+ if FParser.CurrTokenId = CSTI_Assignment then
+ begin
+ Call := TPSValueProcNo.Create;
+ Call.ResultType := nil;
+ Call.SetParserPos(FParser);
+ Call.ProcNo := FindProc('!NOTIFICATIONVARIANTSET');;
+ Call.SetParserPos(FParser);
+ Call.Parameters := TPSParameters.Create;
+ Tmp := TPSValueData.Create;
+ TPSVAlueData(tmp).Data := NewVariant(at2ut(FindBaseType(btString)));
+ tbtString(TPSValueData(tmp).Data.tstring) := TPSVar(FVars[TPSValueGlobalVar(Val).GlobalVarNo]).OrgName;
+ with call.Parameters.Add do
+ begin
+ Val := tmp;
+ ExpectedType := TPSValueData(tmp).Data.FType;
+ end;
+ FParser.Next;
+ tmp := Calc(CSTI_SemiColon);
+ if tmp = nil then
+ begin
+ Val.Free;
+ Val := nil;
+ exit;
+ end;
+ with Call.Parameters.Add do
+ begin
+ Val := tmp;
+ ExpectedType := at2ut(FindBaseType(btVariant));
+ end;
+ Val.Free;
+ Val := Call;
+ end else begin
+ Call := TPSValueProcNo.Create;
+ Call.ResultType := AT2UT(FindBaseType(btVariant));
+ Call.SetParserPos(FParser);
+ Call.ProcNo := FindProc('!NOTIFICATIONVARIANTGET');
+ Call.SetParserPos(FParser);
+ Call.Parameters := TPSParameters.Create;
+ Tmp := TPSValueData.Create;
+ TPSVAlueData(tmp).Data := NewVariant(at2ut(FindBaseType(btString)));
+ tbtString(TPSValueData(tmp).Data.tstring) := TPSVar(FVars[TPSValueGlobalVar(Val).GlobalVarNo]).OrgName;
+ with call.Parameters.Add do
+ begin
+ Val := tmp;
+ ExpectedType := TPSValueData(tmp).Data.FType;
+ end;
+ Val.Free;
+ Val := Call;
+ end;
+ end;
+
+
+ function GetIdentifier(const FType: Byte): TPSValue;
+ {
+ FType:
+ 0 = Anything
+ 1 = Only variables
+ 2 = Not constants
+ }
+
+ procedure CheckProcCall(var x: TPSValue);
+ var
+ aType: TPSType;
+ begin
+ if FParser.CurrTokenId in [CSTI_Dereference, CSTI_OpenRound] then
+ begin
+ aType := GetTypeNo(BlockInfo, x);
+ if (aType = nil) or (aType.BaseType <> btProcPtr) then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ x.Free;
+ x := nil;
+ Exit;
+ end;
+ if FParser.CurrTokenId = CSTI_Dereference then
+ FParser.Next;
+ x := ReadVarParameters(x);
+ end;
+ end;
+
+ procedure CheckFurther(var x: TPSValue; ImplicitPeriod: Boolean);
+ var
+ t: Cardinal;
+ rr: TPSSubItem;
+ L: Longint;
+ u: TPSType;
+ Param: TPSParameter;
+ tmp, tmpn: TPSValue;
+ tmp3: TPSValueProcNo;
+ tmp2: Boolean;
+
+ function FindSubR(const n: tbtString; FType: TPSType): Cardinal;
+ var
+ h, I: Longint;
+ rvv: PIFPSRecordFieldTypeDef;
+ begin
+ h := MakeHash(n);
+ for I := 0 to TPSRecordType(FType).RecValCount - 1 do
+ begin
+ rvv := TPSRecordType(FType).RecVal(I);
+ if (rvv.FieldNameHash = h) and (rvv.FieldName = n) then
+ begin
+ Result := I;
+ exit;
+ end;
+ end;
+ Result := InvalidVal;
+ end;
+
+ begin
+(* if not (x is TPSValueVar) then
+ Exit;*)
+ u := GetTypeNo(BlockInfo, x);
+ if u = nil then exit;
+ while True do
+ begin
+ if (u.BaseType = btClass) {$IFNDEF PS_NOINTERFACES}or (u.BaseType = btInterface){$ENDIF}
+ {$IFNDEF PS_NOIDISPATCH}or ((u.BaseType = btVariant) or (u.BaseType = btNotificationVariant)){$ENDIF} or (u.BaseType = btExtClass) then exit;
+ if FParser.CurrTokenId = CSTI_OpenBlock then
+ begin
+ if (u.BaseType = btString) {$IFNDEF PS_NOWIDESTRING} or (u.BaseType = btWideString) or (u.BaseType = btUnicodeString) {$ENDIF} then
+ begin
+ FParser.Next;
+ tmp := Calc(CSTI_CloseBlock);
+ if tmp = nil then
+ begin
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ if not IsIntType(GetTypeNo(BlockInfo, tmp).BaseType) then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ tmp.Free;
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ FParser.Next;
+ if FParser.CurrTokenId = CSTI_Assignment then
+ begin
+ if not (x is TPSValueVar) then begin
+ MakeError('', ecVariableExpected, '');
+ tmp.Free;
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ {$IFNDEF PS_NOWIDESTRING}
+ if (u.BaseType = btWideString) or (u.BaseType = btUnicodeString) then
+ l := FindProc('WSTRSET')
+ else
+ {$ENDIF}
+ l := FindProc('STRSET');
+ if l = -1 then
+ begin
+ MakeError('', ecUnknownIdentifier, 'StrSet');
+ tmp.Free;
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ tmp3 := TPSValueProcNo.Create;
+ tmp3.ResultType := nil;
+ tmp3.SetParserPos(FParser);
+ tmp3.ProcNo := L;
+ tmp3.SetParserPos(FParser);
+ tmp3.Parameters := TPSParameters.Create;
+ param := tmp3.Parameters.Add;
+ with tmp3.Parameters.Add do
+ begin
+ Val := tmp;
+ ExpectedType := GetTypeNo(BlockInfo, tmp);
+{$IFDEF DEBUG}
+ if not ExpectedType.Used then asm int 3; end;
+{$ENDIF}
+ end;
+ with tmp3.Parameters.Add do
+ begin
+ Val := x;
+ ExpectedType := GetTypeNo(BlockInfo, x);
+{$IFDEF DEBUG}
+ if not ExpectedType.Used then asm int 3; end;
+{$ENDIF}
+ ParamMode := pmInOut;
+ end;
+ x := tmp3;
+ FParser.Next;
+ tmp := Calc(CSTI_SemiColon);
+ if tmp = nil then
+ begin
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ if (GetTypeNo(BlockInfo, Tmp).BaseType <> btChar)
+ {$IFNDEF PS_NOWIDESTRING} and (GetTypeno(BlockInfo, Tmp).BaseType <> btWideChar) {$ENDIF} then
+ begin
+ x.Free;
+ x := nil;
+ Tmp.Free;
+ MakeError('', ecTypeMismatch, '');
+ exit;
+
+ end;
+ param.Val := tmp;
+ Param.ExpectedType := GetTypeNo(BlockInfo, tmp);
+{$IFDEF DEBUG}
+ if not Param.ExpectedType.Used then asm int 3; end;
+{$ENDIF}
+ end else begin
+ {$IFNDEF PS_NOWIDESTRING}
+ if (u.BaseType = btWideString) or (u.BaseType = btUnicodeString) then
+ l := FindProc('WSTRGET')
+ else
+ {$ENDIF}
+ l := FindProc('STRGET');
+ if l = -1 then
+ begin
+ MakeError('', ecUnknownIdentifier, 'StrGet');
+ tmp.Free;
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ tmp3 := TPSValueProcNo.Create;
+ {$IFNDEF PS_NOWIDESTRING}
+ if (u.BaseType = btWideString) or (u.BaseType = btUnicodeString) then
+ tmp3.ResultType := FindBaseType(btWideChar)
+ else
+ {$ENDIF}
+ tmp3.ResultType := FindBaseType(btChar);
+ tmp3.ProcNo := L;
+ tmp3.SetParserPos(FParser);
+ tmp3.Parameters := TPSParameters.Create;
+ with tmp3.Parameters.Add do
+ begin
+ Val := x;
+ ExpectedType := GetTypeNo(BlockInfo, x);
+{$IFDEF DEBUG}
+ if not ExpectedType.Used then asm int 3; end;
+{$ENDIF}
+
+ if x is TPSValueVar then
+ ParamMode := pmInOut
+ else
+ parammode := pmIn;
+ end;
+ with tmp3.Parameters.Add do
+ begin
+ Val := tmp;
+ ExpectedType := GetTypeNo(BlockInfo, tmp);
+{$IFDEF DEBUG}
+ if not ExpectedType.Used then asm int 3; end;
+{$ENDIF}
+ end;
+ x := tmp3;
+ end;
+ Break;
+ end else if ((u.BaseType = btArray) or (u.BaseType = btStaticArray)) and (x is TPSValueVar) then
+ begin
+ FParser.Next;
+ tmp := calc(CSTI_CloseBlock);
+ if tmp = nil then
+ begin
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ if not IsIntType(GetTypeNo(BlockInfo, tmp).BaseType) then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ tmp.Free;
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ if (tmp.ClassType = TPSValueData) then
+ begin
+ rr := TPSSubNumber.Create;
+ TPSValueVar(x).RecAdd(rr);
+ if (u.BaseType = btStaticArray) then
+ TPSSubNumber(rr).SubNo := Cardinal(GetInt(TPSValueData(tmp).Data, tmp2) - TPSStaticArrayType(u).StartOffset)
+ else
+ TPSSubNumber(rr).SubNo := GetUInt(TPSValueData(tmp).Data, tmp2);
+ tmp.Free;
+ rr.aType := TPSArrayType(u).ArrayTypeNo;
+ u := rr.aType;
+ end
+ else
+ begin
+ if (u.BaseType = btStaticArray) then
+ begin
+ tmpn := TPSBinValueOp.Create;
+ TPSBinValueOp(tmpn).Operator := otSub;
+ TPSBinValueOp(tmpn).Val1 := tmp;
+ tmp := TPSValueData.Create;
+ TPSValueData(tmp).Data := NewVariant(FindBaseType(btS32));
+ TPSValueData(tmp).Data.ts32 := TPSStaticArrayType(u).StartOffset;
+ TPSBinValueOp(tmpn).Val2 := tmp;
+ TPSBinValueOp(tmpn).aType := FindBaseType(btS32);
+ tmp := tmpn;
+ end;
+ rr := TPSSubValue.Create;
+ TPSValueVar(x).recAdd(rr);
+ TPSSubValue(rr).SubNo := tmp;
+ rr.aType := TPSArrayType(u).ArrayTypeNo;
+ u := rr.aType;
+ end;
+ if FParser.CurrTokenId <> CSTI_CloseBlock then
+ begin
+ MakeError('', ecCloseBlockExpected, '');
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ Fparser.Next;
+ end else begin
+ MakeError('', ecSemicolonExpected, '');
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ end
+ else if (FParser.CurrTokenId = CSTI_Period) or (ImplicitPeriod) then
+ begin
+ if not ImplicitPeriod then
+ FParser.Next;
+ if u.BaseType = btRecord then
+ begin
+ t := FindSubR(FParser.GetToken, u);
+ if t = InvalidVal then
+ begin
+ if ImplicitPeriod then exit;
+ MakeError('', ecUnknownIdentifier, FParser.GetToken);
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ if (x is TPSValueProcNo) then
+ begin
+ ImplicitPeriod := False;
+ FParser.Next;
+
+ tmp := AllocStackReg(u);
+ WriteCalculation(x,tmp);
+ TPSVar(BlockInfo.Proc.FProcVars[TPSValueAllocatedStackVar(tmp).LocalVarNo]).Use;
+
+ rr := TPSSubNumber.Create;
+ TPSValueVar(tmp).RecAdd(rr);
+ TPSSubNumber(rr).SubNo := t;
+ rr.aType := TPSRecordType(u).RecVal(t).FType;
+ u := rr.aType;
+
+ tmpn := TPSValueReplace.Create;
+ with TPSValueReplace(tmpn) do
+ begin
+ FreeOldValue := true;
+ FreeNewValue := true;
+ OldValue := tmp;
+ NewValue := AllocStackReg(u);
+ PreWriteAllocated := true;
+ end;
+
+ if not WriteCalculation(tmp,TPSValueReplace(tmpn).NewValue) then
+ begin
+ {MakeError('',ecInternalError,'');}
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ x.Free;
+ x := tmpn;
+ end else
+ begin
+ if not (x is TPSValueVar) then begin
+ MakeError('', ecVariableExpected, FParser.GetToken);
+ x.Free;
+ x := nil;
+ exit;
+ end;
+ ImplicitPeriod := False;
+ FParser.Next;
+ rr := TPSSubNumber.Create;
+ TPSValueVar(x).RecAdd(rr);
+ TPSSubNumber(rr).SubNo := t;
+ rr.aType := TPSRecordType(u).RecVal(t).FType;
+ u := rr.aType;
+ end;
+ end
+ else
+ begin
+ x.Free;
+ MakeError('', ecSemicolonExpected, '');
+ x := nil;
+ exit;
+ end;
+ end
+ else
+ break;
+ end;
+ end;
+
+
+
+ procedure CheckClassArrayProperty(var P: TPSValue; const VarType: TPSVariableType; VarNo: Cardinal);
+ var
+ Tempp: TPSValue;
+ aType: TPSClassType;
+ procno: Cardinal;
+ Idx: IPointer;
+ Decl: TPSParametersDecl;
+ begin
+ if p = nil then exit;
+ if (GetTypeNo(BlockInfo, p) = nil) or (GetTypeNo(BlockInfo, p).BaseType <> btClass) then exit;
+ aType := TPSClassType(GetTypeNo(BlockInfo, p));
+ if FParser.CurrTokenID = CSTI_OpenBlock then
+ begin
+ if not TPSClassType(aType).Cl.Property_Find('', Idx) then
+ begin
+ MakeError('', ecPeriodExpected, '');
+ p.Free;
+ p := nil;
+ exit;
+ end;
+ if VarNo <> InvalidVal then
+ begin
+ if @FOnUseVariable <> nil then
+ FOnUseVariable(Self, VarType, VarNo, BlockInfo.ProcNo, FParser.CurrTokenPos, '[Default]');
+ end;
+ Decl := TPSParametersDecl.Create;
+ TPSClassType(aType).Cl.Property_GetHeader(Idx, Decl);
+ tempp := p;
+ P := TPSValueProcNo.Create;
+ with TPSValueProcNo(P) do
+ begin
+ Parameters := TPSParameters.Create;
+ Parameters.Add;
+ end;
+ if not (ReadParameters(True, TPSValueProc(P).Parameters) and
+ ValidateParameters(BlockInfo, TPSValueProc(P).Parameters, Decl)) then
+ begin
+ tempp.Free;
+ Decl.Free;
+ p.Free;
+ p := nil;
+ exit;
+ end;
+ with TPSValueProcNo(p).Parameters[0] do
+ begin
+ Val := tempp;
+ ExpectedType := GetTypeNo(BlockInfo, tempp);
+ end;
+ if FParser.CurrTokenId = CSTI_Assignment then
+ begin
+ FParser.Next;
+ TempP := Calc(CSTI_SemiColon);
+ if TempP = nil then
+ begin
+ Decl.Free;
+ P.Free;
+ p := nil;
+ exit;
+ end;
+ with TPSValueProc(p).Parameters.Add do
+ begin
+ Val := Tempp;
+ ExpectedType := at2ut(Decl.Result);
+ end;
+ if not TPSClassType(aType).Cl.Property_Set(Idx, procno) then
+ begin
+ Decl.Free;
+ MakeError('', ecReadOnlyProperty, '');
+ p.Free;
+ p := nil;
+ exit;
+ end;
+ TPSValueProcNo(p).ProcNo := procno;
+ TPSValueProcNo(p).ResultType := nil;
+ end
+ else
+ begin
+ if not TPSClassType(aType).Cl.Property_Get(Idx, procno) then
+ begin
+ Decl.Free;
+ MakeError('', ecWriteOnlyProperty, '');
+ p.Free;
+ p := nil;
+ exit;
+ end;
+ TPSValueProcNo(p).ProcNo := procno;
+ TPSValueProcNo(p).ResultType := TPSExternalProcedure(FProcs[procno]).RegProc.Decl.Result;
+ end; // if FParser.CurrTokenId = CSTI_Assign
+ Decl.Free;
+ end;
+ end;
+
+ procedure CheckExtClass(var P: TPSValue; const VarType: TPSVariableType; VarNo: Cardinal; ImplicitPeriod: Boolean);
+ var
+ Temp, Idx: Cardinal;
+ FType: TPSType;
+ s: tbtString;
+
+ begin
+ FType := GetTypeNo(BlockInfo, p);
+ if FType = nil then Exit;
+ if FType.BaseType <> btExtClass then Exit;
+ while (FParser.CurrTokenID = CSTI_Period) or (ImplicitPeriod) do
+ begin
+ if not ImplicitPeriod then
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Identifier then
+ begin
+ if ImplicitPeriod then exit;
+ MakeError('', ecIdentifierExpected, '');
+ p.Free;
+ P := nil;
+ Exit;
+ end;
+ s := FParser.GetToken;
+ if TPSUndefinedClassType(FType).ExtClass.Func_Find(s, Idx) then
+ begin
+ FParser.Next;
+ TPSUndefinedClassType(FType).ExtClass.Func_Call(Idx, Temp);
+ P := ReadProcParameters(Temp, P);
+ if p = nil then
+ begin
+ Exit;
+ end;
+ end else
+ begin
+ if ImplicitPeriod then exit;
+ MakeError('', ecUnknownIdentifier, s);
+ p.Free;
+ P := nil;
+ Exit;
+ end;
+ ImplicitPeriod := False;
+ FType := GetTypeNo(BlockInfo, p);
+ if (FType = nil) or (FType.BaseType <> btExtClass) then Exit;
+ end; {while}
+ end;
+
+ procedure CheckClass(var P: TPSValue; const VarType: TPSVariableType; VarNo: Cardinal; ImplicitPeriod: Boolean);
+ var
+ Procno: Cardinal;
+ Idx: IPointer;
+ FType: TPSType;
+ TempP: TPSValue;
+ Decl: TPSParametersDecl;
+ s: tbtString;
+
+ pinfo, pinfonew: tbtString;
+ ppos: Cardinal;
+
+ begin
+ FType := GetTypeNo(BlockInfo, p);
+ if FType = nil then exit;
+ pinfo := '';
+ if (FType.BaseType <> btClass) then Exit;
+ while (FParser.CurrTokenID = CSTI_Period) or (ImplicitPeriod) do
+ begin
+ if not ImplicitPeriod then
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Identifier then
+ begin
+ if ImplicitPeriod then exit;
+ MakeError('', ecIdentifierExpected, '');
+ p.Free;
+ P := nil;
+ Exit;
+ end;
+ s := FParser.GetToken;
+ if TPSClassType(FType).Cl.Func_Find(s, Idx) then
+ begin
+ FParser.Next;
+ VarNo := InvalidVal;
+ TPSClassType(FType).cl.Func_Call(Idx, Procno);
+ P := ReadProcParameters(Procno, P);
+ if p = nil then
+ begin
+ Exit;
+ end;
+ end else if TPSClassType(FType).cl.Property_Find(s, Idx) then
+ begin
+ ppos := FParser.CurrTokenPos;
+ pinfonew := FParser.OriginalToken;
+ FParser.Next;
+ if VarNo <> InvalidVal then
+ begin
+ if pinfo = '' then
+ pinfo := pinfonew
+ else
+ pinfo := pinfo + '.' + pinfonew;
+ if @FOnUseVariable <> nil then
+ FOnUseVariable(Self, VarType, VarNo, BlockInfo.ProcNo, ppos, pinfo);
+ end;
+ Decl := TPSParametersDecl.Create;
+ TPSClassType(FType).cl.Property_GetHeader(Idx, Decl);
+ TempP := P;
+ p := TPSValueProcNo.Create;
+ with TPSValueProcNo(p) do
+ begin
+ Parameters := TPSParameters.Create;
+ Parameters.Add;
+ Pos := FParser.CurrTokenPos;
+ row := FParser.Row;
+ Col := FParser.Col;
+ end;
+ if Decl.ParamCount <> 0 then
+ begin
+ if not (ReadParameters(True, TPSValueProc(P).Parameters) and
+ ValidateParameters(BlockInfo, TPSValueProc(P).Parameters, Decl)) then
+ begin
+ Tempp.Free;
+ Decl.Free;
+ p.Free;
+ P := nil;
+ exit;
+ end;
+ end; // if
+ with TPSValueProcNo(p).Parameters[0] do
+ begin
+ Val := TempP;
+ ExpectedType := at2ut(GetTypeNo(BlockInfo, TempP));
+ end;
+ if FParser.CurrTokenId = CSTI_Assignment then
+ begin
+ FParser.Next;
+ TempP := Calc(CSTI_SemiColon);
+ if TempP = nil then
+ begin
+ Decl.Free;
+ P.Free;
+ p := nil;
+ exit;
+ end;
+ with TPSValueProc(p).Parameters.Add do
+ begin
+ Val := Tempp;
+ ExpectedType := at2ut(Decl.Result);
+{$IFDEF DEBUG}
+ if not ExpectedType.Used then asm int 3; end;
+{$ENDIF}
+ end;
+
+ if not TPSClassType(FType).cl.Property_Set(Idx, Procno) then
+ begin
+ MakeError('', ecReadOnlyProperty, '');
+ Decl.Free;
+ p.Free;
+ p := nil;
+ exit;
+ end;
+ TPSValueProcNo(p).ProcNo := Procno;
+ TPSValueProcNo(p).ResultType := nil;
+ Decl.Free;
+ Exit;
+ end else begin
+ if not TPSClassType(FType).cl.Property_Get(Idx, Procno) then
+ begin
+ MakeError('', ecWriteOnlyProperty, '');
+ Decl.Free;
+ p.Free;
+ p := nil;
+ exit;
+ end;
+ TPSValueProcNo(p).ProcNo := ProcNo;
+ TPSValueProcNo(p).ResultType := TPSExternalProcedure(FProcs[ProcNo]).RegProc.Decl.Result;
+ end; // if FParser.CurrTokenId = CSTI_Assign
+ Decl.Free;
+ end else
+ begin
+ if ImplicitPeriod then exit;
+ MakeError('', ecUnknownIdentifier, s);
+ p.Free;
+ P := nil;
+ Exit;
+ end;
+ ImplicitPeriod := False;
+ FType := GetTypeNo(BlockInfo, p);
+ if (FType = nil) or (FType.BaseType <> btClass) then Exit;
+ end; {while}
+ end;
+{$IFNDEF PS_NOIDISPATCH}
+ procedure CheckIntf(var P: TPSValue; const VarType: TPSVariableType; VarNo: Cardinal; ImplicitPeriod: Boolean);
+ var
+ Procno, Idx: Cardinal;
+ FType: TPSType;
+ s: tbtString;
+
+ CheckArrayProperty,HasArrayProperty:boolean;
+ begin
+ FType := GetTypeNo(BlockInfo, p);
+ if FType = nil then exit;
+ if (FType.BaseType <> btInterface) and (Ftype.BaseType <> BtVariant) and (FType.BaseType = btNotificationVariant) then Exit;
+
+ CheckArrayProperty:=(FParser.CurrTokenID=CSTI_OpenBlock)and
+ (Ftype.BaseType = BtVariant);
+ while (FParser.CurrTokenID = CSTI_Period)
+ or (ImplicitPeriod)or (CheckArrayProperty) do begin
+
+ HasArrayProperty:=CheckArrayProperty;
+ if CheckArrayProperty then begin
+ CheckArrayProperty:=false;
+ end else begin
+ if not ImplicitPeriod then
+ FParser.Next;
+ end;
+ if FParser.CurrTokenID <> CSTI_Identifier then
+ begin
+ if ImplicitPeriod then exit;
+ if not HasArrayProperty then begin
+ MakeError('', ecIdentifierExpected, '');
+ p.Free;
+ P := nil;
+ Exit;
+ end;
+ end;
+ if (FType.BaseType = btVariant) or (FType.BaseType = btNotificationVariant) then
+ begin
+ if HasArrayProperty then begin
+ s:='';
+ end else begin
+ s := FParser.OriginalToken;
+ FParser.Next;
+ end;
+ ImplicitPeriod := False;
+ FType := GetTypeNo(BlockInfo, p);
+ p := ReadIDispatchParameters(s, TPSVariantType(FType), p);
+ if (FType = nil) or (FType.BaseType <> btInterface) then Exit;
+ end else
+ begin
+ s := FParser.GetToken;
+ if (FType is TPSInterfaceType) and (TPSInterfaceType(FType).Intf.Func_Find(s, Idx)) then
+ begin
+ FParser.Next;
+ TPSInterfaceType(FType).Intf.Func_Call(Idx, Procno);
+ P := ReadProcParameters(Procno, P);
+ if p = nil then
+ begin
+ Exit;
+ end;
+ end else
+ begin
+ if ImplicitPeriod then exit;
+ MakeError('', ecUnknownIdentifier, s);
+ p.Free;
+ P := nil;
+ Exit;
+ end;
+ ImplicitPeriod := False;
+ FType := GetTypeNo(BlockInfo, p);
+ if (FType = nil) or ((FType.BaseType <> btInterface) and (Ftype.BaseType <> btVariant) and (Ftype.BaseType <> btNotificationVariant)) then Exit;
+ end;
+ end; {while}
+ end;
+ {$ENDIF}
+ function ExtCheckClassType(FType: TPSType; const ParserPos: Cardinal): TPSValue;
+ var
+ FType2: TPSType;
+ ProcNo, Idx: Cardinal;
+ Temp, ResV: TPSValue;
+ begin
+ if FParser.CurrTokenID = CSTI_OpenRound then
+ begin
+ FParser.Next;
+ Temp := Calc(CSTI_CloseRound);
+ if Temp = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ if FParser.CurrTokenID <> CSTI_CloseRound then
+ begin
+ temp.Free;
+ MakeError('', ecCloseRoundExpected, '');
+ Result := nil;
+ exit;
+ end;
+ FType2 := GetTypeNo(BlockInfo, Temp);
+ if (FType.basetype = BtClass) and (ftype2.BaseType = btClass) and (ftype <> ftype2) then
+ begin
+ if not TPSUndefinedClassType(FType2).ExtClass.CastToType(AT2UT(FType), ProcNo) then
+ begin
+ temp.Free;
+ MakeError('', ecTypeMismatch, '');
+ Result := nil;
+ exit;
+ end;
+ Result := TPSValueProcNo.Create;
+ TPSValueProcNo(Result).Parameters := TPSParameters.Create;
+ TPSValueProcNo(Result).ResultType := at2ut(FType);
+ TPSValueProcNo(Result).ProcNo := ProcNo;
+ with TPSValueProcNo(Result).Parameters.Add do
+ begin
+ Val := Temp;
+ ExpectedType := GetTypeNo(BlockInfo, temp);
+ end;
+ with TPSValueProcNo(Result).Parameters.Add do
+ begin
+ ExpectedType := at2ut(FindBaseType(btu32));
+ Val := TPSValueData.Create;
+ with TPSValueData(val) do
+ begin
+ SetParserPos(FParser);
+ Data := NewVariant(ExpectedType);
+ Data.tu32 := at2ut(FType).FinalTypeNo;
+ end;
+ end;
+ FParser.Next;
+ Exit;
+ end;
+ if not IsCompatibleType(FType, FType2, True) then
+ begin
+ temp.Free;
+ MakeError('', ecTypeMismatch, '');
+ Result := nil;
+ exit;
+ end;
+ FParser.Next;
+ Result := TPSUnValueOp.Create;
+ with TPSUnValueOp(Result) do
+ begin
+ Operator := otCast;
+ Val1 := Temp;
+ SetParserPos(FParser);
+ aType := AT2UT(FType);
+ end;
+ exit;
+ end;
+ if FParser.CurrTokenId <> CSTI_Period then
+ begin
+ Result := nil;
+ MakeError('', ecPeriodExpected, '');
+ Exit;
+ end;
+ if FType.BaseType <> btExtClass then
+ begin
+ Result := nil;
+ MakeError('', ecClassTypeExpected, '');
+ Exit;
+ end;
+ FParser.Next;
+ if not TPSUndefinedClassType(FType).ExtClass.ClassFunc_Find(FParser.GetToken, Idx) then
+ begin
+ Result := nil;
+ MakeError('', ecUnknownIdentifier, FParser.OriginalToken);
+ Exit;
+ end;
+ FParser.Next;
+ TPSUndefinedClassType(FType).ExtClass.ClassFunc_Call(Idx, ProcNo);
+ Temp := TPSValueData.Create;
+ with TPSValueData(Temp) do
+ begin
+ Data := NewVariant(at2ut(FindBaseType(btu32)));
+ Data.tu32 := at2ut(FType).FinalTypeNo;
+ end;
+ ResV := ReadProcParameters(ProcNo, Temp);
+ if ResV <> nil then
+ begin
+ TPSValueProc(Resv).ResultType := at2ut(FType);
+ Result := Resv;
+ end else begin
+ Result := nil;
+ end;
+ end;
+
+ function CheckClassType(TypeNo: TPSType; const ParserPos: Cardinal): TPSValue;
+ var
+ FType2: TPSType;
+ ProcNo: Cardinal;
+ Idx: IPointer;
+ Temp, ResV: TPSValue;
+ dta: PIfRVariant;
+ begin
+ if typeno.BaseType = btExtClass then
+ begin
+ Result := ExtCheckClassType(TypeNo, PArserPos);
+ exit;
+ end;
+ if FParser.CurrTokenID = CSTI_OpenRound then
+ begin
+ FParser.Next;
+ Temp := Calc(CSTI_CloseRound);
+ if Temp = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ if FParser.CurrTokenID <> CSTI_CloseRound then
+ begin
+ temp.Free;
+ MakeError('', ecCloseRoundExpected, '');
+ Result := nil;
+ exit;
+ end;
+ FType2 := GetTypeNo(BlockInfo, Temp);
+ if ((typeno.BaseType = btClass){$IFNDEF PS_NOINTERFACES} or (TypeNo.basetype = btInterface){$ENDIF}) and
+ ((ftype2.BaseType = btClass){$IFNDEF PS_NOINTERFACES} or (ftype2.BaseType = btInterface){$ENDIF}) and (TypeNo <> ftype2) then
+ begin
+{$IFNDEF PS_NOINTERFACES}
+ if FType2.basetype = btClass then
+ begin
+{$ENDIF}
+ if not TPSClassType(FType2).Cl.CastToType(AT2UT(TypeNo), ProcNo) then
+ begin
+ temp.Free;
+ MakeError('', ecTypeMismatch, '');
+ Result := nil;
+ exit;
+ end;
+{$IFNDEF PS_NOINTERFACES}
+ end else begin
+ if not TPSInterfaceType(FType2).Intf.CastToType(AT2UT(TypeNo), ProcNo) then
+ begin
+ temp.Free;
+ MakeError('', ecTypeMismatch, '');
+ Result := nil;
+ exit;
+ end;
+ end;
+{$ENDIF}
+ Result := TPSValueProcNo.Create;
+ TPSValueProcNo(Result).Parameters := TPSParameters.Create;
+ TPSValueProcNo(Result).ResultType := at2ut(TypeNo);
+ TPSValueProcNo(Result).ProcNo := ProcNo;
+ with TPSValueProcNo(Result).Parameters.Add do
+ begin
+ Val := Temp;
+ ExpectedType := GetTypeNo(BlockInfo, temp);
+{$IFDEF DEBUG}
+ if not ExpectedType.Used then asm int 3; end;
+{$ENDIF}
+ end;
+ with TPSValueProcNo(Result).Parameters.Add do
+ begin
+ ExpectedType := at2ut(FindBaseType(btu32));
+{$IFDEF DEBUG}
+ if not ExpectedType.Used then asm int 3; end;
+{$ENDIF}
+ Val := TPSValueData.Create;
+ with TPSValueData(val) do
+ begin
+ SetParserPos(FParser);
+ Data := NewVariant(ExpectedType);
+ Data.tu32 := at2ut(TypeNo).FinalTypeNo;
+ end;
+ end;
+ FParser.Next;
+ Exit;
+ end;
+ if not IsCompatibleType(TypeNo, FType2, True) then
+ begin
+ temp.Free;
+ MakeError('', ecTypeMismatch, '');
+ Result := nil;
+ exit;
+ end;
+ FParser.Next;
+ Result := TPSUnValueOp.Create;
+ with TPSUnValueOp(Result) do
+ begin
+ Operator := otCast;
+ Val1 := Temp;
+ SetParserPos(FParser);
+ aType := AT2UT(TypeNo);
+ end;
+
+ exit;
+ end else
+ if FParser.CurrTokenId <> CSTI_Period then
+ begin
+ Result := TPSValueData.Create;
+ Result.SetParserPos(FParser);
+ New(dta);
+ TPSValueData(Result).Data := dta;
+ InitializeVariant(dta, at2ut(FindBaseType(btType)));
+ dta.ttype := at2ut(TypeNo);
+ Exit;
+ end;
+ if TypeNo.BaseType <> btClass then
+ begin
+ Result := nil;
+ MakeError('', ecClassTypeExpected, '');
+ Exit;
+ end;
+ FParser.Next;
+ if not TPSClassType(TypeNo).Cl.ClassFunc_Find(FParser.GetToken, Idx) then
+ begin
+ Result := nil;
+ MakeError('', ecUnknownIdentifier, FParser.OriginalToken);
+ Exit;
+ end;
+ FParser.Next;
+ TPSClassType(TypeNo).Cl.ClassFunc_Call(Idx, ProcNo);
+ Temp := TPSValueData.Create;
+ with TPSValueData(Temp) do
+ begin
+ Data := NewVariant(at2ut(FindBaseType(btu32)));
+ Data.tu32 := at2ut(TypeNo).FinalTypeNo;
+ end;
+ ResV := ReadProcParameters(ProcNo, Temp);
+ if ResV <> nil then
+ begin
+ TPSValueProc(Resv).ResultType := at2ut(TypeNo);
+ Result := Resv;
+ end else begin
+ Result := nil;
+ end;
+ end;
+
+ var
+ vt: TPSVariableType;
+ vno: Cardinal;
+ TWith, Temp: TPSValue;
+ l, h: Longint;
+ s, u: tbtString;
+ t: TPSConstant;
+ Temp1: TPSType;
+ temp2: CArdinal;
+ bi: TPSBlockInfo;
+ lOldRecCount: Integer;
+
+ begin
+ s := FParser.GetToken;
+
+ if FType <> 1 then
+ begin
+ bi := BlockInfo;
+ while bi <> nil do
+ begin
+ for l := bi.WithList.Count -1 downto 0 do
+ begin
+ TWith := TPSValueAllocatedStackVar.Create;
+ TPSValueAllocatedStackVar(TWith).LocalVarNo := TPSValueAllocatedStackVar(TPSValueReplace(bi.WithList[l]).NewValue).LocalVarNo;
+ Temp := TWith;
+ VNo := TPSValueAllocatedStackVar(Temp).LocalVarNo;
+ lOldRecCount := TPSValueVar(TWith).GetRecCount;
+ vt := ivtVariable;
+ if Temp = TWith then CheckFurther(TWith, True);
+ if Temp = TWith then CheckClass(TWith, vt, vno, True);
+ if Temp = TWith then CheckExtClass(TWith, vt, vno, True);
+ if (Temp <> TWith) or (Cardinal(lOldRecCount) <> TPSValueVar(TWith).GetRecCount) then
+ begin
+ repeat
+ Temp := TWith;
+ if TWith <> nil then CheckFurther(TWith, False);
+ if TWith <> nil then CheckClass(TWith, vt, vno, False);
+ if TWith <> nil then CheckExtClass(TWith, vt, vno, False);
+{$IFNDEF PS_NOIDISPATCH}if TWith <> nil then CheckIntf(TWith, vt, vno, False);{$ENDIF}
+ if TWith <> nil then CheckProcCall(TWith);
+ if TWith <> nil then CheckClassArrayProperty(TWith, vt, vno);
+ vno := InvalidVal;
+ until (TWith = nil) or (Temp = TWith);
+ Result := TWith;
+ Exit;
+ end;
+ TWith.Free;
+ end;
+ bi := bi.FOwner;
+ end;
+ end;
+
+ if s = 'RESULT' then
+ begin
+ if BlockInfo.proc.Decl.Result = nil then
+ begin
+ Result := nil;
+ MakeError('', ecUnknownIdentifier, FParser.OriginalToken);
+ end
+ else
+ begin
+ BlockInfo.Proc.ResultUse;
+ Result := TPSValueParamVar.Create;
+ with TPSValueParamVar(Result) do
+ begin
+ SetParserPos(FParser);
+ ParamNo := 0;
+ end;
+ vno := 0;
+ vt := ivtParam;
+ if @FOnUseVariable <> nil then
+ FOnUseVariable(Self, vt, vno, BlockInfo.ProcNo, FParser.CurrTokenPos, '');
+ FParser.Next;
+ repeat
+ Temp := Result;
+ if Result <> nil then CheckFurther(Result, False);
+ if Result <> nil then CheckClass(Result, vt, vno, False);
+ if Result <> nil then CheckExtClass(Result, vt, vno, False);
+{$IFNDEF PS_NOIDISPATCH}if Result <> nil then CheckIntf(Result, vt, vno, False);{$ENDIF}
+ if Result <> nil then CheckProcCall(Result);
+ if Result <> nil then CheckClassArrayProperty(Result, vt, vno);
+ vno := InvalidVal;
+ until (Result = nil) or (Temp = Result);
+ end;
+ exit;
+ end;
+ if BlockInfo.Proc.Decl.Result = nil then
+ l := 0
+ else
+ l := 1;
+ for h := 0 to BlockInfo.proc.Decl.ParamCount -1 do
+ begin
+ if BlockInfo.proc.Decl.Params[h].Name = s then
+ begin
+ Result := TPSValueParamVar.Create;
+ with TPSValueParamVar(Result) do
+ begin
+ SetParserPos(FParser);
+ ParamNo := l;
+ end;
+ vt := ivtParam;
+ vno := L;
+ if @FOnUseVariable <> nil then
+ FOnUseVariable(Self, vt, vno, BlockInfo.ProcNo, FParser.CurrTokenPos, '');
+ FParser.Next;
+ repeat
+ Temp := Result;
+ if Result <> nil then CheckFurther(Result, False);
+ if Result <> nil then CheckClass(Result, vt, vno, False);
+ if Result <> nil then CheckExtClass(Result, vt, vno, False);
+{$IFNDEF PS_NOIDISPATCH}if Result <> nil then CheckIntf(Result, vt, vno, False);{$ENDIF}
+ if Result <> nil then CheckProcCall(Result);
+ if Result <> nil then CheckClassArrayProperty(Result, vt, vno);
+ vno := InvalidVal;
+ until (Result = nil) or (Temp = Result);
+ exit;
+ end;
+ Inc(l);
+ GRFW(u);
+ end;
+
+ h := MakeHash(s);
+
+ for l := 0 to BlockInfo.Proc.ProcVars.Count - 1 do
+ begin
+ if (PIFPSProcVar(BlockInfo.Proc.ProcVars[l]).NameHash = h) and
+ (PIFPSProcVar(BlockInfo.Proc.ProcVars[l]).Name = s) then
+ begin
+ PIFPSProcVar(BlockInfo.Proc.ProcVars[l]).Use;
+ vno := l;
+ vt := ivtVariable;
+ if @FOnUseVariable <> nil then
+ FOnUseVariable(Self, vt, vno, BlockInfo.ProcNo, FParser.CurrTokenPos, '');
+ Result := TPSValueLocalVar.Create;
+ with TPSValueLocalVar(Result) do
+ begin
+ LocalVarNo := l;
+ SetParserPos(FParser);
+ end;
+ FParser.Next;
+ repeat
+ Temp := Result;
+ if Result <> nil then CheckFurther(Result, False);
+ if Result <> nil then CheckClass(Result, vt, vno, False);
+ if Result <> nil then CheckExtClass(Result, vt, vno, False);
+{$IFNDEF PS_NOIDISPATCH}if Result <> nil then CheckIntf(Result, vt, vno, False);{$ENDIF}
+ if Result <> nil then CheckProcCall(Result);
+ if Result <> nil then CheckClassArrayProperty(Result, vt, vno);
+ vno := InvalidVal;
+ until (Result = nil) or (Temp = Result);
+
+ exit;
+ end;
+ end;
+
+ for l := 0 to FVars.Count - 1 do
+ begin
+ if (TPSVar(FVars[l]).NameHash = h) and
+ (TPSVar(FVars[l]).Name = s) then
+ begin
+ TPSVar(FVars[l]).Use;
+ Result := TPSValueGlobalVar.Create;
+ with TPSValueGlobalVar(Result) do
+ begin
+ SetParserPos(FParser);
+ GlobalVarNo := l;
+
+ end;
+ vt := ivtGlobal;
+ vno := l;
+ if @FOnUseVariable <> nil then
+ FOnUseVariable(Self, vt, vno, BlockInfo.ProcNo, FParser.CurrTokenPos, '');
+ FParser.Next;
+ repeat
+ Temp := Result;
+ if Result <> nil then CheckNotificationVariant(Result);
+ if Result <> nil then CheckFurther(Result, False);
+ if Result <> nil then CheckClass(Result, vt, vno, False);
+ if Result <> nil then CheckExtClass(Result, vt, vno, False);
+{$IFNDEF PS_NOIDISPATCH}if Result <> nil then CheckIntf(Result, vt, vno, False);{$ENDIF}
+ if Result <> nil then CheckProcCall(Result);
+ if Result <> nil then CheckClassArrayProperty(Result, vt, vno);
+ vno := InvalidVal;
+ until (Result = nil) or (Temp = Result);
+ exit;
+ end;
+ end;
+ Temp1 := FindType(FParser.GetToken);
+ if Temp1 <> nil then
+ begin
+ l := FParser.CurrTokenPos;
+ if FType = 1 then
+ begin
+ Result := nil;
+ MakeError('', ecVariableExpected, FParser.OriginalToken);
+ exit;
+ end;
+ vt := ivtGlobal;
+ vno := InvalidVal;
+ FParser.Next;
+ Result := CheckClassType(Temp1, l);
+ repeat
+ Temp := Result;
+ if Result <> nil then CheckFurther(Result, False);
+ if Result <> nil then CheckClass(Result, vt, vno, False);
+ if Result <> nil then CheckExtClass(Result, vt, vno, False);
+{$IFNDEF PS_NOIDISPATCH}if Result <> nil then CheckIntf(Result, vt, vno, False);{$ENDIF}
+ if Result <> nil then CheckProcCall(Result);
+ if Result <> nil then CheckClassArrayProperty(Result, vt, vno);
+ vno := InvalidVal;
+ until (Result = nil) or (Temp = Result);
+
+ exit;
+ end;
+ Temp2 := FindProc(FParser.GetToken);
+ if Temp2 <> InvalidVal then
+ begin
+ if FType = 1 then
+ begin
+ Result := nil;
+ MakeError('', ecVariableExpected, FParser.OriginalToken);
+ exit;
+ end;
+ FParser.Next;
+ Result := ReadProcParameters(Temp2, nil);
+ if Result = nil then
+ exit;
+ Result.SetParserPos(FParser);
+ vt := ivtGlobal;
+ vno := InvalidVal;
+ repeat
+ Temp := Result;
+ if Result <> nil then CheckFurther(Result, False);
+ if Result <> nil then CheckClass(Result, vt, vno, False);
+ if Result <> nil then CheckExtClass(Result, vt, vno, False);
+{$IFNDEF PS_NOIDISPATCH}if Result <> nil then CheckIntf(Result, vt, vno, False);{$ENDIF}
+ if Result <> nil then CheckProcCall(Result);
+ if Result <> nil then CheckClassArrayProperty(Result, vt, vno);
+ vno := InvalidVal;
+ until (Result = nil) or (Temp = Result);
+ exit;
+ end;
+ for l := 0 to FConstants.Count -1 do
+ begin
+ t := TPSConstant(FConstants[l]);
+ if (t.NameHash = h) and (t.Name = s) then
+ begin
+ if FType <> 0 then
+ begin
+ Result := nil;
+ MakeError('', ecVariableExpected, FParser.OriginalToken);
+ exit;
+ end;
+ fparser.next;
+ Result := TPSValueData.Create;
+ with TPSValueData(Result) do
+ begin
+ SetParserPos(FParser);
+ Data := NewVariant(at2ut(t.Value.FType));
+ CopyVariantContents(t.Value, Data);
+ end;
+ vt := ivtGlobal;
+ vno := InvalidVal;
+ repeat
+ Temp := Result;
+ if Result <> nil then CheckFurther(Result, False);
+ if Result <> nil then CheckClass(Result, vt, vno, False);
+ if Result <> nil then CheckExtClass(Result, vt, vno, False);
+{$IFNDEF PS_NOIDISPATCH}if Result <> nil then CheckIntf(Result, vt, vno, False);{$ENDIF}
+ if Result <> nil then CheckProcCall(Result);
+ if Result <> nil then CheckClassArrayProperty(Result, vt, vno);
+ vno := InvalidVal;
+ until (Result = nil) or (Temp = Result);
+ exit;
+ end;
+ end;
+ Result := nil;
+ MakeError('', ecUnknownIdentifier, FParser.OriginalToken);
+ end;
+
+ function calc(endOn: TPSPasToken): TPSValue;
+ function TryEvalConst(var P: TPSValue): Boolean; forward;
+
+
+ function ReadExpression: TPSValue; forward;
+ function ReadTerm: TPSValue; forward;
+ function ReadFactor: TPSValue;
+ var
+ NewVar: TPSValue;
+ NewVarU: TPSUnValueOp;
+ Proc: TPSProcedure;
+ function ReadArray: Boolean;
+ var
+ tmp: TPSValue;
+ begin
+ FParser.Next;
+ NewVar := TPSValueArray.Create;
+ NewVar.SetParserPos(FParser);
+ if FParser.CurrTokenID <> CSTI_CloseBlock then
+ begin
+ while True do
+ begin
+ tmp := nil;
+ Tmp := ReadExpression();
+ if Tmp = nil then
+ begin
+ Result := False;
+ NewVar.Free;
+ exit;
+ end;
+ if not TryEvalConst(tmp) then
+ begin
+ tmp.Free;
+ NewVar.Free;
+ Result := False;
+ exit;
+ end;
+ TPSValueArray(NewVar).Add(tmp);
+ if FParser.CurrTokenID = CSTI_CloseBlock then Break;
+ if FParser.CurrTokenID <> CSTI_Comma then
+ begin
+ MakeError('', ecCloseBlockExpected, '');
+ NewVar.Free;
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ end;
+ end;
+ FParser.Next;
+ Result := True;
+ end;
+
+ function CallAssigned(P: TPSValue): TPSValue;
+ var
+ temp: TPSValueProcNo;
+ begin
+ temp := TPSValueProcNo.Create;
+ temp.ProcNo := FindProc('!ASSIGNED');
+ temp.ResultType := at2ut(FDefaultBoolType);
+ temp.Parameters := TPSParameters.Create;
+ with Temp.Parameters.Add do
+ begin
+ Val := p;
+ ExpectedType := GetTypeNo(BlockInfo, p);
+{$IFDEF DEBUG}
+ if not ExpectedType.Used then asm int 3; end;
+{$ENDIF}
+ FParamMode := pmIn;
+ end;
+ Result := Temp;
+ end;
+
+ function CallSucc(P: TPSValue): TPSValue;
+ var
+ temp: TPSBinValueOp;
+ begin
+ temp := TPSBinValueOp.Create;
+ temp.SetParserPos(FParser);
+ temp.FOperator := otAdd;
+ temp.FVal2 := TPSValueData.Create;
+ TPSValueData(Temp.FVal2).Data := NewVariant(FindBaseType(bts32));
+ TPSValueData(Temp.FVal2).Data.ts32 := 1;
+ temp.FVal1 := p;
+ Temp.FType := GetTypeNo(BlockInfo, P);
+ result := temp;
+ end;
+
+ function CallPred(P: TPSValue): TPSValue;
+ var
+ temp: TPSBinValueOp;
+ begin
+ temp := TPSBinValueOp.Create;
+ temp.SetParserPos(FParser);
+ temp.FOperator := otSub;
+ temp.FVal2 := TPSValueData.Create;
+ TPSValueData(Temp.FVal2).Data := NewVariant(FindBaseType(bts32));
+ TPSValueData(Temp.FVal2).Data.ts32 := 1;
+ temp.FVal1 := p;
+ Temp.FType := GetTypeNo(BlockInfo, P);
+ result := temp;
+ end;
+
+ begin
+ case fParser.CurrTokenID of
+ CSTI_OpenBlock:
+ begin
+ if not ReadArray then
+ begin
+ Result := nil;
+ exit;
+ end;
+ end;
+ CSTII_Not:
+ begin
+ FParser.Next;
+ NewVar := ReadFactor;
+ if NewVar = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ NewVarU := TPSUnValueOp.Create;
+ NewVarU.SetParserPos(FParser);
+ NewVarU.aType := GetTypeNo(BlockInfo, NewVar);
+ NewVarU.Operator := otNot;
+ NewVarU.Val1 := NewVar;
+ NewVar := NewVarU;
+ end;
+ CSTI_Plus:
+ begin
+ FParser.Next;
+ NewVar := ReadTerm;
+ if NewVar = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ end;
+ CSTI_Minus:
+ begin
+ FParser.Next;
+ NewVar := ReadTerm;
+ if NewVar = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ NewVarU := TPSUnValueOp.Create;
+ NewVarU.SetParserPos(FParser);
+ NewVarU.aType := GetTypeNo(BlockInfo, NewVar);
+ NewVarU.Operator := otMinus;
+ NewVarU.Val1 := NewVar;
+ NewVar := NewVarU;
+ end;
+ CSTII_Nil:
+ begin
+ FParser.Next;
+ NewVar := TPSValueNil.Create;
+ NewVar.SetParserPos(FParser);
+ end;
+ CSTI_AddressOf:
+ begin
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ Result := nil;
+ exit;
+ end;
+ NewVar := TPSValueProcPtr.Create;
+ NewVar.SetParserPos(FParser);
+ TPSValueProcPtr(NewVar).ProcPtr := FindProc(FParser.GetToken);
+ if TPSValueProcPtr(NewVar).ProcPtr = InvalidVal then
+ begin
+ MakeError('', ecUnknownIdentifier, FParser.OriginalToken);
+ NewVar.Free;
+ Result := nil;
+ exit;
+ end;
+ Proc := FProcs[TPSValueProcPtr(NewVar).ProcPtr];
+ if Proc.ClassType <> TPSInternalProcedure then
+ begin
+ MakeError('', ecUnknownIdentifier, FParser.OriginalToken);
+ NewVar.Free;
+ Result := nil;
+ exit;
+ end;
+ FParser.Next;
+ end;
+ CSTI_OpenRound:
+ begin
+ FParser.Next;
+ NewVar := ReadExpression();
+ if NewVar = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ if FParser.CurrTokenId <> CSTI_CloseRound then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', ecCloseRoundExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ end;
+ CSTI_Char, CSTI_String:
+ begin
+ NewVar := TPSValueData.Create;
+ NewVar.SetParserPos(FParser);
+ TPSValueData(NewVar).Data := ReadString;
+ if TPSValueData(NewVar).Data = nil then
+ begin
+ NewVar.Free;
+ Result := nil;
+ exit;
+ end;
+ end;
+ CSTI_HexInt, CSTI_Integer:
+ begin
+ NewVar := TPSValueData.Create;
+ NewVar.SetParserPos(FParser);
+ TPSValueData(NewVar).Data := ReadInteger(FParser.GetToken);
+ FParser.Next;
+ end;
+ CSTI_Real:
+ begin
+ NewVar := TPSValueData.Create;
+ NewVar.SetParserPos(FParser);
+ TPSValueData(NewVar).Data := ReadReal(FParser.GetToken);
+ FParser.Next;
+ end;
+ CSTII_Ord:
+ begin
+ FParser.Next;
+ if fParser.Currtokenid <> CSTI_OpenRound then
+ begin
+ Result := nil;
+ MakeError('', ecOpenRoundExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ NewVar := ReadExpression();
+ if NewVar = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ if FParser.CurrTokenId <> CSTI_CloseRound then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', ecCloseRoundExpected, '');
+ exit;
+ end;
+ if not ((GetTypeNo(BlockInfo, NewVar).BaseType = btChar) or
+ {$IFNDEF PS_NOWIDESTRING} (GetTypeNo(BlockInfo, NewVar).BaseType = btWideChar) or{$ENDIF}
+ (GetTypeNo(BlockInfo, NewVar).BaseType = btEnum) or (IsIntType(GetTypeNo(BlockInfo, NewVar).BaseType))) then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', ecTypeMismatch, '');
+ exit;
+ end;
+ NewVarU := TPSUnValueOp.Create;
+ NewVarU.SetParserPos(FParser);
+ NewVarU.Operator := otCast;
+ NewVarU.FType := at2ut(FindBaseType(btu32));
+ NewVarU.Val1 := NewVar;
+ NewVar := NewVarU;
+ FParser.Next;
+ end;
+ CSTII_Chr:
+ begin
+ FParser.Next;
+ if fParser.Currtokenid <> CSTI_OpenRound then
+ begin
+ Result := nil;
+ MakeError('', ecOpenRoundExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ NewVar := ReadExpression();
+ if NewVar = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ if FParser.CurrTokenId <> CSTI_CloseRound then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', ecCloseRoundExpected, '');
+ exit;
+ end;
+ if not (IsIntType(GetTypeNo(BlockInfo, NewVar).BaseType)) then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', ecTypeMismatch, '');
+ exit;
+ end;
+ NewVarU := TPSUnValueOp.Create;
+ NewVarU.SetParserPos(FParser);
+ NewVarU.Operator := otCast;
+ NewVarU.FType := at2ut(FindBaseType(btChar));
+ NewVarU.Val1 := NewVar;
+ NewVar := NewVarU;
+ FParser.Next;
+ end;
+ CSTI_Identifier:
+ begin
+ if FParser.GetToken = 'SUCC' then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_OpenRound then
+ begin
+ Result := nil;
+ MakeError('', ecOpenRoundExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ NewVar := ReadExpression;
+ if NewVar = nil then
+ begin
+ result := nil;
+ exit;
+ end;
+ if (GetTypeNo(BlockInfo, NewVar) = nil) or (not IsIntType(GetTypeNo(BlockInfo, NewVar).BaseType) and
+ (GetTypeNo(BlockInfo, NewVar).BaseType <> btEnum)) then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', ecTypeMismatch, '');
+ exit;
+ end;
+ if FParser.CurrTokenID <> CSTI_CloseRound then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', eccloseRoundExpected, '');
+ exit;
+ end;
+ NewVar := CallSucc(NewVar);
+ FParser.Next;
+ end else
+ if FParser.GetToken = 'PRED' then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_OpenRound then
+ begin
+ Result := nil;
+ MakeError('', ecOpenRoundExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ NewVar := ReadExpression;
+ if NewVar = nil then
+ begin
+ result := nil;
+ exit;
+ end;
+ if (GetTypeNo(BlockInfo, NewVar) = nil) or (not IsIntType(GetTypeNo(BlockInfo, NewVar).BaseType) and
+ (GetTypeNo(BlockInfo, NewVar).BaseType <> btEnum)) then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', ecTypeMismatch, '');
+ exit;
+ end;
+ if FParser.CurrTokenID <> CSTI_CloseRound then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', eccloseRoundExpected, '');
+ exit;
+ end;
+ NewVar := CallPred(NewVar);
+ FParser.Next;
+ end else
+ if FParser.GetToken = 'ASSIGNED' then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_OpenRound then
+ begin
+ Result := nil;
+ MakeError('', ecOpenRoundExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ NewVar := GetIdentifier(0);
+ if NewVar = nil then
+ begin
+ result := nil;
+ exit;
+ end;
+ if (GetTypeNo(BlockInfo, NewVar) = nil) or ((GetTypeNo(BlockInfo, NewVar).BaseType <> btClass) and
+ (GetTypeNo(BlockInfo, NewVar).BaseType <> btPChar) and
+ (GetTypeNo(BlockInfo, NewVar).BaseType <> btString)) then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', ecTypeMismatch, '');
+ exit;
+ end;
+ if FParser.CurrTokenID <> CSTI_CloseRound then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', eccloseRoundExpected, '');
+ exit;
+ end;
+ NewVar := CallAssigned(NewVar);
+ FParser.Next;
+ end else
+ begin
+ NewVar := GetIdentifier(0);
+ if NewVar = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ end;
+ end;
+ else
+ begin
+ MakeError('', ecSyntaxError, '');
+ Result := nil;
+ exit;
+ end;
+ end; {case}
+ Result := NewVar;
+ end; // ReadFactor
+
+ function GetResultType(p1, P2: TPSValue; Cmd: TPSBinOperatorType): TPSType;
+ var
+ pp, t1, t2: PIFPSType;
+ begin
+ t1 := GetTypeNo(BlockInfo, p1);
+ t2 := GetTypeNo(BlockInfo, P2);
+ if (t1 = nil) or (t2 = nil) then
+ begin
+ if ((p1.ClassType = TPSValueNil) or (p2.ClassType = TPSValueNil)) and ((t1 <> nil) or (t2 <> nil)) then
+ begin
+ if p1.ClassType = TPSValueNil then
+ pp := t2
+ else
+ pp := t1;
+ if (pp.BaseType = btPchar) or (pp.BaseType = btString) or (pp.BaseType = btClass) {$IFNDEF PS_NOINTERFACES}or (pp.BaseType =btInterface){$ENDIF} or (pp.BaseType = btProcPtr) then
+ Result := AT2UT(FDefaultBoolType)
+ else
+ Result := nil;
+ exit;
+ end;
+ Result := nil;
+ exit;
+ end;
+ case Cmd of
+ otAdd: {plus}
+ begin
+ if ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) and (
+ ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) or
+ (t2.BaseType = btString) or
+ {$IFNDEF PS_NOWIDESTRING}
+ (t2.BaseType = btwideString) or
+ (t2.BaseType = btUnicodestring) or
+ (t2.BaseType = btwidechar) or
+ {$ENDIF}
+ (t2.BaseType = btPchar) or
+ (t2.BaseType = btChar) or
+ (isIntRealType(t2.BaseType))) then
+ Result := t1
+ else
+ if ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) and (
+ ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) or
+ (t1.BaseType = btString) or
+ {$IFNDEF PS_NOWIDESTRING}
+ (t1.BaseType = btUnicodestring) or
+ (t1.BaseType = btwideString) or
+ (t1.BaseType = btwidechar) or
+ {$ENDIF}
+ (t1.BaseType = btPchar) or
+ (t1.BaseType = btChar) or
+ (isIntRealType(t1.BaseType))) then
+ Result := t2
+ else if ((t1.BaseType = btSet) and (t2.BaseType = btSet)) and (t1 = t2) then
+ Result := t1
+ else if IsIntType(t1.BaseType) and IsIntType(t2.BaseType) then
+ Result := t1
+ else if IsIntRealType(t1.BaseType) and
+ IsIntRealType(t2.BaseType) then
+ begin
+ if IsRealType(t1.BaseType) then
+ Result := t1
+ else
+ Result := t2;
+ end
+ else if (t1.basetype = btSet) and (t2.Name = 'TVARIANTARRAY') then
+ Result := t1
+ else if (t2.basetype = btSet) and (t1.Name = 'TVARIANTARRAY') then
+ Result := t2
+ else if ((t1.BaseType = btPchar) or(t1.BaseType = btString) or (t1.BaseType = btChar)) and ((t2.BaseType = btPchar) or(t2.BaseType = btString) or (t2.BaseType = btChar)) then
+ Result := at2ut(FindBaseType(btString))
+ {$IFNDEF PS_NOWIDESTRING}
+ else if ((t1.BaseType = btString) or (t1.BaseType = btChar) or (t1.BaseType = btPchar)or (t1.BaseType = btWideString) or (t1.BaseType = btWideChar) or (t1.BaseType = btUnicodeString)) and
+ ((t2.BaseType = btString) or (t2.BaseType = btChar) or (t2.BaseType = btPchar) or (t2.BaseType = btWideString) or (t2.BaseType = btWideChar) or (t2.BaseType = btUnicodeString)) then
+ Result := at2ut(FindBaseType(btWideString))
+ {$ENDIF}
+ else
+ Result := nil;
+ end;
+ otSub, otMul, otDiv: { - * / }
+ begin
+ if ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) and (
+ ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) or
+ (isIntRealType(t2.BaseType))) then
+ Result := t1
+ else if ((t1.BaseType = btSet) and (t2.BaseType = btSet)) and (t1 = t2) and ((cmd = otSub) or (cmd = otMul)) then
+ Result := t1
+ else if (t1.basetype = btSet) and (t2.Name = 'TVARIANTARRAY') and ((cmd = otSub) or (cmd = otMul)) then
+ Result := t1
+ else if (t2.basetype = btSet) and (t1.Name = 'TVARIANTARRAY') and ((cmd = otSub) or (cmd = otMul)) then
+ Result := t2
+ else
+ if ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) and (
+ ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) or
+ (isIntRealType(t1.BaseType))) then
+ Result := t2
+ else if IsIntType(t1.BaseType) and IsIntType(t2.BaseType) then
+ Result := t1
+ else if IsIntRealType(t1.BaseType) and
+ IsIntRealType(t2.BaseType) then
+ begin
+ if IsRealType(t1.BaseType) then
+ Result := t1
+ else
+ Result := t2;
+ end
+ else
+ Result := nil;
+ end;
+ otAnd, otOr, otXor: {and,or,xor}
+ begin
+ if ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) and (
+ ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) or
+ (isIntType(t2.BaseType))) then
+ Result := t1
+ else
+ if ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) and (
+ ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) or
+ (isIntType(t1.BaseType))) then
+ Result := t2
+ else if IsIntType(t1.BaseType) and IsIntType(t2.BaseType) then
+ Result := t1
+ else if (IsBoolean(t1)) and ((t2 = t1) or ((t2.BaseType = btVariant)
+ or (t2.BaseType = btNotificationVariant))) then
+ begin
+ Result := t1;
+ if ((p1.ClassType = TPSValueData) or (p2.ClassType = TPSValueData)) then
+ begin
+ if cmd = otAnd then {and}
+ begin
+ if p1.ClassType = TPSValueData then
+ begin
+ if (TPSValueData(p1).FData^.tu8 <> 0) then
+ begin
+ with MakeWarning('', ewIsNotNeeded, '"True and"') do
+ begin
+ FRow := p1.Row;
+ FCol := p1.Col;
+ FPosition := p1.Pos;
+ end;
+ end else
+ begin
+ with MakeWarning('', ewCalculationAlwaysEvaluatesTo, 'False') do
+ begin
+ FRow := p1.Row;
+ FCol := p1.Col;
+ FPosition := p1.Pos;
+ end;
+ end;
+ end else begin
+ if (TPSValueData(p2).Data.tu8 <> 0) then
+ begin
+ with MakeWarning('', ewIsNotNeeded, '"and True"') do
+ begin
+ FRow := p1.Row;
+ FCol := p1.Col;
+ FPosition := p1.Pos;
+ end;
+ end
+ else
+ begin
+ with MakeWarning('', ewCalculationAlwaysEvaluatesTo, 'False') do
+ begin
+ FRow := p1.Row;
+ FCol := p1.Col;
+ FPosition := p1.Pos;
+ end;
+ end;
+ end;
+ end else if cmd = otOr then {or}
+ begin
+ if p1.ClassType = TPSValueData then
+ begin
+ if (TPSValueData(p1).Data.tu8 <> 0) then
+ begin
+ with MakeWarning('', ewCalculationAlwaysEvaluatesTo, 'True') do
+ begin
+ FRow := p1.Row;
+ FCol := p1.Col;
+ FPosition := p1.Pos;
+ end;
+ end
+ else
+ begin
+ with MakeWarning('', ewIsNotNeeded, '"False or"') do
+ begin
+ FRow := p1.Row;
+ FCol := p1.Col;
+ FPosition := p1.Pos;
+ end;
+ end
+ end else begin
+ if (TPSValueData(p2).Data.tu8 <> 0) then
+ begin
+ with MakeWarning('', ewCalculationAlwaysEvaluatesTo, 'True') do
+ begin
+ FRow := p1.Row;
+ FCol := p1.Col;
+ FPosition := p1.Pos;
+ end;
+ end
+ else
+ begin
+ with MakeWarning('', ewIsNotNeeded, '"or False"') do
+ begin
+ FRow := p1.Row;
+ FCol := p1.Col;
+ FPosition := p1.Pos;
+ end;
+ end
+ end;
+ end;
+ end;
+ end else
+ Result := nil;
+ end;
+ otMod, otShl, otShr: {mod,shl,shr}
+ begin
+ if ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) and (
+ ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) or
+ (isIntType(t2.BaseType))) then
+ Result := t1
+ else
+ if ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) and (
+ ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) or
+ (isIntType(t1.BaseType))) then
+ Result := t2
+ else if IsIntType(t1.BaseType) and IsIntType(t2.BaseType) then
+ Result := t1
+ else
+ Result := nil;
+ end;
+ otGreater, otLess, otGreaterEqual, otLessEqual: { >=, <=, >, <}
+ begin
+ if ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) and (
+ ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) or
+ (t2.BaseType = btString) or
+ (t2.BaseType = btPchar) or
+ (t2.BaseType = btChar) or
+ (isIntRealType(t2.BaseType))) then
+ Result := FDefaultBoolType
+ else if ((t1.BaseType = btSet) and (t2.BaseType = btSet)) and (t1 = t2) and ((cmd = otGreaterEqual) or (cmd = otLessEqual)) then
+ Result := FDefaultBoolType
+ else
+ if ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) and (
+ ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) or
+ (t1.BaseType = btString) or
+ (t1.BaseType = btPchar) or
+ (t1.BaseType = btChar) or
+ (isIntRealType(t1.BaseType))) then
+ Result := FDefaultBoolType
+ else if IsIntType(t1.BaseType) and IsIntType(t2.BaseType) then
+ Result := FDefaultBoolType
+ else if IsIntRealType(t1.BaseType) and
+ IsIntRealType(t2.BaseType) then
+ Result := FDefaultBoolType
+ else if
+ ((t1.BaseType = btString) or (t1.BaseType = btChar) {$IFNDEF PS_NOWIDESTRING} or (t1.BaseType = btWideString) or (t1.BaseType = btWideChar) or (t1.BaseType = btUnicodestring){$ENDIF}) and
+ ((t2.BaseType = btString) or (t2.BaseType = btChar) {$IFNDEF PS_NOWIDESTRING} or (t2.BaseType = btWideString) or (t2.BaseType = btWideChar) or (t2.BaseType = btUnicodestring){$ENDIF}) then
+ Result := FDefaultBoolType
+ else if ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) or ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) then
+ Result := FDefaultBoolType
+ else
+ Result := nil;
+ end;
+ otEqual, otNotEqual: {=, <>}
+ begin
+ if ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) and (
+ ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) or
+ (t2.BaseType = btString) or
+ (t2.BaseType = btPchar) or
+ (t2.BaseType = btChar) or
+ (isIntRealType(t2.BaseType))) then
+ Result := FDefaultBoolType
+ else if ((t1.BaseType = btSet) and (t2.BaseType = btSet)) and (t1 = t2) then
+ Result := FDefaultBoolType
+ else
+ if ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) and (
+ ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) or
+ (t1.BaseType = btString) or
+ (t1.BaseType = btPchar) or
+ (t1.BaseType = btChar) or
+ (isIntRealType(t1.BaseType))) then
+ Result := FDefaultBoolType
+ else if IsIntType(t1.BaseType) and IsIntType(t2.BaseType) then
+ Result := FDefaultBoolType
+ else if IsIntRealType(t1.BaseType) and
+ IsIntRealType(t2.BaseType) then
+ Result := FDefaultBoolType
+ else if
+ ((t1.BaseType = btString) or (t1.BaseType = btChar) {$IFNDEF PS_NOWIDESTRING} or (t1.BaseType = btWideString) or (t1.BaseType = btWideChar) or (t1.BaseType = btUnicodestring){$ENDIF}) and
+ ((t2.BaseType = btString) or (t2.BaseType = btChar) {$IFNDEF PS_NOWIDESTRING} or (t2.BaseType = btWideString) or (t2.BaseType = btWideChar) or (t2.BaseType = btUnicodestring){$ENDIF}) then
+ Result := FDefaultBoolType
+ else if (t1.basetype = btSet) and (t2.Name = 'TVARIANTARRAY') then
+ Result := FDefaultBoolType
+ else if (t2.basetype = btSet) and (t1.Name = 'TVARIANTARRAY') then
+ Result := FDefaultBoolType
+ else if (t1.BaseType = btEnum) and (t1 = t2) then
+ Result := FDefaultBoolType
+ else if (t1.BaseType = btClass) and (t2.BaseType = btClass) then
+ Result := FDefaultBoolType
+ else if ((t1.BaseType = btVariant) or (t1.BaseType = btNotificationVariant)) or ((t2.BaseType = btVariant) or (t2.BaseType = btNotificationVariant)) then
+ Result := FDefaultBoolType
+ else Result := nil;
+ end;
+ otIn:
+ begin
+ if (t2.Name = 'TVARIANTARRAY') then
+ Result := FDefaultBoolType
+ else
+ if (t2.BaseType = btSet) and (TPSSetType(t2).SetType = t1) then
+ Result := FDefaultBoolType
+ else
+ Result := nil;
+ end;
+ otIs:
+ begin
+ if t2.BaseType = btType then
+ begin
+ Result := FDefaultBoolType
+ end else
+ Result := nil;
+ end;
+ otAs:
+ begin
+ if t2.BaseType = btType then
+ begin
+ Result := at2ut(TPSValueData(p2).Data.ttype);
+ end else
+ Result := nil;
+ end;
+ else
+ Result := nil;
+ end;
+ end;
+
+
+ function ReadTerm: TPSValue;
+ var
+ F1, F2: TPSValue;
+ F: TPSBinValueOp;
+ Token: TPSPasToken;
+ Op: TPSBinOperatorType;
+ begin
+ F1 := ReadFactor;
+ if F1 = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ while FParser.CurrTokenID in [CSTI_Multiply, CSTI_Divide, CSTII_Div, CSTII_Mod, CSTII_And, CSTII_Shl, CSTII_Shr, CSTII_As] do
+ begin
+ Token := FParser.CurrTokenID;
+ FParser.Next;
+ F2 := ReadFactor;
+ if f2 = nil then
+ begin
+ f1.Free;
+ Result := nil;
+ exit;
+ end;
+ case Token of
+ CSTI_Multiply: Op := otMul;
+ CSTII_div, CSTI_Divide: Op := otDiv;
+ CSTII_mod: Op := otMod;
+ CSTII_and: Op := otAnd;
+ CSTII_shl: Op := otShl;
+ CSTII_shr: Op := otShr;
+ CSTII_As: Op := otAs;
+ else
+ Op := otAdd;
+ end;
+ F := TPSBinValueOp.Create;
+ f.Val1 := F1;
+ f.Val2 := F2;
+ f.Operator := Op;
+ f.aType := GetResultType(F1, F2, Op);
+ if f.aType = nil then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ f.Free;
+ Result := nil;
+ exit;
+ end;
+ f1 := f;
+ end;
+ Result := F1;
+ end; // ReadTerm
+
+ function ReadSimpleExpression: TPSValue;
+ var
+ F1, F2: TPSValue;
+ F: TPSBinValueOp;
+ Token: TPSPasToken;
+ Op: TPSBinOperatorType;
+ begin
+ F1 := ReadTerm;
+ if F1 = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ while FParser.CurrTokenID in [CSTI_Plus, CSTI_Minus, CSTII_Or, CSTII_Xor] do
+ begin
+ Token := FParser.CurrTokenID;
+ FParser.Next;
+ F2 := ReadTerm;
+ if f2 = nil then
+ begin
+ f1.Free;
+ Result := nil;
+ exit;
+ end;
+ case Token of
+ CSTI_Plus: Op := otAdd;
+ CSTI_Minus: Op := otSub;
+ CSTII_or: Op := otOr;
+ CSTII_xor: Op := otXor;
+ else
+ Op := otAdd;
+ end;
+ F := TPSBinValueOp.Create;
+ f.Val1 := F1;
+ f.Val2 := F2;
+ f.Operator := Op;
+ f.aType := GetResultType(F1, F2, Op);
+ if f.aType = nil then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ f.Free;
+ Result := nil;
+ exit;
+ end;
+ f1 := f;
+ end;
+ Result := F1;
+ end; // ReadSimpleExpression
+
+
+ function ReadExpression: TPSValue;
+ var
+ F1, F2: TPSValue;
+ F: TPSBinValueOp;
+ Token: TPSPasToken;
+ Op: TPSBinOperatorType;
+ begin
+ F1 := ReadSimpleExpression;
+ if F1 = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ while FParser.CurrTokenID in [ CSTI_GreaterEqual, CSTI_LessEqual, CSTI_Greater, CSTI_Less, CSTI_Equal, CSTI_NotEqual, CSTII_in, CSTII_is] do
+ begin
+ Token := FParser.CurrTokenID;
+ FParser.Next;
+ F2 := ReadSimpleExpression;
+ if f2 = nil then
+ begin
+ f1.Free;
+ Result := nil;
+ exit;
+ end;
+ case Token of
+ CSTI_GreaterEqual: Op := otGreaterEqual;
+ CSTI_LessEqual: Op := otLessEqual;
+ CSTI_Greater: Op := otGreater;
+ CSTI_Less: Op := otLess;
+ CSTI_Equal: Op := otEqual;
+ CSTI_NotEqual: Op := otNotEqual;
+ CSTII_in: Op := otIn;
+ CSTII_is: Op := otIs;
+ else
+ Op := otAdd;
+ end;
+ F := TPSBinValueOp.Create;
+ f.Val1 := F1;
+ f.Val2 := F2;
+ f.Operator := Op;
+ f.aType := GetResultType(F1, F2, Op);
+ if f.aType = nil then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ f.Free;
+ Result := nil;
+ exit;
+ end;
+ f1 := f;
+ end;
+ Result := F1;
+ end; // ReadExpression
+
+ function TryEvalConst(var P: TPSValue): Boolean;
+ var
+ preplace: TPSValue;
+ begin
+ if p is TPSBinValueOp then
+ begin
+ if not (TryEvalConst(TPSBinValueOp(p).FVal1) and TryEvalConst(TPSBinValueOp(p).FVal2)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ if (TPSBinValueOp(p).FVal1.ClassType = TPSValueData) and (TPSBinValueOp(p).FVal2.ClassType = TPSValueData) then
+ begin
+ if not PreCalc(True, 0, TPSValueData(TPSBinValueOp(p).Val1).Data, 0, TPSValueData(TPSBinValueOp(p).Val2).Data, TPSBinValueOp(p).Operator, p.Pos, p.Row, p.Col) then
+ begin
+ Result := False;
+ exit;
+ end;
+ preplace := TPSValueData.Create;
+ preplace.Pos := p.Pos;
+ preplace.Row := p.Row;
+ preplace.Col := p.Col;
+ TPSValueData(preplace).Data := TPSValueData(TPSBinValueOp(p).Val1).Data;
+ TPSValueData(TPSBinValueOp(p).Val1).Data := nil;
+ p.Free;
+ p := preplace;
+ end;
+ end else if p is TPSUnValueOp then
+ begin
+ if not TryEvalConst(TPSUnValueOp(p).FVal1) then
+ begin
+ Result := False;
+ exit;
+ end;
+ if TPSUnValueOp(p).FVal1.ClassType = TPSValueData then
+ begin
+//
+ case TPSUnValueOp(p).Operator of
+ otNot:
+ begin
+ case TPSValueData(TPSUnValueOp(p).FVal1).Data^.FType.BaseType of
+ btEnum:
+ begin
+ if IsBoolean(TPSValueData(TPSUnValueOp(p).FVal1).Data^.FType) then
+ begin
+ TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8 := (not TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8) and 1;
+ end else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ exit;
+ end;
+ end;
+ btU8: TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8 := not TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8;
+ btU16: TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16 := not TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16;
+ btU32: TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu32 := not TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu32;
+ bts8: TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts8 := not TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts8;
+ bts16: TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts16 := not TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts16;
+ bts32: TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts32 := not TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts32;
+ {$IFNDEF PS_NOINT64}
+ bts64: TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64 := not TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64;
+ {$ENDIF}
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ exit;
+ end;
+ end;
+ preplace := TPSUnValueOp(p).Val1;
+ TPSUnValueOp(p).Val1 := nil;
+ p.Free;
+ p := preplace;
+ end;
+ otMinus:
+ begin
+ case TPSValueData(TPSUnValueOp(p).FVal1).Data^.FType.BaseType of
+ btU8: TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8 := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8;
+ btU16: TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16 := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16;
+ btU32: TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu32 := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu32;
+ bts8: TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts8 := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts8;
+ bts16: TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts16 := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts16;
+ bts32: TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts32 := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts32;
+ {$IFNDEF PS_NOINT64}
+ bts64: TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64 := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64;
+ {$ENDIF}
+ btSingle: TPSValueData(TPSUnValueOp(p).FVal1).Data^.tsingle := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.tsingle;
+ btDouble: TPSValueData(TPSUnValueOp(p).FVal1).Data^.tdouble := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.tdouble;
+ btExtended: TPSValueData(TPSUnValueOp(p).FVal1).Data^.textended := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.textended;
+ btCurrency: TPSValueData(TPSUnValueOp(p).FVal1).Data^.tcurrency := -TPSValueData(TPSUnValueOp(p).FVal1).Data^.tcurrency;
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ exit;
+ end;
+ end;
+ preplace := TPSUnValueOp(p).Val1;
+ TPSUnValueOp(p).Val1 := nil;
+ p.Free;
+ p := preplace;
+ end;
+ otCast:
+ begin
+ preplace := TPSValueData.Create;
+ TPSValueData(preplace).Data := NewVariant(TPSUnValueOp(p).FType);
+ case TPSUnValueOp(p).FType.BaseType of
+ btU8:
+ begin
+ case TPSValueData(TPSUnValueOp(p).FVal1).Data.Ftype.basetype of
+ btchar: TPSValueData(preplace).Data.tu8 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btwidechar: TPSValueData(preplace).Data.tu8 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.twidechar);
+ {$ENDIF}
+ btU8: TPSValueData(preplace).Data.tu8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8;
+ btS8: TPSValueData(preplace).Data.tu8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS8;
+ btU16: TPSValueData(preplace).Data.tu8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16;
+ btS16: TPSValueData(preplace).Data.tu8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS16;
+ btU32: TPSValueData(preplace).Data.tu8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tU32;
+ btS32: TPSValueData(preplace).Data.tu8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS32;
+ {$IFNDEF PS_NOINT64}
+ btS64: TPSValueData(preplace).Data.tu8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64;
+ {$ENDIF}
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ preplace.Free;
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ btS8:
+ begin
+ case TPSValueData(TPSUnValueOp(p).FVal1).Data.Ftype.basetype of
+ btchar: TPSValueData(preplace).Data.ts8 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btwidechar: TPSValueData(preplace).Data.ts8 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.twidechar);
+ {$ENDIF}
+ btU8: TPSValueData(preplace).Data.ts8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8;
+ btS8: TPSValueData(preplace).Data.ts8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS8;
+ btU16: TPSValueData(preplace).Data.ts8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16;
+ btS16: TPSValueData(preplace).Data.ts8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS16;
+ btU32: TPSValueData(preplace).Data.ts8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tU32;
+ btS32: TPSValueData(preplace).Data.ts8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS32;
+ {$IFNDEF PS_NOINT64}
+ btS64: TPSValueData(preplace).Data.ts8 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64;
+ {$ENDIF}
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ preplace.Free;
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ btU16:
+ begin
+ case TPSValueData(TPSUnValueOp(p).FVal1).Data.Ftype.basetype of
+ btchar: TPSValueData(preplace).Data.tu16 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btwidechar: TPSValueData(preplace).Data.tu16 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.twidechar);
+ {$ENDIF}
+ btU8: TPSValueData(preplace).Data.tu16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8;
+ btS8: TPSValueData(preplace).Data.tu16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS8;
+ btU16: TPSValueData(preplace).Data.ts16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16;
+ btS16: TPSValueData(preplace).Data.tu16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS16;
+ btU32: TPSValueData(preplace).Data.tu16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tU32;
+ btS32: TPSValueData(preplace).Data.tu16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS32;
+ {$IFNDEF PS_NOINT64}
+ btS64: TPSValueData(preplace).Data.tu16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64;
+ {$ENDIF}
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ preplace.Free;
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ bts16:
+ begin
+ case TPSValueData(TPSUnValueOp(p).FVal1).Data.Ftype.basetype of
+ btchar: TPSValueData(preplace).Data.ts16 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btwidechar: TPSValueData(preplace).Data.ts16 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.twidechar);
+ {$ENDIF}
+ btU8: TPSValueData(preplace).Data.ts16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8;
+ btS8: TPSValueData(preplace).Data.ts16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS8;
+ btU16: TPSValueData(preplace).Data.ts16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16;
+ btS16: TPSValueData(preplace).Data.ts16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS16;
+ btU32: TPSValueData(preplace).Data.ts16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tU32;
+ btS32: TPSValueData(preplace).Data.ts16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS32;
+ {$IFNDEF PS_NOINT64}
+ btS64: TPSValueData(preplace).Data.ts16 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64;
+ {$ENDIF}
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ preplace.Free;
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ btU32:
+ begin
+ case TPSValueData(TPSUnValueOp(p).FVal1).Data.Ftype.basetype of
+ btchar: TPSValueData(preplace).Data.tu32 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btwidechar: TPSValueData(preplace).Data.tu32 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.twidechar);
+ {$ENDIF}
+ btU8: TPSValueData(preplace).Data.tu32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8;
+ btS8: TPSValueData(preplace).Data.tu32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS8;
+ btU16: TPSValueData(preplace).Data.tu32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16;
+ btS16: TPSValueData(preplace).Data.tu32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS16;
+ btU32: TPSValueData(preplace).Data.tu32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tU32;
+ btS32: TPSValueData(preplace).Data.tu32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS32;
+ {$IFNDEF PS_NOINT64}
+ btS64: TPSValueData(preplace).Data.tu32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64;
+ {$ENDIF}
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ preplace.Free;
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ btS32:
+ begin
+ case TPSValueData(TPSUnValueOp(p).FVal1).Data.Ftype.basetype of
+ btchar: TPSValueData(preplace).Data.ts32 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btwidechar: TPSValueData(preplace).Data.ts32 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.twidechar);
+ {$ENDIF}
+ btU8: TPSValueData(preplace).Data.ts32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8;
+ btS8: TPSValueData(preplace).Data.ts32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS8;
+ btU16: TPSValueData(preplace).Data.ts32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16;
+ btS16: TPSValueData(preplace).Data.ts32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS16;
+ btU32: TPSValueData(preplace).Data.ts32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tU32;
+ btS32: TPSValueData(preplace).Data.ts32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS32;
+ {$IFNDEF PS_NOINT64}
+ btS64: TPSValueData(preplace).Data.tu32 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64;
+ {$ENDIF}
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ preplace.Free;
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ {$IFNDEF PS_NOINT64}
+ btS64:
+ begin
+ case TPSValueData(TPSUnValueOp(p).FVal1).Data.Ftype.basetype of
+ btchar: TPSValueData(preplace).Data.ts64 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tchar);
+ {$IFNDEF PS_NOWIDESTRING}
+ btwidechar: TPSValueData(preplace).Data.ts64 := ord(TPSValueData(TPSUnValueOp(p).FVal1).Data^.twidechar);
+ {$ENDIF}
+ btU8: TPSValueData(preplace).Data.ts64 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8;
+ btS8: TPSValueData(preplace).Data.ts64 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS8;
+ btU16: TPSValueData(preplace).Data.ts64 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16;
+ btS16: TPSValueData(preplace).Data.ts64 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS16;
+ btU32: TPSValueData(preplace).Data.ts64 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tU32;
+ btS32: TPSValueData(preplace).Data.ts64 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS32;
+ btS64: TPSValueData(preplace).Data.ts64 := TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64;
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ preplace.Free;
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ {$ENDIF}
+ btChar:
+ begin
+ case TPSValueData(TPSUnValueOp(p).FVal1).Data.Ftype.basetype of
+ btchar: TPSValueData(preplace).Data.tchar := TPSValueData(TPSUnValueOp(p).FVal1).Data^.tchar;
+ btU8: TPSValueData(preplace).Data.tchar := tbtchar(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu8);
+ btS8: TPSValueData(preplace).Data.tchar := tbtchar(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS8);
+ btU16: TPSValueData(preplace).Data.tchar := tbtchar(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tu16);
+ btS16: TPSValueData(preplace).Data.tchar := tbtchar(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS16);
+ btU32: TPSValueData(preplace).Data.tchar := tbtchar(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tU32);
+ btS32: TPSValueData(preplace).Data.tchar := tbtchar(TPSValueData(TPSUnValueOp(p).FVal1).Data^.tS32);
+ {$IFNDEF PS_NOINT64}
+ btS64: TPSValueData(preplace).Data.tchar := tbtchar(TPSValueData(TPSUnValueOp(p).FVal1).Data^.ts64);
+ {$ENDIF}
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ preplace.Free;
+ exit;
+ end;
+ end;
+ end;
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ preplace.Free;
+ exit;
+ end;
+ end;
+ p.Free;
+ p := preplace;
+ end;
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ exit;
+ end;
+ end; // case
+ end; // if
+ end;
+ Result := True;
+ end;
+
+ var
+ Val: TPSValue;
+
+begin
+ Val := ReadExpression;
+ if Val = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ if not TryEvalConst(Val) then
+ begin
+ Val.Free;
+ Result := nil;
+ exit;
+ end;
+ Result := Val;
+ end;
+
+ function ReadParameters(IsProperty: Boolean; Dest: TPSParameters): Boolean;
+ var
+ sr,cr: TPSPasToken;
+ begin
+ if IsProperty then
+ begin
+ sr := CSTI_OpenBlock;
+ cr := CSTI_CloseBlock;
+ end else begin
+ sr := CSTI_OpenRound;
+ cr := CSTI_CloseRound;
+ end;
+ if FParser.CurrTokenId = sr then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenId = cr then
+ begin
+ FParser.Next;
+ Result := True;
+ exit;
+ end;
+ end else
+ begin
+ result := True;
+ exit;
+ end;
+ repeat
+ with Dest.Add do
+ begin
+ Val := calc(CSTI_CloseRound);
+ if Val = nil then
+ begin
+ result := false;
+ exit;
+ end;
+ end;
+ if FParser.CurrTokenId = cr then
+ begin
+ FParser.Next;
+ Break;
+ end;
+ if FParser.CurrTokenId <> CSTI_Comma then
+ begin
+ MakeError('', ecCommaExpected, '');
+ Result := false;
+ exit;
+ end; {if}
+ FParser.Next;
+ until False;
+ Result := true;
+ end;
+
+ function ReadProcParameters(ProcNo: Cardinal; FSelf: TPSValue): TPSValue;
+ var
+ Decl: TPSParametersDecl;
+ begin
+ if TPSProcedure(FProcs[ProcNo]).ClassType = TPSInternalProcedure then
+ Decl := TPSInternalProcedure(FProcs[ProcNo]).Decl
+ else
+ Decl := TPSExternalProcedure(FProcs[ProcNo]).RegProc.Decl;
+ UseProc(Decl);
+ Result := TPSValueProcNo.Create;
+ TPSValueProcNo(Result).ProcNo := ProcNo;
+ TPSValueProcNo(Result).ResultType := Decl.Result;
+ with TPSValueProcNo(Result) do
+ begin
+ SetParserPos(FParser);
+ Parameters := TPSParameters.Create;
+ if FSelf <> nil then
+ begin
+ Parameters.Add;
+ end;
+ end;
+
+ if not ReadParameters(False, TPSValueProc(Result).Parameters) then
+ begin
+ FSelf.Free;
+ Result.Free;
+ Result := nil;
+ exit;
+ end;
+
+ if not ValidateParameters(BlockInfo, TPSValueProc(Result).Parameters, Decl) then
+ begin
+ FSelf.Free;
+ Result.Free;
+ Result := nil;
+ exit;
+ end;
+ if FSelf <> nil then
+ begin
+ with TPSValueProcNo(Result).Parameters[0] do
+ begin
+ Val := FSelf;
+ ExpectedType := GetTypeNo(BlockInfo, FSelf);
+ end;
+ end;
+ end;
+ {$IFNDEF PS_NOIDISPATCH}
+
+ function ReadIDispatchParameters(const ProcName: tbtString; aVariantType: TPSVariantType; FSelf: TPSValue): TPSValue;
+ var
+ Par: TPSParameters;
+ PropSet: Boolean;
+ i: Longint;
+ Temp: TPSValue;
+ begin
+ Par := TPSParameters.Create;
+ try
+ if not ReadParameters(FParser.CurrTokenID = CSTI_OpenBlock, Par) then
+ begin
+ FSelf.Free;
+ Result := nil;
+ exit;
+ end;
+
+ if FParser.CurrTokenID = CSTI_Assignment then
+ begin
+ FParser.Next;
+ PropSet := True;
+ Temp := calc(CSTI_SemiColon);
+ if temp = nil then
+ begin
+ FSelf.Free;
+ Result := nil;
+ exit;
+ end;
+ with par.Add do
+ begin
+ FValue := Temp;
+ end;
+ end else
+ begin
+ PropSet := False;
+ end;
+
+ Result := TPSValueProcNo.Create;
+ TPSValueProcNo(Result).ResultType := aVariantType;
+ with TPSValueProcNo(Result) do
+ begin
+ SetParserPos(FParser);
+ Parameters := TPSParameters.Create;
+ if FSelf <> nil then
+ begin
+ with Parameters.Add do
+ begin
+ Val := FSelf;
+ ExpectedType := aVariantType.GetDynIvokeSelfType(Self);
+ end;
+ with Parameters.Add do
+ begin
+ Val := TPSValueData.Create;
+ TPSValueData(Val).Data := NewVariant(FDefaultBoolType);
+ TPSValueData(Val).Data.tu8 := Ord(PropSet);
+ ExpectedType := FDefaultBoolType;
+ end;
+
+ with Parameters.Add do
+ begin
+ Val := TPSValueData.Create;
+ TPSValueData(Val).Data := NewVariant(FindBaseType(btString));
+ tbtString(TPSValueData(Val).data.tString) := Procname;
+ ExpectedType := FindBaseType(btString);
+ end;
+
+ with Parameters.Add do
+ begin
+ val := TPSValueArray.Create;
+ ExpectedType := aVariantType.GetDynInvokeParamType(Self);
+ temp := Val;
+ end;
+ for i := 0 to Par.Count -1 do
+ begin
+ TPSValueArray(Temp).Add(par.Item[i].Val);
+ par.Item[i].val := nil;
+ end;
+ end;
+ end;
+ TPSValueProcNo(Result).ProcNo := aVariantType.GetDynInvokeProcNo(Self, ProcName, TPSValueProcNo(Result).Parameters);
+ finally
+ Par.Free;
+ end;
+
+ end;
+
+ {$ENDIF}
+
+ function ReadVarParameters(ProcNoVar: TPSValue): TPSValue;
+ var
+ Decl: TPSParametersDecl;
+ begin
+ Decl := TPSProceduralType(GetTypeNo(BlockInfo, ProcnoVar)).ProcDef;
+ UseProc(Decl);
+
+ Result := TPSValueProcVal.Create;
+
+ with TPSValueProcVal(Result) do
+ begin
+ ResultType := Decl.Result;
+ ProcNo := ProcNoVar;
+ Parameters := TPSParameters.Create;
+ end;
+
+ if not ReadParameters(False, TPSValueProc(Result).Parameters) then
+ begin
+ Result.Free;
+ Result := nil;
+ exit;
+ end;
+
+ if not ValidateParameters(BlockInfo, TPSValueProc(Result).Parameters, Decl) then
+ begin
+ Result.Free;
+ Result := nil;
+ exit;
+ end;
+ end;
+
+
+ function WriteCalculation(InData, OutReg: TPSValue): Boolean;
+
+ function CheckOutreg(Where, Outreg: TPSValue; aRoot: Boolean): Boolean;
+ var
+ i: Longint;
+ begin
+ Result := False;
+ if Outreg is TPSValueReplace
+ then Outreg:=TPSValueReplace(Outreg).OldValue;
+ if Where is TPSValueVar then begin
+ if TPSValueVar(Where).GetRecCount > 0 then result := true;
+ if SAmeReg(Where, OutReg) and not aRoot then
+ result := true;
+ end else
+ if Where.ClassType = TPSUnValueOp then
+ begin
+ if CheckOutReg(TPSUnValueOp(Where).Val1, OutReg, aRoot) then
+ Result := True;
+ end else if Where.ClassType = TPSBinValueOp then
+ begin
+ if CheckOutreg(TPSBinValueOp(Where).Val1, OutReg, aRoot) or CheckOutreg(TPSBinValueOp(Where).Val2, OutReg, False) then
+ Result := True;
+ end else if Where is TPSValueVar then
+ begin
+ if SameReg(Where, OutReg) then
+ Result := True;
+ end else if Where is TPSValueProc then
+ begin
+ for i := 0 to TPSValueProc(Where).Parameters.Count -1 do
+ begin
+ if Checkoutreg(TPSValueProc(Where).Parameters[i].Val, Outreg, false) then
+ begin
+ Result := True;
+ break;
+ end;
+ end;
+ end;
+ end;
+ begin
+ if not CheckCompatType(Outreg, InData) then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ exit;
+ end;
+ if SameReg(OutReg, InData) then
+ begin
+ Result := True;
+ exit;
+ end;
+ if InData is TPSValueProc then
+ begin
+ Result := _ProcessFunction(TPSValueProc(indata), OutReg)
+ end else begin
+ if not PreWriteOutRec(OutReg, nil) then
+ begin
+ Result := False;
+ exit;
+ end;
+ if (not CheckOutReg(InData, OutReg, true)) and (InData is TPSBinValueOp) or (InData is TPSUnValueOp) then
+ begin
+ if InData is TPSBinValueOp then
+ begin
+ if not DoBinCalc(TPSBinValueOp(InData), OutReg) then
+ begin
+ AfterWriteOutRec(OutReg);
+ Result := False;
+ exit;
+ end;
+ end else
+ begin
+ if not DoUnCalc(TPSUnValueOp(InData), OutReg) then
+ begin
+ AfterWriteOutRec(OutReg);
+ Result := False;
+ exit;
+ end;
+ end;
+ end else if (InData is TPSBinValueOp) and (not CheckOutReg(TPSBinValueOp(InData).Val2, OutReg, false)) then
+ begin
+ if not DoBinCalc(TPSBinValueOp(InData), OutReg) then
+ begin
+ AfterWriteOutRec(OutReg);
+ Result := False;
+ exit;
+ end;
+ end else begin
+ if not PreWriteOutRec(InData, GetTypeNo(BlockInfo, OutReg)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ BlockWriteByte(BlockInfo, CM_A);
+ if not (WriteOutRec(OutReg, False) and WriteOutRec(InData, True)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ AfterWriteOutRec(InData);
+ end;
+ AfterWriteOutRec(OutReg);
+ Result := True;
+ end;
+ end; {WriteCalculation}
+
+
+ function _ProcessFunction(ProcCall: TPSValueProc; ResultRegister: TPSValue): Boolean;
+ var
+ res: TPSType;
+ tmp: TPSParameter;
+ lTv: TPSValue;
+ resreg: TPSValue;
+ l: Longint;
+
+ function Cleanup: Boolean;
+ var
+ i: Longint;
+ begin
+ for i := 0 to ProcCall.Parameters.Count -1 do
+ begin
+ if ProcCall.Parameters[i].TempVar <> nil then
+ ProcCall.Parameters[i].TempVar.Free;
+ ProcCall.Parameters[i].TempVar := nil;
+ end;
+ if ProcCall is TPSValueProcVal then
+ AfterWriteOutRec(TPSValueProcVal(ProcCall).fProcNo);
+ if ResReg <> nil then
+ AfterWriteOutRec(resreg);
+ if ResReg <> nil then
+ begin
+ if ResReg <> ResultRegister then
+ begin
+ if ResultRegister <> nil then
+ begin
+ if not WriteCalculation(ResReg, ResultRegister) then
+ begin
+ Result := False;
+ resreg.Free;
+ exit;
+ end;
+ end;
+ resreg.Free;
+ end;
+ end;
+ Result := True;
+ end;
+
+ begin
+ Res := ProcCall.ResultType;
+ if ProcCall.ResultType = FAnyString then
+ begin
+ for l := ProcCall.Parameters.Count - 1 downto 0 do
+ begin
+ Tmp := ProcCall.Parameters[l];
+ if (Tmp.ParamMode <> pmOut) and (Tmp.ExpectedType = FAnyString) then
+ begin
+ Res := GetTypeNo(BlockInfo, tmp.Val);
+ Break;
+ end;
+ end;
+ end;
+ Result := False;
+ if (res = nil) and (ResultRegister <> nil) then
+ begin
+ MakeError('', ecNoResult, '');
+ exit;
+ end
+ else if (res <> nil) then
+ begin
+ if (ResultRegister = nil) or (Res <> GetTypeNo(BlockInfo, ResultRegister)) then
+ begin
+ resreg := AllocStackReg(res);
+
+ end else resreg := ResultRegister;
+ end
+ else
+ resreg := nil;
+ if ResReg <> nil then
+ begin
+ if not PreWriteOutRec(resreg, nil) then
+ begin
+ Cleanup;
+ exit;
+ end;
+ end;
+ if Proccall is TPSValueProcVal then
+ begin
+ if not PreWriteOutRec(TPSValueProcVal(ProcCall).fProcNo, nil) then
+ begin
+ Cleanup;
+ exit;
+ end;
+ end;
+ for l := ProcCall.Parameters.Count - 1 downto 0 do
+ begin
+ Tmp := ProcCall.Parameters[l];
+ if (Tmp.ParamMode <> pmIn) then
+ begin
+ if IsVarInCompatible(GetTypeNo(BlockInfo, tmp.Val), tmp.ExpectedType) then
+ begin
+ with MakeError('', ecTypeMismatch, '') do
+ begin
+ pos := tmp.Val.Pos;
+ row := tmp.Val.row;
+ col := tmp.Val.col;
+ end;
+ Cleanup;
+ exit;
+ end;
+ if Copy(tmp.ExpectedType.Name, 1, 10) = '!OPENARRAY' then begin
+ tmp.TempVar := AllocPointer(tmp.ExpectedType);
+ lTv := AllocStackReg(tmp.ExpectedType);
+ if not PreWriteOutRec(Tmp.FValue, nil) then
+ begin
+ cleanup;
+ exit;
+ end;
+ BlockWriteByte(BlockInfo, CM_A);
+ WriteOutRec(lTv, False);
+ WriteOutRec(Tmp.FValue, False);
+ AfterWriteOutRec(Tmp.FValue);
+
+ BlockWriteByte(BlockInfo, cm_sp);
+ WriteOutRec(tmp.TempVar, False);
+ WriteOutRec(lTv, False);
+
+ lTv.Free;
+// BlockWriteByte(BlockInfo, CM_PO); // pop the temp var
+
+ end else begin
+ tmp.TempVar := AllocPointer(GetTypeNo(BlockInfo, Tmp.FValue));
+ if not PreWriteOutRec(Tmp.FValue, nil) then
+ begin
+ cleanup;
+ exit;
+ end;
+ BlockWriteByte(BlockInfo, cm_sp);
+ WriteOutRec(tmp.TempVar, False);
+ WriteOutRec(Tmp.FValue, False);
+ AfterWriteOutRec(Tmp.FValue);
+ end;
+ end
+ else
+ begin
+ if (Tmp.ExpectedType = nil) or (Tmp.ExpectedType = FAnyString) then
+ Tmp.ExpectedType := GetTypeNo(BlockInfo, tmp.Val);
+ if Tmp.ExpectedType.BaseType = btPChar then
+ begin
+ Tmp.TempVar := AllocStackReg(at2ut(FindBaseType(btstring)))
+ end else
+ begin
+ Tmp.TempVar := AllocStackReg(Tmp.ExpectedType);
+ end;
+ if not WriteCalculation(Tmp.Val, Tmp.TempVar) then
+ begin
+ Cleanup;
+ exit;
+ end;
+ end;
+ end; {for}
+ if res <> nil then
+ begin
+ BlockWriteByte(BlockInfo, CM_PV);
+
+ if not WriteOutRec(resreg, False) then
+ begin
+ Cleanup;
+ MakeError('', ecInternalError, '00015');
+ exit;
+ end;
+ end;
+ if ProcCall is TPSValueProcVal then
+ begin
+ BlockWriteByte(BlockInfo, Cm_cv);
+ WriteOutRec(TPSValueProcVal(ProcCall).ProcNo, True);
+ end else begin
+ BlockWriteByte(BlockInfo, CM_C);
+ BlockWriteLong(BlockInfo, TPSValueProcNo(ProcCall).ProcNo);
+ end;
+ if res <> nil then
+ BlockWriteByte(BlockInfo, CM_PO);
+ if not Cleanup then
+ begin
+ Result := False;
+ exit;
+ end;
+ Result := True;
+ end; {ProcessVarFunction}
+
+ function HasInvalidJumps(StartPos, EndPos: Cardinal): Boolean;
+ var
+ I, J: Longint;
+ Ok: LongBool;
+ FLabelsInBlock: TIfStringList;
+ s: tbtString;
+ begin
+ FLabelsInBlock := TIfStringList.Create;
+ for i := 0 to BlockInfo.Proc.FLabels.Count -1 do
+ begin
+ s := BlockInfo.Proc.FLabels[I];
+ if (Cardinal((@s[1])^) >= StartPos) and (Cardinal((@s[1])^) <= EndPos) then
+ begin
+ Delete(s, 1, 8);
+ FLabelsInBlock.Add(s);
+ end;
+ end;
+ for i := 0 to BlockInfo.Proc.FGotos.Count -1 do
+ begin
+ s := BlockInfo.Proc.FGotos[I];
+ if (Cardinal((@s[1])^) >= StartPos) and (Cardinal((@s[1])^) <= EndPos) then
+ begin
+ Delete(s, 1, 4);
+ s := BlockInfo.Proc.FLabels[Cardinal((@s[1])^)];
+ Delete(s,1,8);
+ OK := False;
+ for J := 0 to FLabelsInBlock.Count -1 do
+ begin
+ if FLabelsInBlock[J] = s then
+ begin
+ Ok := True;
+ Break;
+ end;
+ end;
+ if not Ok then
+ begin
+ MakeError('', ecInvalidJump, '');
+ Result := True;
+ FLabelsInBlock.Free;
+ exit;
+ end;
+ end else begin
+ Delete(s, 1, 4);
+ s := BlockInfo.Proc.FLabels[Cardinal((@s[1])^)];
+ Delete(s,1,8);
+ OK := True;
+ for J := 0 to FLabelsInBlock.Count -1 do
+ begin
+ if FLabelsInBlock[J] = s then
+ begin
+ Ok := False;
+ Break;
+ end;
+ end;
+ if not Ok then
+ begin
+ MakeError('', ecInvalidJump, '');
+ Result := True;
+ FLabelsInBlock.Free;
+ exit;
+ end;
+ end;
+ end;
+ FLabelsInBlock.Free;
+ Result := False;
+ end;
+
+ function ProcessFor: Boolean;
+ { Process a for x := y to z do }
+ var
+ VariableVar: TPSValue;
+ TempBool,
+ InitVal,
+ finVal: TPSValue;
+ Block: TPSBlockInfo;
+ Backwards: Boolean;
+ FPos, NPos, EPos, RPos: Longint;
+ OldCO, OldBO: TPSList;
+ I: Longint;
+ iOldWithCount: Integer;
+ iOldTryCount: Integer;
+ iOldExFnlCount: Integer;
+ lType: TPSType;
+ begin
+ Debug_WriteLine(BlockInfo);
+ Result := False;
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ VariableVar := GetIdentifier(1);
+ if VariableVar = nil then
+ exit;
+ lType := GetTypeNo(BlockInfo, VariableVar);
+ if lType = nil then begin
+ MakeError('', ecTypeMismatch, '');
+ VariableVar.Free;
+ exit;
+ end;
+ case lType.BaseType of
+ btU8, btS8, btU16, btS16, btU32, btS32, {$IFNDEF PS_NOINT64} btS64, {$ENDIF} btVariant: ;
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ VariableVar.Free;
+ exit;
+ end;
+ end;
+ if FParser.CurrTokenId <> CSTI_Assignment then
+ begin
+ MakeError('', ecAssignmentExpected, '');
+ VariableVar.Free;
+ exit;
+ end;
+ FParser.Next;
+ InitVal := calc(CSTII_DownTo);
+ if InitVal = nil then
+ begin
+ VariableVar.Free;
+ exit;
+ end;
+ if FParser.CurrTokenId = CSTII_To then
+ Backwards := False
+ else if FParser.CurrTokenId = CSTII_DownTo then
+ Backwards := True
+ else
+ begin
+ MakeError('', ecToExpected, '');
+ VariableVar.Free;
+ InitVal.Free;
+ exit;
+ end;
+ FParser.Next;
+ finVal := calc(CSTII_do);
+ if finVal = nil then
+ begin
+ VariableVar.Free;
+ InitVal.Free;
+ exit;
+ end;
+ lType := GetTypeNo(BlockInfo, finVal);
+ if lType = nil then begin
+ MakeError('', ecTypeMismatch, '');
+ VariableVar.Free;
+ InitVal.Free;
+ exit;
+ end;
+ case lType.BaseType of
+ btVariant, btU8, btS8, btU16, btS16, btU32, btS32: ;
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ VariableVar.Free;
+ InitVal.Free;
+ exit;
+ end;
+ end;
+ if FParser.CurrTokenId <> CSTII_do then
+ begin
+ MakeError('', ecDoExpected, '');
+ finVal.Free;
+ InitVal.Free;
+ VariableVar.Free;
+ exit;
+ end;
+ FParser.Next;
+ if not WriteCalculation(InitVal, VariableVar) then
+ begin
+ VariableVar.Free;
+ InitVal.Free;
+ finVal.Free;
+ exit;
+ end;
+ InitVal.Free;
+ TempBool := AllocStackReg(at2ut(FDefaultBoolType));
+ NPos := Length(BlockInfo.Proc.Data);
+ if not (PreWriteOutRec(VariableVar, nil) and PreWriteOutRec(finVal, nil)) then
+ begin
+ TempBool.Free;
+ VariableVar.Free;
+ finVal.Free;
+ exit;
+ end;
+ BlockWriteByte(BlockInfo, CM_CO);
+ if Backwards then
+ begin
+ BlockWriteByte(BlockInfo, 0); { >= }
+ end
+ else
+ begin
+ BlockWriteByte(BlockInfo, 1); { <= }
+ end;
+ if not (WriteOutRec(TempBool, False) and WriteOutRec(VariableVar, True) and WriteOutRec(finVal, True)) then
+ begin
+ TempBool.Free;
+ VariableVar.Free;
+ finVal.Free;
+ exit;
+ end;
+ AfterWriteOutRec(finVal);
+ AfterWriteOutRec(VariableVar);
+ finVal.Free;
+ BlockWriteByte(BlockInfo, Cm_CNG);
+ EPos := Length(BlockInfo.Proc.Data);
+ BlockWriteLong(BlockInfo, $12345678);
+ WriteOutRec(TempBool, False);
+ RPos := Length(BlockInfo.Proc.Data);
+ OldCO := FContinueOffsets;
+ FContinueOffsets := TPSList.Create;
+ OldBO := FBreakOffsets;
+ FBreakOffsets := TPSList.Create;
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tOneLiner;
+
+ iOldWithCount := FWithCount;
+ FWithCount := 0;
+ iOldTryCount := FTryCount;
+ FTryCount := 0;
+ iOldExFnlCount := FExceptFinallyCount;
+ FExceptFinallyCount := 0;
+
+ if not ProcessSub(Block) then
+ begin
+ Block.Free;
+ TempBool.Free;
+ VariableVar.Free;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ exit;
+ end;
+ Block.Free;
+ FPos := Length(BlockInfo.Proc.Data);
+ if not PreWriteOutRec(VariableVar, nil) then
+ begin
+ TempBool.Free;
+ VariableVar.Free;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ exit;
+ end;
+ if Backwards then
+ BlockWriteByte(BlockInfo, cm_dec)
+ else
+ BlockWriteByte(BlockInfo, cm_inc);
+ if not WriteOutRec(VariableVar, False) then
+ begin
+ TempBool.Free;
+ VariableVar.Free;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ exit;
+ end;
+ AfterWriteOutRec(VariableVar);
+ BlockWriteByte(BlockInfo, Cm_G);
+ BlockWriteLong(BlockInfo, Longint(NPos - Length(BlockInfo.Proc.Data) - 4));
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[EPos + 1])^)) := Length(BlockInfo.Proc.Data) - RPos;
+ {$else}
+ Longint((@BlockInfo.Proc.Data[EPos + 1])^) := Length(BlockInfo.Proc.Data) - RPos;
+ {$endif}
+ for i := 0 to FBreakOffsets.Count -1 do
+ begin
+ EPos := IPointer(FBreakOffsets[I]);
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[EPos - 3])^)) := Length(BlockInfo.Proc.Data) - Longint(EPos);
+ {$else}
+ Longint((@BlockInfo.Proc.Data[EPos - 3])^) := Length(BlockInfo.Proc.Data) - Longint(EPos);
+ {$endif}
+ end;
+ for i := 0 to FContinueOffsets.Count -1 do
+ begin
+ EPos := IPointer(FContinueOffsets[I]);
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[EPos - 3])^)) := Longint(FPos) - Longint(EPos);
+ {$else}
+ Longint((@BlockInfo.Proc.Data[EPos - 3])^) := Longint(FPos) - Longint(EPos);
+ {$endif}
+ end;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ TempBool.Free;
+ VariableVar.Free;
+ if HasInvalidJumps(RPos, Length(BlockInfo.Proc.Data)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ Result := True;
+ end; {ProcessFor}
+
+ function ProcessWhile: Boolean;
+ var
+ vin, vout: TPSValue;
+ SPos, EPos: Cardinal;
+ OldCo, OldBO: TPSList;
+ I: Longint;
+ Block: TPSBlockInfo;
+
+ iOldWithCount: Integer;
+ iOldTryCount: Integer;
+ iOldExFnlCount: Integer;
+
+ begin
+ Result := False;
+ Debug_WriteLine(BlockInfo);
+ FParser.Next;
+ vout := calc(CSTII_do);
+ if vout = nil then
+ exit;
+ if FParser.CurrTokenId <> CSTII_do then
+ begin
+ vout.Free;
+ MakeError('', ecDoExpected, '');
+ exit;
+ end;
+ vin := AllocStackReg(at2ut(FDefaultBoolType));
+ SPos := Length(BlockInfo.Proc.Data); // start position
+ OldCo := FContinueOffsets;
+ FContinueOffsets := TPSList.Create;
+ OldBO := FBreakOffsets;
+ FBreakOffsets := TPSList.Create;
+ if not WriteCalculation(vout, vin) then
+ begin
+ vout.Free;
+ vin.Free;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+ exit;
+ end;
+ vout.Free;
+ FParser.Next; // skip DO
+ BlockWriteByte(BlockInfo, Cm_CNG); // only goto if expression is false
+ BlockWriteLong(BlockInfo, $12345678);
+ EPos := Length(BlockInfo.Proc.Data);
+ if not WriteOutRec(vin, False) then
+ begin
+ MakeError('', ecInternalError, '00017');
+ vin.Free;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+ exit;
+ end;
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tOneLiner;
+
+ iOldWithCount := FWithCount;
+ FWithCount := 0;
+ iOldTryCount := FTryCount;
+ FTryCount := 0;
+ iOldExFnlCount := FExceptFinallyCount;
+ FExceptFinallyCount := 0;
+
+ if not ProcessSub(Block) then
+ begin
+ Block.Free;
+ vin.Free;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ exit;
+ end;
+ Block.Free;
+ Debug_WriteLine(BlockInfo);
+ BlockWriteByte(BlockInfo, Cm_G);
+ BlockWriteLong(BlockInfo, Longint(SPos) - Length(BlockInfo.Proc.Data) - 4);
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[EPos - 3])^)) := Length(BlockInfo.Proc.Data) - Longint(EPos) - 5;
+ {$else}
+ Longint((@BlockInfo.Proc.Data[EPos - 3])^) := Length(BlockInfo.Proc.Data) - Longint(EPos) - 5;
+ {$endif}
+ for i := 0 to FBreakOffsets.Count -1 do
+ begin
+ EPos := Cardinal(FBreakOffsets[I]);
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[EPos - 3])^)) := Length(BlockInfo.Proc.Data) - Longint(EPos);
+ {$else}
+ Longint((@BlockInfo.Proc.Data[EPos - 3])^) := Length(BlockInfo.Proc.Data) - Longint(EPos);
+ {$endif}
+ end;
+ for i := 0 to FContinueOffsets.Count -1 do
+ begin
+ EPos := Cardinal(FContinueOffsets[I]);
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[EPos - 3])^)) := Longint(SPos) - Longint(EPos);
+ {$else}
+ Longint((@BlockInfo.Proc.Data[EPos - 3])^) := Longint(SPos) - Longint(EPos);
+ {$endif}
+ end;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ vin.Free;
+ if HasInvalidJumps(EPos, Length(BlockInfo.Proc.Data)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ Result := True;
+ end;
+
+ function ProcessRepeat: Boolean;
+ var
+ vin, vout: TPSValue;
+ CPos, SPos, EPos: Cardinal;
+ I: Longint;
+ OldCo, OldBO: TPSList;
+ Block: TPSBlockInfo;
+
+ iOldWithCount: Integer;
+ iOldTryCount: Integer;
+ iOldExFnlCount: Integer;
+
+ begin
+ Result := False;
+ Debug_WriteLine(BlockInfo);
+ FParser.Next;
+ OldCo := FContinueOffsets;
+ FContinueOffsets := TPSList.Create;
+ OldBO := FBreakOffsets;
+ FBreakOffsets := TPSList.Create;
+ vin := AllocStackReg(at2ut(FDefaultBoolType));
+ SPos := Length(BlockInfo.Proc.Data);
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tRepeat;
+
+ iOldWithCount := FWithCount;
+ FWithCount := 0;
+ iOldTryCount := FTryCount;
+ FTryCount := 0;
+ iOldExFnlCount := FExceptFinallyCount;
+ FExceptFinallyCount := 0;
+
+ if not ProcessSub(Block) then
+ begin
+ Block.Free;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ vin.Free;
+ exit;
+ end;
+ Block.Free;
+ FParser.Next; //cstii_until
+ vout := calc(CSTI_Semicolon);
+ if vout = nil then
+ begin
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ vin.Free;
+ exit;
+ end;
+ CPos := Length(BlockInfo.Proc.Data);
+ if not WriteCalculation(vout, vin) then
+ begin
+ vout.Free;
+ vin.Free;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ exit;
+ end;
+ vout.Free;
+ BlockWriteByte(BlockInfo, Cm_CNG);
+ BlockWriteLong(BlockInfo, $12345678);
+ EPos := Length(BlockInfo. Proc.Data);
+ if not WriteOutRec(vin, False) then
+ begin
+ MakeError('', ecInternalError, '00016');
+ vin.Free;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[EPos - 3])^)) := Longint(SPos) -
+ Length(BlockInfo.Proc.Data);
+ {$else}
+ Longint((@BlockInfo.Proc.Data[EPos - 3])^) := Longint(SPos) -
+ Length(BlockInfo.Proc.Data);
+ {$endif}
+ for i := 0 to FBreakOffsets.Count -1 do
+ begin
+ EPos := Cardinal(FBreakOffsets[I]);
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[EPos - 3])^)) := Length(BlockInfo. Proc.Data) - Longint(EPos);
+ {$else}
+ Longint((@BlockInfo.Proc.Data[EPos - 3])^) := Length(BlockInfo. Proc.Data) - Longint(EPos);
+ {$endif}
+ end;
+ for i := 0 to FContinueOffsets.Count -1 do
+ begin
+ EPos := Cardinal(FContinueOffsets[I]);
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[EPos - 3])^)) := Longint(CPos) - Longint(EPos);
+ {$else}
+ Longint((@BlockInfo.Proc.Data[EPos - 3])^) := Longint(CPos) - Longint(EPos);
+ {$endif}
+ end;
+ FBreakOffsets.Free;
+ FContinueOffsets.Free;
+ FContinueOffsets := OldCO;
+ FBreakOffsets := OldBo;
+
+ FWithCount := iOldWithCount;
+ FTryCount := iOldTryCount;
+ FExceptFinallyCount := iOldExFnlCount;
+
+ vin.Free;
+ if HasInvalidJumps(SPos, Length(BlockInfo. Proc.Data)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ Result := True;
+ end; {ProcessRepeat}
+
+ function ProcessIf: Boolean;
+ var
+ vout, vin: TPSValue;
+ SPos, EPos: Cardinal;
+ Block: TPSBlockInfo;
+ begin
+ Result := False;
+ Debug_WriteLine(BlockInfo);
+ FParser.Next;
+ vout := calc(CSTII_Then);
+ if vout = nil then
+ exit;
+ if FParser.CurrTokenId <> CSTII_Then then
+ begin
+ vout.Free;
+ MakeError('', ecThenExpected, '');
+ exit;
+ end;
+ vin := AllocStackReg(at2ut(FDefaultBoolType));
+ if not WriteCalculation(vout, vin) then
+ begin
+ vout.Free;
+ vin.Free;
+ exit;
+ end;
+ vout.Free;
+ BlockWriteByte(BlockInfo, cm_sf);
+ if not WriteOutRec(vin, False) then
+ begin
+ MakeError('', ecInternalError, '00018');
+ vin.Free;
+ exit;
+ end;
+ BlockWriteByte(BlockInfo, 1);
+ vin.Free;
+ BlockWriteByte(BlockInfo, cm_fg);
+ BlockWriteLong(BlockInfo, $12345678);
+ SPos := Length(BlockInfo.Proc.Data);
+ FParser.Next; // skip then
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tifOneliner;
+ if not ProcessSub(Block) then
+ begin
+ Block.Free;
+ exit;
+ end;
+ Block.Free;
+ if FParser.CurrTokenId = CSTII_Else then
+ begin
+ BlockWriteByte(BlockInfo, Cm_G);
+ BlockWriteLong(BlockInfo, $12345678);
+ EPos := Length(BlockInfo.Proc.Data);
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[SPos - 3])^)) := Length(BlockInfo.Proc.Data) - Longint(SPos);
+ {$else}
+ Longint((@BlockInfo.Proc.Data[SPos - 3])^) := Length(BlockInfo.Proc.Data) - Longint(SPos);
+ {$endif}
+ FParser.Next;
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tOneLiner;
+ if not ProcessSub(Block) then
+ begin
+ Block.Free;
+ exit;
+ end;
+ Block.Free;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[EPos - 3])^)) := Length(BlockInfo.Proc.Data) - Longint(EPos);
+ {$else}
+ Longint((@BlockInfo.Proc.Data[EPos - 3])^) := Length(BlockInfo.Proc.Data) - Longint(EPos);
+ {$endif}
+ end
+ else
+ begin
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Longint((@BlockInfo.Proc.Data[SPos - 3])^)) := Length(BlockInfo.Proc.Data) - Longint(SPos) + 5 - 5;
+ {$else}
+ Longint((@BlockInfo.Proc.Data[SPos - 3])^) := Length(BlockInfo.Proc.Data) - Longint(SPos) + 5 - 5;
+ {$endif}
+ end;
+ Result := True;
+ end; {ProcessIf}
+
+ function _ProcessLabel: Longint; {0 = failed; 1 = successful; 2 = no label}
+ var
+ I, H: Longint;
+ s: tbtString;
+ begin
+ h := MakeHash(FParser.GetToken);
+ for i := 0 to BlockInfo.Proc.FLabels.Count -1 do
+ begin
+ s := BlockInfo.Proc.FLabels[I];
+ delete(s, 1, 4);
+ if Longint((@s[1])^) = h then
+ begin
+ delete(s, 1, 4);
+ if s = FParser.GetToken then
+ begin
+ s := BlockInfo.Proc.FLabels[I];
+ Cardinal((@s[1])^) := Length(BlockInfo.Proc.Data);
+ BlockInfo.Proc.FLabels[i] := s;
+ FParser.Next;
+ if fParser.CurrTokenId = CSTI_Colon then
+ begin
+ Result := 1;
+ FParser.Next;
+ exit;
+ end else begin
+ MakeError('', ecColonExpected, '');
+ Result := 0;
+ Exit;
+ end;
+ end;
+ end;
+ end;
+ result := 2;
+ end;
+
+ function ProcessIdentifier: Boolean;
+ var
+ vin, vout: TPSValue;
+ begin
+ Result := False;
+ Debug_WriteLine(BlockInfo);
+ vin := GetIdentifier(2);
+ if vin <> nil then
+ begin
+ if vin is TPSValueVar then
+ begin // assignment needed
+ if FParser.CurrTokenId <> CSTI_Assignment then
+ begin
+ MakeError('', ecAssignmentExpected, '');
+ vin.Free;
+ exit;
+ end;
+ FParser.Next;
+ vout := calc(CSTI_Semicolon);
+ if vout = nil then
+ begin
+ vin.Free;
+ exit;
+ end;
+ if not WriteCalculation(vout, vin) then
+ begin
+ vin.Free;
+ vout.Free;
+ exit;
+ end;
+ vin.Free;
+ vout.Free;
+ end else if vin is TPSValueProc then
+ begin
+ Result := _ProcessFunction(TPSValueProc(vin), nil);
+ vin.Free;
+ Exit;
+ end else
+ begin
+ MakeError('', ecInternalError, '20');
+ vin.Free;
+ REsult := False;
+ exit;
+ end;
+ end
+ else
+ begin
+ Result := False;
+ exit;
+ end;
+ Result := True;
+ end; {ProcessIdentifier}
+
+ function ProcessCase: Boolean;
+ var
+ V1, V2, TempRec, Val, CalcItem: TPSValue;
+ p: TPSBinValueOp;
+ SPos, CurrP: Cardinal;
+ I: Longint;
+ EndReloc: TPSList;
+ Block: TPSBlockInfo;
+
+ function NewRec(val: TPSValue): TPSValueReplace;
+ begin
+ Result := TPSValueReplace.Create;
+ Result.SetParserPos(FParser);
+ Result.FNewValue := Val;
+ Result.FreeNewValue := False;
+ end;
+
+ function Combine(v1, v2: TPSValue; Op: TPSBinOperatorType): TPSValue;
+ begin
+ if V1 = nil then
+ begin
+ Result := v2;
+ end else if v2 = nil then
+ begin
+ Result := V1;
+ end else
+ begin
+ Result := TPSBinValueOp.Create;
+ TPSBinValueOp(Result).FType := FDefaultBoolType;
+ TPSBinValueOp(Result).Operator := Op;
+ Result.SetParserPos(FParser);
+ TPSBinValueOp(Result).FVal1 := V1;
+ TPSBinValueOp(Result).FVal2 := V2;
+ end;
+ end;
+
+
+ begin
+ Debug_WriteLine(BlockInfo);
+ FParser.Next;
+ Val := calc(CSTII_of);
+ if Val = nil then
+ begin
+ ProcessCase := False;
+ exit;
+ end; {if}
+ if FParser.CurrTokenId <> CSTII_Of then
+ begin
+ MakeError('', ecOfExpected, '');
+ val.Free;
+ ProcessCase := False;
+ exit;
+ end; {if}
+ FParser.Next;
+ TempRec := AllocStackReg(GetTypeNo(BlockInfo, Val));
+ if not WriteCalculation(Val, TempRec) then
+ begin
+ TempRec.Free;
+ val.Free;
+ ProcessCase := False;
+ exit;
+ end; {if}
+ val.Free;
+ EndReloc := TPSList.Create;
+ CalcItem := AllocStackReg(at2ut(FDefaultBoolType));
+ SPos := Length(BlockInfo.Proc.Data);
+ repeat
+ V1 := nil;
+ while true do
+ begin
+ Val := calc(CSTI_Colon);
+ if (Val = nil) then
+ begin
+ V1.Free;
+ CalcItem.Free;
+ TempRec.Free;
+ EndReloc.Free;
+ ProcessCase := False;
+ exit;
+ end; {if}
+ if fParser.CurrTokenID = CSTI_TwoDots then begin
+ FParser.Next;
+ V2 := Calc(CSTI_colon);
+ if V2 = nil then begin
+ V1.Free;
+ CalcItem.Free;
+ TempRec.Free;
+ EndReloc.Free;
+ ProcessCase := False;
+ Val.Free;
+ exit;
+ end;
+ p := TPSBinValueOp.Create;
+ p.SetParserPos(FParser);
+ p.Operator := otGreaterEqual;
+ p.aType := at2ut(FDefaultBoolType);
+ p.Val2 := Val;
+ p.Val1 := NewRec(TempRec);
+ Val := p;
+ p := TPSBinValueOp.Create;
+ p.SetParserPos(FParser);
+ p.Operator := otLessEqual;
+ p.aType := at2ut(FDefaultBoolType);
+ p.Val2 := V2;
+ p.Val1 := NewRec(TempRec);
+ P := TPSBinValueOp(Combine(Val,P, otAnd));
+ end else begin
+ p := TPSBinValueOp.Create;
+ p.SetParserPos(FParser);
+ p.Operator := otEqual;
+ p.aType := at2ut(FDefaultBoolType);
+ p.Val1 := Val;
+ p.Val2 := NewRec(TempRec);
+ end;
+ V1 := Combine(V1, P, otOr);
+ if FParser.CurrTokenId = CSTI_Colon then Break;
+ if FParser.CurrTokenID <> CSTI_Comma then
+ begin
+ MakeError('', ecColonExpected, '');
+ V1.Free;
+ CalcItem.Free;
+ TempRec.Free;
+ EndReloc.Free;
+ ProcessCase := False;
+ exit;
+ end;
+ FParser.Next;
+ end;
+ FParser.Next;
+ if not WriteCalculation(V1, CalcItem) then
+ begin
+ CalcItem.Free;
+ v1.Free;
+ EndReloc.Free;
+ ProcessCase := False;
+ exit;
+ end;
+ v1.Free;
+ BlockWriteByte(BlockInfo, Cm_CNG);
+ BlockWriteLong(BlockInfo, $12345678);
+ CurrP := Length(BlockInfo.Proc.Data);
+ WriteOutRec(CalcItem, False);
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tifOneliner;
+ if not ProcessSub(Block) then
+ begin
+ Block.Free;
+ CalcItem.Free;
+ TempRec.Free;
+ EndReloc.Free;
+ ProcessCase := False;
+ exit;
+ end;
+ Block.Free;
+ BlockWriteByte(BlockInfo, Cm_G);
+ BlockWriteLong(BlockInfo, $12345678);
+ EndReloc.Add(Pointer(Length(BlockInfo.Proc.Data)));
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Cardinal((@BlockInfo.Proc.Data[CurrP - 3])^)) := Cardinal(Length(BlockInfo.Proc.Data)) - CurrP - 5;
+ {$else}
+ Cardinal((@BlockInfo.Proc.Data[CurrP - 3])^) := Cardinal(Length(BlockInfo.Proc.Data)) - CurrP - 5;
+ {$endif}
+ if FParser.CurrTokenID = CSTI_Semicolon then FParser.Next;
+ if FParser.CurrTokenID = CSTII_Else then
+ begin
+ FParser.Next;
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tOneliner;
+ if not ProcessSub(Block) then
+ begin
+ Block.Free;
+ CalcItem.Free;
+ TempRec.Free;
+ EndReloc.Free;
+ ProcessCase := False;
+ exit;
+ end;
+ Block.Free;
+ if FParser.CurrTokenID = CSTI_Semicolon then FParser.Next;
+ if FParser.CurrtokenId <> CSTII_End then
+ begin
+ MakeError('', ecEndExpected, '');
+ CalcItem.Free;
+ TempRec.Free;
+ EndReloc.Free;
+ ProcessCase := False;
+ exit;
+ end;
+ end;
+ until FParser.CurrTokenID = CSTII_End;
+ FParser.Next;
+ for i := 0 to EndReloc.Count -1 do
+ begin
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Cardinal((@BlockInfo.Proc.Data[Cardinal(EndReloc[I])- 3])^)) := Cardinal(Length(BlockInfo.Proc.Data)) - Cardinal(EndReloc[I]);
+ {$else}
+ Cardinal((@BlockInfo.Proc.Data[Cardinal(EndReloc[I])- 3])^) := Cardinal(Length(BlockInfo.Proc.Data)) - Cardinal(EndReloc[I]);
+ {$endif}
+ end;
+ CalcItem.Free;
+ TempRec.Free;
+ EndReloc.Free;
+ if FContinueOffsets <> nil then
+ begin
+ for i := 0 to FContinueOffsets.Count -1 do
+ begin
+ if Cardinal(FContinueOffsets[i]) >= SPos then
+ begin
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Byte((@BlockInfo.Proc.Data[Longint(FContinueOffsets[i]) - 4])^)) := Cm_P2G;
+ {$else}
+ Byte((@BlockInfo.Proc.Data[Longint(FContinueOffsets[i]) - 4])^) := Cm_P2G;
+ {$endif}
+ end;
+ end;
+ end;
+ if FBreakOffsets <> nil then
+ begin
+ for i := 0 to FBreakOffsets.Count -1 do
+ begin
+ if Cardinal(FBreakOffsets[i]) >= SPos then
+ begin
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ unaligned(Byte((@BlockInfo.Proc.Data[Longint(FBreakOffsets[i]) - 4])^)) := Cm_P2G;
+ {$else}
+ Byte((@BlockInfo.Proc.Data[Longint(FBreakOffsets[i]) - 4])^) := Cm_P2G;
+ {$endif}
+ end;
+ end;
+ end;
+ if HasInvalidJumps(SPos, Length(BlockInfo.Proc.Data)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ Result := True;
+ end; {ProcessCase}
+ function ProcessGoto: Boolean;
+ var
+ I, H: Longint;
+ s: tbtString;
+ begin
+ Debug_WriteLine(BlockInfo);
+ FParser.Next;
+ h := MakeHash(FParser.GetToken);
+ for i := 0 to BlockInfo.Proc.FLabels.Count -1 do
+ begin
+ s := BlockInfo.Proc.FLabels[I];
+ delete(s, 1, 4);
+ if Longint((@s[1])^) = h then
+ begin
+ delete(s, 1, 4);
+ if s = FParser.GetToken then
+ begin
+ FParser.Next;
+ BlockWriteByte(BlockInfo, Cm_G);
+ BlockWriteLong(BlockInfo, $12345678);
+ BlockInfo.Proc.FGotos.Add(PS_mi2s(length(BlockInfo.Proc.Data))+PS_mi2s(i));
+ Result := True;
+ exit;
+ end;
+ end;
+ end;
+ MakeError('', ecUnknownIdentifier, FParser.OriginalToken);
+ Result := False;
+ end; {ProcessGoto}
+
+ function ProcessWith: Boolean;
+ var
+ Block: TPSBlockInfo;
+ aVar, aReplace: TPSValue;
+ aType: TPSType;
+
+ iStartOffset: Integer;
+
+ tmp: TPSValue;
+ begin
+ Debug_WriteLine(BlockInfo);
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tOneLiner;
+
+ FParser.Next;
+ repeat
+ aVar := GetIdentifier(0);
+ if aVar = nil then
+ begin
+ block.Free;
+ Result := False;
+ exit;
+ end;
+ AType := GetTypeNo(BlockInfo, aVar);
+ if (AType = nil) or ((aType.BaseType <> btRecord) and (aType.BaseType <> btClass)) then
+ begin
+ MakeError('', ecClassTypeExpected, '');
+ Block.Free;
+ Result := False;
+ exit;
+ end;
+
+ aReplace := TPSValueReplace.Create;
+ aReplace.SetParserPos(FParser);
+ TPSValueReplace(aReplace).FreeOldValue := True;
+ TPSValueReplace(aReplace).FreeNewValue := True;
+ TPSValueReplace(aReplace).OldValue := aVar;
+
+ //if aVar.InheritsFrom(TPSVar) then TPSVar(aVar).Use;
+ tmp := AllocPointer(GetTypeNo(BlockInfo, aVar));
+ TPSProcVar(BlockInfo.Proc.ProcVars[TPSValueAllocatedStackVar(tmp).LocalVarNo]).Use;
+ PreWriteOutRec(tmp,GetTypeNo(BlockInfo, tmp));
+ PreWriteOutRec(aVar,GetTypeNo(BlockInfo, aVar));
+ BlockWriteByte(BlockInfo, cm_sp);
+ WriteOutRec(tmp, false);
+ WriteOutRec(aVar, false);
+ TPSValueReplace(aReplace).NewValue := tmp;
+
+
+
+ Block.WithList.Add(aReplace);
+
+ if FParser.CurrTokenID = CSTII_do then
+ begin
+ FParser.Next;
+ Break;
+ end else
+ if FParser.CurrTokenId <> CSTI_Comma then
+ begin
+ MakeError('', ecDoExpected, '');
+ Block.Free;
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ until False;
+
+
+ inc(FWithCount);
+
+ iStartOffset := Length(Block.Proc.Data);
+
+ if not (ProcessSub(Block) and (not HasInvalidJumps(iStartOffset,Length(BlockInfo.Proc.Data) + 1)) ) then
+ begin
+ dec(FWithCount);
+ Block.Free;
+ Result := False;
+ exit;
+ end;
+ dec(FWithCount);
+
+ AfterWriteOutRec(aVar);
+ AfterWriteOutRec(tmp);
+ Block.Free;
+ Result := True;
+ end;
+
+ function ProcessTry: Boolean;
+ var
+ FStartOffset: Cardinal;
+ iBlockStartOffset: Integer;
+ Block: TPSBlockInfo;
+ begin
+ FParser.Next;
+ BlockWriteByte(BlockInfo, cm_puexh);
+ FStartOffset := Length(BlockInfo.Proc.Data) + 1;
+ BlockWriteLong(BlockInfo, InvalidVal);
+ BlockWriteLong(BlockInfo, InvalidVal);
+ BlockWriteLong(BlockInfo, InvalidVal);
+ BlockWriteLong(BlockInfo, InvalidVal);
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tTry;
+ inc(FTryCount);
+ if ProcessSub(Block) and (not HasInvalidJumps(FStartOffset,Length(BlockInfo.Proc.Data) + 1)) then
+ begin
+ dec(FTryCount);
+ Block.Free;
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 0);
+ if FParser.CurrTokenID = CSTII_Except then
+ begin
+ FParser.Next;
+ Cardinal((@BlockInfo.Proc.Data[FStartOffset + 4])^) := Cardinal(Length(BlockInfo.Proc.Data)) - FStartOffset - 15;
+ iBlockStartOffset := Length(BlockInfo.Proc.Data) ;
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tTryEnd;
+ inc(FExceptFinallyCount);
+ if ProcessSub(Block) and (not HasInvalidJumps(iBlockStartOffset,Length(BlockInfo.Proc.Data) + 1)) then
+ begin
+ dec(FExceptFinallyCount);
+ Block.Free;
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 2);
+ if FParser.CurrTokenId = CSTII_Finally then
+ begin
+ Cardinal((@BlockInfo.Proc.Data[FStartOffset + 8])^) := Cardinal(Length(BlockInfo.Proc.Data)) - FStartOffset - 15;
+ iBlockStartOffset := Length(BlockInfo.Proc.Data) ;
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tTryEnd;
+ FParser.Next;
+ inc(FExceptFinallyCount);
+ if ProcessSub(Block) and (not HasInvalidJumps(iBlockStartOffset,Length(BlockInfo.Proc.Data) + 1)) then
+ begin
+ dec(FExceptFinallyCount);
+ Block.Free;
+ if FParser.CurrTokenId = CSTII_End then
+ begin
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 3);
+ end else begin
+ MakeError('', ecEndExpected, '');
+ Result := False;
+ exit;
+ end;
+ end else
+ begin
+ Block.Free;
+ Result := False;
+ dec(FExceptFinallyCount);
+ exit;
+ end;
+ end else if FParser.CurrTokenID <> CSTII_End then
+ begin
+ MakeError('', ecEndExpected, '');
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ end else
+ begin
+ Block.Free;
+ Result := False;
+ dec(FExceptFinallyCount);
+ exit;
+ end;
+ end else if FParser.CurrTokenId = CSTII_Finally then
+ begin
+ FParser.Next;
+ Cardinal((@BlockInfo.Proc.Data[FStartOffset])^) := Cardinal(Length(BlockInfo.Proc.Data)) - FStartOffset - 15;
+ iBlockStartOffset := Length(BlockInfo.Proc.Data) ;
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tTryEnd;
+ inc(FExceptFinallyCount);
+ if ProcessSub(Block) and (not HasInvalidJumps(iBlockStartOffset,Length(BlockInfo.Proc.Data) + 1)) then
+ begin
+ dec(FExceptFinallyCount);
+ Block.Free;
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 1);
+ if FParser.CurrTokenId = CSTII_Except then
+ begin
+ Cardinal((@BlockInfo.Proc.Data[FStartOffset + 4])^) := Cardinal(Length(BlockInfo.Proc.Data)) - FStartOffset - 15;
+ iBlockStartOffset := Length(BlockInfo.Proc.Data) ;
+ FParser.Next;
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tTryEnd;
+ inc(FExceptFinallyCount);
+ if ProcessSub(Block) and (not HasInvalidJumps(iBlockStartOffset,Length(BlockInfo.Proc.Data) + 1)) then
+ begin
+ dec(FExceptFinallyCount);
+ Block.Free;
+ if FParser.CurrTokenId = CSTII_End then
+ begin
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 2);
+ end else begin
+ MakeError('', ecEndExpected, '');
+ Result := False;
+ exit;
+ end;
+ end else
+ begin
+ Block.Free;
+ Result := False;
+ dec(FExceptFinallyCount);
+ exit;
+ end;
+ end else if FParser.CurrTokenID <> CSTII_End then
+ begin
+ MakeError('', ecEndExpected, '');
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ end else
+ begin
+ Block.Free;
+ Result := False;
+ dec(FExceptFinallyCount);
+ exit;
+ end;
+ end;
+ end else
+ begin
+ Block.Free;
+ Result := False;
+ dec(FTryCount);
+ exit;
+ end;
+ Cardinal((@BlockInfo.Proc.Data[FStartOffset + 12])^) := Cardinal(Length(BlockInfo.Proc.Data)) - FStartOffset - 15;
+ Result := True;
+ end; {ProcessTry}
+
+var
+ i: Integer;
+ Block: TPSBlockInfo;
+
+begin
+ ProcessSub := False;
+ if (BlockInfo.SubType = tProcBegin) or (BlockInfo.SubType= tMainBegin) or
+{$IFDEF PS_USESSUPPORT}
+ (BlockInfo.SubType = tUnitInit) or (BlockInfo.SubType= tUnitFinish) or // NvdS
+{$endif}
+ (BlockInfo.SubType= tSubBegin) then
+ begin
+ FParser.Next; // skip CSTII_Begin
+ end;
+ while True do
+ begin
+ case FParser.CurrTokenId of
+ CSTII_Goto:
+ begin
+ if not ProcessGoto then
+ Exit;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTII_With:
+ begin
+ if not ProcessWith then
+ Exit;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTII_Try:
+ begin
+ if not ProcessTry then
+ Exit;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTII_Finally, CSTII_Except:
+ begin
+ if (BlockInfo.SubType = tTry) or (BlockInfo.SubType = tTryEnd) then
+ Break
+ else
+ begin
+ MakeError('', ecEndExpected, '');
+ Exit;
+ end;
+ end;
+ CSTII_Begin:
+ begin
+ Block := TPSBlockInfo.Create(BlockInfo);
+ Block.SubType := tSubBegin;
+ if not ProcessSub(Block) then
+ begin
+ Block.Free;
+ Exit;
+ end;
+ Block.Free;
+
+ FParser.Next; // skip END
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTI_Semicolon:
+ begin
+
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break
+ else FParser.Next;
+ end;
+ CSTII_until:
+ begin
+ Debug_WriteLine(BlockInfo);
+ if BlockInfo.SubType = tRepeat then
+ begin
+ break;
+ end
+ else
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTII_Else:
+ begin
+ if BlockInfo.SubType = tifOneliner then
+ break
+ else
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ end;
+ CSTII_repeat:
+ begin
+ if not ProcessRepeat then
+ exit;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTII_For:
+ begin
+ if not ProcessFor then
+ exit;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTII_While:
+ begin
+ if not ProcessWhile then
+ exit;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTII_Exit:
+ begin
+ Debug_WriteLine(BlockInfo);
+ BlockWriteByte(BlockInfo, Cm_R);
+ FParser.Next;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTII_Case:
+ begin
+ if not ProcessCase then
+ exit;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTII_If:
+ begin
+ if not ProcessIf then
+ exit;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ CSTI_Identifier:
+ begin
+ case _ProcessLabel of
+ 0: Exit;
+ 1: ;
+ else
+ begin
+ if FParser.GetToken = 'BREAK' then
+ begin
+ if FBreakOffsets = nil then
+ begin
+ MakeError('', ecNotInLoop, '');
+ exit;
+ end;
+ for i := 0 to FExceptFinallyCount - 1 do
+ begin
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 1);
+ end;
+
+ for i := 0 to FTryCount - 1 do
+ begin
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 0);
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 1);
+ end;
+
+ for i := 0 to FWithCount - 1 do
+ BlockWriteByte(BlockInfo,cm_po);
+ BlockWriteByte(BlockInfo, Cm_G);
+ BlockWriteLong(BlockInfo, $12345678);
+ FBreakOffsets.Add(Pointer(Length(BlockInfo.Proc.Data)));
+ FParser.Next;
+ if (BlockInfo.SubType= tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end else if FParser.GetToken = 'CONTINUE' then
+ begin
+ if FBreakOffsets = nil then
+ begin
+ MakeError('', ecNotInLoop, '');
+ exit;
+ end;
+ for i := 0 to FExceptFinallyCount - 1 do
+ begin
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 1);
+ end;
+
+ for i := 0 to FTryCount - 1 do
+ begin
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 0);
+ BlockWriteByte(BlockInfo, cm_poexh);
+ BlockWriteByte(BlockInfo, 1);
+ end;
+
+ for i := 0 to FWithCount - 1 do
+ BlockWriteByte(BlockInfo,cm_po);
+ BlockWriteByte(BlockInfo, Cm_G);
+ BlockWriteLong(BlockInfo, $12345678);
+ FContinueOffsets.Add(Pointer(Length(BlockInfo.Proc.Data)));
+ FParser.Next;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end else
+ if not ProcessIdentifier then
+ exit;
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+ end;
+ end; {case}
+
+ if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ break;
+
+ end;
+ {$IFDEF PS_USESSUPPORT}
+ CSTII_Finalization: //NvdS
+ begin //
+ if (BlockInfo.SubType = tUnitInit) then //
+ begin //
+ break; //
+ end //
+ else //
+ begin //
+ MakeError('', ecIdentifierExpected, ''); //
+ exit; //
+ end; //
+ end; //nvds
+ {$endif}
+ CSTII_End:
+ begin
+ if (BlockInfo.SubType = tTryEnd) or (BlockInfo.SubType = tMainBegin) or
+ (BlockInfo.SubType = tSubBegin) or (BlockInfo.SubType = tifOneliner) or
+ (BlockInfo.SubType = tProcBegin) or (BlockInfo.SubType = TOneLiner)
+ {$IFDEF PS_USESSUPPORT} or (BlockInfo.SubType = tUnitInit) or (BlockInfo.SubType = tUnitFinish) {$endif} then //nvds
+ begin
+ break;
+ end
+ else
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ end;
+ CSTI_EOF:
+ begin
+ MakeError('', ecUnexpectedEndOfFile, '');
+ exit;
+ end;
+ else
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ exit;
+ end;
+ end;
+ end;
+ if (BlockInfo.SubType = tMainBegin) or (BlockInfo.SubType = tProcBegin)
+ {$IFDEF PS_USESSUPPORT} or (BlockInfo.SubType = tUnitInit) or (BlockInfo.SubType = tUnitFinish) {$endif} then //nvds
+ begin
+ Debug_WriteLine(BlockInfo);
+ BlockWriteByte(BlockInfo, Cm_R);
+ {$IFDEF PS_USESSUPPORT}
+ if FParser.CurrTokenId = CSTII_End then //nvds
+ begin
+ {$endif}
+ FParser.Next; // skip end
+ if ((BlockInfo.SubType = tMainBegin)
+ {$IFDEF PS_USESSUPPORT} or (BlockInfo.SubType = tUnitInit) or (BlockInfo.SubType = tUnitFinish){$endif}) //nvds
+ and (FParser.CurrTokenId <> CSTI_Period) then
+ begin
+ MakeError('', ecPeriodExpected, '');
+ exit;
+ end;
+ if (BlockInfo.SubType = tProcBegin) and (FParser.CurrTokenId <> CSTI_Semicolon) then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ {$IFDEF PS_USESSUPPORT}
+ end; //nvds
+ {$endif}
+ end
+ else if (BlockInfo.SubType = tifOneliner) or (BlockInfo.SubType = TOneLiner) then
+ begin
+ if (FParser.CurrTokenID <> CSTII_Else) and (FParser.CurrTokenID <> CSTII_End) then
+ if FParser.CurrTokenID <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ exit;
+ end;
+ end;
+
+ ProcessSub := True;
+end;
+procedure TPSPascalCompiler.UseProc(procdecl: TPSParametersDecl);
+var
+ i: Longint;
+begin
+ if procdecl.Result <> nil then
+ procdecl.Result := at2ut(procdecl.Result);
+ for i := 0 to procdecl.ParamCount -1 do
+ begin
+ procdecl.Params[i].aType := at2ut(procdecl.Params[i].aType);
+ end;
+end;
+
+function TPSPascalCompiler.at2ut(p: TPSType): TPSType;
+var
+ i: Longint;
+begin
+ p := GetTypeCopyLink(p);
+ if p = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ if not p.Used then
+ begin
+ p.Use;
+ case p.BaseType of
+ btStaticArray, btArray: TPSArrayType(p).ArrayTypeNo := at2ut(TPSArrayType(p).ArrayTypeNo);
+ btRecord:
+ begin
+ for i := 0 to TPSRecordType(p).RecValCount -1 do
+ begin
+ TPSRecordType(p).RecVal(i).aType := at2ut(TPSRecordType(p).RecVal(i).aType);
+ end;
+ end;
+ btSet: TPSSetType(p).SetType := at2ut(TPSSetType(p).SetType);
+ btProcPtr:
+ begin
+ UseProc(TPSProceduralType(p).ProcDef);
+ end;
+ end;
+ p.FFinalTypeNo := FCurrUsedTypeNo;
+ inc(FCurrUsedTypeNo);
+ end;
+ Result := p;
+end;
+
+function TPSPascalCompiler.ProcessLabelForwards(Proc: TPSInternalProcedure): Boolean;
+var
+ i: Longint;
+ s, s2: tbtString;
+begin
+ for i := 0 to Proc.FLabels.Count -1 do
+ begin
+ s := Proc.FLabels[I];
+ if Longint((@s[1])^) = -1 then
+ begin
+ delete(s, 1, 8);
+ MakeError('', ecUnSetLabel, s);
+ Result := False;
+ exit;
+ end;
+ end;
+ for i := Proc.FGotos.Count -1 downto 0 do
+ begin
+ s := Proc.FGotos[I];
+ s2 := Proc.FLabels[Cardinal((@s[5])^)];
+ Cardinal((@Proc.Data[Cardinal((@s[1])^)-3])^) := Cardinal((@s2[1])^) - Cardinal((@s[1])^) ;
+ end;
+ Result := True;
+end;
+
+
+type
+ TCompilerState = (csStart, csProgram, csUnit, csUses, csInterface, csInterfaceUses, csImplementation);
+
+function TPSPascalCompiler.Compile(const s: tbtString): Boolean;
+var
+ Position: TCompilerState;
+ i: Longint;
+ {$IFDEF PS_USESSUPPORT}
+ OldFileName: tbtString;
+ OldParser : TPSPascalParser;
+ OldIsUnit : Boolean;
+ {$ENDIF}
+
+ procedure Cleanup;
+ var
+ I: Longint;
+ PT: TPSType;
+ begin
+ {$IFDEF PS_USESSUPPORT}
+ if fInCompile>1 then
+ begin
+ dec(fInCompile);
+ exit;
+ end;
+ {$ENDIF}
+
+ if @FOnBeforeCleanup <> nil then
+ FOnBeforeCleanup(Self); // no reason it actually read the result of this call
+ FGlobalBlock.Free;
+ FGlobalBlock := nil;
+
+ for I := 0 to FRegProcs.Count - 1 do
+ TObject(FRegProcs[I]).Free;
+ FRegProcs.Free;
+ for i := 0 to FConstants.Count -1 do
+ begin
+ TPSConstant(FConstants[I]).Free;
+ end;
+ Fconstants.Free;
+ for I := 0 to FVars.Count - 1 do
+ begin
+ TPSVar(FVars[I]).Free;
+ end;
+ FVars.Free;
+ FVars := nil;
+ for I := 0 to FProcs.Count - 1 do
+ TPSProcedure(FProcs[I]).Free;
+ FProcs.Free;
+ FProcs := nil;
+ for I := 0 to FTypes.Count - 1 do
+ begin
+ PT := FTypes[I];
+ pt.Free;
+ end;
+ FTypes.Free;
+
+{$IFNDEF PS_NOINTERFACES}
+ for i := FInterfaces.Count -1 downto 0 do
+ TPSInterface(FInterfaces[i]).Free;
+ FInterfaces.Free;
+{$ENDIF}
+
+ for i := FClasses.Count -1 downto 0 do
+ begin
+ TPSCompileTimeClass(FClasses[I]).Free;
+ end;
+ FClasses.Free;
+ for i := FAttributeTypes.Count -1 downto 0 do
+ begin
+ TPSAttributeType(FAttributeTypes[i]).Free;
+ end;
+ FAttributeTypes.Free;
+ FAttributeTypes := nil;
+
+ {$IFDEF PS_USESSUPPORT}
+ for I := 0 to FUnitInits.Count - 1 do //nvds
+ begin //nvds
+ TPSBlockInfo(FUnitInits[I]).free; //nvds
+ end; //nvds
+ FUnitInits.Free; //nvds
+ FUnitInits := nil; //
+ for I := 0 to FUnitFinits.Count - 1 do //nvds
+ begin //nvds
+ TPSBlockInfo(FUnitFinits[I]).free; //nvds
+ end; //nvds
+ FUnitFinits.Free; //
+ FUnitFinits := nil; //
+
+ FUses.Free;
+ FUses:=nil;
+ fInCompile:=0;
+ {$ENDIF}
+ end;
+
+ function MakeOutput: Boolean;
+
+ procedure WriteByte(b: Byte);
+ begin
+ FOutput := FOutput + tbtChar(b);
+ end;
+
+ procedure WriteData(const Data; Len: Longint);
+ var
+ l: Longint;
+ begin
+ if Len < 0 then Len := 0;
+ l := Length(FOutput);
+ SetLength(FOutput, l + Len);
+ Move(Data, FOutput[l + 1], Len);
+ end;
+
+ procedure WriteLong(l: Cardinal);
+ begin
+ WriteData(l, 4);
+ end;
+
+ procedure WriteVariant(p: PIfRVariant);
+ begin
+ WriteLong(p^.FType.FinalTypeNo);
+ case p.FType.BaseType of
+ btType: WriteLong(p^.ttype.FinalTypeNo);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString:
+ begin
+ WriteLong(Length(tbtWideString(p^.twidestring)));
+ WriteData(tbtwidestring(p^.twidestring)[1], 2*Length(tbtWideString(p^.twidestring)));
+ end;
+ btUnicodeString:
+ begin
+ WriteLong(Length(tbtUnicodestring(p^.twidestring)));
+ WriteData(tbtUnicodestring(p^.twidestring)[1], 2*Length(tbtUnicodestring(p^.twidestring)));
+ end;
+ btWideChar: WriteData(p^.twidechar, 2);
+ {$ENDIF}
+ btSingle: WriteData(p^.tsingle, sizeof(tbtSingle));
+ btDouble: WriteData(p^.tsingle, sizeof(tbtDouble));
+ btExtended: WriteData(p^.tsingle, sizeof(tbtExtended));
+ btCurrency: WriteData(p^.tsingle, sizeof(tbtCurrency));
+ btChar: WriteData(p^.tchar, 1);
+ btSet:
+ begin
+ WriteData(tbtString(p^.tstring)[1], Length(tbtString(p^.tstring)));
+ end;
+ btString:
+ begin
+ WriteLong(Length(tbtString(p^.tstring)));
+ WriteData(tbtString(p^.tstring)[1], Length(tbtString(p^.tstring)));
+ end;
+ btenum:
+ begin
+ if TPSEnumType(p^.FType).HighValue <=256 then
+ WriteData( p^.tu32, 1)
+ else if TPSEnumType(p^.FType).HighValue <=65536 then
+ WriteData(p^.tu32, 2)
+ else
+ WriteData(p^.tu32, 4);
+ end;
+ bts8,btu8: WriteData(p^.tu8, 1);
+ bts16,btu16: WriteData(p^.tu16, 2);
+ bts32,btu32: WriteData(p^.tu32, 4);
+ {$IFNDEF PS_NOINT64}
+ bts64: WriteData(p^.ts64, 8);
+ {$ENDIF}
+ btProcPtr: WriteData(p^.tu32, 4);
+ {$IFDEF DEBUG}
+ else
+ asm int 3; end;
+ {$ENDIF}
+ end;
+ end;
+
+ procedure WriteAttributes(attr: TPSAttributes);
+ var
+ i, j: Longint;
+ begin
+ WriteLong(attr.Count);
+ for i := 0 to Attr.Count -1 do
+ begin
+ j := Length(attr[i].FAttribType.Name);
+ WriteLong(j);
+ WriteData(Attr[i].FAttribType.Name[1], j);
+ WriteLong(Attr[i].Count);
+ for j := 0 to Attr[i].Count -1 do
+ begin
+ WriteVariant(Attr[i][j]);
+ end;
+ end;
+ end;
+
+ procedure WriteTypes;
+ var
+ l, n: Longint;
+ bt: TPSBaseType;
+ x: TPSType;
+ s: tbtString;
+ FExportName: tbtString;
+ Items: TPSList;
+ procedure WriteTypeNo(TypeNo: Cardinal);
+ begin
+ WriteData(TypeNo, 4);
+ end;
+ begin
+ Items := TPSList.Create;
+ try
+ for l := 0 to FCurrUsedTypeNo -1 do
+ Items.Add(nil);
+ for l := 0 to FTypes.Count -1 do
+ begin
+ x := FTypes[l];
+ if x.Used then
+ Items[x.FinalTypeNo] := x;
+ end;
+ for l := 0 to Items.Count - 1 do
+ begin
+ x := Items[l];
+ if x.FExportName then
+ FExportName := x.Name
+ else
+ FExportName := '';
+ if (x.BaseType = btExtClass) and (x is TPSUndefinedClassType) then
+ begin
+ x := GetTypeCopyLink(TPSUndefinedClassType(x).ExtClass.SelfType);
+ end;
+ bt := x.BaseType;
+ if (x.BaseType = btType) or (x.BaseType = btNotificationVariant) then
+ begin
+ bt := btU32;
+ end else
+ if (x.BaseType = btEnum) then begin
+ if TPSEnumType(x).HighValue <= 256 then
+ bt := btU8
+ else if TPSEnumType(x).HighValue <= 65536 then
+ bt := btU16
+ else
+ bt := btU32;
+ end;
+ if FExportName <> '' then
+ begin
+ WriteByte(bt + 128);
+ end
+ else
+ WriteByte(bt);
+{$IFNDEF PS_NOINTERFACES} if x.BaseType = btInterface then
+ begin
+ WriteData(TPSInterfaceType(x).Intf.Guid, Sizeof(TGuid));
+ end else {$ENDIF} if x.BaseType = btClass then
+ begin
+ WriteLong(Length(TPSClassType(X).Cl.FClassName));
+ WriteData(TPSClassType(X).Cl.FClassName[1], Length(TPSClassType(X).Cl.FClassName));
+ end else
+ if (x.BaseType = btProcPtr) then
+ begin
+ s := DeclToBits(TPSProceduralType(x).ProcDef);
+ WriteLong(Length(s));
+ WriteData(s[1], Length(s));
+ end else
+ if (x.BaseType = btSet) then
+ begin
+ WriteLong(TPSSetType(x).BitSize);
+ end else
+ if (x.BaseType = btArray) or (x.basetype = btStaticArray) then
+ begin
+ WriteLong(TPSArrayType(x).ArrayTypeNo.FinalTypeNo);
+ if (x.baseType = btstaticarray) then begin
+ WriteLong(TPSStaticArrayType(x).Length);
+ WriteLong(TPSStaticArrayType(x).StartOffset); //<-additional StartOffset
+ end;
+ end else if x.BaseType = btRecord then
+ begin
+ n := TPSRecordType(x).RecValCount;
+ WriteData( n, 4);
+ for n := 0 to TPSRecordType(x).RecValCount - 1 do
+ WriteTypeNo(TPSRecordType(x).RecVal(n).FType.FinalTypeNo);
+ end;
+ if FExportName <> '' then
+ begin
+ WriteLong(Length(FExportName));
+ WriteData(FExportName[1], length(FExportName));
+ end;
+ WriteAttributes(x.Attributes);
+ end;
+ finally
+ Items.Free;
+ end;
+ end;
+
+ procedure WriteVars;
+ var
+ l,j : Longint;
+ x: TPSVar;
+ begin
+ for l := 0 to FVars.Count - 1 do
+ begin
+ x := FVars[l];
+ if x.SaveAsPointer then
+ begin
+ for j := FTypes.count -1 downto 0 do
+ begin
+ if TPSType(FTypes[j]).BaseType = btPointer then
+ begin
+ WriteLong(TPSType(FTypes[j]).FinalTypeNo);
+ break;
+ end;
+ end;
+ end else
+ WriteLong(x.FType.FinalTypeNo);
+ if x.exportname <> '' then
+ begin
+ WriteByte( 1);
+ WriteLong(Length(X.ExportName));
+ WriteData( X.ExportName[1], length(X.ExportName));
+ end else
+ WriteByte( 0);
+ end;
+ end;
+
+ procedure WriteProcs;
+ var
+ l: Longint;
+ xp: TPSProcedure;
+ xo: TPSInternalProcedure;
+ xe: TPSExternalProcedure;
+ s: tbtString;
+ att: Byte;
+ begin
+ for l := 0 to FProcs.Count - 1 do
+ begin
+ xp := FProcs[l];
+ if xp.Attributes.Count <> 0 then att := 4 else att := 0;
+ if xp.ClassType = TPSInternalProcedure then
+ begin
+ xo := TPSInternalProcedure(xp);
+ xo.OutputDeclPosition := Length(FOutput);
+ WriteByte(att or 2); // exported
+ WriteLong(0); // offset is unknown at this time
+ WriteLong(0); // length is also unknown at this time
+ WriteLong(Length(xo.Name));
+ WriteData( xo.Name[1], length(xo.Name));
+ s := MakeExportDecl(xo.Decl);
+ WriteLong(Length(s));
+ WriteData( s[1], length(S));
+ end
+ else
+ begin
+ xe := TPSExternalProcedure(xp);
+ if xe.RegProc.ImportDecl <> '' then
+ begin
+ WriteByte( att or 3); // imported
+ if xe.RegProc.FExportName then
+ begin
+ WriteByte(Length(xe.RegProc.Name));
+ WriteData(xe.RegProc.Name[1], Length(xe.RegProc.Name) and $FF);
+ end else begin
+ WriteByte(0);
+ end;
+ WriteLong(Length(xe.RegProc.ImportDecl));
+ WriteData(xe.RegProc.ImportDecl[1], Length(xe.RegProc.ImportDecl));
+ end else begin
+ WriteByte(att or 1); // imported
+ WriteByte(Length(xe.RegProc.Name));
+ WriteData(xe.RegProc.Name[1], Length(xe.RegProc.Name) and $FF);
+ end;
+ end;
+ if xp.Attributes.Count <> 0 then
+ WriteAttributes(xp.Attributes);
+ end;
+ end;
+
+ procedure WriteProcs2;
+ var
+ l: Longint;
+ L2: Cardinal;
+ x: TPSProcedure;
+ begin
+ for l := 0 to FProcs.Count - 1 do
+ begin
+ x := FProcs[l];
+ if x.ClassType = TPSInternalProcedure then
+ begin
+ if TPSInternalProcedure(x).Data = '' then
+ TPSInternalProcedure(x).Data := Chr(Cm_R);
+ L2 := Length(FOutput);
+ Move(L2, FOutput[TPSInternalProcedure(x).OutputDeclPosition + 2], 4);
+ // write position
+ WriteData(TPSInternalProcedure(x).Data[1], Length(TPSInternalProcedure(x).Data));
+ L2 := Cardinal(Length(FOutput)) - L2;
+ Move(L2, FOutput[TPSInternalProcedure(x).OutputDeclPosition + 6], 4); // write length
+ end;
+ end;
+ end;
+
+
+
+ {$IFDEF PS_USESSUPPORT}
+ function FindMainProc: Cardinal;
+ var
+ l: Longint;
+ Proc : TPSInternalProcedure;
+ ProcData : tbtString;
+ Calls : Integer;
+
+ procedure WriteProc(const aData: Longint);
+ var
+ l: Longint;
+ begin
+ ProcData := ProcData + Chr(cm_c);
+ l := Length(ProcData);
+ SetLength(ProcData, l + 4);
+ Move(aData, ProcData[l + 1], 4);
+ inc(Calls);
+ end;
+ begin
+ ProcData := ''; Calls := 1;
+ for l := 0 to FUnitInits.Count-1 do
+ if (FUnitInits[l] <> nil) and
+ (TPSBlockInfo(FUnitInits[l]).Proc.Data<>'') then
+ WriteProc(TPSBlockInfo(FUnitInits[l]).FProcNo);
+
+ WriteProc(FGlobalBlock.FProcNo);
+
+ for l := FUnitFinits.Count-1 downto 0 do
+ if (FUnitFinits[l] <> nil) and
+ (TPSBlockInfo(FUnitFinits[l]).Proc.Data<>'') then
+ WriteProc(TPSBlockInfo(FUnitFinits[l]).FProcNo);
+
+ if Calls = 1 then begin
+ Result := FGlobalBlock.FProcNo;
+ end else
+ begin
+ Proc := NewProc('Master proc', '!MASTERPROC');
+ Result := FindProc('!MASTERPROC');
+ Proc.data := Procdata + Chr(cm_R);
+ end;
+ end;
+ {$ELSE}
+ function FindMainProc: Cardinal;
+ var
+ l: Longint;
+ begin
+ for l := 0 to FProcs.Count - 1 do
+ begin
+ if (TPSProcedure(FProcs[l]).ClassType = TPSInternalProcedure) and
+ (TPSInternalProcedure(FProcs[l]).Name = PSMainProcName) then
+ begin
+ Result := l;
+ exit;
+ end;
+ end;
+ Result := InvalidVal;
+ end;
+ {$ENDIF}
+
+ procedure CreateDebugData;
+ var
+ I: Longint;
+ p: TPSProcedure;
+ pv: TPSVar;
+ s: tbtString;
+ begin
+ s := #0;
+ for I := 0 to FProcs.Count - 1 do
+ begin
+ p := FProcs[I];
+ if p.ClassType = TPSInternalProcedure then
+ begin
+ if TPSInternalProcedure(p).Name = PSMainProcName then
+ s := s + #1
+ else
+ s := s + TPSInternalProcedure(p).OriginalName + #1;
+ end
+ else
+ begin
+ s := s+ TPSExternalProcedure(p).RegProc.OrgName + #1;
+ end;
+ end;
+ s := s + #0#1;
+ for I := 0 to FVars.Count - 1 do
+ begin
+ pv := FVars[I];
+ s := s + pv.OrgName + #1;
+ end;
+ s := s + #0;
+ WriteDebugData(s);
+ end;
+
+ var //nvds
+ MainProc : Cardinal; //nvds
+
+ begin
+ if @FOnBeforeOutput <> nil then
+ begin
+ if not FOnBeforeOutput(Self) then
+ begin
+ Result := false;
+ exit;
+ end;
+ end;
+ MainProc := FindMainProc; //NvdS (need it here becose FindMainProc can create a New proc.
+ CreateDebugData;
+ WriteLong(PSValidHeader);
+ WriteLong(PSCurrentBuildNo);
+ WriteLong(FCurrUsedTypeNo);
+ WriteLong(FProcs.Count);
+ WriteLong(FVars.Count);
+ WriteLong(MainProc); //nvds
+ WriteLong(0);
+ WriteTypes;
+ WriteProcs;
+ WriteVars;
+ WriteProcs2;
+
+ Result := true;
+ end;
+
+ function CheckExports: Boolean;
+ var
+ i: Longint;
+ p: TPSProcedure;
+ begin
+ if @FOnExportCheck = nil then
+ begin
+ result := true;
+ exit;
+ end;
+ for i := 0 to FProcs.Count -1 do
+ begin
+ p := FProcs[I];
+ if p.ClassType = TPSInternalProcedure then
+ begin
+ if not FOnExportCheck(Self, TPSInternalProcedure(p), MakeDecl(TPSInternalProcedure(p).Decl)) then
+ begin
+ Result := false;
+ exit;
+ end;
+ end;
+ end;
+ Result := True;
+ end;
+ function DoConstBlock: Boolean;
+ var
+ COrgName: tbtString;
+ CTemp, CValue: PIFRVariant;
+ Cp: TPSConstant;
+ TokenPos, TokenRow, TokenCol: Integer;
+ begin
+ FParser.Next;
+ repeat
+ if FParser.CurrTokenID <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ Result := False;
+ Exit;
+ end;
+ TokenPos := FParser.CurrTokenPos;
+ TokenRow := FParser.Row;
+ TokenCol := FParser.Col;
+ COrgName := FParser.OriginalToken;
+ if IsDuplicate(FastUpperCase(COrgName), [dcVars, dcProcs, dcConsts]) then
+ begin
+ MakeError('', ecDuplicateIdentifier, COrgName);
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Equal then
+ begin
+ MakeError('', ecIsExpected, '');
+ Result := False;
+ Exit;
+ end;
+ FParser.Next;
+ CValue := ReadConstant(FParser, CSTI_SemiColon);
+ if CValue = nil then
+ begin
+ Result := False;
+ Exit;
+ end;
+ if FParser.CurrTokenID <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ Result := False;
+ exit;
+ end;
+ cp := TPSConstant.Create;
+ cp.Orgname := COrgName;
+ cp.Name := FastUpperCase(COrgName);
+ {$IFDEF PS_USESSUPPORT}
+ cp.DeclareUnit:=fModule;
+ {$ENDIF}
+ cp.DeclarePos := TokenPos;
+ cp.DeclareRow := TokenRow;
+ cp.DeclareCol := TokenCol;
+ New(CTemp);
+ InitializeVariant(CTemp, CValue.FType);
+ CopyVariantContents(cvalue, CTemp);
+ cp.Value := CTemp;
+ FConstants.Add(cp);
+ DisposeVariant(CValue);
+ FParser.Next;
+ until FParser.CurrTokenId <> CSTI_Identifier;
+ Result := True;
+ end;
+
+ function ProcessUses: Boolean;
+ var
+ {$IFNDEF PS_USESSUPPORT}
+ FUses: TIfStringList;
+ {$ENDIF}
+ I: Longint;
+ s: tbtString;
+ {$IFDEF PS_USESSUPPORT}
+ Parse: Boolean;
+ ParseUnit: tbtString;
+ ParserPos: TPSPascalParser;
+ {$ENDIF}
+ begin
+ FParser.Next;
+ {$IFNDEF PS_USESSUPPORT}
+ FUses := TIfStringList.Create;
+ FUses.Add('SYSTEM');
+ {$ENDIF}
+ repeat
+ if FParser.CurrTokenID <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ {$IFNDEF PS_USESSUPPORT}
+ FUses.Free;
+ {$ENDIF}
+ Result := False;
+ exit;
+ end;
+ s := FParser.GetToken;
+ {$IFDEF PS_USESSUPPORT}
+ Parse:=true;
+ {$ENDIF}
+ for i := 0 to FUses.Count -1 do
+ begin
+ if FUses[I] = s then
+ begin
+ {$IFNDEF PS_USESSUPPORT}
+ MakeError('', ecDuplicateIdentifier, s);
+ FUses.Free;
+ Result := False;
+ exit;
+ {$ELSE}
+ Parse:=false;
+ {$ENDIF}
+ end;
+ end;
+ {$IFDEF PS_USESSUPPORT}
+ if Parse then
+ begin
+ {$ENDIF}
+ FUses.Add(s);
+ if @FOnUses <> nil then
+ begin
+ try
+ {$IFDEF PS_USESSUPPORT}
+ OldFileName:=fModule;
+ fModule:=FParser.OriginalToken;
+ ParseUnit:=FParser.OriginalToken;
+ ParserPos:=FParser;
+ {$ENDIF}
+ if not OnUses(Self, FParser.GetToken) then
+ begin
+ {$IFNDEF PS_USESSUPPORT}
+ FUses.Free;
+ {$ELSE}
+ FParser:=ParserPos;
+ fModule:=OldFileName;
+ MakeError(OldFileName, ecUnitNotFoundOrContainsErrors, ParseUnit);
+ {$ENDIF}
+ Result := False;
+ exit;
+ end;
+ {$IFDEF PS_USESSUPPORT}
+ fModule:=OldFileName;
+ {$ENDIF}
+ except
+ on e: Exception do
+ begin
+ MakeError('', ecCustomError, tbtstring(e.Message));
+ {$IFNDEF PS_USESSUPPORT}
+ FUses.Free;
+ {$ENDIF}
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ {$IFDEF PS_USESSUPPORT}
+ end;
+ {$ENDIF}
+ FParser.Next;
+ if FParser.CurrTokenID = CSTI_Semicolon then break
+ else if FParser.CurrTokenId <> CSTI_Comma then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ Result := False;
+ {$IFNDEF PS_USESSUPPORT}
+ FUses.Free;
+ {$ENDIF}
+ exit;
+ end;
+ FParser.Next;
+ until False;
+ {$IFNDEF PS_USESSUPPORT}
+ FUses.Free;
+ {$ENDIF}
+ FParser.next;
+ Result := True;
+ end;
+
+var
+ Proc: TPSProcedure;
+ {$IFDEF PS_USESSUPPORT}
+ Block : TPSBlockInfo; //nvds
+ {$ENDIF}
+begin
+ Result := False;
+ FWithCount := -1;
+
+ {$IFDEF PS_USESSUPPORT}
+ if fInCompile=0 then
+ begin
+ {$ENDIF}
+ FUnitName := '';
+ FCurrUsedTypeNo := 0;
+ FIsUnit := False;
+ Clear;
+ FParserHadError := False;
+ FParser.SetText(s);
+ FAttributeTypes := TPSList.Create;
+ FProcs := TPSList.Create;
+ FConstants := TPSList.Create;
+ FVars := TPSList.Create;
+ FTypes := TPSList.Create;
+ FRegProcs := TPSList.Create;
+ FClasses := TPSList.Create;
+
+ {$IFDEF PS_USESSUPPORT}
+ FUnitInits := TPSList.Create; //nvds
+ FUnitFinits:= TPSList.Create; //nvds
+
+ FUses:=TIFStringList.Create;
+ {$ENDIF}
+ {$IFNDEF PS_NOINTERFACES} FInterfaces := TPSList.Create;{$ENDIF}
+
+ FGlobalBlock := TPSBlockInfo.Create(nil);
+ FGlobalBlock.SubType := tMainBegin;
+
+ FGlobalBlock.Proc := NewProc(PSMainProcNameOrg, PSMainProcName);
+ FGlobalBlock.ProcNo := FindProc(PSMainProcName);
+
+ {$IFDEF PS_USESSUPPORT}
+ OldFileName:=fModule;
+ fModule:='System';
+ FUses.Add('SYSTEM');
+ {$ENDIF}
+ {$IFNDEF PS_NOSTANDARDTYPES}
+ DefineStandardTypes;
+ DefineStandardProcedures;
+ {$ENDIF}
+ if @FOnUses <> nil then
+ begin
+ try
+ if not OnUses(Self, 'SYSTEM') then
+ begin
+ Cleanup;
+ exit;
+ end;
+ except
+ on e: Exception do
+ begin
+ MakeError('', ecCustomError, tbtstring(e.Message));
+ Cleanup;
+ exit;
+ end;
+ end;
+ end;
+ {$IFDEF PS_USESSUPPORT}
+ fModule:=OldFileName;
+ OldParser:=nil;
+ OldIsUnit:=false; // defaults
+ end
+ else
+ begin
+ OldParser:=FParser;
+ OldIsUnit:=FIsUnit;
+ FParser:=TPSPascalParser.Create;
+ FParser.SetText(s);
+ end;
+
+ inc(fInCompile);
+ {$ENDIF}
+
+ Position := csStart;
+ repeat
+ if FParser.CurrTokenId = CSTI_EOF then
+ begin
+ if FParserHadError then
+ begin
+ Cleanup;
+ exit;
+ end;
+ if FAllowNoEnd then
+ Break
+ else
+ begin
+ MakeError('', ecUnexpectedEndOfFile, '');
+ Cleanup;
+ exit;
+ end;
+ end;
+ if (FParser.CurrTokenId = CSTII_Program) and (Position = csStart) then
+ begin
+ {$IFDEF PS_USESSUPPORT}
+ if fInCompile>1 then
+ begin
+ MakeError('', ecNotAllowed, 'program');
+ Cleanup;
+ exit;
+ end;
+ {$ENDIF}
+ Position := csProgram;
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ Cleanup;
+ exit;
+ end;
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ Cleanup;
+ exit;
+ end;
+ FParser.Next;
+ end else
+ if (Fparser.CurrTokenID = CSTII_Implementation) and ((Position = csinterface) or (position = csInterfaceUses)) then
+ begin
+ Position := csImplementation;
+ FParser.Next;
+ end else
+ if (Fparser.CurrTokenID = CSTII_Interface) and (Position = csUnit) then
+ begin
+ Position := csInterface;
+ FParser.Next;
+ end else
+ if (FParser.CurrTokenId = CSTII_Unit) and (Position = csStart) and (FAllowUnit) then
+ begin
+ Position := csUnit;
+ FIsUnit := True;
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ Cleanup;
+ exit;
+ end;
+ if fInCompile = 1 then
+ FUnitName := FParser.OriginalToken;
+ FParser.Next;
+ if FParser.CurrTokenId <> CSTI_Semicolon then
+ begin
+ MakeError('', ecSemicolonExpected, '');
+ Cleanup;
+ exit;
+ end;
+ FParser.Next;
+ end
+ else if (FParser.CurrTokenID = CSTII_Uses) and ((Position < csuses) or (Position = csInterface)) then
+ begin
+ if (Position = csInterface) or (Position =csInterfaceUses)
+ then Position := csInterfaceUses
+ else Position := csUses;
+ if not ProcessUses then
+ begin
+ Cleanup;
+ exit;
+ end;
+ end else if (FParser.CurrTokenId = CSTII_Procedure) or
+ (FParser.CurrTokenId = CSTII_Function) or (FParser.CurrTokenID = CSTI_OpenBlock) then
+ begin
+ if (Position = csInterface) or (position = csInterfaceUses) then
+ begin
+ if not ProcessFunction(True, nil) then
+ begin
+ Cleanup;
+ exit;
+ end;
+ end else begin
+ Position := csUses;
+ if not ProcessFunction(False, nil) then
+ begin
+ Cleanup;
+ exit;
+ end;
+ end;
+ end
+ else if (FParser.CurrTokenId = CSTII_Label) then
+ begin
+ if (Position = csInterface) or (Position =csInterfaceUses)
+ then Position := csInterfaceUses
+ else Position := csUses;
+ if not ProcessLabel(FGlobalBlock.Proc) then
+ begin
+ Cleanup;
+ exit;
+ end;
+ end
+ else if (FParser.CurrTokenId = CSTII_Var) then
+ begin
+ if (Position = csInterface) or (Position =csInterfaceUses)
+ then Position := csInterfaceUses
+ else Position := csUses;
+ if not DoVarBlock(nil) then
+ begin
+ Cleanup;
+ exit;
+ end;
+ end
+ else if (FParser.CurrTokenId = CSTII_Const) then
+ begin
+ if (Position = csInterface) or (Position =csInterfaceUses)
+ then Position := csInterfaceUses
+ else Position := csUses;
+ if not DoConstBlock then
+ begin
+ Cleanup;
+ exit;
+ end;
+ end
+ else if (FParser.CurrTokenId = CSTII_Type) then
+ begin
+ if (Position = csInterface) or (Position =csInterfaceUses)
+ then Position := csInterfaceUses
+ else Position := csUses;
+ if not DoTypeBlock(FParser) then
+ begin
+ Cleanup;
+ exit;
+ end;
+ end
+ else if (FParser.CurrTokenId = CSTII_Begin)
+ {$IFDEF PS_USESSUPPORT}
+ or ((FParser.CurrTokenID = CSTII_initialization) and FIsUnit) {$ENDIF} then //nvds
+ begin
+ {$IFDEF PS_USESSUPPORT}
+ if FIsUnit then
+ begin
+ Block := TPSBlockInfo.Create(nil); //nvds
+ Block.SubType := tUnitInit; //nvds
+ Block.Proc := NewProc(PSMainProcNameOrg+'_'+fModule, FastUpperCase(PSMainProcName+'_'+fModule)); //nvds
+ Block.ProcNo := FindProc(PSMainProcName+'_'+fModule); //nvds
+ Block.Proc.DeclareUnit:= fModule;
+ Block.Proc.DeclarePos := FParser.CurrTokenPos;
+ Block.Proc.DeclareRow := FParser.Row;
+ Block.Proc.DeclareCol := FParser.Col;
+ Block.Proc.Use;
+ FUnitInits.Add(Block);
+ if ProcessSub(Block) then
+ begin
+ if (Fparser.CurrTokenId = CSTI_EOF) THEN break;
+ end
+ else
+ begin
+ Cleanup;
+ exit;
+ end;
+ end
+ else
+ begin
+ FGlobalBlock.Proc.DeclareUnit:= fModule;
+ {$ENDIF}
+ FGlobalBlock.Proc.DeclarePos := FParser.CurrTokenPos;
+ FGlobalBlock.Proc.DeclareRow := FParser.Row;
+ FGlobalBlock.Proc.DeclareCol := FParser.Col;
+ if ProcessSub(FGlobalBlock) then
+ begin
+ break;
+ end
+ else
+ begin
+ Cleanup;
+ exit;
+ end;
+ {$IFDEF PS_USESSUPPORT}
+ end;
+ {$ENDIF}
+ end
+ {$IFDEF PS_USESSUPPORT}
+ else if ((FParser.CurrTokenID = CSTII_finalization) and FIsUnit) then //NvdS
+ begin
+ Block := TPSBlockInfo.Create(nil);
+ Block.SubType := tUnitFinish;
+ Block.Proc := NewProc('!Finish_'+fModule, '!FINISH_'+FastUppercase(fModule));
+ Block.ProcNo := FindProc('!FINISH_'+FastUppercase(fModule));
+ Block.Proc.DeclareUnit:= fModule;
+
+ Block.Proc.DeclarePos := FParser.CurrTokenPos;
+ Block.Proc.DeclareRow := FParser.Row;
+ Block.Proc.DeclareCol := FParser.Col;
+ Block.Proc.use;
+ FUnitFinits.Add(Block);
+ if ProcessSub(Block) then
+ begin
+ break;
+ end else begin
+ Cleanup;
+ Result := False; //Cleanup;
+ exit;
+ end;
+ end
+ {$endif}
+ else if (Fparser.CurrTokenId = CSTII_End) and (FAllowNoBegin or FIsUnit) then
+ begin
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Period then
+ begin
+ MakeError('', ecPeriodExpected, '');
+ Cleanup;
+ exit;
+ end;
+ break;
+ end else
+ begin
+ MakeError('', ecBeginExpected, '');
+ Cleanup;
+ exit;
+ end;
+ until False;
+
+ {$IFDEF PS_USESSUPPORT}
+ dec(fInCompile);
+ if fInCompile=0 then
+ begin
+ {$ENDIF}
+ if not ProcessLabelForwards(FGlobalBlock.Proc) then
+ begin
+ Cleanup;
+ exit;
+ end;
+ // NVDS: Do we need to check here also do a ProcessLabelForwards() for each Initialisation/finalization block?
+
+ for i := 0 to FProcs.Count -1 do
+ begin
+ Proc := FProcs[I];
+ if (Proc.ClassType = TPSInternalProcedure) and (TPSInternalProcedure(Proc).Forwarded) then
+ begin
+ with MakeError('', ecUnsatisfiedForward, TPSInternalProcedure(Proc).Name) do
+ begin
+ FPosition := TPSInternalProcedure(Proc).DeclarePos;
+ FRow := TPSInternalProcedure(Proc).DeclareRow;
+ FCol := TPSInternalProcedure(Proc).DeclareCol;
+ end;
+ Cleanup;
+ Exit;
+ end;
+ end;
+ if not CheckExports then
+ begin
+ Cleanup;
+ exit;
+ end;
+ for i := 0 to FVars.Count -1 do
+ begin
+ if not TPSVar(FVars[I]).Used then
+ begin
+ with MakeHint({$IFDEF PS_USESSUPPORT}TPSVar(FVars[I]).DeclareUnit{$ELSE}''{$ENDIF}, ehVariableNotUsed, TPSVar(FVars[I]).Name) do
+ begin
+ FPosition := TPSVar(FVars[I]).DeclarePos;
+ FRow := TPSVar(FVars[I]).DeclareRow;
+ FCol := TPSVar(FVars[I]).DeclareCol;
+ end;
+ end;
+ end;
+
+ Result := MakeOutput;
+ Cleanup;
+ {$IFDEF PS_USESSUPPORT}
+ end
+ else
+ begin
+ fParser.Free;
+ fParser:=OldParser;
+ fIsUnit:=OldIsUnit;
+ result:=true;
+ end;
+ {$ENDIF}
+end;
+
+constructor TPSPascalCompiler.Create;
+begin
+ inherited Create;
+ FParser := TPSPascalParser.Create;
+ FParser.OnParserError := ParserError;
+ FAutoFreeList := TPSList.Create;
+ FOutput := '';
+ {$IFDEF PS_USESSUPPORT}
+ FAllowUnit := true;
+ {$ENDIF}
+ FMessages := TPSList.Create;
+end;
+
+destructor TPSPascalCompiler.Destroy;
+begin
+ Clear;
+ FAutoFreeList.Free;
+
+ FMessages.Free;
+ FParser.Free;
+ inherited Destroy;
+end;
+
+function TPSPascalCompiler.GetOutput(var s: tbtString): Boolean;
+begin
+ if Length(FOutput) <> 0 then
+ begin
+ s := FOutput;
+ Result := True;
+ end
+ else
+ Result := False;
+end;
+
+function TPSPascalCompiler.GetMsg(l: Longint): TPSPascalCompilerMessage;
+begin
+ Result := FMessages[l];
+end;
+
+function TPSPascalCompiler.GetMsgCount: Longint;
+begin
+ Result := FMessages.Count;
+end;
+
+procedure TPSPascalCompiler.DefineStandardTypes;
+var
+ i: Longint;
+begin
+ AddType('Byte', btU8);
+ FDefaultBoolType := AddTypeS('Boolean', '(False, True)');
+ FDefaultBoolType.ExportName := True;
+ with TPSEnumType(AddType('LongBool', btEnum)) do
+ begin
+ HighValue := 2147483647; // make sure it's gonna be a 4 byte var
+ end;
+ with TPSEnumType(AddType('WordBool', btEnum)) do
+ begin
+ HighValue := 65535; // make sure it's gonna be a 2 byte var
+ end;
+ with TPSEnumType(AddType('ByteBool', btEnum)) do
+ begin
+ HighValue := 255; // make sure it's gonna be a 1 byte var
+ end;
+ //following 2 IFDEFs should actually be UNICODE IFDEFs...
+ AddType({$IFDEF PS_PANSICHAR}'AnsiChar'{$ELSE}'Char'{$ENDIF}, btChar);
+ {$IFDEF PS_PANSICHAR}
+ AddType('Char', btWideChar);
+ {$ENDIF}
+ {$IFNDEF PS_NOWIDESTRING}
+ AddType('WideChar', btWideChar);
+ AddType('WideString', btWideString);
+ AddType('UnicodeString', btUnicodeString);
+ {$ENDIF}
+ AddType('AnsiString', btString);
+ {$IFDEF DELPHI2009UP}
+ AddType('String', btUnicodeString);
+ ADdType('NativeString', btUnicodeString);
+ {$ELSE}
+ AddType('String', btString);
+ AddType('NativeString', btString);
+ {$ENDIF}
+ FAnyString := AddType('AnyString', btString);
+ AddType('ShortInt', btS8);
+ AddType('Word', btU16);
+ AddType('SmallInt', btS16);
+ AddType('LongInt', btS32);
+ at2ut(AddType('___Pointer', btPointer));
+ AddType('LongWord', btU32);
+ AddTypeCopyN('Integer', 'LONGINT');
+ AddTypeCopyN('Cardinal', 'LONGWORD');
+ AddType('tbtString', btString);
+ {$IFNDEF PS_NOINT64}
+ AddType('Int64', btS64);
+ {$ENDIF}
+ AddType('Single', btSingle);
+ AddType('Double', btDouble);
+ AddType('Extended', btExtended);
+ AddType('Currency', btCurrency);
+ AddType({$IFDEF PS_PANSICHAR}'PAnsiChar'{$ELSE}'PChar'{$ENDIF}, btPChar);
+ AddType('Variant', btVariant);
+ AddType('!NotificationVariant', btNotificationVariant);
+ for i := FTypes.Count -1 downto 0 do AT2UT(FTypes[i]);
+ TPSArrayType(AddType('TVariantArray', btArray)).ArrayTypeNo := FindType('VARIANT');
+
+ with AddFunction('function Assigned(I: Longint): Boolean;') do
+ begin
+ Name := '!ASSIGNED';
+ end;
+
+ with AddFunction('procedure _T(Name: tbtString; v: Variant);') do
+ begin
+ Name := '!NOTIFICATIONVARIANTSET';
+ end;
+ with AddFunction('function _T(Name: tbtString): Variant;') do
+ begin
+ Name := '!NOTIFICATIONVARIANTGET';
+ end;
+end;
+
+
+function TPSPascalCompiler.FindType(const Name: tbtString): TPSType;
+var
+ i, n: Longint;
+ RName: tbtString;
+begin
+ if FProcs = nil then begin Result := nil; exit;end;
+ RName := Fastuppercase(Name);
+ n := makehash(rname);
+ for i := FTypes.Count - 1 downto 0 do
+ begin
+ Result := FTypes.Data[I];
+ if (Result.NameHash = n) and (Result.name = rname) then
+ begin
+ Result := GetTypeCopyLink(Result);
+ exit;
+ end;
+ end;
+ result := nil;
+end;
+
+function TPSPascalCompiler.AddConstant(const Name: tbtString; FType: TPSType): TPSConstant;
+var
+ pc: TPSConstant;
+ val: PIfRVariant;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+
+ FType := GetTypeCopyLink(FType);
+ if FType = nil then
+ Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterConst, [name]);
+ pc := TPSConstant.Create;
+ pc.OrgName := name;
+ pc.Name := FastUppercase(name);
+ pc.DeclarePos:=InvalidVal;
+ {$IFDEF PS_USESSUPPORT}
+ pc.DeclareUnit:=fModule;
+ {$ENDIF}
+ New(Val);
+ InitializeVariant(Val, FType);
+ pc.Value := Val;
+ FConstants.Add(pc);
+ result := pc;
+end;
+
+function TPSPascalCompiler.ReadAttributes(Dest: TPSAttributes): Boolean;
+var
+ Att: TPSAttributeType;
+ at: TPSAttribute;
+ varp: PIfRVariant;
+ h, i: Longint;
+ s: tbtString;
+begin
+ if FParser.CurrTokenID <> CSTI_OpenBlock then begin Result := true; exit; end;
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_Identifier then
+ begin
+ MakeError('', ecIdentifierExpected, '');
+ Result := False;
+ exit;
+ end;
+ s := FParser.GetToken;
+ h := MakeHash(s);
+ att := nil;
+ for i := FAttributeTypes.count -1 downto 0 do
+ begin
+ att := FAttributeTypes[i];
+ if (att.FNameHash = h) and (att.FName = s) then
+ Break;
+ att := nil;
+ end;
+ if att = nil then
+ begin
+ MakeError('', ecUnknownIdentifier, '');
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ i := 0;
+ at := Dest.Add(att);
+ while att.Fields[i].Hidden do
+ begin
+ at.AddValue(NewVariant(at2ut(att.Fields[i].FieldType)));
+ inc(i);
+ end;
+ if FParser.CurrTokenId <> CSTI_OpenRound then
+ begin
+ MakeError('', ecOpenRoundExpected, '');
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ if i < Att.FieldCount then
+ begin
+ while i < att.FieldCount do
+ begin
+ varp := ReadConstant(FParser, CSTI_CloseRound);
+ if varp = nil then
+ begin
+ Result := False;
+ exit;
+ end;
+ at.AddValue(varp);
+ if not IsCompatibleType(varp.FType, Att.Fields[i].FieldType, False) then
+ begin
+ MakeError('', ecTypeMismatch, '');
+ Result := False;
+ exit;
+ end;
+ Inc(i);
+ while (i < Att.FieldCount) and (att.Fields[i].Hidden) do
+ begin
+ at.AddValue(NewVariant(at2ut(att.Fields[i].FieldType)));
+ inc(i);
+ end;
+ if i >= Att.FieldCount then
+ begin
+ break;
+ end else
+ begin
+ if FParser.CurrTokenID <> CSTI_Comma then
+ begin
+ MakeError('', ecCommaExpected, '');
+ Result := False;
+ exit;
+ end;
+ end;
+ FParser.Next;
+ end;
+ end;
+ if FParser.CurrTokenID <> CSTI_CloseRound then
+ begin
+ MakeError('', ecCloseRoundExpected, '');
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ if FParser.CurrTokenID <> CSTI_CloseBlock then
+ begin
+ MakeError('', ecCloseBlockExpected, '');
+ Result := False;
+ exit;
+ end;
+ FParser.Next;
+ Result := True;
+end;
+
+type
+ TConstOperation = class(TObject)
+ private
+ FDeclPosition, FDeclRow, FDeclCol: Cardinal;
+ public
+ property DeclPosition: Cardinal read FDeclPosition write FDeclPosition;
+ property DeclRow: Cardinal read FDeclRow write FDeclRow;
+ property DeclCol: Cardinal read FDeclCol write FDeclCol;
+ procedure SetPos(Parser: TPSPascalParser);
+ end;
+
+ TUnConstOperation = class(TConstOperation)
+ private
+ FOpType: TPSUnOperatorType;
+ FVal1: TConstOperation;
+ public
+ property OpType: TPSUnOperatorType read FOpType write FOpType;
+ property Val1: TConstOperation read FVal1 write FVal1;
+
+ destructor Destroy; override;
+ end;
+
+ TBinConstOperation = class(TConstOperation)
+ private
+ FOpType: TPSBinOperatorType;
+ FVal2: TConstOperation;
+ FVal1: TConstOperation;
+ public
+ property OpType: TPSBinOperatorType read FOpType write FOpType;
+ property Val1: TConstOperation read FVal1 write FVal1;
+ property Val2: TConstOperation read FVal2 write FVal2;
+
+ destructor Destroy; override;
+ end;
+
+ TConstData = class(TConstOperation)
+ private
+ FData: PIfRVariant;
+ public
+ property Data: PIfRVariant read FData write FData;
+ destructor Destroy; override;
+ end;
+
+
+function TPSPascalCompiler.IsBoolean(aType: TPSType): Boolean;
+begin
+ Result := (AType = FDefaultBoolType)
+ or (AType.Name = 'LONGBOOL')
+ or (AType.Name = 'WORDBOOL')
+ or (AType.Name = 'BYTEBOOL');
+end;
+
+
+function TPSPascalCompiler.ReadConstant(FParser: TPSPascalParser; StopOn: TPSPasToken): PIfRVariant;
+
+ function ReadExpression: TConstOperation; forward;
+ function ReadTerm: TConstOperation; forward;
+ function ReadFactor: TConstOperation;
+ var
+ NewVar: TConstOperation;
+ NewVarU: TUnConstOperation;
+ function GetConstantIdentifier: PIfRVariant;
+ var
+ s: tbtString;
+ sh: Longint;
+ i: Longint;
+ p: TPSConstant;
+ begin
+ s := FParser.GetToken;
+ sh := MakeHash(s);
+ for i := FConstants.Count -1 downto 0 do
+ begin
+ p := FConstants[I];
+ if (p.NameHash = sh) and (p.Name = s) then
+ begin
+ New(Result);
+ InitializeVariant(Result, p.Value.FType);
+ CopyVariantContents(P.Value, Result);
+ FParser.Next;
+ exit;
+ end;
+ end;
+ MakeError('', ecUnknownIdentifier, '');
+ Result := nil;
+ end;
+ begin
+ case fParser.CurrTokenID of
+ CSTII_Not:
+ begin
+ FParser.Next;
+ NewVar := ReadFactor;
+ if NewVar = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ NewVarU := TUnConstOperation.Create;
+ NewVarU.OpType := otNot;
+ NewVarU.Val1 := NewVar;
+ NewVar := NewVarU;
+ end;
+ CSTI_Minus:
+ begin
+ FParser.Next;
+ NewVar := ReadTerm;
+ if NewVar = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ NewVarU := TUnConstOperation.Create;
+ NewVarU.OpType := otMinus;
+ NewVarU.Val1 := NewVar;
+ NewVar := NewVarU;
+ end;
+ CSTI_OpenRound:
+ begin
+ FParser.Next;
+ NewVar := ReadExpression;
+ if NewVar = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ if FParser.CurrTokenId <> CSTI_CloseRound then
+ begin
+ NewVar.Free;
+ Result := nil;
+ MakeError('', ecCloseRoundExpected, '');
+ exit;
+ end;
+ FParser.Next;
+ end;
+ CSTI_Char, CSTI_String:
+ begin
+ NewVar := TConstData.Create;
+ NewVar.SetPos(FParser);
+ TConstData(NewVar).Data := ReadString;
+ end;
+ CSTI_HexInt, CSTI_Integer:
+ begin
+ NewVar := TConstData.Create;
+ NewVar.SetPos(FParser);
+ TConstData(NewVar).Data := ReadInteger(FParser.GetToken);
+ FParser.Next;
+ end;
+ CSTI_Real:
+ begin
+ NewVar := TConstData.Create;
+ NewVar.SetPos(FParser);
+ TConstData(NewVar).Data := ReadReal(FParser.GetToken);
+ FParser.Next;
+ end;
+ CSTI_Identifier:
+ begin
+ NewVar := TConstData.Create;
+ NewVar.SetPos(FParser);
+ TConstData(NewVar).Data := GetConstantIdentifier;
+ if TConstData(NewVar).Data = nil then
+ begin
+ NewVar.Free;
+ Result := nil;
+ exit;
+ end
+ end;
+ else
+ begin
+ MakeError('', ecSyntaxError, '');
+ Result := nil;
+ exit;
+ end;
+ end; {case}
+ Result := NewVar;
+ end; // ReadFactor
+
+ function ReadTerm: TConstOperation;
+ var
+ F1, F2: TConstOperation;
+ F: TBinConstOperation;
+ Token: TPSPasToken;
+ Op: TPSBinOperatorType;
+ begin
+ F1 := ReadFactor;
+ if F1 = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ while FParser.CurrTokenID in [CSTI_Multiply, CSTI_Divide, CSTII_Div, CSTII_Mod, CSTII_And, CSTII_Shl, CSTII_Shr] do
+ begin
+ Token := FParser.CurrTokenID;
+ FParser.Next;
+ F2 := ReadFactor;
+ if f2 = nil then
+ begin
+ f1.Free;
+ Result := nil;
+ exit;
+ end;
+ case Token of
+ CSTI_Multiply: Op := otMul;
+ CSTII_div, CSTI_Divide: Op := otDiv;
+ CSTII_mod: Op := otMod;
+ CSTII_and: Op := otAnd;
+ CSTII_shl: Op := otShl;
+ CSTII_shr: Op := otShr;
+ else
+ Op := otAdd;
+ end;
+ F := TBinConstOperation.Create;
+ f.Val1 := F1;
+ f.Val2 := F2;
+ f.OpType := Op;
+ f1 := f;
+ end;
+ Result := F1;
+ end; // ReadTerm
+
+ function ReadSimpleExpression: TConstOperation;
+ var
+ F1, F2: TConstOperation;
+ F: TBinConstOperation;
+ Token: TPSPasToken;
+ Op: TPSBinOperatorType;
+ begin
+ F1 := ReadTerm;
+ if F1 = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ while FParser.CurrTokenID in [CSTI_Plus, CSTI_Minus, CSTII_Or, CSTII_Xor] do
+ begin
+ Token := FParser.CurrTokenID;
+ FParser.Next;
+ F2 := ReadTerm;
+ if f2 = nil then
+ begin
+ f1.Free;
+ Result := nil;
+ exit;
+ end;
+ case Token of
+ CSTI_Plus: Op := otAdd;
+ CSTI_Minus: Op := otSub;
+ CSTII_or: Op := otOr;
+ CSTII_xor: Op := otXor;
+ else
+ Op := otAdd;
+ end;
+ F := TBinConstOperation.Create;
+ f.Val1 := F1;
+ f.Val2 := F2;
+ f.OpType := Op;
+ f1 := f;
+ end;
+ Result := F1;
+ end; // ReadSimpleExpression
+
+
+ function ReadExpression: TConstOperation;
+ var
+ F1, F2: TConstOperation;
+ F: TBinConstOperation;
+ Token: TPSPasToken;
+ Op: TPSBinOperatorType;
+ begin
+ F1 := ReadSimpleExpression;
+ if F1 = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ while FParser.CurrTokenID in [ CSTI_GreaterEqual, CSTI_LessEqual, CSTI_Greater, CSTI_Less, CSTI_Equal, CSTI_NotEqual] do
+ begin
+ Token := FParser.CurrTokenID;
+ FParser.Next;
+ F2 := ReadSimpleExpression;
+ if f2 = nil then
+ begin
+ f1.Free;
+ Result := nil;
+ exit;
+ end;
+ case Token of
+ CSTI_GreaterEqual: Op := otGreaterEqual;
+ CSTI_LessEqual: Op := otLessEqual;
+ CSTI_Greater: Op := otGreater;
+ CSTI_Less: Op := otLess;
+ CSTI_Equal: Op := otEqual;
+ CSTI_NotEqual: Op := otNotEqual;
+ else
+ Op := otAdd;
+ end;
+ F := TBinConstOperation.Create;
+ f.Val1 := F1;
+ f.Val2 := F2;
+ f.OpType := Op;
+ f1 := f;
+ end;
+ Result := F1;
+ end; // ReadExpression
+
+
+ function EvalConst(P: TConstOperation): PIfRVariant;
+ var
+ p1, p2: PIfRVariant;
+ begin
+ if p is TBinConstOperation then
+ begin
+ p1 := EvalConst(TBinConstOperation(p).Val1);
+ if p1 = nil then begin Result := nil; exit; end;
+ p2 := EvalConst(TBinConstOperation(p).Val2);
+ if p2 = nil then begin DisposeVariant(p1); Result := nil; exit; end;
+ if not PreCalc(False, 0, p1, 0, p2, TBinConstOperation(p).OpType, p.DeclPosition, p.DeclRow, p.DeclCol) then
+ begin
+ DisposeVariant(p1);
+ DisposeVariant(p2);
+// MakeError('', ecTypeMismatch, '');
+ result := nil;
+ exit;
+ end;
+ DisposeVariant(p2);
+ Result := p1;
+ end else if p is TUnConstOperation then
+ begin
+ with TUnConstOperation(P) do
+ begin
+ p1 := EvalConst(Val1);
+ case OpType of
+ otNot:
+ case p1.FType.BaseType of
+ btU8: p1.tu8 := not p1.tu8;
+ btU16: p1.tu16 := not p1.tu16;
+ btU32: p1.tu32 := not p1.tu32;
+ bts8: p1.ts8 := not p1.ts8;
+ bts16: p1.ts16 := not p1.ts16;
+ bts32: p1.ts32 := not p1.ts32;
+ {$IFNDEF PS_NOINT64}
+ bts64: p1.ts64 := not p1.ts64;
+ {$ENDIF}
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ DisposeVariant(p1);
+ Result := nil;
+ exit;
+ end;
+ end;
+ otMinus:
+ case p1.FType.BaseType of
+ btU8: p1.tu8 := -p1.tu8;
+ btU16: p1.tu16 := -p1.tu16;
+ btU32: p1.tu32 := -p1.tu32;
+ bts8: p1.ts8 := -p1.ts8;
+ bts16: p1.ts16 := -p1.ts16;
+ bts32: p1.ts32 := -p1.ts32;
+ {$IFNDEF PS_NOINT64}
+ bts64: p1.ts64 := -p1.ts64;
+ {$ENDIF}
+ btDouble: p1.tdouble := - p1.tDouble;
+ btSingle: p1.tsingle := - p1.tsingle;
+ btCurrency: p1.tcurrency := - p1.tcurrency;
+ btExtended: p1.textended := - p1.textended;
+ else
+ begin
+ MakeError('', ecTypeMismatch, '');
+ DisposeVariant(p1);
+ Result := nil;
+ exit;
+ end;
+ end;
+ else
+ begin
+ DisposeVariant(p1);
+ Result := nil;
+ exit;
+ end;
+ end;
+ end;
+ Result := p1;
+ end else
+ begin
+ if ((p as TConstData).Data.FType.BaseType = btString)
+ and (length(tbtstring((p as TConstData).Data.tstring)) =1) then
+ begin
+ New(p1);
+ InitializeVariant(p1, FindBaseType(btChar));
+ p1.tchar := tbtstring((p as TConstData).Data.tstring)[1];
+ Result := p1;
+ end else begin
+ New(p1);
+ InitializeVariant(p1, (p as TConstData).Data.FType);
+ CopyVariantContents((p as TConstData).Data, p1);
+ Result := p1;
+ end;
+ end;
+ end;
+
+var
+ Val: TConstOperation;
+begin
+ Val := ReadExpression;
+ if val = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ Result := EvalConst(Val);
+ Val.Free;
+end;
+
+procedure TPSPascalCompiler.WriteDebugData(const s: tbtString);
+begin
+ FDebugOutput := FDebugOutput + s;
+end;
+
+function TPSPascalCompiler.GetDebugOutput(var s: tbtString): Boolean;
+begin
+ if Length(FDebugOutput) <> 0 then
+ begin
+ s := FDebugOutput;
+ Result := True;
+ end
+ else
+ Result := False;
+end;
+
+function TPSPascalCompiler.AddUsedFunction(var Proc: TPSInternalProcedure): Cardinal;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Proc := TPSInternalProcedure.Create;
+ FProcs.Add(Proc);
+ Result := FProcs.Count - 1;
+end;
+
+{$IFNDEF PS_NOINTERFACES}
+const
+ IUnknown_Guid: TGuid = (D1: 0; d2: 0; d3: 0; d4: ($c0,00,00,00,00,00,00,$46));
+ IDispatch_Guid: Tguid = (D1: $20400; D2: $0; D3: $0; D4:($C0, $0, $0, $0, $0, $0, $0, $46));
+{$ENDIF}
+
+procedure TPSPascalCompiler.DefineStandardProcedures;
+var
+ p: TPSRegProc;
+begin
+ {$IFNDEF PS_NOINT64}
+ AddFunction('function IntToStr(i: Int64): String;');
+ {$ELSE}
+ AddFunction('function IntTostr(i: Integer): String;');
+ {$ENDIF}
+ AddFunction('function StrToInt(s: String): Longint;');
+ AddFunction('function StrToIntDef(s: String; def: Longint): Longint;');
+ AddFunction('function Copy(s: AnyString; iFrom, iCount: Longint): AnyString;');
+ AddFunction('function Pos(SubStr, S: AnyString): Longint;');
+ AddFunction('procedure Delete(var s: AnyString; ifrom, icount: Longint);');
+ AddFunction('procedure Insert(s: AnyString; var s2: AnyString; iPos: Longint);');
+ p := AddFunction('function GetArrayLength: integer;');
+ with P.Decl.AddParam do
+ begin
+ OrgName := 'arr';
+ Mode := pmInOut;
+ end;
+ p := AddFunction('procedure SetArrayLength;');
+ with P.Decl.AddParam do
+ begin
+ OrgName := 'arr';
+ Mode := pmInOut;
+ end;
+ with P.Decl.AddParam do
+ begin
+ OrgName := 'count';
+ aType := FindBaseType(btS32);
+ end;
+ AddFunction('Function StrGet(var S : String; I : Integer) : Char;');
+ AddFunction('Function StrGet2(S : String; I : Integer) : Char;');
+ AddFunction('procedure StrSet(c : Char; I : Integer; var s : String);');
+ {$IFNDEF PS_NOWIDESTRING}
+ AddFunction('Function WStrGet(var S : AnyString; I : Integer) : WideChar;');
+ AddFunction('procedure WStrSet(c : AnyString; I : Integer; var s : AnyString);');
+ {$ENDIF}
+ AddFunction('Function AnsiUppercase(s : String) : String;');
+ AddFunction('Function AnsiLowercase(s : String) : String;');
+ AddFunction('Function Uppercase(s : AnyString) : AnyString;');
+ AddFunction('Function Lowercase(s : AnyString) : AnyString;');
+ AddFunction('Function Trim(s : AnyString) : AnyString;');
+ AddFunction('function Length: Integer;').Decl.AddParam.OrgName:='s';
+ with AddFunction('procedure SetLength;').Decl do
+ begin
+ with AddParam do
+ begin
+ OrgName:='s';
+ Mode:=pmInOut;
+ end;
+ with AddParam do
+ begin
+ OrgName:='NewLength';
+ aType:=FindBaseType(btS32); //Integer
+ end;
+ end;
+ {$IFNDEF PS_NOINT64}
+ AddFunction('function Low: Int64;').Decl.AddParam.OrgName:='x';
+ AddFunction('function High: Int64;').Decl.AddParam.OrgName:='x';
+ {$ELSE}
+ AddFunction('function Low: Integer;').Decl.AddParam.OrgName:='x';
+ AddFunction('function High: Integer;').Decl.AddParam.OrgName:='x';
+ {$ENDIF}
+ with AddFunction('procedure Dec;').Decl do begin
+ with AddParam do
+ begin
+ OrgName:='x';
+ Mode:=pmInOut;
+ end;
+ end;
+ with AddFunction('procedure Inc;').Decl do begin
+ with AddParam do
+ begin
+ OrgName:='x';
+ Mode:=pmInOut;
+ end;
+ end;
+ AddFunction('Function Sin(e : Extended) : Extended;');
+ AddFunction('Function Cos(e : Extended) : Extended;');
+ AddFunction('Function Sqrt(e : Extended) : Extended;');
+ AddFunction('Function Round(e : Extended) : Longint;');
+ AddFunction('Function Trunc(e : Extended) : Longint;');
+ AddFunction('Function Int(e : Extended) : Extended;');
+ AddFunction('Function Pi : Extended;');
+ AddFunction('Function Abs(e : Extended) : Extended;');
+ AddFunction('function StrToFloat(s: String): Extended;');
+ AddFunction('Function FloatToStr(e : Extended) : String;');
+ AddFunction('Function Padl(s : AnyString;I : longInt) : AnyString;');
+ AddFunction('Function Padr(s : AnyString;I : longInt) : AnyString;');
+ AddFunction('Function Padz(s : AnyString;I : longInt) : AnyString;');
+ AddFunction('Function Replicate(c : char;I : longInt) : String;');
+ AddFunction('Function StringOfChar(c : char;I : longInt) : String;');
+ AddTypeS('TVarType', 'Word');
+ AddConstantN('varEmpty', 'Word').Value.tu16 := varempty;
+ AddConstantN('varNull', 'Word').Value.tu16 := varnull;
+ AddConstantN('varSmallInt', 'Word').Value.tu16 := varsmallint;
+ AddConstantN('varInteger', 'Word').Value.tu16 := varinteger;
+ AddConstantN('varSingle', 'Word').Value.tu16 := varsingle;
+ AddConstantN('varDouble', 'Word').Value.tu16 := vardouble;
+ AddConstantN('varCurrency', 'Word').Value.tu16 := varcurrency;
+ AddConstantN('varDate', 'Word').Value.tu16 := vardate;
+ AddConstantN('varOleStr', 'Word').Value.tu16 := varolestr;
+ AddConstantN('varDispatch', 'Word').Value.tu16 := vardispatch;
+ AddConstantN('varError', 'Word').Value.tu16 := varerror;
+ AddConstantN('varBoolean', 'Word').Value.tu16 := varboolean;
+ AddConstantN('varVariant', 'Word').Value.tu16 := varvariant;
+ AddConstantN('varUnknown', 'Word').Value.tu16 := varunknown;
+{$IFDEF DELPHI6UP}
+ AddConstantN('varShortInt', 'Word').Value.tu16 := varshortint;
+ AddConstantN('varByte', 'Word').Value.tu16 := varbyte;
+ AddConstantN('varWord', 'Word').Value.tu16 := varword;
+ AddConstantN('varLongWord', 'Word').Value.tu16 := varlongword;
+ AddConstantN('varInt64', 'Word').Value.tu16 := varint64;
+{$ENDIF}
+{$IFDEF DELPHI5UP}
+ AddConstantN('varStrArg', 'Word').Value.tu16 := varstrarg;
+ AddConstantN('varAny', 'Word').Value.tu16 := varany;
+{$ENDIF}
+ AddConstantN('varString', 'Word').Value.tu16 := varstring;
+ AddConstantN('varTypeMask', 'Word').Value.tu16 := vartypemask;
+ AddConstantN('varArray', 'Word').Value.tu16 := vararray;
+ AddConstantN('varByRef', 'Word').Value.tu16 := varByRef;
+{$IFDEF UNICODE}
+ AddConstantN('varUString', 'Word').Value.tu16 := varUString;
+{$ENDIF}
+ AddDelphiFunction('function Unassigned: Variant;');
+ AddDelphiFunction('function VarIsEmpty(const V: Variant): Boolean;');
+ AddDelphiFunction('function Null: Variant;');
+ AddDelphiFunction('function VarIsNull(const V: Variant): Boolean;');
+ AddDelphiFunction('function VarType(const V: Variant): TVarType;');
+ addTypeS('TIFException', '(ErNoError, erCannotImport, erInvalidType, ErInternalError, '+
+ 'erInvalidHeader, erInvalidOpcode, erInvalidOpcodeParameter, erNoMainProc, erOutOfGlobalVarsRange, '+
+ 'erOutOfProcRange, ErOutOfRange, erOutOfStackRange, ErTypeMismatch, erUnexpectedEof, '+
+ 'erVersionError, ErDivideByZero, ErMathError,erCouldNotCallProc, erOutofRecordRange, '+
+ 'erOutOfMemory, erException, erNullPointerException, erNullVariantError, erInterfaceNotSupported, erCustomError)');
+ AddFunction('procedure RaiseLastException;');
+ AddFunction('procedure RaiseException(Ex: TIFException; Param: String);');
+ AddFunction('function ExceptionType: TIFException;');
+ AddFunction('function ExceptionParam: String;');
+ AddFunction('function ExceptionProc: Cardinal;');
+ AddFunction('function ExceptionPos: Cardinal;');
+ AddFunction('function ExceptionToString(er: TIFException; Param: String): String;');
+ {$IFNDEF PS_NOINT64}
+ AddFunction('function StrToInt64(s: String): int64;');
+ AddFunction('function Int64ToStr(i: Int64): String;');
+ {$ENDIF}
+
+ with AddFunction('function SizeOf: Longint;').Decl.AddParam do
+ begin
+ OrgName := 'Data';
+ end;
+{$IFNDEF PS_NOINTERFACES}
+ with AddInterface(nil, IUnknown_Guid, 'IUnknown') do
+ begin
+ RegisterDummyMethod; // Query Interface
+ RegisterDummyMethod; // _AddRef
+ RegisterDummyMethod; // _Release
+ end;
+ with AddInterface(nil, IUnknown_Guid, 'IInterface') do
+ begin
+ RegisterDummyMethod; // Query Interface
+ RegisterDummyMethod; // _AddRef
+ RegisterDummyMethod; // _Release
+ end;
+
+ {$IFNDEF PS_NOIDISPATCH}
+ with AddInterface(FindInterface('IUnknown'), IDispatch_Guid, 'IDispatch') do
+ begin
+ RegisterDummyMethod; // GetTypeCount
+ RegisterDummyMethod; // GetTypeInfo
+ RegisterDummyMethod; // GetIdsOfName
+ RegisterDummyMethod; // Invoke
+ end;
+ with TPSInterfaceType(FindType('IDispatch')) do
+ begin
+ ExportName := True;
+ end;
+ AddDelphiFunction('function IDispatchInvoke(Self: IDispatch; PropertySet: Boolean; const Name: String; Par: array of variant): variant;');
+ {$ENDIF}
+{$ENDIF}
+end;
+
+function TPSPascalCompiler.GetTypeCount: Longint;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := FTypes.Count;
+end;
+
+function TPSPascalCompiler.GetType(I: Longint): TPSType;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := FTypes[I];
+end;
+
+function TPSPascalCompiler.GetVarCount: Longint;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := FVars.Count;
+end;
+
+function TPSPascalCompiler.GetVar(I: Longint): TPSVar;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := FVars[i];
+end;
+
+function TPSPascalCompiler.GetProcCount: Longint;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := FProcs.Count;
+end;
+
+function TPSPascalCompiler.GetProc(I: Longint): TPSProcedure;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := FProcs[i];
+end;
+
+
+
+
+function TPSPascalCompiler.AddUsedFunction2(var Proc: TPSExternalProcedure): Cardinal;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Proc := TPSExternalProcedure.Create;
+ FProcs.Add(Proc);
+ Result := FProcs.Count -1;
+end;
+
+function TPSPascalCompiler.AddVariable(const Name: tbtString; FType: TPSType): TPSVar;
+var
+ P: TPSVar;
+ s:string;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ if FType = nil then raise EPSCompilerException.CreateFmt(RPS_InvalidTypeForVar, [Name]);
+ s := Fastuppercase(Name);
+ if IsDuplicate(s,[dcVars]) then raise EPSCompilerException.CreateFmt(RPS_DuplicateIdent, [Name]);
+
+ p := TPSVar.Create;
+ p.OrgName := Name;
+ p.Name := s;
+ p.FType := AT2UT(FType);
+ p.exportname := p.Name;
+ FVars.Add(p);
+ Result := P;
+end;
+
+function TPSPascalCompiler.AddAttributeType: TPSAttributeType;
+begin
+ if FAttributeTypes = nil then Raise Exception.Create(RPS_OnUseEventOnly);
+ Result := TPSAttributeType.Create;
+ FAttributeTypes.Add(Result);
+end;
+
+function TPSPascalCompiler.FindAttributeType(const Name: tbtString): TPSAttributeType;
+var
+ h, i: Integer;
+ n: tbtString;
+begin
+ if FAttributeTypes = nil then Raise Exception.Create(RPS_OnUseEventOnly);
+ n := FastUpperCase(Name);
+ h := MakeHash(n);
+ for i := FAttributeTypes.Count -1 downto 0 do
+ begin
+ result := TPSAttributeType(FAttributeTypes[i]);
+ if (Result.NameHash = h) and (Result.Name = n) then
+ exit;
+ end;
+ result := nil;
+end;
+function TPSPascalCompiler.GetConstCount: Longint;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ result := FConstants.Count;
+end;
+
+function TPSPascalCompiler.GetConst(I: Longint): TPSConstant;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := TPSConstant(FConstants[i]);
+end;
+
+function TPSPascalCompiler.GetRegProcCount: Longint;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := FRegProcs.Count;
+end;
+
+function TPSPascalCompiler.GetRegProc(I: Longint): TPSRegProc;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := TPSRegProc(FRegProcs[i]);
+end;
+
+
+procedure TPSPascalCompiler.AddToFreeList(Obj: TObject);
+begin
+ FAutoFreeList.Add(Obj);
+end;
+
+function TPSPascalCompiler.AddConstantN(const Name,
+ FType: tbtString): TPSConstant;
+begin
+ Result := AddConstant(Name, FindType(FType));
+end;
+
+function TPSPascalCompiler.AddTypeCopy(const Name: tbtString;
+ TypeNo: TPSType): TPSType;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ TypeNo := GetTypeCopyLink(TypeNo);
+ if Typeno = nil then raise EPSCompilerException.Create(RPS_InvalidType);
+ Result := AddType(Name, BtTypeCopy);
+ TPSTypeLink(Result).LinkTypeNo := TypeNo;
+end;
+
+function TPSPascalCompiler.AddTypeCopyN(const Name,
+ FType: tbtString): TPSType;
+begin
+ Result := AddTypeCopy(Name, FindType(FType));
+end;
+
+
+function TPSPascalCompiler.AddUsedVariable(const Name: tbtString;
+ FType: TPSType): TPSVar;
+begin
+ Result := AddVariable(Name, FType);
+ if Result <> nil then
+ Result.Use;
+end;
+
+function TPSPascalCompiler.AddUsedVariableN(const Name,
+ FType: tbtString): TPSVar;
+begin
+ Result := AddVariable(Name, FindType(FType));
+ if Result <> nil then
+ Result.Use;
+end;
+
+function TPSPascalCompiler.AddVariableN(const Name,
+ FType: tbtString): TPSVar;
+begin
+ Result := AddVariable(Name, FindType(FType));
+end;
+
+function TPSPascalCompiler.AddUsedPtrVariable(const Name: tbtString; FType: TPSType): TPSVar;
+begin
+ Result := AddVariable(Name, FType);
+ if Result <> nil then
+ begin
+ result.SaveAsPointer := True;
+ Result.Use;
+ end;
+end;
+
+function TPSPascalCompiler.AddUsedPtrVariableN(const Name, FType: tbtString): TPSVar;
+begin
+ Result := AddVariable(Name, FindType(FType));
+ if Result <> nil then
+ begin
+ result.SaveAsPointer := True;
+ Result.Use;
+ end;
+end;
+
+function TPSPascalCompiler.AddTypeS(const Name, Decl: tbtString): TPSType;
+var
+ Parser: TPSPascalParser;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Parser := TPSPascalParser.Create;
+ Parser.SetText(Decl);
+ Result := ReadType(Name, Parser);
+ if Result<>nil then
+ begin
+ Result.DeclarePos:=InvalidVal;
+ {$IFDEF PS_USESSUPPORT}
+ Result.DeclareUnit:=fModule;
+ {$ENDIF}
+ Result.DeclareRow:=0;
+ Result.DeclareCol:=0;
+ end;
+ Parser.Free;
+ if result = nil then Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterType, [name]);
+end;
+
+
+function TPSPascalCompiler.CheckCompatProc(P: TPSType; ProcNo: Cardinal): Boolean;
+var
+ i: Longint;
+ s1, s2: TPSParametersDecl;
+begin
+ if p.BaseType <> btProcPtr then begin
+ Result := False;
+ Exit;
+ end;
+
+ S1 := TPSProceduralType(p).ProcDef;
+
+ if TPSProcedure(FProcs[ProcNo]).ClassType = TPSInternalProcedure then
+ s2 := TPSInternalProcedure(FProcs[ProcNo]).Decl
+ else
+ s2 := TPSExternalProcedure(FProcs[ProcNo]).RegProc.Decl;
+ if (s1.Result <> s2.Result) or (s1.ParamCount <> s2.ParamCount) then
+ begin
+ Result := False;
+ Exit;
+ end;
+ for i := 0 to s1.ParamCount -1 do
+ begin
+ if (s1.Params[i].Mode <> s2.Params[i].Mode) or (s1.Params[i].aType <> s2.Params[i].aType) then
+ begin
+ Result := False;
+ Exit;
+ end;
+ end;
+ Result := True;
+end;
+
+function TPSPascalCompiler.MakeExportDecl(decl: TPSParametersDecl): tbtString;
+var
+ i: Longint;
+begin
+ if Decl.Result = nil then result := '-1' else
+ result := IntToStr(Decl.Result.FinalTypeNo);
+
+ for i := 0 to decl.ParamCount -1 do
+ begin
+ if decl.GetParam(i).Mode = pmIn then
+ Result := Result + ' @'
+ else
+ Result := Result + ' !';
+ Result := Result + inttostr(decl.GetParam(i).aType.FinalTypeNo);
+ end;
+end;
+
+
+function TPSPascalCompiler.IsIntBoolType(aType: TPSType): Boolean;
+begin
+ if Isboolean(aType) then begin Result := True; exit;end;
+
+ case aType.BaseType of
+ btU8, btS8, btU16, btS16, btU32, btS32{$IFNDEF PS_NOINT64}, btS64{$ENDIF}: Result := True;
+ else
+ Result := False;
+ end;
+end;
+
+
+procedure TPSPascalCompiler.ParserError(Parser: TObject;
+ Kind: TPSParserErrorKind);
+begin
+ FParserHadError := True;
+ case Kind of
+ ICOMMENTERROR: MakeError('', ecCommentError, '');
+ ISTRINGERROR: MakeError('', ecStringError, '');
+ ICHARERROR: MakeError('', ecCharError, '');
+ else
+ MakeError('', ecSyntaxError, '');
+ end;
+end;
+
+
+function TPSPascalCompiler.AddDelphiFunction(const Decl: tbtString): TPSRegProc;
+var
+ p: TPSRegProc;
+ pDecl: TPSParametersDecl;
+ DOrgName: tbtString;
+ FT: TPMFuncType;
+ i: Longint;
+
+begin
+ pDecl := TPSParametersDecl.Create;
+ p := nil;
+ try
+ if not ParseMethod(Self, '', Decl, DOrgName, pDecl, FT) then
+ Raise EPSCompilerException.CreateFmt(RPS_UnableToRegisterFunction, [Decl]);
+
+ p := TPSRegProc.Create;
+ P.Name := FastUppercase(DOrgName);
+ p.OrgName := DOrgName;
+ p.ExportName := True;
+ p.Decl.Assign(pDecl);
+
+ FRegProcs.Add(p);
+
+ if pDecl.Result = nil then
+ begin
+ p.ImportDecl := p.ImportDecl + #0;
+ end else
+ p.ImportDecl := p.ImportDecl + #1;
+ for i := 0 to pDecl.ParamCount -1 do
+ begin
+ if pDecl.Params[i].Mode <> pmIn then
+ p.ImportDecl := p.ImportDecl + #1
+ else
+ p.ImportDecl := p.ImportDecl + #0;
+ end;
+ finally
+ pDecl.Free;
+ end;
+ Result := p;
+end;
+
+{$IFNDEF PS_NOINTERFACES}
+function TPSPascalCompiler.AddInterface(InheritedFrom: TPSInterface; Guid: TGuid; const Name: tbtString): TPSInterface;
+var
+ f: TPSType;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ f := FindType(Name);
+ if (f <> nil) and (f is TPSInterfaceType) then
+ begin
+ result := TPSInterfaceType(f).Intf;
+ Result.Guid := Guid;
+ Result.InheritedFrom := InheritedFrom;
+ exit;
+ end;
+ f := AddType(Name, btInterface);
+ Result := TPSInterface.Create(Self, InheritedFrom, GUID, FastUppercase(Name), f);
+ FInterfaces.Add(Result);
+ TPSInterfaceType(f).Intf := Result;
+end;
+
+function TPSPascalCompiler.FindInterface(const Name: tbtString): TPSInterface;
+var
+ n: tbtString;
+ i, nh: Longint;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ n := FastUpperCase(Name);
+ nh := MakeHash(n);
+ for i := FInterfaces.Count -1 downto 0 do
+ begin
+ Result := FInterfaces[i];
+ if (Result.NameHash = nh) and (Result.Name = N) then
+ exit;
+ end;
+ raise EPSCompilerException.CreateFmt(RPS_UnknownInterface, [Name]);
+end;
+{$ENDIF}
+function TPSPascalCompiler.AddClass(InheritsFrom: TPSCompileTimeClass; aClass: TClass): TPSCompileTimeClass;
+var
+ f: TPSType;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := FindClass(tbtstring(aClass.ClassName));
+ if Result <> nil then exit;
+ f := AddType(tbtstring(aClass.ClassName), btClass);
+ Result := TPSCompileTimeClass.CreateC(aClass, Self, f);
+ Result.FInheritsFrom := InheritsFrom;
+ FClasses.Add(Result);
+ TPSClassType(f).Cl := Result;
+ f.ExportName := True;
+end;
+
+function TPSPascalCompiler.AddClassN(InheritsFrom: TPSCompileTimeClass; const aClass: tbtString): TPSCompileTimeClass;
+var
+ f: TPSType;
+begin
+ if FProcs = nil then raise EPSCompilerException.Create(RPS_OnUseEventOnly);
+ Result := FindClass(aClass);
+ if Result <> nil then
+ begin
+ if InheritsFrom <> nil then
+ Result.FInheritsFrom := InheritsFrom;
+ exit;
+ end;
+ f := AddType(aClass, btClass);
+ Result := TPSCompileTimeClass.Create(FastUppercase(aClass), Self, f);
+ TPSClassType(f).Cl := Result;
+ Result.FInheritsFrom := InheritsFrom;
+ FClasses.Add(Result);
+ TPSClassType(f).Cl := Result;
+ f.ExportName := True;
+end;
+
+function TPSPascalCompiler.FindClass(const aClass: tbtString): TPSCompileTimeClass;
+var
+ i: Longint;
+ Cl: tbtString;
+ H: Longint;
+ x: TPSCompileTimeClass;
+begin
+ cl := FastUpperCase(aClass);
+ H := MakeHash(Cl);
+ for i :=0 to FClasses.Count -1 do
+ begin
+ x := FClasses[I];
+ if (X.FClassNameHash = H) and (X.FClassName = Cl) then
+ begin
+ Result := X;
+ Exit;
+ end;
+ end;
+ Result := nil;
+end;
+
+
+
+{ }
+
+function TransDoubleToStr(D: Double): tbtString;
+begin
+ SetLength(Result, SizeOf(Double));
+ Double((@Result[1])^) := D;
+end;
+
+function TransSingleToStr(D: Single): tbtString;
+begin
+ SetLength(Result, SizeOf(Single));
+ Single((@Result[1])^) := D;
+end;
+
+function TransExtendedToStr(D: Extended): tbtString;
+begin
+ SetLength(Result, SizeOf(Extended));
+ Extended((@Result[1])^) := D;
+end;
+
+function TransLongintToStr(D: Longint): tbtString;
+begin
+ SetLength(Result, SizeOf(Longint));
+ Longint((@Result[1])^) := D;
+end;
+
+function TransCardinalToStr(D: Cardinal): tbtString;
+begin
+ SetLength(Result, SizeOf(Cardinal));
+ Cardinal((@Result[1])^) := D;
+end;
+
+function TransWordToStr(D: Word): tbtString;
+begin
+ SetLength(Result, SizeOf(Word));
+ Word((@Result[1])^) := D;
+end;
+
+function TransSmallIntToStr(D: SmallInt): tbtString;
+begin
+ SetLength(Result, SizeOf(SmallInt));
+ SmallInt((@Result[1])^) := D;
+end;
+
+function TransByteToStr(D: Byte): tbtString;
+begin
+ SetLength(Result, SizeOf(Byte));
+ Byte((@Result[1])^) := D;
+end;
+
+function TransShortIntToStr(D: ShortInt): tbtString;
+begin
+ SetLength(Result, SizeOf(ShortInt));
+ ShortInt((@Result[1])^) := D;
+end;
+
+function TPSPascalCompiler.GetConstant(const Name: tbtString): TPSConstant;
+var
+ h, i: Longint;
+ n: tbtString;
+
+begin
+ n := FastUppercase(name);
+ h := MakeHash(n);
+ for i := 0 to FConstants.Count -1 do
+ begin
+ result := TPSConstant(FConstants[i]);
+ if (Result.NameHash = h) and (Result.Name = n) then exit;
+ end;
+ result := nil;
+end;
+
+{ TPSType }
+
+constructor TPSType.Create;
+begin
+ inherited Create;
+ FAttributes := TPSAttributes.Create;
+ FFinalTypeNo := InvalidVal;
+end;
+
+destructor TPSType.Destroy;
+begin
+ FAttributes.Free;
+ inherited Destroy;
+end;
+
+procedure TPSType.SetName(const Value: tbtString);
+begin
+ FName := Value;
+ FNameHash := MakeHash(Value);
+end;
+
+procedure TPSType.Use;
+begin
+ FUsed := True;
+end;
+
+{ TPSRecordType }
+
+function TPSRecordType.AddRecVal: PIFPSRecordFieldTypeDef;
+begin
+ Result := TPSRecordFieldTypeDef.Create;
+ FRecordSubVals.Add(Result);
+end;
+
+constructor TPSRecordType.Create;
+begin
+ inherited Create;
+ FRecordSubVals := TPSList.Create;
+end;
+
+destructor TPSRecordType.Destroy;
+var
+ i: Longint;
+begin
+ for i := FRecordSubVals.Count -1 downto 0 do
+ TPSRecordFieldTypeDef(FRecordSubVals[I]).Free;
+ FRecordSubVals.Free;
+ inherited Destroy;
+end;
+
+function TPSRecordType.RecVal(I: Longint): PIFPSRecordFieldTypeDef;
+begin
+ Result := FRecordSubVals[I]
+end;
+
+function TPSRecordType.RecValCount: Longint;
+begin
+ Result := FRecordSubVals.Count;
+end;
+
+
+{ TPSRegProc }
+
+constructor TPSRegProc.Create;
+begin
+ inherited Create;
+ FDecl := TPSParametersDecl.Create;
+end;
+
+destructor TPSRegProc.Destroy;
+begin
+ FDecl.Free;
+ inherited Destroy;
+end;
+
+procedure TPSRegProc.SetName(const Value: tbtString);
+begin
+ FName := Value;
+ FNameHash := MakeHash(FName);
+end;
+
+{ TPSRecordFieldTypeDef }
+
+procedure TPSRecordFieldTypeDef.SetFieldOrgName(const Value: tbtString);
+begin
+ FFieldOrgName := Value;
+ FFieldName := FastUppercase(Value);
+ FFieldNameHash := MakeHash(FFieldName);
+end;
+
+{ TPSProcVar }
+
+procedure TPSProcVar.SetName(const Value: tbtString);
+begin
+ FName := Value;
+ FNameHash := MakeHash(FName);
+end;
+
+procedure TPSProcVar.Use;
+begin
+ FUsed := True;
+end;
+
+
+
+{ TPSInternalProcedure }
+
+constructor TPSInternalProcedure.Create;
+begin
+ inherited Create;
+ FProcVars := TPSList.Create;
+ FLabels := TIfStringList.Create;
+ FGotos := TIfStringList.Create;
+ FDecl := TPSParametersDecl.Create;
+end;
+
+destructor TPSInternalProcedure.Destroy;
+var
+ i: Longint;
+begin
+ FDecl.Free;
+ for i := FProcVars.Count -1 downto 0 do
+ TPSProcVar(FProcVars[I]).Free;
+ FProcVars.Free;
+ FGotos.Free;
+ FLabels.Free;
+ inherited Destroy;
+end;
+
+procedure TPSInternalProcedure.ResultUse;
+begin
+ FResultUsed := True;
+end;
+
+procedure TPSInternalProcedure.SetName(const Value: tbtString);
+begin
+ FName := Value;
+ FNameHash := MakeHash(FName);
+end;
+
+procedure TPSInternalProcedure.Use;
+begin
+ FUsed := True;
+end;
+
+{ TPSProcedure }
+constructor TPSProcedure.Create;
+begin
+ inherited Create;
+ FAttributes := TPSAttributes.Create;
+end;
+
+destructor TPSProcedure.Destroy;
+begin
+ FAttributes.Free;
+ inherited Destroy;
+end;
+
+{ TPSVar }
+
+procedure TPSVar.SetName(const Value: tbtString);
+begin
+ FName := Value;
+ FNameHash := MakeHash(Value);
+end;
+
+procedure TPSVar.Use;
+begin
+ FUsed := True;
+end;
+
+{ TPSConstant }
+
+destructor TPSConstant.Destroy;
+begin
+ DisposeVariant(Value);
+ inherited Destroy;
+end;
+
+procedure TPSConstant.SetChar(c: tbtChar);
+begin
+ if (FValue <> nil) then
+ begin
+ case FValue.FType.BaseType of
+ btChar: FValue.tchar := c;
+ btString: tbtString(FValue.tstring) := c;
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString: tbtwidestring(FValue.twidestring) := tbtWidestring(c);
+ btUnicodeString: tbtUnicodestring(FValue.twidestring) := tbtUnicodestring(c);
+ {$ENDIF}
+ else
+ raise EPSCompilerException.Create(RPS_ConstantValueMismatch);
+ end;
+ end else
+ raise EPSCompilerException.Create(RPS_ConstantValueNotAssigned)
+end;
+
+procedure TPSConstant.SetExtended(const Val: Extended);
+begin
+ if (FValue <> nil) then
+ begin
+ case FValue.FType.BaseType of
+ btSingle: FValue.tsingle := Val;
+ btDouble: FValue.tdouble := Val;
+ btExtended: FValue.textended := Val;
+ btCurrency: FValue.tcurrency := Val;
+ else
+ raise EPSCompilerException.Create(RPS_ConstantValueMismatch);
+ end;
+ end else
+ raise EPSCompilerException.Create(RPS_ConstantValueNotAssigned)
+end;
+
+procedure TPSConstant.SetInt(const Val: Longint);
+begin
+ if (FValue <> nil) then
+ begin
+ case FValue.FType.BaseType of
+ btEnum: FValue.tu32 := Val;
+ btU32, btS32: FValue.ts32 := Val;
+ btU16, btS16: FValue.ts16 := Val;
+ btU8, btS8: FValue.ts8 := Val;
+ btSingle: FValue.tsingle := Val;
+ btDouble: FValue.tdouble := Val;
+ btExtended: FValue.textended := Val;
+ btCurrency: FValue.tcurrency := Val;
+ {$IFNDEF PS_NOINT64}
+ bts64: FValue.ts64 := Val;
+ {$ENDIF}
+ else
+ raise EPSCompilerException.Create(RPS_ConstantValueMismatch);
+ end;
+ end else
+ raise EPSCompilerException.Create(RPS_ConstantValueNotAssigned)
+end;
+{$IFNDEF PS_NOINT64}
+procedure TPSConstant.SetInt64(const Val: Int64);
+begin
+ if (FValue <> nil) then
+ begin
+ case FValue.FType.BaseType of
+ btEnum: FValue.tu32 := Val;
+ btU32, btS32: FValue.ts32 := Val;
+ btU16, btS16: FValue.ts16 := Val;
+ btU8, btS8: FValue.ts8 := Val;
+ btSingle: FValue.tsingle := Val;
+ btDouble: FValue.tdouble := Val;
+ btExtended: FValue.textended := Val;
+ btCurrency: FValue.tcurrency := Val;
+ bts64: FValue.ts64 := Val;
+ else
+ raise EPSCompilerException.Create(RPS_ConstantValueMismatch);
+ end;
+ end else
+ raise EPSCompilerException.Create(RPS_ConstantValueNotAssigned)
+end;
+{$ENDIF}
+procedure TPSConstant.SetName(const Value: tbtString);
+begin
+ FName := Value;
+ FNameHash := MakeHash(Value);
+end;
+
+
+procedure TPSConstant.SetSet(const val);
+begin
+ if (FValue <> nil) then
+ begin
+ case FValue.FType.BaseType of
+ btSet:
+ begin
+ if length(tbtstring(FValue.tstring)) <> TPSSetType(FValue.FType).ByteSize then
+ SetLength(tbtstring(FValue.tstring), TPSSetType(FValue.FType).ByteSize);
+ Move(Val, FValue.tstring^, TPSSetType(FValue.FType).ByteSize);
+ end;
+ else
+ raise EPSCompilerException.Create(RPS_ConstantValueMismatch);
+ end;
+ end else
+ raise EPSCompilerException.Create(RPS_ConstantValueNotAssigned)
+end;
+
+procedure TPSConstant.SetString(const Val: tbtString);
+begin
+ if (FValue <> nil) then
+ begin
+ case FValue.FType.BaseType of
+ btChar: FValue.tchar := (Val+#0)[1];
+ btWideChar: FValue.twidechar := WideChar((Val+#0)[1]);
+ btString: tbtString(FValue.tstring) := val;
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString: tbtwidestring(FValue.twidestring) := tbtwidestring(val);
+ btUnicodeString: tbtunicodestring(FValue.tunistring) := tbtunicodestring(val);
+ {$ENDIF}
+ else
+ raise EPSCompilerException.Create(RPS_ConstantValueMismatch);
+ end;
+ end else
+ raise EPSCompilerException.Create(RPS_ConstantValueNotAssigned)
+end;
+
+procedure TPSConstant.SetUInt(const Val: Cardinal);
+begin
+ if (FValue <> nil) then
+ begin
+ case FValue.FType.BaseType of
+ btEnum: FValue.tu32 := Val;
+ btU32, btS32: FValue.tu32 := Val;
+ btU16, btS16: FValue.tu16 := Val;
+ btU8, btS8: FValue.tu8 := Val;
+ btSingle: FValue.tsingle := Val;
+ btDouble: FValue.tdouble := Val;
+ btExtended: FValue.textended := Val;
+ btCurrency: FValue.tcurrency := Val;
+ {$IFNDEF PS_NOINT64}
+ bts64: FValue.ts64 := Val;
+ {$ENDIF}
+ else
+ raise EPSCompilerException.Create(RPS_ConstantValueMismatch);
+ end;
+ end else
+ raise EPSCompilerException.Create(RPS_ConstantValueNotAssigned)
+end;
+
+{$IFNDEF PS_NOWIDESTRING}
+procedure TPSConstant.SetWideChar(const val: WideChar);
+begin
+ if (FValue <> nil) then
+ begin
+ case FValue.FType.BaseType of
+ btString: tbtString(FValue.tstring) := tbtstring(val);
+ btWideChar: FValue.twidechar := val;
+ btWideString: tbtwidestring(FValue.twidestring) := val;
+ btUnicodeString: tbtUnicodestring(FValue.tUniString) := val;
+ else
+ raise EPSCompilerException.Create(RPS_ConstantValueMismatch);
+ end;
+ end else
+ raise EPSCompilerException.Create(RPS_ConstantValueNotAssigned)
+end;
+
+procedure TPSConstant.SetWideString(const val: tbtwidestring);
+begin
+ if (FValue <> nil) then
+ begin
+ case FValue.FType.BaseType of
+ btString: tbtString(FValue.tstring) := tbtstring(val);
+ btWideString: tbtwidestring(FValue.twidestring) := val;
+ btUnicodeString: tbtunicodestring(FValue.tunistring) := val;
+ else
+ raise EPSCompilerException.Create(RPS_ConstantValueMismatch);
+ end;
+ end else
+ raise EPSCompilerException.Create(RPS_ConstantValueNotAssigned)
+end;
+procedure TPSConstant.SetUnicodeString(const val: tbtunicodestring);
+begin
+ if (FValue <> nil) then
+ begin
+ case FValue.FType.BaseType of
+ btString: tbtString(FValue.tstring) := tbtstring(val);
+ btWideString: tbtwidestring(FValue.twidestring) := val;
+ btUnicodeString: tbtunicodestring(FValue.tunistring) := val;
+ else
+ raise EPSCompilerException.Create(RPS_ConstantValueMismatch);
+ end;
+ end else
+ raise EPSCompilerException.Create(RPS_ConstantValueNotAssigned)
+end;
+{$ENDIF}
+{ TPSPascalCompilerError }
+
+function TPSPascalCompilerError.ErrorType: tbtString;
+begin
+ Result := tbtstring(RPS_Error);
+end;
+
+function TPSPascalCompilerError.ShortMessageToString: tbtString;
+begin
+ case Error of
+ ecUnknownIdentifier: Result := tbtstring(Format (RPS_UnknownIdentifier, [Param]));
+ ecIdentifierExpected: Result := tbtstring(RPS_IdentifierExpected);
+ ecCommentError: Result := tbtstring(RPS_CommentError);
+ ecStringError: Result := tbtstring(RPS_StringError);
+ ecCharError: Result := tbtstring(RPS_CharError);
+ ecSyntaxError: Result := tbtstring(RPS_SyntaxError);
+ ecUnexpectedEndOfFile: Result := tbtstring(RPS_EOF);
+ ecSemicolonExpected: Result := tbtstring(RPS_SemiColonExpected);
+ ecBeginExpected: Result := tbtstring(RPS_BeginExpected);
+ ecPeriodExpected: Result := tbtstring(RPS_PeriodExpected);
+ ecDuplicateIdentifier: Result := tbtstring(Format (RPS_DuplicateIdent, [Param]));
+ ecColonExpected: Result := tbtstring(RPS_ColonExpected);
+ ecUnknownType: Result := tbtstring(Format (RPS_UnknownType, [Param]));
+ ecCloseRoundExpected: Result := tbtstring(RPS_CloseRoundExpected);
+ ecTypeMismatch: Result := tbtstring(RPS_TypeMismatch);
+ ecInternalError: Result := tbtstring(Format (RPS_InternalError, [Param]));
+ ecAssignmentExpected: Result := tbtstring(RPS_AssignmentExpected);
+ ecThenExpected: Result := tbtstring(RPS_ThenExpected);
+ ecDoExpected: Result := tbtstring(RPS_DoExpected);
+ ecNoResult: Result := tbtstring(RPS_NoResult);
+ ecOpenRoundExpected: Result := tbtstring(RPS_OpenRoundExpected);
+ ecCommaExpected: Result := tbtstring(RPS_CommaExpected);
+ ecToExpected: Result := tbtstring(RPS_ToExpected);
+ ecIsExpected: Result := tbtstring(RPS_IsExpected);
+ ecOfExpected: Result := tbtstring(RPS_OfExpected);
+ ecCloseBlockExpected: Result := tbtstring(RPS_CloseBlockExpected);
+ ecVariableExpected: Result := tbtstring(RPS_VariableExpected);
+ ecStringExpected: result := tbtstring(RPS_StringExpected);
+ ecEndExpected: Result := tbtstring(RPS_EndExpected);
+ ecUnSetLabel: Result := tbtstring(Format (RPS_UnSetLabel, [Param]));
+ ecNotInLoop: Result := tbtstring(RPS_NotInLoop);
+ ecInvalidJump: Result := tbtstring(RPS_InvalidJump);
+ ecOpenBlockExpected: Result := tbtstring(RPS_OpenBlockExpected);
+ ecWriteOnlyProperty: Result := tbtstring(RPS_WriteOnlyProperty);
+ ecReadOnlyProperty: Result := tbtstring(RPS_ReadOnlyProperty);
+ ecClassTypeExpected: Result := tbtstring(RPS_ClassTypeExpected);
+ ecCustomError: Result := Param;
+ ecDivideByZero: Result := tbtstring(RPS_DivideByZero);
+ ecMathError: Result := tbtstring(RPS_MathError);
+ ecUnsatisfiedForward: Result := tbtstring(Format (RPS_UnsatisfiedForward, [Param]));
+ ecForwardParameterMismatch: Result := tbtstring(RPS_ForwardParameterMismatch);
+ ecInvalidnumberOfParameters: Result := tbtstring(RPS_InvalidNumberOfParameter);
+ {$IFDEF PS_USESSUPPORT}
+ ecNotAllowed : Result:=tbtstring(Format(RPS_NotAllowed,[Param]));
+ ecUnitNotFoundOrContainsErrors: Result:=tbtstring(Format(RPS_UnitNotFound,[Param]));
+ {$ENDIF}
+ else
+ Result := tbtstring(RPS_UnknownError);
+ end;
+ Result := Result;
+end;
+
+
+{ TPSPascalCompilerHint }
+
+function TPSPascalCompilerHint.ErrorType: tbtString;
+begin
+ Result := tbtstring(RPS_Hint);
+end;
+
+function TPSPascalCompilerHint.ShortMessageToString: tbtString;
+begin
+ case Hint of
+ ehVariableNotUsed: Result := tbtstring(Format (RPS_VariableNotUsed, [Param]));
+ ehFunctionNotUsed: Result := tbtstring(Format (RPS_FunctionNotUsed, [Param]));
+ ehCustomHint: Result := Param;
+ else
+ Result := tbtstring(RPS_UnknownHint);
+ end;
+end;
+
+{ TPSPascalCompilerWarning }
+
+function TPSPascalCompilerWarning.ErrorType: tbtString;
+begin
+ Result := tbtstring(RPS_Warning);
+end;
+
+function TPSPascalCompilerWarning.ShortMessageToString: tbtString;
+begin
+ case Warning of
+ ewCustomWarning: Result := Param;
+ ewCalculationAlwaysEvaluatesTo: Result := tbtstring(Format (RPS_CalculationAlwaysEvaluatesTo, [Param]));
+ ewIsNotNeeded: Result := tbtstring(Format (RPS_IsNotNeeded, [Param]));
+ ewAbstractClass: Result := tbtstring(RPS_AbstractClass);
+ else
+ Result := tbtstring(RPS_UnknownWarning);
+ end;
+end;
+
+{ TPSPascalCompilerMessage }
+
+function TPSPascalCompilerMessage.MessageToString: tbtString;
+begin
+ Result := '['+ErrorType+'] '+FModuleName+'('+IntToStr(FRow)+':'+IntToStr(FCol)+'): '+ShortMessageToString;
+end;
+
+procedure TPSPascalCompilerMessage.SetParserPos(Parser: TPSPascalParser);
+begin
+ FPosition := Parser.CurrTokenPos;
+ FRow := Parser.Row;
+ FCol := Parser.Col;
+end;
+
+procedure TPSPascalCompilerMessage.SetCustomPos(Pos, Row, Col: Cardinal);
+begin
+ FPosition := Pos;
+ FRow := Row;
+ FCol := Col;
+end;
+
+{ TUnConstOperation }
+
+destructor TUnConstOperation.Destroy;
+begin
+ FVal1.Free;
+ inherited Destroy;
+end;
+
+
+{ TBinConstOperation }
+
+destructor TBinConstOperation.Destroy;
+begin
+ FVal1.Free;
+ FVal2.Free;
+ inherited Destroy;
+end;
+
+{ TConstData }
+
+destructor TConstData.Destroy;
+begin
+ DisposeVariant(FData);
+ inherited Destroy;
+end;
+
+
+{ TConstOperation }
+
+procedure TConstOperation.SetPos(Parser: TPSPascalParser);
+begin
+ FDeclPosition := Parser.CurrTokenPos;
+ FDeclRow := Parser.Row;
+ FDeclCol := Parser.Col;
+end;
+
+{ TPSValue }
+
+procedure TPSValue.SetParserPos(P: TPSPascalParser);
+begin
+ FPos := P.CurrTokenPos;
+ FRow := P.Row;
+ FCol := P.Col;
+end;
+
+{ TPSValueData }
+
+destructor TPSValueData.Destroy;
+begin
+ DisposeVariant(FData);
+ inherited Destroy;
+end;
+
+
+{ TPSValueReplace }
+
+constructor TPSValueReplace.Create;
+begin
+ FFreeNewValue := True;
+ FReplaceTimes := 1;
+end;
+
+destructor TPSValueReplace.Destroy;
+begin
+ if FFreeOldValue then
+ FOldValue.Free;
+ if FFreeNewValue then
+ FNewValue.Free;
+ inherited Destroy;
+end;
+
+
+
+{ TPSUnValueOp }
+
+destructor TPSUnValueOp.Destroy;
+begin
+ FVal1.Free;
+ inherited Destroy;
+end;
+
+{ TPSBinValueOp }
+
+destructor TPSBinValueOp.Destroy;
+begin
+ FVal1.Free;
+ FVal2.Free;
+ inherited Destroy;
+end;
+
+
+
+
+{ TPSSubValue }
+
+destructor TPSSubValue.Destroy;
+begin
+ FSubNo.Free;
+ inherited Destroy;
+end;
+
+{ TPSValueVar }
+
+constructor TPSValueVar.Create;
+begin
+ inherited Create;
+ FRecItems := TPSList.Create;
+end;
+
+destructor TPSValueVar.Destroy;
+var
+ i: Longint;
+begin
+ for i := 0 to FRecItems.Count -1 do
+ begin
+ TPSSubItem(FRecItems[I]).Free;
+ end;
+ FRecItems.Free;
+ inherited Destroy;
+end;
+
+function TPSValueVar.GetRecCount: Cardinal;
+begin
+ Result := FRecItems.Count;
+end;
+
+function TPSValueVar.GetRecItem(I: Cardinal): TPSSubItem;
+begin
+ Result := FRecItems[I];
+end;
+
+function TPSValueVar.RecAdd(Val: TPSSubItem): Cardinal;
+begin
+ Result := FRecItems.Add(Val);
+end;
+
+procedure TPSValueVar.RecDelete(I: Cardinal);
+var
+ rr :TPSSubItem;
+begin
+ rr := FRecItems[i];
+ FRecItems.Delete(I);
+ rr.Free;
+end;
+
+{ TPSValueProc }
+
+destructor TPSValueProc.Destroy;
+begin
+ FSelfPtr.Free;
+ FParameters.Free;
+end;
+{ TPSParameter }
+
+destructor TPSParameter.Destroy;
+begin
+ FTempVar.Free;
+ FValue.Free;
+ inherited Destroy;
+end;
+
+
+ { TPSParameters }
+
+function TPSParameters.Add: TPSParameter;
+begin
+ Result := TPSParameter.Create;
+ FItems.Add(Result);
+end;
+
+constructor TPSParameters.Create;
+begin
+ inherited Create;
+ FItems := TPSList.Create;
+end;
+
+procedure TPSParameters.Delete(I: Cardinal);
+var
+ p: TPSParameter;
+begin
+ p := FItems[I];
+ FItems.Delete(i);
+ p.Free;
+end;
+
+destructor TPSParameters.Destroy;
+var
+ i: Longint;
+begin
+ for i := FItems.Count -1 downto 0 do
+ begin
+ TPSParameter(FItems[I]).Free;
+ end;
+ FItems.Free;
+ inherited Destroy;
+end;
+
+function TPSParameters.GetCount: Cardinal;
+begin
+ Result := FItems.Count;
+end;
+
+function TPSParameters.GetItem(I: Longint): TPSParameter;
+begin
+ Result := FItems[I];
+end;
+
+
+{ TPSValueArray }
+
+function TPSValueArray.Add(Item: TPSValue): Cardinal;
+begin
+ Result := FItems.Add(Item);
+end;
+
+constructor TPSValueArray.Create;
+begin
+ inherited Create;
+ FItems := TPSList.Create;
+end;
+
+procedure TPSValueArray.Delete(I: Cardinal);
+begin
+ FItems.Delete(i);
+end;
+
+destructor TPSValueArray.Destroy;
+var
+ i: Longint;
+begin
+ for i := FItems.Count -1 downto 0 do
+ TPSValue(FItems[I]).Free;
+ FItems.Free;
+
+ inherited Destroy;
+end;
+
+function TPSValueArray.GetCount: Cardinal;
+begin
+ Result := FItems.Count;
+end;
+
+function TPSValueArray.GetItem(I: Cardinal): TPSValue;
+begin
+ Result := FItems[I];
+end;
+
+
+{ TPSValueAllocatedStackVar }
+
+destructor TPSValueAllocatedStackVar.Destroy;
+var
+ pv: TPSProcVar;
+begin
+ {$IFDEF DEBUG}
+ if Cardinal(LocalVarNo +1) <> proc.ProcVars.Count then
+ begin
+ Abort;
+ exit;
+ end;
+ {$ENDIF}
+ if Proc <> nil then
+ begin
+ pv := Proc.ProcVars[Proc.ProcVars.Count -1];
+ Proc.ProcVars.Delete(Proc.ProcVars.Count -1);
+ pv.Free;
+ Proc.Data := Proc.Data + tbtChar(CM_PO);
+ end;
+ inherited Destroy;
+end;
+
+
+
+
+function AddImportedClassVariable(Sender: TPSPascalCompiler; const VarName, VarType: tbtString): Boolean;
+var
+ P: TPSVar;
+begin
+ P := Sender.AddVariableN(VarName, VarType);
+ if p = nil then
+ begin
+ Result := False;
+ Exit;
+ end;
+ SetVarExportName(P, FastUppercase(VarName));
+ p.Use;
+ Result := True;
+end;
+
+
+{'class:'+CLASSNAME+'|'+FUNCNAME+'|'+chr(CallingConv)+chr(hasresult)+params
+
+For property write functions there is an '@' after the funcname.
+}
+
+const
+ ProcHDR = 'procedure a;';
+
+
+
+{ TPSCompileTimeClass }
+
+function TPSCompileTimeClass.CastToType(IntoType: TPSType;
+ var ProcNo: Cardinal): Boolean;
+var
+ P: TPSExternalProcedure;
+begin
+ if (IntoType <> nil) and (IntoType.BaseType <> btClass) and (IntoType.BaseType <> btInterface) then
+ begin
+ Result := False;
+ exit;
+ end;
+ if FCastProc <> InvalidVal then
+ begin
+ Procno := FCastProc;
+ Result := True;
+ exit;
+ end;
+ ProcNo := FOwner. AddUsedFunction2(P);
+ P.RegProc := FOwner.AddFunction(ProcHDR);
+ P.RegProc.Name := '';
+
+ with P.RegProc.Decl.AddParam do
+ begin
+ OrgName := 'Org';
+ aType := Self.FType;
+ end;
+ with P.RegProc.Decl.AddParam do
+ begin
+ OrgName := 'TypeNo';
+ aType := FOwner.at2ut(FOwner.FindBaseType(btU32));
+ end;
+ P.RegProc.Decl.Result := IntoType;
+ P.RegProc.ImportDecl := 'class:+';
+ FCastProc := ProcNo;
+ Result := True;
+end;
+
+
+function TPSCompileTimeClass.ClassFunc_Call(Index: IPointer;
+ var ProcNo: Cardinal): Boolean;
+var
+ C: TPSDelphiClassItemConstructor;
+ P: TPSExternalProcedure;
+ s: tbtString;
+ i: Longint;
+
+begin
+ if FIsAbstract then
+ FOwner.MakeWarning('', ewAbstractClass, '');
+ C := Pointer(Index);
+ if c.MethodNo = InvalidVal then
+ begin
+ ProcNo := FOwner.AddUsedFunction2(P);
+ P.RegProc := FOwner.AddFunction(ProcHDR);
+ P.RegProc.Name := '';
+ P.RegProc.Decl.Assign(c.Decl);
+ s := 'class:' + C.Owner.FClassName + '|' + C.Name + '|'+ chr(0);
+ if c.Decl.Result = nil then
+ s := s + #0
+ else
+ s := s + #1;
+ for i := 0 to C.Decl.ParamCount -1 do
+ begin
+ if c.Decl.Params[i].Mode <> pmIn then
+ s := s + #1
+ else
+ s := s + #0;
+ end;
+ P.RegProc.ImportDecl := s;
+ C.MethodNo := ProcNo;
+ end else begin
+ ProcNo := c.MethodNo;
+ end;
+ Result := True;
+end;
+
+function TPSCompileTimeClass.ClassFunc_Find(const Name: tbtString;
+ var Index: IPointer): Boolean;
+var
+ H: Longint;
+ I: Longint;
+ CurrClass: TPSCompileTimeClass;
+ C: TPSDelphiClassItem;
+begin
+ H := MakeHash(Name);
+ CurrClass := Self;
+ while CurrClass <> nil do
+ begin
+ for i := CurrClass.FClassItems.Count -1 downto 0 do
+ begin
+ C := CurrClass.FClassItems[I];
+ if (c is TPSDelphiClassItemConstructor) and (C.NameHash = H) and (C.Name = Name) then
+ begin
+ Index := Cardinal(C);
+ Result := True;
+ exit;
+ end;
+ end;
+ CurrClass := CurrClass.FInheritsFrom;
+ end;
+ Result := False;
+end;
+
+
+class function TPSCompileTimeClass.CreateC(FClass: TClass; aOwner: TPSPascalCompiler; aType: TPSType): TPSCompileTimeClass;
+begin
+ Result := TPSCompileTimeClass.Create(FastUpperCase(tbtstring(FClass.ClassName)), aOwner, aType);
+ Result.FClass := FClass;
+end;
+
+constructor TPSCompileTimeClass.Create(ClassName: tbtString; aOwner: TPSPascalCompiler; aType: TPSType);
+begin
+ inherited Create;
+ FType := aType;
+ FCastProc := InvalidVal;
+ FNilProc := InvalidVal;
+
+ FDefaultProperty := InvalidVal;
+ FClassName := Classname;
+ FClassNameHash := MakeHash(FClassName);
+ FClassItems := TPSList.Create;
+ FOwner := aOwner;
+end;
+
+destructor TPSCompileTimeClass.Destroy;
+var
+ I: Longint;
+begin
+ for i := FClassItems.Count -1 downto 0 do
+ TPSDelphiClassItem(FClassItems[I]).Free;
+ FClassItems.Free;
+ inherited Destroy;
+end;
+
+
+function TPSCompileTimeClass.Func_Call(Index: IPointer;
+ var ProcNo: Cardinal): Boolean;
+var
+ C: TPSDelphiClassItemMethod;
+ P: TPSExternalProcedure;
+ i: Longint;
+ s: tbtString;
+
+begin
+ C := Pointer(Index);
+ if c.MethodNo = InvalidVal then
+ begin
+ ProcNo := FOwner.AddUsedFunction2(P);
+ P.RegProc := FOwner.AddFunction(ProcHDR);
+ P.RegProc.Name := '';
+ p.RegProc.Decl.Assign(c.Decl);
+ s := 'class:' + C.Owner.FClassName + '|' + C.Name + '|'+ chr(0);
+ if c.Decl.Result = nil then
+ s := s + #0
+ else
+ s := s + #1;
+ for i := 0 to c.Decl.ParamCount -1 do
+ begin
+ if c.Decl.Params[i].Mode <> pmIn then
+ s := s + #1
+ else
+ s := s + #0;
+ end;
+ P.RegProc.ImportDecl := s;
+ C.MethodNo := ProcNo;
+ end else begin
+ ProcNo := c.MethodNo;
+ end;
+ Result := True;
+end;
+
+function TPSCompileTimeClass.Func_Find(const Name: tbtString;
+ var Index: IPointer): Boolean;
+var
+ H: Longint;
+ I: Longint;
+ CurrClass: TPSCompileTimeClass;
+ C: TPSDelphiClassItem;
+begin
+ H := MakeHash(Name);
+ CurrClass := Self;
+ while CurrClass <> nil do
+ begin
+ for i := CurrClass.FClassItems.Count -1 downto 0 do
+ begin
+ C := CurrClass.FClassItems[I];
+ if (c is TPSDelphiClassItemMethod) and (C.NameHash = H) and (C.Name = Name) then
+ begin
+ Index := Cardinal(C);
+ Result := True;
+ exit;
+ end;
+ end;
+ CurrClass := CurrClass.FInheritsFrom;
+ end;
+ Result := False;
+end;
+
+function TPSCompileTimeClass.GetCount: Longint;
+begin
+ Result := FClassItems.Count;
+end;
+
+function TPSCompileTimeClass.GetItem(i: Longint): TPSDelphiClassItem;
+begin
+ Result := FClassItems[i];
+end;
+
+function TPSCompileTimeClass.IsCompatibleWith(aType: TPSType): Boolean;
+var
+ Temp: TPSCompileTimeClass;
+begin
+ if (atype.BaseType <> btClass) then
+ begin
+ Result := False;
+ exit;
+ end;
+ temp := TPSClassType(aType).Cl;
+ while Temp <> nil do
+ begin
+ if Temp = Self then
+ begin
+ Result := True;
+ exit;
+ end;
+ Temp := Temp.FInheritsFrom;
+ end;
+ Result := False;
+end;
+
+function TPSCompileTimeClass.Property_Find(const Name: tbtString;
+ var Index: IPointer): Boolean;
+var
+ H: Longint;
+ I: Longint;
+ CurrClass: TPSCompileTimeClass;
+ C: TPSDelphiClassItem;
+begin
+ if Name = '' then
+ begin
+ CurrClass := Self;
+ while CurrClass <> nil do
+ begin
+ if CurrClass.FDefaultProperty <> InvalidVal then
+ begin
+ Index := Cardinal(CurrClass.FClassItems[Currclass.FDefaultProperty]);
+ result := True;
+ exit;
+ end;
+ CurrClass := CurrClass.FInheritsFrom;
+ end;
+ Result := False;
+ exit;
+ end;
+ H := MakeHash(Name);
+ CurrClass := Self;
+ while CurrClass <> nil do
+ begin
+ for i := CurrClass.FClassItems.Count -1 downto 0 do
+ begin
+ C := CurrClass.FClassItems[I];
+ if (c is TPSDelphiClassItemProperty) and (C.NameHash = H) and (C.Name = Name) then
+ begin
+ Index := Cardinal(C);
+ Result := True;
+ exit;
+ end;
+ end;
+ CurrClass := CurrClass.FInheritsFrom;
+ end;
+ Result := False;
+end;
+
+function TPSCompileTimeClass.Property_Get(Index: IPointer;
+ var ProcNo: Cardinal): Boolean;
+var
+ C: TPSDelphiClassItemProperty;
+ P: TPSExternalProcedure;
+ s: tbtString;
+
+begin
+ C := Pointer(Index);
+ if c.AccessType = iptW then
+ begin
+ Result := False;
+ exit;
+ end;
+ if c.ReadProcNo = InvalidVal then
+ begin
+ ProcNo := FOwner.AddUsedFunction2(P);
+ P.RegProc := FOwner.AddFunction(ProcHDR);
+ P.RegProc.Name := '';
+ P.RegProc.Decl.Result := C.Decl.Result;
+ s := 'class:' + C.Owner.FClassName + '|' + C.Name + '|'+#0#0#0#0;
+ Longint((@(s[length(s)-3]))^) := c.Decl.ParamCount +1;
+ P.RegProc.ImportDecl := s;
+ C.ReadProcNo := ProcNo;
+ end else begin
+ ProcNo := c.ReadProcNo;
+ end;
+ Result := True;
+end;
+
+function TPSCompileTimeClass.Property_GetHeader(Index: IPointer;
+ Dest: TPSParametersDecl): Boolean;
+var
+ c: TPSDelphiClassItemProperty;
+begin
+ C := Pointer(Index);
+ FOwner.UseProc(c.Decl);
+ Dest.Assign(c.Decl);
+ Result := True;
+end;
+
+function TPSCompileTimeClass.Property_Set(Index: IPointer;
+ var ProcNo: Cardinal): Boolean;
+var
+ C: TPSDelphiClassItemProperty;
+ P: TPSExternalProcedure;
+ s: tbtString;
+
+begin
+ C := Pointer(Index);
+ if c.AccessType = iptR then
+ begin
+ Result := False;
+ exit;
+ end;
+ if c.WriteProcNo = InvalidVal then
+ begin
+ ProcNo := FOwner.AddUsedFunction2(P);
+ P.RegProc := FOwner.AddFunction(ProcHDR);
+ P.RegProc.Name := '';
+ s := 'class:' + C.Owner.FClassName + '|' + C.Name + '@|'#0#0#0#0;
+ Longint((@(s[length(s)-3]))^) := C.Decl.ParamCount+1;
+ P.RegProc.ImportDecl := s;
+ C.WriteProcNo := ProcNo;
+ end else begin
+ ProcNo := c.WriteProcNo;
+ end;
+ Result := True;
+end;
+
+function TPSCompileTimeClass.RegisterMethod(const Decl: tbtString): Boolean;
+var
+ DOrgName: tbtString;
+ DDecl: TPSParametersDecl;
+ FT: TPMFuncType;
+ p: TPSDelphiClassItemMethod;
+begin
+ DDecl := TPSParametersDecl.Create;
+ try
+ if not ParseMethod(FOwner, FClassName, Decl, DOrgName, DDecl, FT) then
+ begin
+ Result := False;
+ {$IFDEF DEBUG} raise EPSCompilerException.CreateFmt(RPS_UnableToRegister, [Decl]); {$ENDIF}
+ exit;
+ end;
+ if ft = mftConstructor then
+ p := TPSDelphiClassItemConstructor.Create(Self)
+ else
+ p := TPSDelphiClassItemMethod.Create(self);
+ p.OrgName := DOrgName;
+ p.Decl.Assign(DDecl);
+ p.MethodNo := InvalidVal;
+ FClassItems.Add(p);
+ Result := True;
+ finally
+ DDecl.Free;
+ end;
+end;
+
+procedure TPSCompileTimeClass.RegisterProperty(const PropertyName,
+ PropertyType: tbtString; PropAC: TPSPropType);
+var
+ FType: TPSType;
+ Param: TPSParameterDecl;
+ p: TPSDelphiClassItemProperty;
+ PT: tbtString;
+begin
+ pt := PropertyType;
+ p := TPSDelphiClassItemProperty.Create(Self);
+ p.AccessType := PropAC;
+ p.ReadProcNo := InvalidVal;
+ p.WriteProcNo := InvalidVal;
+ p.OrgName := PropertyName;
+ repeat
+ FType := FOwner.FindType(FastUpperCase(grfw(pt)));
+ if FType = nil then
+ begin
+ p.Free;
+ Exit;
+ end;
+ if p.Decl.Result = nil then p.Decl.Result := FType else
+ begin
+ param := p.Decl.AddParam;
+ Param.OrgName := 'param'+IntToStr(p.Decl.ParamCount);
+ Param.aType := FType;
+ end;
+ until pt = '';
+ FClassItems.Add(p);
+end;
+
+
+procedure TPSCompileTimeClass.RegisterPublishedProperties;
+var
+ p: PPropList;
+ i, Count: Longint;
+ a: TPSPropType;
+begin
+ if (Fclass = nil) or (Fclass.ClassInfo = nil) then exit;
+ Count := GetTypeData(fclass.ClassInfo)^.PropCount;
+ GetMem(p, Count * SizeOf(Pointer));
+ GetPropInfos(fclass.ClassInfo, p);
+ for i := Count -1 downto 0 do
+ begin
+ if p^[i]^.PropType^.Kind in [tkLString, tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkClass, tkMethod{$IFNDEF PS_NOWIDESTRING}, tkWString{$ENDIF}] then
+ begin
+ if (p^[i]^.GetProc <> nil) then
+ begin
+ if p^[i]^.SetProc = nil then
+ a := iptr
+ else
+ a := iptrw;
+ end else
+ begin
+ a := iptW;
+ if p^[i]^.SetProc = nil then continue;
+ end;
+ RegisterProperty(p^[i]^.Name, p^[i]^.PropType^.Name, a);
+ end;
+ end;
+ FreeMem(p);
+end;
+
+function TPSCompileTimeClass.RegisterPublishedProperty(const Name: tbtString): Boolean;
+var
+ p: PPropInfo;
+ a: TPSPropType;
+begin
+ if (Fclass = nil) or (Fclass.ClassInfo = nil) then begin Result := False; exit; end;
+ p := GetPropInfo(fclass.ClassInfo, string(Name));
+ if p = nil then begin Result := False; exit; end;
+ if (p^.GetProc <> nil) then
+ begin
+ if p^.SetProc = nil then
+ a := iptr
+ else
+ a := iptrw;
+ end else
+ begin
+ a := iptW;
+ if p^.SetProc = nil then begin result := False; exit; end;
+ end;
+ RegisterProperty(p^.Name, p^.PropType^.Name, a);
+ Result := True;
+end;
+
+
+procedure TPSCompileTimeClass.SetDefaultPropery(const Name: tbtString);
+var
+ i,h: Longint;
+ p: TPSDelphiClassItem;
+ s: tbtString;
+
+begin
+ s := FastUppercase(name);
+ h := MakeHash(s);
+ for i := FClassItems.Count -1 downto 0 do
+ begin
+ p := FClassItems[i];
+ if (p.NameHash = h) and (p.Name = s) then
+ begin
+ if p is TPSDelphiClassItemProperty then
+ begin
+ if p.Decl.ParamCount = 0 then
+ Raise EPSCompilerException.Create(RPS_NotArrayProperty);
+ FDefaultProperty := I;
+ exit;
+ end else Raise EPSCompilerException.Create(RPS_NotProperty);
+ end;
+ end;
+ raise EPSCompilerException.Create(RPS_UnknownProperty);
+end;
+
+function TPSCompileTimeClass.SetNil(var ProcNo: Cardinal): Boolean;
+var
+ P: TPSExternalProcedure;
+
+begin
+ if FNilProc <> InvalidVal then
+ begin
+ Procno := FNilProc;
+ Result := True;
+ exit;
+ end;
+ ProcNo := FOwner.AddUsedFunction2(P);
+ P.RegProc := FOwner.AddFunction(ProcHDR);
+ P.RegProc.Name := '';
+ with P.RegProc.Decl.AddParam do
+ begin
+ OrgName := 'VarNo';
+ aType := FOwner.at2ut(FType);
+ end;
+ P.RegProc.ImportDecl := 'class:-';
+ FNilProc := Procno;
+ Result := True;
+end;
+
+{ TPSSetType }
+
+function TPSSetType.GetBitSize: Longint;
+begin
+ case SetType.BaseType of
+ btEnum: begin Result := TPSEnumType(setType).HighValue+1; end;
+ btChar, btU8: Result := 256;
+ else
+ Result := 0;
+ end;
+end;
+
+function TPSSetType.GetByteSize: Longint;
+var
+ r: Longint;
+begin
+ r := BitSize;
+ if r mod 8 <> 0 then inc(r, 7);
+ Result := r div 8;
+end;
+
+
+{ TPSBlockInfo }
+
+procedure TPSBlockInfo.Clear;
+var
+ i: Longint;
+begin
+ for i := WithList.Count -1 downto 0 do
+ begin
+ TPSValue(WithList[i]).Free;
+ WithList.Delete(i);
+ end;
+end;
+
+constructor TPSBlockInfo.Create(Owner: TPSBlockInfo);
+begin
+ inherited Create;
+ FOwner := Owner;
+ FWithList := TPSList.Create;
+ if FOwner <> nil then
+ begin
+ FProcNo := FOwner.ProcNo;
+ FProc := FOwner.Proc;
+ end;
+end;
+
+destructor TPSBlockInfo.Destroy;
+begin
+ Clear;
+ FWithList.Free;
+ inherited Destroy;
+end;
+
+{ TPSAttributeTypeField }
+procedure TPSAttributeTypeField.SetFieldOrgName(const Value: tbtString);
+begin
+ FFieldOrgName := Value;
+ FFieldName := FastUpperCase(Value);
+ FFieldNameHash := MakeHash(FFieldName);
+end;
+
+constructor TPSAttributeTypeField.Create(AOwner: TPSAttributeType);
+begin
+ inherited Create;
+ FOwner := AOwner;
+end;
+
+{ TPSAttributeType }
+
+function TPSAttributeType.GetField(I: Longint): TPSAttributeTypeField;
+begin
+ Result := TPSAttributeTypeField(FFields[i]);
+end;
+
+function TPSAttributeType.GetFieldCount: Longint;
+begin
+ Result := FFields.Count;
+end;
+
+procedure TPSAttributeType.SetName(const s: tbtString);
+begin
+ FOrgname := s;
+ FName := FastUppercase(s);
+ FNameHash := MakeHash(FName);
+end;
+
+constructor TPSAttributeType.Create;
+begin
+ inherited Create;
+ FFields := TPSList.Create;
+end;
+
+destructor TPSAttributeType.Destroy;
+var
+ i: Longint;
+begin
+ for i := FFields.Count -1 downto 0 do
+ begin
+ TPSAttributeTypeField(FFields[i]).Free;
+ end;
+ FFields.Free;
+ inherited Destroy;
+end;
+
+function TPSAttributeType.AddField: TPSAttributeTypeField;
+begin
+ Result := TPSAttributeTypeField.Create(self);
+ FFields.Add(Result);
+end;
+
+procedure TPSAttributeType.DeleteField(I: Longint);
+var
+ Fld: TPSAttributeTypeField;
+begin
+ Fld := FFields[i];
+ FFields.Delete(i);
+ Fld.Free;
+end;
+
+{ TPSAttribute }
+function TPSAttribute.GetValueCount: Longint;
+begin
+ Result := FValues.Count;
+end;
+
+function TPSAttribute.GetValue(I: Longint): PIfRVariant;
+begin
+ Result := FValues[i];
+end;
+
+constructor TPSAttribute.Create(AttribType: TPSAttributeType);
+begin
+ inherited Create;
+ FValues := TPSList.Create;
+ FAttribType := AttribType;
+end;
+
+procedure TPSAttribute.DeleteValue(i: Longint);
+var
+ Val: PIfRVariant;
+begin
+ Val := FValues[i];
+ FValues.Delete(i);
+ DisposeVariant(Val);
+end;
+
+function TPSAttribute.AddValue(v: PIFRVariant): Longint;
+begin
+ Result := FValues.Add(v);
+end;
+
+
+destructor TPSAttribute.Destroy;
+var
+ i: Longint;
+begin
+ for i := FValues.Count -1 downto 0 do
+ begin
+ DisposeVariant(FValues[i]);
+ end;
+ FValues.Free;
+ inherited Destroy;
+end;
+
+
+procedure TPSAttribute.Assign(Item: TPSAttribute);
+var
+ i: Longint;
+ p: PIfRVariant;
+begin
+ for i := FValues.Count -1 downto 0 do
+ begin
+ DisposeVariant(FValues[i]);
+ end;
+ FValues.Clear;
+ FAttribType := Item.FAttribType;
+ for i := 0 to Item.FValues.Count -1 do
+ begin
+ p := DuplicateVariant(Item.FValues[i]);
+ FValues.Add(p);
+ end;
+end;
+
+{ TPSAttributes }
+
+function TPSAttributes.GetCount: Longint;
+begin
+ Result := FItems.Count;
+end;
+
+function TPSAttributes.GetItem(I: Longint): TPSAttribute;
+begin
+ Result := TPSAttribute(FItems[i]);
+end;
+
+procedure TPSAttributes.Delete(i: Longint);
+var
+ item: TPSAttribute;
+begin
+ item := TPSAttribute(FItems[i]);
+ FItems.Delete(i);
+ Item.Free;
+end;
+
+function TPSAttributes.Add(AttribType: TPSAttributeType): TPSAttribute;
+begin
+ Result := TPSAttribute.Create(AttribType);
+ FItems.Add(Result);
+end;
+
+constructor TPSAttributes.Create;
+begin
+ inherited Create;
+ FItems := TPSList.Create;
+end;
+
+destructor TPSAttributes.Destroy;
+var
+ i: Longint;
+begin
+ for i := FItems.Count -1 downto 0 do
+ begin
+ TPSAttribute(FItems[i]).Free;
+ end;
+ FItems.Free;
+ inherited Destroy;
+end;
+
+procedure TPSAttributes.Assign(attr: TPSAttributes; Move: Boolean);
+var
+ newitem, item: TPSAttribute;
+ i: Longint;
+begin
+ for i := ATtr.FItems.Count -1 downto 0 do
+ begin
+ Item := Attr.Fitems[i];
+ if Move then
+ begin
+ FItems.Add(Item);
+ Attr.FItems.Delete(i);
+ end else
+ begin
+ newitem := TPSAttribute.Create(Item.FAttribType );
+ newitem.Assign(item);
+ FItems.Add(NewItem);
+ end;
+ end;
+
+end;
+
+
+function TPSAttributes.FindAttribute(
+ const Name: tbtString): TPSAttribute;
+var
+ h, i: Longint;
+
+begin
+ h := MakeHash(name);
+ for i := FItems.Count -1 downto 0 do
+ begin
+ Result := FItems[i];
+ if (Result.FAttribType.NameHash = h) and (Result.FAttribType.Name = Name) then
+ exit;
+ end;
+ result := nil;
+end;
+
+{ TPSParameterDecl }
+procedure TPSParameterDecl.SetName(const s: tbtString);
+begin
+ FOrgName := s;
+ FName := FastUppercase(s);
+end;
+
+
+{ TPSParametersDecl }
+
+procedure TPSParametersDecl.Assign(Params: TPSParametersDecl);
+var
+ i: Longint;
+ np, orgp: TPSParameterDecl;
+begin
+ for i := FParams.Count -1 downto 0 do
+ begin
+ TPSParameterDecl(Fparams[i]).Free;
+ end;
+ FParams.Clear;
+ FResult := Params.Result;
+
+ for i := 0 to Params.FParams.count -1 do
+ begin
+ orgp := Params.FParams[i];
+ np := AddParam;
+ np.OrgName := orgp.OrgName;
+ np.Mode := orgp.Mode;
+ np.aType := orgp.aType;
+ np.DeclarePos:=orgp.DeclarePos;
+ np.DeclareRow:=orgp.DeclareRow;
+ np.DeclareCol:=orgp.DeclareCol;
+ end;
+end;
+
+
+function TPSParametersDecl.GetParam(I: Longint): TPSParameterDecl;
+begin
+ Result := FParams[i];
+end;
+
+function TPSParametersDecl.GetParamCount: Longint;
+begin
+ Result := FParams.Count;
+end;
+
+function TPSParametersDecl.AddParam: TPSParameterDecl;
+begin
+ Result := TPSParameterDecl.Create;
+ FParams.Add(Result);
+end;
+
+procedure TPSParametersDecl.DeleteParam(I: Longint);
+var
+ param: TPSParameterDecl;
+begin
+ param := FParams[i];
+ FParams.Delete(i);
+ Param.Free;
+end;
+
+constructor TPSParametersDecl.Create;
+begin
+ inherited Create;
+ FParams := TPSList.Create;
+end;
+
+destructor TPSParametersDecl.Destroy;
+var
+ i: Longint;
+begin
+ for i := FParams.Count -1 downto 0 do
+ begin
+ TPSParameterDecl(Fparams[i]).Free;
+ end;
+ FParams.Free;
+ inherited Destroy;
+end;
+
+function TPSParametersDecl.Same(d: TPSParametersDecl): boolean;
+var
+ i: Longint;
+begin
+ if (d = nil) or (d.ParamCount <> ParamCount) or (d.Result <> Self.Result) then
+ Result := False
+ else begin
+ for i := 0 to d.ParamCount -1 do
+ begin
+ if (d.Params[i].Mode <> Params[i].Mode) or (d.Params[i].aType <> Params[i].aType) then
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := True;
+ end;
+end;
+
+{ TPSProceduralType }
+
+constructor TPSProceduralType.Create;
+begin
+ inherited Create;
+ FProcDef := TPSParametersDecl.Create;
+
+end;
+
+destructor TPSProceduralType.Destroy;
+begin
+ FProcDef.Free;
+ inherited Destroy;
+end;
+
+{ TPSDelphiClassItem }
+
+procedure TPSDelphiClassItem.SetName(const s: tbtString);
+begin
+ FOrgName := s;
+ FName := FastUpperCase(s);
+ FNameHash := MakeHash(FName);
+end;
+
+constructor TPSDelphiClassItem.Create(Owner: TPSCompileTimeClass);
+begin
+ inherited Create;
+ FOwner := Owner;
+ FDecl := TPSParametersDecl.Create;
+end;
+
+destructor TPSDelphiClassItem.Destroy;
+begin
+ FDecl.Free;
+ inherited Destroy;
+end;
+
+{$IFNDEF PS_NOINTERFACES}
+{ TPSInterface }
+
+function TPSInterface.CastToType(IntoType: TPSType;
+ var ProcNo: Cardinal): Boolean;
+var
+ P: TPSExternalProcedure;
+begin
+ if (IntoType <> nil) and (IntoType.BaseType <> btInterface) then
+ begin
+ Result := False;
+ exit;
+ end;
+ if FCastProc <> InvalidVal then
+ begin
+ ProcNo := FCastProc;
+ Result := True;
+ exit;
+ end;
+ ProcNo := FOwner.AddUsedFunction2(P);
+ P.RegProc := FOwner.AddFunction(ProcHDR);
+ P.RegProc.Name := '';
+ with P.RegProc.Decl.AddParam do
+ begin
+ OrgName := 'Org';
+ aType := Self.FType;
+ end;
+ with P.RegProc.Decl.AddParam do
+ begin
+ OrgName := 'TypeNo';
+ aType := FOwner.at2ut(FOwner.FindBaseType(btU32));
+ end;
+ P.RegProc.Decl.Result := FOwner.at2ut(IntoType);
+
+ P.RegProc.ImportDecl := 'class:+';
+ FCastProc := ProcNo;
+ Result := True;
+end;
+
+constructor TPSInterface.Create(Owner: TPSPascalCompiler; InheritedFrom: TPSInterface; Guid: TGuid; const Name: tbtString; aType: TPSType);
+begin
+ inherited Create;
+ FCastProc := InvalidVal;
+ FNilProc := InvalidVal;
+
+ FType := aType;
+ FOWner := Owner;
+ FGuid := GUID;
+ Self.InheritedFrom := InheritedFrom;
+
+ FItems := TPSList.Create;
+ FName := Name;
+ FNameHash := MakeHash(Name);
+end;
+
+procedure TPSInterface.SetInheritedFrom(p: TPSInterface);
+begin
+ FInheritedFrom := p;
+end;
+
+destructor TPSInterface.Destroy;
+var
+ i: Longint;
+begin
+ for i := FItems.Count -1 downto 0 do
+ begin
+ TPSInterfaceMethod(FItems[i]).Free;
+ end;
+ FItems.Free;
+ inherited Destroy;
+end;
+
+function TPSInterface.Func_Call(Index: Cardinal;
+ var ProcNo: Cardinal): Boolean;
+var
+ c: TPSInterfaceMethod;
+ P: TPSExternalProcedure;
+ s: tbtString;
+ i: Longint;
+begin
+ c := TPSInterfaceMethod(Index);
+ if c.FScriptProcNo <> InvalidVal then
+ begin
+ Procno := c.FScriptProcNo;
+ Result := True;
+ exit;
+ end;
+ ProcNo := FOwner.AddUsedFunction2(P);
+ P.RegProc := FOwner.AddFunction(ProcHDR);
+ P.RegProc.Name := '';
+ FOwner.UseProc(C.Decl);
+ P.RegProc.Decl.Assign(c.Decl);
+ s := tbtstring('intf:.') + PS_mi2s(c.AbsoluteProcOffset) + tbtchar(ord(c.CC));
+ if c.Decl.Result = nil then
+ s := s + #0
+ else
+ s := s + #1;
+ for i := 0 to C.Decl.ParamCount -1 do
+ begin
+ if c.Decl.Params[i].Mode <> pmIn then
+ s := s + #1
+ else
+ s := s + #0;
+ end;
+ P.RegProc.ImportDecl := s;
+ C.FScriptProcNo := ProcNo;
+ Result := True;
+end;
+
+function TPSInterface.Func_Find(const Name: tbtString;
+ var Index: Cardinal): Boolean;
+var
+ H: Longint;
+ I: Longint;
+ CurrClass: TPSInterface;
+ C: TPSInterfaceMethod;
+begin
+ H := MakeHash(Name);
+ CurrClass := Self;
+ while CurrClass <> nil do
+ begin
+ for i := CurrClass.FItems.Count -1 downto 0 do
+ begin
+ C := CurrClass.FItems[I];
+ if (C.NameHash = H) and (C.Name = Name) then
+ begin
+ Index := Cardinal(c);
+ Result := True;
+ exit;
+ end;
+ end;
+ CurrClass := CurrClass.FInheritedFrom;
+ end;
+ Result := False;
+end;
+
+function TPSInterface.IsCompatibleWith(aType: TPSType): Boolean;
+var
+ Temp: TPSInterface;
+begin
+ if (atype.BaseType = btClass) then // just support it, we'll see what happens
+ begin
+ Result := true;
+ exit;
+ end;
+ if atype.BaseType <> btInterface then
+ begin
+ Result := False;
+ exit;
+ end;
+ temp := TPSInterfaceType(atype).FIntf;
+ while Temp <> nil do
+ begin
+ if Temp = Self then
+ begin
+ Result := True;
+ exit;
+ end;
+ Temp := Temp.FInheritedFrom;
+ end;
+ Result := False;
+end;
+
+procedure TPSInterface.RegisterDummyMethod;
+begin
+ FItems.Add(TPSInterfaceMethod.Create(self));
+end;
+
+function TPSInterface.RegisterMethod(const Declaration: tbtString;
+ const cc: TPSCallingConvention): Boolean;
+begin
+ Result := RegisterMethodEx(Declaration, cc, nil);
+end;
+
+function TPSInterface.RegisterMethodEx(const Declaration: tbtString;
+ const cc: TPSCallingConvention; const CustomParser: TPSPascalParser): Boolean;
+var
+ M: TPSInterfaceMethod;
+ DOrgName: tbtString;
+ Func: TPMFuncType;
+begin
+ M := TPSInterfaceMethod.Create(Self);
+ if not ParseMethodEx(FOwner, '', Declaration, DOrgname, m.Decl, Func, CustomParser) then
+ begin
+ FItems.Add(m); // in any case, add a dummy item
+ Result := False;
+ exit;
+ end;
+ m.FName := FastUppercase(DOrgName);
+ m.FOrgName := DOrgName;
+ m.FNameHash := MakeHash(m.FName);
+ m.FCC := CC;
+ m.FScriptProcNo := InvalidVal;
+ FItems.Add(M);
+ Result := True;
+end;
+
+
+function TPSInterface.SetNil(var ProcNo: Cardinal): Boolean;
+var
+ P: TPSExternalProcedure;
+
+begin
+ if FNilProc <> InvalidVal then
+ begin
+ Procno := FNilProc;
+ Result := True;
+ exit;
+ end;
+ ProcNo := FOwner.AddUsedFunction2(P);
+ P.RegProc := FOwner.AddFunction(ProcHDR);
+ P.RegProc.Name := '';
+ with p.RegProc.Decl.AddParam do
+ begin
+ Mode := pmInOut;
+ OrgName := 'VarNo';
+ aType := FOwner.at2ut(Self.FType);
+ end;
+ P.RegProc.ImportDecl := 'class:-';
+ FNilProc := Procno;
+ Result := True;
+end;
+
+{ TPSInterfaceMethod }
+
+constructor TPSInterfaceMethod.Create(Owner: TPSInterface);
+begin
+ inherited Create;
+ FDecl := TPSParametersDecl.Create;
+ FOwner := Owner;
+ FOffsetCache := InvalidVal;
+end;
+
+function TPSInterfaceMethod.GetAbsoluteProcOffset: Cardinal;
+var
+ ps: TPSInterface;
+begin
+ if FOffsetCache = InvalidVal then
+ begin
+ FOffsetCache := FOwner.FItems.IndexOf(Self);
+ ps := FOwner.FInheritedFrom;
+ while ps <> nil do
+ begin
+ FOffsetCache := FOffsetCache + ps.FItems.Count;
+ ps := ps.FInheritedFrom;
+ end;
+ end;
+ result := FOffsetCache;
+end;
+
+
+destructor TPSInterfaceMethod.Destroy;
+begin
+ FDecl.Free;
+ inherited Destroy;
+end;
+{$ENDIF}
+
+{ TPSVariantType }
+
+function TPSVariantType.GetDynInvokeParamType(Owner: TPSPascalCompiler) : TPSType;
+begin
+ Result := Owner.at2ut(FindAndAddType(owner, '!OPENARRAYOFVARIANT', 'array of variant'));
+end;
+
+function TPSVariantType.GetDynInvokeProcNo(Owner: TPSPascalCompiler; const Name: tbtString;
+ Params: TPSParameters): Cardinal;
+begin
+ Result := Owner.FindProc('IDISPATCHINVOKE');
+end;
+
+function TPSVariantType.GetDynIvokeResulType(
+ Owner: TPSPascalCompiler): TPSType;
+begin
+ Result := Owner.FindType('VARIANT');
+end;
+
+function TPSVariantType.GetDynIvokeSelfType(Owner: TPSPascalCompiler): TPSType;
+begin
+ Result := Owner.at2ut(Owner.FindType('IDISPATCH'));
+end;
+
+
+{ TPSExternalClass }
+function TPSExternalClass.SetNil(var ProcNo: Cardinal): Boolean;
+begin
+ Result := False;
+end;
+
+constructor TPSExternalClass.Create(Se: TIFPSPascalCompiler; TypeNo: TPSType);
+begin
+ inherited Create;
+ Self.SE := se;
+ Self.FTypeNo := TypeNo;
+end;
+
+function TPSExternalClass.Func_Call(Index: Cardinal;
+ var ProcNo: Cardinal): Boolean;
+begin
+ Result := False;
+end;
+
+function TPSExternalClass.Func_Find(const Name: tbtString;
+ var Index: Cardinal): Boolean;
+begin
+ Result := False;
+end;
+
+function TPSExternalClass.IsCompatibleWith(
+ Cl: TPSExternalClass): Boolean;
+begin
+ Result := False;
+end;
+
+function TPSExternalClass.SelfType: TPSType;
+begin
+ Result := nil;
+end;
+
+function TPSExternalClass.CastToType(IntoType: TPSType;
+ var ProcNo: Cardinal): Boolean;
+begin
+ Result := False;
+end;
+
+function TPSExternalClass.CompareClass(OtherTypeNo: TPSType;
+ var ProcNo: Cardinal): Boolean;
+begin
+ Result := false;
+end;
+
+function TPSExternalClass.ClassFunc_Find(const Name: tbtString; var Index: Cardinal): Boolean;
+begin
+ result := false;
+end;
+
+function TPSExternalClass.ClassFunc_Call(Index: Cardinal; var ProcNo: Cardinal): Boolean;
+begin
+ result := false;
+end;
+
+
+{ TPSValueProcVal }
+
+destructor TPSValueProcVal.Destroy;
+begin
+ FProcNo.Free;
+ inherited;
+end;
+
+
+{
+
+Internal error counter: 00020 (increase and then use)
+
+}
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent.pas
new file mode 100644
index 0000000..fbb608e
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent.pas
@@ -0,0 +1,1511 @@
+unit uPSComponent;
+{$I PascalScript.inc}
+interface
+
+uses
+ SysUtils, Classes, uPSRuntime, uPSDebugger, uPSUtils,
+ uPSCompiler, uPSC_dll, uPSR_dll, uPSPreProcessor;
+
+const
+ {alias to @link(ifps3.cdRegister)}
+ cdRegister = uPSRuntime.cdRegister;
+ {alias to @link(ifps3.cdPascal)}
+ cdPascal = uPSRuntime.cdPascal;
+
+ CdCdecl = uPSRuntime.CdCdecl;
+
+ CdStdCall = uPSRuntime.CdStdCall;
+
+type
+ TPSScript = class;
+
+ TDelphiCallingConvention = uPSRuntime.TPSCallingConvention;
+ {Alias to @link(ifps3.TPSRuntimeClassImporter)}
+ TPSRuntimeClassImporter = uPSRuntime.TPSRuntimeClassImporter;
+
+ TPSPlugin = class(TComponent)
+ public
+ procedure CompOnUses(CompExec: TPSScript); virtual;
+
+ procedure ExecOnUses(CompExec: TPSScript); virtual;
+
+ procedure CompileImport1(CompExec: TPSScript); virtual;
+
+ procedure CompileImport2(CompExec: TPSScript); virtual;
+
+ procedure ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); virtual;
+
+ procedure ExecImport2(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); virtual;
+ end;
+
+ TIFPS3Plugin = class(TPSPlugin);
+
+ TPSDllPlugin = class(TPSPlugin)
+ public
+ procedure CompOnUses(CompExec: TPSScript); override;
+ procedure ExecOnUses(CompExec: TPSScript); override;
+ end;
+
+ TIFPS3DllPlugin = class(TPSDllPlugin);
+
+
+ TPSPluginItem = class(TCollectionItem)
+ private
+ FPlugin: TPSPlugin;
+ procedure SetPlugin(const Value: TPSPlugin);
+ protected
+ function GetDisplayName: string; override;
+ public
+ procedure Assign(Source: TPersistent); override; //Birb
+ published
+ property Plugin: TPSPlugin read FPlugin write SetPlugin;
+ end;
+
+
+ TIFPS3CEPluginItem = class(TPSPluginItem);
+
+
+ TPSPlugins = class(TCollection)
+ private
+ FCompExec: TPSScript;
+ protected
+
+ function GetOwner: TPersistent; override;
+ public
+
+ constructor Create(CE: TPSScript);
+ end;
+
+ TIFPS3CEPlugins = class(TPSPlugins);
+
+
+ TPSOnGetNotVariant = function (Sender: TPSScript; const Name: tbtstring): Variant of object;
+ TPSOnSetNotVariant = procedure (Sender: TPSScript; const Name: tbtstring; V: Variant) of object;
+ TPSCompOptions = set of (icAllowNoBegin, icAllowUnit, icAllowNoEnd, icBooleanShortCircuit);
+
+ TPSVerifyProc = procedure (Sender: TPSScript; Proc: TPSInternalProcedure; const Decl: tbtstring; var Error: Boolean) of object;
+
+ TPSEvent = procedure (Sender: TPSScript) of object;
+
+ TPSOnCompImport = procedure (Sender: TObject; x: TPSPascalCompiler) of object;
+
+ TPSOnExecImport = procedure (Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter) of object;
+ {Script engine event function}
+ TPSOnNeedFile = function (Sender: TObject; const OrginFileName: tbtstring; var FileName, Output: tbtstring): Boolean of object;
+
+ TPSOnProcessDirective = procedure (
+ Sender: TPSPreProcessor;
+ Parser: TPSPascalPreProcessorParser;
+ const Active: Boolean;
+ const DirectiveName, DirectiveParam: tbtstring;
+ Var Continue: Boolean) of Object; // jgv
+
+ TPSScript = class(TComponent)
+ private
+ FOnGetNotificationVariant: TPSOnGetNotVariant;
+ FOnSetNotificationVariant: TPSOnSetNotVariant;
+ FCanAdd: Boolean;
+ FComp: TPSPascalCompiler;
+ FCompOptions: TPSCompOptions;
+ FExec: TPSDebugExec;
+ FSuppressLoadData: Boolean;
+ FScript: TStrings;
+ FOnLine: TNotifyEvent;
+ FUseDebugInfo: Boolean;
+ FOnAfterExecute, FOnCompile, FOnExecute: TPSEvent;
+ FOnCompImport: TPSOnCompImport;
+ FOnExecImport: TPSOnExecImport;
+ RI: TPSRuntimeClassImporter;
+ FPlugins: TPSPlugins;
+ FPP: TPSPreProcessor;
+ FMainFileName: tbtstring;
+ FOnNeedFile: TPSOnNeedFile;
+ FUsePreProcessor: Boolean;
+ FDefines: TStrings;
+ FOnVerifyProc: TPSVerifyProc;
+ FOnProcessDirective: TPSOnProcessDirective;
+ FOnProcessUnknowDirective: TPSOnProcessDirective;
+ FOnFindUnknownFile: TPSOnNeedFile;
+ function GetRunning: Boolean;
+ procedure SetScript(const Value: TStrings);
+ function GetCompMsg(i: Integer): TPSPascalCompilerMessage;
+ function GetCompMsgCount: Longint;
+ function GetAbout: tbtstring;
+ function ScriptUses(Sender: TPSPascalCompiler; const Name: tbtstring): Boolean;
+ function GetExecErrorByteCodePosition: Cardinal;
+ function GetExecErrorCode: TIFError;
+ function GetExecErrorParam: tbtstring;
+ function GetExecErrorProcNo: Cardinal;
+ function GetExecErrorString: tbtstring;
+ function GetExecErrorPosition: Cardinal;
+ function GetExecErrorCol: Cardinal;
+ function GetExecErrorRow: Cardinal;
+ function GetExecErrorFileName: tbtstring;
+ procedure SetDefines(const Value: TStrings);
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+
+ protected
+ //jgv move where private before - not very usefull
+ procedure OnLineEvent; virtual;
+ procedure SetMainFileName(const Value: tbtstring); virtual;
+
+ //--jgv new
+ function DoOnNeedFile (Sender: TObject; const OrginFileName: tbtstring; var FileName, Output: tbtstring): Boolean; virtual;
+ function DoOnUnknowUses (Sender: TPSPascalCompiler; const Name: tbtstring): Boolean; virtual; // return true if processed
+ procedure DoOnCompImport; virtual;
+ procedure DoOnCompile; virtual;
+ function DoVerifyProc (Sender: TPSScript; Proc: TPSInternalProcedure; const Decl: tbtstring): Boolean; virtual;
+
+ procedure DoOnExecImport (RunTimeImporter: TPSRuntimeClassImporter); virtual;
+ procedure DoOnExecute (RunTimeImporter: TPSRuntimeClassImporter); virtual;
+ procedure DoAfterExecute; virtual;
+ function DoOnGetNotificationVariant (const Name: tbtstring): Variant; virtual;
+ procedure DoOnSetNotificationVariant (const Name: tbtstring; V: Variant); virtual;
+
+ procedure DoOnProcessDirective (Sender: TPSPreProcessor;
+ Parser: TPSPascalPreProcessorParser;
+ const Active: Boolean;
+ const DirectiveName, DirectiveParam: tbtstring;
+ Var Continue: Boolean); virtual;
+ procedure DoOnProcessUnknowDirective (Sender: TPSPreProcessor;
+ Parser: TPSPascalPreProcessorParser;
+ const Active: Boolean;
+ const DirectiveName, DirectiveParam: tbtstring;
+ Var Continue: Boolean); virtual;
+ public
+ property RuntimeImporter: TPSRuntimeClassImporter read RI;
+
+ function FindNamedType(const Name: tbtstring): TPSTypeRec;
+
+ function FindBaseType(Bt: TPSBaseType): TPSTypeRec;
+
+ property SuppressLoadData: Boolean read FSuppressLoadData write FSuppressLoadData;
+
+ function LoadExec: Boolean;
+
+ procedure Stop; virtual;
+
+ constructor Create(AOwner: TComponent); override;
+
+ destructor Destroy; override;
+
+ function Compile: Boolean; virtual;
+
+ function Execute: Boolean; virtual;
+
+ property Running: Boolean read GetRunning;
+
+ procedure GetCompiled(var data: tbtstring);
+
+ procedure SetCompiled(const Data: tbtstring);
+
+ property Comp: TPSPascalCompiler read FComp;
+
+ property Exec: TPSDebugExec read FExec;
+
+ property CompilerMessageCount: Longint read GetCompMsgCount;
+
+ property CompilerMessages[i: Longint]: TPSPascalCompilerMessage read GetCompMsg;
+
+ function CompilerErrorToStr(I: Longint): tbtstring;
+
+ property ExecErrorCode: TIFError read GetExecErrorCode;
+
+ property ExecErrorParam: tbtstring read GetExecErrorParam;
+
+ property ExecErrorToString: tbtstring read GetExecErrorString;
+
+ property ExecErrorProcNo: Cardinal read GetExecErrorProcNo;
+
+ property ExecErrorByteCodePosition: Cardinal read GetExecErrorByteCodePosition;
+
+ property ExecErrorPosition: Cardinal read GetExecErrorPosition;
+
+ property ExecErrorRow: Cardinal read GetExecErrorRow;
+
+ property ExecErrorCol: Cardinal read GetExecErrorCol;
+
+ property ExecErrorFileName: tbtstring read GetExecErrorFileName;
+
+ function AddFunctionEx(Ptr: Pointer; const Decl: tbtstring; CallingConv: TDelphiCallingConvention): Boolean;
+
+ function AddFunction(Ptr: Pointer; const Decl: tbtstring): Boolean;
+
+
+ function AddMethodEx(Slf, Ptr: Pointer; const Decl: tbtstring; CallingConv: TDelphiCallingConvention): Boolean;
+
+ function AddMethod(Slf, Ptr: Pointer; const Decl: tbtstring): Boolean;
+
+ function AddRegisteredVariable(const VarName, VarType: tbtstring): Boolean;
+ function AddNotificationVariant(const VarName: tbtstring): Boolean;
+
+ function AddRegisteredPTRVariable(const VarName, VarType: tbtstring): Boolean;
+
+ function GetVariable(const Name: tbtstring): PIFVariant;
+
+ function SetVarToInstance(const VarName: tbtstring; cl: TObject): Boolean;
+
+ procedure SetPointerToData(const VarName: tbtstring; Data: Pointer; aType: TIFTypeRec);
+
+ function TranslatePositionPos(Proc, Position: Cardinal; var Pos: Cardinal; var fn: tbtstring): Boolean;
+
+ function TranslatePositionRC(Proc, Position: Cardinal; var Row, Col: Cardinal; var fn: tbtstring): Boolean;
+
+ function GetProcMethod(const ProcName: tbtstring): TMethod;
+
+ function ExecuteFunction(const Params: array of Variant; const ProcName: tbtstring): Variant;
+ published
+
+ property About: tbtstring read GetAbout stored false;
+
+ property Script: TStrings read FScript write SetScript;
+
+ property CompilerOptions: TPSCompOptions read FCompOptions write FCompOptions;
+
+ property OnLine: TNotifyEvent read FOnLine write FOnLine;
+
+ property OnCompile: TPSEvent read FOnCompile write FOnCompile;
+
+ property OnExecute: TPSEvent read FOnExecute write FOnExecute;
+
+ property OnAfterExecute: TPSEvent read FOnAfterExecute write FOnAfterExecute;
+
+ property OnCompImport: TPSOnCompImport read FOnCompImport write FOnCompImport;
+
+ property OnExecImport: TPSOnExecImport read FOnExecImport write FOnExecImport;
+
+ property UseDebugInfo: Boolean read FUseDebugInfo write FUseDebugInfo default True;
+
+ property Plugins: TPSPlugins read FPlugins write FPlugins;
+
+ property MainFileName: tbtstring read FMainFileName write SetMainFileName;
+
+ property UsePreProcessor: Boolean read FUsePreProcessor write FUsePreProcessor;
+
+ property OnNeedFile: TPSOnNeedFile read FOnNeedFile write FOnNeedFile;
+
+ property Defines: TStrings read FDefines write SetDefines;
+
+ property OnVerifyProc: TPSVerifyProc read FOnVerifyProc write FOnVerifyProc;
+ property OnGetNotificationVariant: TPSOnGetNotVariant read FOnGetNotificationVariant write FOnGetNotificationVariant;
+ property OnSetNotificationVariant: TPSOnSetNotVariant read FOnSetNotificationVariant write FOnSetNotificationVariant;
+ property OnFindUnknownFile: TPSOnNeedFile read FOnFindUnknownFile write FOnFindUnknownFile;
+
+ published
+ //-- jgv
+ property OnProcessDirective: TPSOnProcessDirective read FOnProcessDirective write FOnProcessDirective;
+ property OnProcessUnknowDirective: TPSOnProcessDirective read FOnProcessUnknowDirective write FOnProcessUnknowDirective;
+ end;
+
+ TIFPS3CompExec = class(TPSScript);
+
+
+ TPSBreakPointInfo = class
+ private
+ FLine: Longint;
+ FFileNameHash: Longint;
+ FFileName: tbtstring;
+ procedure SetFileName(const Value: tbtstring);
+ public
+
+ property FileName: tbtstring read FFileName write SetFileName;
+
+ property FileNameHash: Longint read FFileNameHash;
+
+ property Line: Longint read FLine write FLine;
+ end;
+
+ TPSOnLineInfo = procedure (Sender: TObject; const FileName: tbtstring; Position, Row, Col: Cardinal) of object;
+
+ TPSScriptDebugger = class(TPSScript)
+ private
+ FOnIdle: TNotifyEvent;
+ FBreakPoints: TIFList;
+ FOnLineInfo: TPSOnLineInfo;
+ FLastRow: Cardinal;
+ FOnBreakpoint: TPSOnLineInfo;
+ function GetBreakPoint(I: Integer): TPSBreakPointInfo;
+ function GetBreakPointCount: Longint;
+ protected
+ procedure SetMainFileName(const Value: tbtstring); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+
+
+ procedure Pause; virtual;
+
+ procedure Resume; virtual;
+
+
+ procedure StepInto; virtual;
+
+ procedure StepOver; virtual;
+
+ procedure SetBreakPoint(const Fn: tbtstring; Line: Longint);
+
+ procedure ClearBreakPoint(const Fn: tbtstring; Line: Longint);
+
+ property BreakPointCount: Longint read GetBreakPointCount;
+
+ property BreakPoint[I: Longint]: TPSBreakPointInfo read GetBreakPoint;
+
+ function HasBreakPoint(const Fn: tbtstring; Line: Longint): Boolean;
+
+ procedure ClearBreakPoints;
+
+ function GetVarContents(const Name: tbtstring): tbtstring;
+ published
+
+ property OnIdle: TNotifyEvent read FOnIdle write FOnIdle;
+
+ property OnLineInfo: TPSOnLineInfo read FOnLineInfo write FOnLineInfo;
+
+ property OnBreakpoint: TPSOnLineInfo read FOnBreakpoint write FOnBreakpoint;
+ end;
+
+ TIFPS3DebugCompExec = class(TPSScriptDebugger);
+
+ TPSCustumPlugin = class(TPSPlugin)
+ private
+ FOnCompileImport2: TPSEvent;
+ FOnExecOnUses: TPSEvent;
+ FOnCompOnUses: TPSEvent;
+ FOnCompileImport1: TPSEvent;
+ FOnExecImport1: TPSOnExecImport;
+ FOnExecImport2: TPSOnExecImport;
+ public
+ procedure CompOnUses(CompExec: TPSScript); override;
+ procedure ExecOnUses(CompExec: TPSScript); override;
+ procedure CompileImport1(CompExec: TPSScript); override;
+ procedure CompileImport2(CompExec: TPSScript); override;
+ procedure ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); override;
+
+ procedure ExecImport2(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); override;
+ public
+ published
+ property OnCompOnUses : TPSEvent read FOnCompOnUses write FOnCompOnUses;
+ property OnExecOnUses: TPSEvent read FOnExecOnUses write FOnExecOnUses;
+ property OnCompileImport1: TPSEvent read FOnCompileImport1 write FOnCompileImport1;
+ property OnCompileImport2: TPSEvent read FOnCompileImport2 write FOnCompileImport2;
+ property OnExecImport1: TPSOnExecImport read FOnExecImport1 write FOnExecImport1;
+ property OnExecImport2: TPSOnExecImport read FOnExecImport2 write FOnExecImport2;
+ end;
+
+implementation
+
+
+{$IFDEF DELPHI3UP }
+resourceString
+{$ELSE }
+const
+{$ENDIF }
+
+ RPS_UnableToReadVariant = 'Unable to read variant';
+ RPS_UnableToWriteVariant = 'Unable to write variant';
+ RPS_ScripEngineAlreadyRunning = 'Script engine already running';
+ RPS_ScriptNotCompiled = 'Script is not compiled';
+ RPS_NotRunning = 'Not running';
+ RPS_UnableToFindVariable = 'Unable to find variable';
+ RPS_UnknownIdentifier = 'Unknown Identifier';
+ RPS_NoScript = 'No script';
+
+function MyGetVariant(Sender: TPSExec; const Name: tbtstring): Variant;
+begin
+ Result := TPSScript (Sender.Id).DoOnGetNotificationVariant(Name);
+end;
+
+procedure MySetVariant(Sender: TPSExec; const Name: tbtstring; V: Variant);
+begin
+ TPSScript (Sender.Id).DoOnSetNotificationVariant(Name, V);
+end;
+
+function CompScriptUses(Sender: TPSPascalCompiler; const Name: tbtstring): Boolean;
+begin
+ Result := TPSScript(Sender.ID).ScriptUses(Sender, Name);
+end;
+
+procedure ExecOnLine(Sender: TPSExec);
+begin
+ if assigned(TPSScript(Sender.ID).FOnLine) then
+ begin
+ TPSScript(Sender.ID).OnLineEvent;
+ end;
+end;
+
+function CompExportCheck(Sender: TPSPascalCompiler; Proc: TPSInternalProcedure; const ProcDecl: tbtstring): Boolean;
+begin
+ Result := TPSScript(Sender.ID).DoVerifyProc (Sender.ID, Proc, ProcDecl);
+end;
+
+
+procedure callObjectOnProcessDirective (
+ Sender: TPSPreProcessor;
+ Parser: TPSPascalPreProcessorParser;
+ const Active: Boolean;
+ const DirectiveName, DirectiveParam: tbtstring;
+ Var Continue: Boolean);
+begin
+ TPSScript (Sender.ID).DoOnProcessUnknowDirective(Sender, Parser, Active, DirectiveName, DirectiveParam, Continue);
+end;
+
+procedure callObjectOnProcessUnknowDirective (
+ Sender: TPSPreProcessor;
+ Parser: TPSPascalPreProcessorParser;
+ const Active: Boolean;
+ const DirectiveName, DirectiveParam: tbtstring;
+ Var Continue: Boolean);
+begin
+ TPSScript (Sender.ID).DoOnProcessDirective(Sender, Parser, Active, DirectiveName, DirectiveParam, Continue);
+end;
+
+
+{ TPSPlugin }
+procedure TPSPlugin.CompileImport1(CompExec: TPSScript);
+begin
+ // do nothing
+end;
+
+procedure TPSPlugin.CompileImport2(CompExec: TPSScript);
+begin
+ // do nothing
+end;
+
+procedure TPSPlugin.CompOnUses(CompExec: TPSScript);
+begin
+ // do nothing
+end;
+
+procedure TPSPlugin.ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter);
+begin
+ // do nothing
+end;
+
+procedure TPSPlugin.ExecImport2(CompExec: TPSScript; const ri: TPSRuntimeClassImporter);
+begin
+ // do nothing
+end;
+
+procedure TPSPlugin.ExecOnUses(CompExec: TPSScript);
+begin
+ // do nothing
+end;
+
+
+{ TPSScript }
+
+function TPSScript.AddFunction(Ptr: Pointer;
+ const Decl: tbtstring): Boolean;
+begin
+ Result := AddFunctionEx(Ptr, Decl, cdRegister);
+end;
+
+function TPSScript.AddFunctionEx(Ptr: Pointer; const Decl: tbtstring;
+ CallingConv: TDelphiCallingConvention): Boolean;
+var
+ P: TPSRegProc;
+begin
+ if not FCanAdd then begin Result := False; exit; end;
+ p := Comp.AddDelphiFunction(Decl);
+ if p <> nil then
+ begin
+ Exec.RegisterDelphiFunction(Ptr, p.Name, CallingConv);
+ Result := True;
+ end else Result := False;
+end;
+
+function TPSScript.AddRegisteredVariable(const VarName,
+ VarType: tbtstring): Boolean;
+var
+ FVar: TPSVar;
+begin
+ if not FCanAdd then begin Result := False; exit; end;
+ FVar := FComp.AddUsedVariableN(varname, vartype);
+ if fvar = nil then
+ result := False
+ else begin
+ fvar.exportname := fvar.Name;
+ Result := True;
+ end;
+end;
+
+function CENeedFile(Sender: TPSPreProcessor; const callingfilename: tbtstring; var FileName, Output: tbtstring): Boolean;
+begin
+ Result := TPSScript (Sender.ID).DoOnNeedFile(Sender.ID, CallingFileName, FileName, Output);
+end;
+
+procedure CompTranslateLineInfo(Sender: TPSPascalCompiler; var Pos, Row, Col: Cardinal; var Name: tbtstring);
+var
+ res: TPSLineInfoResults;
+begin
+ if TPSScript(Sender.ID).FPP.CurrentLineInfo.GetLineInfo(Name, Pos, Res) then
+ begin
+ Pos := Res.Pos;
+ Row := Res.Row;
+ Col := Res.Col;
+ Name := Res.Name;
+ end;
+end;
+
+function TPSScript.Compile: Boolean;
+var
+ i: Longint;
+ dta: tbtstring;
+begin
+ FExec.Clear;
+ FExec.CMD_Err(erNoError);
+ FExec.ClearspecialProcImports;
+ FExec.ClearFunctionList;
+ if ri <> nil then
+ begin
+ RI.Free;
+ RI := nil;
+ end;
+ RI := TPSRuntimeClassImporter.Create;
+ for i := 0 to FPlugins.Count -1 do
+ begin
+ if (TPSPluginItem(FPlugins.Items[i]) <> nil) and (TPSPluginItem(FPlugins.Items[i]).Plugin <> nil) then
+ TPSPluginItem(FPlugins.Items[i]).Plugin.ExecImport1(Self, ri);
+ end;
+
+ DoOnExecImport (RI);
+
+ for i := 0 to FPlugins.Count -1 do
+ begin
+ if (TPSPluginItem(FPlugins.Items[i]) <> nil)and (TPSPluginItem(FPlugins.Items[i]).Plugin <> nil) then
+ TPSPluginItem(FPlugins.Items[i]).Plugin.ExecImport2(Self, ri);
+ end;
+ RegisterClassLibraryRuntime(Exec, RI);
+ for i := 0 to FPlugins.Count -1 do
+ begin
+ if (TPSPluginItem(FPlugins.Items[i]) <> nil)and (TPSPluginItem(FPlugins.Items[i]).Plugin <> nil) then
+ TPSPluginItem(FPlugins.Items[i]).Plugin.ExecOnUses(Self);
+ end;
+ FCanAdd := True;
+ FComp.BooleanShortCircuit := icBooleanShortCircuit in FCompOptions;
+ FComp.AllowNoBegin := icAllowNoBegin in FCompOptions;
+ FComp.AllowUnit := icAllowUnit in FCompOptions;
+ FComp.AllowNoEnd := icAllowNoEnd in FCompOptions;
+ if FUsePreProcessor then
+ begin
+ FPP.Clear;
+ FPP.Defines.Assign(FDefines);
+ FComp.OnTranslateLineInfo := CompTranslateLineInfo;
+ Fpp.OnProcessDirective := callObjectOnProcessDirective;
+ Fpp.OnProcessUnknowDirective := callObjectOnProcessUnknowDirective;
+ Fpp.MainFile := FScript.Text;
+ Fpp.MainFileName := FMainFileName;
+ Fpp.PreProcess(FMainFileName, dta);
+ if FComp.Compile(dta) then
+ begin
+ FCanAdd := False;
+ if (not SuppressLoadData) and (not LoadExec) then
+ begin
+ Result := False;
+ end else
+ Result := True;
+ end else Result := False;
+ Fpp.AdjustMessages(Comp);
+ end else
+ begin
+ FComp.OnTranslateLineInfo := nil;
+ if FComp.Compile(FScript.Text) then
+ begin
+ FCanAdd := False;
+ if not LoadExec then
+ begin
+ Result := False;
+ end else
+ Result := True;
+ end else Result := False;
+ end;
+end;
+
+function TPSScript.CompilerErrorToStr(I: Integer): tbtstring;
+begin
+ Result := CompilerMessages[i].MessageToString;
+end;
+
+constructor TPSScript.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FComp := TPSPascalCompiler.Create;
+ FExec := TPSDebugExec.Create;
+ FScript := TStringList.Create;
+ FPlugins := TPSPlugins.Create(self);
+
+ FComp.ID := Self;
+ FComp.OnUses := CompScriptUses;
+ FComp.OnExportCheck := CompExportCheck;
+ FExec.Id := Self;
+ FExec.OnRunLine:= ExecOnLine;
+ FExec.OnGetNVariant := MyGetVariant;
+ FExec.OnSetNVariant := MySetVariant;
+
+ FUseDebugInfo := True;
+
+ FPP := TPSPreProcessor.Create;
+ FPP.Id := Self;
+ FPP.OnNeedFile := CENeedFile;
+
+ FDefines := TStringList.Create;
+end;
+
+destructor TPSScript.Destroy;
+begin
+ FDefines.Free;
+
+ FPP.Free;
+ RI.Free;
+ FPlugins.Free;
+ FPlugins := nil;
+ FScript.Free;
+ FExec.Free;
+ FComp.Free;
+ inherited Destroy;
+end;
+
+function TPSScript.Execute: Boolean;
+begin
+ if Running then raise Exception.Create(RPS_ScripEngineAlreadyRunning);
+ if SuppressLoadData then
+ LoadExec;
+
+ DoOnExecute (RI);
+
+ FExec.DebugEnabled := FUseDebugInfo;
+ Result := FExec.RunScript and (FExec.ExceptionCode = erNoError) ;
+
+ DoAfterExecute;
+end;
+
+function TPSScript.GetAbout: tbtstring;
+begin
+ Result := TPSExec.About;
+end;
+
+procedure TPSScript.GetCompiled(var data: tbtstring);
+begin
+ if not FComp.GetOutput(Data) then
+ raise Exception.Create(RPS_ScriptNotCompiled);
+end;
+
+function TPSScript.GetCompMsg(i: Integer): TPSPascalCompilerMessage;
+begin
+ Result := FComp.Msg[i];
+end;
+
+function TPSScript.GetCompMsgCount: Longint;
+begin
+ Result := FComp.MsgCount;
+end;
+
+function TPSScript.GetExecErrorByteCodePosition: Cardinal;
+begin
+ Result := Exec.ExceptionPos;
+end;
+
+function TPSScript.GetExecErrorCode: TIFError;
+begin
+ Result := Exec.ExceptionCode;
+end;
+
+function TPSScript.GetExecErrorParam: tbtstring;
+begin
+ Result := Exec.ExceptionString;
+end;
+
+function TPSScript.GetExecErrorPosition: Cardinal;
+begin
+ Result := FExec.TranslatePosition(Exec.ExceptionProcNo, Exec.ExceptionPos);
+end;
+
+function TPSScript.GetExecErrorProcNo: Cardinal;
+begin
+ Result := Exec.ExceptionProcNo;
+end;
+
+function TPSScript.GetExecErrorString: tbtstring;
+begin
+ Result := TIFErrorToString(Exec.ExceptionCode, Exec.ExceptionString);
+end;
+
+function TPSScript.GetVariable(const Name: tbtstring): PIFVariant;
+begin
+ Result := FExec.GetVar2(name);
+end;
+
+function TPSScript.LoadExec: Boolean;
+var
+ s: tbtstring;
+begin
+ if (not FComp.GetOutput(s)) or (not FExec.LoadData(s)) then
+ begin
+ Result := False;
+ exit;
+ end;
+ if FUseDebugInfo then
+ begin
+ FComp.GetDebugOutput(s);
+ FExec.LoadDebugData(s);
+ end;
+ Result := True;
+end;
+
+function TPSScript.ScriptUses(Sender: TPSPascalCompiler;
+ const Name: tbtstring): Boolean;
+var
+ i: Longint;
+begin
+ if Name = 'SYSTEM' then
+ begin
+ for i := 0 to FPlugins.Count -1 do
+ begin
+ if (TPSPluginItem(FPlugins.Items[i]) <> nil)and (TPSPluginItem(FPlugins.Items[i]).Plugin <> nil) then
+ TPSPluginItem(FPlugins.Items[i]).Plugin.CompOnUses(Self);
+ end;
+ for i := 0 to FPlugins.Count -1 do
+ begin
+ if (TPSPluginItem(FPlugins.Items[i]) <> nil)and (TPSPluginItem(FPlugins.Items[i]).Plugin <> nil) then
+ TPSPluginItem(FPlugins.Items[i]).Plugin.CompileImport1(self);
+ end;
+
+ DoOnCompImport;
+
+ for i := 0 to FPlugins.Count -1 do
+ begin
+ if (TPSPluginItem(FPlugins.Items[i]) <> nil)and (TPSPluginItem(FPlugins.Items[i]).Plugin <> nil) then
+ TPSPluginItem(FPlugins.Items[i]).Plugin.CompileImport2(Self);
+ end;
+
+ DoOnCompile;
+
+ Result := true;
+ for i := 0 to Sender.MsgCount -1 do begin
+ if Sender.Msg[i] is TPSPascalCompilerError then Result := false;
+ end;
+ end
+ else begin
+ Result := DoOnUnknowUses (Sender, Name);
+{ If Not Result then
+ Sender.MakeError('', ecUnknownIdentifier, Name);}
+ end;
+end;
+
+procedure TPSScript.SetCompiled(const Data: tbtstring);
+var
+ i: Integer;
+begin
+ FExec.Clear;
+ FExec.ClearspecialProcImports;
+ FExec.ClearFunctionList;
+ if ri <> nil then
+ begin
+ RI.Free;
+ RI := nil;
+ end;
+ RI := TPSRuntimeClassImporter.Create;
+ for i := 0 to FPlugins.Count -1 do
+ begin
+ if (TPSPluginItem(FPlugins.Items[i]) <> nil)and (TPSPluginItem(FPlugins.Items[i]).Plugin <> nil) then
+ TPSPluginItem(FPlugins.Items[i]).Plugin.ExecImport1(Self, ri);
+ end;
+
+ DoOnExecImport(RI);
+
+ for i := 0 to FPlugins.Count -1 do
+ begin
+ if (TPSPluginItem(FPlugins.Items[i]) <> nil)and (TPSPluginItem(FPlugins.Items[i]).Plugin <> nil) then
+ TPSPluginItem(FPlugins.Items[i]).Plugin.ExecImport2(Self, ri);
+ end;
+ RegisterClassLibraryRuntime(Exec, RI);
+ for i := 0 to FPlugins.Count -1 do
+ begin
+ if (TPSPluginItem(FPlugins.Items[i]) <> nil)and (TPSPluginItem(FPlugins.Items[i]).Plugin <> nil) then
+ TPSPluginItem(FPlugins.Items[i]).Plugin.ExecOnUses(Self);
+ end;
+ if not FExec.LoadData(Data) then
+ raise Exception.Create(GetExecErrorString);
+end;
+
+function TPSScript.SetVarToInstance(const VarName: tbtstring; cl: TObject): Boolean;
+var
+ p: PIFVariant;
+begin
+ p := GetVariable(VarName);
+ if p <> nil then
+ begin
+ SetVariantToClass(p, cl);
+ result := true;
+ end else result := false;
+end;
+
+procedure TPSScript.SetScript(const Value: TStrings);
+begin
+ FScript.Assign(Value);
+end;
+
+
+function TPSScript.AddMethod(Slf, Ptr: Pointer;
+ const Decl: tbtstring): Boolean;
+begin
+ Result := AddMethodEx(Slf, Ptr, Decl, cdRegister);
+end;
+
+function TPSScript.AddMethodEx(Slf, Ptr: Pointer; const Decl: tbtstring;
+ CallingConv: TDelphiCallingConvention): Boolean;
+var
+ P: TPSRegProc;
+begin
+ if not FCanAdd then begin Result := False; exit; end;
+ p := Comp.AddDelphiFunction(Decl);
+ if p <> nil then
+ begin
+ Exec.RegisterDelphiMethod(Slf, Ptr, p.Name, CallingConv);
+ Result := True;
+ end else Result := False;
+end;
+
+procedure TPSScript.OnLineEvent;
+begin
+ if @FOnLine <> nil then FOnLine(Self);
+end;
+
+function TPSScript.GetRunning: Boolean;
+begin
+ Result := FExec.Status = isRunning;
+end;
+
+function TPSScript.GetExecErrorCol: Cardinal;
+var
+ s: tbtstring;
+ D1: Cardinal;
+begin
+ if not TranslatePositionRC(Exec.ExceptionProcNo, Exec.ExceptionPos, D1, Result, s) then
+ Result := 0;
+end;
+
+function TPSScript.TranslatePositionPos(Proc, Position: Cardinal;
+ var Pos: Cardinal; var fn: tbtstring): Boolean;
+var
+ D1, D2: Cardinal;
+begin
+ Result := Exec.TranslatePositionEx(Exec.ExceptionProcNo, Exec.ExceptionPos, Pos, D1, D2, fn);
+end;
+
+function TPSScript.TranslatePositionRC(Proc, Position: Cardinal;
+ var Row, Col: Cardinal; var fn: tbtstring): Boolean;
+var
+ d1: Cardinal;
+begin
+ Result := Exec.TranslatePositionEx(Proc, Position, d1, Row, Col, fn);
+end;
+
+
+function TPSScript.GetExecErrorRow: Cardinal;
+var
+ D1: Cardinal;
+ s: tbtstring;
+begin
+ if not TranslatePositionRC(Exec.ExceptionProcNo, Exec.ExceptionPos, Result, D1, s) then
+ Result := 0;
+end;
+
+procedure TPSScript.Stop;
+begin
+ if (FExec.Status = isRunning) or (Fexec.Status = isPaused) then
+ FExec.Stop
+ else
+ raise Exception.Create(RPS_NotRunning);
+end;
+
+function TPSScript.GetProcMethod(const ProcName: tbtstring): TMethod;
+begin
+ Result := FExec.GetProcAsMethodN(ProcName)
+end;
+
+procedure TPSScript.SetMainFileName(const Value: tbtstring);
+begin
+ FMainFileName := Value;
+end;
+
+function TPSScript.GetExecErrorFileName: tbtstring;
+var
+ D1, D2: Cardinal;
+begin
+ if not TranslatePositionRC(Exec.ExceptionProcNo, Exec.ExceptionPos, D1, D2, Result) then
+ Result := '';
+end;
+
+procedure TPSScript.SetPointerToData(const VarName: tbtstring;
+ Data: Pointer; aType: TIFTypeRec);
+var
+ v: PIFVariant;
+ t: TPSVariantIFC;
+begin
+ v := GetVariable(VarName);
+ if (Atype = nil) or (v = nil) then raise Exception.Create(RPS_UnableToFindVariable);
+ t.Dta := @PPSVariantData(v).Data;
+ t.aType := v.FType;
+ t.VarParam := false;
+ VNSetPointerTo(t, Data, aType);
+end;
+
+function TPSScript.AddRegisteredPTRVariable(const VarName,
+ VarType: tbtstring): Boolean;
+var
+ FVar: TPSVar;
+begin
+ if not FCanAdd then begin Result := False; exit; end;
+ FVar := FComp.AddUsedVariableN(varname, vartype);
+ if fvar = nil then
+ result := False
+ else begin
+ fvar.exportname := fvar.Name;
+ fvar.SaveAsPointer := true;
+ Result := True;
+ end;
+end;
+
+procedure TPSScript.SetDefines(const Value: TStrings);
+begin
+ FDefines.Assign(Value);
+end;
+
+function TPSScript.ExecuteFunction(const Params: array of Variant;
+ const ProcName: tbtstring): Variant;
+begin
+ if SuppressLoadData then
+ LoadExec;
+
+ DoOnExecute (RI);
+
+ FExec.DebugEnabled := FUseDebugInfo;
+
+ Result := Exec.RunProcPN(Params, ProcName);
+
+ DoAfterExecute;
+end;
+
+function TPSScript.FindBaseType(Bt: TPSBaseType): TPSTypeRec;
+begin
+ Result := Exec.FindType2(Bt);
+end;
+
+function TPSScript.FindNamedType(const Name: tbtstring): TPSTypeRec;
+begin
+ Result := Exec.GetTypeNo(Exec.GetType(Name));
+end;
+
+procedure TPSScript.Notification(AComponent: TComponent;
+ Operation: TOperation);
+var
+ i: Longint;
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation = opRemove) and (aComponent is TPSPlugin) then
+ begin
+ for i := Plugins.Count -1 downto 0 do
+ begin
+ if (Plugins.Items[i] as TPSPluginItem).Plugin = aComponent then
+ {$IFDEF FPC_COL_NODELETE}
+ TCollectionItem(Plugins.Items[i]).Free;
+ {$ELSE}
+ Plugins.Delete(i);
+ {$ENDIF}
+ end;
+ end;
+end;
+
+function TPSScript.AddNotificationVariant(const VarName: tbtstring): Boolean;
+begin
+ Result := AddRegisteredVariable(VarName, '!NOTIFICATIONVARIANT');
+end;
+
+procedure TPSScript.DoOnProcessDirective(Sender: TPSPreProcessor;
+ Parser: TPSPascalPreProcessorParser; const Active: Boolean;
+ const DirectiveName, DirectiveParam: tbtstring; var Continue: Boolean);
+begin
+ If Assigned (OnProcessDirective) then
+ OnProcessDirective (Sender, Parser, Active, DirectiveName, DirectiveParam, Continue);
+end;
+
+procedure TPSScript.DoOnProcessUnknowDirective(Sender: TPSPreProcessor;
+ Parser: TPSPascalPreProcessorParser; const Active: Boolean;
+ const DirectiveName, DirectiveParam: tbtstring; var Continue: Boolean);
+begin
+ If Assigned (OnProcessUnknowDirective) then
+ OnProcessUnknowDirective (Sender, Parser, Active, DirectiveName, DirectiveParam, Continue);
+end;
+
+function TPSScript.DoOnNeedFile(Sender: TObject;
+ const OrginFileName: tbtstring; var FileName, Output: tbtstring): Boolean;
+begin
+ If Assigned (OnNeedFile) then
+ Result := OnNeedFile(Sender, OrginFileName, FileName, Output)
+ else
+ Result := False;
+end;
+
+function TPSScript.DoOnUnknowUses(Sender: TPSPascalCompiler;
+ const Name: tbtstring): Boolean;
+var
+ lPrevAllowUnit: Boolean;
+ lData, lName: tbtstring;
+begin
+ if assigned(FOnFindUnknownFile) then begin
+ lName := Name;
+ if FOnFindUnknownFile(self, '', lName, lData) then begin
+ lPrevAllowUnit := FComp.AllowUnit;
+ FComp.AllowUnit := true;
+ if FUsePreProcessor then
+ begin
+ FPP.Defines.Assign(FDefines);
+ Fpp.MainFile := lData;
+ Fpp.MainFileName := lName;
+ Fpp.PreProcess(lName, lData);
+ Result := FComp.Compile(lData);
+ Fpp.AdjustMessages(FComp);
+ end else
+ begin
+ FComp.OnTranslateLineInfo := nil;
+ Result := FComp.Compile(lData);
+ end;
+ FComp.AllowUnit := lPrevAllowUnit;
+ end else begin
+ FComp.MakeError(FComp.UnitName, ecUnknownIdentifier, lName);
+ Result := false;
+ end;
+ end else begin
+ FComp.MakeError(FComp.UnitName, ecUnknownIdentifier, lName);
+ result := false;
+ end;
+end;
+
+procedure TPSScript.DoOnCompImport;
+begin
+ if assigned(OnCompImport) then
+ OnCompImport(Self, Comp);
+end;
+
+procedure TPSScript.DoOnCompile;
+begin
+ if assigned(OnCompile) then
+ OnCompile(Self);
+end;
+
+procedure TPSScript.DoOnExecute;
+begin
+ If Assigned (OnExecute) then
+ OnExecute (Self);
+end;
+
+procedure TPSScript.DoAfterExecute;
+begin
+ if Assigned (OnAfterExecute) then
+ OnAfterExecute(Self);
+end;
+
+function TPSScript.DoVerifyProc(Sender: TPSScript;
+ Proc: TPSInternalProcedure; const Decl: tbtstring): Boolean;
+begin
+ if Assigned(OnVerifyProc) then begin
+ Result := false;
+ OnVerifyProc(Sender, Proc, Decl, Result);
+ Result := not Result;
+ end
+ else
+ Result := True;
+end;
+
+procedure TPSScript.DoOnExecImport(
+ RunTimeImporter: TPSRuntimeClassImporter);
+begin
+ if assigned(OnExecImport) then
+ OnExecImport(Self, FExec, RunTimeImporter);
+end;
+
+function TPSScript.DoOnGetNotificationVariant(const Name: tbtstring): Variant;
+begin
+ if Not Assigned (OnGetNotificationVariant) then
+ raise Exception.Create(RPS_UnableToReadVariant);
+ Result := OnGetNotificationVariant(Self, Name);
+end;
+
+procedure TPSScript.DoOnSetNotificationVariant(const Name: tbtstring;
+ V: Variant);
+begin
+ if Not Assigned (OnSetNotificationVariant) then
+ raise Exception.Create(RPS_UnableToWriteVariant);
+ OnSetNotificationVariant(Self, Name, v);
+end;
+
+{ TPSDllPlugin }
+
+procedure TPSDllPlugin.CompOnUses;
+begin
+ CompExec.Comp.OnExternalProc := DllExternalProc;
+end;
+
+procedure TPSDllPlugin.ExecOnUses;
+begin
+ RegisterDLLRuntime(CompExec.Exec);
+end;
+
+
+
+{ TPS3DebugCompExec }
+
+procedure LineInfo(Sender: TPSDebugExec; const FileName: tbtstring; Position, Row, Col: Cardinal);
+var
+ Dc: TPSScriptDebugger;
+ h, i: Longint;
+ bi: TPSBreakPointInfo;
+ lFileName: tbtstring;
+begin
+ Dc := Sender.Id;
+ if FileName = '' then
+ lFileName := dc.MainFileName
+ else
+ lFileName := FileName;
+
+ if @dc.FOnLineInfo <> nil then dc.FOnLineInfo(dc, lFileName, Position, Row, Col);
+ if row = dc.FLastRow then exit;
+ dc.FLastRow := row;
+ h := MakeHash(lFileName);
+ bi := nil;
+ for i := DC.FBreakPoints.Count -1 downto 0 do
+ begin
+ bi := Dc.FBreakpoints[i];
+ if (h = bi.FileNameHash) and (lFileName = bi.FileName) and (Cardinal(bi.Line) = Row) then
+ begin
+ Break;
+ end;
+ Bi := nil;
+ end;
+ if bi <> nil then
+ begin
+ if @dc.FOnBreakpoint <> nil then dc.FOnBreakpoint(dc, lFileName, Position, Row, Col);
+ dc.Pause;
+ end;
+end;
+
+procedure IdleCall(Sender: TPSDebugExec);
+var
+ Dc: TPSScriptDebugger;
+begin
+ Dc := Sender.Id;
+ if @dc.FOnIdle <> nil then
+ dc.FOnIdle(DC)
+ else
+ dc.Exec.Run;
+end;
+
+procedure TPSScriptDebugger.ClearBreakPoint(const Fn: tbtstring; Line: Integer);
+var
+ h, i: Longint;
+ bi: TPSBreakPointInfo;
+begin
+ h := MakeHash(Fn);
+ for i := FBreakPoints.Count -1 downto 0 do
+ begin
+ bi := FBreakpoints[i];
+ if (h = bi.FileNameHash) and (Fn = bi.FileName) and (bi.Line = Line) then
+ begin
+ FBreakPoints.Delete(i);
+ bi.Free;
+ Break;
+ end;
+ end;
+end;
+
+procedure TPSScriptDebugger.ClearBreakPoints;
+var
+ i: Longint;
+begin
+ for i := FBreakPoints.Count -1 downto 0 do
+ TPSBreakPointInfo(FBreakPoints[i]).Free;
+ FBreakPoints.Clear;;
+end;
+
+constructor TPSScriptDebugger.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FBreakPoints := TIFList.Create;
+ FExec.OnSourceLine := LineInfo;
+ FExec.OnIdleCall := IdleCall;
+end;
+
+destructor TPSScriptDebugger.Destroy;
+var
+ i: Longint;
+begin
+ for i := FBreakPoints.Count -1 downto 0 do
+ begin
+ TPSBreakPointInfo(FBreakPoints[i]).Free;
+ end;
+ FBreakPoints.Free;
+ inherited Destroy;
+end;
+
+function TPSScriptDebugger.GetBreakPoint(I: Integer): TPSBreakPointInfo;
+begin
+ Result := FBreakPoints[i];
+end;
+
+function TPSScriptDebugger.GetBreakPointCount: Longint;
+begin
+ Result := FBreakPoints.Count;
+end;
+
+function TPSScriptDebugger.GetVarContents(const Name: tbtstring): tbtstring;
+var
+ i: Longint;
+ pv: PIFVariant;
+ s1, s: tbtstring;
+begin
+ s := Uppercase(Name);
+ if pos('.', s) > 0 then
+ begin
+ s1 := copy(s,1,pos('.', s) -1);
+ delete(s,1,pos('.', Name));
+ end else begin
+ s1 := s;
+ s := '';
+ end;
+ pv := nil;
+ for i := 0 to Exec.CurrentProcVars.Count -1 do
+ begin
+ if Uppercase(Exec.CurrentProcVars[i]) = s1 then
+ begin
+ pv := Exec.GetProcVar(i);
+ break;
+ end;
+ end;
+ if pv = nil then
+ begin
+ for i := 0 to Exec.CurrentProcParams.Count -1 do
+ begin
+ if Uppercase(Exec.CurrentProcParams[i]) = s1 then
+ begin
+ pv := Exec.GetProcParam(i);
+ break;
+ end;
+ end;
+ end;
+ if pv = nil then
+ begin
+ for i := 0 to Exec.GlobalVarNames.Count -1 do
+ begin
+ if Uppercase(Exec.GlobalVarNames[i]) = s1 then
+ begin
+ pv := Exec.GetGlobalVar(i);
+ break;
+ end;
+ end;
+ end;
+ if pv = nil then
+ Result := RPS_UnknownIdentifier
+ else
+ Result := PSVariantToString(NewTPSVariantIFC(pv, False), s);
+end;
+
+function TPSScriptDebugger.HasBreakPoint(const Fn: tbtstring; Line: Integer): Boolean;
+var
+ h, i: Longint;
+ bi: TPSBreakPointInfo;
+begin
+ h := MakeHash(Fn);
+ for i := FBreakPoints.Count -1 downto 0 do
+ begin
+ bi := FBreakpoints[i];
+ if (h = bi.FileNameHash) and (Fn = bi.FileName) and (bi.Line = Line) then
+ begin
+ Result := true;
+ exit;
+ end;
+ end;
+ Result := False;
+end;
+
+procedure TPSScriptDebugger.Pause;
+begin
+ if FExec.Status = isRunning then
+ FExec.Pause
+ else
+ raise Exception.Create(RPS_NotRunning);
+end;
+
+procedure TPSScriptDebugger.Resume;
+begin
+ if FExec.Status = isRunning then
+ FExec.Run
+ else
+ raise Exception.Create(RPS_NotRunning);
+end;
+
+procedure TPSScriptDebugger.SetBreakPoint(const fn: tbtstring; Line: Integer);
+var
+ i, h: Longint;
+ BI: TPSBreakPointInfo;
+begin
+ h := MakeHash(fn);
+ for i := FBreakPoints.Count -1 downto 0 do
+ begin
+ bi := FBreakpoints[i];
+ if (h = bi.FileNameHash) and (fn = bi.FileName) and (bi.Line = Line) then
+ exit;
+ end;
+ bi := TPSBreakPointInfo.Create;
+ FBreakPoints.Add(bi);
+ bi.FileName := fn;
+ bi.Line := Line;
+end;
+
+procedure TPSScriptDebugger.SetMainFileName(const Value: tbtstring);
+var
+ OldFn: tbtstring;
+ h1, h2,i: Longint;
+ bi: TPSBreakPointInfo;
+begin
+ OldFn := FMainFileName;
+ inherited SetMainFileName(Value);
+ h1 := MakeHash(OldFn);
+ h2 := MakeHash(Value);
+ if OldFn <> Value then
+ begin
+ for i := FBreakPoints.Count -1 downto 0 do
+ begin
+ bi := FBreakPoints[i];
+ if (bi.FileNameHash = h1) and (bi.FileName = OldFn) then
+ begin
+ bi.FFileNameHash := h2;
+ bi.FFileName := Value;
+ end else if (bi.FileNameHash = h2) and (bi.FileName = Value) then
+ begin
+ // It's already the new filename, that can't be right, so remove all the breakpoints there
+ FBreakPoints.Delete(i);
+ bi.Free;
+ end;
+ end;
+ end;
+end;
+
+procedure TPSScriptDebugger.StepInto;
+begin
+ if (FExec.Status = isRunning) or (FExec.Status = isLoaded) then
+ FExec.StepInto
+ else
+ raise Exception.Create(RPS_NoScript);
+end;
+
+procedure TPSScriptDebugger.StepOver;
+begin
+ if (FExec.Status = isRunning) or (FExec.Status = isLoaded) then
+ FExec.StepOver
+ else
+ raise Exception.Create(RPS_NoScript);
+end;
+
+
+
+{ TPSPluginItem }
+
+procedure TPSPluginItem.Assign(Source: TPersistent); //Birb
+begin
+ if Source is TPSPluginItem then
+ plugin:=((source as TPSPluginItem).plugin)
+ else
+ inherited;
+end;
+
+function TPSPluginItem.GetDisplayName: string;
+begin
+ if FPlugin <> nil then
+ Result := string(FPlugin.Name)
+ else
+ Result := '';
+end;
+
+procedure TPSPluginItem.SetPlugin(const Value: TPSPlugin);
+begin
+ FPlugin := Value;
+ If Value <> nil then
+ Value.FreeNotification(TPSPlugins(Collection).FCompExec);
+ Changed(False);
+end;
+
+{ TPSPlugins }
+
+constructor TPSPlugins.Create(CE: TPSScript);
+begin
+ inherited Create(TPSPluginItem);
+ FCompExec := CE;
+end;
+
+function TPSPlugins.GetOwner: TPersistent;
+begin
+ Result := FCompExec;
+end;
+
+{ TPSBreakPointInfo }
+
+procedure TPSBreakPointInfo.SetFileName(const Value: tbtstring);
+begin
+ FFileName := Value;
+ FFileNameHash := MakeHash(Value);
+end;
+
+{ TPSCustomPlugin }
+procedure TPSCustumPlugin.CompileImport1(CompExec: TPSScript);
+begin
+ IF @FOnCompileImport1 <> nil then
+ FOnCompileImport1(CompExec)
+ else
+ inherited;
+end;
+
+procedure TPSCustumPlugin.CompileImport2(CompExec: TPSScript);
+begin
+ IF @FOnCompileImport2 <> nil then
+ FOnCompileImport2(CompExec)
+ else
+ inherited;
+end;
+
+procedure TPSCustumPlugin.CompOnUses(CompExec: TPSScript);
+begin
+ IF @FOnCompOnUses <> nil then
+ FOnCompOnUses(CompExec)
+ else
+ inherited;
+end;
+
+procedure TPSCustumPlugin.ExecImport1(CompExec: TPSScript;
+ const ri: TPSRuntimeClassImporter);
+begin
+ IF @FOnExecImport1 <> nil then
+ FOnExecImport1(CompExec, compExec.Exec, ri)
+ else
+ inherited;
+end;
+
+procedure TPSCustumPlugin.ExecImport2(CompExec: TPSScript;
+ const ri: TPSRuntimeClassImporter);
+begin
+ IF @FOnExecImport2 <> nil then
+ FOnExecImport1(CompExec, compExec.Exec, ri)
+ else
+ inherited;
+end;
+
+procedure TPSCustumPlugin.ExecOnUses(CompExec: TPSScript);
+begin
+ IF @FOnExecOnUses <> nil then
+ FOnExecOnUses(CompExec)
+ else
+ inherited;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_COM.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_COM.pas
new file mode 100644
index 0000000..1ae3533
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_COM.pas
@@ -0,0 +1,38 @@
+
+unit uPSComponent_COM;
+
+interface
+uses
+ SysUtils, Classes, uPSComponent, uPSCompiler, uPSRuntime;
+type
+
+ TPSImport_ComObj = class(TPSPlugin)
+ private
+ public
+ procedure CompileImport1(CompExec: TPSScript); override;
+ procedure ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); override;
+ end;
+
+ TIFPS3CE_ComObj = class(TPSImport_ComObj);
+
+implementation
+uses
+ uPSC_comobj,
+ uPSR_comobj;
+
+
+{ TPSImport_ComObj }
+
+procedure TPSImport_ComObj.CompileImport1(CompExec: TPSScript);
+begin
+ SIRegister_ComObj(CompExec.Comp);
+end;
+
+
+procedure TPSImport_ComObj.ExecImport1(CompExec: TPSScript;
+ const ri: TPSRuntimeClassImporter);
+begin
+ RIRegister_ComObj(CompExec.Exec);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_Controls.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_Controls.pas
new file mode 100644
index 0000000..fce7b29
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_Controls.pas
@@ -0,0 +1,65 @@
+ unit uPSComponent_Controls;
+
+interface
+uses
+ SysUtils, Classes, uPSComponent, uPSCompiler, uPSRuntime;
+type
+
+ TPSImport_Controls = class(TPSPlugin)
+ private
+ FEnableStreams: Boolean;
+ FEnableGraphics: Boolean;
+ FEnableControls: Boolean;
+ public
+ procedure CompileImport1(CompExec: TPSScript); override;
+ procedure ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ published
+
+ property EnableStreams: Boolean read FEnableStreams write FEnableStreams;
+
+ property EnableGraphics: Boolean read FEnableGraphics write FEnableGraphics;
+
+ property EnableControls: Boolean read FEnableControls write FEnableControls;
+ end;
+
+ TIFPS3CE_Controls = class(TPSImport_Controls);
+
+implementation
+uses
+ uPSC_graphics,
+ uPSC_controls,
+ uPSR_graphics,
+ uPSR_controls;
+
+
+{ TPSImport_Controls }
+
+procedure TPSImport_Controls.CompileImport1(CompExec: TPSScript);
+begin
+ if FEnableGraphics then
+ SIRegister_Graphics(CompExec.Comp, FEnableStreams);
+ if FEnableControls then
+ SIRegister_Controls(CompExec.Comp);
+end;
+
+constructor TPSImport_Controls.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FEnableStreams := True;
+ FEnableGraphics := True;
+ FEnableControls := True;
+end;
+
+procedure TPSImport_Controls.ExecImport1(CompExec: TPSScript;
+ const ri: TPSRuntimeClassImporter);
+begin
+ if FEnableGraphics then
+ RIRegister_Graphics(ri, FEnableStreams);
+ if FEnableControls then
+ RIRegister_Controls(ri);
+end;
+
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_DB.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_DB.pas
new file mode 100644
index 0000000..c60d06e
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_DB.pas
@@ -0,0 +1,36 @@
+ unit uPSComponent_DB;
+
+interface
+{$I PascalScript.inc}
+uses
+ SysUtils, Classes, uPSComponent, uPSRuntime, uPSCompiler;
+type
+
+ TPSImport_DB = class(TPSPlugin)
+ public
+ procedure CompileImport1(CompExec: TPSScript); override;
+ procedure ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); override;
+ public
+ end;
+
+ TIFPS3CE_DB = class(TPSImport_DB);
+
+implementation
+uses
+ uPSC_DB,
+ uPSR_DB;
+
+{ TPSImport_DB }
+
+procedure TPSImport_DB.CompileImport1(CompExec: TPSScript);
+begin
+ SIRegister_DB(CompExec.Comp);
+end;
+
+procedure TPSImport_DB.ExecImport1(CompExec: TPSScript;
+ const ri: TPSRuntimeClassImporter);
+begin
+ RIRegister_DB(RI);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_Default.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_Default.pas
new file mode 100644
index 0000000..e7508cf
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_Default.pas
@@ -0,0 +1,81 @@
+ unit uPSComponent_Default;
+{$I PascalScript.inc}
+interface
+uses
+ SysUtils, Classes, uPSComponent, uPSCompiler, uPSRuntime;
+
+type
+
+ TPSImport_DateUtils = class(TPSPlugin)
+ public
+ procedure CompOnUses(CompExec: TPSScript); override;
+ procedure ExecOnUses(CompExec: TPSScript); override;
+ end;
+
+ TPSImport_Classes = class(TPSPlugin)
+ private
+ FEnableStreams: Boolean;
+ FEnableClasses: Boolean;
+ public
+ procedure CompileImport1(CompExec: TPSScript); override;
+ procedure ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); override;
+ public
+
+ constructor Create(AOwner: TComponent); override;
+ published
+
+ property EnableStreams: Boolean read FEnableStreams write FEnableStreams;
+
+ property EnableClasses: Boolean read FEnableClasses write FEnableClasses;
+ end;
+
+ TIFPS3CE_Std = class(TPSImport_Classes);
+
+ TIFPS3CE_DateUtils = class(TPSImport_DateUtils);
+
+implementation
+uses
+ uPSC_std,
+ uPSR_std,
+ uPSC_classes,
+ uPSR_classes,
+ uPSC_dateutils,
+ uPSR_dateutils;
+
+{ TPSImport_Classes }
+
+procedure TPSImport_Classes.CompileImport1(CompExec: TPSScript);
+begin
+ SIRegister_Std(CompExec.Comp);
+ if FEnableClasses then
+ SIRegister_Classes(CompExec.Comp, FEnableStreams);
+end;
+
+procedure TPSImport_Classes.ExecImport1(CompExec: TPSScript;
+ const ri: TPSRuntimeClassImporter);
+begin
+ RIRegister_Std(Ri);
+ if FEnableClasses then
+ RIRegister_Classes(ri, FEnableStreams);
+end;
+
+constructor TPSImport_Classes.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FEnableStreams := True;
+ FEnableClasses := True;
+end;
+
+{ TPSImport_DateUtils }
+
+procedure TPSImport_DateUtils.CompOnUses(CompExec: TPSScript);
+begin
+ RegisterDateTimeLibrary_C(CompExec.Comp);
+end;
+
+procedure TPSImport_DateUtils.ExecOnUses(CompExec: TPSScript);
+begin
+ RegisterDateTimeLibrary_R(CompExec.Exec);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_Forms.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_Forms.pas
new file mode 100644
index 0000000..418fbb2
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_Forms.pas
@@ -0,0 +1,65 @@
+
+unit uPSComponent_Forms;
+
+interface
+uses
+ SysUtils, Classes, uPSRuntime, uPSCompiler, uPSComponent;
+type
+
+ TPSImport_Forms = class(TPSPlugin)
+ private
+ FEnableForms: Boolean;
+ FEnableMenus: Boolean;
+ public
+ procedure CompileImport1(CompExec: TPSScript); override;
+ procedure ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ published
+
+ property EnableForms: Boolean read FEnableForms write FEnableForms;
+
+ property EnableMenus: Boolean read FEnableMenus write FEnableMenus;
+ end;
+
+ TIFPS3CE_Forms = class(TPSImport_Forms);
+
+implementation
+uses
+ uPSC_forms,
+ uPSC_menus,
+ uPSR_forms,
+ uPSR_menus;
+
+{ TPSImport_Forms }
+
+procedure TPSImport_Forms.CompileImport1(CompExec: TPSScript);
+begin
+ if FEnableForms then
+ SIRegister_Forms(CompExec.comp);
+ if FEnableMenus then
+ SIRegister_Menus(CompExec.comp);
+end;
+
+constructor TPSImport_Forms.Create(AOwner: TComponent);
+begin
+ inherited Create(Aowner);
+ FEnableForms := True;
+ FEnableMenus := True;
+end;
+
+procedure TPSImport_Forms.ExecImport1(CompExec: TPSScript;
+ const ri: TPSRuntimeClassImporter);
+begin
+ if FEnableForms then
+ RIRegister_Forms(ri);
+
+ if FEnableMenus then
+ begin
+ RIRegister_Menus(ri);
+ RIRegister_Menus_Routines(compexec.Exec);
+ end;
+
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_StdCtrls.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_StdCtrls.pas
new file mode 100644
index 0000000..9f92923
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSComponent_StdCtrls.pas
@@ -0,0 +1,65 @@
+
+unit uPSComponent_StdCtrls;
+
+interface
+uses
+ SysUtils, Classes, uPSComponent, uPSCompiler, uPSRuntime;
+type
+
+ TPSImport_StdCtrls = class(TPSPlugin)
+ private
+ FEnableButtons: Boolean;
+ FEnableExtCtrls: Boolean;
+ public
+ procedure CompileImport1(CompExec: TPSScript); override;
+ procedure ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ published
+
+ property EnableExtCtrls: Boolean read FEnableExtCtrls write FEnableExtCtrls;
+
+ property EnableButtons: Boolean read FEnableButtons write FEnableButtons;
+ end;
+
+ TIFPS3CE_StdCtrls = class(TPSImport_StdCtrls);
+
+
+implementation
+uses
+ uPSC_buttons,
+ uPSC_stdctrls,
+ uPSC_extctrls,
+ uPSR_buttons,
+ uPSR_stdctrls,
+ uPSR_extctrls;
+
+{ TPSImport_StdCtrls }
+
+procedure TPSImport_StdCtrls.CompileImport1(CompExec: TPSScript);
+begin
+ SIRegister_stdctrls(CompExec.Comp);
+ if FEnableExtCtrls then
+ SIRegister_ExtCtrls(CompExec.Comp);
+ if FEnableButtons then
+ SIRegister_Buttons(CompExec.Comp);
+end;
+
+constructor TPSImport_StdCtrls.Create(AOwner: TComponent);
+begin
+ inherited Create(Aowner);
+ FEnableButtons := True;
+ FEnableExtCtrls := True;
+end;
+
+procedure TPSImport_StdCtrls.ExecImport1(CompExec: TPSScript;
+ const ri: TPSRuntimeClassImporter);
+begin
+ RIRegister_stdctrls(RI);
+ if FEnableExtCtrls then
+ RIRegister_ExtCtrls(RI);
+ if FEnableButtons then
+ RIRegister_Buttons(RI);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSDebugger.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSDebugger.pas
new file mode 100644
index 0000000..3b58393
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSDebugger.pas
@@ -0,0 +1,654 @@
+
+unit uPSDebugger;
+{$I PascalScript.inc}
+interface
+uses
+ SysUtils, uPSRuntime, uPSUtils;
+
+type
+
+ TDebugMode = (dmRun
+ , dmStepOver
+ , dmStepInto
+ , dmPaused
+ );
+
+ TPSCustomDebugExec = class(TPSExec)
+ protected
+ FDebugDataForProcs: TIfList;
+ FLastProc: TPSProcRec;
+ FCurrentDebugProc: Pointer;
+ FProcNames: TIFStringList;
+ FGlobalVarNames: TIfStringList;
+ FCurrentSourcePos, FCurrentRow, FCurrentCol: Cardinal;
+ FCurrentFile: tbtstring;
+
+ function GetCurrentProcParams: TIfStringList;
+
+ function GetCurrentProcVars: TIfStringList;
+ protected
+
+ procedure ClearDebug; virtual;
+ public
+
+ function GetCurrentProcNo: Cardinal;
+
+ function GetCurrentPosition: Cardinal;
+
+ function TranslatePosition(Proc, Position: Cardinal): Cardinal;
+
+ function TranslatePositionEx(Proc, Position: Cardinal; var Pos, Row, Col: Cardinal; var Fn: tbtstring): Boolean;
+
+ procedure LoadDebugData(const Data: tbtstring);
+
+ procedure Clear; override;
+
+ property GlobalVarNames: TIfStringList read FGlobalVarNames;
+
+ property ProcNames: TIfStringList read FProcNames;
+
+ property CurrentProcVars: TIfStringList read GetCurrentProcVars;
+
+ property CurrentProcParams: TIfStringList read GetCurrentProcParams;
+
+ function GetGlobalVar(I: Cardinal): PIfVariant;
+
+ function GetProcVar(I: Cardinal): PIfVariant;
+
+ function GetProcParam(I: Cardinal): PIfVariant;
+
+ constructor Create;
+
+ destructor Destroy; override;
+ end;
+ TPSDebugExec = class;
+
+ TOnSourceLine = procedure (Sender: TPSDebugExec; const Name: tbtstring; Position, Row, Col: Cardinal);
+
+ TOnIdleCall = procedure (Sender: TPSDebugExec);
+
+ TPSDebugExec = class(TPSCustomDebugExec)
+ private
+ FDebugMode: TDebugMode;
+ FStepOverProc: TPSInternalProcRec;
+ FStepOverStackBase: Cardinal;
+ FOnIdleCall: TOnIdleCall;
+ FOnSourceLine: TOnSourceLine;
+ FDebugEnabled: Boolean;
+ protected
+
+ procedure SourceChanged;
+ procedure ClearDebug; override;
+ procedure RunLine; override;
+ public
+ constructor Create;
+
+ function LoadData(const s: tbtstring): Boolean; override;
+
+ procedure Pause; override;
+
+ procedure Run;
+
+ procedure StepInto;
+
+ procedure StepOver;
+
+ procedure Stop; override;
+
+ property DebugMode: TDebugMode read FDebugMode;
+
+ property OnSourceLine: TOnSourceLine read FOnSourceLine write FOnSourceLine;
+
+ property OnIdleCall: TOnIdleCall read FOnIdleCall write FOnIdleCall;
+
+ property DebugEnabled: Boolean read FDebugEnabled write FDebugEnabled;
+ end;
+ TIFPSDebugExec = TPSDebugExec;
+
+implementation
+
+{$IFDEF DELPHI3UP }
+resourceString
+{$ELSE }
+const
+{$ENDIF }
+
+ RPS_ExpectedReturnAddressStackBase = 'Expected return address at stack base';
+
+type
+ PPositionData = ^TPositionData;
+ TPositionData = packed record
+ FileName: tbtstring;
+ Position,
+ Row,
+ Col,
+ SourcePosition: Cardinal;
+ end;
+ PFunctionInfo = ^TFunctionInfo;
+ TFunctionInfo = packed record
+ Func: TPSProcRec;
+ FParamNames: TIfStringList;
+ FVariableNames: TIfStringList;
+ FPositionTable: TIfList;
+ end;
+
+{ TPSCustomDebugExec }
+
+procedure TPSCustomDebugExec.Clear;
+begin
+ inherited Clear;
+ if FGlobalVarNames <> nil then ClearDebug;
+end;
+
+procedure TPSCustomDebugExec.ClearDebug;
+var
+ i, j: Longint;
+ p: PFunctionInfo;
+begin
+ FCurrentDebugProc := nil;
+ FLastProc := nil;
+ FProcNames.Clear;
+ FGlobalVarNames.Clear;
+ FCurrentSourcePos := 0;
+ FCurrentRow := 0;
+ FCurrentCol := 0;
+ FCurrentFile := '';
+ for i := 0 to FDebugDataForProcs.Count -1 do
+ begin
+ p := FDebugDataForProcs[I];
+ for j := 0 to p^.FPositionTable.Count -1 do
+ begin
+ Dispose(PPositionData(P^.FPositionTable[J]));
+ end;
+ p^.FPositionTable.Free;
+ p^.FParamNames.Free;
+ p^.FVariableNames.Free;
+ Dispose(p);
+ end;
+ FDebugDataForProcs.Clear;
+end;
+
+constructor TPSCustomDebugExec.Create;
+begin
+ inherited Create;
+ FCurrentSourcePos := 0;
+ FCurrentRow := 0;
+ FCurrentCol := 0;
+ FCurrentFile := '';
+ FDebugDataForProcs := TIfList.Create;
+ FLastProc := nil;
+ FCurrentDebugProc := nil;
+ FProcNames := TIFStringList.Create;
+ FGlobalVarNames := TIfStringList.Create;
+end;
+
+destructor TPSCustomDebugExec.Destroy;
+begin
+ Clear;
+ FDebugDataForProcs.Free;
+ FProcNames.Free;
+ FGlobalVarNames.Free;
+ FGlobalVarNames := nil;
+ inherited Destroy;
+end;
+
+function TPSCustomDebugExec.GetCurrentPosition: Cardinal;
+begin
+ Result := TranslatePosition(GetCurrentProcNo, 0);
+end;
+
+function TPSCustomDebugExec.GetCurrentProcNo: Cardinal;
+var
+ i: Longint;
+begin
+ for i := 0 to FProcs.Count -1 do
+ begin
+ if FProcs[i]= FCurrProc then
+ begin
+ Result := I;
+ Exit;
+ end;
+ end;
+ Result := Cardinal(-1);
+end;
+
+function TPSCustomDebugExec.GetCurrentProcParams: TIfStringList;
+begin
+ if FCurrentDebugProc <> nil then
+ begin
+ Result := PFunctionInfo(FCurrentDebugProc)^.FParamNames;
+ end else Result := nil;
+end;
+
+function TPSCustomDebugExec.GetCurrentProcVars: TIfStringList;
+begin
+ if FCurrentDebugProc <> nil then
+ begin
+ Result := PFunctionInfo(FCurrentDebugProc)^.FVariableNames;
+ end else Result := nil;
+end;
+
+function TPSCustomDebugExec.GetGlobalVar(I: Cardinal): PIfVariant;
+begin
+ Result := FGlobalVars[I];
+end;
+
+function TPSCustomDebugExec.GetProcParam(I: Cardinal): PIfVariant;
+begin
+ Result := FStack[Cardinal(Longint(FCurrStackBase) - Longint(I) - 1)];
+end;
+
+function TPSCustomDebugExec.GetProcVar(I: Cardinal): PIfVariant;
+begin
+ Result := FStack[Cardinal(Longint(FCurrStackBase) + Longint(I) + 1)];
+end;
+
+function GetProcDebugInfo(FProcs: TIFList; Proc: TPSProcRec): PFunctionInfo;
+var
+ i: Longint;
+ c: PFunctionInfo;
+begin
+ if Proc = nil then
+ begin
+ Result := nil;
+ exit;
+ end;
+ for i := FProcs.Count -1 downto 0 do
+ begin
+ c := FProcs.Data^[I];
+ if c^.Func = Proc then
+ begin
+ Result := c;
+ exit;
+ end;
+ end;
+ new(c);
+ c^.Func := Proc;
+ c^.FPositionTable := TIfList.Create;
+ c^.FVariableNames := TIfStringList.Create;
+ c^.FParamNames := TIfStringList.Create;
+ FProcs.Add(c);
+ REsult := c;
+end;
+
+procedure TPSCustomDebugExec.LoadDebugData(const Data: tbtstring);
+var
+ CP, I: Longint;
+ c: tbtchar;
+ CurrProcNo, LastProcNo: Cardinal;
+ LastProc: PFunctionInfo;
+ NewLoc: PPositionData;
+ s: tbtstring;
+begin
+ ClearDebug;
+ if FStatus = isNotLoaded then exit;
+ CP := 1;
+ LastProcNo := Cardinal(-1);
+ LastProc := nil;
+ while CP <= length(Data) do
+ begin
+ c := Data[CP];
+ inc(cp);
+ case c of
+ #0:
+ begin
+ i := cp;
+ if i > length(data) then exit;
+ while Data[i] <> #0 do
+ begin
+ if Data[i] = #1 then
+ begin
+ FProcNames.Add(Copy(Data, cp, i-cp));
+ cp := I + 1;
+ end;
+ inc(I);
+ if I > length(data) then exit;
+ end;
+ cp := i + 1;
+ end;
+ #1:
+ begin
+ i := cp;
+ if i > length(data) then exit;
+ while Data[i] <> #0 do
+ begin
+ if Data[i] = #1 then
+ begin
+ FGlobalVarNames.Add(Copy(Data, cp, i-cp));
+ cp := I + 1;
+ end;
+ inc(I);
+ if I > length(data) then exit;
+ end;
+ cp := i + 1;
+ end;
+ #2:
+ begin
+ if cp + 4 > Length(data) then exit;
+ CurrProcNo := Cardinal((@Data[cp])^);
+ if CurrProcNo = Cardinal(-1) then Exit;
+ if CurrProcNo <> LastProcNo then
+ begin
+ LastProcNo := CurrProcNo;
+ LastProc := GetProcDebugInfo(FDebugDataForProcs, FProcs[CurrProcNo]);
+ if LastProc = nil then exit;
+ end;
+ inc(cp, 4);
+
+ i := cp;
+ if i > length(data) then exit;
+ while Data[i] <> #0 do
+ begin
+ if Data[i] = #1 then
+ begin
+ LastProc^.FParamNames.Add(Copy(Data, cp, i-cp));
+ cp := I + 1;
+ end;
+ inc(I);
+ if I > length(data) then exit;
+ end;
+ cp := i + 1;
+ end;
+ #3:
+ begin
+ if cp + 4 > Length(data) then exit;
+ CurrProcNo := Cardinal((@Data[cp])^);
+ if CurrProcNo = Cardinal(-1) then Exit;
+ if CurrProcNo <> LastProcNo then
+ begin
+ LastProcNo := CurrProcNo;
+ LastProc := GetProcDebugInfo(FDebugDataForProcs, FProcs[CurrProcNo]);
+ if LastProc = nil then exit;
+ end;
+ inc(cp, 4);
+
+ i := cp;
+ if i > length(data) then exit;
+ while Data[i] <> #0 do
+ begin
+ if Data[i] = #1 then
+ begin
+ LastProc^.FVariableNames.Add(Copy(Data, cp, i-cp));
+ cp := I + 1;
+ end;
+ inc(I);
+ if I > length(data) then exit;
+ end;
+ cp := i + 1;
+ end;
+ #4:
+ begin
+ i := cp;
+ if i > length(data) then exit;
+ while Data[i] <> #0 do
+ begin
+ if Data[i] = #1 then
+ begin
+ s := Copy(Data, cp, i-cp);
+ cp := I + 1;
+ Break;
+ end;
+ inc(I);
+ if I > length(data) then exit;
+ end;
+ if cp + 4 > Length(data) then exit;
+ CurrProcNo := Cardinal((@Data[cp])^);
+ if CurrProcNo = Cardinal(-1) then Exit;
+ if CurrProcNo <> LastProcNo then
+ begin
+ LastProcNo := CurrProcNo;
+ LastProc := GetProcDebugInfo(FDebugDataForProcs, FProcs[CurrProcNo]);
+ if LastProc = nil then exit;
+ end;
+ inc(cp, 4);
+ if cp + 16 > Length(data) then exit;
+ new(NewLoc);
+ NewLoc^.Position := Cardinal((@Data[Cp])^);
+ NewLoc^.FileName := s;
+ NewLoc^.SourcePosition := Cardinal((@Data[Cp+4])^);
+ NewLoc^.Row := Cardinal((@Data[Cp+8])^);
+ NewLoc^.Col := Cardinal((@Data[Cp+12])^);
+ inc(cp, 16);
+ LastProc^.FPositionTable.Add(NewLoc);
+ end;
+ else
+ begin
+ ClearDebug;
+ Exit;
+ end;
+ end;
+
+ end;
+end;
+
+
+
+
+
+
+function TPSCustomDebugExec.TranslatePosition(Proc, Position: Cardinal): Cardinal;
+var
+ D1, D2: Cardinal;
+ s: tbtstring;
+begin
+ if not TranslatePositionEx(Proc, Position, Result, D1, D2, s) then
+ Result := 0;
+end;
+
+function TPSCustomDebugExec.TranslatePositionEx(Proc, Position: Cardinal;
+ var Pos, Row, Col: Cardinal; var Fn: tbtstring): Boolean;
+// Made by Martijn Laan (mlaan@wintax.nl)
+var
+ i: LongInt;
+ fi: PFunctionInfo;
+ pt: TIfList;
+ r: PPositionData;
+ lastfn: tbtstring;
+ LastPos, LastRow, LastCol: Cardinal;
+ pp: TPSProcRec;
+begin
+ fi := nil;
+ pp := FProcs[Proc];
+ for i := 0 to FDebugDataForProcs.Count -1 do
+ begin
+ fi := FDebugDataForProcs[i];
+ if fi^.Func = pp then
+ Break;
+ fi := nil;
+ end;
+ LastPos := 0;
+ LastRow := 0;
+ LastCol := 0;
+ if fi <> nil then begin
+ pt := fi^.FPositionTable;
+ for i := 0 to pt.Count -1 do
+ begin
+ r := pt[I];
+ if r^.Position >= Position then
+ begin
+ if r^.Position = Position then
+ begin
+ Pos := r^.SourcePosition;
+ Row := r^.Row;
+ Col := r^.Col;
+ Fn := r^.Filename;
+ end
+ else
+ begin
+ Pos := LastPos;
+ Row := LastRow;
+ Col := LastCol;
+ Fn := LastFn;
+ end;
+ Result := True;
+ exit;
+ end else
+ begin
+ LastPos := r^.SourcePosition;
+ LastRow := r^.Row;
+ LastCol := r^.Col;
+ LastFn := r^.FileName;
+ end;
+ end;
+ Pos := LastPos;
+ Row := LastRow;
+ Col := LastCol;
+ Result := True;
+ end else
+ begin
+ Result := False;
+ end;
+end;
+
+{ TPSDebugExec }
+procedure TPSDebugExec.ClearDebug;
+begin
+ inherited;
+ FDebugMode := dmRun;
+end;
+
+function TPSDebugExec.LoadData(const s: tbtstring): Boolean;
+begin
+ Result := inherited LoadData(s);
+ FDebugMode := dmRun;
+end;
+
+procedure TPSDebugExec.RunLine;
+var
+ i: Longint;
+ pt: TIfList;
+ r: PPositionData;
+begin
+ inherited RunLine;
+ if not DebugEnabled then exit;
+ if FCurrProc <> FLastProc then
+ begin
+ FLastProc := FCurrProc;
+ FCurrentDebugProc := nil;
+ for i := 0 to FDebugDataForProcs.Count -1 do
+ begin
+ if PFunctionInfo(FDebugDataForProcs[I])^.Func = FLastProc then
+ begin
+ FCurrentDebugProc := FDebugDataForProcs[I];
+ break;
+ end;
+ end;
+ end;
+ if FCurrentDebugProc <> nil then
+ begin
+ pt := PFunctionInfo(FCurrentDebugProc)^.FPositionTable;
+ for i := 0 to pt.Count -1 do
+ begin
+ r := pt[I];
+ if r^.Position = FCurrentPosition then
+ begin
+ FCurrentSourcePos := r^.SourcePosition;
+ FCurrentRow := r^.Row;
+ FCurrentCol := r^.Col;
+ FCurrentFile := r^.FileName;
+ SourceChanged;
+ break;
+ end;
+ end;
+ end else
+ begin
+ FCurrentSourcePos := 0;
+ FCurrentRow := 0;
+ FCurrentCol := 0;
+ FCurrentFile := '';
+ end;
+ while FDebugMode = dmPaused do
+ begin
+ if @FOnIdleCall <> nil then
+ begin
+ FOnIdleCall(Self);
+ end else break; // endless loop
+ end;
+end;
+
+
+procedure TPSDebugExec.SourceChanged;
+
+ function StepOverShouldPause: Boolean;
+ var
+ I: Cardinal;
+ V: PPSVariant;
+ begin
+ if (FCurrProc <> FStepOverProc) or (FCurrStackBase <> FStepOverStackBase) then
+ begin
+ { We're not inside the function being stepped, so scan the call stack to
+ see if we're inside a function called by the function being stepped }
+ I := FCurrStackBase;
+ while Longint(I) > Longint(FStepOverStackBase) do
+ begin
+ V := FStack.Items[I];
+ if (V = nil) or (V.FType <> FReturnAddressType) then
+ raise Exception.Create(RPS_ExpectedReturnAddressStackBase);
+ if (PPSVariantReturnAddress(V).Addr.ProcNo = FStepOverProc) and
+ (PPSVariantReturnAddress(V).Addr.StackBase = FStepOverStackBase) then
+ begin
+ { We are, so don't pause }
+ Result := False;
+ Exit;
+ end;
+ I := PPSVariantReturnAddress(V).Addr.StackBase;
+ end;
+ end;
+ Result := True;
+ end;
+
+begin
+ case FDebugMode of
+ dmStepInto:
+ begin
+ FDebugMode := dmPaused;
+ end;
+ dmStepOver:
+ begin
+ if StepOverShouldPause then
+ begin
+ FDebugMode := dmPaused;
+ end;
+ end;
+ end;
+ if @FOnSourceLine <> nil then
+ FOnSourceLine(Self, FCurrentFile, FCurrentSourcePos, FCurrentRow, FCurrentCol);
+end;
+
+
+procedure TPSDebugExec.Pause;
+begin
+ FDebugMode := dmPaused;
+end;
+
+procedure TPSDebugExec.Stop;
+begin
+ FDebugMode := dmRun;
+ inherited Stop;
+end;
+
+procedure TPSDebugExec.Run;
+begin
+ FDebugMode := dmRun;
+end;
+
+procedure TPSDebugExec.StepInto;
+begin
+ FDebugMode := dmStepInto;
+end;
+
+procedure TPSDebugExec.StepOver;
+begin
+ FStepOverProc := FCurrProc;
+ FStepOverStackBase := FCurrStackBase;
+ FDebugMode := dmStepOver;
+end;
+
+
+constructor TPSDebugExec.Create;
+begin
+ inherited Create;
+ FDebugEnabled := True;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSDisassembly.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSDisassembly.pas
new file mode 100644
index 0000000..5e19d71
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSDisassembly.pas
@@ -0,0 +1,499 @@
+
+
+unit uPSDisassembly;
+{$I PascalScript.inc}
+
+interface
+uses
+ uPSRuntime, uPSUtils, sysutils;
+
+function IFPS3DataToText(const Input: tbtstring; var Output: string): Boolean;
+implementation
+
+type
+ TMyPSExec = class(TPSExec)
+ function ImportProc(const Name: ShortString; proc: TIFExternalProcRec): Boolean; override;
+ end;
+
+function Debug2Str(const s: string): string;
+var
+ i: Integer;
+begin
+ result := '';
+ for i := 1 to length(s) do
+ begin
+ if (s[i] < #32) or (s[i] > #128) then
+ result := result + '\'+inttohex(ord(s[i]), 2)
+ else if s[i] = '\' then
+ result := result + '\\'
+ else
+ result := result + s[i];
+ end;
+
+end;
+
+function SpecImportProc(Sender: TObject; p: TIFExternalProcRec): Boolean; forward;
+
+function FloatToStr(Value: Extended): string;
+begin
+ try
+ Result := SysUtils.FloatToStr(Value);
+ except
+ Result := 'NaNa';
+ end;
+end;
+
+
+function IFPS3DataToText(const Input: tbtstring; var Output: string): Boolean;
+var
+ I: TMyPSExec;
+
+ procedure Writeln(const s: string);
+ begin
+ Output := Output + s + #13#10;
+ end;
+ function BT2S(P: PIFTypeRec): string;
+ var
+ i: Longint;
+ begin
+ case p.BaseType of
+ btU8: Result := 'U8';
+ btS8: Result := 'S8';
+ btU16: Result := 'U16';
+ btS16: Result := 'S16';
+ btU32: Result := 'U32';
+ btS32: Result := 'S32';
+ {$IFNDEF PS_NOINT64}bts64: Result := 'S64'; {$ENDIF}
+ btChar: Result := {$IFDEF UNICODE}'AnsiChar'{$ELSE}'Char'{$ENDIF};
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: Result := 'WideChar';
+ btWideString: Result := 'WideString';
+ {$ENDIF}
+ btSet: Result := 'Set';
+ btSingle: Result := 'Single';
+ btDouble: Result := 'Double';
+ btExtended: Result := 'Extended';
+ btString: Result := 'String';
+ btRecord:
+ begin
+ Result := 'Record(';
+ for i := 0 to TPSTypeRec_Record(p).FieldTypes.Count-1 do
+ begin
+ if i <> 0 then Result := Result+',';
+ Result := Result + BT2S(PIFTypeRec(TPSTypeRec_Record(p).FieldTypes[i]));
+ end;
+ Result := Result + ')';
+ end;
+ btArray: Result := 'Array of '+BT2S(TPSTypeRec_Array(p).ArrayType);
+ btResourcePointer: Result := 'ResourcePointer';
+ btPointer: Result := 'Pointer';
+ btVariant: Result := 'Variant';
+ btClass: Result := 'Class';
+ btProcPtr: Result := 'ProcPtr';
+ btStaticArray: Result := 'StaticArray['+inttostR(TPSTypeRec_StaticArray(p).Size)+'] of '+BT2S(TPSTypeRec_Array(p).ArrayType);
+ else
+ Result := 'Unknown '+inttostr(p.BaseType);
+ end;
+ end;
+ procedure WriteTypes;
+ var
+ T: Longint;
+ begin
+ Writeln('[TYPES]');
+ for T := 0 to i.FTypes.Count -1 do
+ begin
+ if PIFTypeRec(i.FTypes[t]).ExportName <> '' then
+ Writeln('Type ['+inttostr(t)+']: '+bt2s(PIFTypeRec(i.FTypes[t]))+' Export: '+PIFTypeRec(i.FTypes[t]).ExportName)
+ else
+ Writeln('Type ['+inttostr(t)+']: '+bt2s(PIFTypeRec(i.FTypes[t])));
+ end;
+ end;
+ procedure WriteVars;
+ var
+ T: Longint;
+ function FindType(p: Pointer): Cardinal;
+ var
+ T: Longint;
+ begin
+ Result := Cardinal(-1);
+ for T := 0 to i.FTypes.Count -1 do
+ begin
+ if p = i.FTypes[t] then begin
+ result := t;
+ exit;
+ end;
+ end;
+ end;
+ begin
+ Writeln('[VARS]');
+ for t := 0 to i.FGlobalVars.count -1 do
+ begin
+ Writeln('Var ['+inttostr(t)+']: '+ IntToStr(FindType(PIFVariant(i.FGlobalVars[t])^.FType)) + ' '+ bt2s(PIFVariant(i.FGlobalVars[t])^.Ftype) + ' '+ PIFVariant(i.FGlobalVars[t])^.Ftype.ExportName);
+ end;
+ end;
+
+ procedure WriteProcs;
+ var
+ t: Longint;
+ procedure WriteProc(proc: TPSProcRec);
+ var
+ sc, CP: Cardinal;
+ function ReadData(var Data; Len: Cardinal): Boolean;
+ begin
+ if CP + Len <= TPSInternalProcRec(PROC).Length then begin
+ Move(TPSInternalProcRec(Proc).Data[CP], Data, Len);
+ CP := CP + Len;
+ Result := True;
+ end else Result := False;
+ end;
+ function ReadByte(var B: Byte): Boolean;
+ begin
+ if CP < TPSInternalProcRec(Proc).Length then begin
+ b := TPSInternalProcRec(Proc).Data^[cp];
+ Inc(CP);
+ Result := True;
+ end else Result := False;
+ end;
+
+ function ReadLong(var B: Cardinal): Boolean;
+ begin
+ if CP + 3 < TPSInternalProcRec(Proc).Length then begin
+ b := Cardinal((@TPSInternalProcRec(Proc).Data[CP])^);
+ Inc(CP, 4);
+ Result := True;
+ end else Result := False;
+ end;
+ function ReadWriteVariable: string;
+ var
+ VarType: byte;
+ L1, L2: Cardinal;
+ function ReadVar(FType: Cardinal): string;
+ var
+ F: PIFTypeRec;
+ b: byte;
+ w: word;
+ l: Cardinal;
+ {$IFNDEF PS_NOINT64}ff: Int64;{$ENDIF}
+ e: extended;
+ ss: single;
+ d: double;
+ s: ansistring;
+ c: char;
+ {$IFNDEF PS_NOWIDESTRING}
+ wc: WideChar;
+ ws: WideString;
+ {$ENDIF}
+
+ begin
+ result := '';
+ F:= i.FTypes[Ftype];
+ if f = nil then exit;
+ case f.BaseType of
+ btProcPtr: begin if not ReadData(l, 4) then exit; Result := 'PROC: '+inttostr(l); end;
+ btU8: begin if not ReadData(b, 1) then exit; Result := IntToStr(tbtu8(B)); end;
+ btS8: begin if not ReadData(b, 1) then exit; Result := IntToStr(tbts8(B)); end;
+ btU16: begin if not ReadData(w, 2) then exit; Result := IntToStr(tbtu16(w)); end;
+ btS16: begin if not ReadData(w, 2) then exit; Result := IntToStr(tbts16(w)); end;
+ btU32: begin if not ReadData(l, 4) then exit; Result := IntToStr(tbtu32(l)); end;
+ btS32: begin if not ReadData(l, 4) then exit; Result := IntToStr(tbts32(l)); end;
+ {$IFNDEF PS_NOINT64}bts64: begin if not ReadData(ff, 8) then exit; Result := IntToStr(ff); end;{$ENDIF}
+ btSingle: begin if not ReadData(ss, Sizeof(tbtsingle)) then exit; Result := FloatToStr(ss); end;
+ btDouble: begin if not ReadData(d, Sizeof(tbtdouble)) then exit; Result := FloatToStr(d); end;
+ btExtended: begin if not ReadData(e, Sizeof(tbtextended)) then exit; Result := FloatToStr(e); end;
+ btPChar, btString: begin if not ReadData(l, 4) then exit; SetLength(s, l); if not readData(s[1], l) then exit; Result := MakeString(s); end;
+ btSet:
+ begin
+ SetLength(s, TPSTypeRec_Set(f).aByteSize);
+ if not ReadData(s[1], length(s)) then exit;
+ result := MakeString(s);
+
+ end;
+ btChar: begin if not ReadData(c, 1) then exit; Result := '#'+IntToStr(ord(c)); end;
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: begin if not ReadData(wc, 2) then exit; Result := '#'+IntToStr(ord(wc)); end;
+ btWideString: begin if not ReadData(l, 4) then exit; SetLength(ws, l); if not readData(ws[1], l*2) then exit; Result := MakeWString(ws); end;
+ {$ENDIF}
+ end;
+ end;
+ function AddressToStr(a: Cardinal): String;
+ begin
+ if a < PSAddrNegativeStackStart then
+ Result := 'GlobalVar['+inttostr(a)+']'
+ else
+ Result := 'Base['+inttostr(Longint(A-PSAddrStackStart))+']';
+ end;
+
+ begin
+ Result := '';
+ if not ReadByte(VarType) then Exit;
+ case VarType of
+ 0:
+ begin
+
+ if not ReadLong(L1) then Exit;
+ Result := AddressToStr(L1);
+ end;
+ 1:
+ begin
+ if not ReadLong(L1) then Exit;
+ Result := '['+ReadVar(l1)+']';
+ end;
+ 2:
+ begin
+ if not ReadLong(L1) then Exit;
+ if not ReadLong(L2) then Exit;
+ Result := AddressToStr(L1)+'.['+inttostr(l2)+']';
+ end;
+ 3:
+ begin
+ if not ReadLong(l1) then Exit;
+ if not ReadLong(l2) then Exit;
+ Result := AddressToStr(L1)+'.'+AddressToStr(l2);
+ end;
+ end;
+ end;
+
+ var
+ b: Byte;
+ s: string;
+ DP, D1, D2, d3, d4: Cardinal;
+
+ begin
+ CP := 0;
+ sc := 0;
+ while true do
+ begin
+ DP := cp;
+ if not ReadByte(b) then Exit;
+ case b of
+ CM_A:
+ begin
+ {$IFDEF FPC}
+ Output := Output + ' ['+inttostr(dp)+'] ASSIGN '+ ReadWriteVariable;
+ Output := Output + ', ' + ReadWriteVariable + #13#10;
+ {$ELSE}
+ Writeln(' ['+inttostr(dp)+'] ASSIGN '+ReadWriteVariable+ ', ' + ReadWriteVariable);
+ {$ENDIF}
+ end;
+ CM_CA:
+ begin
+ if not ReadByte(b) then exit;
+ case b of
+ 0: s:= '+';
+ 1: s := '-';
+ 2: s := '*';
+ 3: s:= '/';
+ 4: s:= 'MOD';
+ 5: s:= 'SHL';
+ 6: s:= 'SHR';
+ 7: s:= 'AND';
+ 8: s:= 'OR';
+ 9: s:= 'XOR';
+ else
+ exit;
+ end;
+ Writeln(' ['+inttostr(dp)+'] CALC '+ReadWriteVariable+ ' '+s+' ' + ReadWriteVariable);
+ end;
+ CM_P:
+ begin
+ Inc(sc);
+ Writeln(' ['+inttostr(dp)+'] PUSH '+ReadWriteVariable + ' // '+inttostr(sc));
+ end;
+ CM_PV:
+ begin
+ Inc(sc);
+ Writeln(' ['+inttostr(dp)+'] PUSHVAR '+ReadWriteVariable + ' // '+inttostr(sc));
+ end;
+ CM_PO:
+ begin
+ Dec(Sc);
+ Writeln(' ['+inttostr(dp)+'] POP // '+inttostr(sc));
+ end;
+ Cm_C:
+ begin
+ if not ReadLong(D1) then exit;
+ Writeln(' ['+inttostr(dp)+'] CALL '+inttostr(d1));
+ end;
+ Cm_PG:
+ begin
+ if not ReadLong(D1) then exit;
+ Writeln(' ['+inttostr(dp)+'] POP/GOTO currpos + '+IntToStr(d1)+' ['+IntToStr(CP+d1)+']');
+ end;
+ Cm_P2G:
+ begin
+ if not ReadLong(D1) then exit;
+ Writeln(' ['+inttostr(dp)+'] POP2/GOTO currpos + '+IntToStr(d1)+' ['+IntToStr(CP+d1)+']');
+ end;
+ Cm_G:
+ begin
+ if not ReadLong(D1) then exit;
+ Writeln(' ['+inttostr(dp)+'] GOTO currpos + '+IntToStr(d1)+' ['+IntToStr(CP+d1)+']');
+ end;
+ Cm_CG:
+ begin
+ if not ReadLong(D1) then exit;
+ Writeln(' ['+inttostr(dp)+'] COND_GOTO currpos + '+IntToStr(d1)+' '+ReadWriteVariable+' ['+IntToStr(CP+d1)+']');
+ end;
+ Cm_CNG:
+ begin
+ if not ReadLong(D1) then exit;
+ Writeln(' ['+inttostr(dp)+'] COND_NOT_GOTO currpos + '+IntToStr(d1)+' '+ReadWriteVariable+' ['+IntToStr(CP+d1)+']');
+ end;
+ Cm_R: Writeln(' ['+inttostr(dp)+'] RET');
+ Cm_ST:
+ begin
+ if not ReadLong(d1) or not readLong(d2) then exit;
+ Writeln(' ['+inttostr(dp)+'] SETSTACKTYPE Base['+inttostr(d1)+'] '+inttostr(d2));
+ end;
+ Cm_Pt:
+ begin
+ Inc(sc);
+ if not ReadLong(D1) then exit;
+ Writeln(' ['+inttostr(dp)+'] PUSHTYPE '+inttostr(d1) + '('+BT2S(TPSTypeRec(I.FTypes[d1]))+') // '+inttostr(sc));
+ end;
+ CM_CO:
+ begin
+ if not readByte(b) then exit;
+ case b of
+ 0: s := '>=';
+ 1: s := '<=';
+ 2: s := '>';
+ 3: s := '<';
+ 4: s := '<>';
+ 5: s := '=';
+ else exit;
+ end;
+ Writeln(' ['+inttostr(dp)+'] COMPARE into '+ReadWriteVariable+': '+ReadWriteVariable+' '+s+' '+ReadWriteVariable);
+ end;
+ Cm_cv:
+ begin
+ Writeln(' ['+inttostr(dp)+'] CALLVAR '+ReadWriteVariable);
+ end;
+ Cm_inc:
+ begin
+ Writeln(' ['+inttostr(dp)+'] INC '+ReadWriteVariable);
+ end;
+ Cm_dec:
+ begin
+ Writeln(' ['+inttostr(dp)+'] DEC '+ReadWriteVariable);
+ end;
+ cm_sp:
+ begin
+ Writeln(' ['+inttostr(dp)+'] SETPOINTER '+ReadWriteVariable+': '+ReadWriteVariable);
+ end;
+ cm_spc:
+ begin
+ Writeln(' ['+inttostr(dp)+'] SETCOPYPOINTER '+ReadWriteVariable+': '+ReadWriteVariable);
+ end;
+ cm_in:
+ begin
+ Writeln(' ['+inttostr(dp)+'] INOT '+ReadWriteVariable);
+ end;
+ cm_bn:
+ begin
+ Writeln(' ['+inttostr(dp)+'] BNOT '+ReadWriteVariable);
+ end;
+ cm_vm:
+ begin
+ Writeln(' ['+inttostr(dp)+'] MINUS '+ReadWriteVariable);
+ end;
+ cm_sf:
+ begin
+ s := ReadWriteVariable;
+ if not ReadByte(b) then exit;
+ if b = 0 then
+ Writeln(' ['+inttostr(dp)+'] SETFLAG '+s)
+ else
+ Writeln(' ['+inttostr(dp)+'] SETFLAG NOT '+s);
+ end;
+ cm_fg:
+ begin
+ if not ReadLong(D1) then exit;
+ Writeln(' ['+inttostr(dp)+'] FLAGGOTO currpos + '+IntToStr(d1)+' ['+IntToStr(CP+d1)+']');
+ end;
+ cm_puexh:
+ begin
+ if not ReadLong(D1) then exit;
+ if not ReadLong(D2) then exit;
+ if not ReadLong(D3) then exit;
+ if not ReadLong(D4) then exit;
+ Writeln(' ['+inttostr(dp)+'] PUSHEXCEPTION '+inttostr(d1)+' '+inttostr(d2)+' '+inttostr(d3)+' '+inttostr(d4));
+ end;
+ cm_poexh:
+ begin
+ if not ReadByte(b) then exit;
+ Writeln(' ['+inttostr(dp)+'] POPEXCEPTION '+inttostr(b));
+ end;
+ else
+ begin
+ Writeln(' Disasm Error');
+ Break;
+ end;
+ end;
+ end;
+ end;
+
+ begin
+ Writeln('[PROCS]');
+ for t := 0 to i.FProcs.Count -1 do
+ begin
+ if TPSProcRec(i.FProcs[t]).ClassType = TIFExternalProcRec then
+ begin
+ if TPSExternalProcRec(i.FProcs[t]). Decl = '' then
+ Writeln('Proc ['+inttostr(t)+']: External: '+TPSExternalProcRec(i.FProcs[t]).Name)
+ else
+ Writeln('Proc ['+inttostr(t)+']: External Decl: '+Debug2Str(TIFExternalProcRec(i.FProcs[t]).Decl) + ' ' + TIFExternalProcRec(i.FProcs[t]).Name);
+ end else begin
+ if TPSInternalProcRec(i.FProcs[t]).ExportName <> '' then
+ begin
+ Writeln('Proc ['+inttostr(t)+'] Export: '+TPSInternalProcRec(i.FProcs[t]).ExportName+' '+TPSInternalProcRec(i.FProcs[t]).ExportDecl);
+ end else
+ Writeln('Proc ['+inttostr(t)+']');
+ Writeproc(i.FProcs[t]);
+ end;
+ end;
+ end;
+
+begin
+ Result := False;
+ try
+ I := TMyPSExec.Create;
+ I.AddSpecialProcImport('', @SpecImportProc, nil);
+
+ if not I.LoadData(Input) then begin
+ I.Free;
+ Exit;
+ end;
+ Output := '';
+ WriteTypes;
+ WriteVars;
+ WriteProcs;
+ I.Free;
+ except
+ exit;
+ end;
+ result := true;
+end;
+
+{ TMyIFPSExec }
+
+function MyDummyProc(Caller: TPSExec; p: TIFExternalProcRec; Global, Stack: TPSStack): Boolean;
+begin
+ Result := False;
+end;
+
+
+function TMyPSExec.ImportProc(const Name: ShortString;
+ proc: TIFExternalProcRec): Boolean;
+begin
+ Proc.ProcPtr := MyDummyProc;
+ result := true;
+end;
+
+function SpecImportProc(Sender: TObject; p: TIFExternalProcRec): Boolean;
+begin
+ p.ProcPtr := MyDummyProc;
+ Result := True;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSPreProcessor.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSPreProcessor.pas
new file mode 100644
index 0000000..77cbed1
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSPreProcessor.pas
@@ -0,0 +1,797 @@
+
+unit uPSPreProcessor;
+{$I PascalScript.inc}
+
+interface
+uses
+ Classes, SysUtils, uPSCompiler, uPSUtils;
+
+
+
+type
+ EPSPreProcessor = class(Exception); //- jgv
+ TPSPreProcessor = class;
+ TPSPascalPreProcessorParser = class;
+
+ TPSOnNeedFile = function (Sender: TPSPreProcessor; const callingfilename: tbtstring; var FileName, Output: tbtstring): Boolean;
+ TPSOnProcessDirective = procedure (
+ Sender: TPSPreProcessor;
+ Parser: TPSPascalPreProcessorParser;
+ const Active: Boolean;
+ const DirectiveName, DirectiveParam: tbtString;
+ Var Continue: Boolean); //- jgv - application set continue to false to stop the normal directive processing
+
+ TPSLineInfo = class(TObject)
+ private
+ function GetLineOffset(I: Integer): Cardinal;
+ function GetLineOffsetCount: Longint;
+ protected
+ FEndPos: Cardinal;
+ FStartPos: Cardinal;
+ FFileName: tbtstring;
+ FLineOffsets: TIfList;
+ public
+
+ property FileName: tbtstring read FFileName;
+
+ property StartPos: Cardinal read FStartPos;
+
+ property EndPos: Cardinal read FEndPos;
+
+ property LineOffsetCount: Longint read GetLineOffsetCount;
+
+ property LineOffset[I: Longint]: Cardinal read GetLineOffset;
+
+
+ constructor Create;
+
+ destructor Destroy; override;
+ end;
+
+ TPSLineInfoResults = record
+
+ Row,
+ Col,
+ Pos: Cardinal;
+
+ Name: tbtstring;
+ end;
+
+ TPSLineInfoList = class(TObject)
+ private
+ FItems: TIfList;
+ FCurrent: Longint;
+ function GetCount: Longint;
+ function GetItem(I: Integer): TPSLineInfo;
+ protected
+
+ function Add: TPSLineInfo;
+ public
+
+ property Count: Longint read GetCount;
+
+ property Items[I: Longint]: TPSLineInfo read GetItem; default;
+
+ procedure Clear;
+
+ function GetLineInfo(const ModuleName: tbtstring; Pos: Cardinal; var Res: TPSLineInfoResults): Boolean;
+
+ property Current: Longint read FCurrent write FCurrent;
+
+
+ constructor Create;
+
+ destructor Destroy; override;
+ end;
+ TPSDefineStates = class;
+
+ TPSPreProcessor = class(TObject)
+ private
+ FID: Pointer;
+ FCurrentDefines, FDefines: TStringList;
+ FCurrentLineInfo: TPSLineInfoList;
+ FOnNeedFile: TPSOnNeedFile;
+ FAddedPosition: Cardinal;
+ FDefineState: TPSDefineStates;
+ FMaxLevel: Longint;
+ FMainFileName: tbtstring;
+ FMainFile: tbtstring;
+ FOnProcessDirective: TPSOnProcessDirective;
+ FOnProcessUnknowDirective: TPSOnProcessDirective;
+ procedure ParserNewLine(Sender: TPSPascalPreProcessorParser; Row, Col, Pos: Cardinal);
+ procedure IntPreProcess(Level: Integer; const OrgFileName: tbtstring; FileName: tbtstring; Dest: TStream);
+ protected
+ procedure doAddStdPredefines; virtual; // jgv
+ public
+ {The maximum number of levels deep the parser will go, defaults to 20}
+ property MaxLevel: Longint read FMaxLevel write FMaxLevel;
+ property CurrentLineInfo: TPSLineInfoList read FCurrentLineInfo;
+
+ property OnNeedFile: TPSOnNeedFile read FOnNeedFile write FOnNeedFile;
+
+ property Defines: TStringList read FDefines write FDefines;
+
+ property MainFile: tbtstring read FMainFile write FMainFile;
+
+ property MainFileName: tbtstring read FMainFileName write FMainFileName;
+
+ property ID: Pointer read FID write FID;
+
+ procedure AdjustMessages(Comp: TPSPascalCompiler);
+ procedure AdjustMessage(Msg: TPSPascalCompilerMessage); //-jgv
+
+ procedure PreProcess(const Filename: tbtstring; var Output: tbtstring);
+
+ procedure Clear;
+
+
+ constructor Create;
+
+ destructor Destroy; override;
+
+ property OnProcessDirective: TPSOnProcessDirective read fOnProcessDirective write fOnProcessDirective;
+ property OnProcessUnknowDirective: TPSOnProcessDirective read fOnProcessUnknowDirective write fOnProcessUnknowDirective;
+ end;
+
+ TPSPascalPreProcessorType = (ptEOF, ptOther, ptDefine);
+
+ TPSOnNewLine = procedure (Sender: TPSPascalPreProcessorParser; Row, Col, Pos: Cardinal) of object;
+
+ TPSPascalPreProcessorParser = class(TObject)
+ private
+ FData: tbtstring;
+ FText: PAnsichar;
+ FToken: tbtstring;
+ FTokenId: TPSPascalPreProcessorType;
+ FLastEnterPos, FLen, FRow, FCol, FPos: Cardinal;
+ FOnNewLine: TPSOnNewLine;
+ public
+
+ procedure SetText(const dta: tbtstring);
+
+ procedure Next;
+
+ property Token: tbtstring read FToken;
+
+ property TokenId: TPSPascalPreProcessorType read FTokenId;
+
+ property Row: Cardinal read FRow;
+
+ property Col: Cardinal read FCol;
+
+ property Pos: Cardinal read FPos;
+
+ property OnNewLine: TPSOnNewLine read FOnNewLine write FOnNewLine;
+ end;
+
+ TPSDefineState = class(TObject)
+ private
+ FInElse: Boolean;
+ FDoWrite: Boolean;
+ public
+
+ property InElse: Boolean read FInElse write FInElse;
+
+ property DoWrite: Boolean read FDoWrite write FDoWrite;
+ end;
+
+ TPSDefineStates = class(TObject)
+ private
+ FItems: TIfList;
+ function GetCount: Longint;
+ function GetItem(I: Integer): TPSDefineState;
+ function GetWrite: Boolean;
+ function GetPrevWrite: Boolean; //JeromeWelsh - nesting fix
+ public
+
+ property Count: Longint read GetCount;
+
+ property Item[I: Longint]: TPSDefineState read GetItem; default;
+
+ function Add: TPSDefineState;
+
+ procedure Delete(I: Longint);
+
+
+ constructor Create;
+
+ destructor Destroy; override;
+
+ procedure Clear;
+
+ property DoWrite: Boolean read GetWrite;
+ property DoPrevWrite: Boolean read GetPrevWrite; //JeromeWelsh - nesting fix
+ end;
+
+implementation
+
+{$IFDEF DELPHI3UP }
+resourceString
+{$ELSE }
+const
+{$ENDIF }
+
+ RPS_TooManyNestedInclude = 'Too many nested include files while processing ''%s'' from ''%s''';
+ RPS_IncludeNotFound = 'Unable to find file ''%s'' used from ''%s''';
+ RPS_DefineTooManyParameters = 'Too many parameters at %d:%d';
+ RPS_NoIfdefForEndif = 'No IFDEF for ENDIF at %d:%d';
+ RPS_NoIfdefForElse = 'No IFDEF for ELSE at %d:%d';
+ RPS_ElseTwice = 'Can''t use ELSE twice at %d:%d';
+ RPS_UnknownCompilerDirective = 'Unknown compiler directives at %d:%d';
+ RPs_DefineNotClosed = 'Define not closed';
+
+{ TPSLineInfoList }
+
+function TPSLineInfoList.Add: TPSLineInfo;
+begin
+ Result := TPSLineInfo.Create;
+ FItems.Add(Result);
+end;
+
+procedure TPSLineInfoList.Clear;
+var
+ i: Longint;
+begin
+ for i := FItems.count -1 downto 0 do
+ TPSLineInfo(FItems[i]).Free;
+ FItems.Clear;
+end;
+
+constructor TPSLineInfoList.Create;
+begin
+ inherited Create;
+ FItems := TIfList.Create;
+end;
+
+destructor TPSLineInfoList.Destroy;
+begin
+ Clear;
+ FItems.Free;
+ inherited Destroy;
+end;
+
+function TPSLineInfoList.GetCount: Longint;
+begin
+ Result := FItems.Count;
+end;
+
+function TPSLineInfoList.GetItem(I: Integer): TPSLineInfo;
+begin
+ Result := TPSLineInfo(FItems[i]);
+end;
+
+function TPSLineInfoList.GetLineInfo(const ModuleName: tbtstring; Pos: Cardinal; var Res: TPSLineInfoResults): Boolean;
+var
+ i,j: Longint;
+ linepos: Cardinal;
+ Item: TPSLineInfo;
+ lModuleName: tbtstring;
+begin
+ lModuleName := FastUpperCase(ModuleName);
+
+ for i := FItems.Count -1 downto 0 do
+ begin
+ Item := FItems[i];
+ if (Pos >= Item.StartPos) and (Pos < Item.EndPos) and
+ (lModuleName = '') or (lModuleName = Item.FileName) then
+ begin
+ Res.Name := Item.FileName;
+ Pos := Pos - Item.StartPos;
+ Res.Pos := Pos;
+ Res.Col := 1;
+ Res.Row := 1;
+ LinePos := 0;
+ for j := 0 to Item.LineOffsetCount -1 do
+ begin
+ if Pos >= Item.LineOffset[j] then
+ begin
+ linepos := Item.LineOffset[j];
+ end else
+ begin
+ Res.Row := j; // j -1, but line counting starts at 1
+ Res.Col := pos - linepos + 1;
+ Break;
+ end;
+ end;
+ Result := True;
+ exit;
+ end;
+ end;
+ Result := False;
+end;
+
+{ TPSLineInfo }
+
+constructor TPSLineInfo.Create;
+begin
+ inherited Create;
+ FLineOffsets := TIfList.Create;
+end;
+
+destructor TPSLineInfo.Destroy;
+begin
+ FLineOffsets.Free;
+ inherited Destroy;
+end;
+
+
+function TPSLineInfo.GetLineOffset(I: Integer): Cardinal;
+begin
+ Result := Longint(FLineOffsets[I]);
+end;
+
+function TPSLineInfo.GetLineOffsetCount: Longint;
+begin
+ result := FLineOffsets.Count;
+end;
+
+{ TPSPascalPreProcessorParser }
+
+procedure TPSPascalPreProcessorParser.Next;
+var
+ ci: Cardinal;
+
+begin
+ FPos := FPos + FLen;
+ case FText[FPos] of
+ #0:
+ begin
+ FLen := 0;
+ FTokenId := ptEof;
+ end;
+ '''':
+ begin
+ ci := FPos;
+ while (FText[ci] <> #0) do
+ begin
+ Inc(ci);
+ while FText[ci] = '''' do
+ begin
+ if FText[ci+1] <> '''' then Break;
+ inc(ci);
+ inc(ci);
+ end;
+ if FText[ci] = '''' then Break;
+ if FText[ci] = #13 then
+ begin
+ inc(FRow);
+ if FText[ci] = #10 then
+ inc(ci);
+ FLastEnterPos := ci -1;
+ if @FOnNewLine <> nil then FOnNewLine(Self, FRow, FPos - FLastEnterPos + 1, ci+1);
+ break;
+ end else if FText[ci] = #10 then
+ begin
+ inc(FRow);
+ FLastEnterPos := ci -1;
+ if @FOnNewLine <> nil then FOnNewLine(Self, FRow, FPos - FLastEnterPos + 1, ci+1);
+ break;
+ end;
+ end;
+ FLen := ci - FPos + 1;
+ FTokenId := ptOther;
+ end;
+ '(':
+ begin
+ if FText[FPos + 1] = '*' then
+ begin
+ ci := FPos + 1;
+ while (FText[ci] <> #0) do begin
+ if (FText[ci] = '*') and (FText[ci + 1] = ')') then
+ Break;
+ if FText[ci] = #13 then
+ begin
+ inc(FRow);
+ if FText[ci+1] = #10 then
+ inc(ci);
+ FLastEnterPos := ci -1;
+ if @FOnNewLine <> nil then FOnNewLine(Self, FRow, FPos - FLastEnterPos + 1, ci+1);
+ end else if FText[ci] = #10 then
+ begin
+ inc(FRow);
+ FLastEnterPos := ci -1;
+ if @FOnNewLine <> nil then FOnNewLine(Self, FRow, FPos - FLastEnterPos + 1, ci+1);
+ end;
+ Inc(ci);
+ end;
+ FTokenId := ptOther;
+ if (FText[ci] <> #0) then
+ Inc(ci, 2);
+ FLen := ci - FPos;
+ end
+ else
+ begin
+ FTokenId := ptOther;
+ FLen := 1;
+ end;
+ end;
+ '/':
+ begin
+ if FText[FPos + 1] = '/' then
+ begin
+ ci := FPos + 1;
+ while (FText[ci] <> #0) and (FText[ci] <> #13) and
+ (FText[ci] <> #10) do begin
+ Inc(ci);
+ end;
+ FTokenId := ptOther;
+ FLen := ci - FPos;
+ end else
+ begin
+ FTokenId := ptOther;
+ FLen := 1;
+ end;
+ end;
+ '{':
+ begin
+ ci := FPos + 1;
+ while (FText[ci] <> #0) and (FText[ci] <> '}') do begin
+ if FText[ci] = #13 then
+ begin
+ inc(FRow);
+ if FText[ci+1] = #10 then
+ inc(ci);
+ FLastEnterPos := ci - 1;
+ if @FOnNewLine <> nil then FOnNewLine(Self, FRow, FPos - FLastEnterPos + 1, ci+1);
+ end else if FText[ci] = #10 then
+ begin
+ inc(FRow);
+ FLastEnterPos := ci - 1;
+ if @FOnNewLine <> nil then FOnNewLine(Self, FRow, FPos - FLastEnterPos + 1, ci+1);
+ end;
+ Inc(ci);
+ end;
+ if FText[FPos + 1] = '$' then
+ FTokenId := ptDefine
+ else
+ FTokenId := ptOther;
+
+ FLen := ci - FPos + 1;
+ end;
+ else
+ begin
+ ci := FPos + 1;
+ while not (FText[ci] in [#0,'{', '(', '''', '/']) do
+ begin
+ if FText[ci] = #13 then
+ begin
+ inc(FRow);
+ if FText[ci+1] = #10 then
+ inc(ci);
+ FLastEnterPos := ci - 1;
+ if @FOnNewLine <> nil then FOnNewLine(Self, FRow, FPos - FLastEnterPos + 1, ci+1);
+ end else if FText[ci] = #10 then
+ begin
+ inc(FRow);
+ FLastEnterPos := ci -1 ;
+ if @FOnNewLine <> nil then FOnNewLine(Self, FRow, FPos - FLastEnterPos + 1, ci+1);
+ end;
+ Inc(Ci);
+ end;
+ FTokenId := ptOther;
+ FLen := ci - FPos;
+ end;
+ end;
+ FCol := FPos - FLastEnterPos + 1;
+ FToken := Copy(FData, FPos +1, FLen);
+end;
+
+procedure TPSPascalPreProcessorParser.SetText(const dta: tbtstring);
+begin
+ FData := dta;
+ FText := pAnsichar(FData);
+ FLen := 0;
+ FPos := 0;
+ FCol := 1;
+ FLastEnterPos := 0;
+ FRow := 1;
+ if @FOnNewLine <> nil then FOnNewLine(Self, 1, 1, 0);
+ Next;
+end;
+
+{ TPSPreProcessor }
+
+procedure TPSPreProcessor.AdjustMessage(Msg: TPSPascalCompilerMessage);
+var
+ Res: TPSLineInfoResults;
+begin
+ if CurrentLineInfo.GetLineInfo(Msg.ModuleName, Msg.Pos, Res) then
+ begin
+ Msg.SetCustomPos(res.Pos, Res.Row, Res.Col);
+ Msg.ModuleName := Res.Name;
+ end;
+end;
+
+procedure TPSPreProcessor.AdjustMessages(Comp: TPSPascalCompiler);
+var
+ i: Longint;
+begin
+ for i := 0 to Comp.MsgCount -1 do
+ AdjustMessage (Comp.Msg[i]);
+end;
+
+procedure TPSPreProcessor.Clear;
+begin
+ FDefineState.Clear;
+ FDefines.Clear;
+ FCurrentDefines.Clear;
+ FCurrentLineInfo.Clear;
+ FMainFile := '';
+end;
+
+constructor TPSPreProcessor.Create;
+begin
+ inherited Create;
+ FDefines := TStringList.Create;
+ FCurrentLineInfo := TPSLineInfoList.Create;
+ FCurrentDefines := TStringList.Create;
+ FDefines.Duplicates := dupIgnore;
+ FCurrentDefines.Duplicates := dupIgnore;
+ FDefineState := TPSDefineStates.Create;
+ FMaxLevel := 20;
+
+ doAddStdPredefines;
+end;
+
+destructor TPSPreProcessor.Destroy;
+begin
+ FDefineState.Free;
+ FCurrentDefines.Free;
+ FDefines.Free;
+ FCurrentLineInfo.Free;
+ inherited Destroy;
+end;
+
+procedure TPSPreProcessor.doAddStdPredefines;
+begin
+ //--- 20050708_jgv
+ FCurrentDefines.Add (Format ('VER%d', [PSCurrentBuildNo]));
+ {$IFDEF CPU386 }
+ FCurrentDefines.Add ('CPU386');
+ {$ENDIF }
+ {$IFDEF MSWINDOWS }
+ FCurrentDefines.Add ('MSWINDOWS');
+ FCurrentDefines.Add ('WIN32');
+ {$ENDIF }
+ {$IFDEF LINUX }
+ FCurrentDefines.Add ('LINUX');
+ {$ENDIF }
+end;
+
+procedure TPSPreProcessor.IntPreProcess(Level: Integer; const OrgFileName: tbtstring; FileName: tbtstring; Dest: TStream);
+var
+ Parser: TPSPascalPreProcessorParser;
+ dta: tbtstring;
+ item: TPSLineInfo;
+ s, name: tbtstring;
+ current, i: Longint;
+ ds: TPSDefineState;
+ AppContinue: Boolean;
+begin
+ if Level > MaxLevel then raise EPSPreProcessor.CreateFmt(RPS_TooManyNestedInclude, [FileName, OrgFileName]);
+ Parser := TPSPascalPreProcessorParser.Create;
+ try
+ Parser.OnNewLine := ParserNewLine;
+ if FileName = MainFileName then
+ begin
+ dta := MainFile;
+ end else
+ if (@OnNeedFile = nil) or (not OnNeedFile(Self, OrgFileName, FileName, dta)) then
+ raise EPSPreProcessor.CreateFmt(RPS_IncludeNotFound, [FileName, OrgFileName]);
+ Item := FCurrentLineInfo.Add;
+ current := FCurrentLineInfo.Count -1;
+ FCurrentLineInfo.Current := current;
+ Item.FStartPos := Dest.Position;
+ Item.FFileName := FileName;
+ Parser.SetText(dta);
+ while Parser.TokenId <> ptEOF do
+ begin
+ s := Parser.Token;
+ if Parser.TokenId = ptDefine then
+ begin
+ Delete(s,1,2); // delete the {$
+ Delete(s,length(s), 1); // delete the }
+
+ //-- 20050707_jgv trim right
+ i := length (s);
+ while (i > 0) and (s[i] = ' ') do begin
+ Delete (s, i, 1);
+ Dec (i);
+ end;
+ //-- end_jgv
+
+ if pos(tbtChar(' '), s) = 0 then
+ begin
+ name := uppercase(s);
+ s := '';
+ end else
+ begin
+ Name := uppercase(copy(s,1,pos(' ', s)-1));
+ Delete(s, 1, pos(' ', s));
+ end;
+
+ //-- 20050707_jgv - ask the application
+ AppContinue := True;
+ If @OnProcessDirective <> Nil then OnProcessDirective (Self, Parser, FDefineState.DoWrite, name, s, AppContinue);
+
+ If AppContinue then
+ //-- end jgv
+
+ if (Name = 'I') or (Name = 'INCLUDE') then
+ begin
+ if FDefineState.DoWrite then
+ begin
+ FAddedPosition := 0;
+ IntPreProcess(Level +1, FileName, s, Dest);
+ FCurrentLineInfo.Current := current;
+ FAddedPosition := Cardinal(Dest.Position) - Item.StartPos - Parser.Pos;
+ end;
+ end else if (Name = 'DEFINE') then
+ begin
+ if FDefineState.DoWrite then
+ begin
+ if pos(' ', s) <> 0 then raise EPSPreProcessor.CreateFmt(RPS_DefineTooManyParameters, [Parser.Row, Parser.Col]);
+ FCurrentDefines.Add(Uppercase(S));
+ end;
+ end else if (Name = 'UNDEF') then
+ begin
+ if FDefineState.DoWrite then
+ begin
+ if pos(' ', s) <> 0 then raise EPSPreProcessor.CreateFmt(RPS_DefineTooManyParameters, [Parser.Row, Parser.Col]);
+ i := FCurrentDefines.IndexOf(Uppercase(s));
+ if i <> -1 then
+ FCurrentDefines.Delete(i);
+ end;
+ end else if (Name = 'IFDEF') then
+ begin
+ if pos(' ', s) <> 0 then raise EPSPreProcessor.CreateFmt(RPS_DefineTooManyParameters, [Parser.Row, Parser.Col]);
+ //JeromeWelsh - nesting fix
+ FDefineState.Add.DoWrite := (FCurrentDefines.IndexOf(Uppercase(s)) <> -1)
+ and FDefineState.DoWrite;
+ end else if (Name = 'IFNDEF') then
+ begin
+ if pos(' ', s) <> 0 then raise EPSPreProcessor.CreateFmt(RPS_DefineTooManyParameters, [Parser.Row, Parser.Col]);
+ //JeromeWelsh - nesting fix
+ FDefineState.Add.DoWrite := (FCurrentDefines.IndexOf(Uppercase(s)) = -1)
+ and FDefineState.DoWrite;
+ end else if (Name = 'ENDIF') then
+ begin
+ //- jgv remove - borland use it (sysutils.pas)
+ //- if s <> '' then raise EPSPreProcessor.CreateFmt(RPS_DefineTooManyParameters, [Parser.Row, Parser.Col]);
+ if FDefineState.Count = 0 then
+ raise EPSPreProcessor.CreateFmt(RPS_NoIfdefForEndif, [Parser.Row, Parser.Col]);
+ FDefineState.Delete(FDefineState.Count -1); // remove define from list
+ end else if (Name = 'ELSE') then
+ begin
+ if s<> '' then raise EPSPreProcessor.CreateFmt(RPS_DefineTooManyParameters, [Parser.Row, Parser.Col]);
+ if FDefineState.Count = 0 then
+ raise EPSPreProcessor.CreateFmt(RPS_NoIfdefForElse, [Parser.Row, Parser.Col]);
+ ds := FDefineState[FDefineState.Count -1];
+ if ds.InElse then
+ raise EPSPreProcessor.CreateFmt(RPS_ElseTwice, [Parser.Row, Parser.Col]);
+ ds.FInElse := True;
+ //JeromeWelsh - nesting fix
+ ds.DoWrite := not ds.DoWrite and FDefineState.DoPrevWrite;
+ end
+
+ //-- 20050710_jgv custom application error process
+ else begin
+ If @OnProcessUnknowDirective <> Nil then begin
+ OnProcessUnknowDirective (Self, Parser, FDefineState.DoWrite, name, s, AppContinue);
+ end;
+ If AppContinue then
+ //-- end jgv
+
+ raise EPSPreProcessor.CreateFmt(RPS_UnknownCompilerDirective, [Parser.Row, Parser.Col]);
+ end;
+ end;
+
+ if (not FDefineState.DoWrite) or (Parser.TokenId = ptDefine) then
+ begin
+ SetLength(s, Length(Parser.Token));
+ for i := length(s) downto 1 do
+ s[i] := #32; // space
+ end;
+ Dest.Write(s[1], length(s));
+ Parser.Next;
+ end;
+ Item.FEndPos := Dest.Position;
+ finally
+ Parser.Free;
+ end;
+end;
+
+procedure TPSPreProcessor.ParserNewLine(Sender: TPSPascalPreProcessorParser; Row, Col, Pos: Cardinal);
+begin
+ if FCurrentLineInfo.Current >= FCurrentLineInfo.Count then exit; //errr ???
+ with FCurrentLineInfo.Items[FCurrentLineInfo.Current] do
+ begin
+ Pos := Pos + FAddedPosition;
+ FLineOffsets.Add(Pointer(Pos));
+ end;
+end;
+
+procedure TPSPreProcessor.PreProcess(const Filename: tbtstring; var Output: tbtstring);
+var
+ Stream: TMemoryStream;
+begin
+ FAddedPosition := 0;
+ FCurrentDefines.Assign(FDefines);
+ Stream := TMemoryStream.Create;
+ try
+ IntPreProcess(0, '', FileName, Stream);
+ Stream.Position := 0;
+ SetLength(Output, Stream.Size);
+ Stream.Read(Output[1], Length(Output));
+ finally
+ Stream.Free;
+ end;
+ if FDefineState.Count <> 0 then
+ raise EPSPreProcessor.Create(RPs_DefineNotClosed);
+end;
+
+{ TPSDefineStates }
+
+function TPSDefineStates.Add: TPSDefineState;
+begin
+ Result := TPSDefineState.Create;
+ FItems.Add(Result);
+end;
+
+procedure TPSDefineStates.Clear;
+var
+ i: Longint;
+begin
+ for i := Longint(FItems.Count) -1 downto 0 do
+ TPSDefineState(FItems[i]).Free;
+ FItems.Clear;
+end;
+
+constructor TPSDefineStates.Create;
+begin
+ inherited Create;
+ FItems := TIfList.Create;
+end;
+
+procedure TPSDefineStates.Delete(I: Integer);
+begin
+ TPSDefineState(FItems[i]).Free;
+ FItems.Delete(i);
+end;
+
+destructor TPSDefineStates.Destroy;
+var
+ i: Longint;
+begin
+ for i := Longint(FItems.Count) -1 downto 0 do
+ TPSDefineState(FItems[i]).Free;
+ FItems.Free;
+ inherited Destroy;
+end;
+
+function TPSDefineStates.GetCount: Longint;
+begin
+ Result := FItems.Count;
+end;
+
+function TPSDefineStates.GetItem(I: Integer): TPSDefineState;
+begin
+ Result := FItems[i];
+end;
+
+function TPSDefineStates.GetWrite: Boolean;
+begin
+ if FItems.Count = 0 then
+ result := true
+ else Result := TPSDefineState(FItems[FItems.Count -1]).DoWrite;
+end;
+
+//JeromeWelsh - nesting fix
+function TPSDefineStates.GetPrevWrite: Boolean;
+begin
+ if FItems.Count < 2 then
+ result := true
+ else Result := TPSDefineState(FItems[FItems.Count -2]).DoWrite;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_DB.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_DB.pas
new file mode 100644
index 0000000..3c2fb80
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_DB.pas
@@ -0,0 +1,2094 @@
+{runtime DB support}
+Unit uPSR_DB;
+{$I PascalScript.inc}
+Interface
+Uses uPSRuntime, uPSUtils, SysUtils;
+
+procedure RIRegisterTDATASET(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTPARAMS(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTPARAM(Cl: TPSRuntimeClassImporter);
+
+{$IFNDEF FPC}
+procedure RIRegisterTGUIDFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTVARIANTFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTREFERENCEFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTDATASETFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTARRAYFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTADTFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTOBJECTFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTWIDESTRINGFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFIELDLIST(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFIELDDEFLIST(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFLATLIST(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTDEFCOLLECTION(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTNAMEDITEM(Cl: TPSRuntimeClassImporter);
+
+{$IFDEF DELPHI6UP}
+procedure RIRegisterTFMTBCDFIELD(Cl: TPSRuntimeClassImporter);
+{$ENDIF}
+procedure RIRegisterTBCDFIELD(Cl: TPSRuntimeClassImporter);
+
+{$ENDIF}
+
+procedure RIRegisterTGRAPHICFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTMEMOFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTBLOBFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTVARBYTESFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTBYTESFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTBINARYFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTTIMEFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTDATEFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTDATETIMEFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTBOOLEANFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCURRENCYFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFLOATFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTAUTOINCFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTWORDFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTLARGEINTFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTSMALLINTFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTINTEGERFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTNUMERICFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTSTRINGFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFIELD(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTLOOKUPLIST(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFIELDS(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTINDEXDEFS(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTINDEXDEF(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFIELDDEFS(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFIELDDEF(Cl: TPSRuntimeClassImporter);
+procedure RIRegister_DB(CL: TPSRuntimeClassImporter);
+
+implementation
+Uses DB, {$IFDEF DELPHI6UP}{$IFNDEF FPC}FMTBcd, MaskUtils,{$ENDIF}{$ENDIF}Classes;
+
+procedure TDATASETONPOSTERROR_W(Self: TDATASET; const T: TDATASETERROREVENT);
+begin Self.ONPOSTERROR := T; end;
+
+procedure TDATASETONPOSTERROR_R(Self: TDATASET; var T: TDATASETERROREVENT);
+begin T := Self.ONPOSTERROR; end;
+
+procedure TDATASETONNEWRECORD_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.ONNEWRECORD := T; end;
+
+procedure TDATASETONNEWRECORD_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.ONNEWRECORD; end;
+
+procedure TDATASETONFILTERRECORD_W(Self: TDATASET; const T: TFILTERRECORDEVENT);
+begin Self.ONFILTERRECORD := T; end;
+
+procedure TDATASETONFILTERRECORD_R(Self: TDATASET; var T: TFILTERRECORDEVENT);
+begin T := Self.ONFILTERRECORD; end;
+
+procedure TDATASETONEDITERROR_W(Self: TDATASET; const T: TDATASETERROREVENT);
+begin Self.ONEDITERROR := T; end;
+
+procedure TDATASETONEDITERROR_R(Self: TDATASET; var T: TDATASETERROREVENT);
+begin T := Self.ONEDITERROR; end;
+
+procedure TDATASETONDELETEERROR_W(Self: TDATASET; const T: TDATASETERROREVENT);
+begin Self.ONDELETEERROR := T; end;
+
+procedure TDATASETONDELETEERROR_R(Self: TDATASET; var T: TDATASETERROREVENT);
+begin T := Self.ONDELETEERROR; end;
+
+procedure TDATASETONCALCFIELDS_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.ONCALCFIELDS := T; end;
+
+procedure TDATASETONCALCFIELDS_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.ONCALCFIELDS; end;
+
+{$IFNDEF FPC}
+procedure TDATASETAFTERREFRESH_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.AFTERREFRESH := T; end;
+
+procedure TDATASETAFTERREFRESH_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.AFTERREFRESH; end;
+
+procedure TDATASETBEFOREREFRESH_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.BEFOREREFRESH := T; end;
+
+procedure TDATASETBEFOREREFRESH_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.BEFOREREFRESH; end;
+
+{$ENDIF}
+
+procedure TDATASETAFTERSCROLL_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.AFTERSCROLL := T; end;
+
+procedure TDATASETAFTERSCROLL_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.AFTERSCROLL; end;
+
+procedure TDATASETBEFORESCROLL_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.BEFORESCROLL := T; end;
+
+procedure TDATASETBEFORESCROLL_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.BEFORESCROLL; end;
+
+procedure TDATASETAFTERDELETE_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.AFTERDELETE := T; end;
+
+procedure TDATASETAFTERDELETE_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.AFTERDELETE; end;
+
+procedure TDATASETBEFOREDELETE_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.BEFOREDELETE := T; end;
+
+procedure TDATASETBEFOREDELETE_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.BEFOREDELETE; end;
+
+procedure TDATASETAFTERCANCEL_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.AFTERCANCEL := T; end;
+
+procedure TDATASETAFTERCANCEL_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.AFTERCANCEL; end;
+
+procedure TDATASETBEFORECANCEL_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.BEFORECANCEL := T; end;
+
+procedure TDATASETBEFORECANCEL_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.BEFORECANCEL; end;
+
+procedure TDATASETAFTERPOST_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.AFTERPOST := T; end;
+
+procedure TDATASETAFTERPOST_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.AFTERPOST; end;
+
+procedure TDATASETBEFOREPOST_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.BEFOREPOST := T; end;
+
+procedure TDATASETBEFOREPOST_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.BEFOREPOST; end;
+
+procedure TDATASETAFTEREDIT_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.AFTEREDIT := T; end;
+
+procedure TDATASETAFTEREDIT_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.AFTEREDIT; end;
+
+procedure TDATASETBEFOREEDIT_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.BEFOREEDIT := T; end;
+
+procedure TDATASETBEFOREEDIT_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.BEFOREEDIT; end;
+
+procedure TDATASETAFTERINSERT_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.AFTERINSERT := T; end;
+
+procedure TDATASETAFTERINSERT_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.AFTERINSERT; end;
+
+procedure TDATASETBEFOREINSERT_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.BEFOREINSERT := T; end;
+
+procedure TDATASETBEFOREINSERT_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.BEFOREINSERT; end;
+
+procedure TDATASETAFTERCLOSE_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.AFTERCLOSE := T; end;
+
+procedure TDATASETAFTERCLOSE_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.AFTERCLOSE; end;
+
+procedure TDATASETBEFORECLOSE_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.BEFORECLOSE := T; end;
+
+procedure TDATASETBEFORECLOSE_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.BEFORECLOSE; end;
+
+procedure TDATASETAFTEROPEN_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.AFTEROPEN := T; end;
+
+procedure TDATASETAFTEROPEN_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.AFTEROPEN; end;
+
+procedure TDATASETBEFOREOPEN_W(Self: TDATASET; const T: TDATASETNOTIFYEVENT);
+begin Self.BEFOREOPEN := T; end;
+
+procedure TDATASETBEFOREOPEN_R(Self: TDATASET; var T: TDATASETNOTIFYEVENT);
+begin T := Self.BEFOREOPEN; end;
+
+procedure TDATASETAUTOCALCFIELDS_W(Self: TDATASET; const T: BOOLEAN);
+begin Self.AUTOCALCFIELDS := T; end;
+
+procedure TDATASETAUTOCALCFIELDS_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.AUTOCALCFIELDS; end;
+
+procedure TDATASETACTIVE_W(Self: TDATASET; const T: BOOLEAN);
+begin Self.ACTIVE := T; end;
+
+procedure TDATASETACTIVE_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.ACTIVE; end;
+
+procedure TDATASETFILTEROPTIONS_W(Self: TDATASET; const T: TFILTEROPTIONS);
+begin Self.FILTEROPTIONS := T; end;
+
+procedure TDATASETFILTEROPTIONS_R(Self: TDATASET; var T: TFILTEROPTIONS);
+begin T := Self.FILTEROPTIONS; end;
+
+procedure TDATASETFILTERED_W(Self: TDATASET; const T: BOOLEAN);
+begin Self.FILTERED := T; end;
+
+procedure TDATASETFILTERED_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.FILTERED; end;
+
+procedure TDATASETFILTER_W(Self: TDATASET; const T: String);
+begin Self.FILTER := T; end;
+
+procedure TDATASETFILTER_R(Self: TDATASET; var T: String);
+begin T := Self.FILTER; end;
+
+procedure TDATASETSTATE_R(Self: TDATASET; var T: TDATASETSTATE);
+begin T := Self.STATE; end;
+
+{$IFNDEF FPC}
+procedure TDATASETSPARSEARRAYS_W(Self: TDATASET; const T: BOOLEAN);
+begin Self.SPARSEARRAYS := T; end;
+
+procedure TDATASETSPARSEARRAYS_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.SPARSEARRAYS; end;
+{$ENDIF}
+
+procedure TDATASETRECORDSIZE_R(Self: TDATASET; var T: WORD);
+begin T := Self.RECORDSIZE; end;
+
+procedure TDATASETRECNO_W(Self: TDATASET; const T: INTEGER);
+begin Self.RECNO := T; end;
+
+procedure TDATASETRECNO_R(Self: TDATASET; var T: INTEGER);
+begin T := Self.RECNO; end;
+
+procedure TDATASETRECORDCOUNT_R(Self: TDATASET; var T: INTEGER);
+begin T := Self.RECORDCOUNT; end;
+
+{$IFNDEF FPC}
+procedure TDATASETOBJECTVIEW_W(Self: TDATASET; const T: BOOLEAN);
+begin Self.OBJECTVIEW := T; end;
+
+procedure TDATASETOBJECTVIEW_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.OBJECTVIEW; end;
+{$ENDIF}
+
+procedure TDATASETMODIFIED_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.MODIFIED; end;
+
+{$IFDEF DELPHI6UP}
+procedure TDATASETISUNIDIRECTIONAL_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.ISUNIDIRECTIONAL; end;
+{$ENDIF}
+
+procedure TDATASETFOUND_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.FOUND; end;
+
+procedure TDATASETFIELDVALUES_W(Self: TDATASET; const T: VARIANT; const t1: String);
+begin Self.FIELDVALUES[t1] := T; end;
+
+procedure TDATASETFIELDVALUES_R(Self: TDATASET; var T: VARIANT; const t1: String);
+begin T := Self.FIELDVALUES[t1]; end;
+
+procedure TDATASETFIELDS_R(Self: TDATASET; var T: TFIELDS);
+begin T := Self.FIELDS; end;
+
+{$IFNDEF FPC}
+
+procedure TDATASETFIELDLIST_R(Self: TDATASET; var T: TFIELDLIST);
+begin T := Self.FIELDLIST; end;
+
+
+procedure TDATASETFIELDDEFLIST_R(Self: TDATASET; var T: TFIELDDEFLIST);
+begin T := Self.FIELDDEFLIST; end;
+
+procedure TDATASETFIELDDEFS_W(Self: TDATASET; const T: TFIELDDEFS);
+begin Self.FIELDDEFS := T; end;
+
+procedure TDATASETFIELDDEFS_R(Self: TDATASET; var T: TFIELDDEFS);
+begin T := Self.FIELDDEFS; end;
+
+procedure TDATASETBLOCKREADSIZE_W(Self: TDATASET; const T: INTEGER);
+begin Self.BLOCKREADSIZE := T; end;
+
+procedure TDATASETBLOCKREADSIZE_R(Self: TDATASET; var T: INTEGER);
+begin T := Self.BLOCKREADSIZE; end;
+
+procedure TDATASETDESIGNER_R(Self: TDATASET; var T: TDATASETDESIGNER);
+begin T := Self.DESIGNER; end;
+
+
+procedure TDATASETDATASETFIELD_W(Self: TDATASET; const T: TDATASETFIELD);
+begin Self.DATASETFIELD := T; end;
+
+
+
+procedure TDATASETDATASETFIELD_R(Self: TDATASET; var T: TDATASETFIELD);
+begin T := Self.DATASETFIELD; end;
+
+
+procedure TDATASETAGGFIELDS_R(Self: TDATASET; var T: TFIELDS);
+begin T := Self.AGGFIELDS; end;
+
+
+
+{$ENDIF}
+
+procedure TDATASETFIELDCOUNT_R(Self: TDATASET; var T: INTEGER);
+begin T := Self.FIELDCOUNT; end;
+
+
+procedure TDATASETEOF_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.EOF; end;
+
+procedure TDATASETDEFAULTFIELDS_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.DEFAULTFIELDS; end;
+
+procedure TDATASETDATASOURCE_R(Self: TDATASET; var T: TDATASOURCE);
+begin T := Self.DATASOURCE; end;
+
+
+
+procedure TDATASETCANMODIFY_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.CANMODIFY; end;
+
+//procedure TDATASETBOOKMARK_W(Self: TDATASET; const T: TBOOKMARKSTR);
+//begin Self.BOOKMARK := T; end;
+
+//procedure TDATASETBOOKMARK_R(Self: TDATASET; var T: TBOOKMARKSTR);
+//begin T := Self.BOOKMARK; end;
+
+procedure TDATASETBOF_R(Self: TDATASET; var T: BOOLEAN);
+begin T := Self.BOF; end;
+
+procedure TPARAMSPARAMVALUES_W(Self: TPARAMS; const T: VARIANT; const t1: String);
+begin Self.PARAMVALUES[t1] := T; end;
+
+procedure TPARAMSPARAMVALUES_R(Self: TPARAMS; var T: VARIANT; const t1: String);
+begin T := Self.PARAMVALUES[t1]; end;
+
+procedure TPARAMSITEMS_W(Self: TPARAMS; const T: TPARAM; const t1: INTEGER);
+begin Self.ITEMS[t1] := T; end;
+
+procedure TPARAMSITEMS_R(Self: TPARAMS; var T: TPARAM; const t1: INTEGER);
+begin T := Self.ITEMS[t1]; end;
+
+procedure TPARAMVALUE_W(Self: TPARAM; const T: VARIANT);
+begin Self.VALUE := T; end;
+
+procedure TPARAMVALUE_R(Self: TPARAM; var T: VARIANT);
+begin T := Self.VALUE; end;
+
+
+{$IFDEF DELPHI6UP}
+procedure TPARAMSIZE_W(Self: TPARAM; const T: INTEGER);
+begin Self.SIZE := T; end;
+
+procedure TPARAMSIZE_R(Self: TPARAM; var T: INTEGER);
+begin T := Self.SIZE; end;
+{$ENDIF}
+
+procedure TPARAMPARAMTYPE_W(Self: TPARAM; const T: TPARAMTYPE);
+begin Self.PARAMTYPE := T; end;
+
+procedure TPARAMPARAMTYPE_R(Self: TPARAM; var T: TPARAMTYPE);
+begin T := Self.PARAMTYPE; end;
+
+procedure TPARAMNAME_W(Self: TPARAM; const T: String);
+begin Self.NAME := T; end;
+
+procedure TPARAMNAME_R(Self: TPARAM; var T: String);
+begin T := Self.NAME; end;
+
+{$IFDEF DELPHI6UP}
+procedure TPARAMNUMERICSCALE_W(Self: TPARAM; const T: INTEGER);
+begin Self.NUMERICSCALE := T; end;
+
+procedure TPARAMNUMERICSCALE_R(Self: TPARAM; var T: INTEGER);
+begin T := Self.NUMERICSCALE; end;
+{$ENDIF}
+{$IFDEF DELPHI6UP}
+
+procedure TPARAMPRECISION_W(Self: TPARAM; const T: INTEGER);
+begin Self.PRECISION := T; end;
+
+procedure TPARAMPRECISION_R(Self: TPARAM; var T: INTEGER);
+begin T := Self.PRECISION; end;
+{$ENDIF}
+procedure TPARAMDATATYPE_W(Self: TPARAM; const T: TFIELDTYPE);
+begin Self.DATATYPE := T; end;
+
+procedure TPARAMDATATYPE_R(Self: TPARAM; var T: TFIELDTYPE);
+begin T := Self.DATATYPE; end;
+
+procedure TPARAMTEXT_W(Self: TPARAM; const T: String);
+begin Self.TEXT := T; end;
+
+procedure TPARAMTEXT_R(Self: TPARAM; var T: String);
+begin T := Self.TEXT; end;
+
+procedure TPARAMNATIVESTR_W(Self: TPARAM; const T: String);
+begin Self.NATIVESTR := T; end;
+
+procedure TPARAMNATIVESTR_R(Self: TPARAM; var T: String);
+begin T := Self.NATIVESTR; end;
+
+procedure TPARAMISNULL_R(Self: TPARAM; var T: BOOLEAN);
+begin T := Self.ISNULL; end;
+
+procedure TPARAMBOUND_W(Self: TPARAM; const T: BOOLEAN);
+begin Self.BOUND := T; end;
+
+procedure TPARAMBOUND_R(Self: TPARAM; var T: BOOLEAN);
+begin T := Self.BOUND; end;
+
+procedure TPARAMASWORD_W(Self: TPARAM; const T: LONGINT);
+begin Self.ASWORD := T; end;
+
+procedure TPARAMASWORD_R(Self: TPARAM; var T: LONGINT);
+begin T := Self.ASWORD; end;
+
+procedure TPARAMASTIME_W(Self: TPARAM; const T: TDATETIME);
+begin Self.ASTIME := T; end;
+
+procedure TPARAMASTIME_R(Self: TPARAM; var T: TDATETIME);
+begin T := Self.ASTIME; end;
+
+procedure TPARAMASSTRING_W(Self: TPARAM; const T: String);
+begin Self.ASSTRING := T; end;
+
+procedure TPARAMASSTRING_R(Self: TPARAM; var T: String);
+begin T := Self.ASSTRING; end;
+
+procedure TPARAMASMEMO_W(Self: TPARAM; const T: String);
+begin Self.ASMEMO := T; end;
+
+procedure TPARAMASMEMO_R(Self: TPARAM; var T: String);
+begin T := Self.ASMEMO; end;
+
+procedure TPARAMASSMALLINT_W(Self: TPARAM; const T: LONGINT);
+begin Self.ASSMALLINT := T; end;
+
+procedure TPARAMASSMALLINT_R(Self: TPARAM; var T: LONGINT);
+begin T := Self.ASSMALLINT; end;
+
+procedure TPARAMASINTEGER_W(Self: TPARAM; const T: LONGINT);
+begin Self.ASINTEGER := T; end;
+
+procedure TPARAMASINTEGER_R(Self: TPARAM; var T: LONGINT);
+begin T := Self.ASINTEGER; end;
+
+procedure TPARAMASFLOAT_W(Self: TPARAM; const T: DOUBLE);
+begin Self.ASFLOAT := T; end;
+
+procedure TPARAMASFLOAT_R(Self: TPARAM; var T: DOUBLE);
+begin T := Self.ASFLOAT; end;
+
+procedure TPARAMASDATETIME_W(Self: TPARAM; const T: TDATETIME);
+begin Self.ASDATETIME := T; end;
+
+procedure TPARAMASDATETIME_R(Self: TPARAM; var T: TDATETIME);
+begin T := Self.ASDATETIME; end;
+
+procedure TPARAMASDATE_W(Self: TPARAM; const T: TDATETIME);
+begin Self.ASDATE := T; end;
+
+procedure TPARAMASDATE_R(Self: TPARAM; var T: TDATETIME);
+begin T := Self.ASDATE; end;
+
+procedure TPARAMASCURRENCY_W(Self: TPARAM; const T: CURRENCY);
+begin Self.ASCURRENCY := T; end;
+
+procedure TPARAMASCURRENCY_R(Self: TPARAM; var T: CURRENCY);
+begin T := Self.ASCURRENCY; end;
+
+procedure TPARAMASBOOLEAN_W(Self: TPARAM; const T: BOOLEAN);
+begin Self.ASBOOLEAN := T; end;
+
+procedure TPARAMASBOOLEAN_R(Self: TPARAM; var T: BOOLEAN);
+begin T := Self.ASBOOLEAN; end;
+
+procedure TPARAMASBLOB_W(Self: TPARAM; const T: TBLOBDATA);
+begin Self.ASBLOB := T; end;
+
+procedure TPARAMASBLOB_R(Self: TPARAM; var T: TBLOBDATA);
+begin T := Self.ASBLOB; end;
+
+{$IFNDEF FPC}
+
+{$IFDEF DELPHI6UP}
+procedure TPARAMASFMTBCD_W(Self: TPARAM; const T: TBCD);
+begin Self.ASFMTBCD := T; end;
+
+procedure TPARAMASFMTBCD_R(Self: TPARAM; var T: TBCD);
+begin T := Self.ASFMTBCD; end;
+{$ENDIF}
+procedure TPARAMASBCD_W(Self: TPARAM; const T: CURRENCY);
+begin Self.ASBCD := T; end;
+
+procedure TPARAMASBCD_R(Self: TPARAM; var T: CURRENCY);
+begin T := Self.ASBCD; end;
+
+procedure TREFERENCEFIELDREFERENCETABLENAME_W(Self: TREFERENCEFIELD; const T: String);
+begin Self.REFERENCETABLENAME := T; end;
+
+procedure TREFERENCEFIELDREFERENCETABLENAME_R(Self: TREFERENCEFIELD; var T: String);
+begin T := Self.REFERENCETABLENAME; end;
+
+
+procedure TDATASETFIELDINCLUDEOBJECTFIELD_W(Self: TDATASETFIELD; const T: BOOLEAN);
+begin Self.INCLUDEOBJECTFIELD := T; end;
+
+procedure TDATASETFIELDINCLUDEOBJECTFIELD_R(Self: TDATASETFIELD; var T: BOOLEAN);
+begin T := Self.INCLUDEOBJECTFIELD; end;
+
+procedure TDATASETFIELDNESTEDDATASET_R(Self: TDATASETFIELD; var T: TDATASET);
+begin T := Self.NESTEDDATASET; end;
+
+procedure TOBJECTFIELDOBJECTTYPE_W(Self: TOBJECTFIELD; const T: String);
+begin Self.OBJECTTYPE := T; end;
+
+procedure TOBJECTFIELDOBJECTTYPE_R(Self: TOBJECTFIELD; var T: String);
+begin T := Self.OBJECTTYPE; end;
+
+procedure TOBJECTFIELDUNNAMED_R(Self: TOBJECTFIELD; var T: BOOLEAN);
+begin T := Self.UNNAMED; end;
+
+procedure TOBJECTFIELDFIELDVALUES_W(Self: TOBJECTFIELD; const T: VARIANT; const t1: INTEGER);
+begin Self.FIELDVALUES[t1] := T; end;
+
+procedure TOBJECTFIELDFIELDVALUES_R(Self: TOBJECTFIELD; var T: VARIANT; const t1: INTEGER);
+begin T := Self.FIELDVALUES[t1]; end;
+
+procedure TOBJECTFIELDFIELDS_R(Self: TOBJECTFIELD; var T: TFIELDS);
+begin T := Self.FIELDS; end;
+
+procedure TOBJECTFIELDFIELDCOUNT_R(Self: TOBJECTFIELD; var T: INTEGER);
+begin T := Self.FIELDCOUNT; end;
+{$ENDIF}
+
+
+{$IFNDEF FPC}
+{$IFDEF DELPHI6UP}
+procedure TBLOBFIELDGRAPHICHEADER_W(Self: TBLOBFIELD; const T: BOOLEAN);
+begin Self.GRAPHICHEADER := T; end;
+
+procedure TBLOBFIELDGRAPHICHEADER_R(Self: TBLOBFIELD; var T: BOOLEAN);
+begin T := Self.GRAPHICHEADER; end;
+{$ENDIF}
+{$ENDIF}
+
+procedure TBLOBFIELDBLOBTYPE_W(Self: TBLOBFIELD; const T: TBLOBTYPE);
+begin Self.BLOBTYPE := T; end;
+
+procedure TBLOBFIELDBLOBTYPE_R(Self: TBLOBFIELD; var T: TBLOBTYPE);
+begin T := Self.BLOBTYPE; end;
+
+procedure TBLOBFIELDTRANSLITERATE_W(Self: TBLOBFIELD; const T: BOOLEAN);
+begin Self.TRANSLITERATE := T; end;
+
+procedure TBLOBFIELDTRANSLITERATE_R(Self: TBLOBFIELD; var T: BOOLEAN);
+begin T := Self.TRANSLITERATE; end;
+
+procedure TBLOBFIELDVALUE_W(Self: TBLOBFIELD; const T: String);
+{$IFDEF DELPHI2009UP}
+var
+ b: TBytes;
+begin
+ setLEngth(b, Length(T));
+ Move(T[1], b[0], Length(T));
+ self.Value := b;
+ {$ELSE}
+begin
+ Self.VALUE := T;
+ {$ENDIF}
+end;
+
+procedure TBLOBFIELDVALUE_R(Self: TBLOBFIELD; var T: String);
+begin
+{$IFDEF DELPHI2009UP}
+ SetLength(t, Length(SElf.Value));
+ Move(Self.Value[0], t[1], LEngth(T));
+{$ELSE}
+ T := Self.VALUE;
+{$ENDIF}
+end;
+
+procedure TBLOBFIELDMODIFIED_W(Self: TBLOBFIELD; const T: BOOLEAN);
+begin Self.MODIFIED := T; end;
+
+procedure TBLOBFIELDMODIFIED_R(Self: TBLOBFIELD; var T: BOOLEAN);
+begin T := Self.MODIFIED; end;
+
+procedure TBLOBFIELDBLOBSIZE_R(Self: TBLOBFIELD; var T: INTEGER);
+begin T := Self.BLOBSIZE; end;
+
+{$IFNDEF FPC}
+{$IFDEF DELPHI6UP}
+procedure TFMTBCDFIELDPRECISION_W(Self: TFMTBCDFIELD; const T: INTEGER);
+begin Self.PRECISION := T; end;
+
+procedure TFMTBCDFIELDPRECISION_R(Self: TFMTBCDFIELD; var T: INTEGER);
+begin T := Self.PRECISION; end;
+
+procedure TFMTBCDFIELDMINVALUE_W(Self: TFMTBCDFIELD; const T: String);
+begin Self.MINVALUE := T; end;
+
+procedure TFMTBCDFIELDMINVALUE_R(Self: TFMTBCDFIELD; var T: String);
+begin T := Self.MINVALUE; end;
+
+procedure TFMTBCDFIELDMAXVALUE_W(Self: TFMTBCDFIELD; const T: String);
+begin Self.MAXVALUE := T; end;
+
+procedure TFMTBCDFIELDMAXVALUE_R(Self: TFMTBCDFIELD; var T: String);
+begin T := Self.MAXVALUE; end;
+
+procedure TFMTBCDFIELDCURRENCY_W(Self: TFMTBCDFIELD; const T: BOOLEAN);
+begin Self.CURRENCY := T; end;
+
+procedure TFMTBCDFIELDCURRENCY_R(Self: TFMTBCDFIELD; var T: BOOLEAN);
+begin T := Self.CURRENCY; end;
+
+procedure TFMTBCDFIELDVALUE_W(Self: TFMTBCDFIELD; const T: TBCD);
+begin Self.VALUE := T; end;
+
+procedure TFMTBCDFIELDVALUE_R(Self: TFMTBCDFIELD; var T: TBCD);
+begin T := Self.VALUE; end;
+{$ENDIF}
+
+procedure TBCDFIELDPRECISION_W(Self: TBCDFIELD; const T: INTEGER);
+begin Self.PRECISION := T; end;
+
+procedure TBCDFIELDPRECISION_R(Self: TBCDFIELD; var T: INTEGER);
+begin T := Self.PRECISION; end;
+
+procedure TBCDFIELDMINVALUE_W(Self: TBCDFIELD; const T: CURRENCY);
+begin Self.MINVALUE := T; end;
+
+procedure TBCDFIELDMINVALUE_R(Self: TBCDFIELD; var T: CURRENCY);
+begin T := Self.MINVALUE; end;
+
+procedure TBCDFIELDMAXVALUE_W(Self: TBCDFIELD; const T: CURRENCY);
+begin Self.MAXVALUE := T; end;
+
+procedure TBCDFIELDMAXVALUE_R(Self: TBCDFIELD; var T: CURRENCY);
+begin T := Self.MAXVALUE; end;
+
+procedure TBCDFIELDCURRENCY_W(Self: TBCDFIELD; const T: BOOLEAN);
+begin Self.CURRENCY := T; end;
+
+procedure TBCDFIELDCURRENCY_R(Self: TBCDFIELD; var T: BOOLEAN);
+begin T := Self.CURRENCY; end;
+
+procedure TBCDFIELDVALUE_W(Self: TBCDFIELD; const T: CURRENCY);
+begin Self.VALUE := T; end;
+
+procedure TBCDFIELDVALUE_R(Self: TBCDFIELD; var T: CURRENCY);
+begin T := Self.VALUE; end;
+{$ENDIF}
+
+
+procedure TDATETIMEFIELDDISPLAYFORMAT_W(Self: TDATETIMEFIELD; const T: String);
+begin Self.DISPLAYFORMAT := T; end;
+
+procedure TDATETIMEFIELDDISPLAYFORMAT_R(Self: TDATETIMEFIELD; var T: String);
+begin T := Self.DISPLAYFORMAT; end;
+
+procedure TDATETIMEFIELDVALUE_W(Self: TDATETIMEFIELD; const T: TDATETIME);
+begin Self.VALUE := T; end;
+
+procedure TDATETIMEFIELDVALUE_R(Self: TDATETIMEFIELD; var T: TDATETIME);
+begin T := Self.VALUE; end;
+
+procedure TBOOLEANFIELDDISPLAYVALUES_W(Self: TBOOLEANFIELD; const T: String);
+begin Self.DISPLAYVALUES := T; end;
+
+procedure TBOOLEANFIELDDISPLAYVALUES_R(Self: TBOOLEANFIELD; var T: String);
+begin T := Self.DISPLAYVALUES; end;
+
+procedure TBOOLEANFIELDVALUE_W(Self: TBOOLEANFIELD; const T: BOOLEAN);
+begin Self.VALUE := T; end;
+
+procedure TBOOLEANFIELDVALUE_R(Self: TBOOLEANFIELD; var T: BOOLEAN);
+begin T := Self.VALUE; end;
+
+procedure TFLOATFIELDPRECISION_W(Self: TFLOATFIELD; const T: INTEGER);
+begin Self.PRECISION := T; end;
+
+procedure TFLOATFIELDPRECISION_R(Self: TFLOATFIELD; var T: INTEGER);
+begin T := Self.PRECISION; end;
+
+procedure TFLOATFIELDMINVALUE_W(Self: TFLOATFIELD; const T: DOUBLE);
+begin Self.MINVALUE := T; end;
+
+procedure TFLOATFIELDMINVALUE_R(Self: TFLOATFIELD; var T: DOUBLE);
+begin T := Self.MINVALUE; end;
+
+procedure TFLOATFIELDMAXVALUE_W(Self: TFLOATFIELD; const T: DOUBLE);
+begin Self.MAXVALUE := T; end;
+
+procedure TFLOATFIELDMAXVALUE_R(Self: TFLOATFIELD; var T: DOUBLE);
+begin T := Self.MAXVALUE; end;
+
+{$IFNDEF FPC}
+procedure TFLOATFIELDCURRENCY_W(Self: TFLOATFIELD; const T: BOOLEAN);
+begin Self.CURRENCY := T; end;
+
+procedure TFLOATFIELDCURRENCY_R(Self: TFLOATFIELD; var T: BOOLEAN);
+begin T := Self.CURRENCY; end;
+{$ENDIF}
+
+procedure TFLOATFIELDVALUE_W(Self: TFLOATFIELD; const T: DOUBLE);
+begin Self.VALUE := T; end;
+
+procedure TFLOATFIELDVALUE_R(Self: TFLOATFIELD; var T: DOUBLE);
+begin T := Self.VALUE; end;
+
+procedure TLARGEINTFIELDMINVALUE_W(Self: TLARGEINTFIELD; const T: LARGEINT);
+begin Self.MINVALUE := T; end;
+
+procedure TLARGEINTFIELDMINVALUE_R(Self: TLARGEINTFIELD; var T: LARGEINT);
+begin T := Self.MINVALUE; end;
+
+procedure TLARGEINTFIELDMAXVALUE_W(Self: TLARGEINTFIELD; const T: LARGEINT);
+begin Self.MAXVALUE := T; end;
+
+procedure TLARGEINTFIELDMAXVALUE_R(Self: TLARGEINTFIELD; var T: LARGEINT);
+begin T := Self.MAXVALUE; end;
+
+procedure TLARGEINTFIELDVALUE_W(Self: TLARGEINTFIELD; const T: LARGEINT);
+begin Self.VALUE := T; end;
+
+procedure TLARGEINTFIELDVALUE_R(Self: TLARGEINTFIELD; var T: LARGEINT);
+begin T := Self.VALUE; end;
+
+procedure TLARGEINTFIELDASLARGEINT_W(Self: TLARGEINTFIELD; const T: LARGEINT);
+begin Self.ASLARGEINT := T; end;
+
+procedure TLARGEINTFIELDASLARGEINT_R(Self: TLARGEINTFIELD; var T: LARGEINT);
+begin T := Self.ASLARGEINT; end;
+
+procedure TINTEGERFIELDMINVALUE_W(Self: TINTEGERFIELD; const T: LONGINT);
+begin Self.MINVALUE := T; end;
+
+procedure TINTEGERFIELDMINVALUE_R(Self: TINTEGERFIELD; var T: LONGINT);
+begin T := Self.MINVALUE; end;
+
+procedure TINTEGERFIELDMAXVALUE_W(Self: TINTEGERFIELD; const T: LONGINT);
+begin Self.MAXVALUE := T; end;
+
+procedure TINTEGERFIELDMAXVALUE_R(Self: TINTEGERFIELD; var T: LONGINT);
+begin T := Self.MAXVALUE; end;
+
+procedure TINTEGERFIELDVALUE_W(Self: TINTEGERFIELD; const T: LONGINT);
+begin Self.VALUE := T; end;
+
+procedure TINTEGERFIELDVALUE_R(Self: TINTEGERFIELD; var T: LONGINT);
+begin T := Self.VALUE; end;
+
+procedure TNUMERICFIELDEDITFORMAT_W(Self: TNUMERICFIELD; const T: String);
+begin Self.EDITFORMAT := T; end;
+
+procedure TNUMERICFIELDEDITFORMAT_R(Self: TNUMERICFIELD; var T: String);
+begin T := Self.EDITFORMAT; end;
+
+procedure TNUMERICFIELDDISPLAYFORMAT_W(Self: TNUMERICFIELD; const T: String);
+begin Self.DISPLAYFORMAT := T; end;
+
+procedure TNUMERICFIELDDISPLAYFORMAT_R(Self: TNUMERICFIELD; var T: String);
+begin T := Self.DISPLAYFORMAT; end;
+
+{$IFNDEF FPC}
+procedure TWIDESTRINGFIELDVALUE_W(Self: TWIDESTRINGFIELD; const T: WIDESTRING);
+begin Self.VALUE := T; end;
+
+procedure TWIDESTRINGFIELDVALUE_R(Self: TWIDESTRINGFIELD; var T: WIDESTRING);
+begin T := Self.VALUE; end;
+
+procedure TSTRINGFIELDTRANSLITERATE_W(Self: TSTRINGFIELD; const T: BOOLEAN);
+begin Self.TRANSLITERATE := T; end;
+
+procedure TSTRINGFIELDTRANSLITERATE_R(Self: TSTRINGFIELD; var T: BOOLEAN);
+begin T := Self.TRANSLITERATE; end;
+
+procedure TSTRINGFIELDFIXEDCHAR_W(Self: TSTRINGFIELD; const T: BOOLEAN);
+begin Self.FIXEDCHAR := T; end;
+
+procedure TSTRINGFIELDFIXEDCHAR_R(Self: TSTRINGFIELD; var T: BOOLEAN);
+begin T := Self.FIXEDCHAR; end;
+{$ENDIF}
+
+
+procedure TSTRINGFIELDVALUE_W(Self: TSTRINGFIELD; const T: String);
+begin Self.VALUE := T; end;
+
+procedure TSTRINGFIELDVALUE_R(Self: TSTRINGFIELD; var T: String);
+begin T := Self.VALUE; end;
+
+procedure TFIELDONVALIDATE_W(Self: TFIELD; const T: TFIELDNOTIFYEVENT);
+begin Self.ONVALIDATE := T; end;
+
+procedure TFIELDONVALIDATE_R(Self: TFIELD; var T: TFIELDNOTIFYEVENT);
+begin T := Self.ONVALIDATE; end;
+
+procedure TFIELDONSETTEXT_W(Self: TFIELD; const T: TFIELDSETTEXTEVENT);
+begin Self.ONSETTEXT := T; end;
+
+procedure TFIELDONSETTEXT_R(Self: TFIELD; var T: TFIELDSETTEXTEVENT);
+begin T := Self.ONSETTEXT; end;
+
+procedure TFIELDONGETTEXT_W(Self: TFIELD; const T: TFIELDGETTEXTEVENT);
+begin Self.ONGETTEXT := T; end;
+
+procedure TFIELDONGETTEXT_R(Self: TFIELD; var T: TFIELDGETTEXTEVENT);
+begin T := Self.ONGETTEXT; end;
+
+procedure TFIELDONCHANGE_W(Self: TFIELD; const T: TFIELDNOTIFYEVENT);
+begin Self.ONCHANGE := T; end;
+
+procedure TFIELDONCHANGE_R(Self: TFIELD; var T: TFIELDNOTIFYEVENT);
+begin T := Self.ONCHANGE; end;
+
+procedure TFIELDVISIBLE_W(Self: TFIELD; const T: BOOLEAN);
+begin Self.VISIBLE := T; end;
+
+procedure TFIELDVISIBLE_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.VISIBLE; end;
+
+procedure TFIELDREQUIRED_W(Self: TFIELD; const T: BOOLEAN);
+begin Self.REQUIRED := T; end;
+
+procedure TFIELDREQUIRED_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.REQUIRED; end;
+
+procedure TFIELDREADONLY_W(Self: TFIELD; const T: BOOLEAN);
+begin Self.READONLY := T; end;
+
+procedure TFIELDREADONLY_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.READONLY; end;
+
+procedure TFIELDPROVIDERFLAGS_W(Self: TFIELD; const T: TPROVIDERFLAGS);
+begin Self.PROVIDERFLAGS := T; end;
+
+procedure TFIELDPROVIDERFLAGS_R(Self: TFIELD; var T: TPROVIDERFLAGS);
+begin T := Self.PROVIDERFLAGS; end;
+
+procedure TFIELDORIGIN_W(Self: TFIELD; const T: String);
+begin Self.ORIGIN := T; end;
+
+procedure TFIELDORIGIN_R(Self: TFIELD; var T: String);
+begin T := Self.ORIGIN; end;
+
+procedure TFIELDLOOKUPCACHE_W(Self: TFIELD; const T: BOOLEAN);
+begin Self.LOOKUPCACHE := T; end;
+
+procedure TFIELDLOOKUPCACHE_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.LOOKUPCACHE; end;
+
+procedure TFIELDKEYFIELDS_W(Self: TFIELD; const T: String);
+begin Self.KEYFIELDS := T; end;
+
+procedure TFIELDKEYFIELDS_R(Self: TFIELD; var T: String);
+begin T := Self.KEYFIELDS; end;
+
+procedure TFIELDLOOKUPRESULTFIELD_W(Self: TFIELD; const T: String);
+begin Self.LOOKUPRESULTFIELD := T; end;
+
+procedure TFIELDLOOKUPRESULTFIELD_R(Self: TFIELD; var T: String);
+begin T := Self.LOOKUPRESULTFIELD; end;
+
+procedure TFIELDLOOKUPKEYFIELDS_W(Self: TFIELD; const T: String);
+begin Self.LOOKUPKEYFIELDS := T; end;
+
+procedure TFIELDLOOKUPKEYFIELDS_R(Self: TFIELD; var T: String);
+begin T := Self.LOOKUPKEYFIELDS; end;
+
+procedure TFIELDLOOKUPDATASET_W(Self: TFIELD; const T: TDATASET);
+begin Self.LOOKUPDATASET := T; end;
+
+procedure TFIELDLOOKUPDATASET_R(Self: TFIELD; var T: TDATASET);
+begin T := Self.LOOKUPDATASET; end;
+
+procedure TFIELDIMPORTEDCONSTRAINT_W(Self: TFIELD; const T: String);
+begin Self.IMPORTEDCONSTRAINT := T; end;
+
+procedure TFIELDIMPORTEDCONSTRAINT_R(Self: TFIELD; var T: String);
+begin T := Self.IMPORTEDCONSTRAINT; end;
+
+procedure TFIELDINDEX_W(Self: TFIELD; const T: INTEGER);
+begin Self.INDEX := T; end;
+
+procedure TFIELDINDEX_R(Self: TFIELD; var T: INTEGER);
+begin T := Self.INDEX; end;
+
+procedure TFIELDHASCONSTRAINTS_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.HASCONSTRAINTS; end;
+
+procedure TFIELDFIELDNAME_W(Self: TFIELD; const T: String);
+begin Self.FIELDNAME := T; end;
+
+procedure TFIELDFIELDNAME_R(Self: TFIELD; var T: String);
+begin T := Self.FIELDNAME; end;
+
+procedure TFIELDFIELDKIND_W(Self: TFIELD; const T: TFIELDKIND);
+begin Self.FIELDKIND := T; end;
+
+procedure TFIELDFIELDKIND_R(Self: TFIELD; var T: TFIELDKIND);
+begin T := Self.FIELDKIND; end;
+
+procedure TFIELDDISPLAYWIDTH_W(Self: TFIELD; const T: INTEGER);
+begin Self.DISPLAYWIDTH := T; end;
+
+procedure TFIELDDISPLAYWIDTH_R(Self: TFIELD; var T: INTEGER);
+begin T := Self.DISPLAYWIDTH; end;
+
+procedure TFIELDDISPLAYLABEL_W(Self: TFIELD; const T: String);
+begin Self.DISPLAYLABEL := T; end;
+
+procedure TFIELDDISPLAYLABEL_R(Self: TFIELD; var T: String);
+begin T := Self.DISPLAYLABEL; end;
+
+procedure TFIELDDEFAULTEXPRESSION_W(Self: TFIELD; const T: String);
+begin Self.DEFAULTEXPRESSION := T; end;
+
+procedure TFIELDDEFAULTEXPRESSION_R(Self: TFIELD; var T: String);
+begin T := Self.DEFAULTEXPRESSION; end;
+
+procedure TFIELDCONSTRAINTERRORMESSAGE_W(Self: TFIELD; const T: String);
+begin Self.CONSTRAINTERRORMESSAGE := T; end;
+
+procedure TFIELDCONSTRAINTERRORMESSAGE_R(Self: TFIELD; var T: String);
+begin T := Self.CONSTRAINTERRORMESSAGE; end;
+
+procedure TFIELDCUSTOMCONSTRAINT_W(Self: TFIELD; const T: String);
+begin Self.CUSTOMCONSTRAINT := T; end;
+
+procedure TFIELDCUSTOMCONSTRAINT_R(Self: TFIELD; var T: String);
+begin T := Self.CUSTOMCONSTRAINT; end;
+
+{$IFNDEF FPC}
+procedure TFIELDAUTOGENERATEVALUE_W(Self: TFIELD; const T: TAUTOREFRESHFLAG);
+begin Self.AUTOGENERATEVALUE := T; end;
+
+procedure TFIELDAUTOGENERATEVALUE_R(Self: TFIELD; var T: TAUTOREFRESHFLAG);
+begin T := Self.AUTOGENERATEVALUE; end;
+
+procedure TFIELDVALIDCHARS_W(Self: TFIELD; const T: TFIELDCHARS);
+begin Self.VALIDCHARS := T; end;
+
+procedure TFIELDVALIDCHARS_R(Self: TFIELD; var T: TFIELDCHARS);
+begin T := Self.VALIDCHARS; end;
+
+
+procedure TFIELDPARENTFIELD_W(Self: TFIELD; const T: TOBJECTFIELD);
+begin Self.PARENTFIELD := T; end;
+
+procedure TFIELDPARENTFIELD_R(Self: TFIELD; var T: TOBJECTFIELD);
+begin T := Self.PARENTFIELD; end;
+
+
+
+{$ENDIF}
+
+procedure TFIELDALIGNMENT_W(Self: TFIELD; const T: TALIGNMENT);
+begin Self.ALIGNMENT := T; end;
+
+procedure TFIELDALIGNMENT_R(Self: TFIELD; var T: TALIGNMENT);
+begin T := Self.ALIGNMENT; end;
+
+procedure TFIELDVALUE_W(Self: TFIELD; const T: VARIANT);
+begin Self.VALUE := T; end;
+
+procedure TFIELDVALUE_R(Self: TFIELD; var T: VARIANT);
+begin T := Self.VALUE; end;
+
+procedure TFIELDTEXT_W(Self: TFIELD; const T: String);
+begin Self.TEXT := T; end;
+
+procedure TFIELDTEXT_R(Self: TFIELD; var T: String);
+begin T := Self.TEXT; end;
+
+procedure TFIELDSIZE_W(Self: TFIELD; const T: INTEGER);
+begin Self.SIZE := T; end;
+
+procedure TFIELDSIZE_R(Self: TFIELD; var T: INTEGER);
+begin T := Self.SIZE; end;
+
+procedure TFIELDOLDVALUE_R(Self: TFIELD; var T: VARIANT);
+begin T := Self.OLDVALUE; end;
+
+procedure TFIELDOFFSET_R(Self: TFIELD; var T: INTEGER);
+begin T := Self.OFFSET; end;
+
+procedure TFIELDNEWVALUE_W(Self: TFIELD; const T: VARIANT);
+begin Self.NEWVALUE := T; end;
+
+procedure TFIELDNEWVALUE_R(Self: TFIELD; var T: VARIANT);
+begin T := Self.NEWVALUE; end;
+
+procedure TFIELDLOOKUPLIST_R(Self: TFIELD; var T: TLOOKUPLIST);
+begin T := Self.LOOKUPLIST; end;
+
+{$IFNDEF FPC}
+procedure TFIELDLOOKUP_W(Self: TFIELD; const T: BOOLEAN);
+begin Self.LOOKUP := T; end;
+
+procedure TFIELDLOOKUP_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.LOOKUP; end;
+
+procedure TFIELDFULLNAME_R(Self: TFIELD; var T: String);
+begin T := Self.FULLNAME; end;
+
+
+procedure TFIELDEDITMASKPTR_R(Self: TFIELD; var T: String);
+begin T := Self.EDITMASKPTR; end;
+
+procedure TFIELDEDITMASK_W(Self: TFIELD; const T: String);
+begin Self.EDITMASK := T; end;
+
+procedure TFIELDEDITMASK_R(Self: TFIELD; var T: String);
+begin T := Self.EDITMASK; end;
+
+{$ENDIF}
+
+procedure TFIELDISNULL_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.ISNULL; end;
+
+procedure TFIELDISINDEXFIELD_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.ISINDEXFIELD; end;
+
+procedure TFIELDFIELDNO_R(Self: TFIELD; var T: INTEGER);
+begin T := Self.FIELDNO; end;
+
+
+
+procedure TFIELDDISPLAYTEXT_R(Self: TFIELD; var T: String);
+begin T := Self.DISPLAYTEXT; end;
+
+procedure TFIELDDISPLAYNAME_R(Self: TFIELD; var T: String);
+begin T := Self.DISPLAYNAME; end;
+
+procedure TFIELDDATATYPE_R(Self: TFIELD; var T: TFIELDTYPE);
+begin T := Self.DATATYPE; end;
+
+procedure TFIELDDATASIZE_R(Self: TFIELD; var T: INTEGER);
+begin T := Self.DATASIZE; end;
+
+procedure TFIELDDATASET_W(Self: TFIELD; const T: TDATASET);
+begin Self.DATASET := T; end;
+
+procedure TFIELDDATASET_R(Self: TFIELD; var T: TDATASET);
+begin T := Self.DATASET; end;
+
+procedure TFIELDCURVALUE_R(Self: TFIELD; var T: VARIANT);
+begin T := Self.CURVALUE; end;
+
+procedure TFIELDCANMODIFY_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.CANMODIFY; end;
+
+procedure TFIELDCALCULATED_W(Self: TFIELD; const T: BOOLEAN);
+begin Self.CALCULATED := T; end;
+
+procedure TFIELDCALCULATED_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.CALCULATED; end;
+
+procedure TFIELDATTRIBUTESET_W(Self: TFIELD; const T: String);
+begin Self.ATTRIBUTESET := T; end;
+
+procedure TFIELDATTRIBUTESET_R(Self: TFIELD; var T: String);
+begin T := Self.ATTRIBUTESET; end;
+
+procedure TFIELDASVARIANT_W(Self: TFIELD; const T: VARIANT);
+begin Self.ASVARIANT := T; end;
+
+procedure TFIELDASVARIANT_R(Self: TFIELD; var T: VARIANT);
+begin T := Self.ASVARIANT; end;
+
+procedure TFIELDASSTRING_W(Self: TFIELD; const T: String);
+begin Self.ASSTRING := T; end;
+
+procedure TFIELDASSTRING_R(Self: TFIELD; var T: String);
+begin T := Self.ASSTRING; end;
+
+procedure TFIELDASINTEGER_W(Self: TFIELD; const T: LONGINT);
+begin Self.ASINTEGER := T; end;
+
+procedure TFIELDASINTEGER_R(Self: TFIELD; var T: LONGINT);
+begin T := Self.ASINTEGER; end;
+
+procedure TFIELDASFLOAT_W(Self: TFIELD; const T: DOUBLE);
+begin Self.ASFLOAT := T; end;
+
+procedure TFIELDASFLOAT_R(Self: TFIELD; var T: DOUBLE);
+begin T := Self.ASFLOAT; end;
+
+procedure TFIELDASDATETIME_W(Self: TFIELD; const T: TDATETIME);
+begin Self.ASDATETIME := T; end;
+
+procedure TFIELDASDATETIME_R(Self: TFIELD; var T: TDATETIME);
+begin T := Self.ASDATETIME; end;
+
+procedure TFIELDASCURRENCY_W(Self: TFIELD; const T: CURRENCY);
+begin Self.ASCURRENCY := T; end;
+
+procedure TFIELDASCURRENCY_R(Self: TFIELD; var T: CURRENCY);
+begin T := Self.ASCURRENCY; end;
+
+procedure TFIELDASBOOLEAN_W(Self: TFIELD; const T: BOOLEAN);
+begin Self.ASBOOLEAN := T; end;
+
+procedure TFIELDASBOOLEAN_R(Self: TFIELD; var T: BOOLEAN);
+begin T := Self.ASBOOLEAN; end;
+
+{$IFNDEF FPC}
+{$IFDEF DELPHI6UP}
+procedure TFIELDASBCD_W(Self: TFIELD; const T: TBCD);
+begin Self.ASBCD := T; end;
+
+procedure TFIELDASBCD_R(Self: TFIELD; var T: TBCD);
+begin T := Self.ASBCD; end;
+{$ENDIF}
+
+procedure TFIELDLISTFIELDS_R(Self: TFIELDLIST; var T: TFIELD; const t1: INTEGER);
+begin T := Self.FIELDS[t1]; end;
+
+procedure TFIELDDEFLISTFIELDDEFS_R(Self: TFIELDDEFLIST; var T: TFIELDDEF; const t1: INTEGER);
+begin T := Self.FIELDDEFS[t1]; end;
+
+procedure TFLATLISTDATASET_R(Self: TFLATLIST; var T: TDATASET);
+begin T := Self.DATASET; end;
+
+procedure TINDEXDEFGROUPINGLEVEL_W(Self: TINDEXDEF; const T: INTEGER);
+begin Self.GROUPINGLEVEL := T; end;
+
+procedure TINDEXDEFGROUPINGLEVEL_R(Self: TINDEXDEF; var T: INTEGER);
+begin T := Self.GROUPINGLEVEL; end;
+
+
+
+{$ENDIF}
+
+procedure TFIELDSFIELDS_W(Self: TFIELDS; const T: TFIELD; const t1: INTEGER);
+begin Self.FIELDS[t1] := T; end;
+
+procedure TFIELDSFIELDS_R(Self: TFIELDS; var T: TFIELD; const t1: INTEGER);
+begin T := Self.FIELDS[t1]; end;
+
+procedure TFIELDSDATASET_R(Self: TFIELDS; var T: TDATASET);
+begin T := Self.DATASET; end;
+
+procedure TFIELDSCOUNT_R(Self: TFIELDS; var T: INTEGER);
+begin T := Self.COUNT; end;
+
+procedure TINDEXDEFSITEMS_W(Self: TINDEXDEFS; const T: TINDEXDEF; const t1: INTEGER);
+begin Self.ITEMS[t1] := T; end;
+
+procedure TINDEXDEFSITEMS_R(Self: TINDEXDEFS; var T: TINDEXDEF; const t1: INTEGER);
+begin T := Self.ITEMS[t1]; end;
+
+procedure TINDEXDEFSOURCE_W(Self: TINDEXDEF; const T: String);
+begin Self.SOURCE := T; end;
+
+procedure TINDEXDEFSOURCE_R(Self: TINDEXDEF; var T: String);
+begin T := Self.SOURCE; end;
+
+procedure TINDEXDEFOPTIONS_W(Self: TINDEXDEF; const T: TINDEXOPTIONS);
+begin Self.OPTIONS := T; end;
+
+procedure TINDEXDEFOPTIONS_R(Self: TINDEXDEF; var T: TINDEXOPTIONS);
+begin T := Self.OPTIONS; end;
+
+procedure TINDEXDEFFIELDS_W(Self: TINDEXDEF; const T: String);
+begin Self.FIELDS := T; end;
+
+procedure TINDEXDEFFIELDS_R(Self: TINDEXDEF; var T: String);
+begin T := Self.FIELDS; end;
+
+procedure TINDEXDEFEXPRESSION_W(Self: TINDEXDEF; const T: String);
+begin {$IFNDEF FPC}Self.EXPRESSION := T; {$ENDIF}end;
+
+procedure TINDEXDEFEXPRESSION_R(Self: TINDEXDEF; var T: String);
+begin T := Self.EXPRESSION; end;
+
+{$IFNDEF FPC}
+procedure TINDEXDEFDESCFIELDS_W(Self: TINDEXDEF; const T: String);
+begin Self.DESCFIELDS := T; end;
+
+procedure TINDEXDEFDESCFIELDS_R(Self: TINDEXDEF; var T: String);
+begin T := Self.DESCFIELDS; end;
+
+procedure TINDEXDEFCASEINSFIELDS_W(Self: TINDEXDEF; const T: String);
+begin Self.CASEINSFIELDS := T; end;
+
+procedure TINDEXDEFCASEINSFIELDS_R(Self: TINDEXDEF; var T: String);
+begin T := Self.CASEINSFIELDS; end;
+
+
+procedure TINDEXDEFFIELDEXPRESSION_R(Self: TINDEXDEF; var T: String);
+begin T := Self.FIELDEXPRESSION; end;
+
+procedure TFIELDDEFSPARENTDEF_R(Self: TFIELDDEFS; var T: TFIELDDEF);
+begin T := Self.PARENTDEF; end;
+
+{$ENDIF}
+
+procedure TFIELDDEFSITEMS_W(Self: TFIELDDEFS; const T: TFIELDDEF; const t1: INTEGER);
+begin Self.ITEMS[t1] := T; end;
+
+procedure TFIELDDEFSITEMS_R(Self: TFIELDDEFS; var T: TFIELDDEF; const t1: INTEGER);
+begin T := Self.ITEMS[t1]; end;
+
+procedure TFIELDDEFSHIDDENFIELDS_W(Self: TFIELDDEFS; const T: BOOLEAN);
+begin Self.HIDDENFIELDS := T; end;
+
+procedure TFIELDDEFSHIDDENFIELDS_R(Self: TFIELDDEFS; var T: BOOLEAN);
+begin T := Self.HIDDENFIELDS; end;
+
+procedure TFIELDDEFSIZE_W(Self: TFIELDDEF; const T: INTEGER);
+begin Self.SIZE := T; end;
+
+procedure TFIELDDEFSIZE_R(Self: TFIELDDEF; var T: INTEGER);
+begin T := Self.SIZE; end;
+
+procedure TFIELDDEFPRECISION_W(Self: TFIELDDEF; const T: INTEGER);
+begin Self.PRECISION := T; end;
+
+procedure TFIELDDEFPRECISION_R(Self: TFIELDDEF; var T: INTEGER);
+begin T := Self.PRECISION; end;
+
+procedure TFIELDDEFDATATYPE_W(Self: TFIELDDEF; const T: TFIELDTYPE);
+begin Self.DATATYPE := T; end;
+
+procedure TFIELDDEFDATATYPE_R(Self: TFIELDDEF; var T: TFIELDTYPE);
+begin T := Self.DATATYPE; end;
+
+{$IFNDEF FPC}
+procedure TFIELDDEFCHILDDEFS_W(Self: TFIELDDEF; const T: TFIELDDEFS);
+begin Self.CHILDDEFS := T; end;
+
+procedure TFIELDDEFCHILDDEFS_R(Self: TFIELDDEF; var T: TFIELDDEFS);
+begin T := Self.CHILDDEFS; end;
+
+procedure TFIELDDEFREQUIRED_W(Self: TFIELDDEF; const T: BOOLEAN);
+begin Self.REQUIRED := T;end;
+
+procedure TFIELDDEFPARENTDEF_R(Self: TFIELDDEF; var T: TFIELDDEF);
+begin T := Self.PARENTDEF; end;
+
+{$ENDIF}
+
+procedure TFIELDDEFATTRIBUTES_W(Self: TFIELDDEF; const T: TFIELDATTRIBUTES);
+begin Self.ATTRIBUTES := T; end;
+
+procedure TFIELDDEFATTRIBUTES_R(Self: TFIELDDEF; var T: TFIELDATTRIBUTES);
+begin T := Self.ATTRIBUTES; end;
+
+procedure TFIELDDEFREQUIRED_R(Self: TFIELDDEF; var T: BOOLEAN);
+begin T := Self.REQUIRED; end;
+
+procedure TFIELDDEFINTERNALCALCFIELD_W(Self: TFIELDDEF; const T: BOOLEAN);
+begin Self.INTERNALCALCFIELD := T; end;
+
+procedure TFIELDDEFINTERNALCALCFIELD_R(Self: TFIELDDEF; var T: BOOLEAN);
+begin T := Self.INTERNALCALCFIELD; end;
+
+{$IFNDEF FPC}
+procedure TFIELDDEFFIELDNO_W(Self: TFIELDDEF; const T: INTEGER);
+begin Self.FIELDNO := T; end;
+
+procedure TDEFCOLLECTIONUPDATED_W(Self: TDEFCOLLECTION; const T: BOOLEAN);
+begin Self.UPDATED := T; end;
+
+procedure TDEFCOLLECTIONUPDATED_R(Self: TDEFCOLLECTION; var T: BOOLEAN);
+begin T := Self.UPDATED; end;
+
+procedure TDEFCOLLECTIONDATASET_R(Self: TDEFCOLLECTION; var T: TDATASET);
+begin T := Self.DATASET; end;
+
+procedure TNAMEDITEMNAME_W(Self: TNAMEDITEM; const T: String);
+begin Self.NAME := T; end;
+
+procedure TNAMEDITEMNAME_R(Self: TNAMEDITEM; var T: String);
+begin T := Self.NAME; end;
+
+
+{$ENDIF}
+
+procedure TFIELDDEFFIELDNO_R(Self: TFIELDDEF; var T: INTEGER);
+begin T := Self.FIELDNO; end;
+
+procedure TFIELDDEFFIELDCLASS_R(Self: TFIELDDEF; var T: TFIELDCLASS);
+begin T := Self.FIELDCLASS; end;
+
+procedure RIRegisterTDATASET(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TDATASET) do
+ begin
+ RegisterMethod(@TDATASET.ACTIVEBUFFER, 'ACTIVEBUFFER');
+ RegisterMethod(@TDATASET.APPEND, 'APPEND');
+ RegisterMethod(@TDATASET.APPENDRECORD, 'APPENDRECORD');
+// RegisterVirtualMethod(@TDATASET.BOOKMARKVALID, 'BOOKMARKVALID');
+ RegisterVirtualMethod(@TDATASET.CANCEL, 'CANCEL');
+ RegisterMethod(@TDATASET.CHECKBROWSEMODE, 'CHECKBROWSEMODE');
+ RegisterMethod(@TDATASET.CLEARFIELDS, 'CLEARFIELDS');
+ RegisterMethod(@TDATASET.CLOSE, 'CLOSE');
+ RegisterMethod(@TDATASET.CONTROLSDISABLED, 'CONTROLSDISABLED');
+// RegisterVirtualMethod(@TDATASET.COMPAREBOOKMARKS, 'COMPAREBOOKMARKS');
+ RegisterVirtualMethod(@TDATASET.CREATEBLOBSTREAM, 'CREATEBLOBSTREAM');
+ RegisterMethod(@TDATASET.CURSORPOSCHANGED, 'CURSORPOSCHANGED');
+ RegisterMethod(@TDATASET.DELETE, 'DELETE');
+ RegisterMethod(@TDATASET.DISABLECONTROLS, 'DISABLECONTROLS');
+ RegisterMethod(@TDATASET.EDIT, 'EDIT');
+ RegisterMethod(@TDATASET.ENABLECONTROLS, 'ENABLECONTROLS');
+ RegisterMethod(@TDATASET.FIELDBYNAME, 'FIELDBYNAME');
+ RegisterMethod(@TDATASET.FINDFIELD, 'FINDFIELD');
+ RegisterMethod(@TDATASET.FINDFIRST, 'FINDFIRST');
+ RegisterMethod(@TDATASET.FINDLAST, 'FINDLAST');
+ RegisterMethod(@TDATASET.FINDNEXT, 'FINDNEXT');
+ RegisterMethod(@TDATASET.FINDPRIOR, 'FINDPRIOR');
+ RegisterMethod(@TDATASET.FIRST, 'FIRST');
+// RegisterVirtualMethod(@TDATASET.FREEBOOKMARK, 'FREEBOOKMARK');
+// RegisterVirtualMethod(@TDATASET.GETBOOKMARK, 'GETBOOKMARK');
+ RegisterVirtualMethod(@TDATASET.GETCURRENTRECORD, 'GETCURRENTRECORD');
+// RegisterVirtualMethod(@TDATASET.GETDETAILDATASETS, 'GETDETAILDATASETS');
+// RegisterVirtualMethod(@TDATASET.GETDETAILLINKFIELDS, 'GETDETAILLINKFIELDS');
+// RegisterVirtualMethod(@TDATASET.GETBLOBFIELDDATA, 'GETBLOBFIELDDATA');
+// RegisterMethod(@TDATASET.GETFIELDLIST, 'GETFIELDLIST');
+ RegisterMethod(@TDATASET.GETFIELDNAMES, 'GETFIELDNAMES');
+// RegisterMethod(@TDATASET.GOTOBOOKMARK, 'GOTOBOOKMARK');
+ RegisterMethod(@TDATASET.INSERT, 'INSERT');
+ RegisterMethod(@TDATASET.INSERTRECORD, 'INSERTRECORD');
+ RegisterMethod(@TDATASET.ISEMPTY, 'ISEMPTY');
+ RegisterMethod(@TDATASET.ISLINKEDTO, 'ISLINKEDTO');
+ RegisterVirtualMethod(@TDATASET.ISSEQUENCED, 'ISSEQUENCED');
+ RegisterMethod(@TDATASET.LAST, 'LAST');
+ RegisterVirtualMethod(@TDATASET.LOCATE, 'LOCATE');
+ RegisterVirtualMethod(@TDATASET.LOOKUP, 'LOOKUP');
+ RegisterMethod(@TDATASET.MOVEBY, 'MOVEBY');
+ RegisterMethod(@TDATASET.NEXT, 'NEXT');
+ RegisterMethod(@TDATASET.OPEN, 'OPEN');
+ RegisterVirtualMethod(@TDATASET.POST, 'POST');
+ RegisterMethod(@TDATASET.PRIOR, 'PRIOR');
+ RegisterMethod(@TDATASET.REFRESH, 'REFRESH');
+// RegisterVirtualMethod(@TDATASET.RESYNC, 'RESYNC');
+ RegisterMethod(@TDATASET.SETFIELDS, 'SETFIELDS');
+ RegisterVirtualMethod(@TDATASET.TRANSLATE, 'TRANSLATE');
+ RegisterMethod(@TDATASET.UPDATECURSORPOS, 'UPDATECURSORPOS');
+ RegisterMethod(@TDATASET.UPDATERECORD, 'UPDATERECORD');
+ RegisterVirtualMethod(@TDATASET.UPDATESTATUS, 'UPDATESTATUS');
+ RegisterPropertyHelper(@TDATASETBOF_R,nil,'BOF');
+// RegisterPropertyHelper(@TDATASETBOOKMARK_R,@TDATASETBOOKMARK_W,'BOOKMARK');
+ RegisterPropertyHelper(@TDATASETCANMODIFY_R,nil,'CANMODIFY');
+ RegisterPropertyHelper(@TDATASETDATASOURCE_R,nil,'DATASOURCE');
+ RegisterPropertyHelper(@TDATASETDEFAULTFIELDS_R,nil,'DEFAULTFIELDS');
+ RegisterPropertyHelper(@TDATASETEOF_R,nil,'EOF');
+ RegisterPropertyHelper(@TDATASETFIELDCOUNT_R,nil,'FIELDCOUNT');
+ RegisterPropertyHelper(@TDATASETFIELDS_R,nil,'FIELDS');
+ RegisterPropertyHelper(@TDATASETFIELDVALUES_R,@TDATASETFIELDVALUES_W,'FIELDVALUES');
+ RegisterPropertyHelper(@TDATASETFOUND_R,nil,'FOUND');
+{$IFDEF DELPHI6UP}
+ RegisterPropertyHelper(@TDATASETISUNIDIRECTIONAL_R,nil,'ISUNIDIRECTIONAL');
+{$ENDIF}
+ RegisterPropertyHelper(@TDATASETMODIFIED_R,nil,'MODIFIED');
+ RegisterPropertyHelper(@TDATASETRECORDCOUNT_R,nil,'RECORDCOUNT');
+ RegisterPropertyHelper(@TDATASETRECNO_R,@TDATASETRECNO_W,'RECNO');
+ RegisterPropertyHelper(@TDATASETRECORDSIZE_R,nil,'RECORDSIZE');
+ RegisterPropertyHelper(@TDATASETSTATE_R,nil,'STATE');
+ RegisterPropertyHelper(@TDATASETFILTER_R,@TDATASETFILTER_W,'FILTER');
+ RegisterPropertyHelper(@TDATASETFILTERED_R,@TDATASETFILTERED_W,'FILTERED');
+ RegisterPropertyHelper(@TDATASETFILTEROPTIONS_R,@TDATASETFILTEROPTIONS_W,'FILTEROPTIONS');
+ RegisterPropertyHelper(@TDATASETACTIVE_R,@TDATASETACTIVE_W,'ACTIVE');
+ RegisterPropertyHelper(@TDATASETAUTOCALCFIELDS_R,@TDATASETAUTOCALCFIELDS_W,'AUTOCALCFIELDS');
+ RegisterPropertyHelper(@TDATASETBEFOREOPEN_R,@TDATASETBEFOREOPEN_W,'BEFOREOPEN');
+ RegisterPropertyHelper(@TDATASETAFTEROPEN_R,@TDATASETAFTEROPEN_W,'AFTEROPEN');
+ RegisterPropertyHelper(@TDATASETBEFORECLOSE_R,@TDATASETBEFORECLOSE_W,'BEFORECLOSE');
+ RegisterPropertyHelper(@TDATASETAFTERCLOSE_R,@TDATASETAFTERCLOSE_W,'AFTERCLOSE');
+ RegisterPropertyHelper(@TDATASETBEFOREINSERT_R,@TDATASETBEFOREINSERT_W,'BEFOREINSERT');
+ RegisterPropertyHelper(@TDATASETAFTERINSERT_R,@TDATASETAFTERINSERT_W,'AFTERINSERT');
+ RegisterPropertyHelper(@TDATASETBEFOREEDIT_R,@TDATASETBEFOREEDIT_W,'BEFOREEDIT');
+ RegisterPropertyHelper(@TDATASETAFTEREDIT_R,@TDATASETAFTEREDIT_W,'AFTEREDIT');
+ RegisterPropertyHelper(@TDATASETBEFOREPOST_R,@TDATASETBEFOREPOST_W,'BEFOREPOST');
+ RegisterPropertyHelper(@TDATASETAFTERPOST_R,@TDATASETAFTERPOST_W,'AFTERPOST');
+ RegisterPropertyHelper(@TDATASETBEFORECANCEL_R,@TDATASETBEFORECANCEL_W,'BEFORECANCEL');
+ RegisterPropertyHelper(@TDATASETAFTERCANCEL_R,@TDATASETAFTERCANCEL_W,'AFTERCANCEL');
+ RegisterPropertyHelper(@TDATASETBEFOREDELETE_R,@TDATASETBEFOREDELETE_W,'BEFOREDELETE');
+ RegisterPropertyHelper(@TDATASETAFTERDELETE_R,@TDATASETAFTERDELETE_W,'AFTERDELETE');
+ RegisterPropertyHelper(@TDATASETBEFORESCROLL_R,@TDATASETBEFORESCROLL_W,'BEFORESCROLL');
+ RegisterPropertyHelper(@TDATASETAFTERSCROLL_R,@TDATASETAFTERSCROLL_W,'AFTERSCROLL');
+ {$IFNDEF FPC}
+ RegisterPropertyHelper(@TDATASETFIELDLIST_R,nil,'FIELDLIST');
+ RegisterPropertyHelper(@TDATASETDESIGNER_R,nil,'DESIGNER');
+ RegisterPropertyHelper(@TDATASETBLOCKREADSIZE_R,@TDATASETBLOCKREADSIZE_W,'BLOCKREADSIZE');
+ RegisterPropertyHelper(@TDATASETBEFOREREFRESH_R,@TDATASETBEFOREREFRESH_W,'BEFOREREFRESH');
+ RegisterPropertyHelper(@TDATASETAFTERREFRESH_R,@TDATASETAFTERREFRESH_W,'AFTERREFRESH');
+ RegisterPropertyHelper(@TDATASETAGGFIELDS_R,nil,'AGGFIELDS');
+ RegisterPropertyHelper(@TDATASETDATASETFIELD_R,@TDATASETDATASETFIELD_W,'DATASETFIELD');
+ RegisterPropertyHelper(@TDATASETOBJECTVIEW_R,@TDATASETOBJECTVIEW_W,'OBJECTVIEW');
+ RegisterPropertyHelper(@TDATASETSPARSEARRAYS_R,@TDATASETSPARSEARRAYS_W,'SPARSEARRAYS');
+ RegisterPropertyHelper(@TDATASETFIELDDEFS_R,@TDATASETFIELDDEFS_W,'FIELDDEFS');
+ RegisterPropertyHelper(@TDATASETFIELDDEFLIST_R,nil,'FIELDDEFLIST');
+
+ {$ENDIF}
+ RegisterEventPropertyHelper(@TDATASETONCALCFIELDS_R,@TDATASETONCALCFIELDS_W,'ONCALCFIELDS');
+ RegisterEventPropertyHelper(@TDATASETONDELETEERROR_R,@TDATASETONDELETEERROR_W,'ONDELETEERROR');
+ RegisterEventPropertyHelper(@TDATASETONEDITERROR_R,@TDATASETONEDITERROR_W,'ONEDITERROR');
+ RegisterEventPropertyHelper(@TDATASETONFILTERRECORD_R,@TDATASETONFILTERRECORD_W,'ONFILTERRECORD');
+ RegisterEventPropertyHelper(@TDATASETONNEWRECORD_R,@TDATASETONNEWRECORD_W,'ONNEWRECORD');
+ RegisterEventPropertyHelper(@TDATASETONPOSTERROR_R,@TDATASETONPOSTERROR_W,'ONPOSTERROR');
+ end;
+end;
+
+procedure RIRegisterTPARAMS(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TPARAMS) do
+ begin
+// RegisterMethod(@TPARAMS.ASSIGNVALUES, 'ASSIGNVALUES');
+ RegisterMethod(@TPARAMS.ADDPARAM, 'ADDPARAM');
+ RegisterMethod(@TPARAMS.REMOVEPARAM, 'REMOVEPARAM');
+ RegisterMethod(@TPARAMS.CREATEPARAM, 'CREATEPARAM');
+ RegisterMethod(@TPARAMS.GETPARAMLIST, 'GETPARAMLIST');
+ RegisterMethod(@TPARAMS.ISEQUAL, 'ISEQUAL');
+ RegisterMethod(@TPARAMS.PARSESQL, 'PARSESQL');
+ RegisterMethod(@TPARAMS.PARAMBYNAME, 'PARAMBYNAME');
+ RegisterMethod(@TPARAMS.FINDPARAM, 'FINDPARAM');
+ RegisterPropertyHelper(@TPARAMSITEMS_R,@TPARAMSITEMS_W,'ITEMS');
+ RegisterPropertyHelper(@TPARAMSPARAMVALUES_R,@TPARAMSPARAMVALUES_W,'PARAMVALUES');
+ end;
+end;
+
+procedure RIRegisterTPARAM(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TPARAM) do
+ begin
+ RegisterMethod(@TPARAM.ASSIGNFIELD, 'ASSIGNFIELD');
+ RegisterMethod(@TPARAM.ASSIGNFIELDVALUE, 'ASSIGNFIELDVALUE');
+ RegisterMethod(@TPARAM.CLEAR, 'CLEAR');
+// RegisterMethod(@TPARAM.GETDATA, 'GETDATA');
+ RegisterMethod(@TPARAM.GETDATASIZE, 'GETDATASIZE');
+ RegisterMethod(@TPARAM.LOADFROMFILE, 'LOADFROMFILE');
+ RegisterMethod(@TPARAM.LOADFROMSTREAM, 'LOADFROMSTREAM');
+// RegisterMethod(@TPARAM.SETBLOBDATA, 'SETBLOBDATA');
+// RegisterMethod(@TPARAM.SETDATA, 'SETDATA');
+ {$IFNDEF FPC}
+ RegisterPropertyHelper(@TPARAMASBCD_R,@TPARAMASBCD_W,'ASBCD');
+{$IFDEF DELPHI6UP}
+ RegisterPropertyHelper(@TPARAMASFMTBCD_R,@TPARAMASFMTBCD_W,'ASFMTBCD');
+{$ENDIF}
+ {$ENDIF}
+ RegisterPropertyHelper(@TPARAMASBLOB_R,@TPARAMASBLOB_W,'ASBLOB');
+ RegisterPropertyHelper(@TPARAMASBOOLEAN_R,@TPARAMASBOOLEAN_W,'ASBOOLEAN');
+ RegisterPropertyHelper(@TPARAMASCURRENCY_R,@TPARAMASCURRENCY_W,'ASCURRENCY');
+ RegisterPropertyHelper(@TPARAMASDATE_R,@TPARAMASDATE_W,'ASDATE');
+ RegisterPropertyHelper(@TPARAMASDATETIME_R,@TPARAMASDATETIME_W,'ASDATETIME');
+ RegisterPropertyHelper(@TPARAMASFLOAT_R,@TPARAMASFLOAT_W,'ASFLOAT');
+ RegisterPropertyHelper(@TPARAMASINTEGER_R,@TPARAMASINTEGER_W,'ASINTEGER');
+ RegisterPropertyHelper(@TPARAMASSMALLINT_R,@TPARAMASSMALLINT_W,'ASSMALLINT');
+ RegisterPropertyHelper(@TPARAMASMEMO_R,@TPARAMASMEMO_W,'ASMEMO');
+ RegisterPropertyHelper(@TPARAMASSTRING_R,@TPARAMASSTRING_W,'ASSTRING');
+ RegisterPropertyHelper(@TPARAMASTIME_R,@TPARAMASTIME_W,'ASTIME');
+ RegisterPropertyHelper(@TPARAMASWORD_R,@TPARAMASWORD_W,'ASWORD');
+ RegisterPropertyHelper(@TPARAMBOUND_R,@TPARAMBOUND_W,'BOUND');
+ RegisterPropertyHelper(@TPARAMISNULL_R,nil,'ISNULL');
+ RegisterPropertyHelper(@TPARAMNATIVESTR_R,@TPARAMNATIVESTR_W,'NATIVESTR');
+ RegisterPropertyHelper(@TPARAMTEXT_R,@TPARAMTEXT_W,'TEXT');
+ RegisterPropertyHelper(@TPARAMDATATYPE_R,@TPARAMDATATYPE_W,'DATATYPE');
+{$IFDEF DELPHI6UP}
+ RegisterPropertyHelper(@TPARAMPRECISION_R,@TPARAMPRECISION_W,'PRECISION');
+ RegisterPropertyHelper(@TPARAMNUMERICSCALE_R,@TPARAMNUMERICSCALE_W,'NUMERICSCALE');
+ RegisterPropertyHelper(@TPARAMSIZE_R,@TPARAMSIZE_W,'SIZE');
+{$ENDIF}
+ RegisterPropertyHelper(@TPARAMNAME_R,@TPARAMNAME_W,'NAME');
+ RegisterPropertyHelper(@TPARAMPARAMTYPE_R,@TPARAMPARAMTYPE_W,'PARAMTYPE');
+ RegisterPropertyHelper(@TPARAMVALUE_R,@TPARAMVALUE_W,'VALUE');
+ end;
+end;
+
+{$IFNDEF FPC}
+procedure RIRegisterTGUIDFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TGUIDFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTVARIANTFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TVARIANTFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTREFERENCEFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TREFERENCEFIELD) do
+ begin
+ RegisterPropertyHelper(@TREFERENCEFIELDREFERENCETABLENAME_R,@TREFERENCEFIELDREFERENCETABLENAME_W,'REFERENCETABLENAME');
+ end;
+end;
+
+
+procedure RIRegisterTDATASETFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TDATASETFIELD) do
+ begin
+ RegisterPropertyHelper(@TDATASETFIELDNESTEDDATASET_R,nil,'NESTEDDATASET');
+ RegisterPropertyHelper(@TDATASETFIELDINCLUDEOBJECTFIELD_R,@TDATASETFIELDINCLUDEOBJECTFIELD_W,'INCLUDEOBJECTFIELD');
+ end;
+end;
+
+
+procedure RIRegisterTARRAYFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TARRAYFIELD) do
+ begin
+ end;
+end;
+
+
+procedure RIRegisterTADTFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TADTFIELD) do
+ begin
+ end;
+end;
+
+
+procedure RIRegisterTOBJECTFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TOBJECTFIELD) do
+ begin
+ RegisterPropertyHelper(@TOBJECTFIELDFIELDCOUNT_R,nil,'FIELDCOUNT');
+ RegisterPropertyHelper(@TOBJECTFIELDFIELDS_R,nil,'FIELDS');
+ RegisterPropertyHelper(@TOBJECTFIELDFIELDVALUES_R,@TOBJECTFIELDFIELDVALUES_W,'FIELDVALUES');
+ RegisterPropertyHelper(@TOBJECTFIELDUNNAMED_R,nil,'UNNAMED');
+ RegisterPropertyHelper(@TOBJECTFIELDOBJECTTYPE_R,@TOBJECTFIELDOBJECTTYPE_W,'OBJECTTYPE');
+ end;
+end;
+{$ENDIF}
+
+
+procedure RIRegisterTGRAPHICFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TGRAPHICFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTMEMOFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TMEMOFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTBLOBFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TBLOBFIELD) do
+ begin
+ RegisterMethod(@TBLOBFIELD.LOADFROMFILE, 'LOADFROMFILE');
+ RegisterMethod(@TBLOBFIELD.LOADFROMSTREAM, 'LOADFROMSTREAM');
+ RegisterMethod(@TBLOBFIELD.SAVETOFILE, 'SAVETOFILE');
+ RegisterMethod(@TBLOBFIELD.SAVETOSTREAM, 'SAVETOSTREAM');
+ RegisterPropertyHelper(@TBLOBFIELDBLOBSIZE_R,nil,'BLOBSIZE');
+ RegisterPropertyHelper(@TBLOBFIELDMODIFIED_R,@TBLOBFIELDMODIFIED_W,'MODIFIED');
+ RegisterPropertyHelper(@TBLOBFIELDVALUE_R,@TBLOBFIELDVALUE_W,'VALUE');
+ RegisterPropertyHelper(@TBLOBFIELDTRANSLITERATE_R,@TBLOBFIELDTRANSLITERATE_W,'TRANSLITERATE');
+ RegisterPropertyHelper(@TBLOBFIELDBLOBTYPE_R,@TBLOBFIELDBLOBTYPE_W,'BLOBTYPE');
+{$IFNDEF FPC}
+{$IFDEF DELPHI6UP}
+ RegisterPropertyHelper(@TBLOBFIELDGRAPHICHEADER_R,@TBLOBFIELDGRAPHICHEADER_W,'GRAPHICHEADER');
+{$ENDIF}
+{$ENDIF}
+ end;
+end;
+
+
+{$IFNDEF FPC}
+{$IFDEF DELPHI6UP}
+
+procedure RIRegisterTFMTBCDFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TFMTBCDFIELD) do
+ begin
+ RegisterPropertyHelper(@TFMTBCDFIELDVALUE_R,@TFMTBCDFIELDVALUE_W,'VALUE');
+ RegisterPropertyHelper(@TFMTBCDFIELDCURRENCY_R,@TFMTBCDFIELDCURRENCY_W,'CURRENCY');
+ RegisterPropertyHelper(@TFMTBCDFIELDMAXVALUE_R,@TFMTBCDFIELDMAXVALUE_W,'MAXVALUE');
+ RegisterPropertyHelper(@TFMTBCDFIELDMINVALUE_R,@TFMTBCDFIELDMINVALUE_W,'MINVALUE');
+ RegisterPropertyHelper(@TFMTBCDFIELDPRECISION_R,@TFMTBCDFIELDPRECISION_W,'PRECISION');
+ end;
+end;
+{$ENDIF}
+procedure RIRegisterTBCDFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TBCDFIELD) do
+ begin
+ RegisterPropertyHelper(@TBCDFIELDVALUE_R,@TBCDFIELDVALUE_W,'VALUE');
+ RegisterPropertyHelper(@TBCDFIELDCURRENCY_R,@TBCDFIELDCURRENCY_W,'CURRENCY');
+ RegisterPropertyHelper(@TBCDFIELDMAXVALUE_R,@TBCDFIELDMAXVALUE_W,'MAXVALUE');
+ RegisterPropertyHelper(@TBCDFIELDMINVALUE_R,@TBCDFIELDMINVALUE_W,'MINVALUE');
+ RegisterPropertyHelper(@TBCDFIELDPRECISION_R,@TBCDFIELDPRECISION_W,'PRECISION');
+ end;
+end;
+{$ENDIF}
+
+procedure RIRegisterTVARBYTESFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TVARBYTESFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTBYTESFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TBYTESFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTBINARYFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TBINARYFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTTIMEFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TTIMEFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTDATEFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TDATEFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTDATETIMEFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TDATETIMEFIELD) do
+ begin
+ RegisterPropertyHelper(@TDATETIMEFIELDVALUE_R,@TDATETIMEFIELDVALUE_W,'VALUE');
+ RegisterPropertyHelper(@TDATETIMEFIELDDISPLAYFORMAT_R,@TDATETIMEFIELDDISPLAYFORMAT_W,'DISPLAYFORMAT');
+ end;
+end;
+
+procedure RIRegisterTBOOLEANFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TBOOLEANFIELD) do
+ begin
+ RegisterPropertyHelper(@TBOOLEANFIELDVALUE_R,@TBOOLEANFIELDVALUE_W,'VALUE');
+ RegisterPropertyHelper(@TBOOLEANFIELDDISPLAYVALUES_R,@TBOOLEANFIELDDISPLAYVALUES_W,'DISPLAYVALUES');
+ end;
+end;
+
+procedure RIRegisterTCURRENCYFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TCURRENCYFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTFLOATFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TFLOATFIELD) do
+ begin
+ {$IFNDEF FPC}
+ RegisterPropertyHelper(@TFLOATFIELDCURRENCY_R,@TFLOATFIELDCURRENCY_W,'CURRENCY');
+ {$ENDIF}
+ RegisterPropertyHelper(@TFLOATFIELDVALUE_R,@TFLOATFIELDVALUE_W,'VALUE');
+ RegisterPropertyHelper(@TFLOATFIELDMAXVALUE_R,@TFLOATFIELDMAXVALUE_W,'MAXVALUE');
+ RegisterPropertyHelper(@TFLOATFIELDMINVALUE_R,@TFLOATFIELDMINVALUE_W,'MINVALUE');
+ RegisterPropertyHelper(@TFLOATFIELDPRECISION_R,@TFLOATFIELDPRECISION_W,'PRECISION');
+ end;
+end;
+
+procedure RIRegisterTAUTOINCFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TAUTOINCFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTWORDFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TWORDFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTLARGEINTFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TLARGEINTFIELD) do
+ begin
+ RegisterPropertyHelper(@TLARGEINTFIELDASLARGEINT_R,@TLARGEINTFIELDASLARGEINT_W,'ASLARGEINT');
+ RegisterPropertyHelper(@TLARGEINTFIELDVALUE_R,@TLARGEINTFIELDVALUE_W,'VALUE');
+ RegisterPropertyHelper(@TLARGEINTFIELDMAXVALUE_R,@TLARGEINTFIELDMAXVALUE_W,'MAXVALUE');
+ RegisterPropertyHelper(@TLARGEINTFIELDMINVALUE_R,@TLARGEINTFIELDMINVALUE_W,'MINVALUE');
+ end;
+end;
+
+procedure RIRegisterTSMALLINTFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TSMALLINTFIELD) do
+ begin
+ end;
+end;
+
+procedure RIRegisterTINTEGERFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TINTEGERFIELD) do
+ begin
+ RegisterPropertyHelper(@TINTEGERFIELDVALUE_R,@TINTEGERFIELDVALUE_W,'VALUE');
+ RegisterPropertyHelper(@TINTEGERFIELDMAXVALUE_R,@TINTEGERFIELDMAXVALUE_W,'MAXVALUE');
+ RegisterPropertyHelper(@TINTEGERFIELDMINVALUE_R,@TINTEGERFIELDMINVALUE_W,'MINVALUE');
+ end;
+end;
+
+procedure RIRegisterTNUMERICFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TNUMERICFIELD) do
+ begin
+ RegisterPropertyHelper(@TNUMERICFIELDDISPLAYFORMAT_R,@TNUMERICFIELDDISPLAYFORMAT_W,'DISPLAYFORMAT');
+ RegisterPropertyHelper(@TNUMERICFIELDEDITFORMAT_R,@TNUMERICFIELDEDITFORMAT_W,'EDITFORMAT');
+ end;
+end;
+
+{$IFNDEF FPC}
+procedure RIRegisterTWIDESTRINGFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TWIDESTRINGFIELD) do
+ begin
+ RegisterPropertyHelper(@TWIDESTRINGFIELDVALUE_R,@TWIDESTRINGFIELDVALUE_W,'VALUE');
+ end;
+end;
+{$ENDIF}
+
+procedure RIRegisterTSTRINGFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TSTRINGFIELD) do
+ begin
+ RegisterPropertyHelper(@TSTRINGFIELDVALUE_R,@TSTRINGFIELDVALUE_W,'VALUE');
+ {$IFNDEF FPC}
+ RegisterPropertyHelper(@TSTRINGFIELDFIXEDCHAR_R,@TSTRINGFIELDFIXEDCHAR_W,'FIXEDCHAR');
+ RegisterPropertyHelper(@TSTRINGFIELDTRANSLITERATE_R,@TSTRINGFIELDTRANSLITERATE_W,'TRANSLITERATE');
+ {$ENDIF}
+ end;
+end;
+
+procedure RIRegisterTFIELD(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TFIELD) do
+ begin
+ RegisterMethod(@TFIELD.ASSIGNVALUE, 'ASSIGNVALUE');
+ RegisterVirtualMethod(@TFIELD.CLEAR, 'CLEAR');
+ RegisterMethod(@TFIELD.FOCUSCONTROL, 'FOCUSCONTROL');
+// RegisterMethod(@TFIELD.GETDATA, 'GETDATA');
+ RegisterVirtualMethod(@TFIELD.ISVALIDCHAR, 'ISVALIDCHAR');
+ RegisterMethod(@TFIELD.REFRESHLOOKUPLIST, 'REFRESHLOOKUPLIST');
+// RegisterMethod(@TFIELD.SETDATA, 'SETDATA');
+ RegisterVirtualMethod(@TFIELD.SETFIELDTYPE, 'SETFIELDTYPE');
+// RegisterMethod(@TFIELD.VALIDATE, 'VALIDATE');
+{$IFNDEF FPC}
+
+ RegisterPropertyHelper(@TFIELDEDITMASK_R,@TFIELDEDITMASK_W,'EDITMASK');
+ RegisterPropertyHelper(@TFIELDEDITMASKPTR_R,nil,'EDITMASKPTR');
+ RegisterPropertyHelper(@TFIELDEDITMASK_R,@TFIELDEDITMASK_W,'EDITMASK');
+ RegisterPropertyHelper(@TFIELDEDITMASKPTR_R,nil,'EDITMASKPTR');
+ RegisterPropertyHelper(@TFIELDFULLNAME_R,nil,'FULLNAME');
+ RegisterPropertyHelper(@TFIELDLOOKUP_R,@TFIELDLOOKUP_W,'LOOKUP');
+ RegisterPropertyHelper(@TFIELDPARENTFIELD_R,@TFIELDPARENTFIELD_W,'PARENTFIELD');
+ RegisterPropertyHelper(@TFIELDVALIDCHARS_R,@TFIELDVALIDCHARS_W,'VALIDCHARS');
+ RegisterPropertyHelper(@TFIELDAUTOGENERATEVALUE_R,@TFIELDAUTOGENERATEVALUE_W,'AUTOGENERATEVALUE');
+
+{$IFDEF DELPHI6UP}
+ RegisterPropertyHelper(@TFIELDASBCD_R,@TFIELDASBCD_W,'ASBCD');
+{$ENDIF}
+{$ENDIF}
+ RegisterPropertyHelper(@TFIELDASBOOLEAN_R,@TFIELDASBOOLEAN_W,'ASBOOLEAN');
+ RegisterPropertyHelper(@TFIELDASCURRENCY_R,@TFIELDASCURRENCY_W,'ASCURRENCY');
+ RegisterPropertyHelper(@TFIELDASDATETIME_R,@TFIELDASDATETIME_W,'ASDATETIME');
+ RegisterPropertyHelper(@TFIELDASFLOAT_R,@TFIELDASFLOAT_W,'ASFLOAT');
+ RegisterPropertyHelper(@TFIELDASINTEGER_R,@TFIELDASINTEGER_W,'ASINTEGER');
+ RegisterPropertyHelper(@TFIELDASSTRING_R,@TFIELDASSTRING_W,'ASSTRING');
+ RegisterPropertyHelper(@TFIELDASVARIANT_R,@TFIELDASVARIANT_W,'ASVARIANT');
+ RegisterPropertyHelper(@TFIELDATTRIBUTESET_R,@TFIELDATTRIBUTESET_W,'ATTRIBUTESET');
+ RegisterPropertyHelper(@TFIELDCALCULATED_R,@TFIELDCALCULATED_W,'CALCULATED');
+ RegisterPropertyHelper(@TFIELDCANMODIFY_R,nil,'CANMODIFY');
+ RegisterPropertyHelper(@TFIELDCURVALUE_R,nil,'CURVALUE');
+ RegisterPropertyHelper(@TFIELDDATASET_R,@TFIELDDATASET_W,'DATASET');
+ RegisterPropertyHelper(@TFIELDDATASIZE_R,nil,'DATASIZE');
+ RegisterPropertyHelper(@TFIELDDATATYPE_R,nil,'DATATYPE');
+ RegisterPropertyHelper(@TFIELDDISPLAYNAME_R,nil,'DISPLAYNAME');
+ RegisterPropertyHelper(@TFIELDDISPLAYTEXT_R,nil,'DISPLAYTEXT');
+ RegisterPropertyHelper(@TFIELDFIELDNO_R,nil,'FIELDNO');
+ RegisterPropertyHelper(@TFIELDISINDEXFIELD_R,nil,'ISINDEXFIELD');
+ RegisterPropertyHelper(@TFIELDISNULL_R,nil,'ISNULL');
+ RegisterPropertyHelper(@TFIELDLOOKUPLIST_R,nil,'LOOKUPLIST');
+ RegisterPropertyHelper(@TFIELDNEWVALUE_R,@TFIELDNEWVALUE_W,'NEWVALUE');
+ RegisterPropertyHelper(@TFIELDOFFSET_R,nil,'OFFSET');
+ RegisterPropertyHelper(@TFIELDOLDVALUE_R,nil,'OLDVALUE');
+ RegisterPropertyHelper(@TFIELDSIZE_R,@TFIELDSIZE_W,'SIZE');
+ RegisterPropertyHelper(@TFIELDTEXT_R,@TFIELDTEXT_W,'TEXT');
+ RegisterPropertyHelper(@TFIELDVALUE_R,@TFIELDVALUE_W,'VALUE');
+ RegisterPropertyHelper(@TFIELDALIGNMENT_R,@TFIELDALIGNMENT_W,'ALIGNMENT');
+ RegisterPropertyHelper(@TFIELDCUSTOMCONSTRAINT_R,@TFIELDCUSTOMCONSTRAINT_W,'CUSTOMCONSTRAINT');
+ RegisterPropertyHelper(@TFIELDCONSTRAINTERRORMESSAGE_R,@TFIELDCONSTRAINTERRORMESSAGE_W,'CONSTRAINTERRORMESSAGE');
+ RegisterPropertyHelper(@TFIELDDEFAULTEXPRESSION_R,@TFIELDDEFAULTEXPRESSION_W,'DEFAULTEXPRESSION');
+ RegisterPropertyHelper(@TFIELDDISPLAYLABEL_R,@TFIELDDISPLAYLABEL_W,'DISPLAYLABEL');
+ RegisterPropertyHelper(@TFIELDDISPLAYWIDTH_R,@TFIELDDISPLAYWIDTH_W,'DISPLAYWIDTH');
+ RegisterPropertyHelper(@TFIELDFIELDKIND_R,@TFIELDFIELDKIND_W,'FIELDKIND');
+ RegisterPropertyHelper(@TFIELDFIELDNAME_R,@TFIELDFIELDNAME_W,'FIELDNAME');
+ RegisterPropertyHelper(@TFIELDHASCONSTRAINTS_R,nil,'HASCONSTRAINTS');
+ RegisterPropertyHelper(@TFIELDINDEX_R,@TFIELDINDEX_W,'INDEX');
+ RegisterPropertyHelper(@TFIELDIMPORTEDCONSTRAINT_R,@TFIELDIMPORTEDCONSTRAINT_W,'IMPORTEDCONSTRAINT');
+ RegisterPropertyHelper(@TFIELDLOOKUPDATASET_R,@TFIELDLOOKUPDATASET_W,'LOOKUPDATASET');
+ RegisterPropertyHelper(@TFIELDLOOKUPKEYFIELDS_R,@TFIELDLOOKUPKEYFIELDS_W,'LOOKUPKEYFIELDS');
+ RegisterPropertyHelper(@TFIELDLOOKUPRESULTFIELD_R,@TFIELDLOOKUPRESULTFIELD_W,'LOOKUPRESULTFIELD');
+ RegisterPropertyHelper(@TFIELDKEYFIELDS_R,@TFIELDKEYFIELDS_W,'KEYFIELDS');
+ RegisterPropertyHelper(@TFIELDLOOKUPCACHE_R,@TFIELDLOOKUPCACHE_W,'LOOKUPCACHE');
+ RegisterPropertyHelper(@TFIELDORIGIN_R,@TFIELDORIGIN_W,'ORIGIN');
+ RegisterPropertyHelper(@TFIELDPROVIDERFLAGS_R,@TFIELDPROVIDERFLAGS_W,'PROVIDERFLAGS');
+ RegisterPropertyHelper(@TFIELDREADONLY_R,@TFIELDREADONLY_W,'READONLY');
+ RegisterPropertyHelper(@TFIELDREQUIRED_R,@TFIELDREQUIRED_W,'REQUIRED');
+ RegisterPropertyHelper(@TFIELDVISIBLE_R,@TFIELDVISIBLE_W,'VISIBLE');
+ RegisterEventPropertyHelper(@TFIELDONCHANGE_R,@TFIELDONCHANGE_W,'ONCHANGE');
+ RegisterEventPropertyHelper(@TFIELDONGETTEXT_R,@TFIELDONGETTEXT_W,'ONGETTEXT');
+ RegisterEventPropertyHelper(@TFIELDONSETTEXT_R,@TFIELDONSETTEXT_W,'ONSETTEXT');
+ RegisterEventPropertyHelper(@TFIELDONVALIDATE_R,@TFIELDONVALIDATE_W,'ONVALIDATE');
+ end;
+end;
+
+procedure RIRegisterTLOOKUPLIST(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TLOOKUPLIST) do
+ begin
+ RegisterConstructor(@TLOOKUPLIST.CREATE, 'CREATE');
+ {$IFDEF DELPHI2009UP}
+ RegisterVirtualAbstractMethod(TDefaultLookupList, @TDefaultLookupList.ADD, 'ADD');
+ RegisterVirtualAbstractMethod(TDefaultLookupList, @TDefaultLookupList.CLEAR, 'CLEAR');
+ RegisterVirtualAbstractMethod(TDefaultLookupList, @TDefaultLookupList.VALUEOFKEY, 'VALUEOFKEY');
+ {$ELSE}
+ RegisterMethod(@TLOOKUPLIST.ADD, 'ADD');
+ RegisterMethod(@TLOOKUPLIST.CLEAR, 'CLEAR');
+ RegisterMethod(@TLOOKUPLIST.VALUEOFKEY, 'VALUEOFKEY');
+ {$ENDIF}
+ end;
+end;
+
+procedure RIRegisterTFIELDS(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TFIELDS) do
+ begin
+ RegisterConstructor(@TFIELDS.CREATE, 'CREATE');
+ RegisterMethod(@TFIELDS.ADD, 'ADD');
+ RegisterMethod(@TFIELDS.CHECKFIELDNAME, 'CHECKFIELDNAME');
+ RegisterMethod(@TFIELDS.CHECKFIELDNAMES, 'CHECKFIELDNAMES');
+ RegisterMethod(@TFIELDS.CLEAR, 'CLEAR');
+ RegisterMethod(@TFIELDS.FINDFIELD, 'FINDFIELD');
+ RegisterMethod(@TFIELDS.FIELDBYNAME, 'FIELDBYNAME');
+ RegisterMethod(@TFIELDS.FIELDBYNUMBER, 'FIELDBYNUMBER');
+ RegisterMethod(@TFIELDS.GETFIELDNAMES, 'GETFIELDNAMES');
+ RegisterMethod(@TFIELDS.INDEXOF, 'INDEXOF');
+ RegisterMethod(@TFIELDS.REMOVE, 'REMOVE');
+ RegisterPropertyHelper(@TFIELDSCOUNT_R,nil,'COUNT');
+ RegisterPropertyHelper(@TFIELDSDATASET_R,nil,'DATASET');
+ RegisterPropertyHelper(@TFIELDSFIELDS_R,@TFIELDSFIELDS_W,'FIELDS');
+ end;
+end;
+
+{$IFNDEF FPC}
+procedure RIRegisterTFIELDLIST(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TFIELDLIST) do
+ begin
+ RegisterMethod(@TFIELDLIST.FIELDBYNAME, 'FIELDBYNAME');
+ RegisterMethod(@TFIELDLIST.FIND, 'FIND');
+ RegisterPropertyHelper(@TFIELDLISTFIELDS_R,nil,'FIELDS');
+ end;
+end;
+
+procedure RIRegisterTFIELDDEFLIST(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TFIELDDEFLIST) do
+ begin
+ RegisterMethod(@TFIELDDEFLIST.FIELDBYNAME, 'FIELDBYNAME');
+ RegisterMethod(@TFIELDDEFLIST.FIND, 'FIND');
+ RegisterPropertyHelper(@TFIELDDEFLISTFIELDDEFS_R,nil,'FIELDDEFS');
+ end;
+end;
+
+
+procedure RIRegisterTFLATLIST(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TFLATLIST) do
+ begin
+ RegisterConstructor(@TFLATLIST.CREATE, 'CREATE');
+ RegisterMethod(@TFLATLIST.UPDATE, 'UPDATE');
+ RegisterPropertyHelper(@TFLATLISTDATASET_R,nil,'DATASET');
+ end;
+end;
+{$ENDIF}
+
+
+procedure RIRegisterTINDEXDEFS(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TINDEXDEFS) do
+ begin
+ RegisterConstructor(@TINDEXDEFS.CREATE, 'CREATE');
+ RegisterMethod(@TINDEXDEFS.ADDINDEXDEF, 'ADDINDEXDEF');
+ RegisterMethod(@TINDEXDEFS.FIND, 'FIND');
+ RegisterMethod(@TINDEXDEFS.UPDATE, 'UPDATE');
+ RegisterMethod(@TINDEXDEFS.FINDINDEXFORFIELDS, 'FINDINDEXFORFIELDS');
+ RegisterMethod(@TINDEXDEFS.GETINDEXFORFIELDS, 'GETINDEXFORFIELDS');
+ RegisterMethod(@TINDEXDEFS.ADD, 'ADD');
+ RegisterPropertyHelper(@TINDEXDEFSITEMS_R,@TINDEXDEFSITEMS_W,'ITEMS');
+ end;
+end;
+
+procedure RIRegisterTINDEXDEF(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TINDEXDEF) do
+ begin
+ RegisterConstructor(@TINDEXDEF.CREATE, 'CREATE');
+{$IFNDEF FPC}
+ RegisterPropertyHelper(@TINDEXDEFFIELDEXPRESSION_R,nil,'FIELDEXPRESSION');
+ RegisterPropertyHelper(@TINDEXDEFCASEINSFIELDS_R,@TINDEXDEFCASEINSFIELDS_W,'CASEINSFIELDS');
+ RegisterPropertyHelper(@TINDEXDEFGROUPINGLEVEL_R,@TINDEXDEFGROUPINGLEVEL_W,'GROUPINGLEVEL');
+ RegisterPropertyHelper(@TINDEXDEFDESCFIELDS_R,@TINDEXDEFDESCFIELDS_W,'DESCFIELDS');
+
+{$ENDIF}
+ RegisterPropertyHelper(@TINDEXDEFEXPRESSION_R,@TINDEXDEFEXPRESSION_W,'EXPRESSION');
+ RegisterPropertyHelper(@TINDEXDEFFIELDS_R,@TINDEXDEFFIELDS_W,'FIELDS');
+ RegisterPropertyHelper(@TINDEXDEFOPTIONS_R,@TINDEXDEFOPTIONS_W,'OPTIONS');
+ RegisterPropertyHelper(@TINDEXDEFSOURCE_R,@TINDEXDEFSOURCE_W,'SOURCE');
+ end;
+end;
+
+procedure RIRegisterTFIELDDEFS(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TFIELDDEFS) do
+ begin
+ RegisterConstructor(@TFIELDDEFS.CREATE, 'CREATE');
+ RegisterMethod(@TFIELDDEFS.ADDFIELDDEF, 'ADDFIELDDEF');
+ RegisterMethod(@TFIELDDEFS.FIND, 'FIND');
+ RegisterMethod(@TFIELDDEFS.UPDATE, 'UPDATE');
+{$IFNDEF FPC}
+ RegisterMethod(@TFIELDDEFS.ADD, 'ADD');
+ RegisterPropertyHelper(@TFIELDDEFSPARENTDEF_R,nil,'PARENTDEF');
+
+{$ENDIF}
+ RegisterPropertyHelper(@TFIELDDEFSHIDDENFIELDS_R,@TFIELDDEFSHIDDENFIELDS_W,'HIDDENFIELDS');
+ RegisterPropertyHelper(@TFIELDDEFSITEMS_R,@TFIELDDEFSITEMS_W,'ITEMS');
+ end;
+end;
+
+procedure RIRegisterTFIELDDEF(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TFIELDDEF) do
+ begin
+// RegisterConstructor(@TFIELDDEF.CREATE, 'CREATE');
+{$IFNDEF FPC}
+ RegisterMethod(@TFIELDDEF.ADDCHILD, 'ADDCHILD');
+ RegisterMethod(@TFIELDDEF.HASCHILDDEFS, 'HASCHILDDEFS');
+
+{$ENDIF}
+ RegisterMethod(@TFIELDDEF.CREATEFIELD, 'CREATEFIELD');
+{$IFNDEF FPC}
+ RegisterPropertyHelper(@TFIELDDEFFIELDNO_R,@TFIELDDEFFIELDNO_W,'FIELDNO');
+ RegisterPropertyHelper(@TFIELDDEFPARENTDEF_R,nil,'PARENTDEF');
+ RegisterPropertyHelper(@TFIELDDEFCHILDDEFS_R,@TFIELDDEFCHILDDEFS_W,'CHILDDEFS');
+ RegisterPropertyHelper(@TFIELDDEFREQUIRED_R,@TFIELDDEFREQUIRED_W,'REQUIRED');
+
+{$ENDIF}
+ RegisterPropertyHelper(@TFIELDDEFFIELDCLASS_R,nil,'FIELDCLASS');
+ RegisterPropertyHelper(@TFIELDDEFINTERNALCALCFIELD_R,@TFIELDDEFINTERNALCALCFIELD_W,'INTERNALCALCFIELD');
+ RegisterPropertyHelper(@TFIELDDEFATTRIBUTES_R,@TFIELDDEFATTRIBUTES_W,'ATTRIBUTES');
+ RegisterPropertyHelper(@TFIELDDEFDATATYPE_R,@TFIELDDEFDATATYPE_W,'DATATYPE');
+ RegisterPropertyHelper(@TFIELDDEFPRECISION_R,@TFIELDDEFPRECISION_W,'PRECISION');
+ RegisterPropertyHelper(@TFIELDDEFSIZE_R,@TFIELDDEFSIZE_W,'SIZE');
+ end;
+end;
+
+{$IFNDEF FPC}
+procedure RIRegisterTDEFCOLLECTION(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TDEFCOLLECTION) do
+ begin
+ RegisterConstructor(@TDEFCOLLECTION.CREATE, 'CREATE');
+ RegisterMethod(@TDEFCOLLECTION.FIND, 'FIND');
+ RegisterMethod(@TDEFCOLLECTION.GETITEMNAMES, 'GETITEMNAMES');
+ RegisterMethod(@TDEFCOLLECTION.INDEXOF, 'INDEXOF');
+ RegisterPropertyHelper(@TDEFCOLLECTIONDATASET_R,nil,'DATASET');
+ RegisterPropertyHelper(@TDEFCOLLECTIONUPDATED_R,@TDEFCOLLECTIONUPDATED_W,'UPDATED');
+ end;
+end;
+
+procedure RIRegisterTNAMEDITEM(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TNAMEDITEM) do
+ begin
+ RegisterPropertyHelper(@TNAMEDITEMNAME_R,@TNAMEDITEMNAME_W,'NAME');
+ end;
+end;
+{$ENDIF}
+
+
+procedure RIRegister_DB(CL: TPSRuntimeClassImporter);
+Begin
+RIRegisterTFIELDDEF(Cl);
+RIRegisterTFIELDDEFS(Cl);
+RIRegisterTINDEXDEF(Cl);
+RIRegisterTINDEXDEFS(Cl);
+RIRegisterTFIELDS(Cl);
+RIRegisterTLOOKUPLIST(Cl);
+RIRegisterTFIELD(Cl);
+RIRegisterTSTRINGFIELD(Cl);
+RIRegisterTNUMERICFIELD(Cl);
+RIRegisterTINTEGERFIELD(Cl);
+RIRegisterTSMALLINTFIELD(Cl);
+RIRegisterTLARGEINTFIELD(Cl);
+RIRegisterTWORDFIELD(Cl);
+RIRegisterTAUTOINCFIELD(Cl);
+RIRegisterTFLOATFIELD(Cl);
+RIRegisterTCURRENCYFIELD(Cl);
+RIRegisterTBOOLEANFIELD(Cl);
+RIRegisterTDATETIMEFIELD(Cl);
+RIRegisterTDATEFIELD(Cl);
+RIRegisterTTIMEFIELD(Cl);
+RIRegisterTBINARYFIELD(Cl);
+RIRegisterTBYTESFIELD(Cl);
+RIRegisterTVARBYTESFIELD(Cl);
+{$IFNDEF FPC}
+RIRegisterTNAMEDITEM(Cl);
+RIRegisterTDEFCOLLECTION(Cl);
+RIRegisterTWIDESTRINGFIELD(Cl);
+RIRegisterTFLATLIST(Cl);
+RIRegisterTFIELDDEFLIST(Cl);
+RIRegisterTFIELDLIST(Cl);
+RIRegisterTBCDFIELD(Cl);
+{$IFDEF DELPHI6UP}
+RIRegisterTFMTBCDFIELD(Cl);
+{$ENDIF}
+{$ENDIF}
+
+RIRegisterTBLOBFIELD(Cl);
+RIRegisterTMEMOFIELD(Cl);
+RIRegisterTGRAPHICFIELD(Cl);
+{$IFNDEF FPC}
+RIRegisterTOBJECTFIELD(Cl);
+RIRegisterTADTFIELD(Cl);
+RIRegisterTARRAYFIELD(Cl);
+RIRegisterTDATASETFIELD(Cl);
+RIRegisterTREFERENCEFIELD(Cl);
+RIRegisterTVARIANTFIELD(Cl);
+RIRegisterTGUIDFIELD(Cl);
+{$ENDIF}
+RIRegisterTPARAM(Cl);
+RIRegisterTPARAMS(Cl);
+RIRegisterTDATASET(Cl);
+end;
+
+{$IFDEF USEIMPORTER}
+initialization
+RIImporter.Invoke(RIRegister_DB);
+{$ENDIF}
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_buttons.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_buttons.pas
new file mode 100644
index 0000000..8117e4e
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_buttons.pas
@@ -0,0 +1,38 @@
+
+unit uPSR_buttons;
+{$I PascalScript.inc}
+interface
+uses
+ uPSRuntime, uPSUtils;
+
+
+procedure RIRegisterTSPEEDBUTTON(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTBITBTN(Cl: TPSRuntimeClassImporter);
+
+procedure RIRegister_Buttons(Cl: TPSRuntimeClassImporter);
+
+implementation
+uses
+ Classes{$IFDEF CLX}, QControls, QButtons{$ELSE}, Controls, Buttons{$ENDIF};
+
+procedure RIRegisterTSPEEDBUTTON(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TSPEEDBUTTON);
+end;
+
+
+procedure RIRegisterTBITBTN(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TBITBTN);
+end;
+
+procedure RIRegister_Buttons(Cl: TPSRuntimeClassImporter);
+begin
+ RIRegisterTSPEEDBUTTON(cl);
+ RIRegisterTBITBTN(cl);
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_classes.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_classes.pas
new file mode 100644
index 0000000..b29abc8
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_classes.pas
@@ -0,0 +1,383 @@
+
+unit uPSR_classes;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSRuntime, uPSUtils;
+
+
+procedure RIRegisterTStrings(cl: TPSRuntimeClassImporter; Streams: Boolean);
+procedure RIRegisterTStringList(cl: TPSRuntimeClassImporter);
+{$IFNDEF PS_MINIVCL}
+procedure RIRegisterTBITS(Cl: TPSRuntimeClassImporter);
+{$ENDIF}
+procedure RIRegisterTSTREAM(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTHANDLESTREAM(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFILESTREAM(Cl: TPSRuntimeClassImporter);
+{$IFNDEF PS_MINIVCL}
+procedure RIRegisterTCUSTOMMEMORYSTREAM(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTMEMORYSTREAM(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTRESOURCESTREAM(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTPARSER(Cl: TPSRuntimeClassImporter);
+{$IFDEF DELPHI3UP}
+procedure RIRegisterTOWNEDCOLLECTION(Cl: TPSRuntimeClassImporter);
+{$ENDIF}
+procedure RIRegisterTCOLLECTION(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCOLLECTIONITEM(Cl: TPSRuntimeClassImporter);
+{$ENDIF}
+
+procedure RIRegister_Classes(Cl: TPSRuntimeClassImporter; Streams: Boolean{$IFDEF D4PLUS}=True{$ENDIF});
+
+implementation
+uses
+ Classes;
+
+procedure TStringsCountR(Self: TStrings; var T: Longint); begin T := Self.Count; end;
+
+procedure TStringsTextR(Self: TStrings; var T: string); begin T := Self.Text; end;
+procedure TStringsTextW(Self: TStrings; T: string); begin Self.Text:= T; end;
+
+procedure TStringsCommaTextR(Self: TStrings; var T: string); begin T := Self.CommaText; end;
+procedure TStringsCommaTextW(Self: TStrings; T: string); begin Self.CommaText:= T; end;
+
+procedure TStringsObjectsR(Self: TStrings; var T: TObject; I: Longint);
+begin
+T := Self.Objects[I];
+end;
+procedure TStringsObjectsW(Self: TStrings; const T: TObject; I: Longint);
+begin
+ Self.Objects[I]:= T;
+end;
+
+procedure TStringsStringsR(Self: TStrings; var T: string; I: Longint);
+begin
+T := Self.Strings[I];
+end;
+procedure TStringsStringsW(Self: TStrings; const T: string; I: Longint);
+begin
+ Self.Strings[I]:= T;
+end;
+
+procedure TStringsNamesR(Self: TStrings; var T: string; I: Longint);
+begin
+T := Self.Names[I];
+end;
+procedure TStringsValuesR(Self: TStrings; var T: string; const I: string);
+begin
+T := Self.Values[I];
+end;
+procedure TStringsValuesW(Self: TStrings; Const T, I: String);
+begin
+ Self.Values[I]:= T;
+end;
+
+procedure RIRegisterTStrings(cl: TPSRuntimeClassImporter; Streams: Boolean); // requires TPersistent
+begin
+ with Cl.Add(TStrings) do
+ begin
+ RegisterVirtualMethod(@TStrings.Add, 'ADD');
+ RegisterMethod(@TStrings.Append, 'APPEND');
+ RegisterVirtualMethod(@TStrings.AddStrings, 'ADDSTRINGS');
+ RegisterVirtualAbstractMethod(TStringList, @TStringList.Clear, 'CLEAR');
+ RegisterVirtualAbstractMethod(TStringList, @TStringList.Delete, 'DELETE');
+ RegisterVirtualMethod(@TStrings.IndexOf, 'INDEXOF');
+ RegisterVirtualAbstractMethod(TStringList, @TStringList.Insert, 'INSERT');
+ RegisterPropertyHelper(@TStringsCountR, nil, 'COUNT');
+ RegisterPropertyHelper(@TStringsTextR, @TStringsTextW, 'TEXT');
+ RegisterPropertyHelper(@TStringsCommaTextR, @TStringsCommatextW, 'COMMATEXT');
+ if Streams then
+ begin
+ RegisterVirtualMethod(@TStrings.LoadFromFile, 'LOADFROMFILE');
+ RegisterVirtualMethod(@TStrings.SaveToFile, 'SAVETOFILE');
+ end;
+ RegisterPropertyHelper(@TStringsStringsR, @TStringsStringsW, 'STRINGS');
+ RegisterPropertyHelper(@TStringsObjectsR, @TStringsObjectsW, 'OBJECTS');
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod(@TStrings.BeginUpdate, 'BEGINUPDATE');
+ RegisterMethod(@TStrings.EndUpdate, 'ENDUPDATE');
+ RegisterMethod(@TStrings.Equals, 'EQUALS');
+ RegisterVirtualMethod(@TStrings.Exchange, 'EXCHANGE');
+ RegisterMethod(@TStrings.IndexOfName, 'INDEXOFNAME');
+ if Streams then
+ RegisterVirtualMethod(@TStrings.LoadFromStream, 'LOADFROMSTREAM');
+ RegisterVirtualMethod(@TStrings.Move, 'MOVE');
+ if Streams then
+ RegisterVirtualMethod(@TStrings.SaveToStream, 'SAVETOSTREAM');
+ RegisterVirtualMethod(@TStrings.SetText, 'SETTEXT');
+ RegisterPropertyHelper(@TStringsNamesR, nil, 'NAMES');
+ RegisterPropertyHelper(@TStringsValuesR, @TStringsValuesW, 'VALUES');
+ RegisterVirtualMethod(@TSTRINGS.ADDOBJECT, 'ADDOBJECT');
+ RegisterVirtualMethod(@TSTRINGS.GETTEXT, 'GETTEXT');
+ RegisterMethod(@TSTRINGS.INDEXOFOBJECT, 'INDEXOFOBJECT');
+ RegisterMethod(@TSTRINGS.INSERTOBJECT, 'INSERTOBJECT');
+ {$ENDIF}
+ end;
+end;
+
+procedure TSTRINGLISTDUPLICATES_R(Self: TSTRINGLIST; var T: TDUPLICATES); begin T := Self.DUPLICATES; end;
+procedure TSTRINGLISTDUPLICATES_W(Self: TSTRINGLIST; const T: TDUPLICATES); begin Self.DUPLICATES := T; end;
+procedure TSTRINGLISTSORTED_R(Self: TSTRINGLIST; var T: BOOLEAN); begin T := Self.SORTED; end;
+procedure TSTRINGLISTSORTED_W(Self: TSTRINGLIST; const T: BOOLEAN); begin Self.SORTED := T; end;
+procedure TSTRINGLISTONCHANGE_R(Self: TSTRINGLIST; var T: TNOTIFYEVENT);
+begin
+T := Self.ONCHANGE; end;
+procedure TSTRINGLISTONCHANGE_W(Self: TSTRINGLIST; const T: TNOTIFYEVENT);
+begin
+Self.ONCHANGE := T; end;
+procedure TSTRINGLISTONCHANGING_R(Self: TSTRINGLIST; var T: TNOTIFYEVENT); begin T := Self.ONCHANGING; end;
+procedure TSTRINGLISTONCHANGING_W(Self: TSTRINGLIST; const T: TNOTIFYEVENT); begin Self.ONCHANGING := T; end;
+procedure RIRegisterTSTRINGLIST(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TSTRINGLIST) do
+ begin
+ RegisterVirtualMethod(@TSTRINGLIST.FIND, 'FIND');
+ RegisterVirtualMethod(@TSTRINGLIST.SORT, 'SORT');
+ RegisterPropertyHelper(@TSTRINGLISTDUPLICATES_R, @TSTRINGLISTDUPLICATES_W, 'DUPLICATES');
+ RegisterPropertyHelper(@TSTRINGLISTSORTED_R, @TSTRINGLISTSORTED_W, 'SORTED');
+ RegisterEventPropertyHelper(@TSTRINGLISTONCHANGE_R, @TSTRINGLISTONCHANGE_W, 'ONCHANGE');
+ RegisterEventPropertyHelper(@TSTRINGLISTONCHANGING_R, @TSTRINGLISTONCHANGING_W, 'ONCHANGING');
+ end;
+end;
+
+{$IFNDEF PS_MINIVCL}
+procedure TBITSBITS_W(Self: TBITS; T: BOOLEAN; t1: INTEGER); begin Self.BITS[t1] := T; end;
+procedure TBITSBITS_R(Self: TBITS; var T: BOOLEAN; t1: INTEGER); begin T := Self.Bits[t1]; end;
+procedure TBITSSIZE_R(Self: TBITS; T: INTEGER); begin Self.SIZE := T; end;
+procedure TBITSSIZE_W(Self: TBITS; var T: INTEGER); begin T := Self.SIZE; end;
+
+procedure RIRegisterTBITS(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TBITS) do
+ begin
+ RegisterMethod(@TBITS.OPENBIT, 'OPENBIT');
+ RegisterPropertyHelper(@TBITSBITS_R, @TBITSBITS_W, 'BITS');
+ RegisterPropertyHelper(@TBITSSIZE_R, @TBITSSIZE_W, 'SIZE');
+ end;
+end;
+{$ENDIF}
+
+procedure TSTREAMPOSITION_R(Self: TSTREAM; var T: LONGINT); begin t := Self.POSITION; end;
+procedure TSTREAMPOSITION_W(Self: TSTREAM; T: LONGINT); begin Self.POSITION := t; end;
+procedure TSTREAMSIZE_R(Self: TSTREAM; var T: LONGINT); begin t := Self.SIZE; end;
+{$IFDEF DELPHI3UP}
+procedure TSTREAMSIZE_W(Self: TSTREAM; T: LONGINT); begin Self.SIZE := t; end;
+{$ENDIF}
+
+procedure RIRegisterTSTREAM(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TSTREAM) do
+ begin
+ RegisterVirtualAbstractMethod(TMemoryStream, @TMemoryStream.READ, 'READ');
+ RegisterVirtualAbstractMethod(TMemoryStream, @TMemoryStream.WRITE, 'WRITE');
+ RegisterVirtualAbstractMethod(TMemoryStream, @TMemoryStream.SEEK, 'SEEK');
+ RegisterMethod(@TSTREAM.READBUFFER, 'READBUFFER');
+ RegisterMethod(@TSTREAM.WRITEBUFFER, 'WRITEBUFFER');
+ RegisterMethod(@TSTREAM.COPYFROM, 'COPYFROM');
+ RegisterPropertyHelper(@TSTREAMPOSITION_R, @TSTREAMPOSITION_W, 'POSITION');
+ RegisterPropertyHelper(@TSTREAMSIZE_R, {$IFDEF DELPHI3UP}@TSTREAMSIZE_W, {$ELSE}nil, {$ENDIF}'SIZE');
+ end;
+end;
+
+procedure THANDLESTREAMHANDLE_R(Self: THANDLESTREAM; var T: INTEGER); begin T := Self.HANDLE; end;
+
+procedure RIRegisterTHANDLESTREAM(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(THANDLESTREAM) do
+ begin
+ RegisterConstructor(@THANDLESTREAM.CREATE, 'CREATE');
+ RegisterPropertyHelper(@THANDLESTREAMHANDLE_R, nil, 'HANDLE');
+ end;
+end;
+
+{$IFDEF FPC}
+// mh: because FPC doesn't handle pointers to overloaded functions
+function TFileStreamCreate(filename: string; mode: word): TFileStream;
+begin
+ result := TFilestream.Create(filename, mode);
+end;
+{$ENDIF}
+
+procedure RIRegisterTFILESTREAM(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TFILESTREAM) do
+ begin
+ {$IFDEF FPC}
+ RegisterConstructor(@TFileStreamCreate, 'CREATE');
+ {$ELSE}
+ RegisterConstructor(@TFILESTREAM.CREATE, 'CREATE');
+ {$ENDIF}
+ end;
+end;
+
+{$IFNDEF PS_MINIVCL}
+procedure RIRegisterTCUSTOMMEMORYSTREAM(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TCUSTOMMEMORYSTREAM) do
+ begin
+ RegisterMethod(@TCUSTOMMEMORYSTREAM.SAVETOSTREAM, 'SAVETOSTREAM');
+ RegisterMethod(@TCUSTOMMEMORYSTREAM.SAVETOFILE, 'SAVETOFILE');
+ end;
+end;
+
+procedure RIRegisterTMEMORYSTREAM(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TMEMORYSTREAM) do
+ begin
+ RegisterMethod(@TMEMORYSTREAM.CLEAR, 'CLEAR');
+ RegisterMethod(@TMEMORYSTREAM.LOADFROMSTREAM, 'LOADFROMSTREAM');
+ RegisterMethod(@TMEMORYSTREAM.LOADFROMFILE, 'LOADFROMFILE');
+ RegisterMethod(@TMEMORYSTREAM.SETSIZE, 'SETSIZE');
+ end;
+end;
+
+procedure RIRegisterTRESOURCESTREAM(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TRESOURCESTREAM) do
+ begin
+ RegisterConstructor(@TRESOURCESTREAM.CREATE, 'CREATE');
+ RegisterConstructor(@TRESOURCESTREAM.CREATEFROMID, 'CREATEFROMID');
+ end;
+end;
+
+procedure TPARSERSOURCELINE_R(Self: TPARSER; var T: INTEGER); begin T := Self.SOURCELINE; end;
+procedure TPARSERTOKEN_R(Self: TPARSER; var T: CHAR); begin T := Self.TOKEN; end;
+
+procedure RIRegisterTPARSER(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TPARSER) do
+ begin
+ RegisterConstructor(@TPARSER.CREATE, 'CREATE');
+ RegisterMethod(@TPARSER.CHECKTOKEN, 'CHECKTOKEN');
+ RegisterMethod(@TPARSER.CHECKTOKENSYMBOL, 'CHECKTOKENSYMBOL');
+ RegisterMethod(@TPARSER.ERROR, 'ERROR');
+ RegisterMethod(@TPARSER.ERRORSTR, 'ERRORSTR');
+ RegisterMethod(@TPARSER.HEXTOBINARY, 'HEXTOBINARY');
+ RegisterMethod(@TPARSER.NEXTTOKEN, 'NEXTTOKEN');
+ RegisterMethod(@TPARSER.SOURCEPOS, 'SOURCEPOS');
+ RegisterMethod(@TPARSER.TOKENCOMPONENTIDENT, 'TOKENCOMPONENTIDENT');
+ RegisterMethod(@TPARSER.TOKENFLOAT, 'TOKENFLOAT');
+ RegisterMethod(@TPARSER.TOKENINT, 'TOKENINT');
+ RegisterMethod(@TPARSER.TOKENSTRING, 'TOKENSTRING');
+ RegisterMethod(@TPARSER.TOKENSYMBOLIS, 'TOKENSYMBOLIS');
+ RegisterPropertyHelper(@TPARSERSOURCELINE_R, nil, 'SOURCELINE');
+ RegisterPropertyHelper(@TPARSERTOKEN_R, nil, 'TOKEN');
+ end;
+end;
+
+procedure TCOLLECTIONITEMS_W(Self: TCOLLECTION; const T: TCOLLECTIONITEM; const t1: INTEGER);
+begin Self.ITEMS[t1] := T; end;
+
+procedure TCOLLECTIONITEMS_R(Self: TCOLLECTION; var T: TCOLLECTIONITEM; const t1: INTEGER);
+begin T := Self.ITEMS[t1]; end;
+
+{$IFDEF DELPHI3UP}
+procedure TCOLLECTIONITEMCLASS_R(Self: TCOLLECTION; var T: TCOLLECTIONITEMCLASS);
+begin T := Self.ITEMCLASS; end;
+{$ENDIF}
+
+procedure TCOLLECTIONCOUNT_R(Self: TCOLLECTION; var T: INTEGER);
+begin T := Self.COUNT; end;
+
+{$IFDEF DELPHI3UP}
+procedure TCOLLECTIONITEMDISPLAYNAME_W(Self: TCOLLECTIONITEM; const T: STRING);
+begin Self.DISPLAYNAME := T; end;
+{$ENDIF}
+
+{$IFDEF DELPHI3UP}
+procedure TCOLLECTIONITEMDISPLAYNAME_R(Self: TCOLLECTIONITEM; var T: STRING);
+begin T := Self.DISPLAYNAME; end;
+{$ENDIF}
+
+procedure TCOLLECTIONITEMINDEX_W(Self: TCOLLECTIONITEM; const T: INTEGER);
+begin Self.INDEX := T; end;
+
+procedure TCOLLECTIONITEMINDEX_R(Self: TCOLLECTIONITEM; var T: INTEGER);
+begin T := Self.INDEX; end;
+
+{$IFDEF DELPHI3UP}
+procedure TCOLLECTIONITEMID_R(Self: TCOLLECTIONITEM; var T: INTEGER);
+begin T := Self.ID; end;
+{$ENDIF}
+
+procedure TCOLLECTIONITEMCOLLECTION_W(Self: TCOLLECTIONITEM; const T: TCOLLECTION);
+begin Self.COLLECTION := T; end;
+
+procedure TCOLLECTIONITEMCOLLECTION_R(Self: TCOLLECTIONITEM; var T: TCOLLECTION);
+begin T := Self.COLLECTION; end;
+
+{$IFDEF DELPHI3UP}
+procedure RIRegisterTOWNEDCOLLECTION(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TOWNEDCOLLECTION) do
+ begin
+ RegisterConstructor(@TOWNEDCOLLECTION.CREATE, 'CREATE');
+ end;
+end;
+{$ENDIF}
+
+procedure RIRegisterTCOLLECTION(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TCOLLECTION) do
+ begin
+ RegisterConstructor(@TCOLLECTION.CREATE, 'CREATE');
+{$IFDEF DELPHI6UP} {$IFNDEF FPC} RegisterMethod(@TCOLLECTION.OWNER, 'OWNER'); {$ENDIF} {$ENDIF} // no owner in FPC
+ RegisterMethod(@TCOLLECTION.ADD, 'ADD');
+ RegisterVirtualMethod(@TCOLLECTION.BEGINUPDATE, 'BEGINUPDATE');
+ RegisterMethod(@TCOLLECTION.CLEAR, 'CLEAR');
+{$IFDEF DELPHI5UP} RegisterMethod(@TCOLLECTION.DELETE, 'DELETE'); {$ENDIF}
+ RegisterVirtualMethod(@TCOLLECTION.ENDUPDATE, 'ENDUPDATE');
+{$IFDEF DELPHI3UP} RegisterMethod(@TCOLLECTION.FINDITEMID, 'FINDITEMID'); {$ENDIF}
+{$IFDEF DELPHI3UP} RegisterMethod(@TCOLLECTION.INSERT, 'INSERT'); {$ENDIF}
+ RegisterPropertyHelper(@TCOLLECTIONCOUNT_R,nil,'COUNT');
+{$IFDEF DELPHI3UP} RegisterPropertyHelper(@TCOLLECTIONITEMCLASS_R,nil,'ITEMCLASS'); {$ENDIF}
+ RegisterPropertyHelper(@TCOLLECTIONITEMS_R,@TCOLLECTIONITEMS_W,'ITEMS');
+ end;
+end;
+
+procedure RIRegisterTCOLLECTIONITEM(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TCOLLECTIONITEM) do
+ begin
+ RegisterVirtualConstructor(@TCOLLECTIONITEM.CREATE, 'CREATE');
+ RegisterPropertyHelper(@TCOLLECTIONITEMCOLLECTION_R,@TCOLLECTIONITEMCOLLECTION_W,'COLLECTION');
+{$IFDEF DELPHI3UP} RegisterPropertyHelper(@TCOLLECTIONITEMID_R,nil,'ID'); {$ENDIF}
+ RegisterPropertyHelper(@TCOLLECTIONITEMINDEX_R,@TCOLLECTIONITEMINDEX_W,'INDEX');
+{$IFDEF DELPHI3UP} RegisterPropertyHelper(@TCOLLECTIONITEMDISPLAYNAME_R,@TCOLLECTIONITEMDISPLAYNAME_W,'DISPLAYNAME'); {$ENDIF}
+ end;
+end;
+{$ENDIF}
+
+procedure RIRegister_Classes(Cl: TPSRuntimeClassImporter; Streams: Boolean);
+begin
+ if Streams then
+ RIRegisterTSTREAM(Cl);
+ RIRegisterTStrings(cl, Streams);
+ RIRegisterTStringList(cl);
+ {$IFNDEF PS_MINIVCL}
+ RIRegisterTBITS(cl);
+ {$ENDIF}
+ if Streams then
+ begin
+ RIRegisterTHANDLESTREAM(Cl);
+ RIRegisterTFILESTREAM(Cl);
+ {$IFNDEF PS_MINIVCL}
+ RIRegisterTCUSTOMMEMORYSTREAM(Cl);
+ RIRegisterTMEMORYSTREAM(Cl);
+ RIRegisterTRESOURCESTREAM(Cl);
+ {$ENDIF}
+ end;
+ {$IFNDEF PS_MINIVCL}
+ RIRegisterTPARSER(Cl);
+ RIRegisterTCOLLECTIONITEM(Cl);
+ RIRegisterTCOLLECTION(Cl);
+ {$IFDEF DELPHI3UP}
+ RIRegisterTOWNEDCOLLECTION(Cl);
+ {$ENDIF}
+ {$ENDIF}
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_comobj.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_comobj.pas
new file mode 100644
index 0000000..3d354aa
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_comobj.pas
@@ -0,0 +1,103 @@
+
+
+unit uPSR_comobj;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSRuntime, uPSUtils;
+
+
+procedure RIRegister_ComObj(cl: TPSExec);
+
+implementation
+uses
+{$IFDEF DELPHI3UP}
+ ComObj;
+{$ELSE}
+ SysUtils, Ole2;
+{$ENDIF}
+{$IFNDEF DELPHI3UP}
+
+{$IFDEF DELPHI3UP }
+resourceString
+{$ELSE }
+const
+{$ENDIF }
+
+ RPS_OLEError = 'OLE error %.8x';
+function OleErrorMessage(ErrorCode: HResult): String;
+begin
+ Result := SysErrorMessage(ErrorCode);
+ if Result = '' then
+ Result := Format(RPS_OLEError, [ErrorCode]);
+end;
+
+procedure OleError(ErrorCode: HResult);
+begin
+ raise Exception.Create(OleErrorMessage(ErrorCode));
+end;
+
+procedure OleCheck(Result: HResult);
+begin
+ if Result < 0 then OleError(Result);
+end;
+
+procedure CreateOleObject(const ClassName: string; var Disp: IDispatch);
+var
+ OldDisp: IDispatch;
+ ClassID: TCLSID;
+ WideCharBuf: array[0..127] of WideChar;
+begin
+ StringToWideChar(ClassName, WideCharBuf, SizeOf(WideCharBuf) div SizeOf(WideCharBuf[0]));
+ OleCheck(CLSIDFromProgID(WideCharBuf, ClassID));
+ if Disp <> nil then
+ begin
+ OldDisp := Disp;
+ Disp := nil;
+ OldDisp.Release;
+ end;
+ OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
+ CLSCTX_LOCAL_SERVER, IID_IDispatch, Disp));
+end;
+
+procedure GetActiveOleObject(const ClassName: string; var Disp: IDispatch);
+var
+ Unknown: IUnknown;
+ OldDisp: IDispatch;
+ ClassID: TCLSID;
+ WideCharBuf: array[0..127] of WideChar;
+begin
+ StringToWideChar(ClassName, WideCharBuf, SizeOf(WideCharBuf) div SizeOf(WideCharBuf[0]));
+ OleCheck(CLSIDFromProgID(WideCharBuf, ClassID));
+ OleCheck(GetActiveObject(ClassID, nil, Unknown));
+ try
+ if Disp <> nil then
+ begin
+ OldDisp := Disp;
+ Disp := nil;
+ OldDisp.Release;
+ end;
+ OleCheck(Unknown.QueryInterface(IID_IDispatch, Disp));
+ finally
+ Unknown.Release;
+ end;
+end;
+
+{$ENDIF}
+
+
+procedure RIRegister_ComObj(cl: TPSExec);
+begin
+ cl.RegisterDelphiFunction(@OleCheck, 'OleCheck', cdRegister);
+{$IFNDEF PS_NOINTERFACES}
+{$IFDEF DELPHI3UP}
+ cl.RegisterDelphiFunction(@StringToGUID, 'StringToGUID', cdRegister);
+ cl.RegisterDelphiFunction(@CreateComObject, 'CreateComObject', cdRegister);
+{$ENDIF}
+{$ENDIF}
+ cl.RegisterDelphiFunction(@CreateOleObject, 'CREATEOLEOBJECT', cdRegister);
+ cl.RegisterDelphiFunction(@GetActiveOleObject, 'GETACTIVEOLEOBJECT', cdRegister);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_controls.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_controls.pas
new file mode 100644
index 0000000..4bac801
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_controls.pas
@@ -0,0 +1,249 @@
+
+unit uPSR_controls;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSRuntime, uPSUtils;
+
+
+
+
+procedure RIRegisterTControl(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTWinControl(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTGraphicControl(cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCustomControl(cl: TPSRuntimeClassImporter);
+procedure RIRegister_TDragObject(CL: TPSRuntimeClassImporter);
+
+procedure RIRegister_Controls(Cl: TPSRuntimeClassImporter);
+
+implementation
+{$IFNDEF FPC}
+uses
+ Classes{$IFDEF CLX}, QControls, QGraphics{$ELSE}, Controls, Graphics, Windows{$ENDIF};
+{$ELSE}
+uses
+ Classes, Controls, Graphics;
+{$ENDIF}
+
+procedure TControlAlignR(Self: TControl; var T: Byte); begin T := Byte(Self.Align); end;
+procedure TControlAlignW(Self: TControl; T: Byte); begin Self.Align:= TAlign(T); end;
+
+procedure TControlClientHeightR(Self: TControl; var T: Longint); begin T := Self.ClientHeight; end;
+procedure TControlClientHeightW(Self: TControl; T: Longint); begin Self.ClientHeight := T; end;
+
+procedure TControlClientWidthR(Self: TControl; var T: Longint); begin T := Self.ClientWidth; end;
+procedure TControlClientWidthW(Self: TControl; T: Longint); begin Self.ClientWidth:= T; end;
+
+procedure TControlShowHintR(Self: TControl; var T: Boolean); begin T := Self.ShowHint; end;
+procedure TControlShowHintW(Self: TControl; T: Boolean); begin Self.ShowHint:= T; end;
+
+procedure TControlVisibleR(Self: TControl; var T: Boolean); begin T := Self.Visible; end;
+procedure TControlVisibleW(Self: TControl; T: Boolean); begin Self.Visible:= T; end;
+
+procedure TControlParentR(Self: TControl; var T: TWinControl); begin T := Self.Parent; end;
+procedure TControlParentW(Self: TControl; T: TWinControl); begin Self.Parent:= T; end;
+
+
+procedure TCONTROLSHOWHINT_W(Self: TCONTROL; T: BOOLEAN); begin Self.SHOWHINT := T; end;
+procedure TCONTROLSHOWHINT_R(Self: TCONTROL; var T: BOOLEAN); begin T := Self.SHOWHINT; end;
+procedure TCONTROLENABLED_W(Self: TCONTROL; T: BOOLEAN); begin Self.ENABLED := T; end;
+procedure TCONTROLENABLED_R(Self: TCONTROL; var T: BOOLEAN); begin T := Self.ENABLED; end;
+
+procedure RIRegisterTControl(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TControl) do
+ begin
+ RegisterVirtualConstructor(@TControl.Create, 'CREATE');
+ RegisterMethod(@TControl.BRingToFront, 'BRINGTOFRONT');
+ RegisterMethod(@TControl.Hide, 'HIDE');
+ RegisterVirtualMethod(@TControl.Invalidate, 'INVALIDATE');
+ RegisterMethod(@TControl.Refresh, 'REFRESH');
+ RegisterVirtualMethod(@TControl.Repaint, 'REPAINT');
+ RegisterMethod(@TControl.SendToBack, 'SENDTOBACK');
+ RegisterMethod(@TControl.Show, 'SHOW');
+ RegisterVirtualMethod(@TControl.Update, 'UPDATE');
+ RegisterVirtualMethod(@TControl.SetBounds, 'SETBOUNDS');
+
+ RegisterPropertyHelper(@TControlShowHintR, @TControlShowHintW, 'SHOWHINT');
+ RegisterPropertyHelper(@TControlAlignR, @TControlAlignW, 'ALIGN');
+ RegisterPropertyHelper(@TControlClientHeightR, @TControlClientHeightW, 'CLIENTHEIGHT');
+ RegisterPropertyHelper(@TControlClientWidthR, @TControlClientWidthW, 'CLIENTWIDTH');
+ RegisterPropertyHelper(@TControlVisibleR, @TControlVisibleW, 'VISIBLE');
+ RegisterPropertyHelper(@TCONTROLENABLED_R, @TCONTROLENABLED_W, 'ENABLED');
+
+ RegisterPropertyHelper(@TControlParentR, @TControlParentW, 'PARENT');
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod(@TControl.Dragging, 'DRAGGING');
+ RegisterMethod(@TControl.HasParent, 'HASPARENT');
+ RegisterMethod(@TCONTROL.CLIENTTOSCREEN, 'CLIENTTOSCREEN');
+ RegisterMethod(@TCONTROL.DRAGGING, 'DRAGGING');
+ {$IFNDEF FPC}
+ RegisterMethod(@TCONTROL.BEGINDRAG, 'BEGINDRAG');
+ RegisterMethod(@TCONTROL.ENDDRAG, 'ENDDRAG');
+ {$ENDIF}
+ {$IFNDEF CLX}
+ RegisterMethod(@TCONTROL.GETTEXTBUF, 'GETTEXTBUF');
+ RegisterMethod(@TCONTROL.GETTEXTLEN, 'GETTEXTLEN');
+ RegisterMethod(@TCONTROL.PERFORM, 'PERFORM');
+ RegisterMethod(@TCONTROL.SETTEXTBUF, 'SETTEXTBUF');
+ {$ENDIF}
+ RegisterMethod(@TCONTROL.SCREENTOCLIENT, 'SCREENTOCLIENT');
+ {$ENDIF}
+ end;
+end;
+{$IFNDEF CLX}
+procedure TWinControlHandleR(Self: TWinControl; var T: Longint); begin T := Self.Handle; end;
+{$ENDIF}
+procedure TWinControlShowingR(Self: TWinControl; var T: Boolean); begin T := Self.Showing; end;
+
+
+procedure TWinControlTabOrderR(Self: TWinControl; var T: Longint); begin T := Self.TabOrder; end;
+procedure TWinControlTabOrderW(Self: TWinControl; T: Longint); begin Self.TabOrder:= T; end;
+
+procedure TWinControlTabStopR(Self: TWinControl; var T: Boolean); begin T := Self.TabStop; end;
+procedure TWinControlTabStopW(Self: TWinControl; T: Boolean); begin Self.TabStop:= T; end;
+procedure TWINCONTROLBRUSH_R(Self: TWINCONTROL; var T: TBRUSH); begin T := Self.BRUSH; end;
+procedure TWINCONTROLCONTROLS_R(Self: TWINCONTROL; var T: TCONTROL; t1: INTEGER); begin t := Self.CONTROLS[t1]; end;
+procedure TWINCONTROLCONTROLCOUNT_R(Self: TWINCONTROL; var T: INTEGER); begin t := Self.CONTROLCOUNT; end;
+
+procedure RIRegisterTWinControl(Cl: TPSRuntimeClassImporter); // requires TControl
+begin
+ with Cl.Add(TWinControl) do
+ begin
+ {$IFNDEF CLX}
+ RegisterPropertyHelper(@TWinControlHandleR, nil, 'HANDLE');
+ {$ENDIF}
+ RegisterPropertyHelper(@TWinControlShowingR, nil, 'SHOWING');
+ RegisterPropertyHelper(@TWinControlTabOrderR, @TWinControlTabOrderW, 'TABORDER');
+ RegisterPropertyHelper(@TWinControlTabStopR, @TWinControlTabStopW, 'TABSTOP');
+ RegisterMethod(@TWINCONTROL.CANFOCUS, 'CANFOCUS');
+ RegisterMethod(@TWINCONTROL.FOCUSED, 'FOCUSED');
+ RegisterPropertyHelper(@TWINCONTROLCONTROLS_R, nil, 'CONTROLS');
+ RegisterPropertyHelper(@TWINCONTROLCONTROLCOUNT_R, nil, 'CONTROLCOUNT');
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod(@TWinControl.HandleAllocated, 'HANDLEALLOCATED');
+ RegisterMethod(@TWinControl.HandleNeeded, 'HANDLENEEDED');
+ RegisterMethod(@TWinControl.EnableAlign, 'ENABLEALIGN');
+ RegisterMethod(@TWinControl.RemoveControl, 'REMOVECONTROL');
+ {$IFNDEF FPC}
+ RegisterMethod(@TWinControl.InsertControl, 'INSERTCONTROL');
+ RegisterMethod(@TWinControl.ScaleBy, 'SCALEBY');
+ RegisterMethod(@TWinControl.ScrollBy, 'SCROLLBY');
+ {$IFNDEF CLX}
+ RegisterMethod(@TWINCONTROL.PAINTTO, 'PAINTTO');
+ {$ENDIF}
+ {$ENDIF}{FPC}
+ RegisterMethod(@TWinControl.Realign, 'REALIGN');
+ RegisterVirtualMethod(@TWinControl.SetFocus, 'SETFOCUS');
+ RegisterMethod(@TWINCONTROL.CONTAINSCONTROL, 'CONTAINSCONTROL');
+ RegisterMethod(@TWINCONTROL.DISABLEALIGN, 'DISABLEALIGN');
+ RegisterMethod(@TWINCONTROL.UPDATECONTROLSTATE, 'UPDATECONTROLSTATE');
+ RegisterPropertyHelper(@TWINCONTROLBRUSH_R, nil, 'BRUSH');
+ {$ENDIF}
+ end;
+end;
+
+procedure RIRegisterTGraphicControl(cl: TPSRuntimeClassImporter); // requires TControl
+begin
+ Cl.Add(TGraphicControl);
+end;
+procedure RIRegisterTCustomControl(cl: TPSRuntimeClassImporter); // requires TControl
+begin
+ Cl.Add(TCustomControl);
+end;
+
+{$IFDEF DELPHI4UP}
+(* === run-time registration functions === *)
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectMouseDeltaY_R(Self: TDragObject; var T: Double);
+begin T := Self.MouseDeltaY; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectMouseDeltaX_R(Self: TDragObject; var T: Double);
+begin T := Self.MouseDeltaX; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectDragTarget_W(Self: TDragObject; const T: Pointer);
+begin Self.DragTarget := T; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectDragTarget_R(Self: TDragObject; var T: Pointer);
+begin T := Self.DragTarget; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectDragTargetPos_W(Self: TDragObject; const T: TPoint);
+begin Self.DragTargetPos := T; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectDragTargetPos_R(Self: TDragObject; var T: TPoint);
+begin T := Self.DragTargetPos; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectDragPos_W(Self: TDragObject; const T: TPoint);
+begin Self.DragPos := T; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectDragPos_R(Self: TDragObject; var T: TPoint);
+begin T := Self.DragPos; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectDragHandle_W(Self: TDragObject; const T: HWND);
+begin Self.DragHandle := T; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectDragHandle_R(Self: TDragObject; var T: HWND);
+begin T := Self.DragHandle; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectCancelling_W(Self: TDragObject; const T: Boolean);
+begin Self.Cancelling := T; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TDragObjectCancelling_R(Self: TDragObject; var T: Boolean);
+begin T := Self.Cancelling; end;
+{$ENDIF}
+(*----------------------------------------------------------------------------*)
+procedure RIRegister_TDragObject(CL: TPSRuntimeClassImporter);
+begin
+ with CL.Add(TDragObject) do
+ begin
+{$IFNDEF PS_MINIVCL}
+{$IFDEF DELPHI4UP}
+ RegisterVirtualMethod(@TDragObject.Assign, 'Assign');
+{$ENDIF}
+{$IFNDEF FPC}
+ RegisterVirtualMethod(@TDragObject.GetName, 'GetName');
+ RegisterVirtualMethod(@TDragObject.Instance, 'Instance');
+{$ENDIF}
+ RegisterVirtualMethod(@TDragObject.HideDragImage, 'HideDragImage');
+ RegisterVirtualMethod(@TDragObject.ShowDragImage, 'ShowDragImage');
+{$IFDEF DELPHI4UP}
+ RegisterPropertyHelper(@TDragObjectCancelling_R,@TDragObjectCancelling_W,'Cancelling');
+ RegisterPropertyHelper(@TDragObjectDragHandle_R,@TDragObjectDragHandle_W,'DragHandle');
+ RegisterPropertyHelper(@TDragObjectDragPos_R,@TDragObjectDragPos_W,'DragPos');
+ RegisterPropertyHelper(@TDragObjectDragTargetPos_R,@TDragObjectDragTargetPos_W,'DragTargetPos');
+ RegisterPropertyHelper(@TDragObjectDragTarget_R,@TDragObjectDragTarget_W,'DragTarget');
+ RegisterPropertyHelper(@TDragObjectMouseDeltaX_R,nil,'MouseDeltaX');
+ RegisterPropertyHelper(@TDragObjectMouseDeltaY_R,nil,'MouseDeltaY');
+{$ENDIF}
+{$ENDIF}
+ end;
+end;
+
+
+procedure RIRegister_Controls(Cl: TPSRuntimeClassImporter);
+begin
+ RIRegisterTControl(Cl);
+ RIRegisterTWinControl(Cl);
+ RIRegisterTGraphicControl(cl);
+ RIRegisterTCustomControl(cl);
+ RIRegister_TDragObject(cl);
+
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_dateutils.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_dateutils.pas
new file mode 100644
index 0000000..9c0fd5b
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_dateutils.pas
@@ -0,0 +1,63 @@
+
+unit uPSR_dateutils;
+{$I PascalScript.inc}
+interface
+uses
+ SysUtils, uPSRuntime;
+
+
+
+procedure RegisterDateTimeLibrary_R(S: TPSExec);
+
+implementation
+
+function TryEncodeDate(Year, Month, Day: Word; var Date: TDateTime): Boolean;
+begin
+ try
+ Date := EncodeDate(Year, Month, Day);
+ Result := true;
+ except
+ Result := false;
+ end;
+end;
+
+function TryEncodeTime(Hour, Min, Sec, MSec: Word; var Time: TDateTime): Boolean;
+begin
+ try
+ Time := EncodeTime(hour, Min, Sec, MSec);
+ Result := true;
+ except
+ Result := false;
+ end;
+end;
+
+function DateTimeToUnix(D: TDateTime): Int64;
+begin
+ Result := Round((D - 25569) * 86400);
+end;
+
+function UnixToDateTime(U: Int64): TDateTime;
+begin
+ Result := U / 86400 + 25569;
+end;
+
+procedure RegisterDateTimeLibrary_R(S: TPSExec);
+begin
+ S.RegisterDelphiFunction(@EncodeDate, 'ENCODEDATE', cdRegister);
+ S.RegisterDelphiFunction(@EncodeTime, 'ENCODETIME', cdRegister);
+ S.RegisterDelphiFunction(@TryEncodeDate, 'TRYENCODEDATE', cdRegister);
+ S.RegisterDelphiFunction(@TryEncodeTime, 'TRYENCODETIME', cdRegister);
+ S.RegisterDelphiFunction(@DecodeDate, 'DECODEDATE', cdRegister);
+ S.RegisterDelphiFunction(@DecodeTime, 'DECODETIME', cdRegister);
+ S.RegisterDelphiFunction(@DayOfWeek, 'DAYOFWEEK', cdRegister);
+ S.RegisterDelphiFunction(@Date, 'DATE', cdRegister);
+ S.RegisterDelphiFunction(@Time, 'TIME', cdRegister);
+ S.RegisterDelphiFunction(@Now, 'NOW', cdRegister);
+ S.RegisterDelphiFunction(@DateTimeToUnix, 'DATETIMETOUNIX', cdRegister);
+ S.RegisterDelphiFunction(@UnixToDateTime, 'UNIXTODATETIME', cdRegister);
+ S.RegisterDelphiFunction(@DateToStr, 'DATETOSTR', cdRegister);
+ S.RegisterDelphiFunction(@FormatDateTime, 'FORMATDATETIME', cdRegister);
+ S.RegisterDelphiFunction(@StrToDate, 'STRTODATE', cdRegister);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_dll.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_dll.pas
new file mode 100644
index 0000000..00dd22c
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_dll.pas
@@ -0,0 +1,283 @@
+unit uPSR_dll;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSRuntime, uPSUtils;
+
+procedure RegisterDLLRuntime(Caller: TPSExec);
+procedure RegisterDLLRuntimeEx(Caller: TPSExec; AddDllProcImport: Boolean);
+
+function ProcessDllImport(Caller: TPSExec; P: TPSExternalProcRec): Boolean;
+function ProcessDllImportEx(Caller: TPSExec; P: TPSExternalProcRec; ForceDelayLoad: Boolean): Boolean;
+function UnloadProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+
+implementation
+uses
+ {$IFDEF UNIX}
+ LCLIntf, Unix, baseunix, dynlibs, termio, sockets;
+ {$ELSE}
+ Windows;
+ {$ENDIF}
+
+{
+p^.Ext1 contains the pointer to the Proc function
+p^.ExportDecl:
+ 'dll:'+DllName+#0+FunctionName+#0+chr(Cc)+Chr(DelayLoad)+Chr(AlternateSearchPath)+VarParams
+}
+
+type
+ PLoadedDll = ^TLoadedDll;
+ TLoadedDll = record
+ dllnamehash: Longint;
+ dllname: tbtstring;
+ dllhandle: THandle;
+ end;
+ TMyExec = class(TPSExec);
+ PInteger = ^Integer;
+
+procedure LAstErrorFree(Sender: TPSExec; P: PInteger);
+begin
+ dispose(p);
+end;
+
+procedure DLLSetLastError(Sender: TPSExec; P: Integer);
+var
+ pz: PInteger;
+begin
+ pz := Sender.FindProcResource(@LastErrorFree);
+ if pz = nil then
+ begin
+ new(pz);
+ Sender.AddResource(@LastErrorFree, PZ);
+ end;
+ pz^ := p;
+end;
+
+function DLLGetLastError(Sender: TPSExec): Integer;
+var
+ pz: PInteger;
+begin
+ pz := Sender.FindProcResource(@LastErrorFree);
+ if pz = nil then
+ result := 0
+ else
+ result := pz^;
+end;
+
+
+procedure DllFree(Sender: TPSExec; P: PLoadedDll);
+begin
+ FreeLibrary(p^.dllhandle);
+ Dispose(p);
+end;
+
+function LoadDll(Caller: TPSExec; P: TPSExternalProcRec): Boolean;
+var
+ s, s2, s3: tbtstring;
+ h, i: Longint;
+ ph: PLoadedDll;
+ dllhandle: THandle;
+ loadwithalteredsearchpath: Boolean;
+begin
+ s := p.Decl;
+ Delete(s, 1, 4);
+ s2 := copy(s, 1, pos(tbtchar(#0), s)-1);
+ delete(s, 1, length(s2)+1);
+ h := makehash(s2);
+ s3 := copy(s, 1, pos(tbtchar(#0), s)-1);
+ delete(s, 1, length(s3)+1);
+ loadwithalteredsearchpath := bytebool(s[3]);
+ i := 2147483647; // maxint
+ dllhandle := 0;
+ repeat
+ ph := Caller.FindProcResource2(@dllFree, i);
+ if (ph = nil) then
+ begin
+ if s2 = '' then
+ begin
+ // don't pass an empty filename to LoadLibrary, just treat it as uncallable
+ p.Ext2 := Pointer(1);
+ Result := False;
+ exit;
+ end;
+ {$IFDEF UNIX}
+ dllhandle := LoadLibrary(PChar(s2));
+ {$ELSE}
+ if loadwithalteredsearchpath then
+ dllhandle := LoadLibraryExA(PAnsiChar(AnsiString(s2)), 0, LOAD_WITH_ALTERED_SEARCH_PATH)
+ else
+ dllhandle := LoadLibraryA(PAnsiChar(AnsiString(s2)));
+ {$ENDIF}
+ if dllhandle = 0 then
+ begin
+ p.Ext2 := Pointer(1);
+ Result := False;
+ exit;
+ end;
+ new(ph);
+ ph^.dllnamehash := h;
+ ph^.dllname := s2;
+ ph^.dllhandle := dllhandle;
+ Caller.AddResource(@DllFree, ph);
+ end;
+ if (ph^.dllnamehash = h) and (ph^.dllname = s2) then
+ begin
+ dllhandle := ph^.dllhandle;
+ end;
+ until dllhandle <> 0;
+ p.Ext1 := GetProcAddress(dllhandle, pansichar(s3));
+ if p.Ext1 = nil then
+ begin
+ p.Ext2 := Pointer(1);
+ Result := false;
+ exit;
+ end;
+ Result := True;
+end;
+
+
+function DllProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+
+var
+ i: Longint;
+ MyList: TIfList;
+ n: PPSVariantIFC;
+ CurrStack: Cardinal;
+ cc: TPSCallingConvention;
+ s: tbtstring;
+begin
+ if p.Ext2 <> nil then // error
+ begin
+ Result := false;
+ exit;
+ end;
+ if p.Ext1 = nil then
+ begin
+ if not LoadDll(Caller, P) then
+ begin
+ Result := false;
+ exit;
+ end;
+ end;
+ s := p.Decl;
+ delete(S, 1, pos(tbtchar(#0), s));
+ delete(S, 1, pos(tbtchar(#0), s));
+ if length(S) < 2 then
+ begin
+ Result := False;
+ exit;
+ end;
+ cc := TPSCallingConvention(s[1]);
+ delete(s, 1, 3); // cc + delayload + alternatesearchpath (delayload might also be forced!)
+ CurrStack := Cardinal(Stack.Count) - Cardinal(length(s));
+ if s[1] = #0 then inc(CurrStack);
+ MyList := tIfList.Create;
+ for i := 2 to length(s) do
+ begin
+ MyList.Add(nil);
+ end;
+ for i := length(s) downto 2 do
+ begin
+ MyList[i - 2] := NewPPSVariantIFC(Stack[CurrStack], s[i] <> #0);
+ inc(CurrStack);
+ end;
+ if s[1] <> #0 then
+ begin
+ n := NewPPSVariantIFC(Stack[CurrStack], true);
+ end else n := nil;
+ try
+ TMYExec(Caller).InnerfuseCall(nil, p.Ext1, cc, MyList, n);
+ {$IFNDEF LINUX}
+ DLLSetLastError(Caller, GetLastError);
+ {$ENDIF}
+ finally
+ DisposePPSvariantIFC(n);
+ DisposePPSVariantIFCList(MyList);
+ end;
+ result := true;
+end;
+
+function ProcessDllImport(Caller: TPSExec; P: TPSExternalProcRec): Boolean;
+begin
+ Result := ProcessDllImportEx(Caller, P, False);
+end;
+
+function ProcessDllImportEx(Caller: TPSExec; P: TPSExternalProcRec; ForceDelayLoad: Boolean): Boolean;
+var
+ DelayLoad: Boolean;
+ s: tbtstring;
+begin
+ if not ForceDelayLoad then begin
+ s := p.Decl;
+ Delete(s,1,pos(tbtchar(#0), s));
+ Delete(s,1,pos(tbtchar(#0), s));
+ DelayLoad := bytebool(s[2]);
+ end else
+ DelayLoad := True;
+
+ if DelayLoad then begin
+ p.ProcPtr := DllProc;
+ Result := True;
+ end else begin
+ p.ProcPtr := DllProc;
+ Result := LoadDll(Caller, p);
+ end;
+end;
+
+
+function GetLastErrorProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+begin
+ Stack.SetInt(-1, DLLGetLastError(Caller));
+ Result := true;
+end;
+
+function UnloadProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ h, i: Longint;
+ pv: TPSProcRec;
+ ph: PLoadedDll;
+ sname, s: tbtstring;
+begin
+ sname := Stack.GetAnsiString(-1);
+ for i := Caller.GetProcCount -1 downto 0 do
+ begin
+ pv := Caller.GetProcNo(i);
+ if not (pv is TPSExternalProcRec) then continue;
+ if @TPSExternalProcRec(pv).ProcPtr <> @DllProc then continue;
+ s := (TPSExternalProcRec(pv).Decl);
+ delete(s,1,4);
+ if copy(s,1,pos(tbtchar(#0),s)-1) = sname then
+ begin
+ TPSExternalProcRec(pv).Ext1 := nil;
+ end;
+ end;
+ h := MakeHash(sname);
+ i := 2147483647; // maxint
+ repeat
+ ph := Caller.FindProcResource2(@dllFree, i);
+ if (ph = nil) then break;
+ if (ph.dllnamehash = h) and (ph.dllname = sname) then
+ begin
+ FreeLibrary(ph^.dllhandle);
+ Caller.DeleteResource(ph);
+ dispose(ph);
+ end;
+ until false;
+ result := true;
+end;
+
+procedure RegisterDLLRuntime(Caller: TPSExec);
+begin
+ RegisterDLLRuntimeEx(Caller, True);
+end;
+
+procedure RegisterDLLRuntimeEx(Caller: TPSExec; AddDllProcImport: Boolean);
+begin
+ if AddDllProcImport then
+ Caller.AddSpecialProcImport('dll', @ProcessDllImport, nil);
+ Caller.RegisterFunctionName('UNLOADDLL', UnloadProc, nil, nil);
+ Caller.RegisterFunctionName('DLLGETLASTERROR', GetLastErrorProc, nil, nil);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_extctrls.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_extctrls.pas
new file mode 100644
index 0000000..0f4a129
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_extctrls.pas
@@ -0,0 +1,150 @@
+
+unit uPSR_extctrls;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSRuntime, uPSUtils;
+
+
+procedure RIRegister_ExtCtrls(cl: TPSRuntimeClassImporter);
+
+procedure RIRegisterTSHAPE(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTIMAGE(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTPAINTBOX(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTBEVEL(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTTIMER(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCUSTOMPANEL(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTPANEL(Cl: TPSRuntimeClassImporter);
+{$IFNDEF CLX}
+procedure RIRegisterTPAGE(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTNOTEBOOK(Cl: TPSRuntimeClassImporter);
+{$IFNDEF FPC}procedure RIRegisterTHEADER(Cl: TPSRuntimeClassImporter);{$ENDIF}
+{$ENDIF}
+procedure RIRegisterTCUSTOMRADIOGROUP(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTRADIOGROUP(Cl: TPSRuntimeClassImporter);
+
+implementation
+
+uses
+ {$IFDEF CLX}
+ QExtCtrls, QGraphics;
+ {$ELSE}
+ ExtCtrls, Graphics;
+ {$ENDIF}
+
+procedure RIRegisterTSHAPE(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TSHAPE) do
+ begin
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod(@TSHAPE.STYLECHANGED, 'STYLECHANGED');
+ {$ENDIF}
+ end;
+end;
+
+procedure TIMAGECANVAS_R(Self: TIMAGE; var T: TCANVAS); begin T := Self.CANVAS; end;
+
+procedure RIRegisterTIMAGE(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TIMAGE) do
+ begin
+ RegisterPropertyHelper(@TIMAGECANVAS_R, nil, 'CANVAS');
+ end;
+end;
+
+procedure TPAINTBOXCANVAS_R(Self: TPAINTBOX; var T: TCanvas); begin T := Self.CANVAS; end;
+
+procedure RIRegisterTPAINTBOX(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TPAINTBOX) do
+ begin
+ RegisterPropertyHelper(@TPAINTBOXCANVAS_R, nil, 'CANVAS');
+ end;
+end;
+
+procedure RIRegisterTBEVEL(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TBEVEL);
+end;
+
+procedure RIRegisterTTIMER(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TTIMER);
+end;
+
+procedure RIRegisterTCUSTOMPANEL(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TCUSTOMPANEL);
+end;
+
+procedure RIRegisterTPANEL(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TPANEL);
+end;
+{$IFNDEF CLX}
+procedure RIRegisterTPAGE(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TPAGE);
+end;
+
+procedure RIRegisterTNOTEBOOK(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TNOTEBOOK);
+end;
+
+{$IFNDEF FPC}
+procedure THEADERSECTIONWIDTH_R(Self: THEADER; var T: INTEGER; t1: INTEGER); begin T := Self.SECTIONWIDTH[t1]; end;
+procedure THEADERSECTIONWIDTH_W(Self: THEADER; T: INTEGER; t1: INTEGER); begin Self.SECTIONWIDTH[t1] := T; end;
+
+procedure RIRegisterTHEADER(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(THEADER) do
+ begin
+ RegisterPropertyHelper(@THEADERSECTIONWIDTH_R, @THEADERSECTIONWIDTH_W, 'SECTIONWIDTH');
+ end;
+end;
+{$ENDIF}
+{$ENDIF}
+
+procedure RIRegisterTCUSTOMRADIOGROUP(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TCUSTOMRADIOGROUP);
+end;
+
+procedure RIRegisterTRADIOGROUP(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TRADIOGROUP);
+end;
+
+procedure RIRegister_ExtCtrls(cl: TPSRuntimeClassImporter);
+begin
+ {$IFNDEF PS_MINIVCL}
+ RIRegisterTSHAPE(Cl);
+ RIRegisterTIMAGE(Cl);
+ RIRegisterTPAINTBOX(Cl);
+ {$ENDIF}
+ RIRegisterTBEVEL(Cl);
+ {$IFNDEF PS_MINIVCL}
+ RIRegisterTTIMER(Cl);
+ {$ENDIF}
+ RIRegisterTCUSTOMPANEL(Cl);
+{$IFNDEF CLX}
+ RIRegisterTPANEL(Cl);
+{$ENDIF}
+ {$IFNDEF PS_MINIVCL}
+{$IFNDEF CLX}
+ RIRegisterTPAGE(Cl);
+ RIRegisterTNOTEBOOK(Cl);
+ {$IFNDEF FPC}
+ RIRegisterTHEADER(Cl);
+ {$ENDIF}{FPC}
+{$ENDIF}
+ RIRegisterTCUSTOMRADIOGROUP(Cl);
+ RIRegisterTRADIOGROUP(Cl);
+ {$ENDIF}
+end;
+
+end.
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_forms.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_forms.pas
new file mode 100644
index 0000000..4a0f8f7
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_forms.pas
@@ -0,0 +1,264 @@
+
+unit uPSR_forms;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSRuntime, uPSUtils;
+
+procedure RIRegisterTCONTROLSCROLLBAR(Cl: TPSRuntimeClassImporter);
+{$IFNDEF FPC} procedure RIRegisterTSCROLLINGWINCONTROL(Cl: TPSRuntimeClassImporter);{$ENDIF}
+procedure RIRegisterTSCROLLBOX(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFORM(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTAPPLICATION(Cl: TPSRuntimeClassImporter);
+
+procedure RIRegister_Forms(Cl: TPSRuntimeClassImporter);
+
+implementation
+uses
+ sysutils, classes, {$IFDEF CLX}QControls, QForms, QGraphics{$ELSE}Controls, Forms, Graphics{$ENDIF};
+
+procedure TCONTROLSCROLLBARKIND_R(Self: TCONTROLSCROLLBAR; var T: TSCROLLBARKIND); begin T := Self.KIND; end;
+procedure TCONTROLSCROLLBARSCROLLPOS_R(Self: TCONTROLSCROLLBAR; var T: INTEGER); begin t := Self.SCROLLPOS; end;
+
+procedure RIRegisterTCONTROLSCROLLBAR(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TCONTROLSCROLLBAR) do
+ begin
+ RegisterPropertyHelper(@TCONTROLSCROLLBARKIND_R, nil, 'KIND');
+ RegisterPropertyHelper(@TCONTROLSCROLLBARSCROLLPOS_R, nil, 'SCROLLPOS');
+ end;
+end;
+
+{$IFNDEF FPC}
+procedure RIRegisterTSCROLLINGWINCONTROL(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TSCROLLINGWINCONTROL) do
+ begin
+ RegisterMethod(@TSCROLLINGWINCONTROL.SCROLLINVIEW, 'SCROLLINVIEW');
+ end;
+end;
+{$ENDIF}
+
+procedure RIRegisterTSCROLLBOX(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TSCROLLBOX);
+end;
+{$IFNDEF FPC}
+{$IFNDEF CLX}
+procedure TFORMACTIVEOLECONTROL_W(Self: TFORM; T: TWINCONTROL); begin Self.ACTIVEOLECONTROL := T; end;
+procedure TFORMACTIVEOLECONTROL_R(Self: TFORM; var T: TWINCONTROL); begin T := Self.ACTIVEOLECONTROL;
+end;
+procedure TFORMTILEMODE_W(Self: TFORM; T: TTILEMODE); begin Self.TILEMODE := T; end;
+procedure TFORMTILEMODE_R(Self: TFORM; var T: TTILEMODE); begin T := Self.TILEMODE; end;
+{$ENDIF}{CLX}
+procedure TFORMACTIVEMDICHILD_R(Self: TFORM; var T: TFORM); begin T := Self.ACTIVEMDICHILD; end;
+procedure TFORMDROPTARGET_W(Self: TFORM; T: BOOLEAN); begin Self.DROPTARGET := T; end;
+procedure TFORMDROPTARGET_R(Self: TFORM; var T: BOOLEAN); begin T := Self.DROPTARGET; end;
+procedure TFORMMDICHILDCOUNT_R(Self: TFORM; var T: INTEGER); begin T := Self.MDICHILDCOUNT; end;
+procedure TFORMMDICHILDREN_R(Self: TFORM; var T: TFORM; t1: INTEGER); begin T := Self.MDICHILDREN[T1];
+end;
+{$ENDIF}{FPC}
+
+procedure TFORMMODALRESULT_W(Self: TFORM; T: TMODALRESULT); begin Self.MODALRESULT := T; end;
+procedure TFORMMODALRESULT_R(Self: TFORM; var T: TMODALRESULT); begin T := Self.MODALRESULT; end;
+procedure TFORMACTIVE_R(Self: TFORM; var T: BOOLEAN); begin T := Self.ACTIVE; end;
+procedure TFORMCANVAS_R(Self: TFORM; var T: TCANVAS); begin T := Self.CANVAS; end;
+{$IFNDEF CLX}
+procedure TFORMCLIENTHANDLE_R(Self: TFORM; var T: Longint); begin T := Self.CLIENTHANDLE; end;
+{$ENDIF}
+
+{ Innerfuse Pascal Script Class Import Utility (runtime) }
+
+procedure RIRegisterTFORM(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TFORM) do
+ begin
+ {$IFDEF DELPHI4UP}
+ RegisterVirtualConstructor(@TFORM.CREATENEW, 'CREATENEW');
+ {$ELSE}
+ RegisterConstructor(@TFORM.CREATENEW, 'CREATENEW');
+ {$ENDIF}
+ RegisterMethod(@TFORM.CLOSE, 'CLOSE');
+ RegisterMethod(@TFORM.HIDE, 'HIDE');
+ RegisterMethod(@TFORM.SHOW, 'SHOW');
+ RegisterMethod(@TFORM.SHOWMODAL, 'SHOWMODAL');
+ RegisterMethod(@TFORM.RELEASE, 'RELEASE');
+ RegisterPropertyHelper(@TFORMACTIVE_R, nil, 'ACTIVE');
+
+ {$IFNDEF PS_MINIVCL}
+ {$IFNDEF FPC}
+{$IFNDEF CLX}
+ RegisterMethod(@TFORM.ARRANGEICONS, 'ARRANGEICONS');
+ RegisterMethod(@TFORM.GETFORMIMAGE, 'GETFORMIMAGE');
+ RegisterMethod(@TFORM.PRINT, 'PRINT');
+ RegisterMethod(@TFORM.SENDCANCELMODE, 'SENDCANCELMODE');
+ RegisterPropertyHelper(@TFORMACTIVEOLECONTROL_R, @TFORMACTIVEOLECONTROL_W, 'ACTIVEOLECONTROL');
+ RegisterPropertyHelper(@TFORMCLIENTHANDLE_R, nil, 'CLIENTHANDLE');
+ RegisterPropertyHelper(@TFORMTILEMODE_R, @TFORMTILEMODE_W, 'TILEMODE');
+{$ENDIF}{CLX}
+ RegisterMethod(@TFORM.CASCADE, 'CASCADE');
+ RegisterMethod(@TFORM.NEXT, 'NEXT');
+ RegisterMethod(@TFORM.PREVIOUS, 'PREVIOUS');
+ RegisterMethod(@TFORM.TILE, 'TILE');
+ RegisterPropertyHelper(@TFORMACTIVEMDICHILD_R, nil, 'ACTIVEMDICHILD');
+ RegisterPropertyHelper(@TFORMDROPTARGET_R, @TFORMDROPTARGET_W, 'DROPTARGET');
+ RegisterPropertyHelper(@TFORMMDICHILDCOUNT_R, nil, 'MDICHILDCOUNT');
+ RegisterPropertyHelper(@TFORMMDICHILDREN_R, nil, 'MDICHILDREN');
+ {$ENDIF}{FPC}
+ RegisterMethod(@TFORM.CLOSEQUERY, 'CLOSEQUERY');
+ RegisterMethod(@TFORM.DEFOCUSCONTROL, 'DEFOCUSCONTROL');
+ RegisterMethod(@TFORM.FOCUSCONTROL, 'FOCUSCONTROL');
+ RegisterMethod(@TFORM.SETFOCUSEDCONTROL, 'SETFOCUSEDCONTROL');
+ RegisterPropertyHelper(@TFORMCANVAS_R, nil, 'CANVAS');
+ RegisterPropertyHelper(@TFORMMODALRESULT_R, @TFORMMODALRESULT_W, 'MODALRESULT');
+ {$ENDIF}{PS_MINIVCL}
+ end;
+end;
+
+ {$IFNDEF FPC}
+procedure TAPPLICATIONACTIVE_R(Self: TAPPLICATION; var T: BOOLEAN); begin T := Self.ACTIVE; end;
+{$IFNDEF CLX}
+procedure TAPPLICATIONDIALOGHANDLE_R(Self: TAPPLICATION; var T: Longint); begin T := Self.DIALOGHANDLE; end;
+procedure TAPPLICATIONDIALOGHANDLE_W(Self: TAPPLICATION; T: Longint); begin Self.DIALOGHANDLE := T; end;
+procedure TAPPLICATIONHANDLE_R(Self: TAPPLICATION; var T: Longint); begin T := Self.HANDLE; end;
+procedure TAPPLICATIONHANDLE_W(Self: TAPPLICATION; T: Longint); begin Self.HANDLE := T; end;
+procedure TAPPLICATIONUPDATEFORMATSETTINGS_R(Self: TAPPLICATION; var T: BOOLEAN); begin T := Self.UPDATEFORMATSETTINGS; end;
+procedure TAPPLICATIONUPDATEFORMATSETTINGS_W(Self: TAPPLICATION; T: BOOLEAN); begin Self.UPDATEFORMATSETTINGS := T; end;
+{$ENDIF}
+{$ENDIF}{FPC}
+
+
+procedure TAPPLICATIONEXENAME_R(Self: TAPPLICATION; var T: STRING); begin T := Self.EXENAME; end;
+procedure TAPPLICATIONHELPFILE_R(Self: TAPPLICATION; var T: STRING); begin T := Self.HELPFILE; end;
+procedure TAPPLICATIONHELPFILE_W(Self: TAPPLICATION; T: STRING); begin Self.HELPFILE := T; end;
+procedure TAPPLICATIONHINT_R(Self: TAPPLICATION; var T: STRING); begin T := Self.HINT; end;
+procedure TAPPLICATIONHINT_W(Self: TAPPLICATION; T: STRING); begin Self.HINT := T; end;
+procedure TAPPLICATIONHINTCOLOR_R(Self: TAPPLICATION; var T: TCOLOR); begin T := Self.HINTCOLOR; end;
+procedure TAPPLICATIONHINTCOLOR_W(Self: TAPPLICATION; T: TCOLOR); begin Self.HINTCOLOR := T; end;
+procedure TAPPLICATIONHINTPAUSE_R(Self: TAPPLICATION; var T: INTEGER); begin T := Self.HINTPAUSE; end;
+procedure TAPPLICATIONHINTPAUSE_W(Self: TAPPLICATION; T: INTEGER); begin Self.HINTPAUSE := T; end;
+procedure TAPPLICATIONHINTSHORTPAUSE_R(Self: TAPPLICATION; var T: INTEGER); begin T := Self.HINTSHORTPAUSE; end;
+procedure TAPPLICATIONHINTSHORTPAUSE_W(Self: TAPPLICATION; T: INTEGER); begin Self.HINTSHORTPAUSE := T; end;
+procedure TAPPLICATIONHINTHIDEPAUSE_R(Self: TAPPLICATION; var T: INTEGER); begin T := Self.HINTHIDEPAUSE; end;
+procedure TAPPLICATIONHINTHIDEPAUSE_W(Self: TAPPLICATION; T: INTEGER); begin Self.HINTHIDEPAUSE := T; end;
+procedure TAPPLICATIONMAINFORM_R(Self: TAPPLICATION; var T: {$IFDEF DELPHI3UP}TCustomForm{$ELSE}TFORM{$ENDIF}); begin T := Self.MAINFORM; end;
+procedure TAPPLICATIONSHOWHINT_R(Self: TAPPLICATION; var T: BOOLEAN); begin T := Self.SHOWHINT; end;
+procedure TAPPLICATIONSHOWHINT_W(Self: TAPPLICATION; T: BOOLEAN); begin Self.SHOWHINT := T; end;
+procedure TAPPLICATIONSHOWMAINFORM_R(Self: TAPPLICATION; var T: BOOLEAN); begin T := Self.SHOWMAINFORM; end;
+procedure TAPPLICATIONSHOWMAINFORM_W(Self: TAPPLICATION; T: BOOLEAN); begin Self.SHOWMAINFORM := T; end;
+procedure TAPPLICATIONTERMINATED_R(Self: TAPPLICATION; var T: BOOLEAN); begin T := Self.TERMINATED; end;
+procedure TAPPLICATIONTITLE_R(Self: TAPPLICATION; var T: STRING); begin T := Self.TITLE; end;
+procedure TAPPLICATIONTITLE_W(Self: TAPPLICATION; T: STRING); begin Self.TITLE := T; end;
+
+{$IFNDEF FPC}
+procedure TAPPLICATIONONACTIVATE_R(Self: TAPPLICATION; var T: TNOTIFYEVENT); begin T := Self.ONACTIVATE; end;
+procedure TAPPLICATIONONACTIVATE_W(Self: TAPPLICATION; T: TNOTIFYEVENT); begin Self.ONACTIVATE := T; end;
+procedure TAPPLICATIONONDEACTIVATE_R(Self: TAPPLICATION; var T: TNOTIFYEVENT); begin T := Self.ONDEACTIVATE; end;
+procedure TAPPLICATIONONDEACTIVATE_W(Self: TAPPLICATION; T: TNOTIFYEVENT); begin Self.ONDEACTIVATE := T; end;
+{$ENDIF}
+
+procedure TAPPLICATIONONIDLE_R(Self: TAPPLICATION; var T: TIDLEEVENT); begin T := Self.ONIDLE; end;
+procedure TAPPLICATIONONIDLE_W(Self: TAPPLICATION; T: TIDLEEVENT); begin Self.ONIDLE := T; end;
+procedure TAPPLICATIONONHELP_R(Self: TAPPLICATION; var T: THELPEVENT); begin T := Self.ONHELP; end;
+procedure TAPPLICATIONONHELP_W(Self: TAPPLICATION; T: THELPEVENT); begin Self.ONHELP := T; end;
+procedure TAPPLICATIONONHINT_R(Self: TAPPLICATION; var T: TNOTIFYEVENT); begin T := Self.ONHINT; end;
+procedure TAPPLICATIONONHINT_W(Self: TAPPLICATION; T: TNOTIFYEVENT); begin Self.ONHINT := T; end;
+
+{$IFNDEF FPC}
+procedure TAPPLICATIONONMINIMIZE_R(Self: TAPPLICATION; var T: TNOTIFYEVENT); begin T := Self.ONMINIMIZE; end;
+procedure TAPPLICATIONONMINIMIZE_W(Self: TAPPLICATION; T: TNOTIFYEVENT); begin Self.ONMINIMIZE := T; end;
+
+procedure TAPPLICATIONONRESTORE_R(Self: TAPPLICATION; var T: TNOTIFYEVENT); begin T := Self.ONRESTORE; end;
+procedure TAPPLICATIONONRESTORE_W(Self: TAPPLICATION; T: TNOTIFYEVENT); begin Self.ONRESTORE := T; end;
+{$ENDIF}
+
+procedure RIRegisterTAPPLICATION(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TAPPLICATION) do
+ begin
+ {$IFNDEF FPC}
+ RegisterMethod(@TAPPLICATION.MINIMIZE, 'MINIMIZE');
+ RegisterMethod(@TAPPLICATION.RESTORE, 'RESTORE');
+ RegisterPropertyHelper(@TAPPLICATIONACTIVE_R, nil, 'ACTIVE');
+ RegisterPropertyHelper(@TAPPLICATIONONACTIVATE_R, @TAPPLICATIONONACTIVATE_W, 'ONACTIVATE');
+ RegisterPropertyHelper(@TAPPLICATIONONDEACTIVATE_R, @TAPPLICATIONONDEACTIVATE_W, 'ONDEACTIVATE');
+ RegisterPropertyHelper(@TAPPLICATIONONMINIMIZE_R, @TAPPLICATIONONMINIMIZE_W, 'ONMINIMIZE');
+ RegisterPropertyHelper(@TAPPLICATIONONRESTORE_R, @TAPPLICATIONONRESTORE_W, 'ONRESTORE');
+ RegisterPropertyHelper(@TAPPLICATIONDIALOGHANDLE_R, @TAPPLICATIONDIALOGHANDLE_W, 'DIALOGHANDLE');
+ RegisterMethod(@TAPPLICATION.CREATEHANDLE, 'CREATEHANDLE');
+ RegisterMethod(@TAPPLICATION.NORMALIZETOPMOSTS, 'NORMALIZETOPMOSTS');
+ RegisterMethod(@TAPPLICATION.RESTORETOPMOSTS, 'RESTORETOPMOSTS');
+ {$IFNDEF CLX}
+ RegisterPropertyHelper(@TAPPLICATIONHANDLE_R, @TAPPLICATIONHANDLE_W, 'HANDLE');
+ RegisterPropertyHelper(@TAPPLICATIONUPDATEFORMATSETTINGS_R, @TAPPLICATIONUPDATEFORMATSETTINGS_W, 'UPDATEFORMATSETTINGS');
+ {$ENDIF}
+ {$ENDIF}
+ RegisterMethod(@TAPPLICATION.BRINGTOFRONT, 'BRINGTOFRONT');
+ RegisterMethod(@TAPPLICATION.MESSAGEBOX, 'MESSAGEBOX');
+ RegisterMethod(@TAPPLICATION.PROCESSMESSAGES, 'PROCESSMESSAGES');
+ RegisterMethod(@TAPPLICATION.TERMINATE, 'TERMINATE');
+ RegisterPropertyHelper(@TAPPLICATIONEXENAME_R, nil, 'EXENAME');
+ RegisterPropertyHelper(@TAPPLICATIONHINT_R, @TAPPLICATIONHINT_W, 'HINT');
+ RegisterPropertyHelper(@TAPPLICATIONMAINFORM_R, nil, 'MAINFORM');
+ RegisterPropertyHelper(@TAPPLICATIONSHOWHINT_R, @TAPPLICATIONSHOWHINT_W, 'SHOWHINT');
+ RegisterPropertyHelper(@TAPPLICATIONSHOWMAINFORM_R, @TAPPLICATIONSHOWMAINFORM_W, 'SHOWMAINFORM');
+ RegisterPropertyHelper(@TAPPLICATIONTERMINATED_R, nil, 'TERMINATED');
+ RegisterPropertyHelper(@TAPPLICATIONTITLE_R, @TAPPLICATIONTITLE_W, 'TITLE');
+ RegisterPropertyHelper(@TAPPLICATIONONIDLE_R, @TAPPLICATIONONIDLE_W, 'ONIDLE');
+ RegisterPropertyHelper(@TAPPLICATIONONHINT_R, @TAPPLICATIONONHINT_W, 'ONHINT');
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod(@TAPPLICATION.CONTROLDESTROYED, 'CONTROLDESTROYED');
+ RegisterMethod(@TAPPLICATION.CANCELHINT, 'CANCELHINT');
+ {$IFNDEF CLX}
+ {$IFNDEF FPC}
+ RegisterMethod(@TAPPLICATION.HELPCOMMAND, 'HELPCOMMAND');
+ {$ENDIF}
+ RegisterMethod(@TAPPLICATION.HELPCONTEXT, 'HELPCONTEXT');
+ {$IFNDEF FPC}
+ RegisterMethod(@TAPPLICATION.HELPJUMP, 'HELPJUMP');
+ {$ENDIF}
+ {$ENDIF}
+// RegisterMethod(@TAPPLICATION.HANDLEEXCEPTION, 'HANDLEEXCEPTION');
+// RegisterMethod(@TAPPLICATION.HOOKMAINWINDOW, 'HOOKMAINWINDOW');
+// RegisterMethod(@TAPPLICATION.UNHOOKMAINWINDOW, 'UNHOOKMAINWINDOW');
+
+ RegisterMethod(@TAPPLICATION.HANDLEMESSAGE, 'HANDLEMESSAGE');
+ RegisterMethod(@TAPPLICATION.HIDEHINT, 'HIDEHINT');
+ RegisterMethod(@TAPPLICATION.HINTMOUSEMESSAGE, 'HINTMOUSEMESSAGE');
+ RegisterMethod(@TAPPLICATION.INITIALIZE, 'INITIALIZE');
+ RegisterMethod(@TAPPLICATION.RUN, 'RUN');
+// RegisterMethod(@TAPPLICATION.SHOWEXCEPTION, 'SHOWEXCEPTION');
+ RegisterPropertyHelper(@TAPPLICATIONHELPFILE_R, @TAPPLICATIONHELPFILE_W, 'HELPFILE');
+ RegisterPropertyHelper(@TAPPLICATIONHINTCOLOR_R, @TAPPLICATIONHINTCOLOR_W, 'HINTCOLOR');
+ RegisterPropertyHelper(@TAPPLICATIONHINTPAUSE_R, @TAPPLICATIONHINTPAUSE_W, 'HINTPAUSE');
+ RegisterPropertyHelper(@TAPPLICATIONHINTSHORTPAUSE_R, @TAPPLICATIONHINTSHORTPAUSE_W, 'HINTSHORTPAUSE');
+ RegisterPropertyHelper(@TAPPLICATIONHINTHIDEPAUSE_R, @TAPPLICATIONHINTHIDEPAUSE_W, 'HINTHIDEPAUSE');
+ RegisterPropertyHelper(@TAPPLICATIONONHELP_R, @TAPPLICATIONONHELP_W, 'ONHELP');
+ {$ENDIF}
+ end;
+end;
+
+procedure RIRegister_Forms(Cl: TPSRuntimeClassImporter);
+begin
+ {$IFNDEF PS_MINIVCL}
+ RIRegisterTCONTROLSCROLLBAR(cl);
+ RIRegisterTSCROLLBOX(cl);
+ {$ENDIF}
+{$IFNDEF FPC} RIRegisterTScrollingWinControl(cl);{$ENDIF}
+ RIRegisterTForm(Cl);
+ {$IFNDEF PS_MINIVCL}
+ RIRegisterTApplication(Cl);
+ {$ENDIF}
+end;
+
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+// FPC changes by Boguslaw brandys (brandys at o2 _dot_ pl)
+
+end.
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_graphics.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_graphics.pas
new file mode 100644
index 0000000..7a7643a
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_graphics.pas
@@ -0,0 +1,218 @@
+
+unit uPSR_graphics;
+{$I PascalScript.inc}
+interface
+uses
+ uPSRuntime, uPSUtils;
+
+
+
+procedure RIRegisterTGRAPHICSOBJECT(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTFont(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTPEN(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTBRUSH(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCanvas(cl: TPSRuntimeClassImporter);
+procedure RIRegisterTGraphic(CL: TPSRuntimeClassImporter);
+procedure RIRegisterTBitmap(CL: TPSRuntimeClassImporter; Streams: Boolean);
+
+procedure RIRegister_Graphics(Cl: TPSRuntimeClassImporter; Streams: Boolean);
+
+implementation
+{$IFNDEF FPC}
+uses
+ Classes{$IFDEF CLX}, QGraphics{$ELSE}, Windows, Graphics{$ENDIF};
+{$ELSE}
+uses
+ Classes, Graphics,LCLType;
+{$ENDIF}
+
+{$IFNDEF CLX}
+procedure TFontHandleR(Self: TFont; var T: Longint); begin T := Self.Handle; end;
+procedure TFontHandleW(Self: TFont; T: Longint); begin Self.Handle := T; end;
+{$ENDIF}
+procedure TFontPixelsPerInchR(Self: TFont; var T: Longint); begin T := Self.PixelsPerInch; end;
+procedure TFontPixelsPerInchW(Self: TFont; T: Longint); begin {$IFNDEF FPC} Self.PixelsPerInch := T;{$ENDIF} end;
+procedure TFontStyleR(Self: TFont; var T: TFontStyles); begin T := Self.Style; end;
+procedure TFontStyleW(Self: TFont; T: TFontStyles); begin Self.Style:= T; end;
+
+procedure RIRegisterTFont(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TFont) do
+ begin
+ RegisterConstructor(@TFont.Create, 'CREATE');
+{$IFNDEF CLX}
+ RegisterPropertyHelper(@TFontHandleR, @TFontHandleW, 'HANDLE');
+{$ENDIF}
+ RegisterPropertyHelper(@TFontPixelsPerInchR, @TFontPixelsPerInchW, 'PIXELSPERINCH');
+ RegisterPropertyHelper(@TFontStyleR, @TFontStyleW, 'STYLE');
+ end;
+end;
+{$IFNDEF CLX}
+procedure TCanvasHandleR(Self: TCanvas; var T: Longint); begin T := Self.Handle; end;
+procedure TCanvasHandleW(Self: TCanvas; T: Longint); begin Self.Handle:= T; end;
+{$ENDIF}
+
+procedure TCanvasPixelsR(Self: TCanvas; var T: Longint; X,Y: Longint); begin T := Self.Pixels[X,Y]; end;
+procedure TCanvasPixelsW(Self: TCanvas; T, X, Y: Longint); begin Self.Pixels[X,Y]:= T; end;
+
+procedure RIRegisterTCanvas(cl: TPSRuntimeClassImporter); // requires TPersistent
+begin
+ with Cl.Add(TCanvas) do
+ begin
+{$IFNDEF FPC}
+ RegisterMethod(@TCanvas.Arc, 'ARC');
+ RegisterMethod(@TCanvas.Chord, 'CHORD');
+ RegisterMethod(@TCanvas.Rectangle, 'RECTANGLE');
+ RegisterMethod(@TCanvas.RoundRect, 'ROUNDRECT');
+ RegisterMethod(@TCanvas.Ellipse, 'ELLIPSE');
+ RegisterMethod(@TCanvas.FillRect, 'FILLRECT');
+{$ENDIF}
+ RegisterMethod(@TCanvas.Draw, 'DRAW');
+{$IFNDEF CLX}
+ RegisterMethod(@TCanvas.FloodFill, 'FLOODFILL');
+{$ENDIF}
+ RegisterMethod(@TCanvas.Lineto, 'LINETO');
+ RegisterMethod(@TCanvas.Moveto, 'MOVETO');
+ RegisterMethod(@TCanvas.Pie, 'PIE');
+ RegisterMethod(@TCanvas.Refresh, 'REFRESH');
+ RegisterMethod(@TCanvas.TextHeight, 'TEXTHEIGHT');
+ RegisterMethod(@TCanvas.TextOut, 'TEXTOUT');
+ RegisterMethod(@TCanvas.TextWidth, 'TEXTWIDTH');
+{$IFNDEF CLX}
+ RegisterPropertyHelper(@TCanvasHandleR, @TCanvasHandleW, 'HANDLE');
+{$ENDIF}
+ RegisterPropertyHelper(@TCanvasPixelsR, @TCanvasPixelsW, 'PIXELS');
+ end;
+end;
+
+
+procedure TGRAPHICSOBJECTONCHANGE_W(Self: TGraphicsObject; T: TNotifyEvent); begin Self.OnChange := t; end;
+procedure TGRAPHICSOBJECTONCHANGE_R(Self: TGraphicsObject; var T: TNotifyEvent); begin T :=Self.OnChange; end;
+
+
+procedure RIRegisterTGRAPHICSOBJECT(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TGRAPHICSOBJECT) do
+ begin
+ RegisterPropertyHelper(@TGRAPHICSOBJECTONCHANGE_R, @TGRAPHICSOBJECTONCHANGE_W, 'ONCHANGE');
+ end;
+end;
+
+procedure RIRegisterTPEN(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TPEN) do
+ begin
+ RegisterConstructor(@TPEN.CREATE, 'CREATE');
+ end;
+end;
+
+procedure RIRegisterTBRUSH(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TBRUSH) do
+ begin
+ RegisterConstructor(@TBRUSH.CREATE, 'CREATE');
+ end;
+end;
+
+procedure TGraphicOnChange_W(Self: TGraphic; const T: TNotifyEvent); begin Self.OnChange := T; end;
+procedure TGraphicOnChange_R(Self: TGraphic; var T: TNotifyEvent); begin T := Self.OnChange; end;
+procedure TGraphicWidth_W(Self: TGraphic; const T: Integer); begin Self.Width := T; end;
+procedure TGraphicWidth_R(Self: TGraphic; var T: Integer); begin T := Self.Width; end;
+procedure TGraphicModified_W(Self: TGraphic; const T: Boolean); begin Self.Modified := T; end;
+procedure TGraphicModified_R(Self: TGraphic; var T: Boolean); begin T := Self.Modified; end;
+procedure TGraphicHeight_W(Self: TGraphic; const T: Integer); begin Self.Height := T; end;
+procedure TGraphicHeight_R(Self: TGraphic; var T: Integer); begin T := Self.Height; end;
+procedure TGraphicEmpty_R(Self: TGraphic; var T: Boolean); begin T := Self.Empty; end;
+
+procedure RIRegisterTGraphic(CL: TPSRuntimeClassImporter);
+begin
+ with CL.Add(TGraphic) do
+ begin
+ RegisterVirtualConstructor(@TGraphic.Create, 'Create');
+ RegisterVirtualMethod(@TGraphic.LoadFromFile, 'LoadFromFile');
+ RegisterVirtualMethod(@TGraphic.SaveToFile, 'SaveToFile');
+ RegisterPropertyHelper(@TGraphicEmpty_R,nil,'Empty');
+ RegisterPropertyHelper(@TGraphicHeight_R,@TGraphicHeight_W,'Height');
+ RegisterPropertyHelper(@TGraphicWidth_R,@TGraphicWidth_W,'Width');
+ RegisterPropertyHelper(@TGraphicOnChange_R,@TGraphicOnChange_W,'OnChange');
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterPropertyHelper(@TGraphicModified_R,@TGraphicModified_W,'Modified');
+ {$ENDIF}
+ end;
+end;
+
+procedure TBitmapTransparentColor_R(Self: TBitmap; var T: TColor); begin T := Self.TransparentColor; end;
+{$IFNDEF CLX}
+{$IFNDEF FPC}
+procedure TBitmapIgnorePalette_W(Self: TBitmap; const T: Boolean); begin Self.IgnorePalette := T; end;
+procedure TBitmapIgnorePalette_R(Self: TBitmap; var T: Boolean); begin T := Self.IgnorePalette; end;
+{$ENDIF}
+procedure TBitmapPalette_W(Self: TBitmap; const T: HPALETTE); begin Self.Palette := T; end;
+procedure TBitmapPalette_R(Self: TBitmap; var T: HPALETTE); begin T := Self.Palette; end;
+{$ENDIF}
+procedure TBitmapMonochrome_W(Self: TBitmap; const T: Boolean); begin Self.Monochrome := T; end;
+procedure TBitmapMonochrome_R(Self: TBitmap; var T: Boolean); begin T := Self.Monochrome; end;
+{$IFNDEF CLX}
+procedure TBitmapHandle_W(Self: TBitmap; const T: HBITMAP); begin Self.Handle := T; end;
+procedure TBitmapHandle_R(Self: TBitmap; var T: HBITMAP); begin T := Self.Handle; end;
+{$ENDIF}
+procedure TBitmapCanvas_R(Self: TBitmap; var T: TCanvas); begin T := Self.Canvas; end;
+
+procedure RIRegisterTBitmap(CL: TPSRuntimeClassImporter; Streams: Boolean);
+begin
+ with CL.Add(TBitmap) do
+ begin
+ if Streams then begin
+ RegisterMethod(@TBitmap.LoadFromStream, 'LoadFromStream');
+ RegisterMethod(@TBitmap.SaveToStream, 'SaveToStream');
+ end;
+ RegisterPropertyHelper(@TBitmapCanvas_R,nil,'Canvas');
+{$IFNDEF CLX}
+ RegisterPropertyHelper(@TBitmapHandle_R,@TBitmapHandle_W,'Handle');
+{$ENDIF}
+
+ {$IFNDEF PS_MINIVCL}
+{$IFNDEF FPC}
+ RegisterMethod(@TBitmap.Dormant, 'Dormant');
+{$ENDIF}
+ RegisterMethod(@TBitmap.FreeImage, 'FreeImage');
+{$IFNDEF CLX}
+ RegisterMethod(@TBitmap.LoadFromClipboardFormat, 'LoadFromClipboardFormat');
+{$ENDIF}
+ RegisterMethod(@TBitmap.LoadFromResourceName, 'LoadFromResourceName');
+ RegisterMethod(@TBitmap.LoadFromResourceID, 'LoadFromResourceID');
+{$IFNDEF CLX}
+ RegisterMethod(@TBitmap.ReleaseHandle, 'ReleaseHandle');
+ RegisterMethod(@TBitmap.ReleasePalette, 'ReleasePalette');
+ RegisterMethod(@TBitmap.SaveToClipboardFormat, 'SaveToClipboardFormat');
+ RegisterPropertyHelper(@TBitmapMonochrome_R,@TBitmapMonochrome_W,'Monochrome');
+ RegisterPropertyHelper(@TBitmapPalette_R,@TBitmapPalette_W,'Palette');
+{$IFNDEF FPC}
+ RegisterPropertyHelper(@TBitmapIgnorePalette_R,@TBitmapIgnorePalette_W,'IgnorePalette');
+{$ENDIF}
+{$ENDIF}
+ RegisterPropertyHelper(@TBitmapTransparentColor_R,nil,'TransparentColor');
+ {$ENDIF}
+ end;
+end;
+
+procedure RIRegister_Graphics(Cl: TPSRuntimeClassImporter; Streams: Boolean);
+begin
+ RIRegisterTGRAPHICSOBJECT(cl);
+ RIRegisterTFont(Cl);
+ RIRegisterTCanvas(cl);
+ RIRegisterTPEN(cl);
+ RIRegisterTBRUSH(cl);
+ RIRegisterTGraphic(CL);
+ RIRegisterTBitmap(CL, Streams);
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+end.
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_menus.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_menus.pas
new file mode 100644
index 0000000..79a0e38
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_menus.pas
@@ -0,0 +1,460 @@
+
+Unit uPSR_menus;
+{$I PascalScript.inc}
+Interface
+Uses uPSRuntime;
+
+procedure RIRegister_Menus_Routines(S: TPSExec);
+{$IFNDEF FPC}
+procedure RIRegisterTMENUITEMSTACK(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTPOPUPLIST(Cl: TPSRuntimeClassImporter);
+{$ENDIF}
+procedure RIRegisterTPOPUPMENU(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTMAINMENU(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTMENU(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTMENUITEM(Cl: TPSRuntimeClassImporter);
+procedure RIRegister_Menus(CL: TPSRuntimeClassImporter);
+
+implementation
+{$IFDEF LINUX}
+{$IFNDEF FPC}
+Uses
+ Libc, SysUtils, Classes, QControls, QMenus, QGraphics;
+{$ELSE}
+Uses
+ SysUtils, Classes, Controls, Menus, Graphics, LCLType, ImgList;
+{$ENDIF}
+{$ELSE}
+Uses {$IFNDEF FPC}WINDOWS,{$ELSE} LCLType,{$ENDIF} SYSUTILS, CLASSES, CONTNRS, MESSAGES, GRAPHICS, IMGLIST, ACTNLIST, Menus;
+{$ENDIF}
+
+
+{$IFNDEF FPC}
+procedure TPOPUPLISTWINDOW_R(Self: TPOPUPLIST; var T: HWND);
+begin T := Self.WINDOW; end;
+{$ENDIF}
+
+procedure TPOPUPMENUONPOPUP_W(Self: TPOPUPMENU; const T: TNOTIFYEVENT);
+begin Self.ONPOPUP := T; end;
+
+procedure TPOPUPMENUONPOPUP_R(Self: TPOPUPMENU; var T: TNOTIFYEVENT);
+begin T := Self.ONPOPUP; end;
+
+{$IFNDEF FPC}
+procedure TPOPUPMENUTRACKBUTTON_W(Self: TPOPUPMENU; const T: TTRACKBUTTON);
+begin Self.TRACKBUTTON := T; end;
+
+procedure TPOPUPMENUTRACKBUTTON_R(Self: TPOPUPMENU; var T: TTRACKBUTTON);
+begin T := Self.TRACKBUTTON; end;
+
+
+procedure TPOPUPMENUMENUANIMATION_W(Self: TPOPUPMENU; const T: TMENUANIMATION);
+begin Self.MENUANIMATION := T; end;
+
+procedure TPOPUPMENUMENUANIMATION_R(Self: TPOPUPMENU; var T: TMENUANIMATION);
+begin T := Self.MENUANIMATION; end;
+
+procedure TPOPUPMENUHELPCONTEXT_W(Self: TPOPUPMENU; const T: THELPCONTEXT);
+begin Self.HELPCONTEXT := T; end;
+
+procedure TPOPUPMENUHELPCONTEXT_R(Self: TPOPUPMENU; var T: THELPCONTEXT);
+begin T := Self.HELPCONTEXT; end;
+{$ENDIF}
+
+procedure TPOPUPMENUAUTOPOPUP_W(Self: TPOPUPMENU; const T: BOOLEAN);
+begin Self.AUTOPOPUP := T; end;
+
+procedure TPOPUPMENUAUTOPOPUP_R(Self: TPOPUPMENU; var T: BOOLEAN);
+begin T := Self.AUTOPOPUP; end;
+
+{$IFNDEF FPC}
+procedure TPOPUPMENUALIGNMENT_W(Self: TPOPUPMENU; const T: TPOPUPALIGNMENT);
+begin Self.ALIGNMENT := T; end;
+
+procedure TPOPUPMENUALIGNMENT_R(Self: TPOPUPMENU; var T: TPOPUPALIGNMENT);
+begin T := Self.ALIGNMENT; end;
+{$ENDIF}
+
+procedure TPOPUPMENUPOPUPCOMPONENT_W(Self: TPOPUPMENU; const T: TCOMPONENT);
+begin Self.POPUPCOMPONENT := T; end;
+
+procedure TPOPUPMENUPOPUPCOMPONENT_R(Self: TPOPUPMENU; var T: TCOMPONENT);
+begin T := Self.POPUPCOMPONENT; end;
+
+{$IFNDEF FPC}
+procedure TMAINMENUAUTOMERGE_W(Self: TMAINMENU; const T: BOOLEAN);
+begin Self.AUTOMERGE := T; end;
+
+procedure TMAINMENUAUTOMERGE_R(Self: TMAINMENU; var T: BOOLEAN);
+begin T := Self.AUTOMERGE; end;
+{$ENDIF}
+
+procedure TMENUITEMS_R(Self: TMENU; var T: TMENUITEM);
+begin T := Self.ITEMS; end;
+
+
+{$IFNDEF FPC}
+procedure TMENUWINDOWHANDLE_W(Self: TMENU; const T: HWND);
+begin Self.WINDOWHANDLE := T; end;
+
+procedure TMENUWINDOWHANDLE_R(Self: TMENU; var T: HWND);
+begin T := Self.WINDOWHANDLE; end;
+
+procedure TMENUPARENTBIDIMODE_W(Self: TMENU; const T: BOOLEAN);
+begin Self.PARENTBIDIMODE := T; end;
+
+procedure TMENUPARENTBIDIMODE_R(Self: TMENU; var T: BOOLEAN);
+begin T := Self.PARENTBIDIMODE; end;
+
+procedure TMENUOWNERDRAW_W(Self: TMENU; const T: BOOLEAN);
+begin Self.OWNERDRAW := T; end;
+
+procedure TMENUOWNERDRAW_R(Self: TMENU; var T: BOOLEAN);
+begin T := Self.OWNERDRAW; end;
+
+procedure TMENUBIDIMODE_W(Self: TMENU; const T: TBIDIMODE);
+begin Self.BIDIMODE := T; end;
+
+procedure TMENUBIDIMODE_R(Self: TMENU; var T: TBIDIMODE);
+begin T := Self.BIDIMODE; end;
+
+procedure TMENUAUTOLINEREDUCTION_W(Self: TMENU; const T: TMENUAUTOFLAG);
+begin Self.AUTOLINEREDUCTION := T; end;
+
+procedure TMENUAUTOLINEREDUCTION_R(Self: TMENU; var T: TMENUAUTOFLAG);
+begin T := Self.AUTOLINEREDUCTION; end;
+
+procedure TMENUAUTOHOTKEYS_W(Self: TMENU; const T: TMENUAUTOFLAG);
+begin Self.AUTOHOTKEYS := T; end;
+
+procedure TMENUAUTOHOTKEYS_R(Self: TMENU; var T: TMENUAUTOFLAG);
+begin T := Self.AUTOHOTKEYS; end;
+
+{$ENDIF}
+
+
+procedure TMENUHANDLE_R(Self: TMENU; var T: HMENU);
+begin T := Self.HANDLE; end;
+
+
+
+
+procedure TMENUIMAGES_W(Self: TMENU; const T: TCUSTOMIMAGELIST);
+begin Self.IMAGES := T; end;
+
+procedure TMENUIMAGES_R(Self: TMENU; var T: TCUSTOMIMAGELIST);
+begin T := Self.IMAGES; end;
+
+{$IFNDEF FPC}
+procedure TMENUITEMONMEASUREITEM_W(Self: TMENUITEM; const T: TMENUMEASUREITEMEVENT);
+begin Self.ONMEASUREITEM := T; end;
+
+procedure TMENUITEMONMEASUREITEM_R(Self: TMENUITEM; var T: TMENUMEASUREITEMEVENT);
+begin T := Self.ONMEASUREITEM; end;
+
+procedure TMENUITEMONADVANCEDDRAWITEM_W(Self: TMENUITEM; const T: TADVANCEDMENUDRAWITEMEVENT);
+begin Self.ONADVANCEDDRAWITEM := T; end;
+
+procedure TMENUITEMONADVANCEDDRAWITEM_R(Self: TMENUITEM; var T: TADVANCEDMENUDRAWITEMEVENT);
+begin T := Self.ONADVANCEDDRAWITEM; end;
+
+procedure TMENUITEMONDRAWITEM_W(Self: TMENUITEM; const T: TMENUDRAWITEMEVENT);
+begin Self.ONDRAWITEM := T; end;
+
+procedure TMENUITEMONDRAWITEM_R(Self: TMENUITEM; var T: TMENUDRAWITEMEVENT);
+begin T := Self.ONDRAWITEM; end;
+{$ENDIF}
+
+procedure TMENUITEMONCLICK_W(Self: TMENUITEM; const T: TNOTIFYEVENT);
+begin Self.ONCLICK := T; end;
+
+procedure TMENUITEMONCLICK_R(Self: TMENUITEM; var T: TNOTIFYEVENT);
+begin T := Self.ONCLICK; end;
+
+procedure TMENUITEMVISIBLE_W(Self: TMENUITEM; const T: BOOLEAN);
+begin Self.VISIBLE := T; end;
+
+procedure TMENUITEMVISIBLE_R(Self: TMENUITEM; var T: BOOLEAN);
+begin T := Self.VISIBLE; end;
+
+procedure TMENUITEMSHORTCUT_W(Self: TMENUITEM; const T: TSHORTCUT);
+begin Self.SHORTCUT := T; end;
+
+procedure TMENUITEMSHORTCUT_R(Self: TMENUITEM; var T: TSHORTCUT);
+begin T := Self.SHORTCUT; end;
+
+procedure TMENUITEMRADIOITEM_W(Self: TMENUITEM; const T: BOOLEAN);
+begin Self.RADIOITEM := T; end;
+
+procedure TMENUITEMRADIOITEM_R(Self: TMENUITEM; var T: BOOLEAN);
+begin T := Self.RADIOITEM; end;
+
+procedure TMENUITEMIMAGEINDEX_W(Self: TMENUITEM; const T: TIMAGEINDEX);
+begin Self.IMAGEINDEX := T; end;
+
+procedure TMENUITEMIMAGEINDEX_R(Self: TMENUITEM; var T: TIMAGEINDEX);
+begin T := Self.IMAGEINDEX; end;
+
+procedure TMENUITEMHINT_W(Self: TMENUITEM; const T: STRING);
+begin Self.HINT := T; end;
+
+procedure TMENUITEMHINT_R(Self: TMENUITEM; var T: STRING);
+begin T := Self.HINT; end;
+
+procedure TMENUITEMHELPCONTEXT_W(Self: TMENUITEM; const T: THELPCONTEXT);
+begin Self.HELPCONTEXT := T; end;
+
+procedure TMENUITEMHELPCONTEXT_R(Self: TMENUITEM; var T: THELPCONTEXT);
+begin T := Self.HELPCONTEXT; end;
+
+procedure TMENUITEMGROUPINDEX_W(Self: TMENUITEM; const T: BYTE);
+begin Self.GROUPINDEX := T; end;
+
+procedure TMENUITEMGROUPINDEX_R(Self: TMENUITEM; var T: BYTE);
+begin T := Self.GROUPINDEX; end;
+
+procedure TMENUITEMENABLED_W(Self: TMENUITEM; const T: BOOLEAN);
+begin Self.ENABLED := T; end;
+
+procedure TMENUITEMENABLED_R(Self: TMENUITEM; var T: BOOLEAN);
+begin T := Self.ENABLED; end;
+
+procedure TMENUITEMDEFAULT_W(Self: TMENUITEM; const T: BOOLEAN);
+begin Self.DEFAULT := T; end;
+
+procedure TMENUITEMDEFAULT_R(Self: TMENUITEM; var T: BOOLEAN);
+begin T := Self.DEFAULT; end;
+
+procedure TMENUITEMSUBMENUIMAGES_W(Self: TMENUITEM; const T: TCUSTOMIMAGELIST);
+begin Self.SUBMENUIMAGES := T; end;
+
+procedure TMENUITEMSUBMENUIMAGES_R(Self: TMENUITEM; var T: TCUSTOMIMAGELIST);
+begin T := Self.SUBMENUIMAGES; end;
+
+procedure TMENUITEMCHECKED_W(Self: TMENUITEM; const T: BOOLEAN);
+begin Self.CHECKED := T; end;
+
+procedure TMENUITEMCHECKED_R(Self: TMENUITEM; var T: BOOLEAN);
+begin T := Self.CHECKED; end;
+
+procedure TMENUITEMCAPTION_W(Self: TMENUITEM; const T: STRING);
+begin Self.CAPTION := T; end;
+
+procedure TMENUITEMCAPTION_R(Self: TMENUITEM; var T: STRING);
+begin T := Self.CAPTION; end;
+
+procedure TMENUITEMBITMAP_W(Self: TMENUITEM; const T: TBITMAP);
+begin Self.BITMAP := T; end;
+
+procedure TMENUITEMBITMAP_R(Self: TMENUITEM; var T: TBITMAP);
+begin T := Self.BITMAP; end;
+
+{$IFNDEF FPC}
+procedure TMENUITEMAUTOLINEREDUCTION_W(Self: TMENUITEM; const T: TMENUITEMAUTOFLAG);
+begin Self.AUTOLINEREDUCTION := T; end;
+
+procedure TMENUITEMAUTOLINEREDUCTION_R(Self: TMENUITEM; var T: TMENUITEMAUTOFLAG);
+begin T := Self.AUTOLINEREDUCTION; end;
+
+procedure TMENUITEMAUTOHOTKEYS_W(Self: TMENUITEM; const T: TMENUITEMAUTOFLAG);
+begin Self.AUTOHOTKEYS := T; end;
+
+procedure TMENUITEMAUTOHOTKEYS_R(Self: TMENUITEM; var T: TMENUITEMAUTOFLAG);
+begin T := Self.AUTOHOTKEYS; end;
+{$ENDIF}
+
+procedure TMENUITEMACTION_W(Self: TMENUITEM; const T: TBASICACTION);
+begin Self.ACTION := T; end;
+
+procedure TMENUITEMACTION_R(Self: TMENUITEM; var T: TBASICACTION);
+begin T := Self.ACTION; end;
+
+procedure TMENUITEMPARENT_R(Self: TMENUITEM; var T: TMENUITEM);
+begin T := Self.PARENT; end;
+
+procedure TMENUITEMMENUINDEX_W(Self: TMENUITEM; const T: INTEGER);
+begin Self.MENUINDEX := T; end;
+
+procedure TMENUITEMMENUINDEX_R(Self: TMENUITEM; var T: INTEGER);
+begin T := Self.MENUINDEX; end;
+
+procedure TMENUITEMITEMS_R(Self: TMENUITEM; var T: TMENUITEM; const t1: INTEGER);
+begin T := Self.ITEMS[t1]; end;
+
+procedure TMENUITEMCOUNT_R(Self: TMENUITEM; var T: INTEGER);
+begin T := Self.COUNT; end;
+
+procedure TMENUITEMHANDLE_R(Self: TMENUITEM; var T: HMENU);
+begin T := Self.HANDLE; end;
+
+procedure TMENUITEMCOMMAND_R(Self: TMENUITEM; var T: WORD);
+begin T := Self.COMMAND; end;
+
+procedure RIRegister_Menus_Routines(S: TPSExec);
+begin
+ S.RegisterDelphiFunction(@SHORTCUT, 'SHORTCUT', cdRegister);
+ S.RegisterDelphiFunction(@SHORTCUTTOKEY, 'SHORTCUTTOKEY', cdRegister);
+{$IFNDEF FPC}
+ S.RegisterDelphiFunction(@SHORTCUTTOTEXT, 'SHORTCUTTOTEXT', cdRegister);
+ S.RegisterDelphiFunction(@TEXTTOSHORTCUT, 'TEXTTOSHORTCUT', cdRegister);
+ S.RegisterDelphiFunction(@NEWMENU, 'NEWMENU', cdRegister);
+ S.RegisterDelphiFunction(@NEWPOPUPMENU, 'NEWPOPUPMENU', cdRegister);
+ S.RegisterDelphiFunction(@NEWSUBMENU, 'NEWSUBMENU', cdRegister);
+ S.RegisterDelphiFunction(@NEWITEM, 'NEWITEM', cdRegister);
+ S.RegisterDelphiFunction(@NEWLINE, 'NEWLINE', cdRegister);
+ S.RegisterDelphiFunction(@DRAWMENUITEM, 'DRAWMENUITEM', cdRegister);
+{$ENDIF}
+end;
+
+{$IFNDEF FPC}
+procedure RIRegisterTMENUITEMSTACK(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TMENUITEMSTACK) do
+ begin
+ RegisterMethod(@TMENUITEMSTACK.CLEARITEM, 'CLEARITEM');
+ end;
+end;
+
+procedure RIRegisterTPOPUPLIST(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TPOPUPLIST) do
+ begin
+ RegisterPropertyHelper(@TPOPUPLISTWINDOW_R,nil,'WINDOW');
+ RegisterMethod(@TPOPUPLIST.ADD, 'ADD');
+ RegisterMethod(@TPOPUPLIST.REMOVE, 'REMOVE');
+ end;
+end;
+{$ENDIF}
+
+
+procedure RIRegisterTPOPUPMENU(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TPOPUPMENU) do
+ begin
+ RegisterConstructor(@TPOPUPMENU.CREATE, 'CREATE');
+ RegisterVirtualMethod(@TPOPUPMENU.POPUP, 'POPUP');
+ RegisterPropertyHelper(@TPOPUPMENUPOPUPCOMPONENT_R,@TPOPUPMENUPOPUPCOMPONENT_W,'POPUPCOMPONENT');
+ RegisterEventPropertyHelper(@TPOPUPMENUONPOPUP_R,@TPOPUPMENUONPOPUP_W,'ONPOPUP');
+{$IFNDEF FPC}
+ RegisterPropertyHelper(@TPOPUPMENUALIGNMENT_R,@TPOPUPMENUALIGNMENT_W,'ALIGNMENT');
+ RegisterPropertyHelper(@TPOPUPMENUAUTOPOPUP_R,@TPOPUPMENUAUTOPOPUP_W,'AUTOPOPUP');
+ RegisterPropertyHelper(@TPOPUPMENUHELPCONTEXT_R,@TPOPUPMENUHELPCONTEXT_W,'HELPCONTEXT');
+ RegisterPropertyHelper(@TPOPUPMENUMENUANIMATION_R,@TPOPUPMENUMENUANIMATION_W,'MENUANIMATION');
+ RegisterPropertyHelper(@TPOPUPMENUTRACKBUTTON_R,@TPOPUPMENUTRACKBUTTON_W,'TRACKBUTTON');
+{$ENDIF}
+ end;
+end;
+
+procedure RIRegisterTMAINMENU(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TMAINMENU) do
+ begin
+{$IFNDEF FPC}
+ RegisterMethod(@TMAINMENU.MERGE, 'MERGE');
+ RegisterMethod(@TMAINMENU.UNMERGE, 'UNMERGE');
+ RegisterMethod(@TMAINMENU.POPULATEOLE2MENU, 'POPULATEOLE2MENU');
+ RegisterMethod(@TMAINMENU.GETOLE2ACCELERATORTABLE, 'GETOLE2ACCELERATORTABLE');
+ RegisterMethod(@TMAINMENU.SETOLE2MENUHANDLE, 'SETOLE2MENUHANDLE');
+ RegisterPropertyHelper(@TMAINMENUAUTOMERGE_R,@TMAINMENUAUTOMERGE_W,'AUTOMERGE');
+{$ENDIF}
+ end;
+end;
+
+
+procedure RIRegisterTMENU(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TMENU) do
+ begin
+ RegisterConstructor(@TMENU.CREATE, 'CREATE');
+ RegisterMethod(@TMENU.DISPATCHCOMMAND, 'DISPATCHCOMMAND');
+ RegisterMethod(@TMENU.FINDITEM, 'FINDITEM');
+ RegisterPropertyHelper(@TMENUIMAGES_R,@TMENUIMAGES_W,'IMAGES');
+ RegisterMethod(@TMENU.ISRIGHTTOLEFT, 'ISRIGHTTOLEFT');
+ RegisterPropertyHelper(@TMENUHANDLE_R,nil,'HANDLE');
+ RegisterPropertyHelper(@TMENUITEMS_R,nil,'ITEMS');
+{$IFNDEF FPC}
+ RegisterMethod(@TMENU.DISPATCHPOPUP, 'DISPATCHPOPUP');
+ RegisterMethod(@TMENU.PARENTBIDIMODECHANGED, 'PARENTBIDIMODECHANGED');
+ RegisterMethod(@TMENU.PROCESSMENUCHAR, 'PROCESSMENUCHAR');
+ RegisterPropertyHelper(@TMENUAUTOHOTKEYS_R,@TMENUAUTOHOTKEYS_W,'AUTOHOTKEYS');
+ RegisterPropertyHelper(@TMENUAUTOLINEREDUCTION_R,@TMENUAUTOLINEREDUCTION_W,'AUTOLINEREDUCTION');
+ RegisterPropertyHelper(@TMENUBIDIMODE_R,@TMENUBIDIMODE_W,'BIDIMODE');
+ RegisterMethod(@TMENU.GETHELPCONTEXT, 'GETHELPCONTEXT');
+ RegisterPropertyHelper(@TMENUOWNERDRAW_R,@TMENUOWNERDRAW_W,'OWNERDRAW');
+ RegisterPropertyHelper(@TMENUPARENTBIDIMODE_R,@TMENUPARENTBIDIMODE_W,'PARENTBIDIMODE');
+ RegisterPropertyHelper(@TMENUWINDOWHANDLE_R,@TMENUWINDOWHANDLE_W,'WINDOWHANDLE');
+{$ENDIF}
+ end;
+end;
+
+procedure RIRegisterTMENUITEM(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TMENUITEM) do
+ begin
+ RegisterConstructor(@TMENUITEM.CREATE, 'CREATE');
+ RegisterVirtualMethod(@TMENUITEM.INITIATEACTION, 'INITIATEACTION');
+ RegisterMethod(@TMENUITEM.INSERT, 'INSERT');
+ RegisterMethod(@TMENUITEM.DELETE, 'DELETE');
+ RegisterMethod(@TMENUITEM.CLEAR, 'CLEAR');
+ RegisterVirtualMethod(@TMENUITEM.CLICK, 'CLICK');
+{$IFNDEF FPC}
+ RegisterMethod(@TMENUITEM.FIND, 'FIND');
+ RegisterMethod(@TMENUITEM.NEWTOPLINE, 'NEWTOPLINE');
+ RegisterMethod(@TMENUITEM.NEWBOTTOMLINE, 'NEWBOTTOMLINE');
+ RegisterMethod(@TMENUITEM.INSERTNEWLINEBEFORE, 'INSERTNEWLINEBEFORE');
+ RegisterMethod(@TMENUITEM.INSERTNEWLINEAFTER, 'INSERTNEWLINEAFTER');
+ RegisterMethod(@TMENUITEM.RETHINKHOTKEYS, 'RETHINKHOTKEYS');
+ RegisterMethod(@TMENUITEM.RETHINKLINES, 'RETHINKLINES');
+ RegisterMethod(@TMENUITEM.ISLINE, 'ISLINE');
+{$ENDIF}
+ RegisterMethod(@TMENUITEM.INDEXOF, 'INDEXOF');
+ RegisterMethod(@TMENUITEM.GETIMAGELIST, 'GETIMAGELIST');
+ RegisterMethod(@TMENUITEM.GETPARENTCOMPONENT, 'GETPARENTCOMPONENT');
+ RegisterMethod(@TMENUITEM.GETPARENTMENU, 'GETPARENTMENU');
+ RegisterMethod(@TMENUITEM.HASPARENT, 'HASPARENT');
+ RegisterMethod(@TMENUITEM.ADD, 'ADD');
+ RegisterMethod(@TMENUITEM.REMOVE, 'REMOVE');
+{$IFNDEF FPC}
+ RegisterPropertyHelper(@TMENUITEMAUTOHOTKEYS_R,@TMENUITEMAUTOHOTKEYS_W,'AUTOHOTKEYS');
+ RegisterPropertyHelper(@TMENUITEMAUTOLINEREDUCTION_R,@TMENUITEMAUTOLINEREDUCTION_W,'AUTOLINEREDUCTION');
+ RegisterEventPropertyHelper(@TMENUITEMONDRAWITEM_R,@TMENUITEMONDRAWITEM_W,'ONDRAWITEM');
+ RegisterEventPropertyHelper(@TMENUITEMONADVANCEDDRAWITEM_R,@TMENUITEMONADVANCEDDRAWITEM_W,'ONADVANCEDDRAWITEM');
+ RegisterEventPropertyHelper(@TMENUITEMONMEASUREITEM_R,@TMENUITEMONMEASUREITEM_W,'ONMEASUREITEM');
+{$ENDIF}
+ RegisterPropertyHelper(@TMENUITEMCOMMAND_R,nil,'COMMAND');
+ RegisterPropertyHelper(@TMENUITEMHANDLE_R,nil,'HANDLE');
+ RegisterPropertyHelper(@TMENUITEMCOUNT_R,nil,'COUNT');
+ RegisterPropertyHelper(@TMENUITEMITEMS_R,nil,'ITEMS');
+ RegisterPropertyHelper(@TMENUITEMMENUINDEX_R,@TMENUITEMMENUINDEX_W,'MENUINDEX');
+ RegisterPropertyHelper(@TMENUITEMPARENT_R,nil,'PARENT');
+ RegisterPropertyHelper(@TMENUITEMACTION_R,@TMENUITEMACTION_W,'ACTION');
+ RegisterPropertyHelper(@TMENUITEMBITMAP_R,@TMENUITEMBITMAP_W,'BITMAP');
+ RegisterPropertyHelper(@TMENUITEMCAPTION_R,@TMENUITEMCAPTION_W,'CAPTION');
+ RegisterPropertyHelper(@TMENUITEMCHECKED_R,@TMENUITEMCHECKED_W,'CHECKED');
+ RegisterPropertyHelper(@TMENUITEMSUBMENUIMAGES_R,@TMENUITEMSUBMENUIMAGES_W,'SUBMENUIMAGES');
+ RegisterPropertyHelper(@TMENUITEMDEFAULT_R,@TMENUITEMDEFAULT_W,'DEFAULT');
+ RegisterPropertyHelper(@TMENUITEMENABLED_R,@TMENUITEMENABLED_W,'ENABLED');
+ RegisterPropertyHelper(@TMENUITEMGROUPINDEX_R,@TMENUITEMGROUPINDEX_W,'GROUPINDEX');
+ RegisterPropertyHelper(@TMENUITEMHELPCONTEXT_R,@TMENUITEMHELPCONTEXT_W,'HELPCONTEXT');
+ RegisterPropertyHelper(@TMENUITEMHINT_R,@TMENUITEMHINT_W,'HINT');
+ RegisterPropertyHelper(@TMENUITEMIMAGEINDEX_R,@TMENUITEMIMAGEINDEX_W,'IMAGEINDEX');
+ RegisterPropertyHelper(@TMENUITEMRADIOITEM_R,@TMENUITEMRADIOITEM_W,'RADIOITEM');
+ RegisterPropertyHelper(@TMENUITEMSHORTCUT_R,@TMENUITEMSHORTCUT_W,'SHORTCUT');
+ RegisterPropertyHelper(@TMENUITEMVISIBLE_R,@TMENUITEMVISIBLE_W,'VISIBLE');
+ RegisterEventPropertyHelper(@TMENUITEMONCLICK_R,@TMENUITEMONCLICK_W,'ONCLICK');
+ end;
+end;
+
+procedure RIRegister_Menus(CL: TPSRuntimeClassImporter);
+begin
+ RIRegisterTMENUITEM(Cl);
+ RIRegisterTMENU(Cl);
+ RIRegisterTPOPUPMENU(Cl);
+ RIRegisterTMAINMENU(Cl);
+ {$IFNDEF FPC}
+ RIRegisterTPOPUPLIST(Cl);
+ RIRegisterTMENUITEMSTACK(Cl);
+ {$ENDIF}
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_std.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_std.pas
new file mode 100644
index 0000000..a67946e
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_std.pas
@@ -0,0 +1,85 @@
+
+unit uPSR_std;
+{$I PascalScript.inc}
+interface
+uses
+ uPSRuntime, uPSUtils;
+
+
+procedure RIRegisterTObject(CL: TPSRuntimeClassImporter);
+procedure RIRegisterTPersistent(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTComponent(Cl: TPSRuntimeClassImporter);
+procedure RIRegister_Std(Cl: TPSRuntimeClassImporter);
+
+implementation
+uses
+ Classes;
+
+
+
+procedure RIRegisterTObject(CL: TPSRuntimeClassImporter);
+begin
+ with cl.Add(TObject) do
+ begin
+ RegisterConstructor(@TObject.Create, 'CREATE');
+ RegisterMethod(@TObject.Free, 'FREE');
+ end;
+end;
+
+procedure RIRegisterTPersistent(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TPersistent) do
+ begin
+ RegisterVirtualMethod(@TPersistent.Assign, 'ASSIGN');
+ end;
+end;
+
+procedure TComponentOwnerR(Self: TComponent; var T: TComponent); begin T := Self.Owner; end;
+
+
+procedure TCOMPONENTCOMPONENTS_R(Self: TCOMPONENT; var T: TCOMPONENT; t1: INTEGER); begin T := Self.COMPONENTS[t1]; end;
+procedure TCOMPONENTCOMPONENTCOUNT_R(Self: TCOMPONENT; var T: INTEGER); begin t := Self.COMPONENTCOUNT; end;
+procedure TCOMPONENTCOMPONENTINDEX_R(Self: TCOMPONENT; var T: INTEGER); begin t := Self.COMPONENTINDEX; end;
+procedure TCOMPONENTCOMPONENTINDEX_W(Self: TCOMPONENT; T: INTEGER); begin Self.COMPONENTINDEX := t; end;
+procedure TCOMPONENTCOMPONENTSTATE_R(Self: TCOMPONENT; var T: TCOMPONENTSTATE); begin t := Self.COMPONENTSTATE; end;
+procedure TCOMPONENTDESIGNINFO_R(Self: TCOMPONENT; var T: LONGINT); begin t := Self.DESIGNINFO; end;
+procedure TCOMPONENTDESIGNINFO_W(Self: TCOMPONENT; T: LONGINT); begin Self.DESIGNINFO := t; end;
+
+
+procedure RIRegisterTComponent(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TComponent) do
+ begin
+ RegisterMethod(@TComponent.FindComponent, 'FINDCOMPONENT');
+ RegisterVirtualConstructor(@TComponent.Create, 'CREATE');
+ RegisterPropertyHelper(@TComponentOwnerR, nil, 'OWNER');
+
+ RegisterMethod(@TCOMPONENT.DESTROYCOMPONENTS, 'DESTROYCOMPONENTS');
+ RegisterPropertyHelper(@TCOMPONENTCOMPONENTS_R, nil, 'COMPONENTS');
+ RegisterPropertyHelper(@TCOMPONENTCOMPONENTCOUNT_R, nil, 'COMPONENTCOUNT');
+ RegisterPropertyHelper(@TCOMPONENTCOMPONENTINDEX_R, @TCOMPONENTCOMPONENTINDEX_W, 'COMPONENTINDEX');
+ RegisterPropertyHelper(@TCOMPONENTCOMPONENTSTATE_R, nil, 'COMPONENTSTATE');
+ RegisterPropertyHelper(@TCOMPONENTDESIGNINFO_R, @TCOMPONENTDESIGNINFO_W, 'DESIGNINFO');
+ end;
+end;
+
+
+
+
+
+
+
+procedure RIRegister_Std(Cl: TPSRuntimeClassImporter);
+begin
+ RIRegisterTObject(CL);
+ RIRegisterTPersistent(Cl);
+ RIRegisterTComponent(Cl);
+end;
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+end.
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_stdctrls.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_stdctrls.pas
new file mode 100644
index 0000000..87eeab9
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSR_stdctrls.pas
@@ -0,0 +1,287 @@
+{ STDCtrls import unit }
+unit uPSR_stdctrls;
+
+{$I PascalScript.inc}
+interface
+uses
+ uPSRuntime, uPSUtils;
+
+
+procedure RIRegisterTCUSTOMGROUPBOX(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTGROUPBOX(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCUSTOMLABEL(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTLABEL(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCUSTOMEDIT(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTEDIT(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCUSTOMMEMO(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTMEMO(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCUSTOMCOMBOBOX(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCOMBOBOX(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTBUTTONCONTROL(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTBUTTON(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCUSTOMCHECKBOX(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCHECKBOX(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTRADIOBUTTON(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTCUSTOMLISTBOX(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTLISTBOX(Cl: TPSRuntimeClassImporter);
+procedure RIRegisterTSCROLLBAR(Cl: TPSRuntimeClassImporter);
+
+procedure RIRegister_stdctrls(cl: TPSRuntimeClassImporter);
+
+implementation
+uses
+ sysutils, classes{$IFDEF CLX}, QControls, QStdCtrls, QGraphics{$ELSE}, controls, stdctrls, Graphics{$ENDIF}{$IFDEF FPC},buttons{$ENDIF};
+
+procedure RIRegisterTCUSTOMGROUPBOX(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TCUSTOMGROUPBOX);
+end;
+
+
+procedure RIRegisterTGROUPBOX(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TGROUPBOX);
+end;
+{$IFNDEF CLX}
+procedure TCUSTOMLABELCANVAS_R(Self: TCUSTOMLABEL; var T: TCanvas); begin T := Self.CANVAS; end;
+{$ENDIF}
+
+procedure RIRegisterTCUSTOMLABEL(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TCUSTOMLABEL) do
+ begin
+ {$IFNDEF PS_MINIVCL}
+{$IFNDEF CLX}
+ RegisterPropertyHelper(@TCUSTOMLABELCANVAS_R, nil, 'CANVAS');
+{$ENDIF}
+ {$ENDIF}
+ end;
+end;
+
+procedure RIRegisterTLABEL(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TLABEL);
+end;
+procedure TCUSTOMEDITMODIFIED_R(Self: TCUSTOMEDIT; var T: BOOLEAN); begin T := Self.MODIFIED; end;
+procedure TCUSTOMEDITMODIFIED_W(Self: TCUSTOMEDIT; T: BOOLEAN); begin Self.MODIFIED := T; end;
+procedure TCUSTOMEDITSELLENGTH_R(Self: TCUSTOMEDIT; var T: INTEGER); begin T := Self.SELLENGTH; end;
+procedure TCUSTOMEDITSELLENGTH_W(Self: TCUSTOMEDIT; T: INTEGER); begin Self.SELLENGTH := T; end;
+procedure TCUSTOMEDITSELSTART_R(Self: TCUSTOMEDIT; var T: INTEGER); begin T := Self.SELSTART; end;
+procedure TCUSTOMEDITSELSTART_W(Self: TCUSTOMEDIT; T: INTEGER); begin Self.SELSTART := T; end;
+procedure TCUSTOMEDITSELTEXT_R(Self: TCUSTOMEDIT; var T: STRING); begin T := Self.SELTEXT; end;
+procedure TCUSTOMEDITSELTEXT_W(Self: TCUSTOMEDIT; T: STRING); begin Self.SELTEXT := T; end;
+procedure TCUSTOMEDITTEXT_R(Self: TCUSTOMEDIT; var T: string); begin T := Self.TEXT; end;
+procedure TCUSTOMEDITTEXT_W(Self: TCUSTOMEDIT; T: string); begin Self.TEXT := T; end;
+
+
+procedure RIRegisterTCUSTOMEDIT(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TCUSTOMEDIT) do
+ begin
+ RegisterMethod(@TCUSTOMEDIT.CLEAR, 'CLEAR');
+ RegisterMethod(@TCUSTOMEDIT.CLEARSELECTION, 'CLEARSELECTION');
+ RegisterMethod(@TCUSTOMEDIT.SELECTALL, 'SELECTALL');
+ RegisterPropertyHelper(@TCUSTOMEDITMODIFIED_R, @TCUSTOMEDITMODIFIED_W, 'MODIFIED');
+ RegisterPropertyHelper(@TCUSTOMEDITSELLENGTH_R, @TCUSTOMEDITSELLENGTH_W, 'SELLENGTH');
+ RegisterPropertyHelper(@TCUSTOMEDITSELSTART_R, @TCUSTOMEDITSELSTART_W, 'SELSTART');
+ RegisterPropertyHelper(@TCUSTOMEDITSELTEXT_R, @TCUSTOMEDITSELTEXT_W, 'SELTEXT');
+ RegisterPropertyHelper(@TCUSTOMEDITTEXT_R, @TCUSTOMEDITTEXT_W, 'TEXT');
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod(@TCUSTOMEDIT.COPYTOCLIPBOARD, 'COPYTOCLIPBOARD');
+ RegisterMethod(@TCUSTOMEDIT.CUTTOCLIPBOARD, 'CUTTOCLIPBOARD');
+ RegisterMethod(@TCUSTOMEDIT.PASTEFROMCLIPBOARD, 'PASTEFROMCLIPBOARD');
+ {$IFNDEF FPC}
+ RegisterMethod(@TCUSTOMEDIT.GETSELTEXTBUF, 'GETSELTEXTBUF');
+ RegisterMethod(@TCUSTOMEDIT.SETSELTEXTBUF, 'SETSELTEXTBUF');
+ {$ENDIF}{FPC}
+ {$ENDIF}
+ end;
+end;
+
+procedure RIRegisterTEDIT(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TEDIT);
+end;
+
+
+procedure TCUSTOMMEMOLINES_R(Self: {$IFDEF CLX}TMemo{$ELSE}TCUSTOMMEMO{$ENDIF}; var T: TSTRINGS); begin T := Self.LINES; end;
+procedure TCUSTOMMEMOLINES_W(Self: {$IFDEF CLX}TMemo{$ELSE}TCUSTOMMEMO{$ENDIF}; T: TSTRINGS); begin Self.LINES := T; end;
+
+
+procedure RIRegisterTCUSTOMMEMO(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TCUSTOMMEMO) do
+ begin
+ {$IFNDEF CLX}
+ RegisterPropertyHelper(@TCUSTOMMEMOLINES_R, @TCUSTOMMEMOLINES_W, 'LINES');
+ {$ENDIF}
+ end;
+end;
+
+
+procedure RIRegisterTMEMO(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TMEMO) do
+ begin
+ {$IFDEF CLX}
+ RegisterPropertyHelper(@TCUSTOMMEMOLINES_R, @TCUSTOMMEMOLINES_W, 'LINES');
+ {$ENDIF}
+ end;
+end;
+
+
+procedure TCUSTOMCOMBOBOXCANVAS_R(Self: TCUSTOMCOMBOBOX; var T: TCANVAS); begin T := Self.CANVAS; end;
+procedure TCUSTOMCOMBOBOXDROPPEDDOWN_R(Self: TCUSTOMCOMBOBOX; var T: BOOLEAN); begin T := Self.DROPPEDDOWN; end;
+procedure TCUSTOMCOMBOBOXDROPPEDDOWN_W(Self: TCUSTOMCOMBOBOX; T: BOOLEAN); begin Self.DROPPEDDOWN := T; end;
+procedure TCUSTOMCOMBOBOXITEMS_R(Self: TCUSTOMCOMBOBOX; var T: TSTRINGS); begin T := Self.ITEMS; end;
+procedure TCUSTOMCOMBOBOXITEMS_W(Self: TCUSTOMCOMBOBOX; T: TSTRINGS); begin Self.ITEMS := T; end;
+procedure TCUSTOMCOMBOBOXITEMINDEX_R(Self: TCUSTOMCOMBOBOX; var T: INTEGER); begin T := Self.ITEMINDEX; end;
+procedure TCUSTOMCOMBOBOXITEMINDEX_W(Self: TCUSTOMCOMBOBOX; T: INTEGER); begin Self.ITEMINDEX := T; end;
+procedure TCUSTOMCOMBOBOXSELLENGTH_R(Self: TCUSTOMCOMBOBOX; var T: INTEGER); begin T := Self.SELLENGTH; end;
+procedure TCUSTOMCOMBOBOXSELLENGTH_W(Self: TCUSTOMCOMBOBOX; T: INTEGER); begin Self.SELLENGTH := T; end;
+procedure TCUSTOMCOMBOBOXSELSTART_R(Self: TCUSTOMCOMBOBOX; var T: INTEGER); begin T := Self.SELSTART; end;
+procedure TCUSTOMCOMBOBOXSELSTART_W(Self: TCUSTOMCOMBOBOX; T: INTEGER); begin Self.SELSTART := T; end;
+procedure TCUSTOMCOMBOBOXSELTEXT_R(Self: TCUSTOMCOMBOBOX; var T: STRING); begin T := Self.SELTEXT; end;
+procedure TCUSTOMCOMBOBOXSELTEXT_W(Self: TCUSTOMCOMBOBOX; T: STRING); begin Self.SELTEXT := T; end;
+
+
+procedure RIRegisterTCUSTOMCOMBOBOX(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TCUSTOMCOMBOBOX) do
+ begin
+ RegisterPropertyHelper(@TCUSTOMCOMBOBOXDROPPEDDOWN_R, @TCUSTOMCOMBOBOXDROPPEDDOWN_W, 'DROPPEDDOWN');
+ RegisterPropertyHelper(@TCUSTOMCOMBOBOXITEMS_R, @TCUSTOMCOMBOBOXITEMS_W, 'ITEMS');
+ RegisterPropertyHelper(@TCUSTOMCOMBOBOXITEMINDEX_R, @TCUSTOMCOMBOBOXITEMINDEX_W, 'ITEMINDEX');
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod(@TCUSTOMCOMBOBOX.CLEAR, 'CLEAR');
+ RegisterMethod(@TCUSTOMCOMBOBOX.SELECTALL, 'SELECTALL');
+ RegisterPropertyHelper(@TCUSTOMCOMBOBOXCANVAS_R, nil, 'CANVAS');
+ RegisterPropertyHelper(@TCUSTOMCOMBOBOXSELLENGTH_R, @TCUSTOMCOMBOBOXSELLENGTH_W, 'SELLENGTH');
+ RegisterPropertyHelper(@TCUSTOMCOMBOBOXSELSTART_R, @TCUSTOMCOMBOBOXSELSTART_W, 'SELSTART');
+ RegisterPropertyHelper(@TCUSTOMCOMBOBOXSELTEXT_R, @TCUSTOMCOMBOBOXSELTEXT_W, 'SELTEXT');
+ {$ENDIF}
+ end;
+end;
+
+
+
+
+procedure RIRegisterTCOMBOBOX(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TCOMBOBOX);
+end;
+
+
+
+procedure RIRegisterTBUTTONCONTROL(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TBUTTONCONTROL);
+end;
+
+
+
+procedure RIRegisterTBUTTON(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TBUTTON);
+end;
+
+
+
+
+procedure RIRegisterTCUSTOMCHECKBOX(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TCUSTOMCHECKBOX);
+end;
+
+
+procedure RIRegisterTCHECKBOX(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TCHECKBOX);
+end;
+
+
+procedure RIRegisterTRADIOBUTTON(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TRADIOBUTTON);
+end;
+
+procedure TCUSTOMLISTBOXCANVAS_R(Self: TCUSTOMLISTBOX; var T: TCANVAS); begin T := Self.CANVAS; end;
+procedure TCUSTOMLISTBOXITEMS_R(Self: TCUSTOMLISTBOX; var T: TSTRINGS); begin T := Self.ITEMS; end;
+procedure TCUSTOMLISTBOXITEMS_W(Self: TCUSTOMLISTBOX; T: TSTRINGS); begin Self.ITEMS := T; end;
+procedure TCUSTOMLISTBOXITEMINDEX_R(Self: TCUSTOMLISTBOX; var T: INTEGER); begin T := Self.ITEMINDEX; end;
+procedure TCUSTOMLISTBOXITEMINDEX_W(Self: TCUSTOMLISTBOX; T: INTEGER); begin Self.ITEMINDEX := T; end;
+procedure TCUSTOMLISTBOXSELCOUNT_R(Self: TCUSTOMLISTBOX; var T: INTEGER); begin T := Self.SELCOUNT; end;
+procedure TCUSTOMLISTBOXSELECTED_R(Self: TCUSTOMLISTBOX; var T: BOOLEAN; t1: INTEGER); begin T := Self.SELECTED[t1]; end;
+procedure TCUSTOMLISTBOXSELECTED_W(Self: TCUSTOMLISTBOX; T: BOOLEAN; t1: INTEGER); begin Self.SELECTED[t1] := T; end;
+procedure TCUSTOMLISTBOXTOPINDEX_R(Self: TCUSTOMLISTBOX; var T: INTEGER); begin T := Self.TOPINDEX; end;
+procedure TCUSTOMLISTBOXTOPINDEX_W(Self: TCUSTOMLISTBOX; T: INTEGER); begin Self.TOPINDEX := T; end;
+
+
+procedure RIRegisterTCUSTOMLISTBOX(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TCUSTOMLISTBOX) do
+ begin
+ RegisterPropertyHelper(@TCUSTOMLISTBOXITEMS_R, @TCUSTOMLISTBOXITEMS_W, 'ITEMS');
+ RegisterPropertyHelper(@TCUSTOMLISTBOXITEMINDEX_R, @TCUSTOMLISTBOXITEMINDEX_W, 'ITEMINDEX');
+ RegisterPropertyHelper(@TCUSTOMLISTBOXSELCOUNT_R, nil, 'SELCOUNT');
+ RegisterPropertyHelper(@TCUSTOMLISTBOXSELECTED_R, @TCUSTOMLISTBOXSELECTED_W, 'SELECTED');
+
+ {$IFNDEF PS_MINIVCL}
+ RegisterMethod(@TCUSTOMLISTBOX.CLEAR, 'CLEAR');
+ RegisterMethod(@TCUSTOMLISTBOX.ITEMATPOS, 'ITEMATPOS');
+ RegisterMethod(@TCUSTOMLISTBOX.ITEMRECT, 'ITEMRECT');
+ RegisterPropertyHelper(@TCUSTOMLISTBOXCANVAS_R, nil, 'CANVAS');
+ RegisterPropertyHelper(@TCUSTOMLISTBOXTOPINDEX_R, @TCUSTOMLISTBOXTOPINDEX_W, 'TOPINDEX');
+ {$ENDIF}
+ end;
+end;
+
+
+procedure RIRegisterTLISTBOX(Cl: TPSRuntimeClassImporter);
+begin
+ Cl.Add(TLISTBOX);
+end;
+
+
+procedure RIRegisterTSCROLLBAR(Cl: TPSRuntimeClassImporter);
+begin
+ with Cl.Add(TSCROLLBAR) do
+ begin
+ RegisterMethod(@TSCROLLBAR.SETPARAMS, 'SETPARAMS');
+ end;
+end;
+
+
+procedure RIRegister_stdctrls(cl: TPSRuntimeClassImporter);
+begin
+ {$IFNDEF PS_MINIVCL}
+ RIRegisterTCUSTOMGROUPBOX(Cl);
+ RIRegisterTGROUPBOX(Cl);
+ {$ENDIF}
+ RIRegisterTCUSTOMLABEL(Cl);
+ RIRegisterTLABEL(Cl);
+ RIRegisterTCUSTOMEDIT(Cl);
+ RIRegisterTEDIT(Cl);
+ RIRegisterTCUSTOMMEMO(Cl);
+ RIRegisterTMEMO(Cl);
+ RIRegisterTCUSTOMCOMBOBOX(Cl);
+ RIRegisterTCOMBOBOX(Cl);
+ RIRegisterTBUTTONCONTROL(Cl);
+ RIRegisterTBUTTON(Cl);
+ RIRegisterTCUSTOMCHECKBOX(Cl);
+ RIRegisterTCHECKBOX(Cl);
+ RIRegisterTRADIOBUTTON(Cl);
+ RIRegisterTCUSTOMLISTBOX(Cl);
+ RIRegisterTLISTBOX(Cl);
+ {$IFNDEF PS_MINIVCL}
+ RIRegisterTSCROLLBAR(Cl);
+ {$ENDIF}
+end;
+
+// PS_MINIVCL changes by Martijn Laan (mlaan at wintax _dot_ nl)
+
+end.
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSRuntime.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSRuntime.pas
new file mode 100644
index 0000000..859d170
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSRuntime.pas
@@ -0,0 +1,12451 @@
+unit uPSRuntime;
+{$I PascalScript.inc}
+{
+
+RemObjects Pascal Script III
+Copyright (C) 2000-2009 by Carlo Kok (ck@carlo-kok.com)
+
+}
+interface
+uses
+ SysUtils, uPSUtils{$IFDEF DELPHI6UP}, variants{$ENDIF}{$IFNDEF PS_NOIDISPATCH}{$IFDEF DELPHI3UP}, ActiveX, Windows{$ELSE}, Ole2{$ENDIF}{$ENDIF};
+
+
+type
+ TPSExec = class;
+ TPSStack = class;
+ TPSRuntimeAttributes = class;
+ TPSRuntimeAttribute = class;
+
+ TPSError = (ErNoError, erCannotImport, erInvalidType, ErInternalError,
+ erInvalidHeader, erInvalidOpcode, erInvalidOpcodeParameter, erNoMainProc,
+ erOutOfGlobalVarsRange, erOutOfProcRange, ErOutOfRange, erOutOfStackRange,
+ ErTypeMismatch, erUnexpectedEof, erVersionError, ErDivideByZero, ErMathError,
+ erCouldNotCallProc, erOutofRecordRange, erOutOfMemory, erException,
+ erNullPointerException, erNullVariantError, erInterfaceNotSupported, erCustomError);
+
+ TPSStatus = (isNotLoaded, isLoaded, isRunning, isPaused);
+
+ PByteArray = ^TByteArray;
+
+ TByteArray = array[0..1023] of Byte;
+
+ PDWordArray = ^TDWordArray;
+
+ TDWordArray = array[0..1023] of Cardinal;
+{@link(TPSProcRec)
+ PIFProcRec is a pointer to a TIProcRec record}
+ TPSProcRec = class;
+ TIFProcRec = TPSProcRec;
+ TPSExternalProcRec = class;
+ TIFPSExternalProcRec = TPSExternalProcRec;
+ TIFExternalProcRec = TPSExternalProcRec;
+ PIFProcRec = TPSProcRec;
+ PProcRec = ^TProcRec;
+
+ TPSProcPtr = function(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+
+ TPSFreeProc = procedure (Caller: TPSExec; p: PProcRec);
+
+ TPSProcRec = class
+ private
+ FAttributes: TPSRuntimeAttributes;
+ public
+
+ constructor Create(Owner: TPSExec);
+
+ destructor Destroy; override;
+
+
+ property Attributes: TPSRuntimeAttributes read FAttributes;
+ end;
+
+ TPSExternalProcRec = class(TPSProcRec)
+ private
+ FExt1: Pointer;
+ FExt2: Pointer;
+ FName: tbtstring;
+ FProcPtr: TPSProcPtr;
+ FDecl: tbtstring;
+ public
+
+ property Name: tbtstring read FName write FName;
+
+ property Decl: tbtstring read FDecl write FDecl;
+
+ property Ext1: Pointer read FExt1 write FExt1;
+
+ property Ext2: Pointer read FExt2 write FExt2;
+
+ property ProcPtr: TPSProcPtr read FProcPtr write FProcPtr;
+ end;
+
+ TPSInternalProcRec = class(TPSProcRec)
+ private
+ FData: PByteArray;
+ FLength: Cardinal;
+ FExportNameHash: Longint;
+ FExportDecl: tbtstring;
+ FExportName: tbtstring;
+ public
+
+ property Data: PByteArray read FData;
+
+ property Length: Cardinal read FLength;
+
+ property ExportNameHash: Longint read FExportNameHash;
+
+ property ExportName: tbtstring read FExportName write FExportName;
+
+ property ExportDecl: tbtstring read FExportDecl write FExportDecl;
+
+
+ destructor Destroy; override;
+ end;
+
+ TProcRec = record
+
+ Name: ShortString;
+
+ Hash: Longint;
+
+ ProcPtr: TPSProcPtr;
+
+ FreeProc: TPSFreeProc;
+
+ Ext1, Ext2: Pointer;
+ end;
+
+ PBTReturnAddress = ^TBTReturnAddress;
+
+ TBTReturnAddress = packed record
+
+ ProcNo: TPSInternalProcRec;
+
+ Position, StackBase: Cardinal;
+ end;
+
+ TPSTypeRec = class
+ private
+ FExportNameHash: Longint;
+ FExportName: tbtstring;
+ FBaseType: TPSBaseType;
+ FAttributes: TPSRuntimeAttributes;
+ protected
+ FRealSize: Cardinal;
+ public
+
+ property RealSize: Cardinal read FRealSize;
+
+ property BaseType: TPSBaseType read FBaseType write FBaseType;
+
+ property ExportName: tbtstring read FExportName write FExportName;
+
+ property ExportNameHash: Longint read FExportNameHash write FExportNameHash;
+
+ property Attributes: TPSRuntimeAttributes read FAttributes write FAttributes;
+
+ procedure CalcSize; virtual;
+
+ constructor Create(Owner: TPSExec);
+ destructor Destroy; override;
+ end;
+
+ TPSTypeRec_ProcPtr = class(TPSTypeRec)
+ private
+ FParamInfo: tbtstring;
+ public
+
+ property ParamInfo: tbtstring read FParamInfo write FParamInfo;
+ procedure CalcSize; override;
+ end;
+ PIFTypeRec = TPSTypeRec;
+
+ TPSTypeRec_Class = class(TPSTypeRec)
+ private
+ FCN: tbtstring;
+ public
+
+ property CN: tbtstring read FCN write FCN;
+ end;
+{$IFNDEF PS_NOINTERFACES}
+
+ TPSTypeRec_Interface = class(TPSTypeRec)
+ private
+ FGuid: TGUID;
+ public
+
+ property Guid: TGUID read FGuid write FGuid;
+ end;
+{$ENDIF}
+
+ TPSTypeRec_Array = class(TPSTypeRec)
+ private
+ FArrayType: TPSTypeRec;
+ public
+
+ property ArrayType: TPSTypeRec read FArrayType write FArrayType;
+ procedure CalcSize; override;
+ end;
+
+ TPSTypeRec_StaticArray = class(TPSTypeRec_Array)
+ private
+ FSize: Longint;
+ FStartOffset: LongInt;
+ public
+
+ property Size: Longint read FSize write FSize;
+ property StartOffset: LongInt read FStartOffset write FStartOffset;
+
+ procedure CalcSize; override;
+ end;
+
+ TPSTypeRec_Set = class(TPSTypeRec)
+ private
+ FBitSize: Longint;
+ FByteSize: Longint;
+ public
+ {The number of bytes this would require (same as realsize)}
+ property aByteSize: Longint read FByteSize write FByteSize;
+ property aBitSize: Longint read FBitSize write FBitSize;
+ procedure CalcSize; override;
+ end;
+
+ TPSTypeRec_Record = class(TPSTypeRec)
+ private
+ FFieldTypes: TPSList;
+ FRealFieldOffsets: TPSList;
+ public
+
+ property FieldTypes: TPSList read FFieldTypes;
+
+ property RealFieldOffsets: TPSList read FRealFieldOffsets;
+
+ procedure CalcSize; override;
+
+ constructor Create(Owner: TPSExec);
+ destructor Destroy; override;
+ end;
+
+ PPSVariant = ^TPSVariant;
+
+ PIFVariant = PPSVariant;
+
+ TPSVariant = packed record
+ FType: TPSTypeRec;
+ end;
+
+ PPSVariantData = ^TPSVariantData;
+
+ TPSVariantData = packed record
+ VI: TPSVariant;
+ Data: array[0..0] of Byte;
+ end;
+
+ PPSVariantU8 = ^TPSVariantU8;
+
+ TPSVariantU8 = packed record
+ VI: TPSVariant;
+ Data: tbtU8;
+ end;
+
+
+ PPSVariantS8 = ^TPSVariantS8;
+
+ TPSVariantS8 = packed record
+ VI: TPSVariant;
+ Data: tbts8;
+ end;
+
+
+ PPSVariantU16 = ^TPSVariantU16;
+
+ TPSVariantU16 = packed record
+ VI: TPSVariant;
+ Data: tbtU16;
+ end;
+
+
+ PPSVariantS16 = ^TPSVariantS16;
+
+ TPSVariantS16 = packed record
+ VI: TPSVariant;
+ Data: tbts16;
+ end;
+
+
+ PPSVariantU32 = ^TPSVariantU32;
+
+ TPSVariantU32 = packed record
+ VI: TPSVariant;
+ Data: tbtU32;
+ end;
+
+
+ PPSVariantS32 = ^TPSVariantS32;
+
+ TPSVariantS32 = packed record
+ VI: TPSVariant;
+ Data: tbts32;
+ end;
+{$IFNDEF PS_NOINT64}
+
+ PPSVariantS64 = ^TPSVariantS64;
+
+ TPSVariantS64 = packed record
+ VI: TPSVariant;
+ Data: tbts64;
+ end;
+{$ENDIF}
+
+ PPSVariantAChar = ^TPSVariantAChar;
+
+ TPSVariantAChar = packed record
+ VI: TPSVariant;
+ Data: tbtChar;
+ end;
+
+{$IFNDEF PS_NOWIDESTRING}
+
+ PPSVariantWChar = ^TPSVariantWChar;
+
+ TPSVariantWChar = packed record
+ VI: TPSVariant;
+ Data: tbtWideChar;
+ end;
+{$ENDIF}
+
+ PPSVariantAString = ^TPSVariantAString;
+
+ TPSVariantAString = packed record
+ VI: TPSVariant;
+ Data: tbtString;
+ end;
+
+{$IFNDEF PS_NOWIDESTRING}
+
+ PPSVariantWString = ^TPSVariantWString;
+
+ TPSVariantWString = {$IFNDEF DELPHI2009UP}packed {$ENDIF}record
+ VI: TPSVariant;
+ Data: tbtWideString;
+ end;
+
+ PPSVariantUString = ^TPSVariantUString;
+
+ TPSVariantUString = {$IFNDEF DELPHI2009UP}packed {$ENDIF}record
+ VI: TPSVariant;
+ Data: tbtunicodestring;
+ end;
+
+{$ENDIF}
+
+
+ PPSVariantSingle = ^TPSVariantSingle;
+
+ TPSVariantSingle = packed record
+ VI: TPSVariant;
+ Data: tbtsingle;
+ end;
+
+
+ PPSVariantDouble = ^TPSVariantDouble;
+
+ TPSVariantDouble = packed record
+ VI: TPSVariant;
+ Data: tbtDouble;
+ end;
+
+
+ PPSVariantExtended = ^TPSVariantExtended;
+
+ TPSVariantExtended = packed record
+ VI: TPSVariant;
+ Data: tbtExtended;
+ end;
+
+
+ PPSVariantCurrency = ^TPSVariantCurrency;
+
+ TPSVariantCurrency = packed record
+ VI: TPSVariant;
+ Data: tbtCurrency;
+ end;
+
+ PPSVariantSet = ^TPSVariantSet;
+
+ TPSVariantSet = packed record
+ VI: TPSVariant;
+ Data: array[0..0] of Byte;
+ end;
+
+{$IFNDEF PS_NOINTERFACES}
+
+ PPSVariantInterface = ^TPSVariantInterface;
+
+ TPSVariantInterface = packed record
+ VI: TPSVariant;
+ Data: IUnknown;
+ end;
+{$ENDIF}
+
+ PPSVariantClass = ^TPSVariantClass;
+
+ TPSVariantClass = packed record
+ VI: TPSVariant;
+ Data: TObject;
+ end;
+
+
+ PPSVariantRecord = ^TPSVariantRecord;
+
+ TPSVariantRecord = packed record
+ VI: TPSVariant;
+ data: array[0..0] of byte;
+ end;
+
+
+ PPSVariantDynamicArray = ^TPSVariantDynamicArray;
+
+ TPSVariantDynamicArray = packed record
+ VI: TPSVariant;
+ Data: Pointer;
+ end;
+
+
+ PPSVariantStaticArray = ^TPSVariantStaticArray;
+
+ TPSVariantStaticArray = packed record
+ VI: TPSVariant;
+ data: array[0..0] of byte;
+ end;
+
+
+ PPSVariantPointer = ^TPSVariantPointer;
+
+ TPSVariantPointer = packed record
+ VI: TPSVariant;
+ DataDest: Pointer;
+ DestType: TPSTypeRec;
+ FreeIt: LongBool;
+ end;
+
+
+ PPSVariantReturnAddress = ^TPSVariantReturnAddress;
+
+ TPSVariantReturnAddress = packed record
+ VI: TPSVariant;
+ Addr: TBTReturnAddress;
+ end;
+
+
+ PPSVariantVariant = ^TPSVariantVariant;
+
+ TPSVariantVariant = packed record
+ VI: TPSVariant;
+ Data: Variant;
+ end;
+
+ PPSVariantProcPtr = ^TPSVariantProcPtr;
+ TPSVariantProcPtr = packed record
+ VI: TPSVariant;
+ ProcNo: Cardinal;
+ Self: Pointer;
+ Ptr: Pointer;
+ {
+ ProcNo = 0 means Self/Ptr become active (Ptr = nil means it's nil)
+ }
+ end;
+
+
+ TPSVarFreeType = (
+ vtNone,
+ vtTempVar
+ );
+
+ TPSResultData = packed record
+ P: Pointer;
+ aType: TPSTypeRec;
+ FreeType: TPSVarFreeType;
+ end;
+
+
+ PPSResource = ^TPSResource;
+
+ TPSResource = record
+ Proc: Pointer;
+ P: Pointer;
+ end;
+
+ TPSAttributeUseProc = function (Sender: TPSExec; const AttribType: tbtstring; Attr: TPSRuntimeAttribute): Boolean;
+
+ TPSAttributeType = class
+ private
+ FTypeName: tbtstring;
+ FUseProc: TPSAttributeUseProc;
+ FTypeNameHash: Longint;
+ public
+
+ property UseProc: TPSAttributeUseProc read FUseProc write FUseProc;
+
+ property TypeName: tbtstring read FTypeName write FTypeName;
+
+ property TypeNameHash: Longint read FTypeNameHash write FTypeNameHash;
+ end;
+
+ PClassItem = ^TClassItem;
+
+ TClassItem = record
+
+ FName: tbtstring;
+
+ FNameHash: Longint;
+
+ b: byte;
+ case byte of
+ 0: (Ptr: Pointer);
+ 1: (PointerInList: Pointer);
+ 3: (FReadFunc, FWriteFunc: Pointer); {Property Helper}
+ 4: (Ptr2: Pointer);
+ 5: (PointerInList2: Pointer);
+ 6: (); {Property helper, like 3}
+ 7: (); {Property helper that will pass it's name}
+ end;
+
+
+ PPSVariantIFC = ^TPSVariantIFC;
+ {Temporary variant into record}
+ TPSVariantIFC = packed record
+ Dta: Pointer;
+ aType: TPSTypeRec;
+ VarParam: Boolean;
+ end;
+ PIFPSVariantIFC = PPSVariantIFC;
+ TIFPSVariantIFC = TPSVariantIFC;
+
+ TPSRuntimeAttribute = class(TObject)
+ private
+ FValues: TPSStack;
+ FAttribType: tbtstring;
+ FOwner: TPSRuntimeAttributes;
+ FAttribTypeHash: Longint;
+ function GetValue(I: Longint): PIFVariant;
+ function GetValueCount: Longint;
+ public
+
+ property Owner: TPSRuntimeAttributes read FOwner;
+
+ property AttribType: tbtstring read FAttribType write FAttribType;
+
+ property AttribTypeHash: Longint read FAttribTypeHash write FAttribTypeHash;
+
+ property ValueCount: Longint read GetValueCount;
+
+ property Value[I: Longint]: PIFVariant read GetValue;
+
+ function AddValue(aType: TPSTypeRec): PPSVariant;
+
+ procedure DeleteValue(i: Longint);
+
+ procedure AdjustSize;
+
+
+ constructor Create(Owner: TPSRuntimeAttributes);
+
+ destructor Destroy; override;
+ end;
+
+ TPSRuntimeAttributes = class(TObject)
+ private
+ FAttributes: TPSList;
+ FOwner: TPSExec;
+ function GetCount: Longint;
+ function GetItem(I: Longint): TPSRuntimeAttribute;
+ public
+
+ property Owner: TPSExec read FOwner;
+
+ property Count: Longint read GetCount;
+
+ property Items[I: Longint]: TPSRuntimeAttribute read GetItem; default;
+
+ procedure Delete(I: Longint);
+
+ function Add: TPSRuntimeAttribute;
+
+ function FindAttribute(const Name: tbtstring): TPSRuntimeAttribute;
+
+
+ constructor Create(AOwner: TPSExec);
+
+ destructor Destroy; override;
+ end;
+ TPSOnGetNVariant = function (Sender: TPSExec; const Name: tbtstring): Variant;
+ TPSOnSetNVariant = procedure (Sender: TPSExec; const Name: tbtstring; V: Variant);
+
+ TPSOnLineEvent = procedure(Sender: TPSExec);
+
+ TPSOnSpecialProcImport = function (Sender: TPSExec; p: TPSExternalProcRec; Tag: Pointer): Boolean;
+
+ TPSOnException = procedure (Sender: TPSExec; ExError: TPSError; const ExParam: tbtstring; ExObject: TObject; ProcNo, Position: Cardinal);
+
+ TPSExec = class(TObject)
+ Private
+ FOnGetNVariant: TPSOnGetNVariant;
+ FOnSetNVariant: TPSOnSetNVariant;
+ FId: Pointer;
+ FJumpFlag: Boolean;
+ FCallCleanup: Boolean;
+ FOnException: TPSOnException;
+ function ReadData(var Data; Len: Cardinal): Boolean;
+ function ReadLong(var b: Cardinal): Boolean;
+ function DoCalc(var1, Var2: Pointer; var1Type, var2type: TPSTypeRec; CalcType: Cardinal): Boolean;
+ function DoBooleanCalc(var1, Var2, into: Pointer; var1Type, var2type, intotype: TPSTypeRec; Cmd: Cardinal): Boolean;
+ function SetVariantValue(dest, Src: Pointer; desttype, srctype: TPSTypeRec): Boolean;
+ function ReadVariable(var Dest: TPSResultData; UsePointer: Boolean): Boolean;
+ function DoBooleanNot(Dta: Pointer; aType: TPSTypeRec): Boolean;
+ function DoMinus(Dta: Pointer; aType: TPSTypeRec): Boolean;
+ function DoIntegerNot(Dta: Pointer; aType: TPSTypeRec): Boolean;
+ procedure RegisterStandardProcs;
+ Protected
+
+ FReturnAddressType: TPSTypeRec;
+
+ FVariantType: TPSTypeRec;
+
+ FVariantArrayType: TPSTypeRec;
+
+ FAttributeTypes: TPSList;
+
+ FExceptionStack: TPSList;
+
+ FResources: TPSList;
+
+ FExportedVars: TPSList;
+
+ FTypes: TPSList;
+
+ FProcs: TPSList;
+
+ FGlobalVars: TPSStack;
+
+ FTempVars: TPSStack;
+
+ FStack: TPSStack;
+
+ FMainProc: Cardinal;
+
+ FStatus: TPSStatus;
+
+ FCurrProc: TPSInternalProcRec;
+
+ FData: PByteArray;
+
+ FDataLength: Cardinal;
+
+ FCurrentPosition: Cardinal;
+
+ FCurrStackBase: Cardinal;
+
+ FOnRunLine: TPSOnLineEvent;
+
+ FSpecialProcList: TPSList;
+
+ FRegProcs: TPSList;
+
+ ExObject: TObject;
+
+ ExProc: Cardinal;
+
+ ExPos: Cardinal;
+
+ ExEx: TPSError;
+
+ ExParam: tbtstring;
+
+ function InvokeExternalMethod(At: TPSTypeRec_ProcPtr; Slf, Ptr: Pointer): Boolean;
+
+ function InnerfuseCall(_Self, Address: Pointer; CallingConv: TPSCallingConvention; Params: TPSList; res: PPSVariantIFC): Boolean;
+
+ procedure RunLine; virtual;
+
+ function ImportProc(const Name: ShortString; proc: TPSExternalProcRec): Boolean; Virtual;
+
+ procedure ExceptionProc(proc, Position: Cardinal; Ex: TPSError; const s: tbtstring; NewObject: TObject); Virtual;
+
+ function FindSpecialProcImport(P: TPSOnSpecialProcImport): pointer;
+ Public
+ function LastEx: TPSError;
+ function LastExParam: tbtstring;
+ function LastExProc: Integer;
+ function LastExPos: Integer;
+ procedure CMD_Err(EC: TPSError);
+
+ procedure CMD_Err2(EC: TPSError; const Param: tbtstring);
+
+ procedure CMD_Err3(EC: TPSError; const Param: tbtstring; ExObject: TObject);
+
+ property Id: Pointer read FID write FID;
+
+ class function About: tbtstring;
+
+ function RunProc(Params: TPSList; ProcNo: Cardinal): Boolean;
+
+ function RunProcP(const Params: array of Variant; const Procno: Cardinal): Variant;
+ function RunProcPVar(var Params: array of Variant; const Procno: Cardinal): Variant;
+
+ function RunProcPN(const Params: array of Variant; const ProcName: tbtstring): Variant;
+
+ function FindType(StartAt: Cardinal; BaseType: TPSBaseType; var l: Cardinal): PIFTypeRec;
+
+ function FindType2(BaseType: TPSBaseType): PIFTypeRec;
+
+ function GetTypeNo(l: Cardinal): PIFTypeRec;
+
+ function GetType(const Name: tbtstring): Cardinal;
+
+ function GetProc(const Name: tbtstring): Cardinal;
+
+ function GetVar(const Name: tbtstring): Cardinal;
+
+ function GetVar2(const Name: tbtstring): PIFVariant;
+
+ function GetVarNo(C: Cardinal): PIFVariant;
+
+ function GetProcNo(C: Cardinal): PIFProcRec;
+
+ function GetProcCount: Cardinal;
+
+ function GetVarCount: Longint;
+
+ function GetTypeCount: Longint;
+
+
+ constructor Create;
+
+ destructor Destroy; Override;
+
+
+ function RunScript: Boolean;
+
+
+ function LoadData(const s: tbtstring): Boolean; virtual;
+
+ procedure Clear; Virtual;
+
+ procedure Cleanup; Virtual;
+
+ procedure Stop; Virtual;
+
+ procedure Pause; Virtual;
+
+ property CallCleanup: Boolean read FCallCleanup write FCallCleanup;
+
+ property Status: TPSStatus Read FStatus;
+
+ property OnRunLine: TPSOnLineEvent Read FOnRunLine Write FOnRunLine;
+
+ procedure ClearspecialProcImports;
+
+ procedure AddSpecialProcImport(const FName: tbtstring; P: TPSOnSpecialProcImport; Tag: Pointer);
+
+ function RegisterFunctionName(const Name: tbtstring; ProcPtr: TPSProcPtr;
+ Ext1, Ext2: Pointer): PProcRec;
+
+ procedure RegisterDelphiFunction(ProcPtr: Pointer; const Name: tbtstring; CC: TPSCallingConvention);
+
+ procedure RegisterDelphiMethod(Slf, ProcPtr: Pointer; const Name: tbtstring; CC: TPSCallingConvention);
+
+ function GetProcAsMethod(const ProcNo: Cardinal): TMethod;
+
+ function GetProcAsMethodN(const ProcName: tbtstring): TMethod;
+
+ procedure RegisterAttributeType(useproc: TPSAttributeUseProc; const TypeName: tbtstring);
+
+ procedure ClearFunctionList;
+
+ property ExceptionProcNo: Cardinal Read ExProc;
+
+ property ExceptionPos: Cardinal Read ExPos;
+
+ property ExceptionCode: TPSError Read ExEx;
+
+ property ExceptionString: tbtstring read ExParam;
+
+ property ExceptionObject: TObject read ExObject write ExObject;
+
+ procedure AddResource(Proc, P: Pointer);
+
+ function IsValidResource(Proc, P: Pointer): Boolean;
+
+ procedure DeleteResource(P: Pointer);
+
+ function FindProcResource(Proc: Pointer): Pointer;
+
+ function FindProcResource2(Proc: Pointer; var StartAt: Longint): Pointer;
+
+ procedure RaiseCurrentException;
+
+ property OnException: TPSOnException read FOnException write FOnException;
+ property OnGetNVariant: TPSOnGetNVariant read FOnGetNVariant write FOnGetNVariant;
+ property OnSetNVariant: TPSOnSetNVariant read FOnSetNVariant write FOnSetNVariant;
+ end;
+
+ TPSStack = class(TPSList)
+ private
+ FDataPtr: Pointer;
+ FCapacity,
+ FLength: Longint;
+ function GetItem(I: Longint): PPSVariant;
+ procedure SetCapacity(const Value: Longint);
+ procedure AdjustLength;
+ public
+
+ property DataPtr: Pointer read FDataPtr;
+
+ property Capacity: Longint read FCapacity write SetCapacity;
+
+ property Length: Longint read FLength;
+
+
+ constructor Create;
+
+ destructor Destroy; override;
+
+ procedure Clear; {$IFDEF DELPHI5UP} reintroduce;{$ELSE} override; {$ENDIF}
+
+ function Push(TotalSize: Longint): PPSVariant;
+
+ function PushType(aType: TPSTypeRec): PPSVariant;
+
+ procedure Pop;
+ function GetInt(ItemNo: Longint): Longint;
+ function GetUInt(ItemNo: Longint): Cardinal;
+{$IFNDEF PS_NOINT64}
+ function GetInt64(ItemNo: Longint): Int64;
+{$ENDIF}
+ function GetString(ItemNo: Longint): string; // calls the native method
+ function GetAnsiString(ItemNo: Longint): tbtstring;
+{$IFNDEF PS_NOWIDESTRING}
+ function GetWideString(ItemNo: Longint): tbtWideString;
+ function GetUnicodeString(ItemNo: Longint): tbtunicodestring;
+{$ENDIF}
+ function GetReal(ItemNo: Longint): Extended;
+ function GetCurrency(ItemNo: Longint): Currency;
+ function GetBool(ItemNo: Longint): Boolean;
+ function GetClass(ItemNo: Longint): TObject;
+
+ procedure SetInt(ItemNo: Longint; const Data: Longint);
+ procedure SetUInt(ItemNo: Longint; const Data: Cardinal);
+{$IFNDEF PS_NOINT64}
+ procedure SetInt64(ItemNo: Longint; const Data: Int64);
+{$ENDIF}
+ procedure SetString(ItemNo: Longint; const Data: string);
+ procedure SetAnsiString(ItemNo: Longint; const Data: tbtstring);
+{$IFNDEF PS_NOWIDESTRING}
+ procedure SetWideString(ItemNo: Longint; const Data: tbtWideString);
+ procedure SetUnicodeString(ItemNo: Longint; const Data: tbtunicodestring);
+{$ENDIF}
+ procedure SetReal(ItemNo: Longint; const Data: Extended);
+ procedure SetCurrency(ItemNo: Longint; const Data: Currency);
+ procedure SetBool(ItemNo: Longint; const Data: Boolean);
+ procedure SetClass(ItemNo: Longint; const Data: TObject);
+
+ property Items[I: Longint]: PPSVariant read GetItem; default;
+ end;
+
+
+function PSErrorToString(x: TPSError; const Param: tbtstring): tbtstring;
+function TIFErrorToString(x: TPSError; const Param: tbtstring): tbtstring;
+function CreateHeapVariant(aType: TPSTypeRec): PPSVariant;
+procedure DestroyHeapVariant(v: PPSVariant);
+
+procedure FreePIFVariantList(l: TPSList);
+procedure FreePSVariantList(l: TPSList);
+
+const
+ ENoError = ERNoError;
+
+
+function PIFVariantToVariant(Src: PIFVariant; var Dest: Variant): Boolean;
+function VariantToPIFVariant(Exec: TPSExec; const Src: Variant; Dest: PIFVariant): Boolean;
+
+function PSGetRecField(const avar: TPSVariantIFC; Fieldno: Longint): TPSVariantIFC;
+function PSGetArrayField(const avar: TPSVariantIFC; Fieldno: Longint): TPSVariantIFC;
+function NewTPSVariantRecordIFC(avar: PPSVariant; Fieldno: Longint): TPSVariantIFC;
+
+function NewTPSVariantIFC(avar: PPSVariant; varparam: boolean): TPSVariantIFC;
+
+function NewPPSVariantIFC(avar: PPSVariant; varparam: boolean): PPSVariantIFC;
+
+procedure DisposePPSVariantIFC(aVar: PPSVariantIFC);
+
+procedure DisposePPSVariantIFCList(list: TPSList);
+
+
+function PSGetObject(Src: Pointer; aType: TPSTypeRec): TObject;
+function PSGetUInt(Src: Pointer; aType: TPSTypeRec): Cardinal;
+{$IFNDEF PS_NOINT64}
+function PSGetInt64(Src: Pointer; aType: TPSTypeRec): Int64;
+{$ENDIF}
+function PSGetReal(Src: Pointer; aType: TPSTypeRec): Extended;
+function PSGetCurrency(Src: Pointer; aType: TPSTypeRec): Currency;
+function PSGetInt(Src: Pointer; aType: TPSTypeRec): Longint;
+function PSGetString(Src: Pointer; aType: TPSTypeRec): string;
+function PSGetAnsiString(Src: Pointer; aType: TPSTypeRec): tbtString;
+{$IFNDEF PS_NOWIDESTRING}
+function PSGetWideString(Src: Pointer; aType: TPSTypeRec): tbtWideString;
+function PSGetUnicodeString(Src: Pointer; aType: TPSTypeRec): tbtunicodestring;
+{$ENDIF}
+
+procedure PSSetObject(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; Const val: TObject);
+procedure PSSetUInt(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: Cardinal);
+{$IFNDEF PS_NOINT64}
+procedure PSSetInt64(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: Int64);
+{$ENDIF}
+procedure PSSetReal(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: Extended);
+procedure PSSetCurrency(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: Currency);
+procedure PSSetInt(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: Longint);
+procedure PSSetString(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: String);
+procedure PSSetAnsiString(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: tbtString);
+{$IFNDEF PS_NOWIDESTRING}
+procedure PSSetWideString(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: tbtWideString);
+procedure PSSetUnicodeString(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: tbtunicodestring);
+{$ENDIF}
+
+procedure VNSetPointerTo(const Src: TPSVariantIFC; Data: Pointer; aType: TPSTypeRec);
+
+function VNGetUInt(const Src: TPSVariantIFC): Cardinal;
+{$IFNDEF PS_NOINT64}
+function VNGetInt64(const Src: TPSVariantIFC): Int64;
+{$ENDIF}
+function VNGetReal(const Src: TPSVariantIFC): Extended;
+function VNGetCurrency(const Src: TPSVariantIFC): Currency;
+function VNGetInt(const Src: TPSVariantIFC): Longint;
+function VNGetString(const Src: TPSVariantIFC): String;
+function VNGetAnsiString(const Src: TPSVariantIFC): tbtString;
+{$IFNDEF PS_NOWIDESTRING}
+function VNGetWideString(const Src: TPSVariantIFC): tbtWideString;
+function VNGetUnicodeString(const Src: TPSVariantIFC): tbtunicodestring;
+{$ENDIF}
+
+procedure VNSetUInt(const Src: TPSVariantIFC; const Val: Cardinal);
+{$IFNDEF PS_NOINT64}
+procedure VNSetInt64(const Src: TPSVariantIFC; const Val: Int64);
+{$ENDIF}
+procedure VNSetReal(const Src: TPSVariantIFC; const Val: Extended);
+procedure VNSetCurrency(const Src: TPSVariantIFC; const Val: Currency);
+procedure VNSetInt(const Src: TPSVariantIFC; const Val: Longint);
+procedure VNSetString(const Src: TPSVariantIFC; const Val: String);
+procedure VNSetAnsiString(const Src: TPSVariantIFC; const Val: tbtString);
+{$IFNDEF PS_NOWIDESTRING}
+procedure VNSetWideString(const Src: TPSVariantIFC; const Val: tbtWideString);
+procedure VNSetUnicodeString(const Src: TPSVariantIFC; const Val: tbtunicodestring);
+{$ENDIF}
+
+function VGetUInt(const Src: PIFVariant): Cardinal;
+{$IFNDEF PS_NOINT64}
+function VGetInt64(const Src: PIFVariant): Int64;
+{$ENDIF}
+function VGetReal(const Src: PIFVariant): Extended;
+function VGetCurrency(const Src: PIFVariant): Currency;
+function VGetInt(const Src: PIFVariant): Longint;
+function VGetString(const Src: PIFVariant): String;
+function VGetAnsiString(const Src: PIFVariant): tbtString;
+{$IFNDEF PS_NOWIDESTRING}
+function VGetWideString(const Src: PIFVariant): tbtWideString;
+function VGetUnicodeString(const Src: PIFVariant): tbtunicodestring;
+{$ENDIF}
+
+procedure VSetPointerTo(const Src: PIFVariant; Data: Pointer; aType: TPSTypeRec);
+procedure VSetUInt(const Src: PIFVariant; const Val: Cardinal);
+{$IFNDEF PS_NOINT64}
+procedure VSetInt64(const Src: PIFVariant; const Val: Int64);
+{$ENDIF}
+procedure VSetReal(const Src: PIFVariant; const Val: Extended);
+procedure VSetCurrency(const Src: PIFVariant; const Val: Currency);
+procedure VSetInt(const Src: PIFVariant; const Val: Longint);
+procedure VSetString(const Src: PIFVariant; const Val: string);
+procedure VSetAnsiString(const Src: PIFVariant; const Val: tbtString);
+{$IFNDEF PS_NOWIDESTRING}
+procedure VSetWideString(const Src: PIFVariant; const Val: tbtWideString);
+procedure VSetUnicodeString(const Src: PIFVariant; const Val: tbtunicodestring);
+{$ENDIF}
+
+type
+
+ EPSException = class(Exception)
+ private
+ FProcPos: Cardinal;
+ FProcNo: Cardinal;
+ FExec: TPSExec;
+ public
+
+ constructor Create(const Error: tbtstring; Exec: TPSExec; Procno, ProcPos: Cardinal);
+
+ property ProcNo: Cardinal read FProcNo;
+
+ property ProcPos: Cardinal read FProcPos;
+
+ property Exec: TPSExec read FExec;
+ end;
+
+ TPSRuntimeClass = class
+ protected
+ FClassName: tbtstring;
+ FClassNameHash: Longint;
+
+ FClassItems: TPSList;
+ FClass: TClass;
+
+ FEndOfVmt: Longint;
+ public
+
+ procedure RegisterConstructor(ProcPtr: Pointer; const Name: tbtstring);
+
+ procedure RegisterVirtualConstructor(ProcPtr: Pointer; const Name: tbtstring);
+
+ procedure RegisterMethod(ProcPtr: Pointer; const Name: tbtstring);
+
+ procedure RegisterVirtualMethod(ProcPtr: Pointer; const Name: tbtstring);
+
+ procedure RegisterVirtualAbstractMethod(ClassDef: TClass; ProcPtr: Pointer; const Name: tbtstring);
+
+ procedure RegisterPropertyHelper(ReadFunc, WriteFunc: Pointer; const Name: tbtstring);
+
+ procedure RegisterPropertyHelperName(ReadFunc, WriteFunc: Pointer; const Name: tbtstring);
+
+ procedure RegisterEventPropertyHelper(ReadFunc, WriteFunc: Pointer; const Name: tbtstring);
+
+ constructor Create(aClass: TClass; const AName: tbtstring);
+
+ destructor Destroy; override;
+ end;
+
+ TPSRuntimeClassImporter = class
+ private
+ FClasses: TPSList;
+ public
+
+ constructor Create;
+
+ constructor CreateAndRegister(Exec: TPSexec; AutoFree: Boolean);
+
+ destructor Destroy; override;
+
+ function Add(aClass: TClass): TPSRuntimeClass;
+
+ function Add2(aClass: TClass; const Name: tbtstring): TPSRuntimeClass;
+
+ procedure Clear;
+
+ function FindClass(const Name: tbtstring): TPSRuntimeClass;
+ end;
+ TIFPSRuntimeClassImporter = TPSRuntimeClassImporter;
+ TPSResourceFreeProc = procedure (Sender: TPSExec; P: TPSRuntimeClassImporter);
+
+
+procedure RegisterClassLibraryRuntime(SE: TPSExec; Importer: TPSRuntimeClassImporter);
+
+procedure SetVariantToClass(V: PIFVariant; Cl: TObject);
+{$IFNDEF PS_NOINTERFACES}
+procedure SetVariantToInterface(V: PIFVariant; Cl: IUnknown);
+{$ENDIF}
+
+procedure MyAllMethodsHandler;
+
+function GetMethodInfoRec(SE: TPSExec; ProcNo: Cardinal): Pointer;
+
+function MkMethod(FSE: TPSExec; No: Cardinal): TMethod;
+
+type
+ TIFInternalProcRec = TPSInternalProcRec;
+ TIFError = TPSError;
+ TIFStatus = TPSStatus;
+ TIFPSExec = TPSExec;
+ TIFPSStack = TPSStack;
+ TIFTypeRec = TPSTypeRec;
+
+
+ TPSCallingConvention = uPSUtils.TPSCallingConvention;
+const
+
+ cdRegister = uPSUtils.cdRegister;
+
+ cdPascal = uPSUtils.cdPascal;
+
+ cdCdecl = uPSUtils.cdCdecl;
+
+ cdStdCall = uPSUtils.cdStdCall;
+
+ InvalidVal = Cardinal(-1);
+
+function PSDynArrayGetLength(arr: Pointer; aType: TPSTypeRec): Longint;
+procedure PSDynArraySetLength(var arr: Pointer; aType: TPSTypeRec; NewLength: Longint);
+
+function GetPSArrayLength(Arr: PIFVariant): Longint;
+procedure SetPSArrayLength(Arr: PIFVariant; NewLength: Longint);
+
+function PSVariantToString(const p: TPSVariantIFC; const ClassProperties: tbtstring): tbtstring;
+function MakeString(const s: tbtstring): tbtstring;
+{$IFNDEF PS_NOWIDESTRING}
+function MakeWString(const s: tbtunicodestring): tbtstring;
+{$ENDIF}
+
+{$IFNDEF PS_NOIDISPATCH}
+function IDispatchInvoke(Self: IDispatch; PropertySet: Boolean; const Name: tbtString; const Par: array of Variant): Variant;
+{$ENDIF}
+
+
+implementation
+uses
+ TypInfo {$IFDEF DELPHI3UP}{$IFNDEF FPC} , ComObj {$ENDIF}{$ENDIF};
+
+{$IFDEF DELPHI3UP }
+resourceString
+{$ELSE }
+const
+{$ENDIF }
+
+ RPS_UnknownIdentifier = 'Unknown Identifier';
+ RPS_Exception = 'Exception: %s';
+ RPS_Invalid = '[Invalid]';
+
+ //- PSErrorToString
+ RPS_NoError = 'No Error';
+ RPS_CannotImport = 'Cannot Import %s';
+ RPS_InvalidType = 'Invalid Type';
+ RPS_InternalError = 'Internal error';
+ RPS_InvalidHeader = 'Invalid Header';
+ RPS_InvalidOpcode = 'Invalid Opcode';
+ RPS_InvalidOpcodeParameter = 'Invalid Opcode Parameter';
+ RPS_NoMainProc = 'no Main Proc';
+ RPS_OutOfGlobalVarsRange = 'Out of Global Vars range';
+ RPS_OutOfProcRange = 'Out of Proc Range';
+ RPS_OutOfRange = 'Out Of Range';
+ RPS_OutOfStackRange = 'Out Of Stack Range';
+ RPS_TypeMismatch = 'Type Mismatch';
+ RPS_UnexpectedEof = 'Unexpected End Of File';
+ RPS_VersionError = 'Version error';
+ RPS_DivideByZero = 'divide by Zero';
+ RPS_MathError = 'Math error';
+ RPS_CouldNotCallProc = 'Could not call proc';
+ RPS_OutofRecordRange = 'Out of Record Fields Range';
+ RPS_NullPointerException = 'Null Pointer Exception';
+ RPS_NullVariantError = 'Null variant error';
+ RPS_OutOfMemory = 'Out Of Memory';
+ RPS_InterfaceNotSupported = 'Interface not supported';
+ RPS_UnknownError = 'Unknown error';
+
+
+ RPS_InvalidVariable = 'Invalid variable';
+ RPS_InvalidArray = 'Invalid array';
+ RPS_OLEError = 'OLE error %.8x';
+ RPS_UnknownProcedure = 'Unknown procedure';
+ RPS_NotEnoughParameters = 'Not enough parameters';
+ RPS_InvalidParameter = 'Invalid parameter';
+ RPS_TooManyParameters = 'Too many parameters';
+ RPS_OutOfStringRange = 'Out of string range';
+ RPS_CannotCastInterface = 'Cannot cast an interface';
+ RPS_CannotCastObject = 'Cannot cast an object';
+ RPS_CapacityLength = 'Capacity < Length';
+ RPS_CanOnlySendLastItem = 'Can only remove last item from stack';
+ RPS_NILInterfaceException = 'Nil interface';
+ RPS_UnknownMethod = 'Unknown method';
+
+
+
+type
+ PPSExportedVar = ^TPSExportedVar;
+ TPSExportedVar = record
+ FName: tbtstring;
+ FNameHash: Longint;
+ FVarNo: Cardinal;
+ end;
+ PRaiseFrame = ^TRaiseFrame;
+ TRaiseFrame = record
+ NextRaise: PRaiseFrame;
+ ExceptAddr: Pointer;
+ ExceptObject: TObject;
+ ExceptionRecord: Pointer;
+ end;
+ TPSExceptionHandler = class
+ CurrProc: TPSInternalProcRec;
+ BasePtr, StackSize: Cardinal;
+ FinallyOffset, ExceptOffset, Finally2Offset, EndOfBlock: Cardinal;
+ ExceptionData: TPSError;
+ ExceptionObject: TObject;
+ ExceptionParam: tbtString;
+ destructor Destroy; override;
+ end;
+ TPSHeader = packed record
+ HDR: Cardinal;
+ PSBuildNo: Cardinal;
+ TypeCount: Cardinal;
+ ProcCount: Cardinal;
+ VarCount: Cardinal;
+ MainProcNo: Cardinal;
+ ImportTableSize: Cardinal;
+ end;
+
+ TPSExportItem = packed record
+ ProcNo: Cardinal;
+ NameLength: Cardinal;
+ DeclLength: Cardinal;
+ end;
+
+ TPSType = packed record
+ BaseType: TPSBaseType;
+ end;
+ TPSProc = packed record
+ Flags: Byte;
+ end;
+
+ TPSVar = packed record
+ TypeNo: Cardinal;
+ Flags: Byte;
+ end;
+ PSpecialProc = ^TSpecialProc;
+ TSpecialProc = record
+ P: TPSOnSpecialProcImport;
+ namehash: Longint;
+ Name: tbtstring;
+ tag: pointer;
+ end;
+
+destructor TPSExceptionHandler.Destroy;
+begin
+ ExceptionObject.Free;
+ inherited;
+end;
+
+procedure P_CM_A; begin end;
+procedure P_CM_CA; begin end;
+procedure P_CM_P; begin end;
+procedure P_CM_PV; begin end;
+procedure P_CM_PO; begin end;
+procedure P_CM_C; begin end;
+procedure P_CM_G; begin end;
+procedure P_CM_CG; begin end;
+procedure P_CM_CNG; begin end;
+procedure P_CM_R; begin end;
+procedure P_CM_ST; begin end;
+procedure P_CM_PT; begin end;
+procedure P_CM_CO; begin end;
+procedure P_CM_CV; begin end;
+procedure P_CM_SP; begin end;
+procedure P_CM_BN; begin end;
+procedure P_CM_VM; begin end;
+procedure P_CM_SF; begin end;
+procedure P_CM_FG; begin end;
+procedure P_CM_PUEXH; begin end;
+procedure P_CM_POEXH; begin end;
+procedure P_CM_IN; begin end;
+procedure P_CM_SPB; begin end;
+procedure P_CM_INC; begin end;
+procedure P_CM_DEC; begin end;
+
+function IntPIFVariantToVariant(Src: pointer; aType: TPSTypeRec; var Dest: Variant): Boolean; forward;
+
+
+procedure Set_Union(Dest, Src: PByteArray; ByteSize: Integer);
+var
+ i: Longint;
+begin
+ for i := ByteSize -1 downto 0 do
+ Dest^[i] := Dest^[i] or Src^[i];
+end;
+
+procedure Set_Diff(Dest, Src: PByteArray; ByteSize: Integer);
+var
+ i: Longint;
+begin
+ for i := ByteSize -1 downto 0 do
+ Dest^[i] := Dest^[i] and not Src^[i];
+end;
+
+procedure Set_Intersect(Dest, Src: PByteArray; ByteSize: Integer);
+var
+ i: Longint;
+begin
+ for i := ByteSize -1 downto 0 do
+ Dest^[i] := Dest^[i] and Src^[i];
+end;
+
+procedure Set_Subset(Dest, Src: PByteArray; ByteSize: Integer; var Val: Boolean);
+var
+ i: Integer;
+begin
+ for i := ByteSize -1 downto 0 do
+ begin
+ if not (Src^[i] and Dest^[i] = Dest^[i]) then
+ begin
+ Val := False;
+ exit;
+ end;
+ end;
+ Val := True;
+end;
+
+procedure Set_Equal(Dest, Src: PByteArray; ByteSize: Integer; var Val: Boolean);
+var
+ i: Longint;
+begin
+ for i := ByteSize -1 downto 0 do
+ begin
+ if Dest^[i] <> Src^[i] then
+ begin
+ Val := False;
+ exit;
+ end;
+ end;
+ val := True;
+end;
+
+procedure Set_membership(Item: Longint; Src: PByteArray; var Val: Boolean);
+begin
+ Val := (Src^[Item shr 3] and (1 shl (Item and 7))) <> 0;
+end;
+
+
+procedure RCIFreeProc(Sender: TPSExec; P: TPSRuntimeClassImporter);
+begin
+ p.Free;
+end;
+
+function Trim(const s: tbtstring): tbtstring;
+begin
+ Result := s;
+ while (Length(result) > 0) and (Result[1] = #32) do Delete(Result, 1, 1);
+ while (Length(result) > 0) and (Result[Length(Result)] = #32) do Delete(Result, Length(Result), 1);
+end;
+(*function FloatToStr(E: Extended): tbtstring;
+begin
+ Result := Sysutils.FloatToStr(e);
+end;*)
+
+//-------------------------------------------------------------------
+
+function Padl(s: tbtstring; i: longInt): tbtstring;
+begin
+ result := StringOfChar(tbtchar(' '), i - length(s)) + s;
+end;
+//-------------------------------------------------------------------
+
+function Padz(s: tbtString; i: longInt): tbtString;
+begin
+ result := StringOfChar(tbtchar('0'), i - length(s)) + s;
+end;
+//-------------------------------------------------------------------
+
+function Padr(s: tbtString; i: longInt): tbtString;
+begin
+ result := s + StringOfChar(tbtchar(' '), i - Length(s));
+end;
+//-------------------------------------------------------------------
+
+{$IFNDEF PS_NOWIDESTRING}
+function wPadl(s: tbtwidestring; i: longInt): tbtwidestring;
+begin
+ result := StringOfChar(tbtwidechar(' '), i - length(s)) + s;
+end;
+//-------------------------------------------------------------------
+
+function wPadz(s: tbtwidestring; i: longInt): tbtwidestring;
+begin
+ result := StringOfChar(tbtwidechar('0'), i - length(s)) + s;
+end;
+//-------------------------------------------------------------------
+
+function wPadr(s: tbtwidestring; i: longInt): tbtwidestring;
+begin
+ result := s + StringOfChar(tbtwidechar(' '), i - Length(s));
+end;
+
+function uPadl(s: tbtunicodestring; i: longInt): tbtunicodestring;
+begin
+ result := StringOfChar(tbtwidechar(' '), i - length(s)) + s;
+end;
+//-------------------------------------------------------------------
+
+function uPadz(s: tbtunicodestring; i: longInt): tbtunicodestring;
+begin
+ result := StringOfChar(tbtwidechar('0'), i - length(s)) + s;
+end;
+//-------------------------------------------------------------------
+
+function uPadr(s: tbtunicodestring; i: longInt): tbtunicodestring;
+begin
+ result := s + StringOfChar(tbtwidechar(' '), i - Length(s));
+end;
+
+{$ENDIF}
+{$IFNDEF PS_NOWIDESTRING}
+function MakeWString(const s: tbtunicodestring): tbtString;
+var
+ i: Longint;
+ e: tbtString;
+ b: boolean;
+begin
+ Result := tbtString(s);
+ i := 1;
+ b := false;
+ while i <= length(result) do
+ begin
+ if Result[i] = '''' then
+ begin
+ if not b then
+ begin
+ b := true;
+ Insert('''', Result, i);
+ inc(i);
+ end;
+ Insert('''', Result, i);
+ inc(i, 2);
+ end else if (Result[i] < #32) or (Result[i] > #255) then
+ begin
+ e := '#'+inttostr(ord(Result[i]));
+ Delete(Result, i, 1);
+ if b then
+ begin
+ b := false;
+ Insert('''', Result, i);
+ inc(i);
+ end;
+ Insert(e, Result, i);
+ inc(i, length(e));
+ end else begin
+ if not b then
+ begin
+ b := true;
+ Insert('''', Result, i);
+ inc(i, 2);
+ end else
+ inc(i);
+ end;
+ end;
+ if b then
+ begin
+ Result := Result + '''';
+ end;
+ if Result = '' then
+ Result := '''''';
+end;
+{$ENDIF}
+function MakeString(const s: tbtString): tbtString;
+var
+ i: Longint;
+ e: tbtString;
+ b: boolean;
+begin
+ Result := s;
+ i := 1;
+ b := false;
+ while i <= length(result) do
+ begin
+ if Result[i] = '''' then
+ begin
+ if not b then
+ begin
+ b := true;
+ Insert('''', Result, i);
+ inc(i);
+ end;
+ Insert('''', Result, i);
+ inc(i, 2);
+ end else if (Result[i] < #32) then
+ begin
+ e := '#'+inttostr(ord(Result[i]));
+ Delete(Result, i, 1);
+ if b then
+ begin
+ b := false;
+ Insert('''', Result, i);
+ inc(i);
+ end;
+ Insert(e, Result, i);
+ inc(i, length(e));
+ end else begin
+ if not b then
+ begin
+ b := true;
+ Insert('''', Result, i);
+ inc(i, 2);
+ end else
+ inc(i);
+ end;
+ end;
+ if b then
+ begin
+ Result := Result + '''';
+ end;
+ if Result = '' then
+ Result := '''''';
+end;
+
+function SafeStr(const s: tbtString): tbtString;
+var
+ i : Longint;
+begin
+ Result := s;
+ for i := 1 to length(s) do
+ begin
+ if s[i] in [#0..#31] then
+ begin
+ Result := Copy(s, 1, i-1);
+ exit;
+ end;
+ end;
+
+end;
+
+function PropertyToString(Instance: TObject; PName: tbtString): tbtString;
+var
+ s: tbtString;
+ i: Longint;
+ PP: PPropInfo;
+begin
+ if PName = '' then
+ begin
+ Result := tbtString(Instance.ClassName);
+ exit;
+ end;
+ while Length(PName) > 0 do
+ begin
+ i := pos(tbtChar('.'), pname);
+ if i = 0 then
+ begin
+ s := Trim(PNAme);
+ pname := '';
+ end else begin
+ s := trim(Copy(PName, 1, i-1));
+ Delete(PName, 1, i);
+ end;
+ pp := GetPropInfo(PTypeInfo(Instance.ClassInfo), string(s));
+ if pp = nil then begin Result := tbtstring(RPS_UnknownIdentifier); exit; end;
+
+
+ case pp^.PropType^.Kind of
+ tkInteger: begin Result := IntToStr(GetOrdProp(Instance, pp)); exit; end;
+ tkChar: begin Result := '#'+IntToStr(GetOrdProp(Instance, pp)); exit; end;
+ tkEnumeration: begin Result := tbtstring(GetEnumName(pp^.PropType{$IFNDEF FPC}{$IFDEF DELPHI3UP}^{$ENDIF}{$ENDIF}, GetOrdProp(Instance, pp))); exit; end;
+ tkFloat: begin Result := FloatToStr(GetFloatProp(Instance, PP)); exit; end;
+ tkString, tkLString: begin Result := ''''+tbtString(GetStrProp(Instance, PP))+''''; exit; end;
+ tkSet: begin Result := '[Set]'; exit; end;
+ tkClass: begin Instance := TObject(GetOrdProp(Instance, pp)); end;
+ tkMethod: begin Result := '[Method]'; exit; end;
+ tkVariant: begin Result := '[Variant]'; exit; end;
+ {$IFDEF DELPHI6UP}
+ {$IFNDEF PS_NOWIDESTRING}
+ tkWString: begin Result := ''''+tbtString(GetWideStrProp(Instance, pp))+''; end; {$ENDIF}
+ {$ENDIF}
+ else begin Result := '[Unknown]'; exit; end;
+ end;
+ if Instance = nil then begin result := 'nil'; exit; end;
+ end;
+ Result := tbtstring(Instance.ClassName);
+end;
+
+function ClassVariantInfo(const pvar: TPSVariantIFC; const PropertyName: tbtString): tbtString;
+begin
+ if pvar.aType.BaseType = btClass then
+ begin
+ if TObject(pvar.Dta^) = nil then
+ Result := 'nil'
+ else
+ Result := PropertyToString(TObject(pvar.Dta^), PropertyName);
+ end else if pvar.atype.basetype = btInterface then
+ Result := 'Interface'
+ else Result := tbtstring(RPS_InvalidType);
+end;
+
+function PSVariantToString(const p: TPSVariantIFC; const ClassProperties: tbtString): tbtString;
+var
+ i, n: Longint;
+begin
+ if p.Dta = nil then
+ begin
+ Result := 'nil';
+ exit;
+ end;
+ if (p.aType.BaseType = btVariant) then
+ begin
+ try
+ if TVarData(p.Dta^).VType = varDispatch then
+ Result := 'Variant(IDispatch)'
+ else if TVarData(p.Dta^).VType = varNull then
+ REsult := 'Null'
+ else if (TVarData(p.Dta^).VType = varOleStr) then
+ {$IFDEF PS_NOWIDESTRING}
+ Result := MakeString(Variant(p.Dta^))
+ {$ELSE}
+ Result := MakeWString(variant(p.dta^))
+ {$ENDIF}
+ else if TVarData(p.Dta^).VType = varString then
+ Result := MakeString(tbtstring(variant(p.Dta^)))
+ else
+ Result := tbtstring(Variant(p.Dta^));
+ except
+ on e: Exception do
+ Result := tbtstring(Format (RPS_Exception, [e.Message]));
+ end;
+ exit;
+ end;
+ case p.aType.BaseType of
+ btProcptr: begin Result := 'Proc: '+inttostr(tbtu32(p.Dta^)); end;
+ btU8: str(tbtu8(p.dta^), Result);
+ btS8: str(tbts8(p.dta^), Result);
+ btU16: str(tbtu16(p.dta^), Result);
+ btS16: str(tbts16(p.dta^), Result);
+ btU32: str(tbtu32(p.dta^), Result);
+ btS32: str(tbts32(p.dta^), Result);
+ btSingle: str(tbtsingle(p.dta^), Result);
+ btDouble: str(tbtdouble(p.dta^), Result);
+ btExtended: str(tbtextended(p.dta^), Result);
+ btString: Result := makestring(tbtString(p.dta^));
+ btPChar:
+ begin
+ if PansiChar(p.dta^) = nil then
+ Result := 'nil'
+ else
+ Result := MakeString(PAnsiChar(p.dta^));
+ end;
+ btchar: Result := MakeString(tbtchar(p.dta^));
+ {$IFNDEF PS_NOWIDESTRING}
+ btwidechar: Result := MakeWString(tbtwidechar(p.dta^));
+ btWideString: Result := MakeWString(tbtwidestring(p.dta^));
+ btUnicodeString: Result := MakeWString(tbtUnicodeString(p.dta^));
+ {$ENDIF}
+ {$IFNDEF PS_NOINT64}btS64: str(tbts64(p.dta^), Result);{$ENDIF}
+ btStaticArray, btArray:
+ begin
+ Result := '';
+ if p.aType.BaseType = btStaticArray then
+ n := TPSTypeRec_StaticArray(p.aType).Size
+ else
+ n := PSDynArrayGetLength(Pointer(p.dta^), p.aType);
+ for i := 0 to n-1 do begin
+ if Result <> '' then
+ Result := Result + ', ';
+ Result := Result + PSVariantToString(PSGetArrayField(p, i), '');
+ end;
+ Result := '[' + Result + ']';
+ end;
+ btRecord:
+ begin
+ Result := '';
+ n := TPSTypeRec_Record(p.aType).FFieldTypes.Count;
+ for i := 0 to n-1 do begin
+ if Result <> '' then
+ Result := Result + ', ';
+ Result := Result + PSVariantToString(PSGetRecField(p, i), '');
+ end;
+ Result := '(' + Result + ')';
+ end;
+ btPointer: Result := 'Nil';
+ btClass, btInterface:
+ begin
+ Result := ClassVariantInfo(p, ClassProperties)
+ end;
+ else
+ Result := tbtString(RPS_Invalid);
+ end;
+end;
+
+
+
+function TIFErrorToString(x: TPSError; const Param: tbtString): tbtString;
+begin
+ Result := PSErrorToString(x,param);
+end;
+
+function PSErrorToString(x: TPSError; const Param: tbtString): tbtString;
+begin
+ case x of
+ ErNoError: Result := tbtString(RPS_NoError);
+ erCannotImport: Result := tbtString(Format (RPS_CannotImport, [Safestr(Param)]));
+ erInvalidType: Result := tbtString(RPS_InvalidType);
+ ErInternalError: Result := tbtString(RPS_InternalError);
+ erInvalidHeader: Result := tbtString(RPS_InvalidHeader);
+ erInvalidOpcode: Result := tbtString(RPS_InvalidOpcode);
+ erInvalidOpcodeParameter: Result := tbtString(RPS_InvalidOpcodeParameter);
+ erNoMainProc: Result := tbtString(RPS_NoMainProc);
+ erOutOfGlobalVarsRange: Result := tbtString(RPS_OutOfGlobalVarsRange);
+ erOutOfProcRange: Result := tbtString(RPS_OutOfProcRange);
+ ErOutOfRange: Result := tbtString(RPS_OutOfRange);
+ erOutOfStackRange: Result := tbtString(RPS_OutOfStackRange);
+ ErTypeMismatch: Result := tbtString(RPS_TypeMismatch);
+ erUnexpectedEof: Result := tbtString(RPS_UnexpectedEof);
+ erVersionError: Result := tbtString(RPS_VersionError);
+ ErDivideByZero: Result := tbtString(RPS_DivideByZero);
+ erMathError: Result := tbtString(RPS_MathError);
+ erCouldNotCallProc: begin Result := tbtString(RPS_CouldNotCallProc); if (Param <> '') then Result := result +' ('+Param+')'; end;
+ erOutofRecordRange: Result := tbtString(RPS_OutofRecordRange);
+ erNullPointerException: Result := tbtString(RPS_NullPointerException);
+ erNullVariantError: Result := tbtString(RPS_NullVariantError);
+ erOutOfMemory: Result := tbtString(RPS_OutOfMemory);
+ erException: Result := tbtString(Format (RPS_Exception, [Param]));
+ erInterfaceNotSupported: Result := tbtString(RPS_InterfaceNotSupported);
+ erCustomError: Result := Param;
+ else
+ Result := tbtString(RPS_UnknownError);
+ end;
+ //
+end;
+
+
+procedure TPSTypeRec.CalcSize;
+begin
+ case BaseType of
+ btVariant: FRealSize := sizeof(Variant);
+ btChar, bts8, btU8: FrealSize := 1 ;
+ {$IFNDEF PS_NOWIDESTRING}btWideChar, {$ENDIF}bts16, btU16: FrealSize := 2;
+ {$IFNDEF PS_NOWIDESTRING}btWideString,
+ btUnicodeString,
+ {$ENDIF}{$IFNDEF PS_NOINTERFACES}btInterface, {$ENDIF}btSingle, bts32, btU32,
+ btclass, btPChar, btString: FrealSize := PointerSize;
+ btProcPtr: FRealSize := 2 * sizeof(Pointer) + sizeof(Cardinal);
+ btCurrency: FrealSize := Sizeof(Currency);
+ btPointer: FRealSize := 2 * sizeof(Pointer) + sizeof(LongBool); // ptr, type, freewhendone
+ btDouble{$IFNDEF PS_NOINT64}, bts64{$ENDIF}: FrealSize := 8;
+ btExtended: FrealSize := SizeOf(Extended);
+ btReturnAddress: FrealSize := Sizeof(TBTReturnAddress);
+ else
+ FrealSize := 0;
+ end;
+end;
+
+constructor TPSTypeRec.Create(Owner: TPSExec);
+begin
+ inherited Create;
+ FAttributes := TPSRuntimeAttributes.Create(Owner);
+end;
+
+destructor TPSTypeRec.Destroy;
+begin
+ FAttributes.Free;
+ inherited destroy;
+end;
+
+{ TPSTypeRec_Record }
+
+procedure TPSTypeRec_Record.CalcSize;
+begin
+ inherited;
+ FrealSize := TPSTypeRec(FFieldTypes[FFieldTypes.Count-1]).RealSize +
+ IPointer(RealFieldOffsets[RealFieldOffsets.Count -1]);
+end;
+
+constructor TPSTypeRec_Record.Create(Owner: TPSExec);
+begin
+ inherited Create(Owner);
+ FRealFieldOffsets := TPSList.Create;
+ FFieldTypes := TPSList.Create;
+end;
+
+destructor TPSTypeRec_Record.Destroy;
+begin
+ FFieldTypes.Free;
+ FRealFieldOffsets.Free;
+ inherited Destroy;
+end;
+
+
+const
+ RTTISize = sizeof(TPSVariant);
+
+procedure InitializeVariant(p: Pointer; aType: TPSTypeRec);
+var
+ t: TPSTypeRec;
+ i: Longint;
+begin
+ case aType.BaseType of
+ btChar, bts8, btU8: tbtu8(p^) := 0;
+ {$IFNDEF PS_NOWIDESTRING}btWideChar, {$ENDIF}bts16, btU16: tbtu16(p^) := 0;
+ btSingle, bts32, btU32,
+ btPChar, btString, {$IFNDEF PS_NOWIDESTRING}btUnicodeString, btWideString, {$ENDIF}btClass,
+ btInterface, btArray: Pointer(P^) := nil;
+ btPointer:
+ begin
+ Pointer(p^) := nil;
+ Pointer(Pointer(IPointer(p)+PointerSize)^) := nil;
+ Pointer(Pointer(IPointer(p)+(2*PointerSize))^) := nil;
+ end;
+ btProcPtr:
+ begin
+ Longint(p^) := 0;
+ Pointer(Pointer(IPointer(p)+PointerSize)^) := nil;
+ Pointer(Pointer(IPointer(p)+(2*PointerSize))^) := nil;
+ end;
+ btCurrency: tbtCurrency(P^) := 0;
+ btDouble{$IFNDEF PS_NOINT64}, bts64{$ENDIF}: {$IFNDEF PS_NOINT64}tbtS64(P^) := 0{$ELSE}tbtdouble(p^) := 0 {$ENDIF};
+ btExtended: tbtExtended(p^) := 0;
+ btVariant: Initialize(Variant(p^));
+ btReturnAddress:; // there is no point in initializing a return address
+ btRecord:
+ begin
+ for i := 0 to TPSTypeRec_Record(aType).FFieldTypes.Count -1 do
+ begin
+ t := TPSTypeRec_Record(aType).FieldTypes[i];
+ InitializeVariant(P, t);
+ p := Pointer(IPointer(p) + t.FrealSize);
+ end;
+ end;
+ btStaticArray:
+ begin
+ t := TPSTypeRec_Array(aType).ArrayType;
+ for i := 0 to TPSTypeRec_StaticArray(aType).Size -1 do
+ begin
+ InitializeVariant(p, t);
+ p := Pointer(IPointer(p) + t.RealSize);
+ end;
+ end;
+ btSet:
+ begin
+ FillChar(p^, TPSTypeRec_Set(aType).RealSize, 0);
+ end;
+ end;
+end;
+
+procedure DestroyHeapVariant2(v: Pointer; aType: TPSTypeRec); forward;
+
+const
+ NeedFinalization = [btStaticArray, btRecord, btArray, btPointer, btVariant {$IFNDEF PS_NOINTERFACES}, btInterface{$ENDIF}, btString {$IFNDEF PS_NOWIDESTRING}, btUnicodestring,btWideString{$ENDIF}];
+
+procedure FinalizeVariant(p: Pointer; aType: TPSTypeRec);
+var
+ t: TPSTypeRec;
+ elsize: Cardinal;
+ i, l: Longint;
+ darr: Pointer;
+begin
+ case aType.BaseType of
+ btString: tbtString(p^) := '';
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString: tbtwidestring(p^) := '';
+ btUnicodeString: tbtunicodestring(p^) := '';
+ {$ENDIF}
+ {$IFNDEF PS_NOINTERFACES}btInterface:
+ begin
+ {$IFNDEF DELPHI3UP}
+ if IUnknown(p^) <> nil then
+ IUnknown(p^).Release;
+ {$ENDIF}
+ IUnknown(p^) := nil;
+ end; {$ENDIF}
+ btVariant:
+ begin
+ try
+ Finalize(Variant(p^));
+ except
+ end;
+ end;
+ btPointer:
+ if Pointer(Pointer(IPointer(p)+PointerSize2)^) <> nil then
+ begin
+ DestroyHeapVariant2(Pointer(p^), Pointer(Pointer(IPointer(p)+PointerSize)^));
+ Pointer(p^) := nil;
+ end;
+ btArray:
+ begin
+ if IPointer(P^) = 0 then exit;
+ darr := Pointer(IPointer(p^) - PointerSize2);
+ if Longint(darr^) < 0 then exit;// refcount < 0 means don't free
+ Dec(Longint(darr^));
+ if Longint(darr^) <> 0 then exit;
+ t := TPSTypeRec_Array(aType).ArrayType;
+ elsize := t.RealSize;
+ darr := Pointer(IPointer(darr) + PointerSize);
+ l := Longint(darr^) {$IFDEF FPC}+1{$ENDIF};
+ darr := Pointer(IPointer(darr) + PointerSize);
+ case t.BaseType of
+ btString, {$IFNDEF PS_NOWIDESTRING}
+ btUnicodeString, btWideString, {$ENDIF}{$IFNDEF PS_NOINTERFACES}btInterface, {$ENDIF}btArray, btStaticArray,
+ btRecord, btPointer, btVariant:
+ begin
+ for i := 0 to l -1 do
+ begin
+ FinalizeVariant(darr, t);
+ darr := Pointer(IPointer(darr) + elsize);
+ end;
+ end;
+ end;
+ FreeMem(Pointer(IPointer(p^) - IPointer(PointerSize2)), IPointer(Cardinal(l) * elsize) + IPointer(PointerSize2));
+ Pointer(P^) := nil;
+ end;
+ btRecord:
+ begin
+ for i := 0 to TPSTypeRec_Record(aType).FFieldTypes.Count -1 do
+ begin
+ t := TPSTypeRec_Record(aType).FieldTypes[i];
+ case t.BaseType of
+ btString, {$IFNDEF PS_NOWIDESTRING}btUnicodeString, btWideString, {$ENDIF}{$IFNDEF PS_NOINTERFACES}btInterface, {$ENDIF}btArray, btStaticArray,
+ btRecord: FinalizeVariant(p, t);
+ end;
+ p := Pointer(IPointer(p) + t.FrealSize);
+ end;
+ end;
+ btStaticArray:
+ begin
+ t := TPSTypeRec_Array(aType).ArrayType;
+ case t.BaseType of
+ btString, {$IFNDEF PS_NOWIDESTRING}btUnicodeString, btWideString, {$ENDIF}{$IFNDEF PS_NOINTERFACES}btInterface, {$ENDIF}btArray, btStaticArray,
+ btRecord: ;
+ else Exit;
+ end;
+ for i := 0 to TPSTypeRec_StaticArray(aType).Size -1 do
+ begin
+ FinalizeVariant(p, t);
+ p := Pointer(IPointer(p) + t.RealSize);
+ end;
+ end;
+ end;
+end;
+
+function CreateHeapVariant2(aType: TPSTypeRec): Pointer;
+begin
+ GetMem(Result, aType.RealSize);
+ InitializeVariant(Result, aType);
+end;
+
+procedure DestroyHeapVariant2(v: Pointer; aType: TPSTypeRec);
+begin
+ if v = nil then exit;
+ if atype.BaseType in NeedFinalization then
+ FinalizeVariant(v, aType);
+ FreeMem(v, aType.RealSize);
+end;
+
+
+function CreateHeapVariant(aType: TPSTypeRec): PPSVariant;
+var
+ aSize: Longint;
+begin
+ aSize := aType.RealSize + RTTISize;
+ GetMem(Result, aSize);
+ Result.FType := aType;
+ InitializeVariant(Pointer(IPointer(Result)+PointerSize), aType);
+end;
+
+procedure DestroyHeapVariant(v: PPSVariant);
+begin
+ if v = nil then exit;
+ if v.FType.BaseType in NeedFinalization then
+ FinalizeVariant(Pointer(IPointer(v)+PointerSize), v.FType);
+ FreeMem(v, v.FType.RealSize + RTTISize);
+end;
+
+procedure FreePSVariantList(l: TPSList);
+var
+ i: Longint;
+begin
+ for i:= l.count -1 downto 0 do
+ DestroyHeapVariant(l[i]);
+ l.free;
+end;
+
+procedure FreePIFVariantList(l: TPSList);
+begin
+ FreePsVariantList(l);
+end;
+
+{ TPSExec }
+
+procedure TPSExec.ClearFunctionList;
+var
+ x: PProcRec;
+ l: Longint;
+begin
+ for l := FAttributeTypes.Count -1 downto 0 do
+ begin
+ TPSAttributeType(FAttributeTypes.Data^[l]).Free;
+ end;
+ FAttributeTypes.Clear;
+
+ for l := 0 to FRegProcs.Count - 1 do
+ begin
+ x := FRegProcs.Data^[l];
+ if @x^.FreeProc <> nil then x^.FreeProc(Self, x);
+ Dispose(x);
+ end;
+ FRegProcs.Clear;
+ RegisterStandardProcs;
+end;
+
+class function TPSExec.About: tbtString;
+begin
+ Result := 'RemObjects Pascal Script. Copyright (c) 2004-2009 by RemObjects Software';
+end;
+
+procedure TPSExec.Cleanup;
+var
+ I: Longint;
+ p: Pointer;
+begin
+ if FStatus <> isLoaded then
+ exit;
+ FStack.Clear;
+ FTempVars.Clear;
+ for I := Longint(FGlobalVars.Count) - 1 downto 0 do
+ begin
+ p := FGlobalVars.Items[i];
+ if PIFTypeRec(P^).BaseType in NeedFinalization then
+ FinalizeVariant(Pointer(IPointer(p)+PointerSize), Pointer(P^));
+ InitializeVariant(Pointer(IPointer(p)+PointerSize), Pointer(P^));
+ end;
+end;
+
+procedure TPSExec.Clear;
+var
+ I: Longint;
+ temp: PPSResource;
+ Proc: TPSResourceFreeProc;
+ pp: TPSExceptionHandler;
+begin
+ for i := Longint(FExceptionStack.Count) -1 downto 0 do
+ begin
+ pp := FExceptionStack.Data^[i];
+ pp.Free;
+ end;
+ for i := Longint(FResources.Count) -1 downto 0 do
+ begin
+ Temp := FResources.Data^[i];
+ Proc := Temp^.Proc;
+ Proc(Self, Temp^.P);
+ Dispose(Temp);
+ end;
+ for i := Longint(FExportedVars.Count) -1 downto 0 do
+ Dispose(PPSExportedVar(FExportedVars.Data^[I]));
+ for I := Longint(FProcs.Count) - 1downto 0 do
+ TPSProcRec(FProcs.Data^[i]).Destroy;
+ FProcs.Clear;
+ FGlobalVars.Clear;
+ FStack.Clear;
+ for I := Longint(FTypes.Count) - 1downto 0 do
+ TPSTypeRec(FTypes.Data^[i]).Free;
+ FTypes.Clear;
+ FStatus := isNotLoaded;
+ FResources.Clear;
+ FExportedVars.Clear;
+ FExceptionStack.Clear;
+ FCurrStackBase := InvalidVal;
+end;
+
+constructor TPSExec.Create;
+begin
+ inherited Create;
+ FAttributeTypes := TPSList.Create;
+ FExceptionStack := TPSList.Create;
+ FCallCleanup := False;
+ FResources := TPSList.Create;
+ FTypes := TPSList.Create;
+ FProcs := TPSList.Create;
+ FGlobalVars := TPSStack.Create;
+ FTempVars := TPSStack.Create;
+ FMainProc := 0;
+ FStatus := isNotLoaded;
+ FRegProcs := TPSList.Create;
+ FExportedVars := TPSList.create;
+ FSpecialProcList := TPSList.Create;
+ RegisterStandardProcs;
+ FReturnAddressType := TPSTypeRec.Create(self);
+ FReturnAddressType.BaseType := btReturnAddress;
+ FReturnAddressType.CalcSize;
+ FVariantType := TPSTypeRec.Create(self);
+ FVariantType.BaseType := btVariant;
+ FVariantType.CalcSize;
+ FVariantArrayType := TPSTypeRec_Array.Create(self);
+ FVariantArrayType.BaseType := btArray;
+ FVariantArrayType.CalcSize;
+ TPSTypeRec_Array(FVariantArrayType).ArrayType := FVariantType;
+ FStack := TPSStack.Create;
+end;
+
+destructor TPSExec.Destroy;
+var
+ I: Longint;
+ x: PProcRec;
+ P: PSpecialProc;
+begin
+ Clear;
+ FReturnAddressType.Free;
+ FVariantType.Free;
+ FVariantArrayType.Free;
+
+ if ExObject <> nil then ExObject.Free;
+ for I := FSpecialProcList.Count -1 downto 0 do
+ begin
+ P := FSpecialProcList.Data^[I];
+ Dispose(p);
+ end;
+ FResources.Free;
+ FExportedVars.Free;
+ FTempVars.Free;
+ FStack.Free;
+ FGlobalVars.Free;
+ FProcs.Free;
+ FTypes.Free;
+ FSpecialProcList.Free;
+ for i := FRegProcs.Count - 1 downto 0 do
+ begin
+ x := FRegProcs.Data^[i];
+ if @x^.FreeProc <> nil then x^.FreeProc(Self, x);
+ Dispose(x);
+ end;
+ FRegProcs.Free;
+ FExceptionStack.Free;
+ for i := FAttributeTypes.Count -1 downto 0 do
+ begin
+ TPSAttributeType(FAttributeTypes[i]).Free;
+ end;
+ FAttributeTypes.Free;
+ inherited Destroy;
+end;
+
+procedure TPSExec.ExceptionProc(proc, Position: Cardinal; Ex: TPSError; const s: tbtString; NewObject: TObject);
+var
+ d, l: Longint;
+ pp: TPSExceptionHandler;
+begin
+ ExProc := proc;
+ ExPos := Position;
+ ExEx := Ex;
+ ExParam := s;
+ if ExObject <> nil then
+ ExObject.Free;
+ ExObject := NewObject;
+ if Ex = eNoError then Exit;
+ for d := FExceptionStack.Count -1 downto 0 do
+ begin
+ pp := FExceptionStack[d];
+ if Cardinal(FStack.Count) > pp.StackSize then
+ begin
+ for l := Longint(FStack.count) -1 downto Longint(pp.StackSize) do
+ FStack.Pop;
+ end;
+ if pp.CurrProc = nil then // no point in continuing
+ begin
+ pp.Free;
+ FExceptionStack.DeleteLast;
+
+ FCurrStackBase := InvalidVal;
+ FStatus := isPaused;
+ exit;
+ end;
+ FCurrProc := pp.CurrProc;
+ FData := FCurrProc.Data;
+ FDataLength := FCurrProc.Length;
+
+ FCurrStackBase := pp.BasePtr;
+ if pp.FinallyOffset <> InvalidVal then
+ begin
+ FCurrentPosition := pp.FinallyOffset;
+ pp.FinallyOffset := InvalidVal;
+ Exit;
+ end else if (pp.ExceptOffset <> InvalidVal) and (pp.ExceptOffset <> Cardinal(InvalidVal -1)) then
+ begin
+ FCurrentPosition := pp.ExceptOffset;
+ pp.ExceptOffset := Cardinal(InvalidVal -1);
+ pp.ExceptionObject := ExObject;
+ pp.ExceptionData := ExEx;
+ pp.ExceptionParam := ExParam;
+ ExObject := nil;
+ ExEx := ENoError;
+ Exit;
+ end else if pp.Finally2Offset <> InvalidVal then
+ begin
+ FCurrentPosition := pp.Finally2Offset;
+ pp.Finally2Offset := InvalidVal;
+ Exit;
+ end;
+ pp.Free;
+ FExceptionStack.DeleteLast;
+ end;
+ if FStatus <> isNotLoaded then
+ FStatus := isPaused;
+end;
+
+function LookupProc(List: TPSList; const Name: ShortString): PProcRec;
+var
+ h, l: Longint;
+ p: PProcRec;
+begin
+ h := MakeHash(Name);
+ for l := List.Count - 1 downto 0 do
+ begin
+ p := List.Data^[l];
+ if (p^.Hash = h) and (p^.Name = Name) then
+ begin
+ Result := List[l];
+ exit;
+ end;
+ end;
+ Result := nil;
+end;
+
+function TPSExec.ImportProc(const Name: ShortString; proc: TPSExternalProcRec): Boolean;
+var
+ u: PProcRec;
+ fname: tbtString;
+ I, fnh: Longint;
+ P: PSpecialProc;
+
+begin
+ if name = '' then
+ begin
+ fname := proc.Decl;
+ fname := copy(fname, 1, pos(tbtchar(':'), fname)-1);
+ fnh := MakeHash(fname);
+ for I := FSpecialProcList.Count -1 downto 0 do
+ begin
+ p := FSpecialProcList[I];
+ IF (p^.name = '') or ((p^.namehash = fnh) and (p^.name = fname)) then
+ begin
+ if p^.P(Self, Proc, p^.tag) then
+ begin
+ Result := True;
+ exit;
+ end;
+ end;
+ end;
+ Result := FAlse;
+ exit;
+ end;
+ u := LookupProc(FRegProcs, Name);
+ if u = nil then begin
+ Result := False;
+ exit;
+ end;
+ proc.ProcPtr := u^.ProcPtr;
+ proc.Ext1 := u^.Ext1;
+ proc.Ext2 := u^.Ext2;
+ Result := True;
+end;
+
+function TPSExec.RegisterFunctionName(const Name: tbtString; ProcPtr: TPSProcPtr; Ext1, Ext2: Pointer): PProcRec;
+var
+ p: PProcRec;
+ s: tbtString;
+begin
+ s := FastUppercase(Name);
+ New(p);
+ p^.Name := s;
+ p^.Hash := MakeHash(s);
+ p^.ProcPtr := ProcPtr;
+ p^.FreeProc := nil;
+ p.Ext1 := Ext1;
+ p^.Ext2 := Ext2;
+ FRegProcs.Add(p);
+ Result := P;
+end;
+
+function TPSExec.LoadData(const s: tbtString): Boolean;
+var
+ HDR: TPSHeader;
+ Pos: Cardinal;
+
+ function read(var Data; Len: Cardinal): Boolean;
+ begin
+ if Longint(Pos + Len) <= Length(s) then begin
+ Move(s[Pos + 1], Data, Len);
+ Pos := Pos + Len;
+ read := True;
+ end
+ else
+ read := False;
+ end;
+ function ReadAttributes(Dest: TPSRuntimeAttributes): Boolean;
+ var
+ Count: Cardinal;
+ i: Integer;
+
+ function ReadAttrib: Boolean;
+ var
+ NameLen: Longint;
+ Name: tbtString;
+ TypeNo: Cardinal;
+ i, h, FieldCount: Longint;
+ att: TPSRuntimeAttribute;
+ varp: PIFVariant;
+
+ begin
+ if (not Read(NameLen, 4)) or (NameLen > Length(s) - Longint(Pos)) then
+ begin
+ CMD_Err(ErOutOfRange);
+ Result := false;
+ exit;
+ end;
+ SetLength(Name, NameLen);
+ if not Read(Name[1], NameLen) then
+ begin
+ CMD_Err(ErOutOfRange);
+ Result := false;
+ exit;
+ end;
+ if not Read(FieldCount, 4) then
+ begin
+ CMD_Err(ErOutOfRange);
+ Result := false;
+ exit;
+ end;
+ att := Dest.Add;
+ att.AttribType := Name;
+ att.AttribTypeHash := MakeHash(att.AttribType);
+ for i := 0 to FieldCount -1 do
+ begin
+ if (not Read(TypeNo, 4)) or (TypeNo >= Cardinal(FTypes.Count)) then
+ begin
+ CMD_Err(ErOutOfRange);
+ Result := false;
+ exit;
+ end;
+
+ varp := att.AddValue(FTypes[TypeNo]);
+ case VarP^.FType.BaseType of
+ btSet:
+ begin
+ if not read(PPSVariantSet(varp).Data, TPSTypeRec_Set(varp.FType).aByteSize) then
+ begin
+ CMD_Err(erOutOfRange);
+
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ end;
+ bts8, btchar, btU8: if not read(PPSVariantU8(VarP)^.data, 1) then
+ begin
+ CMD_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ bts16, {$IFNDEF PS_NOWIDESTRING}btwidechar,{$ENDIF} btU16: if not read(PPSVariantU16(Varp)^.Data, SizeOf(TbtU16)) then begin
+ CMD_Err(ErOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ bts32, btU32:
+ begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ PPSVariantU32(varp)^.Data := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ PPSVariantU32(varp)^.Data := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ end;
+ btProcPtr:
+ begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ PPSVariantU32(varp)^.Data := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ PPSVariantU32(varp)^.Data := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ if PPSVariantU32(varp)^.Data = 0 then
+ begin
+ PPSVariantProcPtr(varp)^.Ptr := nil;
+ PPSVariantProcPtr(varp)^.Self := nil;
+ end;
+ Inc(FCurrentPosition, 4);
+ end;
+ {$IFNDEF PS_NOINT64}
+ bts64: if not read(PPSVariantS64(VarP)^.Data, sizeof(tbts64)) then
+ begin
+ CMD_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ {$ENDIF}
+ btSingle: if not read(PPSVariantSingle(VarP)^.Data, SizeOf(TbtSingle))
+ then begin
+ CMD_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ btDouble: if not read(PPSVariantDouble(varp)^.Data, SizeOf(TbtDouble))
+ then begin
+ CMD_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ btExtended: if not read(PPSVariantExtended(varp)^.Data, SizeOf(TbtExtended))
+ then begin
+ CMD_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ btCurrency: if not read(PPSVariantExtended(varp)^.Data, SizeOf(tbtCurrency))
+ then begin
+ CMD_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ btPchar, btString:
+ begin
+ if not read(NameLen, 4) then
+ begin
+ Cmd_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ Inc(FCurrentPosition, 4);
+ SetLength(PPSVariantAString(varp)^.Data, NameLen);
+ if not read(PPSVariantAString(varp)^.Data[1], NameLen) then begin
+ CMD_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ end;
+ {$IFNDEF PS_NOWIDESTRING}
+ btWidestring:
+ begin
+ if not read(NameLen, 4) then
+ begin
+ Cmd_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ Inc(FCurrentPosition, 4);
+ SetLength(PPSVariantWString(varp).Data, NameLen);
+ if not read(PPSVariantWString(varp).Data[1], NameLen*2) then begin
+ CMD_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ end;
+ btUnicodeString:
+ begin
+ if not read(NameLen, 4) then
+ begin
+ Cmd_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ Inc(FCurrentPosition, 4);
+ SetLength(PPSVariantUString(varp).Data, NameLen);
+ if not read(PPSVariantUString(varp).Data[1], NameLen*2) then begin
+ CMD_Err(erOutOfRange);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ end;
+ {$ENDIF}
+ else begin
+ CMD_Err(erInvalidType);
+ DestroyHeapVariant(VarP);
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ h := MakeHash(att.AttribType);
+ for i := FAttributeTypes.Count -1 downto 0 do
+ begin
+ if (TPSAttributeType(FAttributeTypes.Data^[i]).TypeNameHash = h) and
+ (TPSAttributeType(FAttributeTypes.Data^[i]).TypeName = att.AttribType) then
+ begin
+ if not TPSAttributeType(FAttributeTypes.Data^[i]).UseProc(Self, att.AttribType, Att) then
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ Result := True;
+ end;
+
+
+ begin
+ if not Read(Count, 4) then
+ begin
+ CMD_Err(erOutofRange);
+ Result := false;
+ exit;
+ end;
+ for i := 0 to Count -1 do
+ begin
+ if not ReadAttrib then
+ begin
+ Result := false;
+ exit;
+ end;
+ end;
+ Result := True;
+ end;
+
+{$WARNINGS OFF}
+
+ function LoadTypes: Boolean;
+ var
+ currf: TPSType;
+ Curr: PIFTypeRec;
+ fe: Boolean;
+ l2, l: Longint;
+ d: Cardinal;
+
+ function resolve(Dta: TPSTypeRec_Record): Boolean;
+ var
+ offs, l: Longint;
+ begin
+ offs := 0;
+ for l := 0 to Dta.FieldTypes.Count -1 do
+ begin
+ Dta.RealFieldOffsets.Add(Pointer(offs));
+ offs := offs + TPSTypeRec(Dta.FieldTypes[l]).RealSize;
+ end;
+ Result := True;
+ end;
+ begin
+ LoadTypes := True;
+ for l := 0 to HDR.TypeCount - 1 do begin
+ if not read(currf, SizeOf(currf)) then begin
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ if (currf.BaseType and 128) <> 0 then begin
+ fe := True;
+ currf.BaseType := currf.BaseType - 128;
+ end else
+ fe := False;
+ case currf.BaseType of
+ {$IFNDEF PS_NOINT64}bts64, {$ENDIF}
+ btU8, btS8, btU16, btS16, btU32, btS32, btSingle, btDouble, btCurrency,
+ btExtended, btString, btPointer, btPChar,
+ btVariant, btChar{$IFNDEF PS_NOWIDESTRING}, btUnicodeString, btWideString, btWideChar{$ENDIF}: begin
+ curr := TPSTypeRec.Create(self);
+ Curr.BaseType := currf.BaseType;
+ FTypes.Add(Curr);
+ end;
+ btClass:
+ begin
+ Curr := TPSTypeRec_Class.Create(self);
+ if (not Read(d, 4)) or (d > 255) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ setlength(TPSTypeRec_Class(Curr).FCN, d);
+ if not Read(TPSTypeRec_Class(Curr).FCN[1], d) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ Curr.BaseType := currf.BaseType;
+ FTypes.Add(Curr);
+ end;
+ btProcPtr:
+ begin
+ Curr := TPSTypeRec_ProcPtr.Create(self);
+ if (not Read(d, 4)) or (d > 255) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ setlength(TPSTypeRec_ProcPtr(Curr).FParamInfo, d);
+ if not Read(TPSTypeRec_ProcPtr(Curr).FParamInfo[1], d) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ Curr.BaseType := currf.BaseType;
+ FTypes.Add(Curr);
+ end;
+{$IFNDEF PS_NOINTERFACES}
+ btInterface:
+ begin
+ Curr := TPSTypeRec_Interface.Create(self);
+ if not Read(TPSTypeRec_Interface(Curr).FGUID, Sizeof(TGuid)) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ Curr.BaseType := currf.BaseType;
+ FTypes.Add(Curr);
+ end;
+{$ENDIF}
+ btSet:
+ begin
+ Curr := TPSTypeRec_Set.Create(self);
+ if not Read(d, 4) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ if (d > 256) then
+ begin
+ curr.Free;
+ cmd_err(erTypeMismatch);
+ LoadTypes := False;
+ exit;
+ end;
+
+ TPSTypeRec_Set(curr).aBitSize := d;
+ TPSTypeRec_Set(curr).aByteSize := TPSTypeRec_Set(curr).aBitSize shr 3;
+ if (TPSTypeRec_Set(curr).aBitSize and 7) <> 0 then inc(TPSTypeRec_Set(curr).fbytesize);
+ Curr.BaseType := currf.BaseType;
+ FTypes.Add(Curr);
+ end;
+ btStaticArray:
+ begin
+ curr := TPSTypeRec_StaticArray.Create(self);
+ if not Read(d, 4) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ if (d >= FTypes.Count) then
+ begin
+ curr.Free;
+ cmd_err(erTypeMismatch);
+ LoadTypes := False;
+ exit;
+ end;
+ TPSTypeRec_StaticArray(curr).ArrayType := FTypes[d];
+ if not Read(d, 4) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ if d > (MaxInt div 4) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ TPSTypeRec_StaticArray(curr).Size := d;
+ if not Read(d,4) then //<-additional StartOffset
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes:=false;
+ Exit;
+ end;
+ TPSTypeRec_StaticArray(curr).StartOffset:=d;
+
+ Curr.BaseType := currf.BaseType;
+ FTypes.Add(Curr);
+ end;
+ btArray: begin
+ Curr := TPSTypeRec_Array.Create(self);
+ if not read(d, 4) then
+ begin // Read type
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ if (d >= FTypes.Count) then
+ begin
+ curr.Free;
+ cmd_err(erTypeMismatch);
+ LoadTypes := False;
+ exit;
+ end;
+ Curr.BaseType := currf.BaseType;
+ TPSTypeRec_Array(curr).ArrayType := FTypes[d];
+ FTypes.Add(Curr);
+ end;
+ btRecord:
+ begin
+ curr := TPSTypeRec_Record.Create(self);
+ if not read(d, 4) or (d = 0) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := false;
+ exit;
+ end;
+ while d > 0 do
+ begin
+ if not Read(l2, 4) then
+ begin
+ curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadTypes := false;
+ exit;
+ end;
+ if Cardinal(l2) >= FTypes.Count then
+ begin
+ curr.Free;
+ cmd_err(ErOutOfRange);
+ LoadTypes := false;
+ exit;
+ end;
+ TPSTypeRec_Record(curR).FFieldTypes.Add(FTypes[l2]);
+ Dec(D);
+ end;
+ if not resolve(TPSTypeRec_Record(curr)) then
+ begin
+ curr.Free;
+ cmd_err(erInvalidType);
+ LoadTypes := False;
+ exit;
+ end;
+ Curr.BaseType := currf.BaseType;
+ FTypes.Add(Curr);
+ end;
+ else begin
+ LoadTypes := False;
+ CMD_Err(erInvalidType);
+ exit;
+ end;
+ end;
+ if fe then begin
+ if not read(d, 4) then begin
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ if d > PSAddrNegativeStackStart then
+ begin
+ cmd_err(erInvalidType);
+ LoadTypes := False;
+ exit;
+ end;
+ SetLength(Curr.FExportName, d);
+ if not read(Curr.fExportName[1], d) then
+ begin
+ cmd_err(erUnexpectedEof);
+ LoadTypes := False;
+ exit;
+ end;
+ Curr.ExportNameHash := MakeHash(Curr.ExportName);
+ end;
+ curr.CalcSize;
+ if HDR.PSBuildNo >= 21 then // since build 21 we support attributes
+ begin
+ if not ReadAttributes(Curr.Attributes) then
+ begin
+ LoadTypes := False;
+ exit;
+ end;
+ end;
+ end;
+ end;
+
+ function LoadProcs: Boolean;
+ var
+ Rec: TPSProc;
+ n: tbtString;
+ b: Byte;
+ l, L2, L3: Longint;
+ Curr: TPSProcRec;
+ begin
+ LoadProcs := True;
+ for l := 0 to HDR.ProcCount - 1 do begin
+ if not read(Rec, SizeOf(Rec)) then begin
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ if (Rec.Flags and 1) <> 0 then
+ begin
+ Curr := TPSExternalProcRec.Create(Self);
+ if not read(b, 1) then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ SetLength(n, b);
+ if not read(n[1], b) then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ TPSExternalProcRec(Curr).Name := n;
+ if (Rec.Flags and 3 = 3) then
+ begin
+ if (not Read(L2, 4)) or (L2 > Length(s) - Pos) then
+ begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ SetLength(n, L2);
+ Read(n[1], L2); // no check is needed
+ TPSExternalProcRec(Curr).FDecl := n;
+ end;
+ if not ImportProc(TPSExternalProcRec(Curr).Name, TPSExternalProcRec(Curr)) then begin
+ if TPSExternalProcRec(Curr).Name <> '' then
+ CMD_Err2(erCannotImport, TPSExternalProcRec(Curr).Name)
+ else
+ CMD_Err2(erCannotImport, TPSExternalProcRec(curr).Decl);
+ Curr.Free;
+ LoadProcs := False;
+ exit;
+ end;
+ end else begin
+ Curr := TPSInternalProcRec.Create(Self);
+ if not read(L2, 4) then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ if not read(L3, 4) then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ if (L2 < 0) or (L2 >= Length(s)) or (L2 + L3 > Length(s)) or (L3 = 0) then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+
+ GetMem(TPSInternalProcRec(Curr).FData, L3);
+ Move(s[L2 + 1], TPSInternalProcRec(Curr).FData^, L3);
+ TPSInternalProcRec(Curr).FLength := L3;
+ if (Rec.Flags and 2) <> 0 then begin // exported
+ if not read(L3, 4) then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ if L3 > PSAddrNegativeStackStart then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ SetLength(TPSInternalProcRec(Curr).FExportName, L3);
+ if not read(TPSInternalProcRec(Curr).FExportName[1], L3) then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ if not read(L3, 4) then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ if L3 > PSAddrNegativeStackStart then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ SetLength(TPSInternalProcRec(Curr).FExportDecl, L3);
+ if not read(TPSInternalProcRec(Curr).FExportDecl[1], L3) then begin
+ Curr.Free;
+ cmd_err(erUnexpectedEof);
+ LoadProcs := False;
+ exit;
+ end;
+ TPSInternalProcRec(Curr).FExportNameHash := MakeHash(TPSInternalProcRec(Curr).ExportName);
+ end;
+ end;
+ if (Rec.Flags and 4) <> 0 then
+ begin
+ if not ReadAttributes(Curr.Attributes) then
+ begin
+ Curr.Free;
+ LoadProcs := False;
+ exit;
+ end;
+ end;
+ FProcs.Add(Curr);
+ end;
+ end;
+{$WARNINGS ON}
+
+ function LoadVars: Boolean;
+ var
+ l, n: Longint;
+ e: PPSExportedVar;
+ Rec: TPSVar;
+ Curr: PIfVariant;
+ begin
+ LoadVars := True;
+ for l := 0 to HDR.VarCount - 1 do begin
+ if not read(Rec, SizeOf(Rec)) then begin
+ cmd_err(erUnexpectedEof);
+ LoadVars := False;
+ exit;
+ end;
+ if Rec.TypeNo >= HDR.TypeCount then begin
+ cmd_err(erInvalidType);
+ LoadVars := False;
+ exit;
+ end;
+ Curr := FGlobalVars.PushType(FTypes.Data^[Rec.TypeNo]);
+ if Curr = nil then begin
+ cmd_err(erInvalidType);
+ LoadVars := False;
+ exit;
+ end;
+ if (Rec.Flags and 1) <> 0 then
+ begin
+ if not read(n, 4) then begin
+ cmd_err(erUnexpectedEof);
+ LoadVars := False;
+ exit;
+ end;
+ new(e);
+ try
+ SetLength(e^.FName, n);
+ if not Read(e^.FName[1], n) then
+ begin
+ dispose(e);
+ cmd_err(erUnexpectedEof);
+ LoadVars := False;
+ exit;
+ end;
+ e^.FNameHash := MakeHash(e^.FName);
+ e^.FVarNo := FGlobalVars.Count;
+ FExportedVars.Add(E);
+ except
+ dispose(e);
+ cmd_err(erInvalidType);
+ LoadVars := False;
+ exit;
+ end;
+ end;
+ end;
+ end;
+
+begin
+ Clear;
+ Pos := 0;
+ LoadData := False;
+ if not read(HDR, SizeOf(HDR)) then
+ begin
+ CMD_Err(erInvalidHeader);
+ exit;
+ end;
+ if HDR.HDR <> PSValidHeader then
+ begin
+ CMD_Err(erInvalidHeader);
+ exit;
+ end;
+ if (HDR.PSBuildNo > PSCurrentBuildNo) or (HDR.PSBuildNo < PSLowBuildSupport) then begin
+ CMD_Err(erInvalidHeader);
+ exit;
+ end;
+ if not LoadTypes then
+ begin
+ Clear;
+ exit;
+ end;
+ if not LoadProcs then
+ begin
+ Clear;
+ exit;
+ end;
+ if not LoadVars then
+ begin
+ Clear;
+ exit;
+ end;
+ if (HDR.MainProcNo >= FProcs.Count) and (HDR.MainProcNo <> InvalidVal)then begin
+ CMD_Err(erNoMainProc);
+ Clear;
+ exit;
+ end;
+ // Load Import Table
+ FMainProc := HDR.MainProcNo;
+ FStatus := isLoaded;
+ Result := True;
+end;
+
+
+procedure TPSExec.Pause;
+begin
+ if FStatus = isRunning then
+ FStatus := isPaused;
+end;
+
+function TPSExec.ReadData(var Data; Len: Cardinal): Boolean;
+begin
+ if FCurrentPosition + Len <= FDataLength then begin
+ Move(FData^[FCurrentPosition], Data, Len);
+ FCurrentPosition := FCurrentPosition + Len;
+ Result := True;
+ end
+ else
+ Result := False;
+end;
+
+procedure TPSExec.CMD_Err(EC: TPSError); // Error
+begin
+ CMD_Err3(ec, '', nil);
+end;
+
+procedure VNSetPointerTo(const Src: TPSVariantIFC; Data: Pointer; aType: TPSTypeRec);
+begin
+ if Src.aType.BaseType = btPointer then
+ begin
+ if atype.BaseType in NeedFinalization then
+ FinalizeVariant(src.Dta, Src.aType);
+ Pointer(Src.Dta^) := Data;
+ Pointer(Pointer(IPointer(Src.Dta)+PointerSize)^) := aType;
+ Pointer(Pointer(IPointer(Src.Dta)+(2*PointerSize))^) := nil;
+ end;
+end;
+
+function VNGetUInt(const Src: TPSVariantIFC): Cardinal;
+begin
+ Result := PSGetUInt(Src.Dta, Src.aType);
+end;
+
+{$IFNDEF PS_NOINT64}
+function VNGetInt64(const Src: TPSVariantIFC): Int64;
+begin
+ Result := PSGetInt64(Src.Dta, Src.aType);
+end;
+{$ENDIF}
+
+function VNGetReal(const Src: TPSVariantIFC): Extended;
+begin
+ Result := PSGetReal(Src.Dta, Src.aType);
+end;
+
+function VNGetCurrency(const Src: TPSVariantIFC): Currency;
+begin
+ Result := PSGetCurrency(Src.Dta, Src.aType);
+end;
+
+function VNGetInt(const Src: TPSVariantIFC): Longint;
+begin
+ Result := PSGetInt(Src.Dta, Src.aType);
+end;
+
+function VNGetAnsiString(const Src: TPSVariantIFC): tbtString;
+begin
+ Result := PSGetAnsiString(Src.Dta, Src.aType);
+end;
+
+{$IFNDEF PS_NOWIDESTRING}
+function VNGetWideString(const Src: TPSVariantIFC): tbtWideString;
+begin
+ Result := PSGetWideString(Src.Dta, Src.aType);
+end;
+
+function VNGetUnicodeString(const Src: TPSVariantIFC): tbtunicodestring;
+begin
+ Result := PSGetUnicodeString(Src.Dta, Src.aType);
+end;
+{$ENDIF}
+
+procedure VNSetUInt(const Src: TPSVariantIFC; const Val: Cardinal);
+var
+ Dummy: Boolean;
+begin
+ PSSetUInt(Src.Dta, Src.aType, Dummy, Val);
+end;
+
+{$IFNDEF PS_NOINT64}
+procedure VNSetInt64(const Src: TPSVariantIFC; const Val: Int64);
+var
+ Dummy: Boolean;
+begin
+ PSSetInt64(Src.Dta, Src.aType, Dummy, Val);
+end;
+{$ENDIF}
+
+procedure VNSetReal(const Src: TPSVariantIFC; const Val: Extended);
+var
+ Dummy: Boolean;
+begin
+ PSSetReal(Src.Dta, Src.aType, Dummy, Val);
+end;
+
+procedure VNSetCurrency(const Src: TPSVariantIFC; const Val: Currency);
+var
+ Dummy: Boolean;
+begin
+ PSSetCurrency(Src.Dta, Src.aType, Dummy, Val);
+end;
+
+procedure VNSetInt(const Src: TPSVariantIFC; const Val: Longint);
+var
+ Dummy: Boolean;
+begin
+ PSSetInt(Src.Dta, Src.aType, Dummy, Val);
+end;
+
+procedure VNSetAnsiString(const Src: TPSVariantIFC; const Val: tbtString);
+var
+ Dummy: Boolean;
+begin
+ PSSetAnsiString(Src.Dta, Src.aType, Dummy, Val);
+end;
+
+function VNGetString(const Src: TPSVariantIFC): String;
+begin
+ {$IFDEF DELPHI2009UP}
+ Result := VNGetUnicodeString(Src);
+ {$ELSE}
+ Result := VNGetAnsiString(Src);
+ {$ENDIF}
+end;
+
+procedure VNSetString(const Src: TPSVariantIFC; const Val: String);
+begin
+ {$IFDEF DELPHI2009UP}
+ VNSetUnicodeString(Src, Val);
+ {$ELSE}
+ VNSetAnsiString(Src, Val);
+ {$ENDIF}
+end;
+
+{$IFNDEF PS_NOWIDESTRING}
+procedure VNSetWideString(const Src: TPSVariantIFC; const Val: tbtWideString);
+var
+ Dummy: Boolean;
+begin
+ PSSetWideString(Src.Dta, Src.aType, Dummy, Val);
+end;
+
+procedure VNSetUnicodeString(const Src: TPSVariantIFC; const Val: tbtunicodestring);
+var
+ Dummy: Boolean;
+begin
+ PSSetUnicodeString(Src.Dta, Src.aType, Dummy, Val);
+end;
+
+{$ENDIF}
+
+function VGetUInt(const Src: PIFVariant): Cardinal;
+begin
+ Result := PSGetUInt(@PPSVariantData(src).Data, src.FType);
+end;
+
+{$IFNDEF PS_NOINT64}
+function VGetInt64(const Src: PIFVariant): Int64;
+begin
+ Result := PSGetInt64(@PPSVariantData(src).Data, src.FType);
+end;
+{$ENDIF}
+
+function VGetReal(const Src: PIFVariant): Extended;
+begin
+ Result := PSGetReal(@PPSVariantData(src).Data, src.FType);
+end;
+
+function VGetCurrency(const Src: PIFVariant): Currency;
+begin
+ Result := PSGetCurrency(@PPSVariantData(src).Data, src.FType);
+end;
+
+function VGetInt(const Src: PIFVariant): Longint;
+begin
+ Result := PSGetInt(@PPSVariantData(src).Data, src.FType);
+end;
+
+function VGetAnsiString(const Src: PIFVariant): tbtString;
+begin
+ Result := PSGetAnsiString(@PPSVariantData(src).Data, src.FType);
+end;
+
+{$IFNDEF PS_NOWIDESTRING}
+function VGetWideString(const Src: PIFVariant): tbtWideString;
+begin
+ Result := PSGetWideString(@PPSVariantData(src).Data, src.FType);
+end;
+
+function VGetUnicodeString(const Src: PIFVariant): tbtunicodestring;
+begin
+ Result := PSGetUnicodeString(@PPSVariantData(src).Data, src.FType);
+end;
+
+{$ENDIF}
+
+
+procedure VSetPointerTo(const Src: PIFVariant; Data: Pointer; aType: TPSTypeRec);
+var
+ temp: TPSVariantIFC;
+begin
+ if (Atype = nil) or (Data = nil) or (Src = nil) then raise Exception.Create(RPS_InvalidVariable);
+ temp.Dta := @PPSVariantData(Src).Data;
+ temp.aType := Src.FType;
+ temp.VarParam := false;
+ VNSetPointerTo(temp, Data, AType);
+end;
+
+procedure VSetUInt(const Src: PIFVariant; const Val: Cardinal);
+var
+ Dummy: Boolean;
+begin
+ PSSetUInt(@PPSVariantData(src).Data, src.FType, Dummy, Val);
+end;
+
+{$IFNDEF PS_NOINT64}
+procedure VSetInt64(const Src: PIFVariant; const Val: Int64);
+var
+ Dummy: Boolean;
+begin
+ PSSetInt64(@PPSVariantData(src).Data, src.FType, Dummy, Val);
+end;
+{$ENDIF}
+
+procedure VSetReal(const Src: PIFVariant; const Val: Extended);
+var
+ Dummy: Boolean;
+begin
+ PSSetReal(@PPSVariantData(src).Data, src.FType, Dummy, Val);
+end;
+
+procedure VSetCurrency(const Src: PIFVariant; const Val: Currency);
+var
+ Dummy: Boolean;
+begin
+ PSSetCurrency(@PPSVariantData(src).Data, src.FType, Dummy, Val);
+end;
+
+procedure VSetInt(const Src: PIFVariant; const Val: Longint);
+var
+ Dummy: Boolean;
+begin
+ PSSetInt(@PPSVariantData(src).Data, src.FType, Dummy, Val);
+end;
+
+procedure VSetAnsiString(const Src: PIFVariant; const Val: tbtString);
+var
+ Dummy: Boolean;
+begin
+ PSSetAnsiString(@PPSVariantData(src).Data, src.FType, Dummy, Val);
+end;
+
+function VGetString(const Src: PIFVariant): String;
+begin
+ {$IFDEF DELPHI2009UP}
+ Result := PSGetUnicodeString(@PPSVariantData(src).Data, src.FType);
+ {$ELSE}
+ Result := PSGetAnsiString(@PPSVariantData(src).Data, src.FType);
+ {$ENDIF}
+end;
+
+procedure VSetString(const Src: PIFVariant; const Val: string);
+var
+ Dummy: Boolean;
+begin
+ {$IFDEF DELPHI2009UP}
+ PSSetUnicodeString(@PPSVariantData(src).Data, src.FType, Dummy, Val);
+ {$ELSE}
+ PSSetAnsiString(@PPSVariantData(src).Data, src.FType, Dummy, Val);
+ {$ENDIF}
+end;
+
+
+{$IFNDEF PS_NOWIDESTRING}
+procedure VSetWideString(const Src: PIFVariant; const Val: tbtWideString);
+var
+ Dummy: Boolean;
+begin
+ PSSetWideString(@PPSVariantData(src).Data, src.FType, Dummy, Val);
+end;
+
+procedure VSetUnicodeString(const Src: PIFVariant; const Val: tbtunicodestring);
+var
+ Dummy: Boolean;
+begin
+ PSSetUnicodeString(@PPSVariantData(src).Data, src.FType, Dummy, Val);
+end;
+
+
+{$ENDIF}
+
+{$IFNDEF PS_NOWIDESTRING}
+function VarToWideStr(const Data: Variant): tbtunicodestring;
+begin
+ if not VarIsNull(Data) then
+ Result := Data
+ else
+ Result := '';
+end;
+{$ENDIF}
+
+function PSGetUInt(Src: Pointer; aType: TPSTypeRec): Cardinal;
+begin
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case aType.BaseType of
+ btU8: Result := tbtu8(src^);
+ btS8: Result := tbts8(src^);
+ btU16: Result := tbtu16(src^);
+ btS16: Result := tbts16(src^);
+ btU32: Result := tbtu32(src^);
+ btS32: Result := tbts32(src^);
+{$IFNDEF PS_NOINT64} btS64: Result := tbts64(src^);
+{$ENDIF}
+ btChar: Result := Ord(tbtchar(Src^));
+{$IFNDEF PS_NOWIDESTRING} btWideChar: Result := Ord(tbtwidechar(Src^));{$ENDIF}
+ btVariant:
+ case VarType(Variant(Src^)) of
+ varString:
+ if Length(VarToStr(Variant(Src^))) = 1 then
+ Result := Ord(VarToStr(Variant(Src^))[1])
+ else
+ raise Exception.Create(RPS_TypeMismatch);
+{$IFNDEF PS_NOWIDESTRING}
+ varOleStr:
+ if Length(VarToWideStr(Variant(Src^))) = 1 then
+ Result := Ord(VarToWideStr(Variant(Src^))[1])
+ else
+ raise Exception.Create(RPS_TypeMismatch);
+{$ENDIF}
+ else
+ Result := Variant(src^);
+ end;
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+end;
+
+function PSGetObject(Src: Pointer; aType: TPSTypeRec): TObject;
+begin
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case aType.BaseType of
+ btClass: Result := TObject(Src^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+end;
+
+procedure PSSetObject(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; Const val: TObject);
+begin
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case aType.BaseType of
+ btClass: TObject(Src^) := Val;
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+end;
+
+
+{$IFNDEF PS_NOINT64}
+function PSGetInt64(Src: Pointer; aType: TPSTypeRec): Int64;
+begin
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case aType.BaseType of
+ btU8: Result := tbtu8(src^);
+ btS8: Result := tbts8(src^);
+ btU16: Result := tbtu16(src^);
+ btS16: Result := tbts16(src^);
+ btU32: Result := tbtu32(src^);
+ btS32: Result := tbts32(src^);
+ btS64: Result := tbts64(src^);
+ btChar: Result := Ord(tbtchar(Src^));
+{$IFNDEF PS_NOWIDESTRING}
+ btWideChar: Result := Ord(tbtwidechar(Src^));
+{$ENDIF}
+{$IFDEF DELPHI6UP}
+ btVariant: Result := Variant(src^);
+{$ENDIF}
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+end;
+{$ENDIF}
+
+function PSGetReal(Src: Pointer; aType: TPSTypeRec): Extended;
+begin
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case aType.BaseType of
+ btU8: Result := tbtu8(src^);
+ btS8: Result := tbts8(src^);
+ btU16: Result := tbtu16(src^);
+ btS16: Result := tbts16(src^);
+ btU32: Result := tbtu32(src^);
+ btS32: Result := tbts32(src^);
+{$IFNDEF PS_NOINT64} btS64: Result := tbts64(src^);{$ENDIF}
+ btSingle: Result := tbtsingle(Src^);
+ btDouble: Result := tbtdouble(Src^);
+ btExtended: Result := tbtextended(Src^);
+ btCurrency: Result := tbtcurrency(Src^);
+ btVariant: Result := Variant(src^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+end;
+
+function PSGetCurrency(Src: Pointer; aType: TPSTypeRec): Currency;
+begin
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case aType.BaseType of
+ btU8: Result := tbtu8(src^);
+ btS8: Result := tbts8(src^);
+ btU16: Result := tbtu16(src^);
+ btS16: Result := tbts16(src^);
+ btU32: Result := tbtu32(src^);
+ btS32: Result := tbts32(src^);
+{$IFNDEF PS_NOINT64} btS64: Result := tbts64(src^);{$ENDIF}
+ btSingle: Result := tbtsingle(Src^);
+ btDouble: Result := tbtdouble(Src^);
+ btExtended: Result := tbtextended(Src^);
+ btCurrency: Result := tbtcurrency(Src^);
+ btVariant: Result := Variant(src^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+end;
+
+
+function PSGetInt(Src: Pointer; aType: TPSTypeRec): Longint;
+begin
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case aType.BaseType of
+ btU8: Result := tbtu8(src^);
+ btS8: Result := tbts8(src^);
+ btU16: Result := tbtu16(src^);
+ btS16: Result := tbts16(src^);
+ btU32: Result := tbtu32(src^);
+ btS32: Result := tbts32(src^);
+{$IFNDEF PS_NOINT64} btS64: Result := tbts64(src^);{$ENDIF}
+ btChar: Result := Ord(tbtchar(Src^));
+{$IFNDEF PS_NOWIDESTRING} btWideChar: Result := Ord(tbtwidechar(Src^));{$ENDIF}
+ btVariant: Result := Variant(src^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+end;
+
+
+function PSGetAnsiString(Src: Pointer; aType: TPSTypeRec): tbtString;
+begin
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case aType.BaseType of
+ btU8: Result := tbtchar(tbtu8(src^));
+ btChar: Result := tbtchar(Src^);
+ btPchar: Result := pansichar(src^);
+{$IFNDEF PS_NOWIDESTRING} btWideChar: Result := tbtString(tbtwidechar(Src^));{$ENDIF}
+ btString: Result := tbtstring(src^);
+{$IFNDEF PS_NOWIDESTRING}
+ btUnicodeString: result := tbtString(tbtUnicodestring(src^));
+ btWideString: Result := tbtString(tbtwidestring(src^));{$ENDIF}
+ btVariant: Result := tbtString(Variant(src^));
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+end;
+{$IFNDEF PS_NOWIDESTRING}
+function PSGetWideString(Src: Pointer; aType: TPSTypeRec): tbtWideString;
+begin
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case aType.BaseType of
+ btU8: Result := chr(tbtu8(src^));
+ btU16: Result := widechar(src^);
+ btChar: Result := tbtwidestring(tbtchar(Src^));
+ btPchar: Result := tbtwidestring(pansichar(src^));
+ btWideChar: Result := tbtwidechar(Src^);
+ btString: Result := tbtwidestring(tbtstring(src^));
+ btWideString: Result := tbtwidestring(src^);
+ btVariant: Result := Variant(src^);
+ btUnicodeString: result := tbtUnicodeString(src^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+end;
+
+function PSGetUnicodeString(Src: Pointer; aType: TPSTypeRec): tbtunicodestring;
+begin
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case aType.BaseType of
+ btU8: Result := chr(tbtu8(src^));
+ btU16: Result := widechar(src^);
+ btChar: Result := tbtwidestring(tbtchar(Src^));
+ btPchar: Result := tbtwidestring(pansichar(src^));
+ btWideChar: Result := tbtwidechar(Src^);
+ btString: Result := tbtwidestring(tbtstring(src^));
+ btWideString: Result := tbtwidestring(src^);
+ btVariant: Result := Variant(src^);
+ btUnicodeString: result := tbtUnicodeString(src^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+end;
+{$ENDIF}
+
+procedure PSSetUInt(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: Cardinal);
+begin
+ if (Src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ end;
+ case aType.BaseType of
+ btU8: tbtu8(src^) := Val;
+ btS8: tbts8(src^) := Val;
+ btU16: tbtu16(src^) := Val;
+ btS16: tbts16(src^) := Val;
+ btProcPtr:
+ begin
+ tbtu32(src^) := Val;
+ Pointer(Pointer(IPointer(Src)+PointerSize)^) := nil;
+ Pointer(Pointer(IPointer(Src)+PointerSize2)^) := nil;
+ end;
+ btU32: tbtu32(src^) := Val;
+ btS32: tbts32(src^) := Val;
+{$IFNDEF PS_NOINT64} btS64: tbts64(src^) := Val;{$ENDIF}
+ btChar: tbtchar(Src^) := tbtChar(Val);
+{$IFNDEF PS_NOWIDESTRING} btWideChar: tbtwidechar(Src^) := tbtwidechar(Val);{$ENDIF}
+ btSingle: tbtSingle(src^) := Val;
+ btDouble: tbtDouble(src^) := Val;
+ btCurrency: tbtCurrency(src^) := Val;
+ btExtended: tbtExtended(src^) := Val;
+ btVariant:
+ begin
+ try
+ Variant(src^) := {$IFDEF DELPHI6UP}val{$ELSE}tbts32(val){$ENDIF};
+ except
+ Ok := false;
+ end;
+ end;
+ else ok := false;
+ end;
+end;
+
+{$IFNDEF PS_NOINT64}
+procedure PSSetInt64(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: Int64);
+begin
+ if (Src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ end;
+ case aType.BaseType of
+ btU8: tbtu8(src^) := Val;
+ btS8: tbts8(src^) := Val;
+ btU16: tbtu16(src^) := Val;
+ btS16: tbts16(src^) := Val;
+ btU32: tbtu32(src^) := Val;
+ btS32: tbts32(src^) := Val;
+ btS64: tbts64(src^) := Val;
+ btChar: tbtchar(Src^) := tbtChar(Val);
+{$IFNDEF PS_NOWIDESTRING}
+ btWideChar: tbtwidechar(Src^) := tbtwidechar(Val);
+{$ENDIF}
+ btSingle: tbtSingle(src^) := Val;
+ btDouble: tbtDouble(src^) := Val;
+ btCurrency: tbtCurrency(src^) := Val;
+ btExtended: tbtExtended(src^) := Val;
+{$IFDEF DELPHI6UP}
+ btVariant:
+ begin
+ try
+ Variant(src^) := Val;
+ except
+ Ok := false;
+ end;
+ end;
+{$ENDIF}
+ else ok := false;
+ end;
+end;
+{$ENDIF}
+
+procedure PSSetReal(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: Extended);
+begin
+ if (Src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ end;
+ case aType.BaseType of
+ btSingle: tbtSingle(src^) := Val;
+ btDouble: tbtDouble(src^) := Val;
+ btCurrency: tbtCurrency(src^) := Val;
+ btExtended: tbtExtended(src^) := Val;
+ btVariant:
+ begin
+ try
+ Variant(src^) := Val;
+ except
+ Ok := false;
+ end;
+ end;
+ else ok := false;
+ end;
+end;
+
+procedure PSSetCurrency(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: Currency);
+begin
+ if (Src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ end;
+ case aType.BaseType of
+ btSingle: tbtSingle(src^) := Val;
+ btDouble: tbtDouble(src^) := Val;
+ btCurrency: tbtCurrency(src^) := Val;
+ btExtended: tbtExtended(src^) := Val;
+ btVariant:
+ begin
+ try
+ Variant(src^) := Val;
+ except
+ Ok := false;
+ end;
+ end;
+ else ok := false;
+ end;
+end;
+
+procedure PSSetInt(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: Longint);
+begin
+ if (Src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ end;
+ case aType.BaseType of
+ btU8: tbtu8(src^) := Val;
+ btS8: tbts8(src^) := Val;
+ btU16: tbtu16(src^) := Val;
+ btS16: tbts16(src^) := Val;
+ btProcPtr:
+ begin
+ tbtu32(src^) := Val;
+ Pointer(Pointer(IPointer(Src)+PointerSize)^) := nil;
+ Pointer(Pointer(IPointer(Src)+PointerSize2)^) := nil;
+ end;
+ btU32: tbtu32(src^) := Val;
+ btS32: tbts32(src^) := Val;
+{$IFNDEF PS_NOINT64} btS64: tbts64(src^) := Val;{$ENDIF}
+ btChar: tbtchar(Src^) := tbtChar(Val);
+{$IFNDEF PS_NOWIDESTRING} btWideChar: tbtwidechar(Src^) := tbtwidechar(Val);{$ENDIF}
+ btSingle: tbtSingle(src^) := Val;
+ btDouble: tbtDouble(src^) := Val;
+ btCurrency: tbtCurrency(src^) := Val;
+ btExtended: tbtExtended(src^) := Val;
+ btVariant:
+ begin
+ try
+ Variant(src^) := Val;
+ except
+ Ok := false;
+ end;
+ end;
+ else ok := false;
+ end;
+end;
+
+procedure PSSetAnsiString(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: tbtString);
+begin
+ if (Src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ end;
+ case aType.BaseType of
+ btString: tbtstring(src^) := val;
+{$IFNDEF PS_NOWIDESTRING}
+ btUnicodeString: tbtunicodestring(src^) := tbtUnicodeString(AnsiString(val));
+ btWideString: tbtwidestring(src^) := tbtwidestring(AnsiString(val));{$ENDIF}
+ btVariant:
+ begin
+ try
+ Variant(src^) := Val;
+ except
+ Ok := false;
+ end;
+ end;
+ else ok := false;
+ end;
+end;
+{$IFNDEF PS_NOWIDESTRING}
+procedure PSSetWideString(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: tbtWideString);
+begin
+ if (Src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ end;
+ case aType.BaseType of
+ btString: tbtstring(src^) := tbtString(val);
+ btWideString: tbtwidestring(src^) := val;
+ btUnicodeString: tbtunicodestring(src^) := val;
+ btVariant:
+ begin
+ try
+ Variant(src^) := Val;
+ except
+ Ok := false;
+ end;
+ end;
+ else ok := false;
+ end;
+end;
+procedure PSSetUnicodeString(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: tbtunicodestring);
+begin
+ if (Src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ if aType.BaseType = btPointer then
+ begin
+ atype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (aType = nil) then begin Ok := false; exit; end;
+ end;
+ case aType.BaseType of
+ btString: tbtstring(src^) := tbtString(val);
+ btWideString: tbtwidestring(src^) := val;
+ btUnicodeString: tbtunicodestring(src^) := val;
+ btVariant:
+ begin
+ try
+ Variant(src^) := Val;
+ except
+ Ok := false;
+ end;
+ end;
+ else ok := false;
+ end;
+end;
+{$ENDIF}
+
+function PSGetString(Src: Pointer; aType: TPSTypeRec): string;
+begin
+ {$IFDEF DELPHI2009UP}
+ result := PSGetUnicodeString(Src, aType);
+ {$ELSE}
+ result := PSGetAnsiString(Src, aType);
+ {$ENDIF}
+end;
+
+procedure PSSetString(Src: Pointer; aType: TPSTypeRec; var Ok: Boolean; const Val: String);
+begin
+ {$IFDEF DELPHI2009UP}
+ PSSetUnicodeString(Src, aType, Ok, Val);
+ {$ELSE}
+ PSSetAnsiString(Src, aType, Ok, Val);
+ {$ENDIF}
+end;
+
+
+function CopyArrayContents(dest, src: Pointer; Len: Longint; aType: TPSTypeRec): Boolean; forward;
+
+function CopyRecordContents(dest, src: Pointer; aType: TPSTypeRec_Record): Boolean;
+var
+ o, i: Longint;
+begin
+ for i := 0 to aType.FieldTypes.Count -1 do
+ begin
+ o := Longint(atype.RealFieldOffsets[i]);
+ CopyArrayContents(Pointer(IPointer(Dest)+Cardinal(o)), Pointer(IPointer(Src)+Cardinal(o)), 1, aType.FieldTypes[i]);
+ end;
+ Result := true;
+end;
+
+function CreateArrayFromVariant(Exec: TPSExec; dest: Pointer; src: Variant; DestType: TPSTypeRec): Boolean;
+var
+ i: Integer;
+ r: Pointer;
+ lVarType: TPSTypeRec;
+ v: variant;
+begin
+ lVarType := Exec.FindType2(btVariant);
+ if lVarType = nil then begin result := false; exit; end;
+ PSDynArraySetLength(Pointer(dest^), desttype, VarArrayHighBound(src, 1) - VarArrayLowBound(src, 1) + 1);
+ r := Pointer(Dest^);
+ DestType := TPSTypeRec_Array(DestType).ArrayType;
+ for i := 0 to VarArrayHighBound(src, 1) - VarArrayLowBound(src, 1) do begin
+ v := src[i + VarArrayLowBound(src, 1)];
+ if not Exec.SetVariantValue(r, @v, desttype, lVarType) then begin result := false; exit; end;
+ r := Pointer(IPointer(r) + Longint(DestType.RealSize));
+ end;
+ Result := true;
+end;
+
+function CopyArrayContents(dest, src: Pointer; Len: Longint; aType: TPSTypeRec): Boolean;
+var
+ elsize: Cardinal;
+ i: Longint;
+begin
+ try
+ case aType.BaseType of
+ btU8, btS8, btChar:
+ for i := 0 to Len -1 do
+ begin
+ tbtU8(Dest^) := tbtU8(Src^);
+ Dest := Pointer(IPointer(Dest) + 1);
+ Src := Pointer(IPointer(Src) + 1);
+ end;
+ btU16, btS16{$IFNDEF PS_NOWIDESTRING}, btWideChar{$ENDIF}:
+ for i := 0 to Len -1 do
+ begin
+ tbtU16(Dest^) := tbtU16(Src^);
+ Dest := Pointer(IPointer(Dest) + 2);
+ Src := Pointer(IPointer(Src) + 2);
+ end;
+ btProcPtr:
+ for i := 0 to Len -1 do
+ begin
+ tbtU32(Dest^) := tbtU32(Src^);
+ Dest := Pointer(IPointer(Dest) + 4);
+ Src := Pointer(IPointer(Src) + 4);
+ Pointer(Dest^) := Pointer(Src^);
+ Dest := Pointer(IPointer(Dest) + PointerSize);
+ Src := Pointer(IPointer(Src) + PointerSize);
+ Pointer(Dest^) := Pointer(Src^);
+ Dest := Pointer(IPointer(Dest) + PointerSize);
+ Src := Pointer(IPointer(Src) + PointerSize);
+ end;
+ btClass, btpchar:
+ for i := 0 to Len -1 do
+ begin
+ Pointer(Dest^) := Pointer(Src^);
+ Dest := Pointer(IPointer(Dest) + PointerSize);
+ Src := Pointer(IPointer(Src) + PointerSize);
+ end;
+ btU32, btS32, btSingle:
+ for i := 0 to Len -1 do
+ begin
+ tbtU32(Dest^) := tbtU32(Src^);
+ Dest := Pointer(IPointer(Dest) + 4);
+ Src := Pointer(IPointer(Src) + 4);
+ end;
+ btDouble:
+ for i := 0 to Len -1 do
+ begin
+ tbtDouble(Dest^) := tbtDouble(Src^);
+ Dest := Pointer(IPointer(Dest) + 8);
+ Src := Pointer(IPointer(Src) + 8);
+ end;
+ {$IFNDEF PS_NOINT64}bts64:
+ for i := 0 to Len -1 do
+ begin
+ tbts64(Dest^) := tbts64(Src^);
+ Dest := Pointer(IPointer(Dest) + 8);
+ Src := Pointer(IPointer(Src) + 8);
+ end;{$ENDIF}
+ btExtended:
+ for i := 0 to Len -1 do
+ begin
+ tbtExtended(Dest^) := tbtExtended(Src^);
+ Dest := Pointer(IPointer(Dest) + SizeOf(Extended));
+ Src := Pointer(IPointer(Src) + SizeOf(Extended));
+ end;
+ btCurrency:
+ for i := 0 to Len -1 do
+ begin
+ tbtCurrency(Dest^) := tbtCurrency(Src^);
+ Dest := Pointer(IPointer(Dest) + SizeOf(Currency));
+ Src := Pointer(IPointer(Src) + SizeOf(Currency));
+ end;
+ btVariant:
+ for i := 0 to Len -1 do
+ begin
+ variant(Dest^) := variant(Src^);
+ Dest := Pointer(IPointer(Dest) + Sizeof(Variant));
+ Src := Pointer(IPointer(Src) + Sizeof(Variant));
+ end;
+ btString:
+ for i := 0 to Len -1 do
+ begin
+ tbtString(Dest^) := tbtString(Src^);
+ Dest := Pointer(IPointer(Dest) + PointerSize);
+ Src := Pointer(IPointer(Src) + PointerSize);
+ end;
+ {$IFNDEF PS_NOWIDESTRING}
+ btUnicodeString:
+ for i := 0 to Len -1 do
+ begin
+ tbtunicodestring(Dest^) := tbtunicodestring(Src^);
+ Dest := Pointer(IPointer(Dest) + PointerSize);
+ Src := Pointer(IPointer(Src) + PointerSize);
+ end;
+ btWideString:
+ for i := 0 to Len -1 do
+ begin
+ tbtWideString(Dest^) := tbtWideString(Src^);
+ Dest := Pointer(IPointer(Dest) + PointerSize);
+ Src := Pointer(IPointer(Src) + PointerSize);
+ end;
+ {$ENDIF}
+ btStaticArray:
+ begin
+ elSize := aType.RealSize;
+ for i := 0 to Len -1 do
+ begin
+ if not CopyArrayContents(Dest, Src, TPSTypeRec_StaticArray(aType).Size, TPSTypeRec_StaticArray(aType).ArrayType) then
+ begin
+ result := false;
+ exit;
+ end;
+ Dest := Pointer(IPointer(Dest) + elsize);
+ Src := Pointer(IPointer(Src) + elsize);
+ end;
+ end;
+ btArray:
+ begin
+ for i := 0 to Len -1 do
+ begin
+ Pointer(Dest^) := Pointer(Src^);
+ if Pointer(Dest^) <> nil then
+ begin
+ Inc(Longint(Pointer(IPointer(Dest^)-(2*PointerSize))^)); // RefCount
+ end;
+ Dest := Pointer(IPointer(Dest) + PointerSize);
+ Src := Pointer(IPointer(Src) + PointerSize);
+ end;
+ end;
+ btRecord:
+ begin
+ elSize := aType.RealSize;
+ for i := 0 to Len -1 do
+ begin
+ if not CopyRecordContents(Dest, Src, TPSTypeRec_Record(aType)) then
+ begin
+ result := false;
+ exit;
+ end;
+ Dest := Pointer(IPointer(Dest) + elsize);
+ Src := Pointer(IPointer(Src) + elsize);
+ end;
+ end;
+ btSet:
+ begin
+ elSize := aType.RealSize;
+ for i := 0 to Len -1 do
+ begin
+ Move(Src^, Dest^, elSize);
+ Dest := Pointer(IPointer(Dest) + elsize);
+ Src := Pointer(IPointer(Src) + elsize);
+ end;
+ end;
+{$IFNDEF PS_NOINTERFACES}
+ btInterface:
+ begin
+ for i := 0 to Len -1 do
+ begin
+ {$IFNDEF DELPHI3UP}
+ if IUnknown(Dest^) <> nil then
+ begin
+ IUnknown(Dest^).Release;
+ IUnknown(Dest^) := nil;
+ end;
+ {$ENDIF}
+ IUnknown(Dest^) := IUnknown(Src^);
+ {$IFNDEF DELPHI3UP}
+ if IUnknown(Dest^) <> nil then
+ IUnknown(Dest^).AddRef;
+ {$ENDIF}
+ Dest := Pointer(IPointer(Dest) + PointerSize);
+ Src := Pointer(IPointer(Src) + PointerSize);
+ end;
+ end;
+{$ENDIF}
+ btPointer:
+ begin
+ if (Pointer(Pointer(IPointer(Dest)+PointerSize2)^) = nil) and (Pointer(Pointer(IPointer(Src)+PointerSize2)^) = nil) then
+ begin
+ for i := 0 to Len -1 do
+ begin
+ Pointer(Dest^) := Pointer(Src^);
+ Dest := Pointer(IPointer(Dest) + PointerSize);
+ Src := Pointer(IPointer(Src) + PointerSize);
+ Pointer(Dest^) := Pointer(Src^);
+ Dest := Pointer(IPointer(Dest) + PointerSize);
+ Src := Pointer(IPointer(Src) + PointerSize);
+ LongBool(Dest^) := false;
+ Dest := Pointer(IPointer(Dest) + sizeof(LongBool));
+ Src := Pointer(IPointer(Src) + sizeof(LongBool));
+ end;
+ end else begin
+ for i := 0 to Len -1 do
+ begin
+ if Pointer(Pointer(IPointer(Dest)+PointerSize2)^) <> nil then
+ DestroyHeapVariant2(Pointer(Dest^), Pointer(Pointer(IPointer(Dest)+PointerSize)^));
+ if Pointer(Src^) <> nil then
+ begin
+ if not LongBool(Pointer(IPointer(Src) + PointerSize2)^) then
+ begin
+ Pointer(Dest^) := Pointer(Src^);
+ Pointer(Pointer(IPointer(Dest) + PointerSize)^) := Pointer(Pointer(IPointer(Src) + PointerSize)^);
+ Pointer(Pointer(IPointer(Dest) + PointerSize2)^) := Pointer(Pointer(IPointer(Src) + PointerSize2)^);
+ end else
+ begin
+ Pointer(Dest^) := CreateHeapVariant2(Pointer(Pointer(IPointer(Src) + PointerSize)^));
+ Pointer(Pointer(IPointer(Dest) + PointerSize)^) := Pointer(Pointer(IPointer(Src) + PointerSize)^);
+ LongBool(Pointer(IPointer(Dest) + PointerSize2)^) := true;
+ if not CopyArrayContents(Pointer(Dest^), Pointer(Src^), 1, Pointer(Pointer(IPointer(Dest) + PointerSize)^)) then
+ begin
+ Result := false;
+ exit;
+ end;
+ end;
+ end else
+ begin
+ Pointer(Dest^) := nil;
+ Pointer(Pointer(IPointer(Dest) + PointerSize)^) := nil;
+ Pointer(Pointer(IPointer(Dest) + PointerSize2)^) := nil;
+ end;
+ Dest := Pointer(IPointer(Dest) + PointerSize*2+sizeof(LongBool));
+ Src := Pointer(IPointer(Src) + PointerSize*2+sizeof(LongBool));
+ end;
+ end;
+ end;
+// btResourcePointer = 15;
+// btVariant = 16;
+ else
+ Result := False;
+ exit;
+ end;
+ except
+ Result := False;
+ exit;
+ end;
+ Result := true;
+end;
+
+function GetPSArrayLength(Arr: PIFVariant): Longint;
+begin
+ result := PSDynArrayGetLength(PPSVariantDynamicArray(arr).Data, arr.FType);
+end;
+
+procedure SetPSArrayLength(Arr: PIFVariant; NewLength: Longint);
+begin
+ PSDynArraySetLength(PPSVariantDynamicArray(arr).Data, arr.FType, NewLength);
+end;
+
+
+function PSDynArrayGetLength(arr: Pointer; aType: TPSTypeRec): Longint;
+begin
+ if aType.BaseType <> btArray then raise Exception.Create(RPS_InvalidArray);
+ if arr = nil then Result := 0 else Result := Longint(Pointer(IPointer(arr)-PointerSize)^) {$IFDEF FPC} +1 {$ENDIF};
+end;
+
+procedure PSDynArraySetLength(var arr: Pointer; aType: TPSTypeRec; NewLength: Longint);
+var
+ elSize, i, OldLen: Longint;
+ p: Pointer;
+begin
+ if aType.BaseType <> btArray then raise Exception.Create(RPS_InvalidArray);
+ OldLen := PSDynArrayGetLength(arr, aType);
+ elSize := TPSTypeRec_Array(aType).ArrayType.RealSize;
+ if (OldLen = 0) and (NewLength = 0) then exit; // already are both 0
+ if (OldLen <> 0) and (Longint(Pointer(IPointer(Arr)-PointerSize2)^) = 1) then // unique copy of this dynamic array
+ begin
+ for i := NewLength to OldLen -1 do
+ begin
+ if TPSTypeRec_Array(aType).ArrayType.BaseType in NeedFinalization then
+ FinalizeVariant(Pointer(IPointer(arr) + Cardinal(elsize * i)), TPSTypeRec_Array(aType).ArrayType);
+ end;
+ arr := Pointer(IPointer(Arr)-PointerSize2);
+ if NewLength <= 0 then
+ begin
+ FreeMem(arr, NewLength * elsize + PointerSize2);
+ arr := nil;
+ exit;
+ end;
+ ReallocMem(arr, NewLength * elSize + PointerSize2);
+ arr := Pointer(IPointer(Arr)+PointerSize);
+ Longint(Arr^) := NewLength {$IFDEF FPC} -1 {$ENDIF};
+ arr := Pointer(IPointer(Arr)+PointerSize);
+ for i := OldLen to NewLength -1 do
+ begin
+ InitializeVariant(Pointer(IPointer(arr) + Cardinal(elsize * i)), TPSTypeRec_Array(aType).ArrayType);
+ end;
+ end else
+ begin
+ if NewLength = 0 then
+ begin
+ if Longint(Pointer(IPointer(Arr)-PointerSize2)^) = 1 then
+ FreeMem(Pointer(IPointer(Arr)-PointerSize2), OldLen * elSize + PointerSize2)
+ else if Longint(Pointer(IPointer(Arr)-PointerSize2)^) > 0 then
+ Dec(Longint(Pointer(IPointer(Arr)-PointerSize2)^));
+ arr := nil;
+ exit;
+ end;
+ GetMem(p, NewLength * elSize + PointerSize2);
+ Longint(p^) := 1;
+ p:= Pointer(IPointer(p)+PointerSize);
+ Longint(p^) := NewLength {$IFDEF FPC} -1 {$ENDIF};
+ p := Pointer(IPointer(p)+PointerSize);
+ if OldLen <> 0 then
+ begin
+ if OldLen > NewLength then
+ CopyArrayContents(p, arr, NewLength, TPSTypeRec_Array(aType).ArrayType)
+ else
+ CopyArrayContents(p, arr, OldLen, TPSTypeRec_Array(aType).ArrayType);
+ FinalizeVariant(@arr, aType);
+ end;
+ arr := p;
+ for i := OldLen to NewLength -1 do
+ begin
+ InitializeVariant(Pointer(IPointer(arr) + Cardinal(elsize * i)), TPSTypeRec_Array(aType).ArrayType);
+ end;
+ end;
+end;
+
+
+
+{$IFDEF FPC}
+function OleErrorMessage(ErrorCode: HResult): tbtString;
+begin
+ Result := SysErrorMessage(ErrorCode);
+ if Result = '' then
+ Result := Format(RPS_OLEError, [ErrorCode]);
+end;
+
+procedure OleError(ErrorCode: HResult);
+begin
+ raise Exception.Create(OleErrorMessage(ErrorCode));
+end;
+
+procedure OleCheck(Result: HResult);
+begin
+ if Result < 0 then OleError(Result);
+end;
+{$ENDIF}
+
+
+{$IFNDEF DELPHI3UP}
+function OleErrorMessage(ErrorCode: HResult): tbtString;
+begin
+ Result := SysErrorMessage(ErrorCode);
+ if Result = '' then
+ Result := Format(RPS_OLEError, [ErrorCode]);
+end;
+
+procedure OleError(ErrorCode: HResult);
+begin
+ raise Exception.Create(OleErrorMessage(ErrorCode));
+end;
+
+procedure OleCheck(Result: HResult);
+begin
+ if Result < 0 then OleError(Result);
+end;
+
+procedure AssignInterface(var Dest: IUnknown; const Src: IUnknown);
+var
+ OldDest: IUnknown;
+begin
+ { Like Delphi 3+'s _IntfCopy, reference source before releasing old dest.
+ so that self assignment (I := I) works right }
+ OldDest := Dest;
+ Dest := Src;
+ if Src <> nil then
+ Src.AddRef;
+ if OldDest <> nil then
+ OldDest.Release;
+end;
+
+procedure AssignVariantFromIDispatch(var Dest: Variant; const Src: IDispatch);
+begin
+ VarClear(Dest);
+ TVarData(Dest).VDispatch := Src;
+ TVarData(Dest).VType := varDispatch;
+ if Src <> nil then
+ Src.AddRef;
+end;
+
+procedure AssignIDispatchFromVariant(var Dest: IDispatch; const Src: Variant);
+const
+ RPS_InvalidVariantRef = 'Invalid variant ref';
+var
+ NewDest: IDispatch;
+begin
+ case TVarData(Src).VType of
+ varEmpty: NewDest := nil;
+ varDispatch: NewDest := TVarData(Src).VDispatch;
+ varDispatch or varByRef: NewDest := Pointer(TVarData(Src).VPointer^);
+ else
+ raise Exception.Create(RPS_InvalidVariantRef);
+ end;
+ AssignInterface(IUnknown(Dest), NewDest);
+end;
+{$ENDIF}
+
+function TPSExec.SetVariantValue(dest, Src: Pointer; desttype, srctype: TPSTypeRec): Boolean;
+var
+ Tmp: TObject;
+ tt: TPSVariantPointer;
+begin
+ Result := True;
+ try
+ case desttype.BaseType of
+ btSet:
+ begin
+ if desttype = srctype then
+ Move(Src^, Dest^, TPSTypeRec_Set(desttype).aByteSize)
+ else
+ Result := False;
+ end;
+ btU8: tbtu8(Dest^) := PSGetUInt(Src, srctype);
+ btS8: tbts8(Dest^) := PSGetInt(Src, srctype);
+ btU16: tbtu16(Dest^) := PSGetUInt(Src, srctype);
+ btS16: tbts16(Dest^) := PSGetInt(Src, srctype);
+ btProcPtr:
+ begin
+ if srctype.BaseType = btPointer then
+ begin
+ srctype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (srctype = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case srctype.BaseType of
+ btu32:
+ begin
+ Pointer(Dest^) := Pointer(Src^);
+ end;
+ btProcPtr:
+ begin
+ Pointer(Dest^) := Pointer(Src^);
+ Pointer(Pointer(IPointer(Dest)+PointerSize)^) := Pointer(Pointer(IPointer(Src)+PointerSize)^);
+ Pointer(Pointer(IPointer(Dest)+PointerSize2)^) := Pointer(Pointer(IPointer(Src)+PointerSize2)^);
+ end;
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btU32:
+ begin
+ if srctype.BaseType = btPointer then
+ begin
+ srctype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (srctype = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case srctype.BaseType of
+ btU8: tbtu32(Dest^) := tbtu8(src^);
+ btS8: tbtu32(Dest^) := tbts8(src^);
+ btU16: tbtu32(Dest^) := tbtu16(src^);
+ btS16: tbtu32(Dest^) := tbts16(src^);
+ btU32: tbtu32(Dest^) := tbtu32(src^);
+ btS32: tbtu32(Dest^) := tbts32(src^);
+ {$IFNDEF PS_NOINT64} btS64: tbtu32(Dest^) := tbts64(src^);{$ENDIF}
+ btChar: tbtu32(Dest^) := Ord(tbtchar(Src^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbtu32(Dest^) := Ord(tbtwidechar(Src^));{$ENDIF}
+ btVariant: tbtu32(Dest^) := Variant(src^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btS32:
+ begin
+ if srctype.BaseType = btPointer then
+ begin
+ srctype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (srctype = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case srctype.BaseType of
+ btU8: tbts32(Dest^) := tbtu8(src^);
+ btS8: tbts32(Dest^) := tbts8(src^);
+ btU16: tbts32(Dest^) := tbtu16(src^);
+ btS16: tbts32(Dest^) := tbts16(src^);
+ btU32: tbts32(Dest^) := tbtu32(src^);
+ btS32: tbts32(Dest^) := tbts32(src^);
+ {$IFNDEF PS_NOINT64} btS64: tbts32(Dest^) := tbts64(src^);{$ENDIF}
+ btChar: tbts32(Dest^) := Ord(tbtchar(Src^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbts32(Dest^) := Ord(tbtwidechar(Src^));{$ENDIF}
+ btVariant: tbts32(Dest^) := Variant(src^);
+ // nx change start - allow assignment of class
+ btClass: tbtu32(Dest^) := tbtu32(src^);
+ // nx change start
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(Dest^) := PSGetInt64(Src, srctype);
+ {$ENDIF}
+ btSingle:
+ begin
+ if srctype.BaseType = btPointer then
+ begin
+ srctype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (srctype = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case srctype.BaseType of
+ btU8: tbtsingle(Dest^) := tbtu8(src^);
+ btS8: tbtsingle(Dest^) := tbts8(src^);
+ btU16: tbtsingle(Dest^) := tbtu16(src^);
+ btS16: tbtsingle(Dest^) := tbts16(src^);
+ btU32: tbtsingle(Dest^) := tbtu32(src^);
+ btS32: tbtsingle(Dest^) := tbts32(src^);
+ {$IFNDEF PS_NOINT64} btS64: tbtsingle(Dest^) := tbts64(src^);{$ENDIF}
+ btSingle: tbtsingle(Dest^) := tbtsingle(Src^);
+ btDouble: tbtsingle(Dest^) := tbtdouble(Src^);
+ btExtended: tbtsingle(Dest^) := tbtextended(Src^);
+ btCurrency: tbtsingle(Dest^) := tbtcurrency(Src^);
+ btVariant: tbtsingle(Dest^) := Variant(src^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btDouble:
+ begin
+ if srctype.BaseType = btPointer then
+ begin
+ srctype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (srctype = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case srctype.BaseType of
+ btU8: tbtdouble(Dest^) := tbtu8(src^);
+ btS8: tbtdouble(Dest^) := tbts8(src^);
+ btU16: tbtdouble(Dest^) := tbtu16(src^);
+ btS16: tbtdouble(Dest^) := tbts16(src^);
+ btU32: tbtdouble(Dest^) := tbtu32(src^);
+ btS32: tbtdouble(Dest^) := tbts32(src^);
+ {$IFNDEF PS_NOINT64} btS64: tbtdouble(Dest^) := tbts64(src^);{$ENDIF}
+ btSingle: tbtdouble(Dest^) := tbtsingle(Src^);
+ btDouble: tbtdouble(Dest^) := tbtdouble(Src^);
+ btExtended: tbtdouble(Dest^) := tbtextended(Src^);
+ btCurrency: tbtdouble(Dest^) := tbtcurrency(Src^);
+ btVariant: tbtdouble(Dest^) := Variant(src^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+
+ end;
+ btExtended:
+ begin
+ if srctype.BaseType = btPointer then
+ begin
+ srctype := PIFTypeRec(Pointer(IPointer(Src)+PointerSize)^);
+ Src := Pointer(Src^);
+ if (src = nil) or (srctype = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case srctype.BaseType of
+ btU8: tbtextended(Dest^) := tbtu8(src^);
+ btS8: tbtextended(Dest^) := tbts8(src^);
+ btU16: tbtextended(Dest^) := tbtu16(src^);
+ btS16: tbtextended(Dest^) := tbts16(src^);
+ btU32: tbtextended(Dest^) := tbtu32(src^);
+ btS32: tbtextended(Dest^) := tbts32(src^);
+ {$IFNDEF PS_NOINT64} btS64: tbtextended(Dest^) := tbts64(src^);{$ENDIF}
+ btSingle: tbtextended(Dest^) := tbtsingle(Src^);
+ btDouble: tbtextended(Dest^) := tbtdouble(Src^);
+ btExtended: tbtextended(Dest^) := tbtextended(Src^);
+ btCurrency: tbtextended(Dest^) := tbtcurrency(Src^);
+ btVariant: tbtextended(Dest^) := Variant(src^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btCurrency: tbtcurrency(Dest^) := PSGetCurrency(Src, srctype);
+ btPChar: pansichar(dest^) := pansichar(PSGetAnsiString(Src, srctype));
+ btString:
+ tbtstring(dest^) := PSGetAnsiString(Src, srctype);
+ btChar: tbtchar(dest^) := tbtchar(PSGetUInt(Src, srctype));
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString: tbtwidestring(dest^) := PSGetWideString(Src, srctype);
+ btUnicodeString: tbtUnicodeString(dest^) := PSGetUnicodeString(Src, srctype);
+ btWideChar: tbtwidechar(dest^) := widechar(PSGetUInt(Src, srctype));
+ {$ENDIF}
+ btStaticArray:
+ begin
+ if desttype <> srctype then
+ Result := False
+ else
+ CopyArrayContents(dest, Src, TPSTypeRec_StaticArray(desttype).Size, TPSTypeRec_StaticArray(desttype).ArrayType);
+ end;
+ btArray:
+ begin
+ if (srctype.BaseType = btStaticArray) and (TPSTypeRec_Array(desttype).ArrayType = TPSTypeRec_Array(srctype).ArrayType) then
+ begin
+ PSDynArraySetLength(Pointer(Dest^), desttype, TPSTypeRec_StaticArray(srctype).Size);
+ CopyArrayContents(Pointer(dest^), Src, TPSTypeRec_StaticArray(srctype).Size, TPSTypeRec_StaticArray(srctype).ArrayType);
+ end else if (srctype.BaseType = btvariant) and VarIsArray(Variant(src^)) then
+ Result := CreateArrayFromVariant(Self, dest, Variant(src^), desttype)
+ else if (desttype <> srctype) and not ((desttype.BaseType = btarray) and (srctype.BaseType = btArray)
+ and (TPSTypeRec_Array(desttype).ArrayType = TPSTypeRec_Array(srctype).ArrayType)) then
+ Result := False
+ else
+ CopyArrayContents(dest, src, 1, desttype);
+ end;
+ btRecord:
+ begin
+ if desttype <> srctype then
+ Result := False
+ else
+ CopyArrayContents(dest, Src, 1, desttype);
+ end;
+ btVariant:
+ begin
+{$IFNDEF PS_NOINTERFACES}
+ if srctype.ExportName = 'IDISPATCH' then
+ begin
+ {$IFDEF DELPHI3UP}
+ Variant(Dest^) := IDispatch(Src^);
+ {$ELSE}
+ AssignVariantFromIDispatch(Variant(Dest^), IDispatch(Src^));
+ {$ENDIF}
+ end else
+{$ENDIF}
+ if srctype.BaseType = btVariant then
+ variant(Dest^) := variant(src^)
+ else
+ begin
+ tt.VI.FType := FindType2(btPointer);
+ tt.DestType := srctype;
+ tt.DataDest := src;
+ tt.FreeIt := False;
+ Result := PIFVariantToVariant(@tt, variant(dest^));
+ end;
+ end;
+ btClass:
+ begin
+ if srctype.BaseType = btClass then
+ TObject(Dest^) := TObject(Src^)
+ else
+ // nx change start
+ if (srctype.BaseType in [btS32, btU32]) then
+ TbtU32(Dest^) := TbtU32(Src^)
+ else
+ // nx change end
+ Result := False;
+ end;
+{$IFNDEF PS_NOINTERFACES}
+ btInterface:
+ begin
+ if Srctype.BaseType = btVariant then
+ begin
+ if desttype.ExportName = 'IDISPATCH' then
+ begin
+ {$IFDEF Delphi3UP}
+ IDispatch(Dest^) := IDispatch(Variant(Src^));
+ {$ELSE}
+ AssignIDispatchFromVariant(IDispatch(Dest^), Variant(Src^));
+ {$ENDIF}
+ end else
+ Result := False;
+{$IFDEF Delphi3UP}
+ end else
+ if srctype.BaseType = btClass then
+ begin
+ if (TObject(Src^) = nil) or not TObject(Src^).GetInterface(TPSTypeRec_Interface(desttype).Guid, IUnknown(Dest^)) then
+ begin
+ Result := false;
+ Cmd_Err(erInterfaceNotSupported);
+ exit;
+ end;
+{$ENDIF}
+ end else if srctype.BaseType = btInterface then
+ begin
+ {$IFNDEF Delphi3UP}
+ if IUnknown(Dest^) <> nil then
+ begin
+ IUnknown(Dest^).Release;
+ IUnknown(Dest^) := nil;
+ end;
+ {$ENDIF}
+ IUnknown(Dest^) := IUnknown(Src^);
+ {$IFNDEF Delphi3UP}
+ if IUnknown(Dest^) <> nil then
+ IUnknown(Dest^).AddRef;
+ {$ENDIF}
+ end else
+ Result := False;
+ end;
+{$ENDIF}
+ else begin
+ Result := False;
+ end;
+ end;
+ if Result = False then
+ CMD_Err(ErTypeMismatch);
+ except
+ {$IFDEF DELPHI6UP}
+ Tmp := AcquireExceptionObject;
+ {$ELSE}
+ if RaiseList <> nil then
+ begin
+ Tmp := Exception(PRaiseFrame(RaiseList)^.ExceptObject);
+ PRaiseFrame(RaiseList)^.ExceptObject := nil;
+ end else
+ Tmp := nil;
+ {$ENDIF}
+ if Tmp <> nil then
+ begin
+ if Tmp is EPSException then
+ begin
+ Result := False;
+ ExceptionProc(EPSException(tmp).ProcNo, EPSException(tmp).ProcPos, erCustomError, tbtString(EPSException(tmp).Message), nil);
+ exit;
+ end else
+ if Tmp is EDivByZero then
+ begin
+ Result := False;
+ CMD_Err3(erDivideByZero, '', Tmp);
+ Exit;
+ end;
+ if Tmp is EZeroDivide then
+ begin
+ Result := False;
+ CMD_Err3(erDivideByZero, '', Tmp);
+ Exit;
+ end;
+ if Tmp is EMathError then
+ begin
+ Result := False;
+ CMD_Err3(erMathError, '', Tmp);
+ Exit;
+ end;
+ end;
+ if (tmp <> nil) and (Tmp is Exception) then
+ CMD_Err3(erException, tbtString(Exception(Tmp).Message), Tmp)
+ else
+ CMD_Err3(erException, '', Tmp);
+ Result := False;
+ end;
+end;
+
+function SpecImport(Sender: TPSExec; p: TPSExternalProcRec; Tag: Pointer): Boolean; forward;
+
+
+function Class_IS(Self: TPSExec; Obj: TObject; var2type: TPSTypeRec): Boolean;
+var
+ R: TPSRuntimeClassImporter;
+ cc: TPSRuntimeClass;
+begin
+ if Obj = nil then
+ begin
+ Result := false;
+ exit;
+ end;
+ r := Self.FindSpecialProcImport(SpecImport);
+ if R = nil then
+ begin
+ Result := false;
+ exit;
+ end;
+ cc := r.FindClass(var2type.ExportName);
+ if cc = nil then
+ begin
+ result := false;
+ exit;
+ end;
+ try
+ Result := Obj is cc.FClass;
+ except
+ Result := false;
+ end;
+end;
+
+type
+ TVariantArray = array of Variant;
+ PVariantArray = ^TVariantArray;
+function VariantInArray(var1: Pointer; var1Type: TPSTypeRec; var2: PVariantArray): Boolean;
+var
+ lDest: Variant;
+ i: Integer;
+begin
+ IntPIFVariantToVariant(var1, var1Type, lDest);
+ result := false;
+ for i := 0 to Length(var2^) -1 do begin
+ if var2^[i] = lDest then begin
+ result := true;
+ break;
+ end;
+ end;
+end;
+
+
+function TPSExec.DoBooleanCalc(var1, Var2, into: Pointer; var1Type, var2type, intotype: TPSTypeRec; Cmd: Cardinal): Boolean;
+var
+ b: Boolean;
+ Tmp: TObject;
+ tvar: Variant;
+
+
+ procedure SetBoolean(b: Boolean; var Ok: Boolean);
+ begin
+ Ok := True;
+ case IntoType.BaseType of
+ btU8: tbtu8(Into^):= Cardinal(b);
+ btS8: tbts8(Into^) := Longint(b);
+ btU16: tbtu16(Into^) := Cardinal(b);
+ btS16: tbts16(Into^) := Longint(b);
+ btU32: tbtu32(Into^) := Cardinal(b);
+ btS32: tbts32(Into^) := Longint(b);
+ btVariant: Variant(Into^) := b;
+ else begin
+ CMD_Err(ErTypeMismatch);
+ Ok := False;
+ end;
+ end;
+ end;
+begin
+ Result := true;
+ try
+ case Cmd of
+ 0: begin { >= }
+ case var1Type.BaseType of
+ btU8:
+ if (var2Type.BaseType = btString) or (Var2Type.BaseType = btPChar) then
+ b := tbtchar(tbtu8(var1^)) >= PSGetAnsiString(Var2, var2type)
+ else
+ b := tbtu8(var1^) >= PSGetUInt(Var2, var2type);
+ btS8: b := tbts8(var1^) >= PSGetInt(Var2, var2type);
+ btU16: b := tbtu16(var1^) >= PSGetUInt(Var2, var2type);
+ btS16: b := tbts16(var1^) >= PSGetInt(Var2, var2type);
+ btU32: b := tbtu32(var1^) >= PSGetUInt(Var2, var2type);
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: b := tbts32(var1^) >= tbtu8(Var2^);
+ btS8: b := tbts32(var1^) >= tbts8(Var2^);
+ btU16: b := tbts32(var1^) >= tbtu16(Var2^);
+ btS16: b := tbts32(var1^) >= tbts16(Var2^);
+ btU32: b := tbts32(var1^) >= Longint(tbtu32(Var2^));
+ btS32: b := tbts32(var1^) >= tbts32(Var2^);
+ btDouble: b := PSGetReal(Var1, var1type) >= tbtdouble(var2^);
+ btSingle: B := psGetReal(Var1, var1Type) >= tbtsingle(var2^);
+ btExtended: B := psGetReal(Var1, var1Type) >= tbtExtended(var2^);
+ {$IFNDEF PS_NOINT64} btS64: b := tbts32(var1^) >= tbts64(Var2^);{$ENDIF}
+ btChar: b := tbts32(var1^) >= Ord(tbtchar(Var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: b := tbts32(var1^) >= Ord(tbtwidechar(Var2^));{$ENDIF}
+ btVariant: b := tbts32(var1^) >= Variant(Var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btSingle: b := tbtsingle(var1^) >= PSGetReal(Var2, var2type);
+ btDouble: b := tbtdouble(var1^) >= PSGetReal(Var2, var2type);
+ btCurrency: b := tbtcurrency(var1^) >= PSGetCurrency(Var2, var2type);
+ btExtended: b := tbtextended(var1^) >= PSGetReal(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: b := tbts64(var1^) >= PSGetInt64(Var2, var2type);
+ {$ENDIF}
+ btPChar,btString: b := tbtstring(var1^) >= PSGetAnsiString(Var2, var2type);
+ btChar: b := tbtchar(var1^) >= PSGetAnsiString(Var2, var2type);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: b := tbtwidechar(var1^) >= PSGetWideString(Var2, var2type);
+ btWideString: b := tbtwidestring(var1^) >= PSGetWideString(Var2, var2type);
+ btUnicodeString: b := tbtUnicodestring(var1^) >= PSGetUnicodeString(Var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ b := Variant(var1^) >= tvar;
+ end;
+ btSet:
+ begin
+ if var1Type = var2Type then
+ begin
+ Set_Subset(var2, var1, TPSTypeRec_Set(var1Type).aByteSize, b);
+ end else result := False;
+ end;
+ else begin
+ CMD_Err(ErTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(ErTypeMismatch);
+ exit;
+ end;
+ SetBoolean(b, Result);
+ end;
+ 1: begin { <= }
+ case var1Type.BaseType of
+ btU8:
+ if (var2Type.BaseType = btString) or (Var2Type.BaseType = btPChar) then
+ b := tbtchar(tbtu8(var1^)) <= PSGetAnsiString(Var2, var2type)
+ else
+ b := tbtu8(var1^) <= PSGetUInt(Var2, var2type);
+ btS8: b := tbts8(var1^) <= PSGetInt(Var2, var2type);
+ btU16: b := tbtu16(var1^) <= PSGetUInt(Var2, var2type);
+ btS16: b := tbts16(var1^) <= PSGetInt(Var2, var2type);
+ btU32: b := tbtu32(var1^) <= PSGetUInt(Var2, var2type);
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: b := tbts32(var1^) <= tbtu8(Var2^);
+ btS8: b := tbts32(var1^) <= tbts8(Var2^);
+ btU16: b := tbts32(var1^) <= tbtu16(Var2^);
+ btS16: b := tbts32(var1^) <= tbts16(Var2^);
+ btU32: b := tbts32(var1^) <= Longint(tbtu32(Var2^));
+ btS32: b := tbts32(var1^) <= tbts32(Var2^);
+ btDouble: b := PSGetReal(Var1, var1type) <= tbtdouble(var2^);
+ btSingle: B := psGetReal(Var1, var1Type) <= tbtsingle(var2^);
+ btExtended: B := psGetReal(Var1, var1Type) <= tbtExtended(var2^);
+ {$IFNDEF PS_NOINT64} btS64: b := tbts32(var1^) <= tbts64(Var2^);{$ENDIF}
+ btChar: b := tbts32(var1^) <= Ord(tbtchar(Var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: b := tbts32(var1^) <= Ord(tbtwidechar(Var2^));{$ENDIF}
+ btVariant: b := tbts32(var1^) <= Variant(Var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end; btSingle: b := tbtsingle(var1^) <= PSGetReal(Var2, var2type);
+ btCurrency: b := tbtcurrency(var1^) <= PSGetCurrency(Var2, var2type);
+ btDouble: b := tbtdouble(var1^) <= PSGetReal(Var2, var2type);
+ btExtended: b := tbtextended(var1^) <= PSGetReal(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: b := tbts64(var1^) <= PSGetInt64(Var2, var2type);
+ {$ENDIF}
+ btPChar,btString: b := tbtstring(var1^) <= PSGetAnsiString(Var2, var2type);
+ btChar: b := tbtchar(var1^) <= PSGetAnsiString(Var2, var2type);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: b := tbtwidechar(var1^) <= PSGetWideString(Var2, var2type);
+ btWideString: b := tbtwidestring(var1^) <= PSGetWideString(Var2, var2type);
+ btUnicodeString: b := tbtUnicodestring(var1^) <= PSGetUnicodeString(Var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ b := Variant(var1^) <= tvar;
+ end;
+ btSet:
+ begin
+ if var1Type = var2Type then
+ begin
+ Set_Subset(var1, var2, TPSTypeRec_Set(var1Type).aByteSize, b);
+ end else result := False;
+ end;
+ else begin
+ CMD_Err(ErTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ SetBoolean(b, Result);
+ end;
+ 2: begin { > }
+ case var1Type.BaseType of
+ btU8:
+ if (var2Type.BaseType = btString) or (Var2Type.BaseType = btPChar) then
+ b := tbtchar(tbtu8(var1^)) > PSGetAnsiString(Var2, var2type)
+ else
+ b := tbtu8(var1^) > PSGetUInt(Var2, var2type);
+ btS8: b := tbts8(var1^) > PSGetInt(Var2, var2type);
+ btU16: b := tbtu16(var1^) > PSGetUInt(Var2, var2type);
+ btS16: b := tbts16(var1^) > PSGetInt(Var2, var2type);
+ btU32: b := tbtu32(var1^) > PSGetUInt(Var2, var2type);
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: b := tbts32(var1^) > tbtu8(Var2^);
+ btS8: b := tbts32(var1^) > tbts8(Var2^);
+ btU16: b := tbts32(var1^) > tbtu16(Var2^);
+ btS16: b := tbts32(var1^) > tbts16(Var2^);
+ btU32: b := tbts32(var1^) > Longint(tbtu32(Var2^));
+ btS32: b := tbts32(var1^) > tbts32(Var2^);
+ btDouble: b := PSGetReal(Var1, var1type) > tbtdouble(var2^);
+ btSingle: B := psGetReal(Var1, var1Type) > tbtsingle(var2^);
+ btExtended: B := psGetReal(Var1, var1Type) > tbtExtended(var2^);
+ {$IFNDEF PS_NOINT64} btS64: b := tbts32(var1^) > tbts64(Var2^);{$ENDIF}
+ btChar: b := tbts32(var1^) > Ord(tbtchar(Var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: b := tbts32(var1^) = Ord(tbtwidechar(Var2^));{$ENDIF}
+ btVariant: b := tbts32(var1^) > Variant(Var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end; btSingle: b := tbtsingle(var1^) > PSGetReal(Var2, var2type);
+ btDouble: b := tbtdouble(var1^) > PSGetReal(Var2, var2type);
+ btExtended: b := tbtextended(var1^) > PSGetReal(Var2, var2type);
+ btCurrency: b := tbtcurrency(var1^) > PSGetCurrency(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: b := tbts64(var1^) > PSGetInt64(Var2, var2type);
+ {$ENDIF}
+ btPChar,btString: b := tbtstring(var1^) > PSGetAnsiString(Var2, var2type);
+ btChar: b := tbtchar(var1^) > PSGetAnsiString(Var2, var2type);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: b := tbtwidechar(var1^) > PSGetWideString(Var2, var2type);
+ btWideString: b := tbtwidestring(var1^) > PSGetWideString(Var2, var2type);
+ btUnicodeString: b := tbtUnicodestring(var1^) > PSGetUnicodeString(Var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ b := Variant(var1^) > tvar;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ SetBoolean(b, Result);
+ end;
+ 3: begin { < }
+ case var1Type.BaseType of
+ btU8:
+ if (var2Type.BaseType = btString) or (Var2Type.BaseType = btPChar) then
+ b := tbtchar(tbtu8(var1^)) < PSGetAnsiString(Var2, var2type)
+ else
+ b := tbtu8(var1^) < PSGetUInt(Var2, var2type);
+ btS8: b := tbts8(var1^) < PSGetInt(Var2, var2type);
+ btU16: b := tbtu16(var1^) < PSGetUInt(Var2, var2type);
+ btS16: b := tbts16(var1^) < PSGetInt(Var2, var2type);
+ btU32: b := tbtu32(var1^) < PSGetUInt(Var2, var2type);
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: b := tbts32(var1^) < tbtu8(Var2^);
+ btS8: b := tbts32(var1^) < tbts8(Var2^);
+ btU16: b := tbts32(var1^) < tbtu16(Var2^);
+ btS16: b := tbts32(var1^) < tbts16(Var2^);
+ btU32: b := tbts32(var1^) < Longint(tbtu32(Var2^));
+ btS32: b := tbts32(var1^) < tbts32(Var2^);
+ btDouble: b := PSGetReal(Var1, var1type) < tbtdouble(var2^);
+ btSingle: B := psGetReal(Var1, var1Type) < tbtsingle(var2^);
+ btExtended: B := psGetReal(Var1, var1Type) < tbtExtended(var2^);
+ {$IFNDEF PS_NOINT64} btS64: b := tbts32(var1^) < tbts64(Var2^);{$ENDIF}
+ btChar: b := tbts32(var1^) < Ord(tbtchar(Var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: b := tbts32(var1^) < Ord(tbtwidechar(Var2^));{$ENDIF}
+ btVariant: b := tbts32(var1^) < Variant(Var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end; btSingle: b := tbtsingle(var1^) < PSGetReal(Var2, var2type);
+ btDouble: b := tbtdouble(var1^) < PSGetReal(Var2, var2type);
+ btCurrency: b := tbtcurrency(var1^) < PSGetCurrency(Var2, var2type);
+ btExtended: b := tbtextended(var1^) < PSGetReal(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: b := tbts64(var1^) < PSGetInt64(Var2, var2type);
+ {$ENDIF}
+ btPChar,btString: b := tbtstring(var1^) < PSGetAnsiString(Var2, var2type);
+ btChar: b := tbtchar(var1^) < PSGetAnsiString(Var2, var2type);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: b := tbtwidechar(var1^) < PSGetWideString(Var2, var2type);
+ btWideString: b := tbtwidestring(var1^) < PSGetWideString(Var2, var2type);
+ btUnicodeString: b := tbtUnicodestring(var1^) < PSGetUnicodeString(Var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ b := Variant(var1^) < tvar;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ SetBoolean(b, Result);
+ end;
+ 4: begin { <> }
+ case var1Type.BaseType of
+ btInterface:
+ begin
+ if var2Type.BaseType = btInterface then
+ b := Pointer(var1^) <> Pointer(var2^) // no need to cast it to IUnknown
+ else
+ Result := false;
+ end;
+ btClass:
+ begin
+ if var2Type.BaseType = btclass then
+ b := TObject(var1^) <> TObject(var2^)
+ else
+ Result := false;
+ end;
+ btU8:
+ if (var2Type.BaseType = btString) or (Var2Type.BaseType = btPChar) then
+ b := tbtchar(tbtu8(var1^)) <> PSGetAnsiString(Var2, var2type)
+ else
+ b := tbtu8(var1^) <> PSGetUInt(Var2, var2type);
+ btS8: b := tbts8(var1^) <> PSGetInt(Var2, var2type);
+ btU16: b := tbtu16(var1^) <> PSGetUInt(Var2, var2type);
+ btS16: b := tbts16(var1^) <> PSGetInt(Var2, var2type);
+ btProcPtr:
+ begin
+ if Pointer(Var1^) = Pointer(Var2^) then
+ begin
+ if Longint(Var1^) = 0 then
+ b := ((Pointer(Pointer(IPointer(Var1)+PointerSize2)^) <> Pointer(Pointer(IPointer(Var2)+PointerSize2)^)) or
+ (Pointer(Pointer(IPointer(Var1)+PointerSize2)^) <> Pointer(Pointer(IPointer(Var2)+PointerSize2)^)))
+ else
+ b := False;
+ end else b := True;
+ end;
+ btU32: b := tbtu32(var1^) <> PSGetUInt(Var2, var2type);
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: b := tbts32(var1^) <> tbtu8(Var2^);
+ btS8: b := tbts32(var1^) <> tbts8(Var2^);
+ btU16: b := tbts32(var1^) <> tbtu16(Var2^);
+ btS16: b := tbts32(var1^) <> tbts16(Var2^);
+ btProcPtr, btU32: b := tbts32(var1^)<> Longint(tbtu32(Var2^));
+ btS32: b := tbts32(var1^) <> tbts32(Var2^);
+ btDouble: b := PSGetReal(Var1, var1type) <> tbtdouble(var2^);
+ btSingle: B := psGetReal(Var1, var1Type) <> tbtsingle(var2^);
+ btExtended: B := psGetReal(Var1, var1Type) <> tbtExtended(var2^);
+ {$IFNDEF PS_NOINT64} btS64: b := tbts32(var1^) <> tbts64(Var2^);{$ENDIF}
+ btChar: b := tbts32(var1^) <> Ord(tbtchar(Var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: b := tbts32(var1^) <> Ord(tbtwidechar(Var2^));{$ENDIF}
+ btVariant: b := tbts32(var1^) <> Variant(Var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end; btSingle: b := tbtsingle(var1^) <> PSGetReal(Var2, var2type);
+ btDouble: b := tbtdouble(var1^) <> PSGetReal(Var2, var2type);
+ btExtended: b := tbtextended(var1^) <> PSGetReal(Var2, var2type);
+ btCurrency: b := tbtcurrency(var1^) <> PSGetCurrency(Var2, var2type);
+ btPChar,btString: b := tbtstring(var1^) <> PSGetAnsiString(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: b := tbts64(var1^) <> PSGetInt64(Var2, var2type);
+ {$ENDIF}
+ btChar: b := tbtchar(var1^) <> PSGetAnsiString(Var2, var2type);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: b := tbtwidechar(var1^) <> PSGetWideString(Var2, var2type);
+ btWideString: b := tbtwidestring(var1^) <> PSGetWideString(Var2, var2type);
+ btUnicodeString: b := tbtUnicodeString(var1^) <> PSGetUnicodeString(Var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ b := Variant(var1^) <> tvar;
+ end;
+ btSet:
+ begin
+ if var1Type = var2Type then
+ begin
+ Set_Equal(var1, var2, TPSTypeRec_Set(var1Type).aByteSize, b);
+ b := not b;
+ end else result := False;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ SetBoolean(b, Result);
+ end;
+ 5: begin { = }
+ case var1Type.BaseType of
+ btInterface:
+ begin
+ if var2Type.BaseType = btInterface then
+ b := Pointer(var1^) = Pointer(var2^) // no need to cast it to IUnknown
+ else
+ Result := false;
+ end;
+ btClass:
+ begin
+ if var2Type.BaseType = btclass then
+ b := TObject(var1^) = TObject(var2^)
+ else
+ Result := false;
+ end;
+ btU8:
+ if (var2Type.BaseType = btString) or (Var2Type.BaseType = btPChar) then
+ b := tbtchar(tbtu8(var1^)) = PSGetAnsiString(Var2, var2type)
+ else
+ b := tbtu8(var1^) = PSGetUInt(Var2, var2type);
+ btS8: b := tbts8(var1^) = PSGetInt(Var2, var2type);
+ btU16: b := tbtu16(var1^) = PSGetUInt(Var2, var2type);
+ btS16: b := tbts16(var1^) = PSGetInt(Var2, var2type);
+ btU32: b := tbtu32(var1^) = PSGetUInt(Var2, var2type);
+ btProcPtr:
+ begin
+ if Pointer(Var1^) = Pointer(Var2^) then
+ begin
+ if Longint(Var1^) = 0 then
+ b := ((Pointer(Pointer(IPointer(Var1)+PointerSize2)^) = Pointer(Pointer(IPointer(Var2)+PointerSize2)^)) and
+ (Pointer(Pointer(IPointer(Var1)+PointerSize2)^) = Pointer(Pointer(IPointer(Var2)+PointerSize2)^)))
+ else
+ b := True;
+ end else b := False;
+ end;
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: b := tbts32(var1^) = tbtu8(Var2^);
+ btS8: b := tbts32(var1^) = tbts8(Var2^);
+ btU16: b := tbts32(var1^) = tbtu16(Var2^);
+ btS16: b := tbts32(var1^) = tbts16(Var2^);
+ btProcPtr, btU32: b := tbts32(var1^) = Longint(tbtu32(Var2^));
+ btS32: b := tbts32(var1^) = tbts32(Var2^);
+ btDouble: b := PSGetReal(Var1, var1type) = tbtdouble(var2^);
+ btSingle: B := psGetReal(Var1, var1Type) = tbtsingle(var2^);
+ btExtended: B := psGetReal(Var1, var1Type) = tbtExtended(var2^);
+ {$IFNDEF PS_NOINT64} btS64: b := tbts32(var1^) = tbts64(Var2^);{$ENDIF}
+ btChar: b := tbts32(var1^) = Ord(tbtchar(Var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: b := tbts32(var1^) = Ord(tbtwidechar(Var2^));{$ENDIF}
+ btVariant: b := tbts32(var1^) = Variant(Var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end; btSingle: b := tbtsingle(var1^) = PSGetReal(Var2, var2type);
+ btDouble: b := tbtdouble(var1^) = PSGetReal(Var2, var2type);
+ btExtended: b := tbtextended(var1^) = PSGetReal(Var2, var2type);
+ btCurrency: b := tbtcurrency(var1^) = PSGetCurrency(Var2, var2type);
+ btPchar, btString: b := tbtstring(var1^) = PSGetAnsiString(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: b := tbts64(var1^) = PSGetInt64(Var2, var2type);
+ {$ENDIF}
+ btChar: b := tbtchar(var1^) = PSGetAnsiString(Var2, var2type);
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: b := tbtwidechar(var1^) = PSGetWideString(Var2, var2type);
+ btWideString: b := tbtwidestring(var1^) = PSGetWideString(Var2, var2type);
+ btUnicodeString: b := tbtUnicodestring(var1^) = PSGetUnicodeString(Var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ b := Variant(var1^) = tvar;
+ end;
+ btSet:
+ begin
+ if var1Type = var2Type then
+ begin
+ Set_Equal(var1, var2, TPSTypeRec_Set(var1Type).aByteSize, b);
+ end else result := False;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ SetBoolean(b, Result);
+ end;
+ 6: begin { in }
+ if (var2Type.BaseType = btArray) and (TPSTypeRec_Array(var2type).ArrayType.BaseType = btVariant) then
+ begin
+ b := VariantInArray(var1, var1Type, var2);
+ SetBoolean(b, Result);
+ end else
+ if var2Type.BaseType = btSet then
+ begin
+ Cmd := PSGetUInt(var1, var1type);
+ if not Result then
+ begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ if Cmd >= Cardinal(TPSTypeRec_Set(var2Type).aBitSize) then
+ begin
+ cmd_Err(erOutofRecordRange);
+ Result := False;
+ Exit;
+ end;
+ Set_membership(Cmd, var2, b);
+ SetBoolean(b, Result);
+ end else
+ begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 7:
+ begin // is
+ case var1Type.BaseType of
+ btClass:
+ begin
+ if var2type.BaseType <> btU32 then
+ Result := False
+ else
+ begin
+ var2type := FTypes[tbtu32(var2^)];
+ if (var2type = nil) or (var2type.BaseType <> btClass) then
+ Result := false
+ else
+ begin
+ Setboolean(Class_IS(Self, TObject(var1^), var2type), Result);
+ end;
+ end;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ else begin
+ Result := False;
+ CMD_Err(erInvalidOpcodeParameter);
+ exit;
+ end;
+ end;
+ except
+ {$IFDEF DELPHI6UP}
+ Tmp := AcquireExceptionObject;
+ {$ELSE}
+ if RaiseList <> nil then
+ begin
+ Tmp := Exception(PRaiseFrame(RaiseList)^.ExceptObject);
+ PRaiseFrame(RaiseList)^.ExceptObject := nil;
+ end else
+ Tmp := nil;
+ {$ENDIF}
+ if Tmp <> nil then
+ begin
+ if Tmp is EPSException then
+ begin
+ Result := False;
+ ExceptionProc(EPSException(tmp).ProcNo, EPSException(tmp).ProcPos, erCustomError, tbtString(EPSException(tmp).Message), nil);
+ exit;
+ end else
+ if Tmp is EDivByZero then
+ begin
+ Result := False;
+ CMD_Err3(erDivideByZero, '', Tmp);
+ Exit;
+ end;
+ if Tmp is EZeroDivide then
+ begin
+ Result := False;
+ CMD_Err3(erDivideByZero, '', Tmp);
+ Exit;
+ end;
+ if Tmp is EMathError then
+ begin
+ Result := False;
+ CMD_Err3(erMathError, '', Tmp);
+ Exit;
+ end;
+ end;
+ if (tmp <> nil) and (Tmp is Exception) then
+ CMD_Err3(erException, tbtString(Exception(Tmp).Message), Tmp)
+ else
+ CMD_Err3(erException, '', Tmp);
+ Result := False;
+ end;
+end;
+
+function VarIsFloat(const V: Variant): Boolean;
+begin
+ Result := VarType(V) in [varSingle, varDouble, varCurrency];
+end;
+
+function TPSExec.DoCalc(var1, Var2: Pointer; var1Type, var2type: TPSTypeRec; CalcType: Cardinal): Boolean;
+ { var1=dest, var2=src }
+var
+ Tmp: TObject;
+ tvar: Variant;
+begin
+ try
+ Result := True;
+ case CalcType of
+ 0: begin { + }
+ case var1Type.BaseType of
+ btU8: tbtU8(var1^) := tbtU8(var1^) + PSGetUInt(Var2, var2type);
+ btS8: tbts8(var1^) := tbts8(var1^) + PSGetInt(Var2, var2type);
+ btU16: tbtU16(var1^) := tbtU16(var1^) + PSGetUInt(Var2, var2type);
+ btS16: tbts16(var1^) := tbts16(var1^) + PSGetInt(Var2, var2type);
+ btU32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtU32(var1^) := tbtU32(var1^) + tbtu8(var2^);
+ btS8: tbtU32(var1^) := tbtU32(var1^) + cardinal(longint(tbts8(var2^)));
+ btU16: tbtU32(var1^) := tbtU32(var1^) + tbtu16(var2^);
+ btS16: tbtU32(var1^) := tbtU32(var1^) + cardinal(longint(tbts16(var2^)));
+ btU32: tbtU32(var1^) := tbtU32(var1^) + tbtu32(var2^);
+ btS32: tbtU32(var1^) := tbtU32(var1^) + cardinal(tbts32(var2^));
+ {$IFNDEF PS_NOINT64} btS64: tbtU32(var1^) := tbtU32(var1^) + tbts64(var2^);{$ENDIF}
+ btChar: tbtU32(var1^) := tbtU32(var1^) + Ord(tbtchar(var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbtU32(var1^) := tbtU32(var1^) + Ord(tbtwidechar(var2^));{$ENDIF}
+ btVariant: tbtU32(var1^) := tbtU32(var1^) + Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbts32(var1^) := tbts32(var1^) + tbtu8(var2^);
+ btS8: tbts32(var1^) := tbts32(var1^) + tbts8(var2^);
+ btU16: tbts32(var1^) := tbts32(var1^) + tbtu16(var2^);
+ btS16: tbts32(var1^) := tbts32(var1^) + tbts16(var2^);
+ btU32: tbts32(var1^) := tbts32(var1^) + Longint(tbtu32(var2^));
+ btS32: tbts32(var1^) := tbts32(var1^) + tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbts32(var1^) := tbts32(var1^) + tbts64(var2^);{$ENDIF}
+ btChar: tbts32(var1^) := tbts32(var1^) + Ord(tbtchar(var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbts32(var1^) := tbts32(var1^) + Ord(tbtwidechar(var2^));{$ENDIF}
+ btVariant: tbts32(var1^) := tbts32(var1^) + Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(var1^) := tbts64(var1^) + PSGetInt64(var2, var2type);
+ {$ENDIF}
+ btSingle:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtsingle(var1^) := tbtsingle(var1^) + tbtu8(var2^);
+ btS8: tbtsingle(var1^) := tbtsingle(var1^) + tbts8(var2^);
+ btU16: tbtsingle(var1^) := tbtsingle(var1^) + tbtu16(var2^);
+ btS16: tbtsingle(var1^) := tbtsingle(var1^) + tbts16(var2^);
+ btU32: tbtsingle(var1^) := tbtsingle(var1^) + tbtu32(var2^);
+ btS32: tbtsingle(var1^) := tbtsingle(var1^) + tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtsingle(var1^) := tbtsingle(var1^) + tbts64(var2^);{$ENDIF}
+ btSingle: tbtsingle(var1^) := tbtsingle(var1^) + tbtsingle(var2^);
+ btDouble: tbtsingle(var1^) := tbtsingle(var1^) + tbtdouble(var2^);
+ btExtended: tbtsingle(var1^) := tbtsingle(var1^) + tbtextended(var2^);
+ btCurrency: tbtsingle(var1^) := tbtsingle(var1^) + tbtcurrency(var2^);
+ btVariant: tbtsingle(var1^) := tbtsingle(var1^) + Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btDouble:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtdouble(var1^) := tbtdouble(var1^) + tbtu8(var2^);
+ btS8: tbtdouble(var1^) := tbtdouble(var1^) + tbts8(var2^);
+ btU16: tbtdouble(var1^) := tbtdouble(var1^) + tbtu16(var2^);
+ btS16: tbtdouble(var1^) := tbtdouble(var1^) + tbts16(var2^);
+ btU32: tbtdouble(var1^) := tbtdouble(var1^) + tbtu32(var2^);
+ btS32: tbtdouble(var1^) := tbtdouble(var1^) + tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtdouble(var1^) := tbtdouble(var1^) + tbts64(var2^);{$ENDIF}
+ btSingle: tbtdouble(var1^) := tbtdouble(var1^) + tbtsingle(var2^);
+ btDouble: tbtdouble(var1^) := tbtdouble(var1^) + tbtdouble(var2^);
+ btExtended: tbtdouble(var1^) := tbtdouble(var1^) + tbtextended(var2^);
+ btCurrency: tbtdouble(var1^) := tbtdouble(var1^) + tbtcurrency(var2^);
+ btVariant: tbtdouble(var1^) := tbtdouble(var1^) + Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btCurrency:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtcurrency(var1^) := tbtcurrency(var1^) + tbtu8(var2^);
+ btS8: tbtcurrency(var1^) := tbtcurrency(var1^) + tbts8(var2^);
+ btU16: tbtcurrency(var1^) := tbtcurrency(var1^) + tbtu16(var2^);
+ btS16: tbtcurrency(var1^) := tbtcurrency(var1^) + tbts16(var2^);
+ btU32: tbtcurrency(var1^) := tbtdouble(var1^) + tbtu32(var2^);
+ btS32: tbtcurrency(var1^) := tbtcurrency(var1^) + tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtcurrency(var1^) := tbtdouble(var1^) + tbts64(var2^);{$ENDIF}
+ btSingle: tbtcurrency(var1^) := tbtcurrency(var1^) + tbtsingle(var2^);
+ btDouble: tbtcurrency(var1^) := tbtcurrency(var1^) + tbtdouble(var2^);
+ btExtended: tbtcurrency(var1^) := tbtcurrency(var1^) + tbtextended(var2^);
+ btCurrency: tbtcurrency(var1^) := tbtcurrency(var1^) + tbtcurrency(var2^);
+ btVariant: tbtcurrency(var1^) := tbtcurrency(var1^) + Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btExtended:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtextended(var1^) := tbtextended(var1^) + tbtu8(var2^);
+ btS8: tbtextended(var1^) := tbtextended(var1^) + tbts8(var2^);
+ btU16: tbtextended(var1^) := tbtextended(var1^) + tbtu16(var2^);
+ btS16: tbtextended(var1^) := tbtextended(var1^) + tbts16(var2^);
+ btU32: tbtextended(var1^) := tbtextended(var1^) + tbtu32(var2^);
+ btS32: tbtextended(var1^) := tbtextended(var1^) + tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtextended(var1^) := tbtextended(var1^) + tbts64(var2^);{$ENDIF}
+ btSingle: tbtextended(var1^) := tbtextended(var1^) + tbtsingle(var2^);
+ btDouble: tbtextended(var1^) := tbtextended(var1^) + tbtdouble(var2^);
+ btExtended: tbtextended(var1^) := tbtextended(var1^) + tbtextended(var2^);
+ btCurrency: tbtextended(var1^) := tbtextended(var1^) + tbtcurrency(var2^);
+ btVariant: tbtextended(var1^) := tbtextended(var1^) + Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btPchar, btString: tbtstring(var1^) := tbtstring(var1^) + PSGetAnsiString(Var2, var2type);
+ btChar: tbtchar(var1^) := tbtchar(ord(tbtchar(var1^)) + PSGetUInt(Var2, var2type));
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: tbtwidechar(var1^) := widechar(ord(tbtwidechar(var1^)) + PSGetUInt(Var2, var2type));
+ btWideString: tbtwidestring(var1^) := tbtwidestring(var1^) + PSGetWideString(Var2, var2type);
+ btUnicodeString: tbtUnicodestring(var1^) := tbtUnicodestring(var1^) + PSGetUnicodeString(Var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ tvar := null;
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ Variant(var1^) := Variant(var1^) + tvar;
+ end;
+ btSet:
+ begin
+ if var1Type = var2Type then
+ begin
+ Set_Union(var1, var2, TPSTypeRec_Set(var1Type).aByteSize);
+ end else result := False;
+ end;
+
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 1: begin { - }
+ case var1Type.BaseType of
+ btU8: tbtU8(var1^) := tbtU8(var1^) - PSGetUInt(Var2, var2type);
+ btS8: tbts8(var1^) := tbts8(var1^) - PSGetInt(Var2, var2type);
+ btU16: tbtU16(var1^) := tbtU16(var1^) - PSGetUInt(Var2, var2type);
+ btS16: tbts16(var1^) := tbts16(var1^) - PSGetInt(Var2, var2type);
+ btU32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtU32(var1^) := tbtU32(var1^) - tbtu8(var2^);
+ btS8: tbtU32(var1^) := tbtU32(var1^) - cardinal(longint(tbts8(var2^)));
+ btU16: tbtU32(var1^) := tbtU32(var1^) - tbtu16(var2^);
+ btS16: tbtU32(var1^) := tbtU32(var1^) - cardinal(longint(tbts16(var2^)));
+ btU32: tbtU32(var1^) := tbtU32(var1^) - tbtu32(var2^);
+ btS32: tbtU32(var1^) := tbtU32(var1^) - cardinal(tbts32(var2^));
+ {$IFNDEF PS_NOINT64} btS64: tbtU32(var1^) := tbtU32(var1^) - tbts64(var2^);{$ENDIF}
+ btChar: tbtU32(var1^) := tbtU32(var1^) - Ord(tbtchar(var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbtU32(var1^) := tbtU32(var1^) - Ord(tbtwidechar(var2^));{$ENDIF}
+ btVariant: tbtU32(var1^) := tbtU32(var1^) - Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbts32(var1^) := tbts32(var1^) - tbtu8(var2^);
+ btS8: tbts32(var1^) := tbts32(var1^) - tbts8(var2^);
+ btU16: tbts32(var1^) := tbts32(var1^) - tbtu16(var2^);
+ btS16: tbts32(var1^) := tbts32(var1^) - tbts16(var2^);
+ btU32: tbts32(var1^) := tbts32(var1^) - Longint(tbtu32(var2^));
+ btS32: tbts32(var1^) := tbts32(var1^) - tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbts32(var1^) := tbts32(var1^) - tbts64(var2^);{$ENDIF}
+ btChar: tbts32(var1^) := tbts32(var1^) - Ord(tbtchar(var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbts32(var1^) := tbts32(var1^) - Ord(tbtwidechar(var2^));{$ENDIF}
+ btVariant: tbts32(var1^) := tbts32(var1^) - Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(var1^) := tbts64(var1^) - PSGetInt64(var2, var2type);
+ {$ENDIF}
+ btSingle:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtsingle(var1^) := tbtsingle(var1^) - tbtu8(var2^);
+ btS8: tbtsingle(var1^) := tbtsingle(var1^) - tbts8(var2^);
+ btU16: tbtsingle(var1^) := tbtsingle(var1^) - tbtu16(var2^);
+ btS16: tbtsingle(var1^) := tbtsingle(var1^) - tbts16(var2^);
+ btU32: tbtsingle(var1^) := tbtsingle(var1^) - tbtu32(var2^);
+ btS32: tbtsingle(var1^) := tbtsingle(var1^) - tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtsingle(var1^) := tbtsingle(var1^) - tbts64(var2^);{$ENDIF}
+ btSingle: tbtsingle(var1^) := tbtsingle(var1^) - tbtsingle(var2^);
+ btDouble: tbtsingle(var1^) := tbtsingle(var1^) - tbtdouble(var2^);
+ btExtended: tbtsingle(var1^) := tbtsingle(var1^) - tbtextended(var2^);
+ btCurrency: tbtsingle(var1^) := tbtsingle(var1^) - tbtcurrency(var2^);
+ btVariant: tbtsingle(var1^) := tbtsingle(var1^) - Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btCurrency:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtcurrency(var1^) := tbtcurrency(var1^) - tbtu8(var2^);
+ btS8: tbtcurrency(var1^) := tbtcurrency(var1^) - tbts8(var2^);
+ btU16: tbtcurrency(var1^) := tbtcurrency(var1^) - tbtu16(var2^);
+ btS16: tbtcurrency(var1^) := tbtcurrency(var1^) - tbts16(var2^);
+ btU32: tbtcurrency(var1^) := tbtdouble(var1^) - tbtu32(var2^);
+ btS32: tbtcurrency(var1^) := tbtcurrency(var1^) - tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtcurrency(var1^) := tbtdouble(var1^) - tbts64(var2^);{$ENDIF}
+ btSingle: tbtcurrency(var1^) := tbtcurrency(var1^) - tbtsingle(var2^);
+ btDouble: tbtcurrency(var1^) := tbtcurrency(var1^) - tbtdouble(var2^);
+ btExtended: tbtcurrency(var1^) := tbtcurrency(var1^) - tbtextended(var2^);
+ btCurrency: tbtcurrency(var1^) := tbtcurrency(var1^) - tbtcurrency(var2^);
+ btVariant: tbtcurrency(var1^) := tbtcurrency(var1^) - Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btDouble:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtdouble(var1^) := tbtdouble(var1^) - tbtu8(var2^);
+ btS8: tbtdouble(var1^) := tbtdouble(var1^) - tbts8(var2^);
+ btU16: tbtdouble(var1^) := tbtdouble(var1^) - tbtu16(var2^);
+ btS16: tbtdouble(var1^) := tbtdouble(var1^) - tbts16(var2^);
+ btU32: tbtdouble(var1^) := tbtdouble(var1^) - tbtu32(var2^);
+ btS32: tbtdouble(var1^) := tbtdouble(var1^) - tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtdouble(var1^) := tbtdouble(var1^) - tbts64(var2^);{$ENDIF}
+ btSingle: tbtdouble(var1^) := tbtdouble(var1^) - tbtsingle(var2^);
+ btDouble: tbtdouble(var1^) := tbtdouble(var1^) - tbtdouble(var2^);
+ btExtended: tbtdouble(var1^) := tbtdouble(var1^) - tbtextended(var2^);
+ btCurrency: tbtdouble(var1^) := tbtdouble(var1^) - tbtcurrency(var2^);
+ btVariant: tbtdouble(var1^) := tbtdouble(var1^) - Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btExtended:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtextended(var1^) := tbtextended(var1^) - tbtu8(var2^);
+ btS8: tbtextended(var1^) := tbtextended(var1^) - tbts8(var2^);
+ btU16: tbtextended(var1^) := tbtextended(var1^) - tbtu16(var2^);
+ btS16: tbtextended(var1^) := tbtextended(var1^) - tbts16(var2^);
+ btU32: tbtextended(var1^) := tbtextended(var1^) - tbtu32(var2^);
+ btS32: tbtextended(var1^) := tbtextended(var1^) - tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtextended(var1^) := tbtextended(var1^) -+tbts64(var2^);{$ENDIF}
+ btSingle: tbtextended(var1^) := tbtextended(var1^) - tbtsingle(var2^);
+ btDouble: tbtextended(var1^) := tbtextended(var1^) - tbtdouble(var2^);
+ btExtended: tbtextended(var1^) := tbtextended(var1^) - tbtextended(var2^);
+ btCurrency: tbtextended(var1^) := tbtextended(var1^) - tbtcurrency(var2^);
+ btVariant: tbtextended(var1^) := tbtextended(var1^) - Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btChar: tbtchar(var1^):= tbtchar(ord(tbtchar(var1^)) - PSGetUInt(Var2, var2type));
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: tbtwidechar(var1^) := widechar(ord(tbtwidechar(var1^)) - PSGetUInt(Var2, var2type));
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ Variant(var1^) := Variant(var1^) - tvar;
+ end;
+ btSet:
+ begin
+ if var1Type = var2Type then
+ begin
+ Set_Diff(var1, var2, TPSTypeRec_Set(var1Type).aByteSize);
+ end else result := False;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 2: begin { * }
+ case var1Type.BaseType of
+ btU8: tbtU8(var1^) := tbtU8(var1^) * PSGetUInt(Var2, var2type);
+ btS8: tbts8(var1^) := tbts8(var1^) * PSGetInt(Var2, var2type);
+ btU16: tbtU16(var1^) := tbtU16(var1^) * PSGetUInt(Var2, var2type);
+ btS16: tbts16(var1^) := tbts16(var1^) * PSGetInt(Var2, var2type);
+ btU32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtU32(var1^) := tbtU32(var1^) * tbtu8(var2^);
+ btS8: tbtU32(var1^) := tbtU32(var1^) * cardinal(longint(tbts8(var2^)));
+ btU16: tbtU32(var1^) := tbtU32(var1^) * tbtu16(var2^);
+ btS16: tbtU32(var1^) := tbtU32(var1^) * cardinal(longint(tbts16(var2^)));
+ btU32: tbtU32(var1^) := tbtU32(var1^) * tbtu32(var2^);
+ btS32: tbtU32(var1^) := tbtU32(var1^) * cardinal(tbts32(var2^));
+ {$IFNDEF PS_NOINT64} btS64: tbtU32(var1^) := tbtU32(var1^) * tbts64(var2^);{$ENDIF}
+ btChar: tbtU32(var1^) := tbtU32(var1^) * Ord(tbtchar(var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbtU32(var1^) := tbtU32(var1^) * Ord(tbtwidechar(var2^));{$ENDIF}
+ btVariant: tbtU32(var1^) := tbtU32(var1^) * Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbts32(var1^) := tbts32(var1^) * tbtu8(var2^);
+ btS8: tbts32(var1^) := tbts32(var1^) * tbts8(var2^);
+ btU16: tbts32(var1^) := tbts32(var1^) * tbtu16(var2^);
+ btS16: tbts32(var1^) := tbts32(var1^) * tbts16(var2^);
+ btU32: tbts32(var1^) := tbts32(var1^) * Longint(tbtu32(var2^));
+ btS32: tbts32(var1^) := tbts32(var1^) * tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbts32(var1^) := tbts32(var1^) * tbts64(var2^);{$ENDIF}
+ btChar: tbts32(var1^) := tbts32(var1^) * Ord(tbtchar(var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbts32(var1^) := tbts32(var1^) * Ord(tbtwidechar(var2^));{$ENDIF}
+ btVariant: tbts32(var1^) := tbts32(var1^) * Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(var1^) := tbts64(var1^) * PSGetInt64(var2, var2type);
+ {$ENDIF}
+ btCurrency:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtcurrency(var1^) := tbtcurrency(var1^) * tbtu8(var2^);
+ btS8: tbtcurrency(var1^) := tbtcurrency(var1^) * tbts8(var2^);
+ btU16: tbtcurrency(var1^) := tbtcurrency(var1^) * tbtu16(var2^);
+ btS16: tbtcurrency(var1^) := tbtcurrency(var1^) * tbts16(var2^);
+ btU32: tbtcurrency(var1^) := tbtdouble(var1^) * tbtu32(var2^);
+ btS32: tbtcurrency(var1^) := tbtcurrency(var1^) * tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtcurrency(var1^) := tbtdouble(var1^) * tbts64(var2^);{$ENDIF}
+ btSingle: tbtcurrency(var1^) := tbtcurrency(var1^) * tbtsingle(var2^);
+ btDouble: tbtcurrency(var1^) := tbtcurrency(var1^) * tbtdouble(var2^);
+ btExtended: tbtcurrency(var1^) := tbtcurrency(var1^) * tbtextended(var2^);
+ btCurrency: tbtcurrency(var1^) := tbtcurrency(var1^) * tbtcurrency(var2^);
+ btVariant: tbtcurrency(var1^) := tbtcurrency(var1^) * Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btSingle:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtsingle(var1^) := tbtsingle(var1^) *tbtu8(var2^);
+ btS8: tbtsingle(var1^) := tbtsingle(var1^) *tbts8(var2^);
+ btU16: tbtsingle(var1^) := tbtsingle(var1^) *tbtu16(var2^);
+ btS16: tbtsingle(var1^) := tbtsingle(var1^) *tbts16(var2^);
+ btU32: tbtsingle(var1^) := tbtsingle(var1^) *tbtu32(var2^);
+ btS32: tbtsingle(var1^) := tbtsingle(var1^) *tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtsingle(var1^) := tbtsingle(var1^) *tbts64(var2^);{$ENDIF}
+ btSingle: tbtsingle(var1^) := tbtsingle(var1^) *tbtsingle(var2^);
+ btDouble: tbtsingle(var1^) := tbtsingle(var1^) *tbtdouble(var2^);
+ btExtended: tbtsingle(var1^) := tbtsingle(var1^) *tbtextended(var2^);
+ btCurrency: tbtsingle(var1^) := tbtsingle(var1^) *tbtcurrency(var2^);
+ btVariant: tbtsingle(var1^) := tbtsingle(var1^) * Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btDouble:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtdouble(var1^) := tbtdouble(var1^) *tbtu8(var2^);
+ btS8: tbtdouble(var1^) := tbtdouble(var1^) *tbts8(var2^);
+ btU16: tbtdouble(var1^) := tbtdouble(var1^) *tbtu16(var2^);
+ btS16: tbtdouble(var1^) := tbtdouble(var1^) *tbts16(var2^);
+ btU32: tbtdouble(var1^) := tbtdouble(var1^) *tbtu32(var2^);
+ btS32: tbtdouble(var1^) := tbtdouble(var1^) *tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtdouble(var1^) := tbtdouble(var1^) *tbts64(var2^);{$ENDIF}
+ btSingle: tbtdouble(var1^) := tbtdouble(var1^) *tbtsingle(var2^);
+ btDouble: tbtdouble(var1^) := tbtdouble(var1^) *tbtdouble(var2^);
+ btExtended: tbtdouble(var1^) := tbtdouble(var1^) *tbtextended(var2^);
+ btCurrency: tbtdouble(var1^) := tbtdouble(var1^) *tbtcurrency(var2^);
+ btVariant: tbtdouble(var1^) := tbtdouble(var1^) * Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btExtended:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtextended(var1^) := tbtextended(var1^) *tbtu8(var2^);
+ btS8: tbtextended(var1^) := tbtextended(var1^) *tbts8(var2^);
+ btU16: tbtextended(var1^) := tbtextended(var1^) *tbtu16(var2^);
+ btS16: tbtextended(var1^) := tbtextended(var1^) *tbts16(var2^);
+ btU32: tbtextended(var1^) := tbtextended(var1^) *tbtu32(var2^);
+ btS32: tbtextended(var1^) := tbtextended(var1^) *tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtextended(var1^) := tbtextended(var1^) *tbts64(var2^);{$ENDIF}
+ btSingle: tbtextended(var1^) := tbtextended(var1^) *tbtsingle(var2^);
+ btDouble: tbtextended(var1^) := tbtextended(var1^) *tbtdouble(var2^);
+ btExtended: tbtextended(var1^) := tbtextended(var1^) *tbtextended(var2^);
+ btCurrency: tbtextended(var1^) := tbtextended(var1^) *tbtcurrency(var2^);
+ btVariant: tbtextended(var1^) := tbtextended(var1^) * Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ Variant(var1^) := Variant(var1^) * tvar;
+ end;
+ btSet:
+ begin
+ if var1Type = var2Type then
+ begin
+ Set_Intersect(var1, var2, TPSTypeRec_Set(var1Type).aByteSize);
+ end else result := False;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 3: begin { / }
+ case var1Type.BaseType of
+ btU8: tbtU8(var1^) := tbtU8(var1^) div PSGetUInt(Var2, var2type);
+ btS8: tbts8(var1^) := tbts8(var1^) div PSGetInt(Var2, var2type);
+ btU16: tbtU16(var1^) := tbtU16(var1^) div PSGetUInt(Var2, var2type);
+ btS16: tbts16(var1^) := tbts16(var1^) div PSGetInt(Var2, var2type);
+ btU32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtU32(var1^) := tbtU32(var1^) div tbtu8(var2^);
+ btS8: tbtU32(var1^) := tbtU32(var1^) div cardinal(longint(tbts8(var2^)));
+ btU16: tbtU32(var1^) := tbtU32(var1^) div tbtu16(var2^);
+ btS16: tbtU32(var1^) := tbtU32(var1^) div cardinal(longint(tbts16(var2^)));
+ btU32: tbtU32(var1^) := tbtU32(var1^) div tbtu32(var2^);
+ btS32: tbtU32(var1^) := tbtU32(var1^) div cardinal(tbts32(var2^));
+ {$IFNDEF PS_NOINT64} btS64: tbtU32(var1^) := tbtU32(var1^) div tbts64(var2^);{$ENDIF}
+ btChar: tbtU32(var1^) := tbtU32(var1^) div Ord(tbtchar(var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbtU32(var1^) := tbtU32(var1^) div Ord(tbtwidechar(var2^));{$ENDIF}
+ btVariant: tbtU32(var1^) := tbtU32(var1^) div Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbts32(var1^) := tbts32(var1^) div tbtu8(var2^);
+ btS8: tbts32(var1^) := tbts32(var1^) div tbts8(var2^);
+ btU16: tbts32(var1^) := tbts32(var1^) div tbtu16(var2^);
+ btS16: tbts32(var1^) := tbts32(var1^) div tbts16(var2^);
+ btU32: tbts32(var1^) := tbts32(var1^) div Longint(tbtu32(var2^));
+ btS32: tbts32(var1^) := tbts32(var1^) div tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbts32(var1^) := tbts32(var1^) div tbts64(var2^);{$ENDIF}
+ btChar: tbts32(var1^) := tbts32(var1^) div Ord(tbtchar(var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbts32(var1^) := tbts32(var1^) div Ord(tbtwidechar(var2^));{$ENDIF}
+ btVariant: tbts32(var1^) := tbts32(var1^) div Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(var1^) := tbts64(var1^) div PSGetInt64(var2, var2type);
+ {$ENDIF}
+ btSingle:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtsingle(var1^) := tbtsingle(var1^) / tbtu8(var2^);
+ btS8: tbtsingle(var1^) := tbtsingle(var1^) / tbts8(var2^);
+ btU16: tbtsingle(var1^) := tbtsingle(var1^) / tbtu16(var2^);
+ btS16: tbtsingle(var1^) := tbtsingle(var1^) / tbts16(var2^);
+ btU32: tbtsingle(var1^) := tbtsingle(var1^) / tbtu32(var2^);
+ btS32: tbtsingle(var1^) := tbtsingle(var1^) / tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtsingle(var1^) := tbtsingle(var1^) / tbts64(var2^);{$ENDIF}
+ btSingle: tbtsingle(var1^) := tbtsingle(var1^) / tbtsingle(var2^);
+ btDouble: tbtsingle(var1^) := tbtsingle(var1^) / tbtdouble(var2^);
+ btExtended: tbtsingle(var1^) := tbtsingle(var1^) / tbtextended(var2^);
+ btCurrency: tbtsingle(var1^) := tbtsingle(var1^) / tbtcurrency(var2^);
+ btVariant: tbtsingle(var1^) := tbtsingle(var1^) / Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btCurrency:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtcurrency(var1^) := tbtcurrency(var1^) / tbtu8(var2^);
+ btS8: tbtcurrency(var1^) := tbtcurrency(var1^) / tbts8(var2^);
+ btU16: tbtcurrency(var1^) := tbtcurrency(var1^) / tbtu16(var2^);
+ btS16: tbtcurrency(var1^) := tbtcurrency(var1^) / tbts16(var2^);
+ btU32: tbtcurrency(var1^) := tbtdouble(var1^) / tbtu32(var2^);
+ btS32: tbtcurrency(var1^) := tbtcurrency(var1^) / tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtcurrency(var1^) := tbtdouble(var1^) / tbts64(var2^);{$ENDIF}
+ btSingle: tbtcurrency(var1^) := tbtcurrency(var1^) / tbtsingle(var2^);
+ btDouble: tbtcurrency(var1^) := tbtcurrency(var1^) / tbtdouble(var2^);
+ btExtended: tbtcurrency(var1^) := tbtcurrency(var1^) / tbtextended(var2^);
+ btCurrency: tbtcurrency(var1^) := tbtcurrency(var1^) / tbtcurrency(var2^);
+ btVariant: tbtcurrency(var1^) := tbtcurrency(var1^) / Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btDouble:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtdouble(var1^) := tbtdouble(var1^) / tbtu8(var2^);
+ btS8: tbtdouble(var1^) := tbtdouble(var1^) / tbts8(var2^);
+ btU16: tbtdouble(var1^) := tbtdouble(var1^) / tbtu16(var2^);
+ btS16: tbtdouble(var1^) := tbtdouble(var1^) / tbts16(var2^);
+ btU32: tbtdouble(var1^) := tbtdouble(var1^) / tbtu32(var2^);
+ btS32: tbtdouble(var1^) := tbtdouble(var1^) / tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtdouble(var1^) := tbtdouble(var1^) / tbts64(var2^);{$ENDIF}
+ btSingle: tbtdouble(var1^) := tbtdouble(var1^) / tbtsingle(var2^);
+ btDouble: tbtdouble(var1^) := tbtdouble(var1^) / tbtdouble(var2^);
+ btExtended: tbtdouble(var1^) := tbtdouble(var1^) / tbtextended(var2^);
+ btCurrency: tbtdouble(var1^) := tbtdouble(var1^) / tbtcurrency(var2^);
+ btVariant: tbtdouble(var1^) := tbtdouble(var1^) / Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btExtended:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtextended(var1^) := tbtextended(var1^) / tbtu8(var2^);
+ btS8: tbtextended(var1^) := tbtextended(var1^) / tbts8(var2^);
+ btU16: tbtextended(var1^) := tbtextended(var1^) / tbtu16(var2^);
+ btS16: tbtextended(var1^) := tbtextended(var1^) / tbts16(var2^);
+ btU32: tbtextended(var1^) := tbtextended(var1^) / tbtu32(var2^);
+ btS32: tbtextended(var1^) := tbtextended(var1^) / tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbtextended(var1^) := tbtextended(var1^) / tbts64(var2^);{$ENDIF}
+ btSingle: tbtextended(var1^) := tbtextended(var1^) / tbtsingle(var2^);
+ btDouble: tbtextended(var1^) := tbtextended(var1^) / tbtdouble(var2^);
+ btExtended: tbtextended(var1^) := tbtextended(var1^) / tbtextended(var2^);
+ btCurrency: tbtextended(var1^) := tbtextended(var1^) / tbtcurrency(var2^);
+ btVariant: tbtextended(var1^) := tbtextended(var1^) / Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ begin
+ if VarIsFloat(variant(var1^)) then
+ Variant(var1^) := Variant(var1^) / tvar
+ else
+ Variant(var1^) := Variant(var1^) div tvar;
+ end;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 4: begin { MOD }
+ case var1Type.BaseType of
+ btU8: tbtU8(var1^) := tbtU8(var1^) mod PSGetUInt(Var2, var2type);
+ btS8: tbts8(var1^) := tbts8(var1^) mod PSGetInt(Var2, var2type);
+ btU16: tbtU16(var1^) := tbtU16(var1^) mod PSGetUInt(Var2, var2type);
+ btS16: tbts16(var1^) := tbts16(var1^) mod PSGetInt(Var2, var2type);
+ btU32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbtU32(var1^) := tbtU32(var1^) mod tbtu8(var2^);
+ btS8: tbtU32(var1^) := tbtU32(var1^) mod cardinal(longint(tbts8(var2^)));
+ btU16: tbtU32(var1^) := tbtU32(var1^) mod tbtu16(var2^);
+ btS16: tbtU32(var1^) := tbtU32(var1^) mod cardinal(longint(tbts16(var2^)));
+ btU32: tbtU32(var1^) := tbtU32(var1^) mod tbtu32(var2^);
+ btS32: tbtU32(var1^) := tbtU32(var1^) mod cardinal(tbts32(var2^));
+ {$IFNDEF PS_NOINT64} btS64: tbtU32(var1^) := tbtU32(var1^) mod tbts64(var2^);{$ENDIF}
+ btChar: tbtU32(var1^) := tbtU32(var1^) mod Ord(tbtchar(var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbtU32(var1^) := tbtU32(var1^) mod Ord(tbtwidechar(var2^));{$ENDIF}
+ btVariant: tbtU32(var1^) := tbtU32(var1^) mod Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ btS32:
+ begin
+ if var2type.BaseType = btPointer then
+ begin
+ var2type := PIFTypeRec(Pointer(IPointer(var2)+PointerSize)^);
+ var2 := Pointer(var2^);
+ if (var2 = nil) or (var2type = nil) then raise Exception.Create(RPS_TypeMismatch);
+ end;
+ case var2type.BaseType of
+ btU8: tbts32(var1^) := tbts32(var1^) mod tbtu8(var2^);
+ btS8: tbts32(var1^) := tbts32(var1^) mod tbts8(var2^);
+ btU16: tbts32(var1^) := tbts32(var1^) mod tbtu16(var2^);
+ btS16: tbts32(var1^) := tbts32(var1^) mod tbts16(var2^);
+ btU32: tbts32(var1^) := tbts32(var1^) mod Longint(tbtu32(var2^));
+ btS32: tbts32(var1^) := tbts32(var1^) mod tbts32(var2^);
+ {$IFNDEF PS_NOINT64} btS64: tbts32(var1^) := tbts32(var1^) mod tbts64(var2^);{$ENDIF}
+ btChar: tbts32(var1^) := tbts32(var1^) mod Ord(tbtchar(var2^));
+ {$IFNDEF PS_NOWIDESTRING} btWideChar: tbts32(var1^) := tbts32(var1^) mod Ord(tbtwidechar(var2^));{$ENDIF}
+ btVariant: tbts32(var1^) := tbts32(var1^) mod Variant(var2^);
+ else raise Exception.Create(RPS_TypeMismatch);
+ end;
+ end;
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(var1^) := tbts64(var1^) mod PSGetInt64(var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ Variant(var1^) := Variant(var1^) mod tvar;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 5: begin { SHL }
+ case var1Type.BaseType of
+ btU8: tbtU8(var1^) := tbtU8(var1^) shl PSGetUInt(Var2, var2type);
+ btS8: tbts8(var1^) := tbts8(var1^) shl PSGetInt(Var2, var2type);
+ btU16: tbtU16(var1^) := tbtU16(var1^) shl PSGetUInt(Var2, var2type);
+ btS16: tbts16(var1^) := tbts16(var1^) shl PSGetInt(Var2, var2type);
+ btU32: tbtU32(var1^) := tbtU32(var1^) shl PSGetUInt(Var2, var2type);
+ btS32: tbts32(var1^) := tbts32(var1^) shl PSGetInt(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(var1^) := tbts64(var1^) shl PSGetInt64(var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ Variant(var1^) := Variant(var1^) shl tvar;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 6: begin { SHR }
+ case var1Type.BaseType of
+ btU8: tbtU8(var1^) := tbtU8(var1^) shr PSGetUInt(Var2, var2type);
+ btS8: tbts8(var1^) := tbts8(var1^) shr PSGetInt(Var2, var2type);
+ btU16: tbtU16(var1^) := tbtU16(var1^) shr PSGetUInt(Var2, var2type);
+ btS16: tbts16(var1^) := tbts16(var1^) shr PSGetInt(Var2, var2type);
+ btU32: tbtU32(var1^) := tbtU32(var1^) shr PSGetUInt(Var2, var2type);
+ btS32: tbts32(var1^) := tbts32(var1^) shr PSGetInt(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(var1^) := tbts64(var1^) shr PSGetInt64(var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ Variant(var1^) := Variant(var1^) shr tvar;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 7: begin { AND }
+ case var1Type.BaseType of
+ btU8: tbtU8(var1^) := tbtU8(var1^) and PSGetUInt(Var2, var2type);
+ btS8: tbts8(var1^) := tbts8(var1^) and PSGetInt(Var2, var2type);
+ btU16: tbtU16(var1^) := tbtU16(var1^) and PSGetUInt(Var2, var2type);
+ btS16: tbts16(var1^) := tbts16(var1^) and PSGetInt(Var2, var2type);
+ btU32: tbtU32(var1^) := tbtU32(var1^) and PSGetUInt(Var2, var2type);
+ btS32: tbts32(var1^) := tbts32(var1^) and PSGetInt(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(var1^) := tbts64(var1^) and PSGetInt64(var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ Variant(var1^) := Variant(var1^) and tvar;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 8: begin { OR }
+ case var1Type.BaseType of
+ btU8: tbtU8(var1^) := tbtU8(var1^) or PSGetUInt(Var2, var2type);
+ btS8: tbts8(var1^) := tbts8(var1^) or PSGetInt(Var2, var2type);
+ btU16: tbtU16(var1^) := tbtU16(var1^) or PSGetUInt(Var2, var2type);
+ btS16: tbts16(var1^) := tbts16(var1^) or PSGetInt(Var2, var2type);
+ btU32: tbtU32(var1^) := tbtU32(var1^) or PSGetUInt(Var2, var2type);
+ btS32: tbts32(var1^) := tbts32(var1^) or PSGetInt(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(var1^) := tbts64(var1^) or PSGetInt64(var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ Variant(var1^) := Variant(var1^) or tvar;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 9: begin { XOR }
+ case var1Type.BaseType of
+ btU8: tbtU8(var1^) := tbtU8(var1^) xor PSGetUInt(Var2, var2type);
+ btS8: tbts8(var1^) := tbts8(var1^) xor PSGetInt(Var2, var2type);
+ btU16: tbtU16(var1^) := tbtU16(var1^) xor PSGetUInt(Var2, var2type);
+ btS16: tbts16(var1^) := tbts16(var1^) xor PSGetInt(Var2, var2type);
+ btU32: tbtU32(var1^) := tbtU32(var1^) xor PSGetUInt(Var2, var2type);
+ btS32: tbts32(var1^) := tbts32(var1^) xor PSGetInt(Var2, var2type);
+ {$IFNDEF PS_NOINT64}
+ btS64: tbts64(var1^) := tbts64(var1^) xor PSGetInt64(var2, var2type);
+ {$ENDIF}
+ btVariant:
+ begin
+ if not IntPIFVariantToVariant(var2, var2type, tvar) then
+ begin
+ Result := false;
+ end else
+ Variant(var1^) := Variant(var1^) xor tvar;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ 10:
+ begin // as
+ case var1Type.BaseType of
+ btClass:
+ begin
+ if var2type.BaseType <> btU32 then
+ Result := False
+ else
+ begin
+ var2type := FTypes[tbtu32(var2^)];
+ if (var2type = nil) or (var2type.BaseType <> btClass) then
+ Result := false
+ else
+ begin
+ if not Class_IS(Self, TObject(var1^), var2type) then
+ Result := false
+ end;
+ end;
+ end;
+ else begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ if not Result then begin
+ CMD_Err(erTypeMismatch);
+ exit;
+ end;
+ end;
+ else begin
+ Result := False;
+ CMD_Err(erInvalidOpcodeParameter);
+ exit;
+ end;
+ end;
+ except
+ {$IFDEF DELPHI6UP}
+ Tmp := AcquireExceptionObject;
+ {$ELSE}
+ if RaiseList <> nil then
+ begin
+ Tmp := Exception(PRaiseFrame(RaiseList)^.ExceptObject);
+ PRaiseFrame(RaiseList)^.ExceptObject := nil;
+ end else
+ Tmp := nil;
+ {$ENDIF}
+ if Tmp <> nil then
+ begin
+ if Tmp is EPSException then
+ begin
+ Result := False;
+ ExceptionProc(EPSException(tmp).ProcNo, EPSException(tmp).ProcPos, erCustomError, tbtString(EPSException(tmp).Message), nil);
+ exit;
+ end else
+ if Tmp is EDivByZero then
+ begin
+ Result := False;
+ CMD_Err3(erDivideByZero, '', Tmp);
+ Exit;
+ end;
+ if Tmp is EZeroDivide then
+ begin
+ Result := False;
+ CMD_Err3(erDivideByZero, '', Tmp);
+ Exit;
+ end;
+ if Tmp is EMathError then
+ begin
+ Result := False;
+ CMD_Err3(erMathError, '', Tmp);
+ Exit;
+ end;
+ end;
+ if (tmp <> nil) and (Tmp is Exception) then
+ CMD_Err3(erException, tbtString(Exception(Tmp).Message), Tmp)
+ else
+ CMD_Err3(erException, '', Tmp);
+ Result := False;
+ end;
+end;
+
+function TPSExec.ReadVariable(var Dest: TPSResultData; UsePointer: Boolean): Boolean;
+var
+ VarType: Cardinal;
+ Param: Cardinal;
+ Tmp: PIfVariant;
+ at: TPSTypeRec;
+
+begin
+ if FCurrentPosition + 4 >= FDataLength then
+ begin
+ CMD_Err(erOutOfRange); // Error
+ Result := False;
+ exit;
+ end;
+ VarType := FData^[FCurrentPosition];
+ Inc(FCurrentPosition);
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ Param := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ Param := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ case VarType of
+ 0:
+ begin
+ Dest.FreeType := vtNone;
+ if Param < PSAddrNegativeStackStart then
+ begin
+ if Param >= Cardinal(FGlobalVars.Count) then
+ begin
+ CMD_Err(erOutOfGlobalVarsRange);
+ Result := False;
+ exit;
+ end;
+ Tmp := FGlobalVars.Data[param];
+ end else
+ begin
+ Param := Cardinal(Longint(-PSAddrStackStart) +
+ Longint(FCurrStackBase) + Longint(Param));
+ if Param >= Cardinal(FStack.Count) then
+ begin
+ CMD_Err(erOutOfGlobalVarsRange);
+ Result := False;
+ exit;
+ end;
+ Tmp := FStack.Data[param];
+ end;
+ if (UsePointer) and (Tmp.FType.BaseType = btPointer) then
+ begin
+ Dest.aType := PPSVariantPointer(Tmp).DestType;
+ Dest.P := PPSVariantPointer(Tmp).DataDest;
+ if Dest.P = nil then
+ begin
+ Cmd_Err(erNullPointerException);
+ Result := False;
+ exit;
+ end;
+ end else
+ begin
+ Dest.aType := PPSVariantData(Tmp).vi.FType;
+ Dest.P := @PPSVariantData(Tmp).Data;
+ end;
+ end;
+ 1: begin
+ if Param >= FTypes.Count then
+ begin
+ CMD_Err(erInvalidType);
+ Result := False;
+ exit;
+ end;
+ at := FTypes.Data^[Param];
+ Param := FTempVars.FLength;
+ FTempVars.FLength := Cardinal(Longint(Param) + Longint(at.RealSize) + Longint(RTTISize + 3)) and not 3;
+ if FTempVars.FLength > FTempVars.FCapacity then FtempVars.AdjustLength;
+ Tmp := Pointer(IPointer(FtempVars.FDataPtr) + IPointer(Param));
+
+ if Cardinal(FTempVars.FCount) >= Cardinal(FTempVars.FCapacity) then
+ begin
+ Inc(FTempVars.FCapacity, FCapacityInc);// := FCount + 1;
+ ReAllocMem(FTempVars.FData, FTempVars.FCapacity shl 2);
+ end;
+ FTempVars.FData[FTempVars.FCount] := Tmp; // Instead of SetItem
+ Inc(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+
+
+ Tmp.FType := at;
+ Dest.P := @PPSVariantData(Tmp).Data;
+ Dest.aType := tmp.FType;
+ dest.FreeType := vtTempVar;
+ case Dest.aType.BaseType of
+ btSet:
+ begin
+ if not ReadData(Dest.P^, TPSTypeRec_Set(Dest.aType).aByteSize) then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ end;
+ bts8, btchar, btU8:
+ begin
+ if FCurrentPosition >= FDataLength then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ tbtu8(dest.p^) := FData^[FCurrentPosition];
+ Inc(FCurrentPosition);
+ end;
+ bts16, {$IFNDEF PS_NOWIDESTRING}btwidechar,{$ENDIF} btU16:
+ begin
+ if FCurrentPosition + 1>= FDataLength then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ tbtu16(dest.p^) := unaligned(tbtu16((@FData^[FCurrentPosition])^));
+ {$else}
+ tbtu16(dest.p^) := tbtu16((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 2);
+ end;
+ bts32, btU32:
+ begin
+ if FCurrentPosition + 3>= FDataLength then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ tbtu32(dest.p^) := unaligned(tbtu32((@FData^[FCurrentPosition])^));
+ {$else}
+ tbtu32(dest.p^) := tbtu32((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ end;
+ btProcPtr:
+ begin
+ if FCurrentPosition + 3>= FDataLength then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ tbtu32(dest.p^) := unaligned(tbtu32((@FData^[FCurrentPosition])^));
+ {$else}
+ tbtu32(dest.p^) := tbtu32((@FData^[FCurrentPosition])^);
+ {$endif}
+ tbtu32(Pointer(IPointer(dest.p)+PointerSize)^) := 0;
+ tbtu32(Pointer(IPointer(dest.p)+PointerSize)^) := 0;
+ Inc(FCurrentPosition, 4);
+ end;
+ {$IFNDEF PS_NOINT64}
+ bts64:
+ begin
+ if FCurrentPosition + 7>= FDataLength then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ tbts64(dest.p^) := unaligned(tbts64((@FData^[FCurrentPosition])^));
+ {$else}
+ tbts64(dest.p^) := tbts64((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 8);
+ end;
+ {$ENDIF}
+ btSingle:
+ begin
+ if FCurrentPosition + (Sizeof(Single)-1)>= FDataLength then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ tbtsingle(dest.p^) := unaligned(tbtsingle((@FData^[FCurrentPosition])^));
+ {$else}
+ tbtsingle(dest.p^) := tbtsingle((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, Sizeof(Single));
+ end;
+ btDouble:
+ begin
+ if FCurrentPosition + (Sizeof(Double)-1)>= FDataLength then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ tbtdouble(dest.p^) := unaligned(tbtdouble((@FData^[FCurrentPosition])^));
+ {$else}
+ tbtdouble(dest.p^) := tbtdouble((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, Sizeof(double));
+ end;
+
+ btExtended:
+ begin
+ if FCurrentPosition + (sizeof(Extended)-1)>= FDataLength then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ tbtextended(dest.p^) := unaligned(tbtextended((@FData^[FCurrentPosition])^));
+ {$else}
+ tbtextended(dest.p^) := tbtextended((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, sizeof(Extended));
+ end;
+ btPchar, btString:
+ begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ Param := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ Param := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ Pointer(Dest.P^) := nil;
+ SetLength(tbtstring(Dest.P^), Param);
+ if not ReadData(tbtstring(Dest.P^)[1], Param) then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ end;
+ {$IFNDEF PS_NOWIDESTRING}
+ btWidestring:
+ begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ Param := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ Param := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ Pointer(Dest.P^) := nil;
+ SetLength(tbtwidestring(Dest.P^), Param);
+ if not ReadData(tbtwidestring(Dest.P^)[1], Param*2) then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ end;
+ btUnicodeString:
+ begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ Param := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ Param := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ Pointer(Dest.P^) := nil;
+ SetLength(tbtUnicodestring(Dest.P^), Param);
+ if not ReadData(tbtUnicodestring(Dest.P^)[1], Param*2) then
+ begin
+ CMD_Err(erOutOfRange);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ end;
+ {$ENDIF}
+ else begin
+ CMD_Err(erInvalidType);
+ FTempVars.Pop;
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ 2:
+ begin
+ Dest.FreeType := vtNone;
+ if Param < PSAddrNegativeStackStart then begin
+ if Param >= Cardinal(FGlobalVars.Count) then
+ begin
+ CMD_Err(erOutOfGlobalVarsRange);
+ Result := False;
+ exit;
+ end;
+ Tmp := FGlobalVars.Data[param];
+ end
+ else begin
+ Param := Cardinal(Longint(-PSAddrStackStart) + Longint(FCurrStackBase) + Longint(Param));
+ if Param >= Cardinal(FStack.Count) then
+ begin
+ CMD_Err(erOutOfStackRange);
+ Result := False;
+ exit;
+ end;
+ Tmp := FStack.Data[param];
+ end;
+ if Tmp.FType.BaseType = btPointer then
+ begin
+ Dest.aType := PPSVariantPointer(Tmp).DestType;
+ Dest.P := PPSVariantPointer(Tmp).DataDest;
+ if Dest.P = nil then
+ begin
+ Cmd_Err(erNullPointerException);
+ Result := False;
+ exit;
+ end;
+ end else
+ begin
+ Dest.aType := PPSVariantData(Tmp).vi.FType;
+ Dest.P := @PPSVariantData(Tmp).Data;
+ end;
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ CMD_Err(erOutOfRange);
+ Result := False;
+ exit;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ Param := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ Param := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ case Dest.aType.BaseType of
+ btRecord:
+ begin
+ if Param > Cardinal(TPSTypeRec_Record(Dest.aType).FFieldTypes.Count) then
+ begin
+ CMD_Err(erOutOfRange);
+ Result := False;
+ exit;
+ end;
+ Dest.P := Pointer(IPointer(Dest.P) + IPointer(TPSTypeRec_Record(Dest.aType).RealFieldOffsets[Param]));
+ Dest.aType := TPSTypeRec_Record(Dest.aType).FieldTypes[Param];
+ end;
+ btArray:
+ begin
+ if Param >= Cardinal(PSDynArrayGetLength(Pointer(Dest.P^), dest.aType)) then
+ begin
+ CMD_Err(erOutOfRange);
+ Result := False;
+ exit;
+ end;
+ Dest.P := Pointer(IPointer(Dest.P^) + (Param * TPSTypeRec_Array(Dest.aType).FArrayType.RealSize));
+ Dest.aType := TPSTypeRec_Array(dest.aType).ArrayType;
+ end;
+ btStaticArray:
+ begin
+ if Param >= Cardinal(TPSTypeRec_StaticArray(Dest.aType).Size) then
+ begin
+ CMD_Err(erOutOfRange);
+ Result := False;
+ exit;
+ end;
+ Dest.P := Pointer(IPointer(Dest.P) + (Param * TPSTypeRec_Array(Dest.aType).FArrayType.RealSize));
+ Dest.aType := TPSTypeRec_Array(dest.aType).ArrayType;
+ end;
+ else
+ CMD_Err(erInvalidType);
+ Result := False;
+ exit;
+ end;
+
+ if UsePointer and (Dest.aType.BaseType = btPointer) then
+ begin
+ Dest.aType := TPSTypeRec(Pointer(IPointer(Dest.p)+PointerSize)^);
+ Dest.P := Pointer(Dest.p^);
+ if Dest.P = nil then
+ begin
+ Cmd_Err(erNullPointerException);
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ 3:
+ begin
+ Dest.FreeType := vtNone;
+ if Param < PSAddrNegativeStackStart then begin
+ if Param >= Cardinal(FGlobalVars.Count) then
+ begin
+ CMD_Err(erOutOfGlobalVarsRange);
+ Result := False;
+ exit;
+ end;
+ Tmp := FGlobalVars.Data[param];
+ end
+ else begin
+ Param := Cardinal(Longint(-PSAddrStackStart) + Longint(FCurrStackBase) + Longint(Param));
+ if Param >= Cardinal(FStack.Count) then
+ begin
+ CMD_Err(erOutOfStackRange);
+ Result := False;
+ exit;
+ end;
+ Tmp := FStack.Data[param];
+ end;
+ if (Tmp.FType.BaseType = btPointer) then
+ begin
+ Dest.aType := PPSVariantPointer(Tmp).DestType;
+ Dest.P := PPSVariantPointer(Tmp).DataDest;
+ if Dest.P = nil then
+ begin
+ Cmd_Err(erNullPointerException);
+ Result := False;
+ exit;
+ end;
+ end else
+ begin
+ Dest.aType := PPSVariantData(Tmp).vi.FType;
+ Dest.P := @PPSVariantData(Tmp).Data;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ Param := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ Param := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ if Param < PSAddrNegativeStackStart then
+ begin
+ if Param >= Cardinal(FGlobalVars.Count) then
+ begin
+ CMD_Err(erOutOfGlobalVarsRange);
+ Result := false;
+ exit;
+ end;
+ Tmp := FGlobalVars[Param];
+ end
+ else begin
+ Param := Cardinal(Longint(-PSAddrStackStart) + Longint(FCurrStackBase) + Longint(Param));
+ if Cardinal(Param) >= Cardinal(FStack.Count) then
+ begin
+ CMD_Err(erOutOfStackRange);
+ Result := false;
+ exit;
+ end;
+ Tmp := FStack[Param];
+ end;
+ case Tmp.FType.BaseType of
+ btu8: Param := PPSVariantU8(Tmp).Data;
+ bts8: Param := PPSVariants8(Tmp).Data;
+ btu16: Param := PPSVariantU16(Tmp).Data;
+ bts16: Param := PPSVariants16(Tmp).Data;
+ btu32: Param := PPSVariantU32(Tmp).Data;
+ bts32: Param := PPSVariants32(Tmp).Data;
+ btPointer:
+ begin
+ if PPSVariantPointer(tmp).DestType <> nil then
+ begin
+ case PPSVariantPointer(tmp).DestType.BaseType of
+ btu8: Param := tbtu8(PPSVariantPointer(tmp).DataDest^);
+ bts8: Param := tbts8(PPSVariantPointer(tmp).DataDest^);
+ btu16: Param := tbtu16(PPSVariantPointer(tmp).DataDest^);
+ bts16: Param := tbts16(PPSVariantPointer(tmp).DataDest^);
+ btu32, btProcPtr: Param := tbtu32(PPSVariantPointer(tmp).DataDest^);
+ bts32: Param := tbts32(PPSVariantPointer(tmp).DataDest^);
+ else
+ begin
+ CMD_Err(ErTypeMismatch);
+ Result := false;
+ exit;
+ end;
+ end;
+ end else
+ begin
+ CMD_Err(ErTypeMismatch);
+ Result := false;
+ exit;
+ end;
+ end;
+ else
+ CMD_Err(ErTypeMismatch);
+ Result := false;
+ exit;
+ end;
+ case Dest.aType.BaseType of
+ btRecord:
+ begin
+ if Param > Cardinal(TPSTypeRec_Record(Dest.aType).FFieldTypes.Count) then
+ begin
+ CMD_Err(erOutOfRange);
+ Result := False;
+ exit;
+ end;
+ Dest.P := Pointer(IPointer(Dest.P) + IPointer(TPSTypeRec_Record(Dest.aType).RealFieldOffsets[Param]));
+ Dest.aType := TPSTypeRec_Record(Dest.aType).FieldTypes[Param];
+ end;
+ btArray:
+ begin
+ if Cardinal(Param) >= Cardinal(PSDynArrayGetLength(Pointer(Dest.P^), dest.aType)) then
+ begin
+ CMD_Err(erOutOfRange);
+ Result := False;
+ exit;
+ end;
+ Dest.P := Pointer(IPointer(Dest.P^) + (Param * TPSTypeRec_Array(Dest.aType).FArrayType.RealSize));
+ Dest.aType := TPSTypeRec_Array(dest.aType).ArrayType;
+ end;
+ btStaticArray:
+ begin
+ if Param >= Cardinal(TPSTypeRec_StaticArray(Dest.aType).Size) then
+ begin
+ CMD_Err(erOutOfRange);
+ Result := False;
+ exit;
+ end;
+ Dest.P := Pointer(IPointer(Dest.P) + (Param * TPSTypeRec_Array(Dest.aType).FArrayType.RealSize));
+ Dest.aType := TPSTypeRec_Array(dest.aType).ArrayType;
+ end;
+ else
+ CMD_Err(erInvalidType);
+ Result := False;
+ exit;
+ end;
+ if UsePointer and (Dest.aType.BaseType = btPointer) then
+ begin
+ Dest.aType := TPSTypeRec(Pointer(IPointer(Dest.p)+PointerSize)^);
+ Dest.P := Pointer(Dest.p^);
+ if Dest.P = nil then
+ begin
+ Cmd_Err(erNullPointerException);
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ else
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := true;
+end;
+
+function TPSExec.DoMinus(Dta: Pointer; aType: TPSTypeRec): Boolean;
+begin
+ case atype.BaseType of
+ btU8: tbtu8(dta^) := -tbtu8(dta^);
+ btU16: tbtu16(dta^) := -tbtu16(dta^);
+ btU32: tbtu32(dta^) := -tbtu32(dta^);
+ btS8: tbts8(dta^) := -tbts8(dta^);
+ btS16: tbts16(dta^) := -tbts16(dta^);
+ btS32: tbts32(dta^) := -tbts32(dta^);
+ {$IFNDEF PS_NOINT64}
+ bts64: tbts64(dta^) := -tbts64(dta^);
+ {$ENDIF}
+ btSingle: tbtsingle(dta^) := -tbtsingle(dta^);
+ btDouble: tbtdouble(dta^) := -tbtdouble(dta^);
+ btExtended: tbtextended(dta^) := -tbtextended(dta^);
+ btCurrency: tbtcurrency(dta^) := -tbtcurrency(dta^);
+ btVariant:
+ begin
+ try
+ Variant(dta^) := - Variant(dta^);
+ except
+ CMD_Err(erTypeMismatch);
+ Result := False;
+ exit;
+ end;
+ end;
+ else
+ begin
+ CMD_Err(erTypeMismatch);
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := True;
+end;
+
+function TPSExec.DoBooleanNot(Dta: Pointer; aType: TPSTypeRec): Boolean;
+begin
+ case aType.BaseType of
+ btU8: tbtu8(dta^) := tbtu8(tbtu8(dta^) = 0);
+ btU16: tbtu16(dta^) := tbtu16(tbtu16(dta^) = 0);
+ btU32: tbtu32(dta^) := tbtu32(tbtu32(dta^) = 0);
+ btS8: tbts8(dta^) := tbts8(tbts8(dta^) = 0);
+ btS16: tbts16(dta^) := tbts16(tbts16(dta^) = 0);
+ btS32: tbts32(dta^) := tbts32(tbts32(dta^) = 0);
+ {$IFNDEF PS_NOINT64}
+ bts64: tbts64(dta^) := tbts64(tbts64(dta^) = 0);
+ {$ENDIF}
+ btVariant:
+ begin
+ try
+ Variant(dta^) := Variant(dta^) = 0;
+ except
+ CMD_Err(erTypeMismatch);
+ Result := False;
+ exit;
+ end;
+ end;
+ else
+ begin
+ CMD_Err(erTypeMismatch);
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := True;
+end;
+
+
+procedure TPSExec.Stop;
+begin
+ if FStatus = isRunning then
+ FStatus := isLoaded
+ else if FStatus = isPaused then begin
+ FStatus := isLoaded;
+ FStack.Clear;
+ FTempVars.Clear;
+ end;
+end;
+
+
+function TPSExec.ReadLong(var b: Cardinal): Boolean;
+begin
+ if FCurrentPosition + 3 < FDataLength then begin
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ b := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ b := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ Result := True;
+ end
+ else
+ Result := False;
+end;
+
+function TPSExec.RunProcP(const Params: array of Variant; const Procno: Cardinal): Variant;
+var
+ ParamList: TPSList;
+ ct: PIFTypeRec;
+ pvar: PPSVariant;
+ res, s: tbtString;
+ Proc: TPSInternalProcRec;
+ i: Longint;
+begin
+ if ProcNo >= FProcs.Count then raise Exception.Create(RPS_UnknownProcedure);
+ Proc := GetProcNo(ProcNo) as TPSInternalProcRec;
+ ParamList := TPSList.Create;
+ try
+ s := Proc.ExportDecl;
+ res := grfw(s);
+ i := High(Params);
+ while s <> '' do
+ begin
+ if i < 0 then raise Exception.Create(RPS_NotEnoughParameters);
+ ct := FTypes[StrToInt(copy(GRLW(s), 2, MaxInt))];
+ if ct = nil then raise Exception.Create(RPS_InvalidParameter);
+ pvar := CreateHeapVariant(ct);
+ ParamList.Add(pvar);
+
+ if not VariantToPIFVariant(Self, Params[i], pvar) then raise Exception.Create(RPS_InvalidParameter);
+
+ Dec(i);
+ end;
+ if I > -1 then raise Exception.Create(RPS_TooManyParameters);
+ if res <> '-1' then
+ begin
+ pvar := CreateHeapVariant(FTypes[StrToInt(res)]);
+ ParamList.Add(pvar);
+ end else
+ pvar := nil;
+
+ RunProc(ParamList, ProcNo);
+
+ RaiseCurrentException;
+
+ if pvar <> nil then
+ begin
+ PIFVariantToVariant(PVar, Result);
+ end else
+ Result := Null;
+ finally
+ FreePIFVariantList(ParamList);
+ end;
+end;
+function TPSExec.RunProcPVar(var Params: array of Variant; const Procno: Cardinal): Variant;
+var
+ ParamList: TPSList;
+ ct: PIFTypeRec;
+ pvar: PPSVariant;
+ res, s: tbtString;
+ Proc: TPSInternalProcRec;
+ i: Longint;
+begin
+ if ProcNo >= FProcs.Count then raise Exception.Create(RPS_UnknownProcedure);
+ Proc := GetProcNo(ProcNo) as TPSInternalProcRec;
+ ParamList := TPSList.Create;
+ try
+ s := Proc.ExportDecl;
+ res := grfw(s);
+ i := High(Params);
+ while s <> '' do
+ begin
+ if i < 0 then raise Exception.Create(RPS_NotEnoughParameters);
+ ct := FTypes[StrToInt(copy(GRLW(s), 2, MaxInt))];
+ if ct = nil then raise Exception.Create(RPS_InvalidParameter);
+ pvar := CreateHeapVariant(ct);
+ ParamList.Add(pvar);
+
+ if not VariantToPIFVariant(Self, Params[i], pvar) then raise Exception.Create(RPS_InvalidParameter);
+
+ Dec(i);
+ end;
+ if I > -1 then raise Exception.Create(RPS_TooManyParameters);
+ if res <> '-1' then
+ begin
+ pvar := CreateHeapVariant(FTypes[StrToInt(res)]);
+ ParamList.Add(pvar);
+ end else
+ pvar := nil;
+
+ RunProc(ParamList, ProcNo);
+
+ RaiseCurrentException;
+
+ for i := 0 to Length(Params) - 1 do
+ PIFVariantToVariant(ParamList[i],
+ Params[(Length(Params) - 1) - i]);
+
+ if pvar <> nil then
+ begin
+ PIFVariantToVariant(PVar, Result);
+ end else
+ Result := Null;
+ finally
+ FreePIFVariantList(ParamList);
+ end;
+end;
+
+function TPSExec.RunProcPN(const Params: array of Variant; const ProcName: tbtString): Variant;
+var
+ ProcNo: Cardinal;
+begin
+ ProcNo := GetProc(ProcName);
+ if ProcNo = InvalidVal then
+ raise Exception.Create(RPS_UnknownProcedure);
+ Result := RunProcP(Params, ProcNo);
+end;
+
+
+function TPSExec.RunProc(Params: TPSList; ProcNo: Cardinal): Boolean;
+var
+ I, I2: Integer;
+ vnew, Vd: PIfVariant;
+ Cp: TPSInternalProcRec;
+ oldStatus: TPSStatus;
+ tmp: TObject;
+begin
+ if FStatus <> isNotLoaded then begin
+ if ProcNo >= FProcs.Count then begin
+ CMD_Err(erOutOfProcRange);
+ Result := False;
+ exit;
+ end;
+ if Params <> nil then
+ begin
+ for I := 0 to Params.Count - 1 do
+ begin
+ vd := Params[I];
+ if vd = nil then
+ begin
+ Result := False;
+ exit;
+ end;
+ vnew := FStack.PushType(FindType2(btPointer));
+ if vd.FType.BaseType = btPointer then
+ begin
+ PPSVariantPointer(vnew).DestType := PPSVariantPointer(vd).DestType;
+ PPSVariantPointer(vnew).DataDest := PPSVariantPointer(vd).DataDest;
+ end else begin
+ PPSVariantPointer(vnew).DestType := vd.FType;
+ PPSVariantPointer(vnew).DataDest := @PPSVariantData(vd).Data;
+ end;
+ end;
+ end;
+ I := FStack.Count;
+ Cp := FCurrProc;
+ oldStatus := FStatus;
+ if TPSProcRec(FProcs.Data^[ProcNo]).ClassType <> TPSExternalProcRec then
+ begin
+ vd := FStack.PushType(FReturnAddressType);
+ PPSVariantReturnAddress(vd).Addr.ProcNo := nil;
+ PPSVariantReturnAddress(vd).Addr.Position := FCurrentPosition;
+ PPSVariantReturnAddress(vd).Addr.StackBase := FCurrStackBase;
+ FCurrStackBase := FStack.Count - 1;
+ FCurrProc := FProcs.Data^[ProcNo];
+ FData := FCurrProc.Data;
+ FDataLength := FCurrProc.Length;
+ FCurrentPosition := 0;
+ FStatus := isPaused;
+ Result := RunScript;
+ end else
+ begin
+ try
+ Result := TPSExternalProcRec(FProcs.Data^[ProcNo]).ProcPtr(Self, TPSExternalProcRec(FProcs.Data^[ProcNo]), FGlobalVars, FStack);
+ if not Result then
+ begin
+ if ExEx = erNoError then
+ CMD_Err(erCouldNotCallProc);
+ end;
+ except
+ {$IFDEF DELPHI6UP}
+ Tmp := AcquireExceptionObject;
+ {$ELSE}
+ if RaiseList <> nil then
+ begin
+ Tmp := Exception(PRaiseFrame(RaiseList)^.ExceptObject);
+ PRaiseFrame(RaiseList)^.ExceptObject := nil;
+ end else
+ Tmp := nil;
+ {$ENDIF}
+ if Tmp <> nil then
+ begin
+ if Tmp is EPSException then
+ begin
+ Result := False;
+ ExceptionProc(EPSException(tmp).ProcNo, EPSException(tmp).ProcPos, erCustomError, tbtString(EPSException(tmp).Message), nil);
+ exit;
+ end else
+ if Tmp is EDivByZero then
+ begin
+ Result := False;
+ CMD_Err3(erDivideByZero, '', Tmp);
+ Exit;
+ end;
+ if Tmp is EZeroDivide then
+ begin
+ Result := False;
+ CMD_Err3(erDivideByZero, '', Tmp);
+ Exit;
+ end;
+ if Tmp is EMathError then
+ begin
+ Result := False;
+ CMD_Err3(erMathError, '', Tmp);
+ Exit;
+ end;
+ end;
+ if (Tmp <> nil) and (Tmp is Exception) then
+ CMD_Err3(erException, tbtString(Exception(Tmp).Message), Tmp) else
+ CMD_Err3(erException, '', Tmp);
+ Result := false;
+ exit;
+ end;
+ end;
+ if Cardinal(FStack.Count) > Cardinal(I) then
+ begin
+ vd := FStack[I];
+ if (vd <> nil) and (vd.FType = FReturnAddressType) then
+ begin
+ for i2 := FStack.Count - 1 downto I + 1 do
+ FStack.Pop;
+ FCurrentPosition := PPSVariantReturnAddress(vd).Addr.Position;
+ FCurrStackBase := PPSVariantReturnAddress(vd).Addr.StackBase;
+ FStack.Pop;
+ end;
+ end;
+ if Params <> nil then
+ begin
+ for I := Params.Count - 1 downto 0 do
+ begin
+ if FStack.Count = 0 then
+ Break
+ else
+ FStack.Pop;
+ end;
+ end;
+ FStatus := oldStatus;
+ FCurrProc := Cp;
+ if FCurrProc <> nil then
+ begin
+ FData := FCurrProc.Data;
+ FDataLength := FCurrProc.Length;
+ end;
+ end else begin
+ Result := False;
+ end;
+end;
+
+
+function TPSExec.FindType2(BaseType: TPSBaseType): PIFTypeRec;
+var
+ l: Cardinal;
+begin
+ FindType2 := FindType(0, BaseType, l);
+
+end;
+
+function TPSExec.FindType(StartAt: Cardinal; BaseType: TPSBaseType; var l: Cardinal): PIFTypeRec;
+var
+ I: Integer;
+ n: PIFTypeRec;
+begin
+ for I := StartAt to FTypes.Count - 1 do begin
+ n := FTypes[I];
+ if n.BaseType = BaseType then begin
+ l := I;
+ Result := n;
+ exit;
+ end;
+ end;
+ Result := nil;
+end;
+
+function TPSExec.GetTypeNo(l: Cardinal): PIFTypeRec;
+begin
+ Result := FTypes[l];
+end;
+
+function TPSExec.GetProc(const Name: tbtString): Cardinal;
+var
+ MM,
+ I: Longint;
+ n: PIFProcRec;
+ s: tbtString;
+begin
+ s := FastUpperCase(name);
+ MM := MakeHash(s);
+ for I := FProcs.Count - 1 downto 0 do begin
+ n := FProcs.Data^[I];
+ if (n.ClassType = TPSInternalProcRec) and (TPSInternalProcRec(n).ExportNameHash = MM) and (TPSInternalProcRec(n).ExportName = s) then begin
+ Result := I;
+ exit;
+ end else if (n.ClassType = TPSExternalProcRec) and (TPSExternalProcRec(n).Name = s) then
+ begin
+ Result := I;
+ exit;
+ end;
+ end;
+ Result := InvalidVal;
+end;
+
+function TPSExec.GetType(const Name: tbtString): Cardinal;
+var
+ MM,
+ I: Longint;
+ n: PIFTypeRec;
+ s: tbtString;
+begin
+ s := FastUpperCase(name);
+ MM := MakeHash(s);
+ for I := 0 to FTypes.Count - 1 do begin
+ n := FTypes.Data^[I];
+ if (Length(n.ExportName) <> 0) and (n.ExportNameHash = MM) and (n.ExportName = s) then begin
+ Result := I;
+ exit;
+ end;
+ end;
+ Result := InvalidVal;
+end;
+
+
+procedure TPSExec.AddResource(Proc, P: Pointer);
+var
+ Temp: PPSResource;
+begin
+ New(Temp);
+ Temp^.Proc := Proc;
+ Temp^.P := p;
+ FResources.Add(temp);
+end;
+
+procedure TPSExec.DeleteResource(P: Pointer);
+var
+ i: Longint;
+begin
+ for i := Longint(FResources.Count) -1 downto 0 do
+ begin
+ if PPSResource(FResources[I])^.P = P then
+ begin
+ FResources.Delete(I);
+ exit;
+ end;
+ end;
+end;
+
+function TPSExec.FindProcResource(Proc: Pointer): Pointer;
+var
+ I: Longint;
+ temp: PPSResource;
+begin
+ for i := Longint(FResources.Count) -1 downto 0 do
+ begin
+ temp := FResources[I];
+ if temp^.Proc = proc then
+ begin
+ Result := Temp^.P;
+ exit;
+ end;
+ end;
+ Result := nil;
+end;
+
+function TPSExec.IsValidResource(Proc, P: Pointer): Boolean;
+var
+ i: Longint;
+ temp: PPSResource;
+begin
+ for i := 0 to Longint(FResources.Count) -1 do
+ begin
+ temp := FResources[i];
+ if temp^.p = p then begin
+ result := temp^.Proc = Proc;
+ exit;
+ end;
+ end;
+ result := false;
+end;
+
+function TPSExec.FindProcResource2(Proc: Pointer;
+ var StartAt: Longint): Pointer;
+var
+ I: Longint;
+ temp: PPSResource;
+begin
+ if StartAt > longint(FResources.Count) -1 then
+ StartAt := longint(FResources.Count) -1;
+ for i := StartAt downto 0 do
+ begin
+ temp := FResources[I];
+ if temp^.Proc = proc then
+ begin
+ Result := Temp^.P;
+ StartAt := i -1;
+ exit;
+ end;
+ end;
+ StartAt := -1;
+ Result := nil;
+end;
+
+procedure TPSExec.RunLine;
+begin
+ if @FOnRunLine <> nil then
+ FOnRunLine(Self);
+end;
+
+procedure TPSExec.CMD_Err3(EC: TPSError; const Param: tbtString; ExObject: TObject);
+var
+ l: Longint;
+ C: Cardinal;
+begin
+ C := InvalidVal;
+ for l := FProcs.Count - 1 downto 0 do begin
+ if FProcs.Data^[l] = FCurrProc then begin
+ C := l;
+ break;
+ end;
+ end;
+ if @FOnException <> nil then
+ FOnException(Self, Ec, Param, ExObject, C, FCurrentPosition);
+ ExceptionProc(C, FCurrentPosition, EC, Param, ExObject);
+end;
+
+procedure TPSExec.AddSpecialProcImport(const FName: tbtString;
+ P: TPSOnSpecialProcImport; Tag: Pointer);
+var
+ N: PSpecialProc;
+begin
+ New(n);
+ n^.P := P;
+ N^.Name := FName;
+ n^.namehash := MakeHash(N^.Name);
+ n^.Tag := Tag;
+ FSpecialProcList.Add(n);
+end;
+
+function TPSExec.GetVar(const Name: tbtString): Cardinal;
+var
+ l: Longint;
+ h: longint;
+ s: tbtString;
+ p: PPSExportedVar;
+begin
+ s := FastUpperCase(name);
+ h := MakeHash(s);
+ for l := FExportedVars.Count - 1 downto 0 do
+ begin
+ p := FexportedVars.Data^[L];
+ if (p^.FNameHash = h) and(p^.FName=s) then
+ begin
+ Result := L;
+ exit;
+ end;
+ end;
+ Result := InvalidVal;
+end;
+
+function TPSExec.GetVarNo(C: Cardinal): PIFVariant;
+begin
+ Result := FGlobalVars[c];
+end;
+
+function TPSExec.GetVar2(const Name: tbtString): PIFVariant;
+begin
+ Result := GetVarNo(GetVar(Name));
+end;
+
+function TPSExec.GetProcNo(C: Cardinal): PIFProcRec;
+begin
+ Result := FProcs[c];
+end;
+
+function TPSExec.DoIntegerNot(Dta: Pointer; aType: TPSTypeRec): Boolean;
+begin
+ case aType.BaseType of
+ btU8: tbtu8(dta^) := not tbtu8(dta^);
+ btU16: tbtu16(dta^) := not tbtu16(dta^);
+ btU32: tbtu32(dta^) := not tbtu32(dta^);
+ btS8: tbts8(dta^) := not tbts8(dta^);
+ btS16: tbts16(dta^) := not tbts16(dta^);
+ btS32: tbts32(dta^) := not tbts32(dta^);
+ {$IFNDEF PS_NOINT64}
+ bts64: tbts64(dta^) := not tbts64(dta^);
+ {$ENDIF}
+ btVariant:
+ begin
+ try
+ Variant(dta^) := not Variant(dta^);
+ except
+ CMD_Err(erTypeMismatch);
+ Result := False;
+ exit;
+ end;
+ end;
+ else
+ begin
+ CMD_Err(erTypeMismatch);
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := True;
+end;
+
+type
+ TMyRunLine = procedure(Self: TPSExec);
+ TPSRunLine = procedure of object;
+
+function GetRunLine(FOnRunLine: TPSOnLineEvent; meth: TPSRunLine): TMyRunLine;
+begin
+ if (TMethod(Meth).Code = @TPSExec.RunLine) and (@FOnRunLine = nil) then
+ Result := nil
+ else
+ Result := TMethod(Meth).Code;
+end;
+
+function TPSExec.RunScript: Boolean;
+var
+ CalcType: Cardinal;
+ vd, vs, v3: TPSResultData;
+ vtemp: PIFVariant;
+ p: Cardinal;
+ P2: Longint;
+ u: PIFProcRec;
+ Cmd: Cardinal;
+ I: Longint;
+ pp: TPSExceptionHandler;
+ FExitPoint: Cardinal;
+ FOldStatus: TPSStatus;
+ Tmp: TObject;
+ btemp: Boolean;
+ CallRunline: TMyRunLine;
+begin
+ FExitPoint := InvalidVal;
+ if FStatus = isLoaded then
+ begin
+ for i := FExceptionStack.Count -1 downto 0 do
+ begin
+ pp := FExceptionStack.Data[i];
+ pp.Free;
+ end;
+ FExceptionStack.Clear;
+ end;
+ ExceptionProc(InvalidVal, InvalidVal, erNoError, '', nil);
+ RunScript := True;
+ FOldStatus := FStatus;
+ case FStatus of
+ isLoaded: begin
+ if FMainProc = InvalidVal then
+ begin
+ RunScript := False;
+ exit;
+ end;
+ FStatus := isRunning;
+ FCurrProc := FProcs.Data^[FMainProc];
+ if FCurrProc.ClassType = TPSExternalProcRec then begin
+ CMD_Err(erNoMainProc);
+ FStatus := isLoaded;
+ exit;
+ end;
+ FData := FCurrProc.Data;
+ FDataLength := FCurrProc.Length;
+ FCurrStackBase := InvalidVal;
+ FCurrentPosition := 0;
+ end;
+ isPaused: begin
+ FStatus := isRunning;
+ end;
+ else begin
+ RunScript := False;
+ exit;
+ end;
+ end;
+ CallRunLine := GetRunLine(FOnRunLine, Self.RunLine);
+ repeat
+ FStatus := isRunning;
+// Cmd := InvalidVal;
+ while FStatus = isRunning do
+ begin
+ if @CallRunLine <> nil then CallRunLine(Self);
+ if FCurrentPosition >= FDataLength then
+ begin
+ CMD_Err(erOutOfRange); // Error
+ break;
+ end;
+// if cmd <> invalidval then ProfilerExitProc(Cmd+1);
+ cmd := FData^[FCurrentPosition];
+// ProfilerEnterProc(Cmd+1);
+ Inc(FCurrentPosition);
+ case Cmd of
+ CM_A:
+ begin
+ if not ReadVariable(vd, True) then
+ break;
+ if vd.FreeType <> vtNone then
+ begin
+ if vd.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vd.P, vd.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ if not ReadVariable(vs, True) then
+ Break;
+ // nx change end
+{ if (vd.aType.BaseType = btClass) and (vs.aType.BaseType in [btS32]) then
+ DWord(vd.P^):=Dword(vs.P^)
+ else
+ if (vd.aType.BaseType in [btS32]) and (vs.aType.BaseType = btClass) then
+ DWord(vd.P^):=Dword(vs.P^)
+ else}
+ // nx change start
+ if not SetVariantValue(vd.P, vs.P, vd.aType, vs.aType) then
+ begin
+ if vs.FreeType <> vtNone then
+ begin
+ if vs.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vs.P, vs.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ end;
+ Break;
+ end;
+ if vs.FreeType <> vtNone then
+ begin
+ if vs.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vs.P, vs.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ end;
+ end;
+ CM_CA:
+ begin
+ if FCurrentPosition >= FDataLength then
+ begin
+ CMD_Err(erOutOfRange); // Error
+ break;
+ end;
+ calctype := FData^[FCurrentPosition];
+ Inc(FCurrentPosition);
+ if not ReadVariable(vd, True) then
+ break;
+ if vd.FreeType <> vtNone then
+ begin
+ if vd.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vd.P, vd.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ if not ReadVariable(vs, True) then
+ Break;
+ if not DoCalc(vd.P, vs.p, vd.aType, vs.aType, CalcType) then
+ begin
+ if vs.FreeType <> vtNone then
+ begin
+ if vs.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vs.P, vs.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ end;
+ Break;
+ end;
+ if vs.FreeType <> vtNone then
+ begin
+ if vs.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vs.P, vs.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ end;
+ end;
+ CM_P:
+ begin
+ if not ReadVariable(vs, True) then
+ Break;
+ vtemp := FStack.PushType(vs.aType);
+ vd.P := Pointer(IPointer(vtemp)+PointerSize);
+ vd.aType := Pointer(vtemp^);
+ vd.FreeType := vtNone;
+ if not SetVariantValue(Vd.P, vs.P, vd.aType, vs.aType) then
+ begin
+ if vs.FreeType <> vtnone then
+ begin
+ if vs.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vs.P, vs.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ end;
+ break;
+ end;
+ if vs.FreeType <> vtnone then
+ begin
+ if vs.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vs.P, vs.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ end;
+ end;
+ CM_PV:
+ begin
+ if not ReadVariable(vs, True) then
+ Break;
+ if vs.FreeType <> vtnone then
+ begin
+ FTempVars.Pop;
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ vtemp := FStack.PushType(FindType2(btPointer));
+ if vs.aType.BaseType = btPointer then
+ begin
+ PPSVariantPointer(vtemp).DataDest := Pointer(vs.p^);
+ PPSVariantPointer(vtemp).DestType := Pointer(Pointer(IPointer(vs.P)+PointerSize)^);
+ PPSVariantPointer(vtemp).FreeIt := False;
+ end
+ else
+ begin
+ PPSVariantPointer(vtemp).DataDest := vs.p;
+ PPSVariantPointer(vtemp).DestType := vs.aType;
+ PPSVariantPointer(vtemp).FreeIt := False;
+ end;
+ end;
+ CM_PO: begin
+ if FStack.Count = 0 then
+ begin
+ CMD_Err(erOutOfStackRange);
+ break;
+ end;
+ vtemp := FStack.Data^[FStack.Count -1];
+ if (vtemp = nil) or (vtemp.FType.BaseType = btReturnAddress) then
+ begin
+ CMD_Err(erOutOfStackRange);
+ break;
+ end;
+ FStack.Pop;
+(* Dec(FStack.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FStack.FCheckCount);
+ if FStack.FCheckCount > FMaxCheckCount then FStack.Recreate;
+ {$ENDIF}
+ FStack.FLength := Longint(IPointer(vtemp) - IPointer(FStack.DataPtr));
+ if TPSTypeRec(vtemp^).BaseType in NeedFinalization then
+ FinalizeVariant(Pointer(IPointer(vtemp)+PointerSize), Pointer(vtemp^));
+ if ((FStack.FCapacity - FStack.FLength) shr 12) > 2 then FStack.AdjustLength;*)
+ end;
+ Cm_C: begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ Break;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ p := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ p := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ if p >= FProcs.Count then begin
+ CMD_Err(erOutOfProcRange);
+ break;
+ end;
+ u := FProcs.Data^[p];
+ if u.ClassType = TPSExternalProcRec then begin
+ try
+ if not TPSExternalProcRec(u).ProcPtr(Self, TPSExternalProcRec(u), FGlobalVars, FStack) then begin
+ if ExEx = erNoError then
+ CMD_Err(erCouldNotCallProc);
+ Break;
+ end;
+ except
+ {$IFDEF DELPHI6UP}
+ Tmp := AcquireExceptionObject;
+ {$ELSE}
+ if RaiseList <> nil then
+ begin
+ Tmp := Exception(PRaiseFrame(RaiseList)^.ExceptObject);
+ PRaiseFrame(RaiseList)^.ExceptObject := nil;
+ end else
+ Tmp := nil;
+ {$ENDIF}
+ if Tmp <> nil then
+ begin
+ if Tmp is EPSException then
+ begin
+ ExceptionProc(EPSException(tmp).ProcNo, EPSException(tmp).ProcPos, erCustomError, tbtString(EPSException(tmp).Message), nil);
+ Break;
+ end else
+ if Tmp is EDivByZero then
+ begin
+ CMD_Err3(erDivideByZero, '', Tmp);
+ Break;
+ end;
+ if Tmp is EZeroDivide then
+ begin
+ CMD_Err3(erDivideByZero, '', Tmp);
+ Break;
+ end;
+ if Tmp is EMathError then
+ begin
+ CMD_Err3(erMathError, '', Tmp);
+ Break;
+ end;
+ end;
+ if (Tmp <> nil) and (Tmp is Exception) then
+ CMD_Err3(erException, tbtString(Exception(Tmp).Message), Tmp) else
+ CMD_Err3(erException, '', Tmp);
+ Break;
+ end;
+ end
+ else begin
+ Vtemp := Fstack.PushType(FReturnAddressType);
+ vd.P := Pointer(IPointer(VTemp)+PointerSize);
+ vd.aType := pointer(vtemp^);
+ vd.FreeType := vtNone;
+ PPSVariantReturnAddress(vtemp).Addr.ProcNo := FCurrProc;
+ PPSVariantReturnAddress(vtemp).Addr.Position := FCurrentPosition;
+ PPSVariantReturnAddress(vtemp).Addr.StackBase := FCurrStackBase;
+
+ FCurrStackBase := FStack.Count - 1;
+ FCurrProc := TPSInternalProcRec(u);
+ FData := FCurrProc.Data;
+ FDataLength := FCurrProc.Length;
+ FCurrentPosition := 0;
+ end;
+ end;
+ CM_PG:
+ begin
+ FStack.Pop;
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ Break;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ p := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ p := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ FCurrentPosition := FCurrentPosition + p;
+ end;
+ CM_P2G:
+ begin
+ FStack.Pop;
+ FStack.Pop;
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ Break;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ p := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ p := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ FCurrentPosition := FCurrentPosition + p;
+ end;
+ Cm_G:
+ begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ Break;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ p := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ p := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ FCurrentPosition := FCurrentPosition + p;
+ end;
+ Cm_CG:
+ begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ Break;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ p := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ p := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ btemp := true;
+ if not ReadVariable(vs, btemp) then
+ Break;
+ case Vs.aType.BaseType of
+ btU8: btemp := tbtu8(vs.p^) <> 0;
+ btS8: btemp := tbts8(vs.p^) <> 0;
+ btU16: btemp := tbtu16(vs.p^) <> 0;
+ btS16: btemp := tbts16(vs.p^) <> 0;
+ btU32: btemp := tbtu32(vs.p^) <> 0;
+ btS32: btemp := tbts32(vs.p^) <> 0;
+ else begin
+ CMD_Err(erInvalidType);
+ if vs.FreeType <> vtNone then
+ FTempVars.Pop;
+ break;
+ end;
+ end;
+ if vs.FreeType <> vtNone then
+ FTempVars.Pop;
+ if btemp then
+ FCurrentPosition := FCurrentPosition + p;
+ end;
+ Cm_CNG:
+ begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ Break;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ p := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ p := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ btemp := true;
+ if not ReadVariable(vs, BTemp) then
+ Break;
+ case Vs.aType.BaseType of
+ btU8: btemp := tbtu8(vs.p^) = 0;
+ btS8: btemp := tbts8(vs.p^) = 0;
+ btU16: btemp := tbtu16(vs.p^) = 0;
+ btS16: btemp := tbts16(vs.p^) = 0;
+ btU32: btemp := tbtu32(vs.p^) = 0;
+ btS32: btemp := tbts32(vs.p^) = 0;
+ else begin
+ CMD_Err(erInvalidType);
+ if vs.FreeType <> vtNone then
+ FTempVars.Pop;
+ break;
+ end;
+ end;
+ if vs.FreeType <> vtNone then
+ FTempVars.Pop;
+ if btemp then
+ FCurrentPosition := FCurrentPosition + p;
+ end;
+ Cm_R: begin
+ FExitPoint := FCurrentPosition -1;
+ P2 := 0;
+ if FExceptionStack.Count > 0 then
+ begin
+ pp := FExceptionStack.Data[FExceptionStack.Count -1];
+ while (pp.BasePtr = FCurrStackBase) or ((pp.BasePtr > FCurrStackBase) and (pp.BasePtr <> InvalidVal)) do
+ begin
+ if pp.StackSize < Cardinal(FStack.Count) then
+ begin
+ for p := Longint(FStack.count) -1 downto Longint(pp.StackSize) do
+ FStack.Pop
+ end;
+ FCurrStackBase := pp.BasePtr;
+ if pp.FinallyOffset <> InvalidVal then
+ begin
+ FCurrentPosition := pp.FinallyOffset;
+ pp.FinallyOffset := InvalidVal;
+ p2 := 1;
+ break;
+ end else if pp.Finally2Offset <> InvalidVal then
+ begin
+ FCurrentPosition := pp.Finally2Offset;
+ pp.Finally2Offset := InvalidVal;
+ p2 := 1;
+ break;
+ end else
+ begin
+ pp.Free;
+ FExceptionStack.DeleteLast;
+ if FExceptionStack.Count = 0 then break;
+ pp := FExceptionStack.Data[FExceptionStack.Count -1];
+ end;
+ end;
+ end;
+ if p2 = 0 then
+ begin
+ FExitPoint := InvalidVal;
+ if FCurrStackBase = InvalidVal then
+ begin
+ FStatus := FOldStatus;
+ break;
+ end;
+ for P2 := FStack.Count - 1 downto FCurrStackBase + 1 do
+ FStack.Pop;
+ if FCurrStackBase >= FStack.Count then
+ begin
+ FStatus := FOldStatus;
+ break;
+ end;
+ vtemp := FStack.Data[FCurrStackBase];
+ FCurrProc := PPSVariantReturnAddress(vtemp).Addr.ProcNo;
+ FCurrentPosition := PPSVariantReturnAddress(vtemp).Addr.Position;
+ FCurrStackBase := PPSVariantReturnAddress(vtemp).Addr.StackBase;
+ FStack.Pop;
+ if FCurrProc = nil then begin
+ FStatus := FOldStatus;
+ break;
+ end;
+ FData := FCurrProc.Data;
+ FDataLength := FCurrProc.Length;
+ end;
+ end;
+ Cm_Pt: begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ Break;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ p := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ p := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ if p > FTypes.Count then
+ begin
+ CMD_Err(erInvalidType);
+ break;
+ end;
+ FStack.PushType(FTypes.Data^[p]);
+ end;
+ cm_bn:
+ begin
+ if not ReadVariable(vd, True) then
+ Break;
+ if vd.FreeType <> vtNone then
+ FTempVars.Pop;
+ if not DoBooleanNot(Vd.P, vd.aType) then
+ break;
+ end;
+ cm_in:
+ begin
+ if not ReadVariable(vd, True) then
+ Break;
+ if vd.FreeType <> vtNone then
+ FTempVars.Pop;
+ if not DoIntegerNot(Vd.P, vd.aType) then
+ break;
+ end;
+ cm_vm:
+ begin
+ if not ReadVariable(vd, True) then
+ Break;
+ if vd.FreeType <> vtNone then
+ FTempVars.Pop;
+ if not DoMinus(Vd.P, vd.aType) then
+ break;
+ end;
+ cm_sf:
+ begin
+ if not ReadVariable(vd, True) then
+ Break;
+ if FCurrentPosition >= FDataLength then
+ begin
+ CMD_Err(erOutOfRange); // Error
+ if vd.FreeType <> vtNone then
+ FTempVars.Pop;
+ break;
+ end;
+ p := FData^[FCurrentPosition];
+ Inc(FCurrentPosition);
+ case Vd.aType.BaseType of
+ btU8: FJumpFlag := tbtu8(Vd.p^) <> 0;
+ btS8: FJumpFlag := tbts8(Vd.p^) <> 0;
+ btU16: FJumpFlag := tbtu16(Vd.p^) <> 0;
+ btS16: FJumpFlag := tbts16(Vd.p^) <> 0;
+ btU32: FJumpFlag := tbtu32(Vd.p^) <> 0;
+ btS32: FJumpFlag := tbts32(Vd.p^) <> 0;
+ else begin
+ CMD_Err(erInvalidType);
+ if vd.FreeType <> vtNone then
+ FTempVars.Pop;
+ break;
+ end;
+ end;
+ if p <> 0 then
+ FJumpFlag := not FJumpFlag;
+ if vd.FreeType <> vtNone then
+ FTempVars.Pop;
+ end;
+ cm_fg:
+ begin
+ if FCurrentPosition + 3 >= FDataLength then
+ begin
+ Cmd_Err(erOutOfRange);
+ Break;
+ end;
+ {$ifdef FPC_REQUIRES_PROPER_ALIGNMENT}
+ p := unaligned(Cardinal((@FData^[FCurrentPosition])^));
+ {$else}
+ p := Cardinal((@FData^[FCurrentPosition])^);
+ {$endif}
+ Inc(FCurrentPosition, 4);
+ if FJumpFlag then
+ FCurrentPosition := FCurrentPosition + p;
+ end;
+ cm_puexh:
+ begin
+ pp := TPSExceptionHandler.Create;
+ pp.CurrProc := FCurrProc;
+ pp.BasePtr :=FCurrStackBase;
+ pp.StackSize := FStack.Count;
+ if not ReadLong(pp.FinallyOffset) then begin
+ CMD_Err(erOutOfRange);
+ pp.Free;
+ Break;
+ end;
+ if not ReadLong(pp.ExceptOffset) then begin
+ CMD_Err(erOutOfRange);
+ pp.Free;
+ Break;
+ end;
+ if not ReadLong(pp.Finally2Offset) then begin
+ CMD_Err(erOutOfRange);
+ pp.Free;
+ Break;
+ end;
+ if not ReadLong(pp.EndOfBlock) then begin
+ CMD_Err(erOutOfRange);
+ pp.Free;
+ Break;
+ end;
+ if pp.FinallyOffset <> InvalidVal then
+ pp.FinallyOffset := pp.FinallyOffset + FCurrentPosition;
+ if pp.ExceptOffset <> InvalidVal then
+ pp.ExceptOffset := pp.ExceptOffset + FCurrentPosition;
+ if pp.Finally2Offset <> InvalidVal then
+ pp.Finally2Offset := pp.Finally2Offset + FCurrentPosition;
+ if pp.EndOfBlock <> InvalidVal then
+ pp.EndOfBlock := pp.EndOfBlock + FCurrentPosition;
+ if ((pp.FinallyOffset <> InvalidVal) and (pp.FinallyOffset >= FDataLength)) or
+ ((pp.ExceptOffset <> InvalidVal) and (pp.ExceptOffset >= FDataLength)) or
+ ((pp.Finally2Offset <> InvalidVal) and (pp.Finally2Offset >= FDataLength)) or
+ ((pp.EndOfBlock <> InvalidVal) and (pp.EndOfBlock >= FDataLength)) then
+ begin
+ CMD_Err(ErOutOfRange);
+ pp.Free;
+ Break;
+ end;
+ FExceptionStack.Add(pp);
+ end;
+ cm_poexh:
+ begin
+ if FCurrentPosition >= FDataLength then
+ begin
+ CMD_Err(erOutOfRange); // Error
+ break;
+ end;
+ p := FData^[FCurrentPosition];
+ Inc(FCurrentPosition);
+ case p of
+ 2:
+ begin
+ if (FExceptionStack.Count = 0) then
+ begin
+ cmd_err(ErOutOfRange);
+ Break;
+ end;
+ pp := FExceptionStack.Data^[FExceptionStack.Count -1];
+ if pp = nil then begin
+ cmd_err(ErOutOfRange);
+ Break;
+ end;
+ pp.ExceptOffset := InvalidVal;
+ if pp.Finally2Offset <> InvalidVal then
+ begin
+ FCurrentPosition := pp.Finally2Offset;
+ pp.Finally2Offset := InvalidVal;
+ end else begin
+ p := pp.EndOfBlock;
+ pp.Free;
+ FExceptionStack.DeleteLast;
+ if FExitPoint <> InvalidVal then
+ begin
+ FCurrentPosition := FExitPoint;
+ end else begin
+ FCurrentPosition := p;
+ end;
+ end;
+ end;
+ 0:
+ begin
+ pp := FExceptionStack.Data^[FExceptionStack.Count -1];
+ if pp = nil then begin
+ cmd_err(ErOutOfRange);
+ Break;
+ end;
+ if pp.FinallyOffset <> InvalidVal then
+ begin
+ FCurrentPosition := pp.FinallyOffset;
+ pp.FinallyOffset := InvalidVal;
+ end else if pp.Finally2Offset <> InvalidVal then
+ begin
+ FCurrentPosition := pp.Finally2Offset;
+ pp.ExceptOffset := InvalidVal;
+ end else begin
+ p := pp.EndOfBlock;
+ pp.Free;
+ FExceptionStack.DeleteLast;
+ if ExEx <> eNoError then
+ begin
+ Tmp := ExObject;
+ ExObject := nil;
+ ExceptionProc(ExProc, ExPos, ExEx, ExParam, Tmp);
+ end else
+ if FExitPoint <> InvalidVal then
+ begin
+ FCurrentPosition := FExitPoint;
+ end else begin
+ FCurrentPosition := p;
+ end;
+ end;
+ end;
+ 1:
+ begin
+ pp := FExceptionStack.Data^[FExceptionStack.Count -1];
+ if pp = nil then begin
+ cmd_err(ErOutOfRange);
+ Break;
+ end;
+ if (ExEx <> ENoError) and (pp.ExceptOffset <> InvalidVal) and (pp.ExceptOffset <> InvalidVal -1) then
+ begin
+ FCurrentPosition := pp.ExceptOffset;
+ pp.ExceptOffset := Cardinal(InvalidVal -1);
+ pp.ExceptionData := ExEx;
+ pp.ExceptionObject := ExObject;
+ pp.ExceptionParam := ExParam;
+ ExEx := ErNoError;
+ ExObject := nil;
+ end else if (pp.Finally2Offset <> InvalidVal) then
+ begin
+ FCurrentPosition := pp.Finally2Offset;
+ pp.Finally2Offset := InvalidVal;
+ end else begin
+ p := pp.EndOfBlock;
+ pp.Free;
+ FExceptionStack.DeleteLast;
+ if (ExEx <> eNoError) and (p <> InvalidVal) then
+ begin
+ Tmp := ExObject;
+ ExObject := nil;
+ ExceptionProc(ExProc, ExPos, ExEx, ExParam, Tmp);
+ end else
+ if FExitPoint <> InvalidVal then
+ begin
+ FCurrentPosition := FExitPoint;
+ end else begin
+ FCurrentPosition := p;
+ end;
+ end;
+ end;
+ 3:
+ begin
+ pp := FExceptionStack.Data^[FExceptionStack.Count -1];
+ if pp = nil then begin
+ cmd_err(ErOutOfRange);
+ Break;
+ end;
+ p := pp.EndOfBlock;
+ pp.Free;
+ FExceptionStack.DeleteLast;
+ if ExEx <> eNoError then
+ begin
+ Tmp := ExObject;
+ ExObject := nil;
+ ExceptionProc(ExProc, ExPos, ExEx, ExParam, Tmp);
+ end else
+ if FExitPoint <> InvalidVal then
+ begin
+ FCurrentPosition := FExitPoint;
+ end else begin
+ FCurrentPosition := p;
+ end;
+ end;
+ end;
+ end;
+ cm_spc:
+ begin
+ if not ReadVariable(vd, False) then
+ Break;
+ if vd.FreeType <> vtNone then
+ begin
+ FTempVars.Pop;
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ if (Vd.aType.BaseType <> btPointer) then
+ begin
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ if not ReadVariable(vs, False) then
+ Break;
+ if Pointer(Pointer(IPointer(vD.P)+PointerSize2)^) <> nil then
+ DestroyHeapVariant2(Pointer(vD.P^), Pointer(Pointer(IPointer(vd.P)+PointerSize)^));
+ if vs.aType.BaseType = btPointer then
+ begin
+ if Pointer(vs.P^) <> nil then
+ begin
+ Pointer(vd.P^) := CreateHeapVariant2(Pointer(Pointer(IPointer(vs.P) + PointerSize)^));
+ Pointer(Pointer(IPointer(vd.P) + PointerSize)^) := Pointer(Pointer(IPointer(vs.P) + PointerSize)^);
+ Pointer(Pointer(IPointer(vd.P) + PointerSize2)^) := Pointer(1);
+ if not CopyArrayContents(Pointer(vd.P^), Pointer(vs.P^), 1, Pointer(Pointer(IPointer(vd.P) + PointerSize)^)) then
+ begin
+ if vs.FreeType <> vtNone then
+ FTempVars.Pop;
+ CMD_Err(ErTypeMismatch);
+ break;
+ end;
+ end else
+ begin
+ Pointer(vd.P^) := nil;
+ Pointer(Pointer(IPointer(vd.P) + PointerSize)^) := nil;
+ Pointer(Pointer(IPointer(vd.P) + PointerSize2)^) := nil;
+ end;
+ end else begin
+ Pointer(vd.P^) := CreateHeapVariant2(vs.aType);
+ Pointer(Pointer(IPointer(vd.P) + PointerSize)^) := vs.aType;
+ LongBool(Pointer(IPointer(vd.P) + PointerSize2)^) := true;
+ if not CopyArrayContents(Pointer(vd.P^), vs.P, 1, vs.aType) then
+ begin
+ if vs.FreeType <> vtNone then
+ FTempVars.Pop;
+ CMD_Err(ErTypeMismatch);
+ break;
+ end;
+ end;
+ if vs.FreeType <> vtNone then
+ FTempVars.Pop;
+
+ end;
+ cm_nop:;
+ cm_dec:
+ begin
+ if not ReadVariable(vd, True) then
+ Break;
+ if vd.FreeType <> vtNone then
+ begin
+ FTempVars.Pop;
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ case vd.aType.BaseType of
+ btu8: dec(tbtu8(vd.P^));
+ bts8: dec(tbts8(vd.P^));
+ btu16: dec(tbtu16(vd.P^));
+ bts16: dec(tbts16(vd.P^));
+ btu32: dec(tbtu32(vd.P^));
+ bts32: dec(tbts32(vd.P^));
+{$IFNDEF PS_NOINT64}
+ bts64: dec(tbts64(vd.P^));
+{$ENDIF}
+ else
+ begin
+ CMD_Err(ErTypeMismatch);
+ Break;
+ end;
+ end;
+ end;
+ cm_inc:
+ begin
+ if not ReadVariable(vd, True) then
+ Break;
+ if vd.FreeType <> vtNone then
+ begin
+ FTempVars.Pop;
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ case vd.aType.BaseType of
+ btu8: Inc(tbtu8(vd.P^));
+ bts8: Inc(tbts8(vd.P^));
+ btu16: Inc(tbtu16(vd.P^));
+ bts16: Inc(tbts16(vd.P^));
+ btu32: Inc(tbtu32(vd.P^));
+ bts32: Inc(tbts32(vd.P^));
+{$IFNDEF PS_NOINT64}
+ bts64: Inc(tbts64(vd.P^));
+{$ENDIF}
+ else
+ begin
+ CMD_Err(ErTypeMismatch);
+ Break;
+ end;
+ end;
+ end;
+ cm_sp:
+ begin
+ if not ReadVariable(vd, False) then
+ Break;
+ if vd.FreeType <> vtNone then
+ begin
+ FTempVars.Pop;
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ if (Vd.aType.BaseType <> btPointer) then
+ begin
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ if not ReadVariable(vs, False) then
+ Break;
+ if vs.FreeType <> vtNone then
+ begin
+ FTempVars.Pop;
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ if vs.aType.BaseType = btPointer then
+ begin
+ Pointer(vd.P^) := Pointer(vs.p^);
+ Pointer(Pointer(IPointer(vd.P)+PointerSize)^) := Pointer(Pointer(IPointer(vs.P)+PointerSize)^);
+ end
+ else
+ begin
+ Pointer(vd.P^) := vs.P;
+ Pointer(Pointer(IPointer(vd.P)+PointerSize)^) := vs.aType;
+ end;
+ end;
+ Cm_cv:
+ begin
+ if not ReadVariable(vd, True) then
+ Break;
+ if vd.aType.BaseType <> btProcPtr then
+ begin
+ if vd.FreeType <> vtNone then
+ FTempVars.Pop;
+ CMD_Err(ErTypeMismatch);
+ break;
+ end;
+ p := tbtu32(vd.P^);
+ if vd.FreeType <> vtNone then
+ FTempVars.Pop;
+ if (p = 0) and (Pointer(Pointer(IPointer(vd.p)+PointerSize2)^) <> nil) then
+ begin
+ if not InvokeExternalMethod(TPSTypeRec_ProcPtr(vd.aType), Pointer(Pointer(IPointer(vd.p)+PointerSize)^), Pointer(Pointer(IPointer(vd.p)+PointerSize2)^)) then
+ Break;
+ end else begin
+ if (p >= FProcs.Count) or (p = FMainProc) then begin
+ CMD_Err(erOutOfProcRange);
+ break;
+ end;
+ u := FProcs.Data^[p];
+ if u.ClassType = TPSExternalProcRec then begin
+ try
+ if not TPSExternalProcRec(u).ProcPtr(Self, TPSExternalProcRec(u), FGlobalVars, FStack) then begin
+ if ExEx = erNoError then
+ CMD_Err(erCouldNotCallProc);
+ Break;
+ end;
+ except
+ {$IFDEF DELPHI6UP}
+ Tmp := AcquireExceptionObject;
+ {$ELSE}
+ if RaiseList <> nil then
+ begin
+ Tmp := Exception(PRaiseFrame(RaiseList)^.ExceptObject);
+ PRaiseFrame(RaiseList)^.ExceptObject := nil;
+ end else
+ Tmp := nil;
+ {$ENDIF}
+ if Tmp <> nil then
+ begin
+ if Tmp is EPSException then
+ begin
+ ExceptionProc(EPSException(tmp).ProcNo, EPSException(tmp).ProcPos, erCustomError, tbtString(EPSException(tmp).Message), nil);
+ break;
+ end else
+ if Tmp is EDivByZero then
+ begin
+ CMD_Err3(erDivideByZero, '', Tmp);
+ break;
+ end;
+ if Tmp is EZeroDivide then
+ begin
+ CMD_Err3(erDivideByZero, '', Tmp);
+ break;
+ end;
+ if Tmp is EMathError then
+ begin
+ CMD_Err3(erMathError, '', Tmp);
+ break;
+ end;
+ end;
+ if (Tmp <> nil) and (Tmp is Exception) then
+ CMD_Err3(erException, tbtString(Exception(Tmp).Message), Tmp) else
+ CMD_Err3(erException, '', Tmp);
+ Break;
+ end;
+ end
+ else begin
+ vtemp := FStack.PushType(FReturnAddressType);
+ PPSVariantReturnAddress(vtemp).Addr.ProcNo := FCurrProc;
+ PPSVariantReturnAddress(vtemp).Addr.Position := FCurrentPosition;
+ PPSVariantReturnAddress(vtemp).Addr.StackBase := FCurrStackBase;
+ FCurrStackBase := FStack.Count - 1;
+ FCurrProc := TPSInternalProcRec(u);
+ FData := FCurrProc.Data;
+ FDataLength := FCurrProc.Length;
+ FCurrentPosition := 0;
+ end;
+ end;
+ end;
+ CM_CO:
+ begin
+ if FCurrentPosition >= FDataLength then
+ begin
+ CMD_Err(erOutOfRange); // Error
+ break;
+ end;
+ calctype := FData^[FCurrentPosition];
+ Inc(FCurrentPosition);
+ if not ReadVariable(v3, True) then
+ Break;
+ if v3.FreeType <> vtNone then
+ begin
+ if v3.aType.BaseType in NeedFinalization then
+ FinalizeVariant(v3.P, v3.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ CMD_Err(erInvalidOpcodeParameter);
+ break;
+ end;
+ if not ReadVariable(vs, True) then
+ Break;
+ if not ReadVariable(vd, True) then
+ begin
+ if vs.FreeType <> vtNone then
+ begin
+ if vs.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vs.P, vs.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ end;
+ Break;
+ end;
+ DoBooleanCalc(Vs.P, Vd.P, v3.P, vs.aType, vd.aType, v3.aType, CalcType);
+ if vd.FreeType <> vtNone then
+ begin
+ if vd.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vd.P, vd.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ end;
+ if vs.FreeType <> vtNone then
+ begin
+ if vs.aType.BaseType in NeedFinalization then
+ FinalizeVariant(vs.P, vs.aType);
+ p := IPointer(FTempVars.Data^[FtempVars.Count-1]) - IPointer(FtempVars.DataPtr);
+ Dec(FTempVars.FCount);
+ {$IFNDEF PS_NOSMARTLIST}
+ Inc(FTempVars.FCheckCount);
+ if FTempVars.FCheckCount > FMaxCheckCount then FTempVars.Recreate;
+ {$ENDIF}
+ FTempVars.FLength := P;
+ if ((FTempVars.FCapacity - FTempVars.FLength) shr 12) > 2 then FTempVars.AdjustLength;
+ end;
+ end;
+
+ else
+ CMD_Err(erInvalidOpcode); // Error
+ end;
+ end;
+// if cmd <> invalidval then ProfilerExitProc(Cmd+1);
+// if ExEx <> erNoError then FStatus := FOldStatus;
+ until (FExceptionStack.Count = 0) or (Fstatus <> IsRunning);
+ if FStatus = isLoaded then begin
+ for I := Longint(FStack.Count) - 1 downto 0 do
+ FStack.Pop;
+ FStack.Clear;
+ if FCallCleanup then Cleanup;
+ end;
+ Result := ExEx = erNoError;
+end;
+
+function NVarProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ tmp: TPSVariantIFC;
+begin
+ case Longint(p.Ext1) of
+ 0:
+ begin
+ if @Caller.FOnSetNVariant = nil then begin Result := False; exit; end;
+ tmp := NewTPSVariantIFC(Stack.Items[Stack.Count - 2], True);
+ if (Tmp.Dta = nil) or (tmp.aType.BaseType <> btVariant) then begin Result := False; exit; end;
+ Caller.FOnSetNVariant(Caller, Stack.GetAnsiString(-1), Variant(tmp.Dta^));
+ Result := true;
+ end;
+ 1:
+ begin
+ if @Caller.FOnGetNVariant = nil then begin Result := False; exit; end;
+ tmp := NewTPSVariantIFC(Stack.Items[Stack.Count - 1], False);
+ if (Tmp.Dta = nil) or (tmp.aType.BaseType <> btVariant) then begin Result := False; exit; end;
+ Variant(tmp.Dta^) := Caller.FOnGetNVariant(Caller, Stack.GetAnsiString(-2));
+ Result := true;
+ end;
+ else
+ Result := False;
+ end;
+end;
+
+function DefProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ temp: TPSVariantIFC;
+ I: Longint;
+ b: Boolean;
+ pex: TPSExceptionHandler;
+ Tmp: TObject;
+begin
+ case Longint(p.Ext1) of
+ 0: Stack.SetAnsiString(-1, IntToStr(Stack.{$IFNDEF PS_NOINT64}GetInt64{$ELSE}GetInt{$ENDIF}(-2))); // inttostr
+ 1: Stack.SetInt(-1, StrToInt(Stack.GetAnsiString(-2))); // strtoint
+ 2: Stack.SetInt(-1, StrToIntDef(Stack.GetAnsiString(-2), Stack.GetInt(-3))); // strtointdef
+ 3:
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btUnicodeString then
+ Stack.SetInt(-1, Pos(Stack.GetUnicodeString(-2), Stack.GetUnicodeString(-3)))// pos
+ else
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btWideString then
+ Stack.SetInt(-1, Pos(Stack.GetWideString(-2), Stack.GetWideString(-3)))// pos
+ else
+ Stack.SetInt(-1, Pos(Stack.GetAnsiString(-2), Stack.GetAnsiString(-3)));// pos
+ 4:
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btWideString then
+ Stack.SetWideString(-1, Copy(Stack.GetWideString(-2), Stack.GetInt(-3), Stack.GetInt(-4))) // copy
+ else
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btUnicodeString then
+ Stack.SetUnicodeString(-1, Copy(Stack.GetUnicodeString(-2), Stack.GetInt(-3), Stack.GetInt(-4))) // copy
+ else
+ Stack.SetAnsiString(-1, Copy(Stack.GetAnsiString(-2), Stack.GetInt(-3), Stack.GetInt(-4))); // copy
+ 5: //delete
+ begin
+ temp := NewTPSVariantIFC(Stack[Stack.Count -1], True);
+ if (temp.Dta <> nil) and (temp.aType.BaseType = btUnicodeString) then
+ begin
+ Delete(tbtUnicodeString(temp.Dta^), Stack.GetInt(-2), Stack.GetInt(-3));
+ end else
+ if (temp.Dta <> nil) and (temp.aType.BaseType = btWideString) then
+ begin
+ Delete(tbtwidestring(temp.Dta^), Stack.GetInt(-2), Stack.GetInt(-3));
+ end else begin
+ if (temp.Dta = nil) or (temp.aType.BaseType <> btString) then
+ begin
+ Result := False;
+ exit;
+ end;
+ Delete(tbtstring(temp.Dta^), Stack.GetInt(-2), Stack.GetInt(-3));
+ end;
+ end;
+ 6: // insert
+ begin
+ temp := NewTPSVariantIFC(Stack[Stack.Count -2], True);
+ if (temp.Dta <> nil) and (temp.aType.BaseType = btUnicodeString) then begin
+ Insert(Stack.GetUnicodeString(-1), tbtUnicodeString(temp.Dta^), Stack.GetInt(-3));
+ end else if (temp.Dta <> nil) and (temp.aType.BaseType = btWideString) then begin
+ Insert(Stack.GetWideString(-1), tbtwidestring(temp.Dta^), Stack.GetInt(-3));
+ end else begin
+ if (temp.Dta = nil) or (temp.aType.BaseType <> btString) then
+ begin
+ Result := False;
+ exit;
+ end;
+ Insert(Stack.GetAnsiString(-1), tbtstring(temp.Dta^), Stack.GetInt(-3));
+ end;
+ end;
+ 7: // StrGet
+ begin
+ temp := NewTPSVariantIFC(Stack[Stack.Count -2], True);
+ if (temp.Dta = nil) or (temp.aType.BaseType <> btString) then
+ begin
+ Result := False;
+ exit;
+ end;
+ I := Stack.GetInt(-3);
+ if (i<1) or (i>length(tbtstring(temp.Dta^))) then
+ begin
+ Caller.CMD_Err2(erCustomError, tbtString(RPS_OutOfStringRange));
+ Result := False;
+ exit;
+ end;
+ Stack.SetInt(-1,Ord(tbtstring(temp.Dta^)[i]));
+ end;
+ 8: // StrSet
+ begin
+ temp := NewTPSVariantIFC(Stack[Stack.Count -3], True);
+ if (temp.Dta = nil) or (temp.aType.BaseType <> btString) then
+ begin
+ Result := False;
+ exit;
+ end;
+ I := Stack.GetInt(-2);
+ if (i<1) or (i>length(tbtstring(temp.Dta^))) then
+ begin
+ Caller.CMD_Err2(erCustomError, tbtString(RPS_OutOfStringRange));
+ Result := True;
+ exit;
+ end;
+ tbtstring(temp.Dta^)[i] := tbtchar(Stack.GetInt(-1));
+ end;
+ 10:
+{$IFDEF DELPHI2009UP}
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btUnicodeString then
+ Stack.SetUnicodeString(-1, UpperCase(Stack.GetUnicodeString(-2))) // Uppercase
+ else
+{$ENDIF}
+ if (Stack.GetItem(Stack.Count -2)^.FType.BaseType = btWideString) or
+ (Stack.GetItem(Stack.Count -2)^.FType.BaseType = btUnicodeString) then
+ Stack.SetWideString(-1, WideUpperCase(Stack.GetWideString(-2))) // Uppercase
+ else
+ Stack.SetAnsiString(-1, FastUppercase(Stack.GetAnsiString(-2))); // Uppercase
+ 11:
+{$IFDEF DELPHI2009UP}
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btUnicodeString then
+ Stack.SetUnicodeString(-1, LowerCase(Stack.GetUnicodeString(-2))) // Uppercase
+ else
+{$ENDIF}
+ if (Stack.GetItem(Stack.Count -2)^.FType.BaseType = btWideString) or
+ (Stack.GetItem(Stack.Count -2)^.FType.BaseType = btUnicodeString) then
+ Stack.SetWideString(-1, WideLowerCase(Stack.GetWideString(-2))) // Uppercase
+ else
+ Stack.SetAnsiString(-1, FastLowercase(Stack.GetAnsiString(-2)));// LowerCase
+ 12:
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btUnicodeString then
+ Stack.SetUnicodeString(-1, SysUtils.Trim(Stack.GetUnicodestring(-2))) // Uppercase
+ else if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btWideString then
+ Stack.SetWideString(-1, SysUtils.Trim(Stack.GetWideString(-2))) // Uppercase
+ else
+ Stack.SetAnsiString(-1, Trim(Stack.GetAnsiString(-2)));// Trim
+ 13: Stack.SetInt(-1, Length(Stack.GetAnsiString(-2))); // Length
+ 14: // SetLength
+ begin
+ temp := NewTPSVariantIFC(Stack[Stack.Count -1], True);
+ if (temp.Dta = nil) or (temp.aType.BaseType <> btString) then
+ begin
+ Result := False;
+ exit;
+ end;
+ SetLength(tbtstring(temp.Dta^), STack.GetInt(-2));
+ end;
+ 15: Stack.SetReal(-1, Sin(Stack.GetReal(-2))); // Sin
+ 16: Stack.SetReal(-1, Cos(Stack.GetReal(-2))); // Cos
+ 17: Stack.SetReal(-1, SQRT(Stack.GetReal(-2))); // Sqrt
+ 18: Stack.SetInt(-1, Round(Stack.GetReal(-2))); // Round
+ 19: Stack.SetInt(-1, Trunc(Stack.GetReal(-2))); // Trunc
+ 20: Stack.SetReal(-1, Int(Stack.GetReal(-2))); // Int
+ 21: Stack.SetReal(-1, Pi); // Pi
+ 22: Stack.SetReal(-1, Abs(Stack.GetReal(-2))); // Abs
+ 23: Stack.SetReal(-1, StrToFloat(Stack.GetAnsiString(-2))); // StrToFloat
+ 24: Stack.SetAnsiString(-1, FloatToStr(Stack.GetReal(-2)));// FloatToStr
+ 25:
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btUnicodeString then
+ Stack.SetUnicodeString(-1, upadL(Stack.GetUnicodeString(-2), Stack.GetInt(-3))) // PadL
+ else
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btWideString then
+ Stack.SetWideString(-1, wPadL(Stack.GetWideString(-2), Stack.GetInt(-3))) // PadL
+ else
+ Stack.SetAnsiString(-1, PadL(Stack.GetAnsiString(-2), Stack.GetInt(-3))); // PadL
+ 26:
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btUnicodeString then
+ Stack.SetUnicodeString(-1, uPadR(Stack.GetUnicodeString(-2), Stack.GetInt(-3))) // PadR
+ else
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btWideString then
+ Stack.SetWideString(-1, wPadR(Stack.GetWideString(-2), Stack.GetInt(-3))) // PadR
+ else
+ Stack.SetAnsiString(-1, PadR(Stack.GetAnsiString(-2), Stack.GetInt(-3))); // PadR
+ 27:
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btUnicodeString then
+ Stack.SetUnicodeString(-1, uPadZ(Stack.GetUnicodeString(-2), Stack.GetInt(-3)))// PadZ
+ else
+ if Stack.GetItem(Stack.Count -2)^.FType.BaseType = btWideString then
+ Stack.SetWideString(-1, wPadZ(Stack.GetWideString(-2), Stack.GetInt(-3)))// PadZ
+ else
+ Stack.SetAnsiString(-1, PadZ(Stack.GetAnsiString(-2), Stack.GetInt(-3)));// PadZ
+ 28: Stack.SetAnsiString(-1, StringOfChar(tbtChar(Stack.GetInt(-2)), Stack.GetInt(-3))); // Replicate/StrOfChar
+ 29: // Assigned
+ begin
+ temp := NewTPSVariantIFC(Stack[Stack.Count -2], True);
+ if Temp.dta = nil then
+ begin
+ Result := False;
+ exit;
+ end;
+ case temp.aType.BaseType of
+ btU8, btS8: b := tbtu8(temp.dta^) <> 0;
+ btU16, btS16: b := tbtu16(temp.dta^) <> 0;
+ btU32, btS32: b := tbtu32(temp.dta^) <> 0;
+ btString, btPChar: b := tbtstring(temp.dta^) <> '';
+{$IFNDEF PS_NOWIDESTRING}
+ btWideString: b := tbtwidestring(temp.dta^)<> '';
+ btUnicodeString: b := tbtUnicodeString(temp.dta^)<> '';
+{$ENDIF}
+ btArray, btClass{$IFNDEF PS_NOINTERFACES}, btInterface{$ENDIF}: b := Pointer(temp.dta^) <> nil;
+ else
+ Result := False;
+ Exit;
+ end;
+ if b then
+ Stack.SetInt(-1, 1)
+ else
+ Stack.SetInt(-1, 0);
+ end;
+ 30:
+ begin {RaiseLastException}
+ if (Caller.FExceptionStack.Count > 0) then begin
+ pex := Caller.FExceptionStack.Data[Caller.fExceptionStack.Count -1];
+ if pex.ExceptOffset = Cardinal(InvalidVal -1) then begin
+ Tmp := pex.ExceptionObject;
+ pex.ExceptionObject := nil;
+ Caller.ExceptionProc(Caller.ExProc, pex.ExceptOffset, pex.ExceptionData, pex.ExceptionParam, tmp);
+ end;
+ end;
+ end;
+ 31: Caller.CMD_Err2(TPSError(Stack.GetInt(-1)), Stack.GetAnsiString(-2)); {RaiseExeption}
+ 32: Stack.SetInt(-1, Ord(Caller.LastEx)); {ExceptionType}
+ 33: Stack.SetAnsiString(-1, Caller.LastExParam); {ExceptionParam}
+ 34: Stack.SetInt(-1, Caller.LastExProc); {ExceptionProc}
+ 35: Stack.SetInt(-1, Caller.LastExPos); {ExceptionPos}
+ 36: Stack.SetAnsiString(-1, PSErrorToString(TPSError(Stack.GetInt(-2)), Stack.GetAnsiString(-3))); {ExceptionToString}
+ 37: Stack.SetAnsiString(-1, tbtString(AnsiUpperCase(string(Stack.GetAnsiString(-2))))); // AnsiUppercase
+ 38: Stack.SetAnsiString(-1, tbtString(AnsiLowercase(string(Stack.GetAnsiString(-2))))); // AnsiLowerCase
+{$IFNDEF PS_NOINT64}
+ 39: Stack.SetInt64(-1, StrToInt64(string(Stack.GetAnsiString(-2)))); // StrToInt64
+ 40: Stack.SetAnsiString(-1, tbtstring(SysUtils.IntToStr(Stack.GetInt64(-2))));// Int64ToStr
+{$ENDIF}
+ 41: // sizeof
+ begin
+ temp := NewTPSVariantIFC(Stack[Stack.Count -2], False);
+ if Temp.aType = nil then
+ Stack.SetInt(-1, 0)
+ else
+ Stack.SetInt(-1, Temp.aType.RealSize)
+ end;
+{$IFNDEF PS_NOWIDESTRING}
+ 42: // WStrGet
+ begin
+ temp := NewTPSVariantIFC(Stack[Stack.Count -2], True);
+ if temp.dta = nil then begin
+ result := false;
+ exit;
+ end;
+ case temp.aType.BaseType of
+ btWideString:
+ begin
+ I := Stack.GetInt(-3);
+ if (i<1) or (i>length(tbtwidestring(temp.Dta^))) then
+ begin
+ Caller.CMD_Err2(erCustomError, tbtString(RPS_OutOfStringRange));
+ Result := False;
+ exit;
+ end;
+ Stack.SetInt(-1,Ord(tbtwidestring(temp.Dta^)[i]));
+ end;
+ btUnicodeString:
+ begin
+ I := Stack.GetInt(-3);
+ if (i<1) or (i>length(tbtUnicodeString(temp.Dta^))) then
+ begin
+ Caller.CMD_Err2(erCustomError, tbtString(RPS_OutOfStringRange));
+ Result := False;
+ exit;
+ end;
+ Stack.SetInt(-1,Ord(tbtUnicodeString(temp.Dta^)[i]));
+ end;
+
+ else
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+ 43: // WStrSet
+ begin
+ temp := NewTPSVariantIFC(Stack[Stack.Count -3], True);
+ if (temp.Dta = nil) then
+ begin
+ Result := False;
+ exit;
+ end;
+ case temp.aType.BaseType of
+ btWideString:
+ begin
+ I := Stack.GetInt(-2);
+ if (i<1) or (i>length(tbtWidestring(temp.Dta^))) then
+ begin
+ Caller.CMD_Err2(erCustomError, tbtString(RPS_OutOfStringRange));
+ Result := True;
+ exit;
+ end;
+ tbtWidestring(temp.Dta^)[i] := WideChar(Stack.GetInt(-1));
+ end;
+
+ btUnicodeString:
+ begin
+ I := Stack.GetInt(-2);
+ if (i<1) or (i>length(tbtunicodestring(temp.Dta^))) then
+ begin
+ Caller.CMD_Err2(erCustomError, tbtString(RPS_OutOfStringRange));
+ Result := True;
+ exit;
+ end;
+ tbtunicodestring(temp.Dta^)[i] := WideChar(Stack.GetInt(-1));
+ end;
+ else
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ end;
+{$ENDIF}
+ else
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := True;
+end;
+function GetArrayLength(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ arr: TPSVariantIFC;
+begin
+ Arr := NewTPSVariantIFC(Stack[Stack.Count-2], True);
+ if (arr.Dta = nil) or (arr.aType.BaseType <> btArray) then
+ begin
+ Result := false;
+ exit;
+ end;
+ Stack.SetInt(-1, PSDynArrayGetLength(Pointer(arr.Dta^), arr.aType));
+ Result := True;
+end;
+
+function SetArrayLength(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ arr: TPSVariantIFC;
+begin
+ Arr := NewTPSVariantIFC(Stack[Stack.Count-1], True);
+ if (arr.Dta = nil) or (arr.aType.BaseType <> btArray) then
+ begin
+ Result := false;
+ exit;
+ end;
+ PSDynArraySetLength(Pointer(arr.Dta^), arr.aType, Stack.GetInt(-2));
+ Result := True;
+end;
+
+
+function InterfaceProc(Sender: TPSExec; p: TPSExternalProcRec; Tag: Pointer): Boolean; forward;
+
+procedure RegisterInterfaceLibraryRuntime(Se: TPSExec);
+begin
+ SE.AddSpecialProcImport('intf', InterfaceProc, nil);
+end;
+
+{$IFNDEF DELPHI6UP}
+function Null: Variant;
+begin
+ Result := System.Null;
+end;
+
+function Unassigned: Variant;
+begin
+ Result := System.Unassigned;
+end;
+{$ENDIF}
+function Length_(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ arr: TPSVariantIFC;
+begin
+ arr:=NewTPSVariantIFC(Stack[Stack.Count-2],false);
+ case arr.aType.BaseType of
+ btArray:
+ begin
+ Stack.SetInt(-1,PSDynArrayGetLength(Pointer(arr.Dta^),arr.aType));
+ Result:=true;
+ end;
+ btStaticArray:
+ begin
+ Stack.SetInt(-1,TPSTypeRec_StaticArray(arr.aType).Size);
+ Result:=true;
+ end;
+ btString:
+ begin
+ Stack.SetInt(-1,length(tbtstring(arr.Dta^)));
+ Result:=true;
+ end;
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString:
+ begin
+ Stack.SetInt(-1,length(tbtWidestring(arr.Dta^)));
+ Result:=true;
+ end;
+ btUnicodeString:
+ begin
+ Stack.SetInt(-1,length(tbtUnicodeString(arr.Dta^)));
+ Result:=true;
+ end;
+ {$ENDIF}
+ btvariant:
+ begin
+ Stack.SetInt(-1,length(Variant(arr.Dta^)));
+ Result:=true;
+ end;
+ else
+ begin
+ Caller.CMD_Err(ErTypeMismatch);
+ result := true;
+ end;
+ end;
+end;
+
+
+function SetLength_(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ arr: TPSVariantIFC;
+begin
+ Result:=false;
+ arr:=NewTPSVariantIFC(Stack[Stack.Count-1],true);
+ if arr.aType.BaseType=btArray then
+ begin
+ PSDynArraySetLength(Pointer(arr.Dta^),arr.aType,Stack.GetInt(-2));
+ Result:=true;
+ end else
+ if arr.aType.BaseType=btString then
+ begin
+ SetLength(tbtstring(arr.Dta^),STack.GetInt(-2));
+ Result:=true;
+{$IFNDEF PS_NOWIDESTRING}
+ end else
+ if arr.aType.BaseType=btWideString then
+ begin
+ SetLength(tbtwidestring(arr.Dta^),STack.GetInt(-2));
+ Result:=true;
+ end else
+ if arr.aType.BaseType=btUnicodeString then
+ begin
+ SetLength(tbtUnicodeString(arr.Dta^),STack.GetInt(-2));
+ Result:=true;
+{$ENDIF}
+ end;
+end;
+
+function Low_(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ arr: TPSVariantIFC;
+begin
+ Result:=true;
+ arr:=NewTPSVariantIFC(Stack[Stack.Count-2],false);
+ case arr.aType.BaseType of
+ btArray : Stack.SetInt(-1,0);
+ btStaticArray: Stack.SetInt(-1,TPSTypeRec_StaticArray(arr.aType).StartOffset);
+ btString : Stack.SetInt(-1,1);
+ btU8 : Stack.SetInt(-1,Low(Byte)); //Byte: 0
+ btS8 : Stack.SetInt(-1,Low(ShortInt)); //ShortInt: -128
+ btU16 : Stack.SetInt(-1,Low(Word)); //Word: 0
+ btS16 : Stack.SetInt(-1,Low(SmallInt)); //SmallInt: -32768
+ btU32 : Stack.SetInt(-1,Low(Cardinal)); //Cardinal/LongWord: 0
+ btS32 : Stack.SetInt(-1,Low(Integer)); //Integer/LongInt: -2147483648
+ else Result:=false;
+ end;
+end;
+
+function High_(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ arr: TPSVariantIFC;
+begin
+ Result:=true;
+ arr:=NewTPSVariantIFC(Stack[Stack.Count-2],false);
+ case arr.aType.BaseType of
+ btArray : Stack.SetInt(-1,PSDynArrayGetLength(Pointer(arr.Dta^),arr.aType)-1);
+ btStaticArray: Stack.SetInt(-1,TPSTypeRec_StaticArray(arr.aType).StartOffset+TPSTypeRec_StaticArray(arr.aType).Size-1);
+ btString : Stack.SetInt(-1,Length(tbtstring(arr.Dta^)));
+ btU8 : Stack.SetInt(-1,High(Byte)); //Byte: 255
+ btS8 : Stack.SetInt(-1,High(ShortInt)); //ShortInt: 127
+ btU16 : Stack.SetInt(-1,High(Word)); //Word: 65535
+ btS16 : Stack.SetInt(-1,High(SmallInt)); //SmallInt: 32767
+ btU32 : Stack.SetUInt(-1,High(Cardinal)); //Cardinal/LongWord: 4294967295
+ btS32 : Stack.SetInt(-1,High(Integer)); //Integer/LongInt: 2147483647
+ else Result:=false;
+ end;
+end;
+
+function Dec_(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ arr: TPSVariantIFC;
+begin
+ Result:=true;
+ arr:=NewTPSVariantIFC(Stack[Stack.Count-1],true);
+ case arr.aType.BaseType of
+ btU8 : Stack.SetInt(-1,Tbtu8(arr.dta^)-1); //Byte
+ btS8 : Stack.SetInt(-1,Tbts8(arr.dta^)-1); //ShortInt
+ btU16 : Stack.SetInt(-1,Tbtu16(arr.dta^)-1); //Word
+ btS16 : Stack.SetInt(-1,Tbts16(arr.dta^)-1); //SmallInt
+ btU32 : Stack.SetInt(-1,Tbtu32(arr.dta^)-1); //Cardinal/LongWord
+ btS32 : Stack.SetInt(-1,Tbts32(arr.dta^)-1); //Integer/LongInt
+ else Result:=false;
+ end;
+end;
+
+function Inc_(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ arr: TPSVariantIFC;
+begin
+ Result:=true;
+ arr:=NewTPSVariantIFC(Stack[Stack.Count-1],true);
+ case arr.aType.BaseType of
+ btU8 : Stack.SetInt(-1,Tbtu8(arr.dta^)+1); //Byte
+ btS8 : Stack.SetInt(-1,Tbts8(arr.dta^)+1); //ShortInt
+ btU16 : Stack.SetInt(-1,Tbtu16(arr.dta^)+1); //Word
+ btS16 : Stack.SetInt(-1,Tbts16(arr.dta^)+1); //SmallInt
+ btU32 : Stack.SetInt(-1,Tbtu32(arr.dta^)+1); //Cardinal/LongWord
+ btS32 : Stack.SetInt(-1,Tbts32(arr.dta^)+1); //Integer/LongInt
+ else Result:=false;
+ end;
+end;
+
+
+procedure TPSExec.RegisterStandardProcs;
+begin
+ RegisterFunctionName('!NOTIFICATIONVARIANTSET', NVarProc, Pointer(0), nil);
+ RegisterFunctionName('!NOTIFICATIONVARIANTGET', NVarProc, Pointer(1), nil);
+
+ RegisterFunctionName('INTTOSTR', DefProc, Pointer(0), nil);
+ RegisterFunctionName('STRTOINT', DefProc, Pointer(1), nil);
+ RegisterFunctionName('STRTOINTDEF', DefProc, Pointer(2), nil);
+ RegisterFunctionName('POS', DefProc, Pointer(3), nil);
+ RegisterFunctionName('COPY', DefProc, Pointer(4), nil);
+ RegisterFunctionName('DELETE', DefProc, Pointer(5), nil);
+ RegisterFunctionName('INSERT', DefProc, Pointer(6), nil);
+
+ RegisterFunctionName('STRGET', DefProc, Pointer(7), nil);
+ RegisterFunctionName('STRSET', DefProc, Pointer(8), nil);
+ RegisterFunctionName('UPPERCASE', DefProc, Pointer(10), nil);
+ RegisterFunctionName('LOWERCASE', DefProc, Pointer(11), nil);
+ RegisterFunctionName('TRIM', DefProc, Pointer(12), nil);
+
+ RegisterFunctionName('LENGTH',Length_,nil,nil);
+ RegisterFunctionName('SETLENGTH',SetLength_,nil,nil);
+ RegisterFunctionName('LOW',Low_,nil,nil);
+ RegisterFunctionName('HIGH',High_,nil,nil);
+ RegisterFunctionName('DEC',Dec_,nil,nil);
+ RegisterFunctionName('INC',Inc_,nil,nil);
+
+ RegisterFunctionName('SIN', DefProc, Pointer(15), nil);
+ RegisterFunctionName('COS', DefProc, Pointer(16), nil);
+ RegisterFunctionName('SQRT', DefProc, Pointer(17), nil);
+ RegisterFunctionName('ROUND', DefProc, Pointer(18), nil);
+ RegisterFunctionName('TRUNC', DefProc, Pointer(19), nil);
+ RegisterFunctionName('INT', DefProc, Pointer(20), nil);
+ RegisterFunctionName('PI', DefProc, Pointer(21), nil);
+ RegisterFunctionName('ABS', DefProc, Pointer(22), nil);
+ RegisterFunctionName('STRTOFLOAT', DefProc, Pointer(23), nil);
+ RegisterFunctionName('FLOATTOSTR', DefProc, Pointer(24), nil);
+ RegisterFunctionName('PADL', DefProc, Pointer(25), nil);
+ RegisterFunctionName('PADR', DefProc, Pointer(26), nil);
+ RegisterFunctionName('PADZ', DefProc, Pointer(27), nil);
+ RegisterFunctionName('REPLICATE', DefProc, Pointer(28), nil);
+ RegisterFunctionName('STRINGOFCHAR', DefProc, Pointer(28), nil);
+ RegisterFunctionName('!ASSIGNED', DefProc, Pointer(29), nil);
+
+ RegisterDelphiFunction(@Unassigned, 'UNASSIGNED', cdRegister);
+ RegisterDelphiFunction(@VarIsEmpty, 'VARISEMPTY', cdRegister);
+ RegisterDelphiFunction(@Null, 'NULL', cdRegister);
+ RegisterDelphiFunction(@VarIsNull, 'VARISNULL', cdRegister);
+ RegisterDelphiFunction(@VarType, 'VARTYPE', cdRegister);
+ {$IFNDEF PS_NOIDISPATCH}
+ RegisterDelphiFunction(@IDispatchInvoke, 'IDISPATCHINVOKE', cdregister);
+ {$ENDIF}
+
+
+ RegisterFunctionName('GETARRAYLENGTH', GetArrayLength, nil, nil);
+ RegisterFunctionName('SETARRAYLENGTH', SetArrayLength, nil, nil);
+
+ RegisterFunctionName('RAISELASTEXCEPTION', DefPRoc, Pointer(30), nil);
+ RegisterFunctionName('RAISEEXCEPTION', DefPRoc, Pointer(31), nil);
+ RegisterFunctionName('EXCEPTIONTYPE', DefPRoc, Pointer(32), nil);
+ RegisterFunctionName('EXCEPTIONPARAM', DefPRoc, Pointer(33), nil);
+ RegisterFunctionName('EXCEPTIONPROC', DefPRoc, Pointer(34), nil);
+ RegisterFunctionName('EXCEPTIONPOS', DefPRoc, Pointer(35), nil);
+ RegisterFunctionName('EXCEPTIONTOSTRING', DefProc, Pointer(36), nil);
+ RegisterFunctionName('ANSIUPPERCASE', DefProc, Pointer(37), nil);
+ RegisterFunctionName('ANSILOWERCASE', DefProc, Pointer(38), nil);
+
+ {$IFNDEF PS_NOINT64}
+ RegisterFunctionName('STRTOINT64', DefProc, Pointer(39), nil);
+ RegisterFunctionName('INT64TOSTR', DefProc, Pointer(40), nil);
+ {$ENDIF}
+ RegisterFunctionName('SIZEOF', DefProc, Pointer(41), nil);
+
+ {$IFNDEF PS_NOWIDESTRING}
+ RegisterFunctionName('WSTRGET', DefProc, Pointer(42), nil);
+ RegisterFunctionName('WSTRSET', DefProc, Pointer(43), nil);
+ {$ENDIF}
+
+ RegisterInterfaceLibraryRuntime(Self);
+end;
+
+
+function ToString(p: PansiChar): tbtString;
+begin
+ SetString(Result, p, StrLen(p));
+end;
+
+function IntPIFVariantToVariant(Src: pointer; aType: TPSTypeRec; var Dest: Variant): Boolean;
+ function BuildArray(P: Pointer; aType: TPSTypeRec; Len: Longint): Boolean;
+ var
+ i, elsize: Longint;
+ v: variant;
+ begin
+ elsize := aType.RealSize;
+ Dest := VarArrayCreate([0, Len-1], varVariant);
+ for i := 0 to Len -1 do
+ begin
+ if not IntPIFVariantToVariant(p, aType, v) then
+ begin
+ result := false;
+ exit;
+ end;
+ Dest[i] := v;
+ p := Pointer(IPointer(p) + Cardinal(elSize));
+ end;
+ result := true;
+ end;
+begin
+ if aType = nil then
+ begin
+ Dest := null;
+ Result := True;
+ exit;
+ end;
+ if aType.BaseType = btPointer then
+ begin
+ aType := TPSTypeRec(Pointer(IPointer(src)+PointerSize)^);
+ Src := Pointer(Pointer(Src)^);
+ end;
+
+ case aType.BaseType of
+ btVariant: Dest := variant(src^);
+ btArray: if not BuildArray(Pointer(Src^), TPSTypeRec_Array(aType).ArrayType, PSDynArrayGetLength(Pointer(src^), aType)) then begin result := false; exit; end;
+ btStaticArray: if not BuildArray(Pointer(Src), TPSTypeRec_StaticArray(aType).ArrayType, PSDynArrayGetLength(Pointer(src^), aType)) then begin result := false; exit; end;
+ btU8:
+ if aType.ExportName = 'BOOLEAN' then
+ Dest := boolean(tbtu8(Src^) <> 0)
+ else
+ Dest := tbtu8(Src^);
+ btS8: Dest := tbts8(Src^);
+ btU16: Dest := tbtu16(Src^);
+ btS16: Dest := tbts16(Src^);
+ btU32: Dest := {$IFDEF DELPHI6UP}tbtu32{$ELSE}tbts32{$ENDIF}(Src^);
+ btS32: Dest := tbts32(Src^);
+ btSingle: Dest := tbtsingle(Src^);
+ btCurrency: Dest:=tbtCurrency(Src^);
+ btDouble:
+ begin
+ if aType.ExportName = 'TDATETIME' then
+ Dest := TDateTime(tbtDouble(Src^))
+ else
+ Dest := tbtDouble(Src^);
+ end;
+ btExtended: Dest := tbtExtended(Src^);
+ btString: Dest := tbtString(Src^);
+ btPChar: Dest := ToString(PansiChar(Src^));
+ {$IFNDEF PS_NOINT64}
+ {$IFDEF DELPHI6UP} btS64: Dest := tbts64(Src^); {$ELSE} bts64: begin Result := False; exit; end; {$ENDIF}
+ {$ENDIF}
+ btChar: Dest := tbtString(tbtchar(src^));
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString: Dest := tbtWideString(src^);
+ btWideChar: Dest := tbtwidestring(tbtwidechar(src^));
+ btUnicodeString: Dest := tbtUnicodeString(src^);
+ {$ENDIF}
+ else
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := True;
+end;
+
+function PIFVariantToVariant(Src: PIFVariant; var Dest: Variant): Boolean;
+begin
+ Result := IntPIFVariantToVariant(@PPSVariantData(src).Data, Src.FType, Dest);
+end;
+
+function VariantToPIFVariant(Exec: TPSExec; const Src: Variant; Dest: PIFVariant): Boolean;
+var
+ TT: PIFTypeRec;
+begin
+ if Dest = nil then begin Result := false; exit; end;
+ tt := Exec.FindType2(btVariant);
+ if tt = nil then begin Result := false; exit; end;
+ if Dest.FType.BaseType = btPointer then
+ Result := Exec.SetVariantValue(PPSVariantPointer(Dest).DataDest, @Src, PPSVariantPointer(Dest).DestType, tt)
+ else
+ Result := Exec.SetVariantValue(@PPSVariantData(Dest).Data, @Src, Dest.FType, tt);
+end;
+
+type
+ POpenArray = ^TOpenArray;
+ TOpenArray = record
+ AType: Byte; {0}
+ OrgVar: PPSVariantIFC;
+ FreeIt: Boolean;
+ ElementSize,
+ ItemCount: Longint;
+ Data: Pointer;
+ VarParam: Boolean;
+ end;
+function CreateOpenArray(VarParam: Boolean; Sender: TPSExec; val: PPSVariantIFC): POpenArray;
+var
+ datap, p: Pointer;
+ ctype: TPSTypeRec;
+ cp: Pointer;
+ i: Longint;
+begin
+ if (Val.aType.BaseType <> btArray) and (val.aType.BaseType <> btStaticArray) then
+ begin
+ Result := nil;
+ exit;
+ end;
+ New(Result);
+ Result.AType := 0;
+ Result.OrgVar := Val;
+ Result.VarParam := VarParam;
+
+ if val.aType.BaseType = btStaticArray then
+ begin
+ Result^.ItemCount := TPSTypeRec_StaticArray(val.aType).Size;
+ datap := Val.Dta;
+ end else
+ begin
+ Result^.ItemCount := PSDynArrayGetLength(Pointer(Val.Dta^), val.aType);
+ datap := Pointer(Val.Dta^);
+ end;
+ if TPSTypeRec_Array(Val.aType).ArrayType.BaseType <> btPointer then
+ begin
+ Result.FreeIt := False;
+ result.ElementSize := 0;
+ Result.Data := datap;
+ exit;
+ end;
+ Result.FreeIt := True;
+ Result.ElementSize := sizeof(TVarRec);
+ GetMem(Result.Data, Result.ItemCount * Result.ElementSize);
+ P := Result.Data;
+ FillChar(p^, Result^.ItemCount * Result^.ElementSize, 0);
+ for i := 0 to Result^.ItemCount -1 do
+ begin
+ ctype := Pointer(Pointer(IPointer(datap)+PointerSize)^);
+ cp := Pointer(Datap^);
+ if cp = nil then
+ begin
+ tvarrec(p^).VType := vtPointer;
+ tvarrec(p^).VPointer := nil;
+ end else begin
+ case ctype.BaseType of
+ btVariant: begin
+ tvarrec(p^).VType := vtVariant;
+ tvarrec(p^).VVariant := cp;
+ end;
+ btchar: begin
+ tvarrec(p^).VType := vtChar;
+ tvarrec(p^).VChar := tbtChar(tbtchar(cp^));
+ end;
+ btSingle:
+ begin
+ tvarrec(p^).VType := vtExtended;
+ New(tvarrec(p^).VExtended);
+ tvarrec(p^).VExtended^ := tbtsingle(cp^);
+ end;
+ btExtended:
+ begin
+ tvarrec(p^).VType := vtExtended;
+ New(tvarrec(p^).VExtended);
+ tvarrec(p^).VExtended^ := tbtextended(cp^);;
+ end;
+ btDouble:
+ begin
+ tvarrec(p^).VType := vtExtended;
+ New(tvarrec(p^).VExtended);
+ tvarrec(p^).VExtended^ := tbtdouble(cp^);
+ end;
+ {$IFNDEF PS_NOWIDESTRING}
+ btwidechar: begin
+ tvarrec(p^).VType := vtWideChar;
+ tvarrec(p^).VWideChar := tbtwidechar(cp^);
+ end;
+ {$IFDEF DELPHI2009UP}
+ btUnicodeString: begin
+ tvarrec(p^).VType := vtUnicodeString;
+ tbtunicodestring(TVarRec(p^).VWideString) := tbtunicodestring(cp^);
+ end;
+ {$ELSE}
+ btUnicodeString,
+ {$ENDIF}
+ btwideString: begin
+ tvarrec(p^).VType := vtWideString;
+ tbtwidestring(TVarRec(p^).VWideString) := tbtwidestring(cp^);
+ end;
+ {$ENDIF}
+ btU8: begin
+ tvarrec(p^).VType := vtInteger;
+ tvarrec(p^).VInteger := tbtu8(cp^);
+ end;
+ btS8: begin
+ tvarrec(p^).VType := vtInteger;
+ tvarrec(p^).VInteger := tbts8(cp^);
+ end;
+ btU16: begin
+ tvarrec(p^).VType := vtInteger;
+ tvarrec(p^).VInteger := tbtu16(cp^);
+ end;
+ btS16: begin
+ tvarrec(p^).VType := vtInteger;
+ tvarrec(p^).VInteger := tbts16(cp^);
+ end;
+ btU32: begin
+ tvarrec(p^).VType := vtInteger;
+ tvarrec(p^).VInteger := tbtu32(cp^);
+ end;
+ btS32: begin
+ tvarrec(p^).VType := vtInteger;
+ tvarrec(p^).VInteger := tbts32(cp^);
+ end;
+ {$IFNDEF PS_NOINT64}
+ btS64: begin
+ tvarrec(p^).VType := vtInt64;
+ New(tvarrec(p^).VInt64);
+ tvarrec(p^).VInt64^ := tbts64(cp^);
+ end;
+ {$ENDIF}
+ btString: begin
+ tvarrec(p^).VType := vtAnsiString;
+ tbtString(TVarRec(p^).VAnsiString) := tbtstring(cp^);
+ end;
+ btPChar:
+ begin
+ tvarrec(p^).VType := vtPchar;
+ TVarRec(p^).VPChar := pointer(cp^);
+ end;
+ btClass:
+ begin
+ tvarrec(p^).VType := vtObject;
+ tvarrec(p^).VObject := Pointer(cp^);
+ end;
+{$IFNDEF PS_NOINTERFACES}
+{$IFDEF Delphi3UP}
+ btInterface:
+ begin
+ tvarrec(p^).VType := vtInterface;
+ IUnknown(tvarrec(p^).VInterface) := IUnknown(cp^);
+ end;
+
+{$ENDIF}
+{$ENDIF}
+ end;
+ end;
+ datap := Pointer(IPointer(datap)+ (2*sizeof(Pointer)+sizeof(Longbool)));
+ p := PansiChar(p) + Result^.ElementSize;
+ end;
+end;
+
+procedure DestroyOpenArray(Sender: TPSExec; V: POpenArray);
+var
+ cp, datap: pointer;
+ ctype: TPSTypeRec;
+ p: PVarRec;
+ i: Longint;
+begin
+ if v.FreeIt then // basetype = btPointer
+ begin
+ p := v^.Data;
+ if v.OrgVar.aType.BaseType = btStaticArray then
+ datap := v.OrgVar.Dta
+ else
+ datap := Pointer(v.OrgVar.Dta^);
+ for i := 0 to v^.ItemCount -1 do
+ begin
+ ctype := Pointer(Pointer(IPointer(datap)+PointerSize)^);
+ cp := Pointer(Datap^);
+ case ctype.BaseType of
+ btU8:
+ begin
+ if v^.varParam then
+ tbtu8(cp^) := tvarrec(p^).VInteger
+ end;
+ btS8: begin
+ if v^.varParam then
+ tbts8(cp^) := tvarrec(p^).VInteger
+ end;
+ btU16: begin
+ if v^.varParam then
+ tbtu16(cp^) := tvarrec(p^).VInteger
+ end;
+ btS16: begin
+ if v^.varParam then
+ tbts16(cp^) := tvarrec(p^).VInteger
+ end;
+ btU32: begin
+ if v^.varParam then
+ tbtu32(cp^) := tvarrec(p^).VInteger
+ end;
+ btS32: begin
+ if v^.varParam then
+ tbts32(cp^) := tvarrec(p^).VInteger
+ end;
+ btChar: begin
+ if v^.VarParam then
+ tbtchar(cp^) := tbtChar(tvarrec(p^).VChar)
+ end;
+ btSingle: begin
+ if v^.VarParam then
+ tbtsingle(cp^) := tvarrec(p^).vextended^;
+ dispose(tvarrec(p^).vextended);
+ end;
+ btDouble: begin
+ if v^.VarParam then
+ tbtdouble(cp^) := tvarrec(p^).vextended^;
+ dispose(tvarrec(p^).vextended);
+ end;
+ btExtended: begin
+ if v^.VarParam then
+ tbtextended(cp^) := tvarrec(p^).vextended^;
+ dispose(tvarrec(p^).vextended);
+ end;
+ {$IFNDEF PS_NOINT64}
+ btS64: begin
+ if v^.VarParam then
+ tbts64(cp^) := tvarrec(p^).vInt64^;
+ dispose(tvarrec(p^).VInt64);
+ end;
+ {$ENDIF}
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideChar: begin
+ if v^.varParam then
+ tbtwidechar(cp^) := tvarrec(p^).VWideChar;
+ end;
+ {$IFDEF DELPHI2009UP}
+ btUnicodeString:
+ begin
+ if v^.VarParam then
+ tbtunicodestring(cp^) := tbtunicodestring(TVarRec(p^).VUnicodeString);
+ finalize(tbtunicodestring(TVarRec(p^).VUnicodeString));
+ end;
+ {$ELSE}
+ btUnicodeString,
+ {$ENDIF}
+ btWideString:
+ begin
+ if v^.VarParam then
+ tbtwidestring(cp^) := tbtwidestring(TVarRec(p^).VWideString);
+ finalize(widestring(TVarRec(p^).VWideString));
+ end;
+ {$ENDIF}
+ btString: begin
+ if v^.VarParam then
+ tbtstring(cp^) := tbtstring(TVarRec(p^).VString);
+ finalize(tbtString(TVarRec(p^).VAnsiString));
+ end;
+ btClass: begin
+ if v^.VarParam then
+ Pointer(cp^) := TVarRec(p^).VObject;
+ end;
+{$IFNDEF PS_NOINTERFACES}
+{$IFDEF Delphi3UP}
+ btInterface: begin
+ if v^.VarParam then
+ IUnknown(cp^) := IUnknown(TVarRec(p^).VInterface);
+ finalize(tbtString(TVarRec(p^).VAnsiString));
+ end;
+{$ENDIF}
+{$ENDIF}
+ end;
+ datap := Pointer(IPointer(datap)+ (2*sizeof(Pointer)+sizeof(LongBool)));
+ p := Pointer(IPointer(p) + Cardinal(v^.ElementSize));
+ end;
+ FreeMem(v.Data, v.ElementSize * v.ItemCount);
+ end;
+ Dispose(V);
+end;
+
+
+{$ifndef FPC}
+ {$include x86.inc}
+{$else}
+{$IFDEF Delphi6UP}
+ {$if defined(cpu86)}
+ {$include x86.inc}
+ {$elseif defined(cpupowerpc)}
+ {$include powerpc.inc}
+ {$elseif defined(cpuarm)}
+ {$include arm.inc}
+ {$elseif defined(CPUX86_64)}
+ {$include x64.inc}
+ {$else}
+ {$fatal Pascal Script is not supported for your architecture at the moment!}
+ {$ifend}
+{$ELSE}
+{$include x86.inc}
+{$ENDIF}
+{$endif}
+
+type
+ PScriptMethodInfo = ^TScriptMethodInfo;
+ TScriptMethodInfo = record
+ Se: TPSExec;
+ ProcNo: Cardinal;
+ end;
+
+
+function MkMethod(FSE: TPSExec; No: Cardinal): TMethod;
+begin
+ if (no = 0) or (no = InvalidVal) then
+ begin
+ Result.Code := nil;
+ Result.Data := nil;
+ end else begin
+ Result.Code := @MyAllMethodsHandler;
+ Result.Data := GetMethodInfoRec(FSE, No);
+ end;
+end;
+
+
+procedure PFree(Sender: TPSExec; P: PScriptMethodInfo);
+begin
+ Dispose(p);
+end;
+
+function GetMethodInfoRec(SE: TPSExec; ProcNo: Cardinal): Pointer;
+var
+ I: Longint;
+ pp: PScriptMethodInfo;
+begin
+ if (ProcNo = 0) or (ProcNo = InvalidVal) then
+ begin
+ Result := nil;
+ exit;
+ end;
+ I := 2147483647;
+ repeat
+ pp := Se.FindProcResource2(@PFree, I);
+ if (i <> -1) and (pp^.ProcNo = ProcNo) then
+ begin
+ Result := Pp;
+ exit;
+ end;
+ until i = -1;
+ New(pp);
+ pp^.Se := TPSExec(Se);
+ pp^.ProcNo := Procno;
+ Se.AddResource(@PFree, pp);
+ Result := pp;
+end;
+
+
+
+
+
+type
+ TPtrArr = array[0..1000] of Pointer;
+ PPtrArr = ^TPtrArr;
+ TByteArr = array[0..1000] of byte;
+ PByteArr = ^TByteArr;
+ PPointer = ^Pointer;
+
+
+function VirtualMethodPtrToPtr(Ptr, FSelf: Pointer): Pointer;
+{$IFDEF FPC}
+var
+ x : PPtrArr;
+{$ENDIF}
+begin
+ {$IFDEF FPC}
+ x := Pointer(TObject(FSelf).ClassType) + vmtMethodStart;
+ Result := x^[Longint(Ptr)];
+ {$ELSE}
+ Result := PPtrArr(PPointer(FSelf)^)^[Longint(Ptr)];
+ {$ENDIF}
+end;
+
+function VirtualClassMethodPtrToPtr(Ptr, FSelf: Pointer): Pointer;
+{$IFDEF FPC}
+var
+ x : PPtrArr;
+{$ENDIF}
+begin
+ {$IFDEF FPC}
+ x := Pointer(FSelf) + vmtMethodStart;
+ Result := x^[Longint(Ptr)];
+ {$ELSE}
+ Result := PPtrArr(FSelf)^[Longint(Ptr)];
+ {$ENDIF}
+end;
+
+
+procedure CheckPackagePtr(var P: PByteArr);
+begin
+ if (word((@p[0])^) = $25FF) and (word((@p[6])^)=$C08B)then
+ begin
+ p := PPointer((@p[2])^)^;
+ end;
+end;
+
+{$IFDEF VER90}{$DEFINE NO_vmtSelfPtr}{$ENDIF}
+{$IFDEF FPC}{$DEFINE NO_vmtSelfPtr}{$ENDIF}
+
+{$IFNDEF FPC}
+
+function FindVirtualMethodPtr(Ret: TPSRuntimeClass; FClass: TClass; Ptr: Pointer): Pointer;
+// Idea of getting the number of VMT items from GExperts
+var
+ p: PPtrArr;
+ I: Longint;
+begin
+ p := Pointer(FClass);
+ CheckPackagePtr(PByteArr(Ptr));
+ if Ret.FEndOfVMT = MaxInt then
+ begin
+ I := {$IFDEF NO_vmtSelfPtr}-48{$ELSE}vmtSelfPtr{$ENDIF} div SizeOf(Pointer) + 1;
+ while I < 0 do
+ begin
+ if I < 0 then
+ begin
+ if I <> ({$IFDEF VER90}-44{$ELSE}vmtTypeInfo{$ENDIF} div SizeOf(Pointer)) then
+ begin // from GExperts code
+ if (IPointer(p^[I]) > IPointer(p)) and ((IPointer(p^[I]) - IPointer(p))
+ div
+ PointerSize < Ret.FEndOfVMT) then
+ begin
+ Ret.FEndOfVMT := (IPointer(p^[I]) - IPointer(p)) div SizeOf(Pointer);
+ end;
+ end;
+ end;
+ Inc(I);
+ end;
+ if Ret.FEndOfVMT = MaxInt then
+ begin
+ Ret.FEndOfVMT := 0; // cound not find EndOfVMT
+ Result := nil;
+ exit;
+ end;
+ end;
+ I := 0;
+ while I < Ret.FEndOfVMT do
+ begin
+ if p^[I] = Ptr then
+ begin
+ Result := Pointer(I);
+ exit;
+ end;
+ I := I + 1;
+ end;
+ Result := nil;
+end;
+
+{$ELSE}
+
+function FindVirtualMethodPtr(Ret: TPSRuntimeClass; FClass: TClass; Ptr: Pointer): Pointer;
+var
+ x,p: PPtrArr;
+ I: Longint;
+ t : Pointer;
+begin
+ p := Pointer(FClass) + vmtMethodStart;
+ I := 0;
+ while (p^[I]<>nil) and (I < 10000) do
+ begin
+ if p^[I] = Ptr then
+ begin
+ Result := Pointer(I);
+ x := Pointer(FClass) + vmtMethodStart;
+ t := x^[I];
+ Assert(t=Ptr,'Computation of virtual method pointer fail : t<>Ptr');
+ exit;
+ end;
+ I := I + 1;
+ end;
+ Result := nil;
+end;
+
+{$ENDIF}
+
+
+function NewTPSVariantIFC(avar: PPSVariant; varparam: boolean): TPSVariantIFC;
+begin
+ Result.VarParam := varparam;
+ if avar = nil then
+ begin
+ Result.aType := nil;
+ result.Dta := nil;
+ end else
+ begin
+ Result.aType := avar.FType;
+ result.Dta := @PPSVariantData(avar).Data;
+ if Result.aType.BaseType = btPointer then
+ begin
+ Result.aType := Pointer(Pointer(IPointer(result.dta)+ PointerSize)^);
+ Result.Dta := Pointer(Result.dta^);
+ end;
+ end;
+end;
+
+function NewTPSVariantRecordIFC(avar: PPSVariant; Fieldno: Longint): TPSVariantIFC;
+var
+ offs: Cardinal;
+begin
+ Result := NewTPSVariantIFC(avar, false);
+ if Result.aType.BaseType = btRecord then
+ begin
+ Offs := Cardinal(TPSTypeRec_Record(Result.aType).RealFieldOffsets[FieldNo]);
+ Result.Dta := Pointer(IPointer(Result.dta) + Offs);
+ Result.aType := TPSTypeRec_Record(Result.aType).FieldTypes[FieldNo];
+ end else
+ begin
+ Result.Dta := nil;
+ Result.aType := nil;
+ end;
+end;
+
+function PSGetArrayField(const avar: TPSVariantIFC; Fieldno: Longint): TPSVariantIFC;
+var
+ offs: Cardinal;
+ n: Longint;
+begin
+ Result := aVar;
+ case Result.aType.BaseType of
+ btStaticArray, btArray:
+ begin
+ if Result.aType.BaseType = btStaticArray then
+ n := TPSTypeRec_StaticArray(Result.aType).Size
+ else
+ n := PSDynArrayGetLength(Pointer(Result.Dta^), Result.aType);
+ if (FieldNo <0) or (FieldNo >= n) then
+ begin
+ Result.Dta := nil;
+ Result.aType := nil;
+ exit;
+ end;
+ Offs := TPSTypeRec_Array(Result.aType).ArrayType.RealSize * Cardinal(FieldNo);
+ if Result.aType.BaseType = btStaticArray then
+ Result.Dta := Pointer(IPointer(Result.dta) + Offs)
+ else
+ Result.Dta := Pointer(IPointer(Result.dta^) + Offs);
+ Result.aType := TPSTypeRec_Array(Result.aType).ArrayType;
+ end
+ else
+ Result.Dta := nil;
+ Result.aType := nil;
+ end;
+end;
+
+function PSGetRecField(const avar: TPSVariantIFC; Fieldno: Longint): TPSVariantIFC;
+var
+ offs: Cardinal;
+begin
+ Result := aVar;
+ if Result.aType.BaseType = btRecord then
+ begin
+ Offs := Cardinal(TPSTypeRec_Record(Result.aType).RealFieldOffsets[FieldNo]);
+ Result.aType := TPSTypeRec_Record(Result.aType).FieldTypes[FieldNo];
+ Result.Dta := Pointer(IPointer(Result.dta) + Offs);
+ end else
+ begin
+ Result.Dta := nil;
+ Result.aType := nil;
+ end;
+end;
+
+function NewPPSVariantIFC(avar: PPSVariant; varparam: boolean): PPSVariantIFC;
+begin
+ New(Result);
+ Result^ := NewTPSVariantIFC(avar, varparam);
+end;
+
+
+procedure DisposePPSVariantIFC(aVar: PPSVariantIFC);
+begin
+ if avar <> nil then
+ Dispose(avar);
+end;
+
+procedure DisposePPSVariantIFCList(list: TPSList);
+var
+ i: Longint;
+begin
+ for i := list.Count -1 downto 0 do
+ DisposePPSVariantIFC(list[i]);
+ list.free;
+end;
+
+function ClassCallProcMethod(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ i: Integer;
+ MyList: TPSList;
+ n: PIFVariant;
+ v: PPSVariantIFC;
+ FSelf: Pointer;
+ CurrStack: Cardinal;
+ cc: TPSCallingConvention;
+ s: tbtString;
+begin
+ s := p.Decl;
+ if length(S) < 2 then
+ begin
+ Result := False;
+ exit;
+ end;
+ cc := TPSCallingConvention(s[1]);
+ Delete(s, 1, 1);
+ if s[1] = #0 then
+ n := Stack[Stack.Count -1]
+ else
+ n := Stack[Stack.Count -2];
+ if (n = nil) or (n^.FType.BaseType <> btClass)or (PPSVariantClass(n).Data = nil) then
+ begin
+ Caller.CMD_Err(erNullPointerException);
+ result := false;
+ exit;
+ end;
+ FSelf := PPSVariantClass(n).Data;
+ CurrStack := Cardinal(Stack.Count) - Cardinal(length(s)) -1;
+ if s[1] = #0 then inc(CurrStack);
+ MyList := TPSList.Create;
+ for i := 2 to length(s) do
+ begin
+ MyList.Add(nil);
+ end;
+ for i := length(s) downto 2 do
+ begin
+ n := Stack[CurrStack];
+ MyList[i - 2] := NewPPSVariantIFC(n, s[i] <> #0);
+ inc(CurrStack);
+ end;
+ if s[1] <> #0 then
+ begin
+ v := NewPPSVariantIFC(Stack[CurrStack + 1], True);
+ end else v := nil;
+ try
+ if p.Ext2 = nil then
+ Result := Caller.InnerfuseCall(FSelf, p.Ext1, cc, MyList, v)
+ else
+ Result := Caller.InnerfuseCall(FSelf, VirtualMethodPtrToPtr(p.Ext1, FSelf), cc, MyList, v);
+ finally
+ DisposePPSVariantIFC(v);
+ DisposePPSVariantIFCList(mylist);
+ end;
+end;
+
+function ClassCallProcConstructor(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ i, h: Longint;
+ v: PPSVariantIFC;
+ MyList: TPSList;
+ n: PIFVariant;
+ FSelf: Pointer;
+ CurrStack: Cardinal;
+ cc: TPSCallingConvention;
+ s: tbtString;
+ FType: PIFTypeRec;
+ x: TPSRuntimeClass;
+ IntVal: PIFVariant;
+begin
+ n := Stack[Stack.Count -2];
+ if (n = nil) or (n^.FType.BaseType <> btU32) then
+ begin
+ result := false;
+ exit;
+ end;
+ FType := Caller.GetTypeNo(PPSVariantU32(N).Data);
+ if (FType = nil) then
+ begin
+ Result := False;
+ exit;
+ end;
+ h := MakeHash(FType.ExportName);
+ FSelf := nil;
+ for i := 0 to TPSRuntimeClassImporter(p.Ext2).FClasses.Count -1 do
+ begin
+ x:= TPSRuntimeClassImporter(p.Ext2).FClasses[i];
+ if (x.FClassNameHash = h) and (x.FClassName = FType.ExportName) then
+ begin
+ FSelf := x.FClass;
+ end;
+ end;
+ if FSelf = nil then begin
+ Result := False;
+ exit;
+ end;
+ s := p.Decl;
+ if length(S) < 2 then
+ begin
+ Result := False;
+ exit;
+ end;
+ cc := TPSCallingConvention(s[1]);
+ Delete(s, 1, 1);
+ CurrStack := Cardinal(Stack.Count) - Cardinal(length(s)) -1;
+ if s[1] = #0 then inc(CurrStack);
+ IntVal := CreateHeapVariant(Caller.FindType2(btU32));
+ if IntVal = nil then
+ begin
+ Result := False;
+ exit;
+ end;
+ {$IFDEF FPC}
+ // under FPC a constructor it's called with self=0 (EAX) and
+ // the VMT class pointer in EDX so they are effectively swaped
+ // using register calling convention
+ PPSVariantU32(IntVal).Data := Cardinal(FSelf);
+ FSelf := pointer(1);
+ {$ELSE}
+ PPSVariantU32(IntVal).Data := 1;
+ {$ENDIF}
+ MyList := TPSList.Create;
+ MyList.Add(NewPPSVariantIFC(intval, false));
+ for i := 2 to length(s) do
+ begin
+ MyList.Add(nil);
+ end;
+ for i := length(s) downto 2 do
+ begin
+ n :=Stack[CurrStack];
+// if s[i] <> #0 then
+// begin
+// MyList[i - 2] := NewPPSVariantIFC(n, s[i] <> #0);
+// end;
+ MyList[i - 1] := NewPPSVariantIFC(n, s[i] <> #0);
+ inc(CurrStack);
+ end;
+ if s[1] <> #0 then
+ begin
+ v := NewPPSVariantIFC(Stack[CurrStack + 1], True);
+ end else v := nil;
+ try
+ Result := Caller.InnerfuseCall(FSelf, p.Ext1, TPSCallingConvention(Integer(cc) or 64), MyList, v);
+ finally
+ DisposePPSVariantIFC(v);
+ DisposePPSVariantIFCList(mylist);
+ DestroyHeapVariant(intval);
+ end;
+end;
+
+
+function ClassCallProcVirtualConstructor(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ i, h: Longint;
+ v: PPSVariantIFC;
+ MyList: TPSList;
+ n: PIFVariant;
+ FSelf: Pointer;
+ CurrStack: Cardinal;
+ cc: TPSCallingConvention;
+ s: tbtString;
+ FType: PIFTypeRec;
+ x: TPSRuntimeClass;
+ IntVal: PIFVariant;
+begin
+ n := Stack[Stack.Count -2];
+ if (n = nil) or (n^.FType.BaseType <> btU32) then
+ begin
+ Caller.CMD_Err(erNullPointerException);
+ result := false;
+ exit;
+ end;
+ FType := Caller.GetTypeNo(PPSVariantU32(N).Data);
+ if (FType = nil) then
+ begin
+ Caller.CMD_Err(erNullPointerException);
+ Result := False;
+ exit;
+ end;
+ h := MakeHash(FType.ExportName);
+ FSelf := nil;
+ for i := 0 to TPSRuntimeClassImporter(p.Ext2).FClasses.Count -1 do
+ begin
+ x:= TPSRuntimeClassImporter(p.Ext2).FClasses[i];
+ if (x.FClassNameHash = h) and (x.FClassName = FType.ExportName) then
+ begin
+ FSelf := x.FClass;
+ end;
+ end;
+ if FSelf = nil then begin
+ Result := False;
+ exit;
+ end;
+ s := p.Decl;
+ if length(S) < 2 then
+ begin
+ Result := False;
+ exit;
+ end;
+ cc := TPSCallingConvention(s[1]);
+ delete(s, 1, 1);
+ CurrStack := Cardinal(Stack.Count) - Cardinal(length(s)) -1;
+ if s[1] = #0 then inc(CurrStack);
+ IntVal := CreateHeapVariant(Caller.FindType2(btU32));
+ if IntVal = nil then
+ begin
+ Result := False;
+ exit;
+ end;
+ PPSVariantU32(IntVal).Data := 1;
+ MyList := TPSList.Create;
+ MyList.Add(NewPPSVariantIFC(intval, false));
+ for i := 2 to length(s) do
+ begin
+ MyList.Add(nil);
+ end;
+ for i := length(s) downto 2 do
+ begin
+ n :=Stack[CurrStack];
+ MyList[i - 1] := NewPPSVariantIFC(n, s[i] <> #0);
+ inc(CurrStack);
+ end;
+ if s[1] <> #0 then
+ begin
+ v := NewPPSVariantIFC(Stack[CurrStack + 1], True);
+ end else v := nil;
+ try
+ Result := Caller.InnerfuseCall(FSelf, VirtualClassMethodPtrToPtr(p.Ext1, FSelf), cc, MyList, v);
+ finally
+ DisposePPSVariantIFC(v);
+ DisposePPSVariantIFCList(mylist);
+ DestroyHeapVariant(intval);
+ end;
+end;
+
+function CastProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ TypeNo, InVar, ResVar: TPSVariantIFC;
+ FSelf: TClass;
+ FType: PIFTypeRec;
+ H, I: Longint;
+ x: TPSRuntimeClass;
+begin
+ TypeNo := NewTPSVariantIFC(Stack[Stack.Count-3], false);
+ InVar := NewTPSVariantIFC(Stack[Stack.Count-2], false);
+ ResVar := NewTPSVariantIFC(Stack[Stack.Count-1], true);
+ if (TypeNo.Dta = nil) or (InVar.Dta = nil) or (ResVar.Dta = nil) or
+ (TypeNo.aType.BaseType <> btu32) or (resvar.aType <> Caller.FTypes[tbtu32(Typeno.dta^)])
+ then
+ begin
+ Result := False;
+ Exit;
+ end;
+{$IFNDEF PS_NOINTERFACES}
+ if (invar.atype.BaseType = btInterface) and (resvar.aType.BaseType = btInterface) then
+ begin
+{$IFNDEF Delphi3UP}
+ if IUnknown(resvar.Dta^) <> nil then
+ IUnknown(resvar.Dta^).Release;
+{$ENDIF}
+ IUnknown(resvar.Dta^) := nil;
+ if (IUnknown(invar.Dta^) = nil) or (IUnknown(invar.Dta^).QueryInterface(TPSTypeRec_Interface(ResVar.aType).Guid, IUnknown(resvar.Dta^)) <> 0) then
+ begin
+ Caller.CMD_Err2(erCustomError, tbtString(RPS_CannotCastInterface));
+ Result := False;
+ exit;
+ end;
+{$IFDEF Delphi3UP}
+ end else if (Invar.aType.BaseType = btclass) and (resvar.aType.BaseType = btInterface) then
+ begin
+{$IFNDEF Delphi3UP}
+ if IUnknown(resvar.Dta^) <> nil then
+ IUnknown(resvar.Dta^).Release;
+{$ENDIF}
+ IUnknown(resvar.Dta^) := nil;
+ if (TObject(invar.Dta^)= nil) or (not TObject(invar.dta^).GetInterface(TPSTypeRec_Interface(ResVar.aType).Guid, IUnknown(resvar.Dta^))) then
+ begin
+ Caller.CMD_Err2(erCustomError, tbtString(RPS_CannotCastInterface));
+ Result := False;
+ exit;
+ end;
+{$ENDIF}
+ end else {$ENDIF}if (invar.aType.BaseType = btclass) and (resvar.aType.BaseType = btclass ) then
+ begin
+ FType := Caller.GetTypeNo(tbtu32(TypeNo.Dta^));
+ if (FType = nil) then
+ begin
+ Result := False;
+ exit;
+ end;
+ h := MakeHash(FType.ExportName);
+ FSelf := nil;
+ for i := 0 to TPSRuntimeClassImporter(p.Ext2).FClasses.Count -1 do
+ begin
+ x:= TPSRuntimeClassImporter(p.Ext2).FClasses[i];
+ if (x.FClassNameHash = h) and (x.FClassName = FType.ExportName) then
+ begin
+ FSelf := x.FClass;
+ end;
+ end;
+ if FSelf = nil then begin
+ Result := False;
+ exit;
+ end;
+
+ try
+ TObject(ResVar.Dta^) := TObject(InVar.Dta^) as FSelf;
+ except
+ Result := False;
+ Caller.CMD_Err2(erCustomError, tbtString(RPS_CannotCastObject));
+ exit;
+ end;
+ end else
+ begin
+ Result := False;
+ exit;
+ end;
+ result := True;
+end;
+
+
+function NilProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ n: TPSVariantIFC;
+begin
+ n := NewTPSVariantIFC(Stack[Stack.Count-1], True);
+ if (n.Dta = nil) or ((n.aType.BaseType <> btClass) and (n.aType.BaseType <> btInterface)) then
+ begin
+ Result := False;
+ Caller.CMD_Err(erNullPointerException);
+ Exit;
+ end;
+{$IFNDEF PS_NOINTERFACES}
+ if n.aType.BaseType = btInterface then
+ begin
+ {$IFNDEF Delphi3UP}
+ if IUnknown(n.Dta^) <> nil then
+ IUnknown(n.Dta^).Release;
+ {$ENDIF}
+ IUnknown(n.Dta^) := nil;
+ end else
+ {$ENDIF}
+ Pointer(n.Dta^) := nil;
+ result := True;
+end;
+function IntfCallProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ i: Integer;
+ MyList: TPSList;
+ n: TPSVariantIFC;
+ n2: PPSVariantIFC;
+ FSelf: Pointer;
+ CurrStack: Cardinal;
+ cc: TPSCallingConvention;
+ s: tbtString;
+begin
+ s := p.Decl;
+ if length(S) < 2 then
+ begin
+ Result := False;
+ exit;
+ end;
+ cc := TPSCallingConvention(s[1]);
+ Delete(s, 1, 1);
+ if s[1] = #0 then
+ n := NewTPSVariantIFC(Stack[Stack.Count -1], false)
+ else
+ n := NewTPSVariantIFC(Stack[Stack.Count -2], false);
+ if (n.dta = nil) or (n.atype.BaseType <> btInterface) or (Pointer(n.Dta^) = nil) then
+ begin
+ Caller.CMD_Err(erNullPointerException);
+ result := false;
+ exit;
+ end;
+ FSelf := Pointer(n.dta^);
+ CurrStack := Cardinal(Stack.Count) - Cardinal(length(s)) -1;
+ if s[1] = #0 then inc(CurrStack);
+ MyList := TPSList.Create;
+ for i := 2 to length(s) do
+ begin
+ MyList.Add(nil);
+ end;
+ for i := length(s) downto 2 do
+ begin
+ MyList[i - 2] := NewPPSVariantIFC(Stack[CurrStack], s[i] <> #0);
+ inc(CurrStack);
+ end;
+ if s[1] <> #0 then
+ begin
+ n2 := NewPPSVariantIFC(Stack[CurrStack + 1], True);
+ end else n2 := nil;
+ try
+ Caller.InnerfuseCall(FSelf, Pointer(Pointer(IPointer(FSelf^) + (Cardinal(p.Ext1) * Sizeof(Pointer)))^), cc, MyList, n2);
+ result := true;
+ finally
+ DisposePPSVariantIFC(n2);
+ DisposePPSVariantIFCList(MyList);
+ end;
+end;
+
+
+function InterfaceProc(Sender: TPSExec; p: TPSExternalProcRec; Tag: Pointer): Boolean;
+var
+ s: tbtString;
+begin
+ s := p.Decl;
+ delete(s,1,5); // delete 'intf:'
+ if s = '' then
+ begin
+ Result := False;
+ exit;
+ end;
+ if s[1] = '.'then
+ begin
+ Delete(s,1,1);
+ if length(S) < 6 then
+ begin
+ Result := False;
+ exit;
+ end;
+ p.ProcPtr := IntfCallProc;
+ p.Ext1 := Pointer((@s[1])^); // Proc Offset
+ Delete(s,1,4);
+ P.Decl := s;
+ Result := True;
+ end else Result := False;
+end;
+
+
+function getMethodNo(P: TMethod; SE: TPSExec): Cardinal;
+begin
+ if (p.Code <> @MyAllMethodsHandler) or (p.Data = nil)or (PScriptMethodInfo(p.Data)^.Se <> se) then
+ Result := 0
+ else
+ begin
+ Result := PScriptMethodInfo(p.Data)^.ProcNo;
+ end;
+end;
+
+function ClassCallProcProperty(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ n: TPSVariantIFC;
+ ltemp: Longint;
+ FSelf: Pointer;
+ m: TMethod;
+begin
+ try
+ if p.Ext2 = Pointer(0) then
+ begin
+ n := NewTPSVariantIFC(Stack[Stack.Count -1], False);
+ if (n.Dta = nil) or (n.aType.BaseType <> btclass) then
+ begin
+ result := false;
+ Caller.CMD_Err(erNullPointerException);
+ exit;
+ end;
+ FSelf := Pointer(n.dta^);
+ if FSelf = nil then
+ begin
+ Caller.CMD_Err(erCouldNotCallProc);
+ Result := False;
+ exit;
+ end;
+ n := NewTPSVariantIFC(Stack[Stack.Count -2], false);
+ if (PPropInfo(p.Ext1)^.PropType^.Kind = tkMethod) and ((n.aType.BaseType = btu32) or (n.aType.BaseType = btProcPtr))then
+ begin
+ SetMethodProp(TObject(FSelf), PPropInfo(p.Ext1), MkMethod(Caller, tbtu32(n.dta^)));
+ end else
+ case n.aType.BaseType of
+ btSet:
+ begin
+ ltemp := 0;
+ move(Byte(n.Dta^), ltemp, TPSTypeRec_Set(n.aType).aByteSize);
+ SetOrdProp(TObject(FSelf), PPropInfo(p.Ext1), ltemp);
+ end;
+ btChar, btU8: SetOrdProp(TObject(FSelf), PPropInfo(p.Ext1), tbtu8(n.Dta^));
+ btS8: SetOrdProp(TObject(FSelf), PPropInfo(p.Ext1), tbts8(n.Dta^));
+ {$IFNDEF PS_NOWIDESTRING}btwidechar, {$ENDIF}btU16: SetOrdProp(TObject(FSelf), PPropInfo(p.Ext1), tbtu16(n.Dta^));
+ btS16: SetOrdProp(TObject(FSelf), PPropInfo(p.Ext1), tbts16(n.Dta^));
+ btU32: SetOrdProp(TObject(FSelf), PPropInfo(p.Ext1), tbtu32(n.Dta^));
+ btS32: SetOrdProp(TObject(FSelf), PPropInfo(p.Ext1), tbts32(n.Dta^));
+ btSingle: SetFloatProp(TObject(FSelf), p.Ext1, tbtsingle(n.Dta^));
+ btDouble: SetFloatProp(TObject(FSelf), p.Ext1, tbtdouble(n.Dta^));
+ btExtended: SetFloatProp(TObject(FSelf), p.Ext1, tbtextended(n.Dta^));
+ btString: SetStrProp(TObject(FSelf), p.Ext1, string(tbtString(n.Dta^)));
+ btPChar: SetStrProp(TObject(FSelf), p.Ext1, string(pansichar(n.Dta^)));
+ btClass: SetOrdProp(TObject(FSelf), P.Ext1, Longint(n.Dta^));
+ {$IFDEF DELPHI6UP}
+{$IFNDEF PS_NOWIDESTRING}
+{$IFNDEF DELPHI2009UP}btUnicodeString,{$ENDIF}
+ btWideString: SetWideStrProp(TObject(FSelf), P.Ext1, tbtWidestring(n.dta^));
+{$IFDEF DELPHI2009UP}
+ btUnicodeString: SetUnicodeStrProp(TObject(FSelf), P.Ext1, tbtUnicodestring(n.dta^));
+{$ENDIF}
+ {$ENDIF}
+{$ENDIF}
+ else
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := true;
+ end else begin
+ n := NewTPSVariantIFC(Stack[Stack.Count -2], False);
+ if (n.dta = nil) or (n.aType.BaseType <> btClass)then
+ begin
+ result := false;
+ Caller.CMD_Err(erNullPointerException);
+ exit;
+ end;
+ FSelf := Pointer(n.dta^);
+ if FSelf = nil then
+ begin
+ Caller.CMD_Err(erCouldNotCallProc);
+ Result := False;
+ exit;
+ end;
+ n := NewTPSVariantIFC(Stack[Stack.Count -1], false);
+ if (PPropInfo(p.Ext1)^.PropType^.Kind = tkMethod) and ((n.aType.BaseType = btu32) or (n.aType.BaseType = btprocptr)) then
+ begin
+ m := GetMethodProp(TObject(FSelf), PPropInfo(p.Ext1));
+ Cardinal(n.Dta^) := GetMethodNo(m, Caller);
+ if Cardinal(n.dta^) = 0 then
+ begin
+ Pointer(Pointer((IPointer(n.dta)+PointerSize))^) := m.Data;
+ Pointer(Pointer((IPointer(n.dta)+PointerSize2))^) := m.Code;
+ end;
+ end else
+ case n.aType.BaseType of
+ btSet:
+ begin
+ ltemp := GetOrdProp(TObject(FSelf), PPropInfo(p.Ext1));
+ move(ltemp, Byte(n.Dta^), TPSTypeRec_Set(n.aType).aByteSize);
+ end;
+ btU8: tbtu8(n.Dta^) := GetOrdProp(TObject(FSelf), p.Ext1);
+ btS8: tbts8(n.Dta^) := GetOrdProp(TObject(FSelf), p.Ext1);
+ btU16: tbtu16(n.Dta^) := GetOrdProp(TObject(FSelf), p.Ext1);
+ btS16: tbts16(n.Dta^) := GetOrdProp(TObject(FSelf), p.Ext1);
+ btU32: tbtu32(n.Dta^) := GetOrdProp(TObject(FSelf), p.Ext1);
+ btS32: tbts32(n.Dta^) := GetOrdProp(TObject(FSelf), p.Ext1);
+ btSingle: tbtsingle(n.Dta^) := GetFloatProp(TObject(FSelf), p.Ext1);
+ btDouble: tbtdouble(n.Dta^) := GetFloatProp(TObject(FSelf), p.Ext1);
+ btExtended: tbtextended(n.Dta^) := GetFloatProp(TObject(FSelf), p.Ext1);
+ btString: tbtString(n.Dta^) := tbtString(GetStrProp(TObject(FSelf), p.Ext1));
+ btClass: Longint(n.dta^) := GetOrdProp(TObject(FSelf), p.Ext1);
+ {$IFDEF DELPHI6UP}
+{$IFNDEF PS_NOWIDESTRING}
+ {$IFDEF DELPHI2009UP}
+ btUnicodeString: tbtUnicodeString(n.dta^) := GetUnicodeStrProp(TObject(FSelf), P.Ext1);
+ {$ELSE}
+ btUnicodeString,
+ {$ENDIF}
+ btWideString: tbtWidestring(n.dta^) := GetWideStrProp(TObject(FSelf), P.Ext1);
+{$ENDIF}
+{$ENDIF}
+ else
+ begin
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := True;
+ end;
+ finally
+ end;
+end;
+
+function ClassCallProcPropertyHelper(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ I, ParamCount: Longint;
+ Params: TPSList;
+ n: TPSVariantIFC;
+ FSelf: Pointer;
+begin
+ if Length(P.Decl) < 4 then begin
+ Result := False;
+ exit;
+ end;
+ ParamCount := Longint((@P.Decl[1])^);
+ if Longint(Stack.Count) < ParamCount +1 then begin
+ Result := False;
+ exit;
+ end;
+ Dec(ParamCount);
+ if p.Ext1 <> nil then // read
+ begin
+ n := NewTPSVariantIFC(Stack[Longint(Stack.Count) - 2], False);
+ if (n.Dta = nil) or (n.aType.BaseType <> btClass) then
+ begin
+ result := false;
+ Caller.CMD_Err(erNullPointerException);
+ exit;
+ end;
+ FSelf := pointer(n.Dta^);
+ if FSelf = nil then
+ begin
+ Caller.CMD_Err(erCouldNotCallProc);
+ Result := False;
+ exit;
+ end;
+ Params := TPSList.Create;
+ Params.Add(NewPPSVariantIFC(Stack[Longint(Stack.Count) - 1], True));
+ for i := Stack.Count -3 downto Longint(Stack.Count) - ParamCount -2 do
+ begin
+ Params.Add(NewPPSVariantIFC(Stack[I], False));
+ end;
+ try
+ Result := Caller.InnerfuseCall(FSelf, p.Ext1, cdRegister, Params, nil);
+ finally
+ DisposePPSVariantIFCList(Params);
+ end;
+ end else begin
+ n := NewTPSVariantIFC(Stack[Longint(Stack.Count) - 1], False);
+ if (n.Dta = nil) or (n.aType.BaseType <> btClass) then
+ begin
+ result := false;
+ Caller.CMD_Err(erNullPointerException);
+ exit;
+ end;
+ FSelf := pointer(n.Dta^);
+ if FSelf = nil then
+ begin
+ Caller.CMD_Err(erCouldNotCallProc);
+ Result := False;
+ exit;
+ end;
+ Params := TPSList.Create;
+ Params.Add(NewPPSVariantIFC(Stack[Longint(Stack.Count) - ParamCount - 2], False));
+
+ for i := Stack.Count -2 downto Longint(Stack.Count) - ParamCount -1 do
+ begin
+ Params.Add(NewPPSVariantIFC(Stack[I], False));
+ end;
+ try
+ Result := Caller.InnerfuseCall(FSelf, p.Ext2, cdregister, Params, nil);
+ finally
+ DisposePPSVariantIFCList(Params);
+ end;
+ end;
+end;
+
+function ClassCallProcPropertyHelperName(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+var
+ I, ParamCount: Longint;
+ Params: TPSList;
+ tt: PIFVariant;
+ n: TPSVariantIFC;
+ FSelf: Pointer;
+begin
+ if Length(P.Decl) < 4 then begin
+ Result := False;
+ exit;
+ end;
+ ParamCount := Longint((@P.Decl[1])^);
+ if Longint(Stack.Count) < ParamCount +1 then begin
+ Result := False;
+ exit;
+ end;
+ Dec(ParamCount);
+ if p.Ext1 <> nil then // read
+ begin
+ n := NewTPSVariantIFC(Stack[Longint(Stack.Count) - 2], false);
+ if (n.Dta = nil) or (n.aType.BaseType <> btClass) then
+ begin
+ result := false;
+ Caller.CMD_Err(erNullPointerException);
+ exit;
+ end;
+ FSelf := Tobject(n.dta^);
+ Params := TPSList.Create;
+ Params.Add(NewPPSVariantIFC(Stack[Longint(Stack.Count) - 1], True));
+ for i := Stack.Count -3 downto Longint(Stack.Count) - ParamCount -2 do
+ Params.Add(NewPPSVariantIFC(Stack[I], False));
+ tt := CreateHeapVariant(Caller.FindType2(btString));
+ if tt <> nil then
+ begin
+ PPSVariantAString(tt).Data := p.Name;
+ Params.Add(NewPPSVariantIFC(tt, false));
+ end;
+ try
+ Result := Caller.InnerfuseCall(FSelf, p.Ext1, cdRegister, Params, nil);
+ finally
+ DestroyHeapVariant(tt);
+ DisposePPSVariantIFCList(Params);
+ end;
+ end else begin
+ n := NewTPSVariantIFC(Stack[Longint(Stack.Count) - 1], false);
+ if (n.Dta = nil) or (n.aType.BaseType <> btClass) then
+ begin
+ result := false;
+ Caller.CMD_Err(erNullPointerException);
+ exit;
+ end;
+ FSelf := Tobject(n.dta^);
+ Params := TPSList.Create;
+ Params.Add(NewPPSVariantIFC(Stack[Longint(Stack.Count) - 2], True));
+
+ for i := Stack.Count -2 downto Longint(Stack.Count) - ParamCount -1 do
+ begin
+ Params.Add(NewPPSVariantIFC(Stack[I], false));
+ end;
+ tt := CreateHeapVariant(Caller.FindType2(btString));
+ if tt <> nil then
+ begin
+ PPSVariantAString(tt).Data := p.Name;
+ Params.Add(NewPPSVariantIFC(tt, false));
+ end;
+ try
+ Result := Caller.InnerfuseCall(FSelf, p.Ext2, cdregister, Params, nil);
+ finally
+ DestroyHeapVariant(tt);
+ DisposePPSVariantIFCList(Params);
+ end;
+ end;
+end;
+
+
+
+function ClassCallProcEventPropertyHelper(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+{Event property helper}
+var
+ I, ParamCount: Longint;
+ Params: TPSList;
+ n: TPSVariantIFC;
+ data: TMethod;
+ n2: PIFVariant;
+ FSelf: Pointer;
+begin
+ if Length(P.Decl) < 4 then begin
+ Result := False;
+ exit;
+ end;
+ ParamCount := Longint((@P.Decl[1])^);
+ if Longint(Stack.Count) < ParamCount +1 then begin
+ Result := False;
+ exit;
+ end;
+ Dec(ParamCount);
+ if p.Ext1 <> nil then // read
+ begin
+ n := NewTPSVariantIFC(Stack[Longint(Stack.Count) - 2], false);
+ if (n.Dta = nil) or (n.aType.BaseType <> btClass) then
+ begin
+ result := false;
+ Caller.CMD_Err(erNullPointerException);
+ exit;
+ end;
+ FSelf := Tobject(n.dta^);
+ n := NewTPSVariantIFC(Stack[Longint(Stack.Count) - 1], True); // Result
+ if (n.aType.BaseType <> btU32) and (n.aType.BaseType <> btProcPtr) then
+ begin
+ Result := False;
+ Caller.CMD_Err(erNullPointerException);
+ exit;
+ end;
+ n2 := CreateHeapVariant(Caller.FindType2(btPChar));
+ if n2 = nil then
+ begin
+ Result := False;
+ exit;
+ end;
+ Params := TPSList.Create;
+//{$IFDEF CPU64}
+//{$ELSE}
+ data.Code := nil;
+ data.Data := nil;
+//{$ENDIF}
+ PPSVariantDynamicArray(n2)^.Data:= @data;
+ Params.Add(NewPPSVariantIFC(n2, false));
+ for i := Stack.Count -3 downto Longint(Stack.Count) - ParamCount -2 do
+ Params.Add(NewPPSVariantIFC(Stack[i], False));
+ try
+ Result := Caller.InnerfuseCall(FSelf, p.Ext1, cdRegister, Params, nil);
+ finally
+ Cardinal(n.Dta^) := getMethodNo(data, Caller);
+ if Cardinal(n.Dta^) = 0 then
+ begin
+ Pointer(Pointer((IPointer(n.dta)+PointerSize))^) := data.Data;
+ Pointer(Pointer((IPointer(n.dta)+PointerSize2))^) := data.Code;
+ end;
+ DestroyHeapVariant(n2);
+ DisposePPSVariantIFCList(Params);
+ end;
+ end else begin
+ n := NewTPSVariantIFC(Stack[Longint(Stack.Count) - 1], false);
+ if (n.Dta = nil) or (n.aType.BaseType <> btClass) then
+ begin
+ result := false;
+ Caller.CMD_Err(erNullPointerException);
+ exit;
+ end;
+ FSelf := Tobject(n.dta^);
+ n := NewTPSVariantIFC(Stack[Longint(Stack.Count) - 2], false);
+ if (n.Dta = nil) or ((n.aType.BaseType <> btu32) and (n.aType.BaseType <> btProcPtr)) then
+ begin
+ result := false;
+ Caller.CMD_Err(erNullPointerException);
+ exit;
+ end;
+ n2 := CreateHeapVariant(Caller.FindType2(btPchar));
+ if n2 = nil then
+ begin
+ Result := False;
+ exit;
+ end;
+
+ if (n.aType.BaseType = btProcPtr) and (cardinal(n.dta^) = 0) then
+ data := TMethod(Pointer(IPointer(n.dta^)+4)^)
+ else
+ data := MkMethod(Caller, cardinal(n.dta^));
+ Params := TPSList.Create;
+ Params.Add(NewPPSVariantIFC(n2, False));
+
+ for i := Stack.Count -2 downto Longint(Stack.Count) - ParamCount -1 do
+ begin
+ Params.Add(NewPPSVariantIFC(Stack[I], False));
+ end;
+ try
+ Result := Caller.InnerfuseCall(FSelf, p.Ext2, cdregister, Params, nil);
+ finally
+ DestroyHeapVariant(n2);
+ DisposePPSVariantIFCList(Params);
+ end;
+ end;
+end;
+
+
+{'class:'+CLASSNAME+'|'+FUNCNAME+'|'+chr(CallingConv)+chr(hasresult)+params
+
+For property write functions there is an '@' after the funcname.
+}
+function SpecImport(Sender: TPSExec; p: TPSExternalProcRec; Tag: Pointer): Boolean;
+var
+ H, I: Longint;
+ S, s2: tbtString;
+ CL: TPSRuntimeClass;
+ Px: PClassItem;
+ pp: PPropInfo;
+ IsRead: Boolean;
+begin
+ s := p.Decl;
+ delete(s, 1, 6);
+ if s = '-' then {nil function}
+ begin
+ p.ProcPtr := NilProc;
+ Result := True;
+ exit;
+ end;
+ if s = '+' then {cast function}
+ begin
+ p.ProcPtr := CastProc;
+ p.Ext2 := Tag;
+ Result := True;
+ exit;
+ end;
+ s2 := copy(S, 1, pos(tbtchar('|'), s)-1);
+ delete(s, 1, length(s2) + 1);
+ H := MakeHash(s2);
+ ISRead := False;
+ cl := nil;
+ for I := TPSRuntimeClassImporter(Tag).FClasses.Count -1 downto 0 do
+ begin
+ Cl := TPSRuntimeClassImporter(Tag).FClasses[I];
+ if (Cl.FClassNameHash = h) and (cl.FClassName = s2) then
+ begin
+ IsRead := True;
+ break;
+ end;
+ end;
+ if not isRead then begin
+ Result := False;
+ exit;
+ end;
+ s2 := copy(S, 1, pos(tbtchar('|'), s)-1);
+ delete(s, 1, length(s2) + 1);
+ if (s2 <> '') and (s2[length(s2)] = '@') then
+ begin
+ IsRead := False;
+ Delete(S2, length(s2), 1);
+ end else
+ isRead := True;
+ p.Name := s2;
+ H := MakeHash(s2);
+ for i := cl.FClassItems.Count -1 downto 0 do
+ begin
+ px := cl.FClassItems[I];
+ if (px^.FNameHash = h) and (px^.FName = s2) then
+ begin
+ p.Decl := s;
+ case px^.b of
+ {0: ext1=ptr}
+ {1: ext1=pointerinlist}
+ {2: ext1=propertyinfo}
+ {3: ext1=readfunc; ext2=writefunc}
+ 4:
+ begin
+ p.ProcPtr := ClassCallProcConstructor;
+ p.Ext1 := px^.Ptr;
+ if p.Ext1 = nil then begin result := false; exit; end;
+ p.Ext2 := Tag;
+ end;
+ 5:
+ begin
+ p.ProcPtr := ClassCallProcVirtualConstructor;
+ p.Ext1 := px^.Ptr;
+ if p.Ext1 = nil then begin result := false; exit; end;
+ p.Ext2 := Tag;
+ end;
+ 6:
+ begin
+ p.ProcPtr := ClassCallProcEventPropertyHelper;
+ if IsRead then
+ begin
+ p.Ext1 := px^.FReadFunc;
+ if p.Ext1 = nil then begin result := false; exit; end;
+ p.Ext2 := nil;
+ end else
+ begin
+ p.Ext1 := nil;
+ p.Ext2 := px^.FWriteFunc;
+ if p.Ext2 = nil then begin result := false; exit; end;
+ end;
+ end;
+ 0:
+ begin
+ p.ProcPtr := ClassCallProcMethod;
+ p.Ext1 := px^.Ptr;
+ if p.Ext1 = nil then begin result := false; exit; end;
+ p.Ext2 := nil;
+ end;
+ 1:
+ begin
+ p.ProcPtr := ClassCallProcMethod;
+ p.Ext1 := px^.PointerInList;
+ //if p.Ext1 = nil then begin result := false; exit; end;
+ p.ext2 := pointer(1);
+ end;
+ 3:
+ begin
+ p.ProcPtr := ClassCallProcPropertyHelper;
+ if IsRead then
+ begin
+ p.Ext1 := px^.FReadFunc;
+ if p.Ext1 = nil then begin result := false; exit; end;
+ p.Ext2 := nil;
+ end else
+ begin
+ p.Ext1 := nil;
+ p.Ext2 := px^.FWriteFunc;
+ if p.Ext2 = nil then begin result := false; exit; end;
+ end;
+ end;
+ 7:
+ begin
+ p.ProcPtr := ClassCallProcPropertyHelperName;
+ if IsRead then
+ begin
+ p.Ext1 := px^.FReadFunc;
+ if p.Ext1 = nil then begin result := false; exit; end;
+ p.Ext2 := nil;
+ end else
+ begin
+ p.Ext1 := nil;
+ p.Ext2 := px^.FWriteFunc;
+ if p.Ext2 = nil then begin result := false; exit; end;
+ end;
+ end;
+ else
+ begin
+ result := false;
+ exit;
+ end;
+ end;
+ Result := true;
+ exit;
+ end;
+ end;
+ if cl.FClass.ClassInfo <> nil then
+ begin
+ pp := GetPropInfo(cl.FClass.ClassInfo, string(s2));
+ if pp <> nil then
+ begin
+ p.ProcPtr := ClassCallProcProperty;
+ p.Ext1 := pp;
+ if IsRead then
+ p.Ext2 := Pointer(1)
+ else
+ p.Ext2 := Pointer(0);
+ Result := True;
+ end else
+ result := false;
+ end else
+ Result := False;
+end;
+
+procedure RegisterClassLibraryRuntime(SE: TPSExec; Importer: TPSRuntimeClassImporter);
+begin
+ SE.AddSpecialProcImport('class', SpecImport, Importer);
+end;
+
+
+procedure TPSExec.ClearspecialProcImports;
+var
+ I: Longint;
+ P: PSpecialProc;
+begin
+ for I := FSpecialProcList.Count -1 downto 0 do
+ begin
+ P := FSpecialProcList[I];
+ Dispose(p);
+ end;
+ FSpecialProcList.Clear;
+end;
+
+procedure TPSExec.RaiseCurrentException;
+var
+ ExObj: TObject;
+begin
+ if ExEx = erNoError then exit; // do nothing
+ ExObj := Self.ExObject;
+ if ExObj <> nil then
+ begin
+ Self.ExObject := nil;
+ raise ExObj;
+ end;
+ raise EPSException.Create(PSErrorToString(ExceptionCode, ExceptionString), Self, ExProc, ExPos);
+end;
+
+procedure TPSExec.CMD_Err2(EC: TPSError; const Param: tbtString);
+begin
+ CMD_Err3(EC, Param, Nil);
+end;
+
+function TPSExec.GetProcAsMethod(const ProcNo: Cardinal): TMethod;
+begin
+ Result := MkMethod(Self, ProcNo);
+end;
+
+function TPSExec.GetProcAsMethodN(const ProcName: tbtString): TMethod;
+var
+ procno: Cardinal;
+begin
+ Procno := GetProc(ProcName);
+ if Procno = InvalidVal then
+ begin
+ Result.Code := nil;
+ Result.Data := nil;
+ end
+ else
+ Result := MkMethod(Self, procno)
+end;
+
+
+procedure TPSExec.RegisterAttributeType(useproc: TPSAttributeUseProc;
+ const TypeName: tbtString);
+var
+ att: TPSAttributeType;
+begin
+ att := TPSAttributeType.Create;
+ att.TypeName := TypeName;
+ att.TypeNameHash := MakeHash(TypeName);
+ att.UseProc := UseProc;
+ FAttributeTypes.Add(att);
+end;
+
+function TPSExec.GetProcCount: Cardinal;
+begin
+ Result := FProcs.Count;
+end;
+
+function TPSExec.GetTypeCount: Longint;
+begin
+ Result := FTypes.Count;
+end;
+
+function TPSExec.GetVarCount: Longint;
+begin
+ Result := FGlobalVars.Count;
+end;
+
+function TPSExec.FindSpecialProcImport(
+ P: TPSOnSpecialProcImport): pointer;
+var
+ i: Longint;
+ pr: PSpecialProc;
+begin
+ for i := FSpecialProcList.Count -1 downto 0 do
+ begin
+ pr := FSpecialProcList[i];
+ if @pr.P = @p then
+ begin
+ Result := pr.tag;
+ exit;
+ end;
+ end;
+ result := nil;
+end;
+
+function TPSExec.InvokeExternalMethod(At: TPSTypeRec_ProcPtr; Slf,
+ Ptr: Pointer): Boolean;
+var
+ res: PPSVariantIFC;
+ s: tbtString;
+ CurrStack, i: Longint;
+ n: PPSVariant;
+ MyList: TPSList;
+begin
+ s := TPSTypeRec_ProcPtr(at).ParamInfo;
+ CurrStack := Cardinal(FStack.Count) - Cardinal(length(s));
+ if s[1] = #0 then inc(CurrStack);
+ MyList := TPSList.Create;
+ for i := 2 to length(s) do
+ begin
+ MyList.Add(nil);
+ end;
+ for i := length(s) downto 2 do
+ begin
+ n := FStack[CurrStack];
+ MyList[i - 2] := NewPPSVariantIFC(n, s[i] <> #0);
+ inc(CurrStack);
+ end;
+ if s[1] <> #0 then
+ begin
+ res := NewPPSVariantIFC(FStack[CurrStack + 1], True);
+ end else res := nil;
+ Result := InnerfuseCall(Slf, Ptr, cdRegister, MyList, Res);
+
+ DisposePPSVariantIFC(res);
+ DisposePPSVariantIFCList(mylist);
+end;
+
+function TPSExec.LastEx: TPSError;
+var
+ pp: TPSExceptionHandler;
+begin
+ if FExceptionStack.Count = 0 then begin
+ result := ExEx;
+ exit;
+ end;
+ pp := fExceptionStack[fExceptionStack.Count-1];
+ result := pp.ExceptionData;
+end;
+
+function TPSExec.LastExParam: tbtString;
+begin
+ result := ExParam;
+end;
+
+function TPSExec.LastExPos: Integer;
+begin
+ result := ExPos;
+end;
+
+function TPSExec.LastExProc: Integer;
+begin
+ result := exProc;
+end;
+
+{ TPSRuntimeClass }
+
+constructor TPSRuntimeClass.Create(aClass: TClass; const AName: tbtString);
+begin
+ inherited Create;
+ FClass := AClass;
+ if AName = '' then
+ begin
+ FClassName := FastUpperCase(tbtString(aClass.ClassName));
+ FClassNameHash := MakeHash(FClassName);
+ end else begin
+ FClassName := FastUppercase(AName);
+ FClassNameHash := MakeHash(FClassName);
+ end;
+ FClassItems:= TPSList.Create;
+ FEndOfVmt := MaxInt;
+end;
+
+destructor TPSRuntimeClass.Destroy;
+var
+ I: Longint;
+ P: PClassItem;
+begin
+ for i:= FClassItems.Count -1 downto 0 do
+ begin
+ P := FClassItems[I];
+ Dispose(p);
+ end;
+ FClassItems.Free;
+ inherited Destroy;
+end;
+
+procedure TPSRuntimeClass.RegisterVirtualAbstractMethod(ClassDef: TClass;
+ ProcPtr: Pointer; const Name: tbtString);
+var
+ P: PClassItem;
+begin
+ New(P);
+ p^.FName := FastUppercase(Name);
+ p^.FNameHash := MakeHash(p^.FName);
+ p^.b := 1;
+ p^.PointerInList := FindVirtualMethodPtr(Self, ClassDef, ProcPtr);
+ FClassItems.Add(p);
+end;
+
+procedure TPSRuntimeClass.RegisterConstructor(ProcPtr: Pointer;
+ const Name: tbtString);
+var
+ P: PClassItem;
+begin
+ New(P);
+ p^.FName := FastUppercase(Name);
+ p^.FNameHash := MakeHash(p^.FName);
+ p^.b := 4;
+ p^.Ptr := ProcPtr;
+ FClassItems.Add(p);
+end;
+
+procedure TPSRuntimeClass.RegisterMethod(ProcPtr: Pointer; const Name: tbtString);
+var
+ P: PClassItem;
+begin
+ New(P);
+ p^.FName := FastUppercase(Name);
+ p^.FNameHash := MakeHash(p^.FName);
+ p^.b := 0;
+ p^.Ptr := ProcPtr;
+ FClassItems.Add(p);
+end;
+
+
+procedure TPSRuntimeClass.RegisterPropertyHelper(ReadFunc,
+ WriteFunc: Pointer; const Name: tbtString);
+var
+ P: PClassItem;
+begin
+ New(P);
+ p^.FName := FastUppercase(Name);
+ p^.FNameHash := MakeHash(p^.FName);
+ p^.b := 3;
+ p^.FReadFunc := ReadFunc;
+ p^.FWriteFunc := WriteFunc;
+ FClassItems.Add(p);
+end;
+
+procedure TPSRuntimeClass.RegisterVirtualConstructor(ProcPtr: Pointer;
+ const Name: tbtString);
+var
+ P: PClassItem;
+begin
+ New(P);
+ p^.FName := FastUppercase(Name);
+ p^.FNameHash := MakeHash(p^.FName);
+ p^.b := 5;
+ p^.PointerInList := FindVirtualMethodPtr(Self, FClass, ProcPtr);
+ FClassItems.Add(p);
+end;
+
+procedure TPSRuntimeClass.RegisterVirtualMethod(ProcPtr: Pointer; const Name: tbtString);
+var
+ P: PClassItem;
+begin
+ New(P);
+ p^.FName := FastUppercase(Name);
+ p^.FNameHash := MakeHash(p^.FName);
+ p^.b := 1;
+ p^.PointerInList := FindVirtualMethodPtr(Self, FClass, ProcPtr);
+ FClassItems.Add(p);
+end;
+
+procedure TPSRuntimeClass.RegisterEventPropertyHelper(ReadFunc,
+ WriteFunc: Pointer; const Name: tbtString);
+var
+ P: PClassItem;
+begin
+ New(P);
+ p^.FName := FastUppercase(Name);
+ p^.FNameHash := MakeHash(p^.FName);
+ p^.b := 6;
+ p^.FReadFunc := ReadFunc;
+ p^.FWriteFunc := WriteFunc;
+ FClassItems.Add(p);
+end;
+
+
+procedure TPSRuntimeClass.RegisterPropertyHelperName(ReadFunc,
+ WriteFunc: Pointer; const Name: tbtString);
+var
+ P: PClassItem;
+begin
+ New(P);
+ p^.FName := FastUppercase(Name);
+ p^.FNameHash := MakeHash(p^.FName);
+ p^.b := 7;
+ p^.FReadFunc := ReadFunc;
+ p^.FWriteFunc := WriteFunc;
+ FClassItems.Add(p);
+end;
+
+{ TPSRuntimeClassImporter }
+
+function TPSRuntimeClassImporter.Add(aClass: TClass): TPSRuntimeClass;
+begin
+ Result := FindClass(tbtstring(aClass.ClassName));
+ if Result <> nil then exit;
+ Result := TPSRuntimeClass.Create(aClass, '');
+ FClasses.Add(Result);
+end;
+
+function TPSRuntimeClassImporter.Add2(aClass: TClass;
+ const Name: tbtString): TPSRuntimeClass;
+begin
+ Result := FindClass(Name);
+ if Result <> nil then exit;
+ Result := TPSRuntimeClass.Create(aClass, Name);
+ FClasses.Add(Result);
+end;
+
+procedure TPSRuntimeClassImporter.Clear;
+var
+ I: Longint;
+begin
+ for i := 0 to FClasses.Count -1 do
+ begin
+ TPSRuntimeClass(FClasses[I]).Free;
+ end;
+ FClasses.Clear;
+end;
+
+constructor TPSRuntimeClassImporter.Create;
+begin
+ inherited Create;
+ FClasses := TPSList.Create;
+
+end;
+
+constructor TPSRuntimeClassImporter.CreateAndRegister(Exec: TPSexec;
+ AutoFree: Boolean);
+begin
+ inherited Create;
+ FClasses := TPSList.Create;
+ RegisterClassLibraryRuntime(Exec, Self);
+ if AutoFree then
+ Exec.AddResource(@RCIFreeProc, Self);
+end;
+
+destructor TPSRuntimeClassImporter.Destroy;
+begin
+ Clear;
+ FClasses.Free;
+ inherited Destroy;
+end;
+
+{$IFNDEF PS_NOINTERFACES}
+procedure SetVariantToInterface(V: PIFVariant; Cl: IUnknown);
+begin
+ if (v <> nil) and (v.FType.BaseType = btInterface) then
+ begin
+ PPSVariantinterface(v).Data := cl;
+ {$IFNDEF Delphi3UP}
+ if PPSVariantinterface(v).Data <> nil then
+ PPSVariantinterface(v).Data.AddRef;
+ {$ENDIF}
+ end;
+end;
+{$ENDIF}
+
+procedure SetVariantToClass(V: PIFVariant; Cl: TObject);
+begin
+ if (v <> nil) and (v.FType.BaseType = btClass) then
+ begin
+ PPSVariantclass(v).Data := cl;
+ end;
+end;
+
+function BGRFW(var s: tbtString): tbtString;
+var
+ l: Longint;
+begin
+ l := Length(s);
+ while l >0 do
+ begin
+ if s[l] = ' ' then
+ begin
+ Result := copy(s, l + 1, Length(s) - l);
+ Delete(s, l, Length(s) - l + 1);
+ exit;
+ end;
+ Dec(l);
+ end;
+ Result := s;
+ s := '';
+end;
+
+{$ifdef fpc}
+ {$if defined(cpupowerpc) or defined(cpuarm) or defined(cpu64)}
+ {$define empty_methods_handler}
+ {$ifend}
+{$endif}
+
+{$ifdef empty_methods_handler}
+procedure MyAllMethodsHandler;
+begin
+end;
+{$else}
+
+
+function MyAllMethodsHandler2(Self: PScriptMethodInfo; const Stack: PPointer; _EDX, _ECX: Pointer): Integer; forward;
+
+procedure MyAllMethodsHandler;
+// On entry:
+// EAX = Self pointer
+// EDX, ECX = param1 and param2
+// STACK = param3... paramcount
+asm
+ push 0
+ push ecx
+ push edx
+ mov edx, esp
+ add edx, 16 // was 12
+ pop ecx
+ call MyAllMethodsHandler2
+ pop ecx
+ mov edx, [esp]
+ add esp, eax
+ mov [esp], edx
+ mov eax, ecx
+end;
+
+function ResultAsRegister(b: TPSTypeRec): Boolean;
+begin
+ case b.BaseType of
+ btSingle,
+ btDouble,
+ btExtended,
+ btU8,
+ bts8,
+ bts16,
+ btu16,
+ bts32,
+ btu32,
+{$IFDEF PS_FPCSTRINGWORKAROUND}
+ btString,
+{$ENDIF}
+{$IFNDEF PS_NOINT64}
+ bts64,
+{$ENDIF}
+ btPChar,
+{$IFNDEF PS_NOWIDESTRING}
+ btWideChar,
+{$ENDIF}
+ btChar,
+ btclass,
+ btEnum: Result := true;
+ btSet: Result := b.RealSize <= PointerSize;
+ btStaticArray: Result := b.RealSize <= PointerSize;
+ else
+ Result := false;
+ end;
+end;
+
+function SupportsRegister(b: TPSTypeRec): Boolean;
+begin
+ case b.BaseType of
+ btU8,
+ bts8,
+ bts16,
+ btu16,
+ bts32,
+ btu32,
+ btstring,
+ btclass,
+{$IFNDEF PS_NOINTERFACES}
+ btinterface,
+{$ENDIF}
+ btPChar,
+{$IFNDEF PS_NOWIDESTRING}
+ btwidestring,
+ btUnicodeString,
+ btWideChar,
+{$ENDIF}
+ btChar,
+ btArray,
+ btEnum: Result := true;
+ btSet: Result := b.RealSize <= PointerSize;
+ btStaticArray: Result := b.RealSize <= PointerSize;
+ else
+ Result := false;
+ end;
+end;
+
+function AlwaysAsVariable(aType: TPSTypeRec): Boolean;
+begin
+ case atype.BaseType of
+ btVariant: Result := true;
+ btSet: Result := atype.RealSize > PointerSize;
+ btRecord: Result := atype.RealSize > PointerSize;
+ btStaticArray: Result := atype.RealSize > PointerSize;
+ else
+ Result := false;
+ end;
+end;
+
+
+procedure PutOnFPUStackExtended(ft: extended);
+asm
+// fstp tbyte ptr [ft]
+ fld tbyte ptr [ft]
+
+end;
+
+
+function MyAllMethodsHandler2(Self: PScriptMethodInfo; const Stack: PPointer; _EDX, _ECX: Pointer): Integer;
+var
+ Decl: tbtString;
+ I, C, regno: Integer;
+ Params: TPSList;
+ Res, Tmp: PIFVariant;
+ cpt: PIFTypeRec;
+ fmod: tbtchar;
+ s,e: tbtString;
+ FStack: pointer;
+ ex: TPSExceptionHandler;
+
+
+begin
+ Decl := TPSInternalProcRec(Self^.Se.FProcs[Self^.ProcNo]).ExportDecl;
+
+ FStack := Stack;
+ Params := TPSList.Create;
+ s := decl;
+ grfw(s);
+ while s <> '' do
+ begin
+ Params.Add(nil);
+ grfw(s);
+ end;
+ c := Params.Count;
+ regno := 0;
+ Result := 0;
+ s := decl;
+ grfw(s);
+ for i := c-1 downto 0 do
+ begin
+ e := grfw(s);
+ fmod := e[1];
+ delete(e, 1, 1);
+ cpt := Self.Se.GetTypeNo(StrToInt(e));
+ if ((fmod = '%') or (fmod = '!') or (AlwaysAsVariable(cpt))) and (RegNo < 2) then
+ begin
+ tmp := CreateHeapVariant(self.Se.FindType2(btPointer));
+ PPSVariantPointer(tmp).DestType := cpt;
+ Params[i] := tmp;
+ case regno of
+ 0: begin
+ PPSVariantPointer(tmp).DataDest := Pointer(_EDX);
+ inc(regno);
+ end;
+ 1: begin
+ PPSVariantPointer(tmp).DataDest := Pointer(_ECX);
+ inc(regno);
+ end;
+(* else begin
+ PPSVariantPointer(tmp).DataDest := Pointer(FStack^);
+ FStack := Pointer(IPointer(FStack) + 4);
+ end;*)
+ end;
+ end
+ else if SupportsRegister(cpt) and (RegNo < 2) then
+ begin
+ tmp := CreateHeapVariant(cpt);
+ Params[i] := tmp;
+ case regno of
+ 0: begin
+ CopyArrayContents(@PPSVariantData(tmp)^.Data, @_EDX, 1, cpt);
+ inc(regno);
+ end;
+ 1: begin
+ CopyArrayContents(@PPSVariantData(tmp)^.Data, @_ECX, 1, cpt);
+ inc(regno);
+ end;
+(* else begin
+ CopyArrayContents(@PPSVariantData(tmp)^.Data, Pointer(FStack), 1, cpt);
+ FStack := Pointer(IPointer(FStack) + 4);
+ end;*)
+ end;
+(* end else
+ begin
+ tmp := CreateHeapVariant(cpt);
+ Params[i] := tmp;
+ CopyArrayContents(@PPSVariantData(tmp)^.Data, Pointer(FStack), 1, cpt);
+ FStack := Pointer(IPointer(FStack) + cpt.RealSize + 3 and not 3);*)
+ end;
+ end;
+ s := decl;
+ e := grfw(s);
+
+ if e <> '-1' then
+ begin
+ cpt := Self.Se.GetTypeNo(StrToInt(e));
+ if not ResultAsRegister(cpt) then
+ begin
+ Res := CreateHeapVariant(Self.Se.FindType2(btPointer));
+ PPSVariantPointer(Res).DestType := cpt;
+ Params.Add(Res);
+ case regno of
+ 0: begin
+ PPSVariantPointer(Res).DataDest := Pointer(_EDX);
+ end;
+ 1: begin
+ PPSVariantPointer(Res).DataDest := Pointer(_ECX);
+ end;
+ else begin
+ PPSVariantPointer(Res).DataDest := Pointer(FStack^);
+ Inc(Result, PointerSize);
+ end;
+ end;
+ end else
+ begin
+ Res := CreateHeapVariant(cpt);
+ Params.Add(Res);
+ end;
+ end else Res := nil;
+ s := decl;
+ grfw(s);
+ for i := 0 to c -1 do
+ begin
+ e := grlw(s);
+ fmod := e[1];
+ delete(e, 1, 1);
+ if Params[i] <> nil then Continue;
+ cpt := Self.Se.GetTypeNo(StrToInt(e));
+ if (fmod = '%') or (fmod = '!') or (AlwaysAsVariable(cpt)) then
+ begin
+ tmp := CreateHeapVariant(self.Se.FindType2(btPointer));
+ PPSVariantPointer(tmp).DestType := cpt;
+ Params[i] := tmp;
+ PPSVariantPointer(tmp).DataDest := Pointer(FStack^);
+ FStack := Pointer(IPointer(FStack) + PointerSize);
+ Inc(Result, PointerSize);
+ end
+(* else if SupportsRegister(cpt) then
+ begin
+ tmp := CreateHeapVariant(cpt);
+ Params[i] := tmp;
+ CopyArrayContents(@PPSVariantData(tmp)^.Data, Pointer(FStack), 1, cpt);
+ FStack := Pointer(IPointer(FStack) + 4);
+ end;
+ end *)else
+ begin
+ tmp := CreateHeapVariant(cpt);
+ Params[i] := tmp;
+ CopyArrayContents(@PPSVariantData(tmp)^.Data, Pointer(FStack), 1, cpt);
+ FStack := Pointer((IPointer(FStack) + cpt.RealSize + 3) and not 3);
+ Inc(Result, (cpt.RealSize + 3) and not 3);
+ end;
+ end;
+ ex := TPSExceptionHandler.Create;
+ ex.FinallyOffset := InvalidVal;
+ ex.ExceptOffset := InvalidVal;
+ ex.Finally2Offset := InvalidVal;
+ ex.EndOfBlock := InvalidVal;
+ ex.CurrProc := nil;
+ ex.BasePtr := Self.Se.FCurrStackBase;
+ Ex.StackSize := Self.Se.FStack.Count;
+ i := Self.Se.FExceptionStack.Add(ex);
+ Self.Se.RunProc(Params, Self.ProcNo);
+ if Self.Se.FExceptionStack[i] = ex then
+ begin
+ Self.Se.FExceptionStack.Remove(ex);
+ ex.Free;
+ end;
+
+ if (Res <> nil) then
+ begin
+ Params.DeleteLast;
+ if (ResultAsRegister(Res.FType)) then
+ begin
+ if (res^.FType.BaseType = btSingle) or (res^.FType.BaseType = btDouble) or
+ (res^.FType.BaseType = btCurrency) or (res^.Ftype.BaseType = btExtended) then
+ begin
+ case Res^.FType.BaseType of
+ btSingle: PutOnFPUStackExtended(PPSVariantSingle(res).Data);
+ btDouble: PutOnFPUStackExtended(PPSVariantDouble(res).Data);
+ btExtended: PutOnFPUStackExtended(PPSVariantExtended(res).Data);
+ btCurrency: PutOnFPUStackExtended(PPSVariantCurrency(res).Data);
+ end;
+ DestroyHeapVariant(Res);
+ Res := nil;
+ end else
+ begin
+{$IFNDEF PS_NOINT64}
+ if res^.FType.BaseType <> btS64 then
+{$ENDIF}
+ CopyArrayContents(Pointer(Longint(Stack)-PointerSize2), @PPSVariantData(res)^.Data, 1, Res^.FType);
+ end;
+ end;
+ DestroyHeapVariant(res);
+ end;
+ for i := 0 to Params.Count -1 do
+ DestroyHeapVariant(Params[i]);
+ Params.Free;
+ if Self.Se.ExEx <> erNoError then
+ begin
+ if Self.Se.ExObject <> nil then
+ begin
+ FStack := Self.Se.ExObject;
+ Self.Se.ExObject := nil;
+ raise TObject(FStack);
+ end else
+ raise EPSException.Create(PSErrorToString(Self.SE.ExceptionCode, Self.Se.ExceptionString), Self.Se, Self.Se.ExProc, Self.Se.ExPos);
+ end;
+end;
+{$endif}
+function TPSRuntimeClassImporter.FindClass(const Name: tbtString): TPSRuntimeClass;
+var
+ h, i: Longint;
+ lName: tbtstring;
+ p: TPSRuntimeClass;
+begin
+ lName := FastUpperCase(Name);
+ h := MakeHash(lName);
+ for i := FClasses.Count -1 downto 0 do
+ begin
+ p := FClasses[i];
+ if (p.FClassNameHash = h) and (p.FClassName = lName) then
+ begin
+ Result := P;
+ exit;
+ end;
+ end;
+ Result := nil;
+end;
+
+function DelphiFunctionProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack; CC: TPSCallingConvention): Boolean;
+var
+ i: Integer;
+ MyList: TPSList;
+ n: PPSVariantIFC;
+ CurrStack: Cardinal;
+ s: tbtString;
+begin
+ s := P.Decl;
+ if length(s) = 0 then begin Result := False; exit; end;
+ CurrStack := Cardinal(Stack.Count) - Cardinal(length(s));
+ if s[1] = #0 then inc(CurrStack);
+ MyList := TPSList.Create;
+
+ for i := 2 to length(s) do
+ begin
+ MyList.Add(nil);
+ end;
+ for i := length(s) downto 2 do
+ begin
+ MyList[i - 2] := NewPPSVariantIFC(Stack[CurrStack], s[i] <> #0);
+ inc(CurrStack);
+ end;
+ if s[1] <> #0 then
+ begin
+ n := NewPPSVariantIFC(Stack[CurrStack], True);
+ end else n := nil;
+ try
+ result := Caller.InnerfuseCall(p.Ext2, p.Ext1, cc, MyList, n);
+ finally
+ DisposePPSVariantIFC(n);
+ DisposePPSVariantIFCList(mylist);
+ end;
+end;
+
+function DelphiFunctionProc_CDECL(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+begin
+ Result := DelphiFunctionProc(Caller, p, Global, Stack, cdCdecl);
+end;
+function DelphiFunctionProc_Register(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+begin
+ Result := DelphiFunctionProc(Caller, p, Global, Stack, cdRegister);
+end;
+function DelphiFunctionProc_Pascal(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+begin
+ Result := DelphiFunctionProc(Caller, p, Global, Stack, cdPascal);
+end;
+function DelphiFunctionProc_Stdcall(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+begin
+ Result := DelphiFunctionProc(Caller, p, Global, Stack, cdStdCall);
+end;
+function DelphiFunctionProc_Safecall(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
+begin
+ Result := DelphiFunctionProc(Caller, p, Global, Stack, cdSafeCall);
+end;
+
+procedure TPSExec.RegisterDelphiFunction(ProcPtr: Pointer;
+ const Name: tbtString; CC: TPSCallingConvention);
+begin
+ RegisterDelphiMethod(nil, ProcPtr, FastUppercase(Name), CC);
+end;
+
+procedure TPSExec.RegisterDelphiMethod(Slf, ProcPtr: Pointer;
+ const Name: tbtString; CC: TPSCallingConvention);
+begin
+ case cc of
+ cdRegister: RegisterFunctionName(FastUppercase(Name), DelphiFunctionProc_Register, ProcPtr, Slf);
+ cdPascal: RegisterFunctionName(FastUppercase(Name), DelphiFunctionProc_Pascal, ProcPtr, Slf);
+ cdStdCall: RegisterFunctionName(FastUppercase(Name), DelphiFunctionProc_Stdcall, ProcPtr, Slf);
+ cdSafeCall: RegisterFunctionName(FastUppercase(Name), DelphiFunctionProc_Safecall, ProcPtr, Slf);
+ cdCdecl: RegisterFunctionName(FastUppercase(Name), DelphiFunctionProc_CDECL, ProcPtr, Slf);
+ end;
+end;
+
+{ EPSException }
+
+constructor EPSException.Create(const Error: tbtString; Exec: TPSExec;
+ Procno, ProcPos: Cardinal);
+begin
+ inherited Create(string(Error));
+ FExec := Exec;
+ FProcNo := Procno;
+ FProcPos := ProcPos;
+end;
+
+{ TPSRuntimeAttribute }
+
+function TPSRuntimeAttribute.AddValue(aType: TPSTypeRec): PPSVariant;
+begin
+ Result := FValues.PushType(aType);
+end;
+
+procedure TPSRuntimeAttribute.AdjustSize;
+begin
+ FValues.Capacity := FValues.Length;
+end;
+
+constructor TPSRuntimeAttribute.Create(Owner: TPSRuntimeAttributes);
+begin
+ inherited Create;
+ FOwner := Owner;
+ FValues := TPSStack.Create;
+end;
+
+procedure TPSRuntimeAttribute.DeleteValue(i: Longint);
+begin
+ if Cardinal(i) <> Cardinal(FValues.Count -1) then
+ raise Exception.Create(RPS_CanOnlySendLastItem);
+ FValues.Pop;
+end;
+
+destructor TPSRuntimeAttribute.Destroy;
+begin
+ FValues.Free;
+ inherited Destroy;
+end;
+
+function TPSRuntimeAttribute.GetValue(I: Longint): PIFVariant;
+begin
+ Result := FValues[i];
+end;
+
+function TPSRuntimeAttribute.GetValueCount: Longint;
+begin
+ Result := FValues.Count;
+end;
+
+{ TPSRuntimeAttributes }
+
+function TPSRuntimeAttributes.Add: TPSRuntimeAttribute;
+begin
+ Result := TPSRuntimeAttribute.Create(Self);
+ FAttributes.Add(Result);
+end;
+
+constructor TPSRuntimeAttributes.Create(AOwner: TPSExec);
+begin
+ inherited Create;
+ FAttributes := TPSList.Create;
+ FOwner := AOwner;
+end;
+
+procedure TPSRuntimeAttributes.Delete(I: Longint);
+begin
+ TPSRuntimeAttribute(FAttributes[i]).Free;
+ FAttributes.Delete(i);
+end;
+
+destructor TPSRuntimeAttributes.Destroy;
+var
+ i: Longint;
+begin
+ for i := FAttributes.Count -1 downto 0 do
+ TPSRuntimeAttribute(FAttributes[i]).Free;
+ FAttributes.Free;
+ inherited Destroy;
+end;
+
+function TPSRuntimeAttributes.FindAttribute(
+ const Name: tbtString): TPSRuntimeAttribute;
+var
+ n: tbtString;
+ i, h: Longint;
+begin
+ n := FastUpperCase(Name);
+ h := MakeHash(n);
+ for i := 0 to FAttributes.Count -1 do
+ begin
+ Result := FAttributes[i];
+ if (Result.AttribTypeHash = h) and (Result.AttribType = n) then
+ exit;
+ end;
+ Result := nil;
+end;
+
+function TPSRuntimeAttributes.GetCount: Longint;
+begin
+ Result := FAttributes.Count;
+end;
+
+function TPSRuntimeAttributes.GetItem(I: Longint): TPSRuntimeAttribute;
+begin
+ Result := FAttributes[i];
+end;
+
+{ TPSInternalProcRec }
+
+destructor TPSInternalProcRec.Destroy;
+begin
+ if FData <> nil then
+ Freemem(Fdata, FLength);
+ inherited Destroy;
+end;
+
+{ TPsProcRec }
+
+constructor TPSProcRec.Create(Owner: TPSExec);
+begin
+ inherited Create;
+ FAttributes := TPSRuntimeAttributes.Create(Owner);
+end;
+
+destructor TPSProcRec.Destroy;
+begin
+ FAttributes.Free;
+ inherited Destroy;
+end;
+
+{ TPSTypeRec_Array }
+
+procedure TPSTypeRec_Array.CalcSize;
+begin
+ FrealSize := PointerSize;
+end;
+
+{ TPSTypeRec_StaticArray }
+
+procedure TPSTypeRec_StaticArray.CalcSize;
+begin
+ FrealSize := Cardinal(FArrayType.RealSize) * Cardinal(Size);
+end;
+
+{ TPSTypeRec_Set }
+
+procedure TPSTypeRec_Set.CalcSize;
+begin
+ FrealSize := FByteSize;
+end;
+
+const
+ MemDelta = 4096;
+
+{ TPSStack }
+
+procedure TPSStack.AdjustLength;
+var
+ MyLen: Longint;
+begin
+ MyLen := ((FLength shr 12) + 1) shl 12;
+
+ SetCapacity(MyLen);
+end;
+
+procedure TPSStack.Clear;
+var
+ v: Pointer;
+ i: Longint;
+begin
+ for i := Count -1 downto 0 do
+ begin
+ v := Data[i];
+ if TPSTypeRec(v^).BaseType in NeedFinalization then
+ FinalizeVariant(Pointer(IPointer(v)+PointerSize), TPSTypeRec(v^));
+ end;
+ inherited Clear;
+ FLength := 0;
+ SetCapacity(0);
+end;
+
+constructor TPSStack.Create;
+begin
+ inherited Create;
+ GetMem(FDataPtr, MemDelta);
+ FCapacity := MemDelta;
+ FLength := 0;
+end;
+
+destructor TPSStack.Destroy;
+var
+ v: Pointer;
+ i: Longint;
+begin
+ for i := Count -1 downto 0 do
+ begin
+ v := Data[i];
+ if TPSTypeRec(v^).BaseType in NeedFinalization then
+ FinalizeVariant(Pointer(IPointer(v)+PointerSize), Pointer(v^));
+ end;
+ FreeMem(FDataPtr, FCapacity);
+ inherited Destroy;
+end;
+
+function TPSStack.GetBool(ItemNo: Longint): Boolean;
+var
+ val: PPSVariant;
+begin
+ if ItemNo < 0 then
+ val := Items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := Items[ItemNo];
+ Result := PSGetUInt(@PPSVariantData(val).Data, val.FType) <> 0;
+end;
+
+function TPSStack.GetClass(ItemNo: Longint): TObject;
+var
+ val: PPSVariant;
+begin
+ if ItemNo < 0 then
+ val := Items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := Items[ItemNo];
+ Result := PSGetObject(@PPSVariantData(val).Data, val.FType);
+end;
+
+function TPSStack.GetCurrency(ItemNo: Longint): Currency;
+var
+ val: PPSVariant;
+begin
+ if ItemNo < 0 then
+ val := Items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := Items[ItemNo];
+ Result := PSGetCurrency(@PPSVariantData(val).Data, val.FType);
+end;
+
+function TPSStack.GetInt(ItemNo: Longint): Longint;
+var
+ val: PPSVariant;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ Result := PSGetInt(@PPSVariantData(val).Data, val.FType);
+end;
+
+{$IFNDEF PS_NOINT64}
+function TPSStack.GetInt64(ItemNo: Longint): Int64;
+var
+ val: PPSVariant;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ Result := PSGetInt64(@PPSVariantData(val).Data, val.FType);
+end;
+{$ENDIF}
+
+function TPSStack.GetItem(I: Longint): PPSVariant;
+begin
+ if Cardinal(I) >= Cardinal(Count) then
+ Result := nil
+ else
+ Result := Data[i];
+end;
+
+function TPSStack.GetReal(ItemNo: Longint): Extended;
+var
+ val: PPSVariant;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ Result := PSGetreal(@PPSVariantData(val).Data, val.FType);
+end;
+
+function TPSStack.GetAnsiString(ItemNo: Longint): tbtString;
+var
+ val: PPSVariant;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ Result := PSGetAnsiString(@PPSVariantData(val).Data, val.FType);
+end;
+
+function TPSStack.GetString(ItemNo: Longint): string; // calls the native method
+begin
+ result := {$IFDEF DELPHI2009UP}GetUnicodeString(ItemNo){$ELSE}GetAnsiString(ItemNo){$ENDIF};
+end;
+
+function TPSStack.GetUInt(ItemNo: Longint): Cardinal;
+var
+ val: PPSVariant;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ Result := PSGetUInt(@PPSVariantData(val).Data, val.FType);
+end;
+
+function TPSStack.GetUnicodeString(ItemNo: Integer): tbtunicodestring;
+var
+ val: PPSVariant;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ Result := PSGetUnicodeString(@PPSVariantData(val).Data, val.FType);
+end;
+
+{$IFNDEF PS_NOWIDESTRING}
+function TPSStack.GetWideString(ItemNo: Longint): tbtWideString;
+var
+ val: PPSVariant;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ Result := PSGetWideString(@PPSVariantData(val).Data, val.FType);
+end;
+{$ENDIF}
+
+procedure TPSStack.Pop;
+var
+ p1: Pointer;
+ c: Longint;
+begin
+ c := count -1;
+ p1 := Data[c];
+ DeleteLast;
+ FLength := IPointer(p1) - IPointer(FDataPtr);
+ if TPSTypeRec(p1^).BaseType in NeedFinalization then
+ FinalizeVariant(Pointer(IPointer(p1)+PointerSize), Pointer(p1^));
+ if ((FCapacity - FLength) shr 12) > 2 then AdjustLength;
+end;
+
+function TPSStack.Push(TotalSize: Longint): PPSVariant;
+var
+ o: Cardinal;
+ p: Pointer;
+begin
+ o := FLength;
+ FLength := (FLength + TotalSize);
+ if FLength mod PointerSize <> 0 then
+ FLength := FLength + (PointerSize - (FLength mod PointerSize));
+ if FLength > FCapacity then AdjustLength;
+ p := Pointer(IPointer(FDataPtr) + IPointer(o));
+ Add(p);
+ Result := P;
+end;
+
+function TPSStack.PushType(aType: TPSTypeRec): PPSVariant;
+begin
+ Result := Push(aType.RealSize + Sizeof(Pointer));
+ Result.FType := aType;
+ InitializeVariant(Pointer(IPointer(Result)+PointerSize), aType);
+end;
+
+procedure TPSStack.SetBool(ItemNo: Longint; const Data: Boolean);
+var
+ val: PPSVariant;
+ ok: Boolean;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ ok := true;
+ if Data then
+ PSSetUInt(@PPSVariantData(val).Data, val.FType, ok, 1)
+ else
+ PSSetUInt(@PPSVariantData(val).Data, val.FType, ok, 0);
+ if not ok then raise Exception.Create(RPS_TypeMismatch);
+end;
+
+procedure TPSStack.SetCapacity(const Value: Longint);
+var
+ p: Pointer;
+ OOFS: IPointer;
+ I: Longint;
+begin
+ if Value < FLength then raise Exception.Create(RPS_CapacityLength);
+ if Value = 0 then
+ begin
+ if FDataPtr <> nil then
+ begin
+ FreeMem(FDataPtr, FCapacity);
+ FDataPtr := nil;
+ end;
+ FCapacity := 0;
+ end;
+ GetMem(p, Value);
+ if FDataPtr <> nil then
+ begin
+ if FLength > FCapacity then
+ OOFS := FCapacity
+ else
+ OOFS := FLength;
+ Move(FDataPtr^, p^, OOFS);
+ OOFS := IPointer(P) - IPointer(FDataPtr);
+
+ for i := Count -1 downto 0 do begin
+ Data[i] := Pointer(IPointer(Data[i]) + OOFS);
+ if Items[i].FType.FBaseType = btPointer then begin // check if pointer points to moved stack data
+ if (IPointer(PPSVariantPointer(Data[i]).DataDest) >= IPointer(FDataPtr)) and
+ (IPointer(PPSVariantPointer(Data[i]).DataDest) < IPointer(FDataPtr)+IPointer(FLength)) then
+ PPSVariantPointer(Data[i]).DataDest := Pointer(IPointer(PPSVariantPointer(Data[i]).DataDest) + OOFS);
+ end;
+ end;
+
+ FreeMem(FDataPtr, FCapacity);
+ end;
+ FDataPtr := p;
+ FCapacity := Value;
+end;
+
+procedure TPSStack.SetClass(ItemNo: Longint; const Data: TObject);
+var
+ val: PPSVariant;
+ ok: Boolean;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ ok := true;
+ PSSetObject(@PPSVariantData(val).Data, val.FType, ok, Data);
+ if not ok then raise Exception.Create(RPS_TypeMismatch);
+end;
+
+procedure TPSStack.SetCurrency(ItemNo: Longint; const Data: Currency);
+var
+ val: PPSVariant;
+ ok: Boolean;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ ok := true;
+ PSSetCurrency(@PPSVariantData(val).Data, val.FType, ok, Data);
+ if not ok then raise Exception.Create(RPS_TypeMismatch);
+end;
+
+procedure TPSStack.SetInt(ItemNo: Longint; const Data: Longint);
+var
+ val: PPSVariant;
+ ok: Boolean;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ ok := true;
+ PSSetInt(@PPSVariantData(val).Data, val.FType, ok, Data);
+ if not ok then raise Exception.Create(RPS_TypeMismatch);
+end;
+
+{$IFNDEF PS_NOINT64}
+procedure TPSStack.SetInt64(ItemNo: Longint; const Data: Int64);
+var
+ val: PPSVariant;
+ ok: Boolean;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ ok := true;
+ PSSetInt64(@PPSVariantData(val).Data, val.FType, ok, Data);
+ if not ok then raise Exception.Create(RPS_TypeMismatch);
+end;
+{$ENDIF}
+
+procedure TPSStack.SetReal(ItemNo: Longint; const Data: Extended);
+var
+ val: PPSVariant;
+ ok: Boolean;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ ok := true;
+ PSSetReal(@PPSVariantData(val).Data, val.FType, ok, Data);
+ if not ok then raise Exception.Create(RPS_TypeMismatch);
+end;
+
+procedure TPSStack.SetAnsiString(ItemNo: Longint; const Data: tbtString);
+var
+ val: PPSVariant;
+ ok: Boolean;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ ok := true;
+ PSSetAnsiString(@PPSVariantData(val).Data, val.FType, ok, Data);
+ if not ok then raise Exception.Create(RPS_TypeMismatch);
+end;
+
+procedure TPSStack.SetString(ItemNo: Longint; const Data: string);
+begin
+ {$IFDEF DELPHI2009UP}
+ SetUnicodeString(ItemNo, Data);
+ {$ELSE}
+ SetAnsiString(ItemNo, Data);
+ {$ENDIF}
+end;
+
+
+procedure TPSStack.SetUInt(ItemNo: Longint; const Data: Cardinal);
+var
+ val: PPSVariant;
+ ok: Boolean;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ ok := true;
+ PSSetUInt(@PPSVariantData(val).Data, val.FType, ok, Data);
+ if not ok then raise Exception.Create(RPS_TypeMismatch);
+end;
+
+
+{$IFNDEF PS_NOWIDESTRING}
+procedure TPSStack.SetUnicodeString(ItemNo: Integer;
+ const Data: tbtunicodestring);
+var
+ val: PPSVariant;
+ ok: Boolean;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ ok := true;
+ PSSetUnicodeString(@PPSVariantData(val).Data, val.FType, ok, Data);
+end;
+
+procedure TPSStack.SetWideString(ItemNo: Longint;
+ const Data: tbtWideString);
+var
+ val: PPSVariant;
+ ok: Boolean;
+begin
+ if ItemNo < 0 then
+ val := items[Longint(ItemNo) + Longint(Count)]
+ else
+ val := items[ItemNo];
+ ok := true;
+ PSSetWideString(@PPSVariantData(val).Data, val.FType, ok, Data);
+ if not ok then raise Exception.Create(RPS_TypeMismatch);
+end;
+{$ENDIF}
+
+
+{$IFNDEF PS_NOIDISPATCH}
+var
+ DispPropertyPut: Integer = DISPID_PROPERTYPUT;
+const
+ LOCALE_SYSTEM_DEFAULT = 2 shl 10; // Delphi 2 doesn't define this
+
+function IDispatchInvoke(Self: IDispatch; PropertySet: Boolean; const Name: tbtString; const Par: array of Variant): Variant;
+var
+ Param: Word;
+ i, ArgErr: Longint;
+ DispatchId: Longint;
+ DispParam: TDispParams;
+ ExceptInfo: TExcepInfo;
+ aName: PWideChar;
+ WSFreeList: TPSList;
+begin
+ FillChar(ExceptInfo, SizeOf(ExceptInfo), 0);
+ if Name='' then begin
+ DispatchId:=0;
+ end else begin
+ aName := StringToOleStr(Name);
+ try
+ if Self = nil then
+ raise Exception.Create(RPS_NILInterfaceException);
+ if Self.GetIDsOfNames(GUID_NULL, @aName, 1, LOCALE_SYSTEM_DEFAULT, @DispatchId) <> S_OK then
+ raise Exception.Create(RPS_UnknownMethod);
+ finally
+ SysFreeString(aName);
+ end;
+ end;
+ DispParam.cNamedArgs := 0;
+ DispParam.rgdispidNamedArgs := nil;
+ DispParam.cArgs := (High(Par) + 1);
+
+ if PropertySet then
+ begin
+ Param := DISPATCH_PROPERTYPUT;
+ DispParam.cNamedArgs := 1;
+ DispParam.rgdispidNamedArgs := @DispPropertyPut;
+ end else
+ Param := DISPATCH_METHOD or DISPATCH_PROPERTYGET;
+
+ WSFreeList := TPSList.Create;
+ try
+ GetMem(DispParam.rgvarg, sizeof(TVariantArg) * (High(Par) + 1));
+ FillCHar(DispParam.rgvarg^, sizeof(TVariantArg) * (High(Par) + 1), 0);
+ try
+ for i := 0 to High(Par) do
+ begin
+ if PVarData(@Par[High(Par)-i]).VType = varString then
+ begin
+ DispParam.rgvarg[i].vt := VT_BSTR;
+ DispParam.rgvarg[i].bstrVal := StringToOleStr(AnsiString(Par[High(Par)-i]));
+ WSFreeList.Add(DispParam.rgvarg[i].bstrVal);
+ {$IFDEF UNICODE}
+ end else if (PVarData(@Par[High(Par)-i]).VType = varOleStr) or (PVarData(@Par[High(Par)-i]).VType = varUString) then
+ begin
+ DispParam.rgvarg[i].vt := VT_BSTR;
+ DispParam.rgvarg[i].bstrVal := StringToOleStr(UnicodeString(Par[High(Par)-i]));
+ WSFreeList.Add(DispParam.rgvarg[i].bstrVal);
+ {$ENDIF}
+ end else
+ begin
+ DispParam.rgvarg[i].vt := VT_VARIANT or VT_BYREF;
+ New(
+ {$IFDEF DELPHI4UP}
+ POleVariant
+ {$ELSE}
+ PVariant{$ENDIF}
+ (DispParam.rgvarg[i].pvarVal));
+
+ (*
+ {$IFDEF DELPHI4UP}
+ POleVariant
+ {$ELSE}
+ PVariant
+ {$ENDIF}
+ (DispParam.rgvarg[i].pvarVal)^ := Par[High(Par)-i];
+ *)
+ Move(Par[High(Par)-i],Pointer(DispParam.rgvarg[i].pvarVal)^,
+ Sizeof({$IFDEF DELPHI4UP}OleVariant{$ELSE}Variant{$ENDIF}));
+
+ end;
+ end;
+ i :=Self.Invoke(DispatchId, GUID_NULL, LOCALE_SYSTEM_DEFAULT, Param, DispParam, @Result, @ExceptInfo, @ArgErr);
+ {$IFNDEF Delphi3UP}
+ try
+ if not Succeeded(i) then
+ begin
+ if i = DISP_E_EXCEPTION then
+ raise Exception.Create(OleStrToString(ExceptInfo.bstrSource)+': '+OleStrToString(ExceptInfo.bstrDescription))
+ else
+ raise Exception.Create(SysErrorMessage(i));
+ end;
+ finally
+ SysFreeString(ExceptInfo.bstrSource);
+ SysFreeString(ExceptInfo.bstrDescription);
+ SysFreeString(ExceptInfo.bstrHelpFile);
+ end;
+ {$ELSE}
+ if not Succeeded(i) then
+ begin
+ if i = DISP_E_EXCEPTION then
+ raise Exception.Create(ExceptInfo.bstrSource+': '+ExceptInfo.bstrDescription)
+ else
+ raise Exception.Create(SysErrorMessage(i));
+ end;
+ {$ENDIF}
+ finally
+ for i := 0 to High(Par) do
+ begin
+ if DispParam.rgvarg[i].vt = (VT_VARIANT or VT_BYREF) then
+ begin
+ if{$IFDEF DELPHI4UP}POleVariant{$ELSE}PVariant{$ENDIF}
+ (DispParam.rgvarg[i].pvarVal) <> nil then
+ Dispose(
+ {$IFDEF DELPHI4UP}
+ POleVariant
+ {$ELSE}
+ PVariant
+ {$ENDIF}
+ (DispParam.rgvarg[i].pvarVal));
+ end;
+ end;
+ FreeMem(DispParam.rgvarg, sizeof(TVariantArg) * (High(Par) + 1));
+ end;
+ finally
+ for i := WSFreeList.Count -1 downto 0 do
+ SysFreeString(WSFreeList[i]);
+ WSFreeList.Free;
+ end;
+end;
+{$ENDIF}
+
+
+{ TPSTypeRec_ProcPtr }
+
+procedure TPSTypeRec_ProcPtr.CalcSize;
+begin
+ FRealSize := 2 * sizeof(Pointer) + Sizeof(Cardinal);
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSUtils.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSUtils.pas
new file mode 100644
index 0000000..76f2d48
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uPSUtils.pas
@@ -0,0 +1,1592 @@
+unit uPSUtils;
+{$I PascalScript.inc}
+
+interface
+uses
+ Classes, SysUtils {$IFDEF VER130}, Windows {$ENDIF};
+
+const
+
+ PSMainProcName = '!MAIN';
+
+ PSMainProcNameOrg = 'Main Proc';
+
+ PSLowBuildSupport = 12;
+
+ PSCurrentBuildNo = 23;
+
+ PSCurrentversion = '1.31';
+
+ PSValidHeader = 1397769801;
+
+ PSAddrStackStart = 1610612736;
+
+ PSAddrNegativeStackStart = 1073741824;
+type
+ TbtString = {$IFDEF DELPHI2009UP}AnsiString{$ELSE}String{$ENDIF};
+
+ TPSBaseType = Byte;
+
+ TPSVariableType = (ivtGlobal, ivtParam, ivtVariable);
+
+const
+
+ btReturnAddress = 0;
+
+ btU8 = 1;
+
+ btS8 = 2;
+
+ btU16 = 3;
+
+ btS16 = 4;
+
+ btU32 = 5;
+
+ btS32 = 6;
+
+ btSingle = 7;
+
+ btDouble = 8;
+
+ btExtended = 9;
+
+ btString = 10;
+
+ btRecord = 11;
+
+ btArray = 12;
+
+ btPointer = 13;
+
+ btPChar = 14;
+
+ btResourcePointer = 15;
+
+ btVariant = 16;
+
+{$IFNDEF PS_NOINT64}
+ btS64 = 17;
+{$ENDIF}
+
+ btChar = 18;
+
+{$IFNDEF PS_NOWIDESTRING}
+ btWideString = 19;
+
+ btWideChar = 20;
+{$ENDIF}
+
+ btProcPtr = 21;
+
+ btStaticArray = 22;
+
+ btSet = 23;
+
+ btCurrency = 24;
+
+ btClass = 25;
+
+ btInterface = 26;
+
+ btNotificationVariant = 27;
+
+ btUnicodeString = 28;
+
+ btType = 130;
+
+ btEnum = 129;
+
+ btExtClass = 131;
+
+function MakeHash(const s: TbtString): Longint;
+
+const
+{ Script internal command: Assign command
+ Command: TPSCommand;
+ VarDest, // no data
+ VarSrc: TPSVariable;
+}
+ CM_A = 0;
+{ Script internal command: Calculate Command
+ Command: TPSCommand;
+ CalcType: Byte;
+
+ 0 = +
+ 1 = -
+ 2 = *
+ 3 = /
+ 4 = MOD
+ 5 = SHL
+ 6 = SHR
+ 7 = AND
+ 8 = OR
+ 9 = XOR
+
+ VarDest, // no data
+ VarSrc: TPSVariable;
+
+}
+ CM_CA = 1;
+{ Script internal command: Push
+ Command: TPSCommand;
+ Var: TPSVariable;
+}
+ CM_P = 2;
+{ Script internal command: Push Var
+ Command: TPSCommand;
+ Var: TPSVariable;
+}
+ CM_PV = 3;
+{ Script internal command: Pop
+ Command: TPSCommand;
+}
+ CM_PO = 4;
+{ Script internal command: Call
+ Command: TPSCommand;
+ ProcNo: Longword;
+}
+ Cm_C = 5;
+{ Script internal command: Goto
+ Command: TPSCommand;
+ NewPosition: Longint; //relative to end of this instruction
+}
+ Cm_G = 6;
+{ Script internal command: Conditional Goto
+ Command: TPSCommand;
+ NewPosition: LongWord; //relative to end of this instruction
+ Var: TPSVariable; // no data
+}
+ Cm_CG = 7;
+{ Script internal command: Conditional NOT Goto
+ Command: TPSCommand;
+ NewPosition: LongWord; // relative to end of this instruction
+ Var: TPSVariable; // no data
+}
+ Cm_CNG = 8;
+{ Script internal command: Ret
+ Command: TPSCommand;
+}
+ Cm_R = 9;
+{ Script internal command: Set Stack Type
+ Command: TPSCommand;
+ NewType: LongWord;
+ OffsetFromBase: LongWord;
+}
+ Cm_ST = 10;
+{ Script internal command: Push Type
+ Command: TPSCommand;
+ FType: LongWord;
+}
+ Cm_Pt = 11;
+{ Script internal command: Compare
+ Command: TPSCommand;
+ CompareType: Byte;
+
+ 0 = >=
+ 1 = <=
+ 2 = >
+ 3 = <
+ 4 = <>
+ 5 = =
+
+ IntoVar: TPSAssignment;
+ Compare1, Compare2: TPSAssigment;
+}
+ CM_CO = 12;
+{ Script internal command: Call Var
+ Command: TPSCommand;
+ Var: TPSVariable;
+}
+ Cm_cv = 13;
+{ Script internal command: Set Pointer
+ Command: TPSCommand;
+ VarDest: TPSVariable;
+ VarSrc: TPSVariable;
+}
+ cm_sp = 14;
+{ Script internal command: Boolean NOT
+ Command: TPSCommand;
+ Var: TPSVariable;
+}
+ cm_bn = 15;
+{ Script internal command: Var Minus
+ Command: TPSCommand;
+ Var: TPSVariable;
+}
+ cm_vm = 16;
+{ Script internal command: Set Flag
+ Command: TPSCommand;
+ Var: TPSVariable;
+ DoNot: Boolean;
+}
+ cm_sf = 17;
+{ Script internal command: Flag Goto
+ Command: TPSCommand;
+ Where: Cardinal;
+}
+ cm_fg = 18;
+{ Script internal command: Push Exception Handler
+ Command: TPSCommand;
+ FinallyOffset,
+ ExceptionOffset, // FinallyOffset or ExceptionOffset need to be set.
+ Finally2Offset,
+ EndOfBlock: Cardinal;
+}
+ cm_puexh = 19;
+{ Script internal command: Pop Exception Handler
+ Command:TPSCommand;
+ Position: Byte;
+ 0 = end of try/finally/exception block;
+ 1 = end of first finally
+ 2 = end of except
+ 3 = end of second finally
+
+}
+ cm_poexh = 20;
+{ Script internal command: Integer NOT
+ Command: TPSCommand;
+ Where: Cardinal;
+}
+ cm_in = 21;
+ {Script internal command: Set Stack Pointer To Copy
+ Command: TPSCommand;
+ Where: Cardinal;
+}
+ cm_spc = 22;
+ {Script internal command: Inc
+ Command: TPSCommand;
+ Var: TPSVariable;
+ }
+ cm_inc = 23;
+ {Script internal command: Dec
+ Command: TPSCommand;
+ Var: TPSVariable;
+ }
+ cm_dec = 24;
+ {Script internal command: nop
+ Command: TPSCommand; }
+ cm_nop = 255;
+{ Script internal command: Pop and Goto
+ Command: TPSCommand;
+ NewPosition: Longint; //relative to end of this instruction
+}
+ Cm_PG = 25;
+{ Script internal command: Pop*2 and Goto
+ Command: TPSCommand;
+ NewPosition: Longint; //relative to end of this instruction
+}
+ Cm_P2G = 26;
+
+
+type
+
+ TbtU8 = Byte;
+
+ TbtS8 = ShortInt;
+
+ TbtU16 = Word;
+
+ TbtS16 = SmallInt;
+
+ TbtU32 = Cardinal;
+
+ TbtS32 = Longint;
+
+ TbtSingle = Single;
+
+ TbtDouble = double;
+
+ TbtExtended = Extended;
+
+ tbtCurrency = Currency;
+
+{$IFNDEF PS_NOINT64}
+
+ tbts64 = int64;
+{$ENDIF}
+
+ tbtchar = {$IFDEF DELPHI4UP}AnsiChar{$ELSE}CHAR{$ENDIF};
+{$IFNDEF PS_NOWIDESTRING}
+
+ tbtwidestring = widestring;
+ tbtunicodestring = {$IFDEF DELPHI2009UP}UnicodeString{$ELSE}widestring{$ENDIF};
+
+ tbtwidechar = widechar;
+ tbtNativeString = {$IFDEF DELPHI2009UP}tbtUnicodeString{$ELSE}tbtString{$ENDIF};
+{$ENDIF}
+{$IFDEF FPC}
+ IPointer = PtrUInt;
+{$ELSE}
+ {$IFDEF CPU64} IPointer = LongWord;{$ELSE} IPointer = Cardinal;{$ENDIF}
+{$ENDIF}
+ TPSCallingConvention = (cdRegister, cdPascal, cdCdecl, cdStdCall, cdSafeCall);
+
+
+const
+
+ PointerSize = IPointer({$IFDEF CPU64}8{$ELSE}4{$ENDIF});
+ PointerSize2 = IPointer(2*PointerSize);
+ MaxListSize = Maxint div 16;
+
+type
+
+ PPointerList = ^TPointerList;
+
+ TPointerList = array[0..MaxListSize - 1] of Pointer;
+
+
+ TPSList = class(TObject)
+ protected
+
+ FData: PPointerList;
+
+ FCapacity: Cardinal;
+
+ FCount: Cardinal;
+
+ FCheckCount: Cardinal;
+ private
+ function GetItem(Nr: Cardinal): Pointer;
+ procedure SetItem(Nr: Cardinal; P: Pointer);
+ public
+ {$IFNDEF PS_NOSMARTLIST}
+
+ procedure Recreate;
+ {$ENDIF}
+
+ property Data: PPointerList read FData;
+
+ constructor Create;
+
+ function IndexOf(P: Pointer): Longint;
+
+ destructor Destroy; override;
+
+ property Count: Cardinal read FCount;
+
+ property Items[nr: Cardinal]: Pointer read GetItem write SetItem; default;
+
+ function Add(P: Pointer): Longint;
+
+ procedure AddBlock(List: PPointerList; Count: Longint);
+
+ procedure Remove(P: Pointer);
+
+ procedure Delete(Nr: Cardinal);
+
+ procedure DeleteLast;
+
+ procedure Clear; virtual;
+ end;
+ TIFList = TPSList;
+
+ TPSStringList = class(TObject)
+ private
+ List: TPSList;
+ function GetItem(Nr: LongInt): TbtString;
+ procedure SetItem(Nr: LongInt; const s: TbtString);
+ public
+
+ function Count: LongInt;
+
+ property Items[Nr: Longint]: TbtString read GetItem write SetItem; default;
+
+
+ procedure Add(const P: TbtString);
+
+ procedure Delete(NR: LongInt);
+
+ procedure Clear;
+
+ constructor Create;
+
+ destructor Destroy; override;
+ end;
+ TIFStringList = TPsStringList;
+
+
+type
+
+ TPSPasToken = (
+ CSTI_EOF,
+
+ CSTIINT_Comment,
+ CSTIINT_WhiteSpace,
+
+ CSTI_Identifier,
+ CSTI_SemiColon,
+ CSTI_Comma,
+ CSTI_Period,
+ CSTI_Colon,
+ CSTI_OpenRound,
+ CSTI_CloseRound,
+ CSTI_OpenBlock,
+ CSTI_CloseBlock,
+ CSTI_Assignment,
+ CSTI_Equal,
+ CSTI_NotEqual,
+ CSTI_Greater,
+ CSTI_GreaterEqual,
+ CSTI_Less,
+ CSTI_LessEqual,
+ CSTI_Plus,
+ CSTI_Minus,
+ CSTI_Divide,
+ CSTI_Multiply,
+ CSTI_Integer,
+ CSTI_Real,
+ CSTI_String,
+ CSTI_Char,
+ CSTI_HexInt,
+ CSTI_AddressOf,
+ CSTI_Dereference,
+ CSTI_TwoDots,
+
+ CSTII_and,
+ CSTII_array,
+ CSTII_begin,
+ CSTII_case,
+ CSTII_const,
+ CSTII_div,
+ CSTII_do,
+ CSTII_downto,
+ CSTII_else,
+ CSTII_end,
+ CSTII_for,
+ CSTII_function,
+ CSTII_if,
+ CSTII_in,
+ CSTII_mod,
+ CSTII_not,
+ CSTII_of,
+ CSTII_or,
+ CSTII_procedure,
+ CSTII_program,
+ CSTII_repeat,
+ CSTII_record,
+ CSTII_set,
+ CSTII_shl,
+ CSTII_shr,
+ CSTII_then,
+ CSTII_to,
+ CSTII_type,
+ CSTII_until,
+ CSTII_uses,
+ CSTII_var,
+ CSTII_while,
+ CSTII_with,
+ CSTII_xor,
+ CSTII_exit,
+ CSTII_class,
+ CSTII_constructor,
+ CSTII_destructor,
+ CSTII_inherited,
+ CSTII_private,
+ CSTII_public,
+ CSTII_published,
+ CSTII_protected,
+ CSTII_property,
+ CSTII_virtual,
+ CSTII_override,
+ //CSTII_default, //Birb
+ CSTII_As,
+ CSTII_Is,
+ CSTII_Unit,
+ CSTII_Try,
+ CSTII_Except,
+ CSTII_Finally,
+ CSTII_External,
+ CSTII_Forward,
+ CSTII_Export,
+ CSTII_Label,
+ CSTII_Goto,
+ CSTII_Chr,
+ CSTII_Ord,
+ CSTII_Interface,
+ CSTII_Implementation,
+ CSTII_initialization, //* Nvds
+ CSTII_finalization, //* Nvds
+ CSTII_out,
+ CSTII_nil
+ );
+
+ TPSParserErrorKind = (iNoError
+ , iCommentError
+ , iStringError
+ , iCharError
+ , iSyntaxError
+ );
+ TPSParserErrorEvent = procedure (Parser: TObject; Kind: TPSParserErrorKind) of object;
+
+
+ TPSPascalParser = class(TObject)
+ protected
+ FData: TbtString;
+ FText: {$IFDEF DELPHI4UP}PAnsiChar{$ELSE}PChar{$ENDIF};
+ FLastEnterPos, FRow, FRealPosition, FTokenLength: Cardinal;
+ FTokenId: TPSPasToken;
+ FToken: TbtString;
+ FOriginalToken: TbtString;
+ FParserError: TPSParserErrorEvent;
+ FEnableComments: Boolean;
+ FEnableWhitespaces: Boolean;
+ function GetCol: Cardinal;
+ // only applicable when Token in [CSTI_Identifier, CSTI_Integer, CSTI_Real, CSTI_String, CSTI_Char, CSTI_HexInt]
+ public
+
+ property EnableComments: Boolean read FEnableComments write FEnableComments;
+
+ property EnableWhitespaces: Boolean read FEnableWhitespaces write FEnableWhitespaces;
+
+ procedure Next; virtual;
+
+ property GetToken: TbtString read FToken;
+
+ property OriginalToken: TbtString read FOriginalToken;
+
+ property CurrTokenPos: Cardinal read FRealPosition;
+
+ property CurrTokenID: TPSPasToken read FTokenId;
+
+ property Row: Cardinal read FRow;
+
+ property Col: Cardinal read GetCol;
+
+ procedure SetText(const Data: TbtString); virtual;
+
+ property OnParserError: TPSParserErrorEvent read FParserError write FParserError;
+ end;
+
+function FloatToStr(E: Extended): TbtString;
+
+function FastLowerCase(const s: TbtString): TbtString;
+
+function Fw(const S: TbtString): TbtString;
+
+function IntToStr(I: LongInt): TbtString;
+
+function StrToIntDef(const S: TbtString; Def: LongInt): LongInt;
+
+function StrToInt(const S: TbtString): LongInt;
+function StrToFloat(const s: TbtString): Extended;
+
+function FastUpperCase(const s: TbtString): TbtString;
+
+function GRFW(var s: TbtString): TbtString;
+function GRLW(var s: TbtString): TbtString;
+
+const
+
+ FCapacityInc = 32;
+{$IFNDEF PS_NOSMARTLIST}
+
+ FMaxCheckCount = (FCapacityInc div 4) * 64;
+{$ENDIF}
+
+{$IFDEF VER130}
+function WideUpperCase(const S: WideString): WideString;
+function WideLowerCase(const S: WideString): WideString;
+{$ENDIF}
+implementation
+
+{$IFDEF DELPHI3UP }
+resourceString
+{$ELSE }
+const
+{$ENDIF }
+ RPS_InvalidFloat = 'Invalid float';
+
+{$IFDEF VER130}
+
+function WideUpperCase(const S: WideString): WideString;
+var
+ Len: Integer;
+begin
+ // CharUpperBuffW is stubbed out on Win9x platofmrs
+ if Win32Platform = VER_PLATFORM_WIN32_NT then
+ begin
+ Len := Length(S);
+ SetString(Result, PWideChar(S), Len);
+ if Len > 0 then CharUpperBuffW(Pointer(Result), Len);
+ end
+ else
+ Result := AnsiUpperCase(S);
+end;
+
+function WideLowerCase(const S: WideString): WideString;
+var
+ Len: Integer;
+begin
+ // CharLowerBuffW is stubbed out on Win9x platofmrs
+ if Win32Platform = VER_PLATFORM_WIN32_NT then
+ begin
+ Len := Length(S);
+ SetString(Result, PWideChar(S), Len);
+ if Len > 0 then CharLowerBuffW(Pointer(Result), Len);
+ end
+ else
+ Result := AnsiLowerCase(S);
+end;
+
+{$ENDIF}
+
+
+function MakeHash(const s: TbtString): Longint;
+{small hash maker}
+var
+ I: Integer;
+begin
+ Result := 0;
+ for I := 1 to Length(s) do
+ Result := ((Result shl 7) or (Result shr 25)) + Ord(s[I]);
+end;
+
+function GRFW(var s: TbtString): TbtString;
+var
+ l: Longint;
+begin
+ l := 1;
+ while l <= Length(s) do
+ begin
+ if s[l] = ' ' then
+ begin
+ Result := copy(s, 1, l - 1);
+ Delete(s, 1, l);
+ exit;
+ end;
+ l := l + 1;
+ end;
+ Result := s;
+ s := '';
+end;
+
+function GRLW(var s: TbtString): TbtString;
+var
+ l: Longint;
+begin
+ l := Length(s);
+ while l >= 1 do
+ begin
+ if s[l] = ' ' then
+ begin
+ Result := copy(s, l+1, MaxInt);
+ Delete(s, l, MaxInt);
+ exit;
+ end;
+ Dec(l);
+ end;
+ Result := s;
+ s := '';
+end;
+
+function StrToFloat(const s: TbtString): Extended;
+var
+ i: longint;
+begin
+ Val(string(s), Result, i);
+ if i <> 0 then raise Exception.Create(RPS_InvalidFloat);
+end;
+//-------------------------------------------------------------------
+
+function IntToStr(I: LongInt): TbtString;
+var
+ s: tbtstring;
+begin
+ Str(i, s);
+ IntToStr := s;
+end;
+//-------------------------------------------------------------------
+
+function FloatToStr(E: Extended): TbtString;
+var
+ s: tbtstring;
+begin
+ Str(e:0:12, s);
+ result := s;
+end;
+
+function StrToInt(const S: TbtString): LongInt;
+var
+ e: Integer;
+ Res: LongInt;
+begin
+ Val(string(S), Res, e);
+ if e <> 0 then
+ StrToInt := -1
+ else
+ StrToInt := Res;
+end;
+//-------------------------------------------------------------------
+
+function StrToIntDef(const S: TbtString; Def: LongInt): LongInt;
+var
+ e: Integer;
+ Res: LongInt;
+begin
+ Val(string(S), Res, e);
+ if e <> 0 then
+ StrToIntDef := Def
+ else
+ StrToIntDef := Res;
+end;
+//-------------------------------------------------------------------
+
+constructor TPSList.Create;
+begin
+ inherited Create;
+ FCount := 0;
+ FCapacity := 16;
+ {$IFNDEF PS_NOSMARTLIST}
+ FCheckCount := 0;
+ {$ENDIF}
+ GetMem(FData, FCapacity * PointerSize);
+end;
+
+
+function MM(i1,i2: Integer): Integer;
+begin
+ if ((i1 div i2) * i2) < i1 then
+ mm := (i1 div i2 + 1) * i2
+ else
+ mm := (i1 div i2) * i2;
+end;
+
+{$IFNDEF PS_NOSMARTLIST}
+procedure TPSList.Recreate;
+var
+ NewData: PPointerList;
+ NewCapacity: Cardinal;
+ I: Longint;
+
+begin
+
+ FCheckCount := 0;
+ NewCapacity := mm(FCount, FCapacityInc);
+ if NewCapacity < 64 then NewCapacity := 64;
+ GetMem(NewData, NewCapacity * PointerSize);
+ for I := 0 to Longint(FCount) -1 do
+ begin
+ NewData^[i] := FData^[I];
+ end;
+ FreeMem(FData, FCapacity * PointerSize);
+ FData := NewData;
+ FCapacity := NewCapacity;
+end;
+{$ENDIF}
+
+//-------------------------------------------------------------------
+
+function TPSList.Add(P: Pointer): Longint;
+begin
+ if FCount >= FCapacity then
+ begin
+ Inc(FCapacity, FCapacityInc);// := FCount + 1;
+ ReAllocMem(FData, FCapacity * PointerSize);
+ end;
+ FData[FCount] := P; // Instead of SetItem
+ Result := FCount;
+ Inc(FCount);
+{$IFNDEF PS_NOSMARTLIST}
+ Inc(FCheckCount);
+ if FCheckCount > FMaxCheckCount then Recreate;
+{$ENDIF}
+end;
+
+procedure TPSList.AddBlock(List: PPointerList; Count: Longint);
+var
+ L: Longint;
+
+begin
+ if Longint(FCount) + Count > Longint(FCapacity) then
+ begin
+ Inc(FCapacity, mm(Count, FCapacityInc));
+ ReAllocMem(FData, FCapacity *PointerSize);
+ end;
+ for L := 0 to Count -1 do
+ begin
+ FData^[FCount] := List^[L];
+ Inc(FCount);
+ end;
+{$IFNDEF PS_NOSMARTLIST}
+ Inc(FCheckCount);
+ if FCheckCount > FMaxCheckCount then Recreate;
+{$ENDIF}
+end;
+
+
+//-------------------------------------------------------------------
+
+procedure TPSList.DeleteLast;
+begin
+ if FCount = 0 then Exit;
+ Dec(FCount);
+{$IFNDEF PS_NOSMARTLIST}
+ Inc(FCheckCount);
+ if FCheckCount > FMaxCheckCount then Recreate;
+{$ENDIF}
+end;
+
+
+
+procedure TPSList.Delete(Nr: Cardinal);
+begin
+ if FCount = 0 then Exit;
+ if Nr < FCount then
+ begin
+ Move(FData[Nr + 1], FData[Nr], (FCount - Nr) * PointerSize);
+ Dec(FCount);
+{$IFNDEF PS_NOSMARTLIST}
+ Inc(FCheckCount);
+ if FCheckCount > FMaxCheckCount then Recreate;
+{$ENDIF}
+ end;
+end;
+//-------------------------------------------------------------------
+
+procedure TPSList.Remove(P: Pointer);
+var
+ I: Cardinal;
+begin
+ if FCount = 0 then Exit;
+ I := 0;
+ while I < FCount do
+ begin
+ if FData[I] = P then
+ begin
+ Delete(I);
+ Exit;
+ end;
+ Inc(I);
+ end;
+end;
+//-------------------------------------------------------------------
+
+procedure TPSList.Clear;
+begin
+ FCount := 0;
+{$IFNDEF PS_NOSMARTLIST}
+ Recreate;
+{$ENDIF}
+end;
+//-------------------------------------------------------------------
+
+destructor TPSList.Destroy;
+begin
+ FreeMem(FData, FCapacity * PointerSize);
+ inherited Destroy;
+end;
+//-------------------------------------------------------------------
+
+procedure TPSList.SetItem(Nr: Cardinal; P: Pointer);
+begin
+ if (FCount = 0) or (Nr >= FCount) then
+ Exit;
+ FData[Nr] := P;
+end;
+//-------------------------------------------------------------------
+
+function TPSList.GetItem(Nr: Cardinal): Pointer; {12}
+begin
+ if Nr < FCount then
+ GetItem := FData[Nr]
+ else
+ GetItem := nil;
+end;
+
+
+
+//-------------------------------------------------------------------
+
+function TPSStringList.Count: LongInt;
+begin
+ count := List.count;
+end;
+type pStr = ^TbtString;
+
+//-------------------------------------------------------------------
+
+function TPSStringList.GetItem(Nr: LongInt): TbtString;
+var
+ S: PStr;
+begin
+ s := List.GetItem(Nr);
+ if s = nil then
+ Result := ''
+ else
+
+ Result := s^;
+end;
+//-------------------------------------------------------------------
+
+
+procedure TPSStringList.SetItem(Nr: LongInt; const s: TbtString);
+var
+ p: PStr;
+begin
+ p := List.GetItem(Nr);
+ if p = nil
+ then
+ Exit;
+ p^ := s;
+end;
+//-------------------------------------------------------------------
+
+procedure TPSStringList.Add(const P: TbtString);
+var
+ w: PStr;
+begin
+ new(w);
+ w^ := p;
+ List.Add(w);
+end;
+//-------------------------------------------------------------------
+
+procedure TPSStringList.Delete(NR: LongInt);
+var
+ W: PStr;
+begin
+ W := list.getitem(nr);
+ if w<>nil then
+ begin
+ dispose(w);
+ end;
+ list.Delete(Nr);
+end;
+
+procedure TPSStringList.Clear;
+begin
+ while List.Count > 0 do Delete(0);
+end;
+
+constructor TPSStringList.Create;
+begin
+ inherited Create;
+ List := TPSList.Create;
+end;
+
+destructor TPSStringList.Destroy;
+begin
+ while List.Count > 0 do
+ Delete(0);
+ List.Destroy;
+ inherited Destroy;
+end;
+
+//-------------------------------------------------------------------
+
+
+function Fw(const S: TbtString): TbtString; // First word
+var
+ x: integer;
+begin
+ x := pos(tbtstring(' '), s);
+ if x > 0
+ then Fw := Copy(S, 1, x - 1)
+ else Fw := S;
+end;
+//-------------------------------------------------------------------
+function FastUpperCase(const s: TbtString): TbtString;
+{Fast uppercase}
+var
+ I: Integer;
+ C: tbtChar;
+begin
+ Result := S;
+ I := Length(Result);
+ while I > 0 do
+ begin
+ C := Result[I];
+ if c in [#97..#122] then
+ Result[I] := tbtchar(Ord(Result[I]) -32);
+ Dec(I);
+ end;
+end;
+function FastLowerCase(const s: TbtString): TbtString;
+{Fast lowercase}
+var
+ I: Integer;
+ C: tbtChar;
+begin
+ Result := S;
+ I := Length(Result);
+ while I > 0 do
+ begin
+ C := Result[I];
+ if C in [#65..#90] then
+ Result[I] := tbtchar(Ord(Result[I]) + 32);
+ Dec(I);
+ end;
+end;
+//-------------------------------------------------------------------
+
+type
+ TRTab = record
+ name: TbtString;
+ c: TPSPasToken;
+ end;
+
+
+const
+ KEYWORD_COUNT = 65; //*NVDS
+ LookupTable: array[0..KEYWORD_COUNT - 1] of TRTab = (
+ (name: 'AND'; c: CSTII_and),
+ (name: 'ARRAY'; c: CSTII_array),
+ (name: 'AS'; c: CSTII_as),
+ (name: 'BEGIN'; c: CSTII_begin),
+ (name: 'CASE'; c: CSTII_case),
+ (name: 'CHR'; c: CSTII_chr),
+ (name: 'CLASS'; c: CSTII_class),
+ (name: 'CONST'; c: CSTII_const),
+ (name: 'CONSTRUCTOR'; c: CSTII_constructor),
+ (name: 'DESTRUCTOR'; c: CSTII_destructor),
+ (name: 'DIV'; c: CSTII_div),
+ (name: 'DO'; c: CSTII_do),
+ (name: 'DOWNTO'; c: CSTII_downto),
+ (name: 'ELSE'; c: CSTII_else),
+ (name: 'END'; c: CSTII_end),
+ (name: 'EXCEPT'; c: CSTII_except),
+ (name: 'EXIT'; c: CSTII_exit),
+ (name: 'EXPORT'; c: CSTII_Export),
+ (name: 'EXTERNAL'; c: CSTII_External),
+ (Name: 'FINALIZATION'; c : CSTII_finalization),//* Nvds
+ (name: 'FINALLY'; c: CSTII_finally),
+ (name: 'FOR'; c: CSTII_for),
+ (name: 'FORWARD'; c: CSTII_Forward),
+ (name: 'FUNCTION'; c: CSTII_function),
+ (name: 'GOTO'; c: CSTII_Goto),
+ (name: 'IF'; c: CSTII_if),
+ (name: 'IMPLEMENTATION'; c: CSTII_Implementation),
+ (name: 'IN'; c: CSTII_in),
+ (name: 'INHERITED'; c: CSTII_inherited),
+ (Name: 'INITIALIZATION'; c: CSTII_initialization), //* Nvds
+ (name: 'INTERFACE'; c: CSTII_Interface),
+ (name: 'IS'; c: CSTII_is),
+ (name: 'LABEL'; c: CSTII_Label),
+ (name: 'MOD'; c: CSTII_mod),
+ (name: 'NIL'; c: CSTII_nil),
+ (name: 'NOT'; c: CSTII_not),
+ (name: 'OF'; c: CSTII_of),
+ (name: 'OR'; c: CSTII_or),
+ (name: 'ORD'; c: CSTII_ord),
+ (name: 'OUT'; c: CSTII_Out),
+ (name: 'OVERRIDE'; c: CSTII_override),
+ //(name: 'DEFAULT'; c: CSTII_default), //Birb (if added, don't forget to increase KEYWORD_COUNT)
+ (name: 'PRIVATE'; c: CSTII_private),
+ (name: 'PROCEDURE'; c: CSTII_procedure),
+ (name: 'PROGRAM'; c: CSTII_program),
+ (name: 'PROPERTY'; c: CSTII_property),
+ (name: 'PROTECTED'; c: CSTII_protected),
+ (name: 'PUBLIC'; c: CSTII_public),
+ (name: 'PUBLISHED'; c: CSTII_published),
+ (name: 'RECORD'; c: CSTII_record),
+ (name: 'REPEAT'; c: CSTII_repeat),
+ (name: 'SET'; c: CSTII_set),
+ (name: 'SHL'; c: CSTII_shl),
+ (name: 'SHR'; c: CSTII_shr),
+ (name: 'THEN'; c: CSTII_then),
+ (name: 'TO'; c: CSTII_to),
+ (name: 'TRY'; c: CSTII_try),
+ (name: 'TYPE'; c: CSTII_type),
+ (name: 'UNIT'; c: CSTII_Unit),
+ (name: 'UNTIL'; c: CSTII_until),
+ (name: 'USES'; c: CSTII_uses),
+ (name: 'VAR'; c: CSTII_var),
+ (name: 'VIRTUAL'; c: CSTII_virtual),
+ (name: 'WHILE'; c: CSTII_while),
+ (name: 'WITH'; c: CSTII_with),
+ (name: 'XOR'; c: CSTII_xor));
+
+function TPSPascalParser.GetCol: Cardinal;
+begin
+ Result := FRealPosition - FLastEnterPos + 1;
+end;
+
+procedure TPSPascalParser.Next;
+var
+ Err: TPSParserErrorKind;
+ FLastUpToken: TbtString;
+ function CheckReserved(Const S: ShortString; var CurrTokenId: TPSPasToken): Boolean;
+ var
+ L, H, I: LongInt;
+ J: tbtChar;
+ SName: ShortString;
+ begin
+ L := 0;
+ J := S[0];
+ H := KEYWORD_COUNT-1;
+ while L <= H do
+ begin
+ I := (L + H) shr 1;
+ SName := LookupTable[i].Name;
+ if J = SName[0] then
+ begin
+ if S = SName then
+ begin
+ CheckReserved := True;
+ CurrTokenId := LookupTable[I].c;
+ Exit;
+ end;
+ if S > SName then
+ L := I + 1
+ else
+ H := I - 1;
+ end else
+ if S > SName then
+ L := I + 1
+ else
+ H := I - 1;
+ end;
+ CheckReserved := False;
+ end;
+ //-------------------------------------------------------------------
+
+ function _GetToken(CurrTokenPos, CurrTokenLen: Cardinal): TbtString;
+ var
+ s: tbtString;
+ begin
+ SetLength(s, CurrTokenLen);
+ Move(FText[CurrTokenPos], S[1], CurrtokenLen);
+ Result := s;
+ end;
+
+ function ParseToken(var CurrTokenPos, CurrTokenLen: Cardinal; var CurrTokenId: TPSPasToken): TPSParserErrorKind;
+ {Parse the token}
+ var
+ ct, ci: Cardinal;
+ hs: Boolean;
+ p: {$IFDEF DELPHI4UP}PAnsiChar{$ELSE}PChar{$ENDIF};
+ begin
+ ParseToken := iNoError;
+ ct := CurrTokenPos;
+ case FText[ct] of
+ #0:
+ begin
+ CurrTokenId := CSTI_EOF;
+ CurrTokenLen := 0;
+ end;
+ 'A'..'Z', 'a'..'z', '_':
+ begin
+ ci := ct + 1;
+ while (FText[ci] in ['_', '0'..'9', 'a'..'z', 'A'..'Z']) do begin
+ Inc(ci);
+ end;
+ CurrTokenLen := ci - ct;
+
+ FLastUpToken := _GetToken(CurrTokenPos, CurrtokenLen);
+ p := {$IFDEF DELPHI4UP}PAnsiChar{$ELSE}pchar{$ENDIF}(FLastUpToken);
+ while p^<>#0 do
+ begin
+ if p^ in [#97..#122] then
+ Dec(Byte(p^), 32);
+ inc(p);
+ end;
+ if not CheckReserved(FLastUpToken, CurrTokenId) then
+ begin
+ CurrTokenId := CSTI_Identifier;
+ end;
+ end;
+ '$':
+ begin
+ ci := ct + 1;
+
+ while (FText[ci] in ['0'..'9', 'a'..'f', 'A'..'F'])
+ do Inc(ci);
+
+ CurrTokenId := CSTI_HexInt;
+ CurrTokenLen := ci - ct;
+ end;
+
+ '0'..'9':
+ begin
+ hs := False;
+ ci := ct;
+ while (FText[ci] in ['0'..'9']) do
+ begin
+ Inc(ci);
+ if (FText[ci] = '.') and (not hs) then
+ begin
+ if FText[ci+1] = '.' then break;
+ hs := True;
+ Inc(ci);
+ end;
+ end;
+ if (FText[ci] in ['E','e']) and ((FText[ci+1] in ['0'..'9'])
+ or ((FText[ci+1] in ['+','-']) and (FText[ci+2] in ['0'..'9']))) then
+ begin
+ hs := True;
+ Inc(ci);
+ if FText[ci] in ['+','-'] then
+ Inc(ci);
+ repeat
+ Inc(ci);
+ until not (FText[ci] in ['0'..'9']);
+ end;
+
+ if hs
+ then CurrTokenId := CSTI_Real
+ else CurrTokenId := CSTI_Integer;
+
+ CurrTokenLen := ci - ct;
+ end;
+
+
+ #39:
+ begin
+ ci := ct + 1;
+ while true do
+ begin
+ if (FText[ci] = #0) or (FText[ci] = #13) or (FText[ci] = #10) then Break;
+ if (FText[ci] = #39) then
+ begin
+ if FText[ci+1] = #39 then
+ Inc(ci)
+ else
+ Break;
+ end;
+ Inc(ci);
+ end;
+ if FText[ci] = #39 then
+ CurrTokenId := CSTI_String
+ else
+ begin
+ CurrTokenId := CSTI_String;
+ ParseToken := iStringError;
+ end;
+ CurrTokenLen := ci - ct + 1;
+ end;
+ '#':
+ begin
+ ci := ct + 1;
+ if FText[ci] = '$' then
+ begin
+ inc(ci);
+ while (FText[ci] in ['A'..'F', 'a'..'f', '0'..'9']) do begin
+ Inc(ci);
+ end;
+ CurrTokenId := CSTI_Char;
+ CurrTokenLen := ci - ct;
+ end else
+ begin
+ while (FText[ci] in ['0'..'9']) do begin
+ Inc(ci);
+ end;
+ if FText[ci] in ['A'..'Z', 'a'..'z', '_'] then
+ begin
+ ParseToken := iCharError;
+ CurrTokenId := CSTI_Char;
+ end else
+ CurrTokenId := CSTI_Char;
+ CurrTokenLen := ci - ct;
+ end;
+ end;
+ '=':
+ begin
+ CurrTokenId := CSTI_Equal;
+ CurrTokenLen := 1;
+ end;
+ '>':
+ begin
+ if FText[ct + 1] = '=' then
+ begin
+ CurrTokenid := CSTI_GreaterEqual;
+ CurrTokenLen := 2;
+ end else
+ begin
+ CurrTokenid := CSTI_Greater;
+ CurrTokenLen := 1;
+ end;
+ end;
+ '<':
+ begin
+ if FText[ct + 1] = '=' then
+ begin
+ CurrTokenId := CSTI_LessEqual;
+ CurrTokenLen := 2;
+ end else
+ if FText[ct + 1] = '>' then
+ begin
+ CurrTokenId := CSTI_NotEqual;
+ CurrTokenLen := 2;
+ end else
+ begin
+ CurrTokenId := CSTI_Less;
+ CurrTokenLen := 1;
+ end;
+ end;
+ ')':
+ begin
+ CurrTokenId := CSTI_CloseRound;
+ CurrTokenLen := 1;
+ end;
+ '(':
+ begin
+ if FText[ct + 1] = '*' then
+ begin
+ ci := ct + 1;
+ while (FText[ci] <> #0) do begin
+ if (FText[ci] = '*') and (FText[ci + 1] = ')') then
+ Break;
+ if FText[ci] = #13 then
+ begin
+ inc(FRow);
+ if FText[ci+1] = #10 then
+ inc(ci);
+ FLastEnterPos := ci +1;
+ end else if FText[ci] = #10 then
+ begin
+ inc(FRow);
+ FLastEnterPos := ci +1;
+ end;
+ Inc(ci);
+ end;
+ if (FText[ci] = #0) then
+ begin
+ CurrTokenId := CSTIINT_Comment;
+ ParseToken := iCommentError;
+ end else
+ begin
+ CurrTokenId := CSTIINT_Comment;
+ Inc(ci, 2);
+ end;
+ CurrTokenLen := ci - ct;
+ end
+ else
+ begin
+ CurrTokenId := CSTI_OpenRound;
+ CurrTokenLen := 1;
+ end;
+ end;
+ '[':
+ begin
+ CurrTokenId := CSTI_OpenBlock;
+ CurrTokenLen := 1;
+ end;
+ ']':
+ begin
+ CurrTokenId := CSTI_CloseBlock;
+ CurrTokenLen := 1;
+ end;
+ ',':
+ begin
+ CurrTokenId := CSTI_Comma;
+ CurrTokenLen := 1;
+ end;
+ '.':
+ begin
+ if FText[ct + 1] = '.' then
+ begin
+ CurrTokenLen := 2;
+ CurrTokenId := CSTI_TwoDots;
+ end else
+ begin
+ CurrTokenId := CSTI_Period;
+ CurrTokenLen := 1;
+ end;
+ end;
+ '@':
+ begin
+ CurrTokenId := CSTI_AddressOf;
+ CurrTokenLen := 1;
+ end;
+ '^':
+ begin
+ CurrTokenId := CSTI_Dereference;
+ CurrTokenLen := 1;
+ end;
+ ';':
+ begin
+ CurrTokenId := CSTI_Semicolon;
+ CurrTokenLen := 1;
+ end;
+ ':':
+ begin
+ if FText[ct + 1] = '=' then
+ begin
+ CurrTokenId := CSTI_Assignment;
+ CurrTokenLen := 2;
+ end else
+ begin
+ CurrTokenId := CSTI_Colon;
+ CurrTokenLen := 1;
+ end;
+ end;
+ '+':
+ begin
+ CurrTokenId := CSTI_Plus;
+ CurrTokenLen := 1;
+ end;
+ '-':
+ begin
+ CurrTokenId := CSTI_Minus;
+ CurrTokenLen := 1;
+ end;
+ '*':
+ begin
+ CurrTokenId := CSTI_Multiply;
+ CurrTokenLen := 1;
+ end;
+ '/':
+ begin
+ if FText[ct + 1] = '/' then
+ begin
+ ci := ct + 1;
+ while (FText[ci] <> #0) and (FText[ci] <> #13) and
+ (FText[ci] <> #10) do begin
+ Inc(ci);
+ end;
+ if (FText[ci] = #0) then
+ begin
+ CurrTokenId := CSTIINT_Comment;
+ end else
+ begin
+ CurrTokenId := CSTIINT_Comment;
+ end;
+ CurrTokenLen := ci - ct;
+ end else
+ begin
+ CurrTokenId := CSTI_Divide;
+ CurrTokenLen := 1;
+ end;
+ end;
+ #32, #9, #13, #10:
+ begin
+ ci := ct;
+ while (FText[ci] in [#32, #9, #13, #10]) do
+ begin
+ if FText[ci] = #13 then
+ begin
+ inc(FRow);
+ if FText[ci+1] = #10 then
+ inc(ci);
+ FLastEnterPos := ci +1;
+ end else if FText[ci] = #10 then
+ begin
+ inc(FRow);
+ FLastEnterPos := ci +1;
+ end;
+ Inc(ci);
+ end;
+ CurrTokenId := CSTIINT_WhiteSpace;
+ CurrTokenLen := ci - ct;
+ end;
+ '{':
+ begin
+ ci := ct + 1;
+ while (FText[ci] <> #0) and (FText[ci] <> '}') do begin
+ if FText[ci] = #13 then
+ begin
+ inc(FRow);
+ if FText[ci+1] = #10 then
+ inc(ci);
+ FLastEnterPos := ci + 1;
+ end else if FText[ci] = #10 then
+ begin
+ inc(FRow);
+ FLastEnterPos := ci + 1;
+ end;
+ Inc(ci);
+ end;
+ if (FText[ci] = #0) then
+ begin
+ CurrTokenId := CSTIINT_Comment;
+ ParseToken := iCommentError;
+ end else
+ CurrTokenId := CSTIINT_Comment;
+ CurrTokenLen := ci - ct + 1;
+ end;
+ else
+ begin
+ ParseToken := iSyntaxError;
+ CurrTokenId := CSTIINT_Comment;
+ CurrTokenLen := 1;
+ end;
+ end;
+ end;
+ //-------------------------------------------------------------------
+begin
+ if FText = nil then
+ begin
+ FTokenLength := 0;
+ FRealPosition := 0;
+ FTokenId := CSTI_EOF;
+ Exit;
+ end;
+ repeat
+ FRealPosition := FRealPosition + Cardinal(FTokenLength);
+ Err := ParseToken(FRealPosition, Cardinal(FTokenLength), FTokenID);
+ if Err <> iNoError then
+ begin
+ FTokenLength := 0;
+ FTokenId := CSTI_EOF;
+ FToken := '';
+ FOriginalToken := '';
+ if @FParserError <> nil then FParserError(Self, Err);
+ exit;
+ end;
+
+ case FTokenID of
+ CSTIINT_Comment: if not FEnableComments then Continue else
+ begin
+ SetLength(FOriginalToken, FTokenLength);
+ Move(FText[CurrTokenPos], FOriginalToken[1], FTokenLength);
+ FToken := FOriginalToken;
+ end;
+ CSTIINT_WhiteSpace: if not FEnableWhitespaces then Continue else
+ begin
+ SetLength(FOriginalToken, FTokenLength);
+ Move(FText[CurrTokenPos], FOriginalToken[1], FTokenLength);
+ FToken := FOriginalToken;
+ end;
+ CSTI_Integer, CSTI_Real, CSTI_String, CSTI_Char, CSTI_HexInt:
+ begin
+ SetLength(FOriginalToken, FTokenLength);
+ Move(FText[CurrTokenPos], FOriginalToken[1], FTokenLength);
+ FToken := FOriginalToken;
+ end;
+ CSTI_Identifier:
+ begin
+ SetLength(FOriginalToken, FTokenLength);
+ Move(FText[CurrTokenPos], FOriginalToken[1], FTokenLength);
+ FToken := FLastUpToken;
+ end;
+ else
+ begin
+ FOriginalToken := '';
+ FToken := '';
+ end;
+ end;
+ Break;
+ until False;
+end;
+
+procedure TPSPascalParser.SetText(const Data: TbtString);
+begin
+ FData := Data;
+ FText := Pointer(FData);
+ FTokenLength := 0;
+ FRealPosition := 0;
+ FTokenId := CSTI_EOF;
+ FLastEnterPos := 0;
+ FRow := 1;
+ Next;
+end;
+
+function TPSList.IndexOf(P: Pointer): Longint;
+var
+ i: Integer;
+begin
+ for i := FCount -1 downto 0 do
+ begin
+ if FData[i] = p then
+ begin
+ result := i;
+ exit;
+ end;
+ end;
+ result := -1;
+end;
+
+end.
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uROPSImports.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uROPSImports.pas
new file mode 100644
index 0000000..da70685
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uROPSImports.pas
@@ -0,0 +1,366 @@
+unit uROPSImports;
+
+interface
+
+uses
+ uPSCompiler, uPSRuntime, uROBINMessage, uROIndyHTTPChannel,
+ uROXMLSerializer, uROIndyTCPChannel, idTcpClient,
+ uROPSServerLink, uROWinInetHttpChannel;
+
+
+procedure SIRegisterTROBINMESSAGE(CL: TIFPSPascalCompiler);
+procedure SIRegisterTROINDYHTTPCHANNEL(CL: TIFPSPascalCompiler);
+procedure SIRegisterTROINDYTCPCHANNEL(CL: TIFPSPascalCompiler);
+procedure SIRegisterTIDTCPCLIENT(CL: TIFPSPascalCompiler);
+procedure SIRegisterRODLImports(Cl: TIFPSPascalCompiler);
+
+
+
+procedure RIRegisterTROBINMESSAGE(Cl: TIFPSRuntimeClassImporter);
+procedure RIRegisterTROINDYHTTPCHANNEL(Cl: TIFPSRuntimeClassImporter);
+procedure RIRegisterTROINDYTCPCHANNEL(Cl: TIFPSRuntimeClassImporter);
+procedure RIRegisterTIDTCPCLIENT(Cl: TIFPSRuntimeClassImporter);
+procedure RIRegisterRODLImports(CL: TIFPSRuntimeClassImporter);
+(*
+Todo:
+ TROWinInetHTTPChannel = class(TROTransportChannel, IROTransport, IROTCPTransport, IROHTTPTransport)
+ published
+ property UserAgent:string read GetUserAgent write SetUserAgent;
+ property TargetURL : string read fTargetURL write SetTargetURL;
+ property StoreConnected:boolean read fStoreConnected write fStoreConnected default false;
+ property KeepConnection:boolean read fKeepConnection write fKeepConnection default false;
+ end;
+*)
+type
+
+ TPSROIndyTCPModule = class(TPSROModule)
+ protected
+ class procedure ExecImp(exec: TIFPSExec; ri: TIFPSRuntimeClassImporter); override;
+ class procedure CompImp(comp: TIFPSPascalCompiler); override;
+ end;
+
+ TPSROIndyHTTPModule = class(TPSROModule)
+ protected
+ class procedure ExecImp(exec: TIFPSExec; ri: TIFPSRuntimeClassImporter); override;
+ class procedure CompImp(comp: TIFPSPascalCompiler); override;
+ end;
+
+ TPSROBinModule = class(TPSROModule)
+ protected
+ class procedure ExecImp(exec: TIFPSExec; ri: TIFPSRuntimeClassImporter); override;
+ class procedure CompImp(comp: TIFPSPascalCompiler); override;
+ end;
+
+
+implementation
+
+{procedure TROSOAPMESSAGESERIALIZATIONOPTIONS_W(Self: TROSOAPMESSAGE;
+ const T: TXMLSERIALIZATIONOPTIONS);
+begin
+ Self.SERIALIZATIONOPTIONS := T;
+end;
+
+procedure TROSOAPMESSAGESERIALIZATIONOPTIONS_R(Self: TROSOAPMESSAGE;
+ var T: TXMLSERIALIZATIONOPTIONS);
+begin
+ T := Self.SERIALIZATIONOPTIONS;
+end;
+
+procedure TROSOAPMESSAGECUSTOMLOCATION_W(Self: TROSOAPMESSAGE; const T: string);
+begin
+ Self.CUSTOMLOCATION := T;
+end;
+
+procedure TROSOAPMESSAGECUSTOMLOCATION_R(Self: TROSOAPMESSAGE; var T: string);
+begin
+ T := Self.CUSTOMLOCATION;
+end;
+
+procedure TROSOAPMESSAGELIBRARYNAME_W(Self: TROSOAPMESSAGE; const T: string);
+begin
+ Self.LIBRARYNAME := T;
+end;
+
+procedure TROSOAPMESSAGELIBRARYNAME_R(Self: TROSOAPMESSAGE; var T: string);
+begin
+ T := Self.LIBRARYNAME;
+end; }
+
+procedure TROBINMESSAGEUSECOMPRESSION_W(Self: TROBINMESSAGE; const T: boolean);
+begin
+ Self.USECOMPRESSION := T;
+end;
+
+procedure TROBINMESSAGEUSECOMPRESSION_R(Self: TROBINMESSAGE; var T: boolean);
+begin
+ T := Self.USECOMPRESSION;
+end;
+
+procedure TROINDYHTTPCHANNELTARGETURL_W(Self: TROINDYHTTPCHANNEL; const T: string);
+begin
+ Self.TARGETURL := T;
+end;
+
+procedure TROINDYHTTPCHANNELTARGETURL_R(Self: TROINDYHTTPCHANNEL; var T: string);
+begin
+ T := Self.TARGETURL;
+end;
+
+procedure TROINDYTCPCHANNELINDYCLIENT_R(Self: TROINDYTCPCHANNEL; var T: TIdTCPClientBaseClass);
+begin
+ T := Self.INDYCLIENT;
+end;
+
+procedure TIDTCPCLIENTPORT_W(Self: TIDTCPCLIENT; const T: integer);
+begin
+ Self.PORT := T;
+end;
+
+procedure TIDTCPCLIENTPORT_R(Self: TIdTCPClientBaseClass; var T: integer);
+begin
+ T := TIdIndy10HackClient(Self).PORT;
+end;
+
+procedure TIDTCPCLIENTHOST_W(Self: TIdTCPClientBaseClass; const T: string);
+begin
+ TIdIndy10HackClient(Self).HOST := T;
+end;
+
+procedure TIDTCPCLIENTHOST_R(Self: TIdTCPClientBaseClass; var T: string);
+begin
+ T := TIdIndy10HackClient(Self).HOST;
+end;
+
+{procedure TIDTCPCLIENTBOUNDPORT_W(Self: TIdTCPClientBaseClass; const T: integer);
+begin
+ Self.BOUNDPORT := T;
+end;
+
+procedure TIDTCPCLIENTBOUNDPORT_R(Self: TIdTCPClientBaseClass; var T: integer);
+begin
+ T := Self.BOUNDPORT;
+end;
+
+procedure TIDTCPCLIENTBOUNDIP_W(Self: TIdTCPClientBaseClass; const T: string);
+begin
+ Self.BOUNDIP := T;
+end;
+
+procedure TIDTCPCLIENTBOUNDIP_R(Self: TIdTCPClientBaseClass; var T: string);
+begin
+ T := Self.BOUNDIP;
+end;]
+
+procedure TIDTCPCLIENTBOUNDPORTMIN_W(Self: TIdTCPClientBaseClass; const T: integer);
+begin
+ Self.BOUNDPORTMIN := T;
+end;
+
+procedure TIDTCPCLIENTBOUNDPORTMIN_R(Self: TIdTCPClientBaseClass; var T: integer);
+begin
+ T := Self.BOUNDPORTMIN;
+end;
+
+procedure TIDTCPCLIENTBOUNDPORTMAX_W(Self: TIdTCPClientBaseClass; const T: integer);
+begin
+ Self.BOUNDPORTMAX := T;
+end;
+
+procedure TIDTCPCLIENTBOUNDPORTMAX_R(Self: TIdTCPClientBaseClass; var T: integer);
+begin
+ T := Self.BOUNDPORTMAX;
+end;
+
+{procedure RIRegisterTROSOAPMESSAGE(Cl: TIFPSRuntimeClassImporter);
+begin
+ with Cl.Add(TROSOAPMESSAGE) do
+ begin
+ RegisterPropertyHelper(@TROSOAPMESSAGELIBRARYNAME_R, @TROSOAPMESSAGELIBRARYNAME_W,
+ 'LIBRARYNAME');
+ RegisterPropertyHelper(@TROSOAPMESSAGECUSTOMLOCATION_R,
+ @TROSOAPMESSAGECUSTOMLOCATION_W, 'CUSTOMLOCATION');
+ RegisterPropertyHelper(@TROSOAPMESSAGESERIALIZATIONOPTIONS_R,
+ @TROSOAPMESSAGESERIALIZATIONOPTIONS_W, 'SERIALIZATIONOPTIONS');
+ end;
+end; }
+
+procedure RIRegisterTROBINMESSAGE(Cl: TIFPSRuntimeClassImporter);
+begin
+ with Cl.Add(TROBINMESSAGE) do
+ begin
+ RegisterPropertyHelper(@TROBINMESSAGEUSECOMPRESSION_R,
+ @TROBINMESSAGEUSECOMPRESSION_W, 'USECOMPRESSION');
+ end;
+end;
+
+procedure RIRegisterTROINDYHTTPCHANNEL(Cl: TIFPSRuntimeClassImporter);
+begin
+ with Cl.Add(TROINDYHTTPCHANNEL) do
+ begin
+ RegisterPropertyHelper(@TROINDYHTTPCHANNELTARGETURL_R,
+ @TROINDYHTTPCHANNELTARGETURL_W, 'TARGETURL');
+ end;
+end;
+
+procedure RIRegisterTROINDYTCPCHANNEL(Cl: TIFPSRuntimeClassImporter);
+begin
+ with Cl.Add(TROINDYTCPCHANNEL) do
+ begin
+ RegisterPropertyHelper(@TROINDYTCPCHANNELINDYCLIENT_R, nil, 'INDYCLIENT');
+ end;
+end;
+
+procedure RIRegisterTIDTCPCLIENT(Cl: TIFPSRuntimeClassImporter);
+begin
+ with Cl.Add(TIdTCPClientBaseClass) do
+ begin
+ {RegisterPropertyHelper(@TIDTCPCLIENTBOUNDPORTMAX_R, @TIDTCPCLIENTBOUNDPORTMAX_W,
+ 'BOUNDPORTMAX');
+ RegisterPropertyHelper(@TIDTCPCLIENTBOUNDPORTMIN_R, @TIDTCPCLIENTBOUNDPORTMIN_W,
+ 'BOUNDPORTMIN');
+ RegisterPropertyHelper(@TIDTCPCLIENTBOUNDIP_R, @TIDTCPCLIENTBOUNDIP_W, 'BOUNDIP');
+ RegisterPropertyHelper(@TIDTCPCLIENTBOUNDPORT_R, @TIDTCPCLIENTBOUNDPORT_W,
+ 'BOUNDPORT');}
+ RegisterPropertyHelper(@TIDTCPCLIENTHOST_R, @TIDTCPCLIENTHOST_W, 'HOST');
+ RegisterPropertyHelper(@TIDTCPCLIENTPORT_R, @TIDTCPCLIENTPORT_W, 'PORT');
+ end;
+end;
+
+procedure RIRegisterRODLImports(CL: TIFPSRuntimeClassImporter);
+begin
+ RIRegisterTIDTCPCLIENT(Cl);
+ RIRegisterTROINDYTCPCHANNEL(Cl);
+ RIRegisterTROINDYHTTPCHANNEL(Cl);
+ RIRegisterTROBINMESSAGE(Cl);
+ //RIRegisterTROSOAPMESSAGE(Cl);
+end;
+
+function RegClassS(cl: TIFPSPascalCompiler; const InheritsFrom,
+ ClassName: string): TPSCompileTimeClass;
+begin
+ Result := cl.FindClass(ClassName);
+ if Result = nil then
+ Result := cl.AddClassN(cl.FindClass(InheritsFrom), ClassName)
+ else
+ Result.ClassInheritsFrom := cl.FindClass(InheritsFrom);
+end;
+
+{procedure SIRegisterTROSOAPMESSAGE(CL: TIFPSPascalCompiler);
+begin
+ Cl.addTypeS('TXMLSERIALIZATIONOPTIONS', 'BYTE');
+ Cl.AddConstantN('XSOWRITEMULTIREFARRAY', 'BYTE').SetInt(1);
+ Cl.AddConstantN('XSOWRITEMULTIREFOBJECT', 'BYTE').SetInt(2);
+ Cl.AddConstantN('XSOSENDUNTYPED', 'BYTE').SetInt(4);
+ with RegClassS(cl, 'TROMESSAGE', 'TROSOAPMESSAGE') do
+ begin
+ RegisterProperty('LIBRARYNAME', 'STRING', iptrw);
+ RegisterProperty('CUSTOMLOCATION', 'STRING', iptrw);
+ RegisterProperty('SERIALIZATIONOPTIONS', 'TXMLSERIALIZATIONOPTIONS', iptrw);
+ end;
+end;}
+
+procedure SIRegisterTROBINMESSAGE(CL: TIFPSPascalCompiler);
+begin
+ with RegClassS(cl, 'TROMESSAGE', 'TROBINMESSAGE') do
+ begin
+ RegisterProperty('USECOMPRESSION', 'BOOLEAN', iptrw);
+ end;
+end;
+
+procedure SIRegisterTROINDYHTTPCHANNEL(CL: TIFPSPascalCompiler);
+begin
+ with RegClassS(cl, 'TROINDYTCPCHANNEL', 'TROINDYHTTPCHANNEL') do
+ begin
+ RegisterProperty('TARGETURL', 'STRING', iptrw);
+ end;
+end;
+
+procedure SIRegisterTROINDYTCPCHANNEL(CL: TIFPSPascalCompiler);
+begin
+ with RegClassS(cl, 'TROTRANSPORTCHANNEL', 'TROINDYTCPCHANNEL') do
+ begin
+ RegisterProperty('INDYCLIENT', 'TIdTCPClientBaseClass', iptr);
+ end;
+end;
+
+procedure SIRegisterTIDTCPCLIENT(CL: TIFPSPascalCompiler);
+begin
+ with RegClassS(cl, 'TCOMPONENT', 'TIdTCPClientBaseClass') do
+ begin
+ RegisterProperty('BOUNDPORTMAX', 'INTEGER', iptrw);
+ RegisterProperty('BOUNDPORTMIN', 'INTEGER', iptrw);
+ RegisterProperty('BOUNDIP', 'STRING', iptrw);
+ RegisterProperty('BOUNDPORT', 'INTEGER', iptrw);
+ RegisterProperty('HOST', 'STRING', iptrw);
+ RegisterProperty('PORT', 'INTEGER', iptrw);
+ end;
+end;
+
+procedure SIRegisterRODLImports(Cl: TIFPSPascalCompiler);
+begin
+ SIRegisterTIDTCPCLIENT(Cl);
+ SIRegisterTROINDYTCPCHANNEL(Cl);
+ SIRegisterTROINDYHTTPCHANNEL(Cl);
+ SIRegisterTROBINMESSAGE(Cl);
+ //SIRegisterTROSOAPMESSAGE(Cl);
+end;
+
+{ TPSROIndyTCPModule }
+
+class procedure TPSROIndyTCPModule.CompImp(comp: TIFPSPascalCompiler);
+begin
+ SIRegisterTIDTCPCLIENT(Comp);
+ SIRegisterTROINDYTCPCHANNEL(Comp);
+end;
+
+class procedure TPSROIndyTCPModule.ExecImp(exec: TIFPSExec;
+ ri: TIFPSRuntimeClassImporter);
+begin
+ RIRegisterTIDTCPCLIENT(ri);
+ RIRegisterTROINDYTCPCHANNEL(ri);
+end;
+
+{ TPSROIndyHTTPModule }
+
+class procedure TPSROIndyHTTPModule.CompImp(comp: TIFPSPascalCompiler);
+begin
+ if Comp.FindClass('TROINDYTCPCHANNEL') = nil then
+ TPSROIndyTCPModule.CompImp(Comp);
+ SIRegisterTROINDYHTTPCHANNEL(Comp);
+end;
+
+class procedure TPSROIndyHTTPModule.ExecImp(exec: TIFPSExec;
+ ri: TIFPSRuntimeClassImporter);
+begin
+ if ri.FindClass('TROINDYTCPCHANNEL') = nil then
+ TPSROIndyTCPModule.ExecImp(exec, ri);
+ RIRegisterTROINDYHTTPCHANNEL(ri);
+end;
+
+{ TPSROSoapModule }
+
+{class procedure TPSROSoapModule.CompImp(comp: TIFPSPascalCompiler);
+begin
+ SIRegisterTROSOAPMESSAGE(comp);
+end;
+
+class procedure TPSROSoapModule.ExecImp(exec: TIFPSExec;
+ ri: TIFPSRuntimeClassImporter);
+begin
+ RIRegisterTROSOAPMESSAGE(ri);
+end;}
+
+{ TPSROBinModule }
+
+class procedure TPSROBinModule.CompImp(comp: TIFPSPascalCompiler);
+begin
+ SIRegisterTROBINMESSAGE(Comp);
+end;
+
+class procedure TPSROBinModule.ExecImp(exec: TIFPSExec;
+ ri: TIFPSRuntimeClassImporter);
+begin
+ RIRegisterTROBINMESSAGE(ri);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uROPSServerLink.pas b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uROPSServerLink.pas
new file mode 100644
index 0000000..9501a29
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/uROPSServerLink.pas
@@ -0,0 +1,1231 @@
+unit uROPSServerLink;
+
+interface
+uses
+ SysUtils, Classes, uPSCompiler, uPSUtils, uPSRuntime,
+ uROServer, uROClient, uRODL{$IFDEF WIN32},
+ Windows{$ELSE}, Types{$ENDIF}, uROTypes, uROClientIntf,
+ uROSerializer, uPSComponent;
+
+type
+
+ TPSROModule = class
+ protected
+ class procedure ExecImp(exec: TPSExec; ri: TPSRuntimeClassImporter); virtual;
+ class procedure CompImp(comp: TPSPascalCompiler); virtual;
+ end;
+ TPSROModuleClass = class of TPSROModule;
+ TPSRemObjectsSdkPlugin = class;
+ TPSROModuleLoadEvent = procedure (Sender: TPSRemObjectsSdkPlugin) of object;
+
+ TPSRemObjectsSdkPlugin = class(TPSPlugin)
+ private
+ FRodl: TRODLLibrary;
+ FModules: TList;
+ FOnLoadModule: TPSROModuleLoadEvent;
+
+ FEnableIndyTCP: Boolean;
+ FEnableIndyHTTP: Boolean;
+ FEnableBinary: Boolean;
+ function GetHaveRodl: Boolean;
+ function MkStructName(Struct: TRODLStruct): string;
+ public
+ procedure CompileImport1(CompExec: TPSScript); override;
+ procedure ExecImport1(CompExec: TPSScript; const ri: TPSRuntimeClassImporter); override;
+ protected
+ procedure Loaded; override;
+ public
+
+ procedure RODLLoadFromFile(const FileName: string);
+
+ procedure RODLLoadFromResource;
+
+ procedure RODLLoadFromStream(S: TStream);
+
+ procedure ClearRodl;
+
+ property HaveRodl: Boolean read GetHaveRodl;
+
+ constructor Create(AOwner: TComponent); override;
+
+ destructor Destroy; override;
+
+
+ procedure ReloadModules;
+
+ procedure RegisterModule(Module: TPSROModuleClass);
+ published
+ property OnLoadModule: TPSROModuleLoadEvent read FOnLoadModule write FOnLoadModule;
+
+ property EnableIndyTCP: Boolean read FEnableIndyTCP write FEnableIndyTCP default true;
+
+ property EnableIndyHTTP: Boolean read FEnableIndyHTTP write FEnableIndyHTTP default true;
+
+ property EnableBinary: Boolean read FEnableBinary write FEnableBinary default true;
+ end;
+
+implementation
+uses
+ uRODLToXML, uROPSImports;
+
+procedure SIRegisterTROTRANSPORTCHANNEL(CL: TPSPascalCompiler);
+Begin
+With cl.AddClassN(cl.FindClass('TComponent'), 'TROTRANSPORTCHANNEL') do
+ begin
+ end;
+end;
+
+procedure SIRegisterTROMESSAGE(CL: TPSPascalCompiler);
+Begin
+With cl.AddClassN(cl.FindClass('TComponent'),'TROMESSAGE') do
+ begin
+ RegisterProperty('MESSAGENAME', 'STRING', iptrw);
+ RegisterProperty('INTERFACENAME', 'STRING', iptrw);
+ end;
+end;
+
+procedure TROMESSAGEINTERFACENAME_W(Self: TROMESSAGE; const T: STRING);
+begin Self.INTERFACENAME := T; end;
+
+procedure TROMESSAGEINTERFACENAME_R(Self: TROMESSAGE; var T: STRING);
+begin T := Self.INTERFACENAME; end;
+
+procedure TROMESSAGEMESSAGENAME_W(Self: TROMESSAGE; const T: STRING);
+begin Self.MESSAGENAME := T; end;
+
+procedure TROMESSAGEMESSAGENAME_R(Self: TROMESSAGE; var T: STRING);
+begin T := Self.MESSAGENAME; end;
+
+procedure RIRegisterTROTRANSPORTCHANNEL(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TROTRANSPORTCHANNEL) do
+ begin
+ RegisterVirtualConstructor(@TROTRANSPORTCHANNEL.CREATE, 'CREATE');
+ end;
+end;
+
+procedure RIRegisterTROMESSAGE(Cl: TPSRuntimeClassImporter);
+Begin
+with Cl.Add(TROMESSAGE) do
+ begin
+ RegisterVirtualConstructor(@TROMESSAGE.CREATE, 'CREATE');
+ RegisterPropertyHelper(@TROMESSAGEMESSAGENAME_R,@TROMESSAGEMESSAGENAME_W,'MESSAGENAME');
+ RegisterPropertyHelper(@TROMESSAGEINTERFACENAME_R,@TROMESSAGEINTERFACENAME_W,'INTERFACENAME');
+ end;
+end;
+
+
+(*----------------------------------------------------------------------------*)
+procedure SIRegister_TROBinaryMemoryStream(CL: TPSPascalCompiler);
+begin
+ //with RegClassS(CL,'TMemoryStream', 'TROBinaryMemoryStream') do
+ with CL.AddClassN(CL.FindClass('TMemoryStream'),'TROBinaryMemoryStream') do
+ begin
+ RegisterMethod('Constructor Create2( const iString : Ansistring);');
+ RegisterMethod('Constructor Create;');
+ RegisterMethod('Procedure Assign( iSource : TStream)');
+ RegisterMethod('Function Clone : TROBinaryMemoryStream');
+ RegisterMethod('Procedure LoadFromString( const iString : Ansistring)');
+ RegisterMethod('Procedure LoadFromHexString( const iString : Ansistring)');
+ RegisterMethod('Function ToString : AnsiString');
+ RegisterMethod('Function ToHexString : Ansistring');
+ RegisterMethod('Function ToReadableString : Ansistring');
+ RegisterMethod('Function WriteAnsiString( AString : AnsiString) : integer');
+ RegisterProperty('CapacityIncrement', 'integer', iptrw);
+ end;
+end;
+
+(*----------------------------------------------------------------------------*)
+procedure SIRegister_uROClasses(CL: TPSPascalCompiler);
+begin
+ SIRegister_TROBinaryMemoryStream(CL);
+end;
+
+(* === run-time registration functions === *)
+(*----------------------------------------------------------------------------*)
+procedure TROBinaryMemoryStreamCapacityIncrement_W(Self: TROBinaryMemoryStream; const T: integer);
+begin Self.CapacityIncrement := T; end;
+
+(*----------------------------------------------------------------------------*)
+procedure TROBinaryMemoryStreamCapacityIncrement_R(Self: TROBinaryMemoryStream; var T: integer);
+begin T := Self.CapacityIncrement; end;
+
+(*----------------------------------------------------------------------------*)
+Function TROBinaryMemoryStreamCreate_P(Self: TClass; CreateNewInstance: Boolean):TObject;
+Begin Result := TROBinaryMemoryStream.Create; END;
+
+(*----------------------------------------------------------------------------*)
+Function TROBinaryMemoryStreamCreate2_P(Self: TClass; CreateNewInstance: Boolean; const iString : Ansistring):TObject;
+Begin Result := TROBinaryMemoryStream.Create(iString); END;
+
+(*----------------------------------------------------------------------------*)
+procedure RIRegister_TROBinaryMemoryStream(CL: TPSRuntimeClassImporter);
+begin
+ with CL.Add(TROBinaryMemoryStream) do
+ begin
+ RegisterConstructor(@TROBinaryMemoryStreamCreate2_P, 'Create2');
+ RegisterConstructor(@TROBinaryMemoryStreamCreate_P, 'Create');
+ RegisterMethod(@TROBinaryMemoryStream.Assign, 'Assign');
+ RegisterMethod(@TROBinaryMemoryStream.Clone, 'Clone');
+ RegisterMethod(@TROBinaryMemoryStream.LoadFromString, 'LoadFromString');
+ RegisterMethod(@TROBinaryMemoryStream.LoadFromHexString, 'LoadFromHexString');
+ RegisterMethod(@TROBinaryMemoryStream.ToString, 'ToString');
+ RegisterMethod(@TROBinaryMemoryStream.ToHexString, 'ToHexString');
+ RegisterMethod(@TROBinaryMemoryStream.ToReadableString, 'ToReadableString');
+ RegisterMethod(@TROBinaryMemoryStream.WriteAnsiString, 'WriteAnsiString');
+ RegisterPropertyHelper(@TROBinaryMemoryStreamCapacityIncrement_R,@TROBinaryMemoryStreamCapacityIncrement_W,'CapacityIncrement');
+ end;
+end;
+
+(*----------------------------------------------------------------------------*)
+procedure RIRegister_uROClasses(CL: TPSRuntimeClassImporter);
+begin
+ RIRegister_TROBinaryMemoryStream(CL);
+end;
+
+
+
+(*----------------------------------------------------------------------------*)
+
+type
+ TRoObjectInstance = class;
+ { }
+ IROClass = interface
+ ['{246B5804-461F-48EC-B2CA-FBB7B69B0D64}']
+ function SLF: TRoObjectInstance;
+ end;
+ TRoObjectInstance = class(TInterfacedObject, IROClass)
+ private
+ FMessage: IROMessage;
+ FChannel: IROTransportChannel;
+ public
+ constructor Create;
+ function SLF: TRoObjectInstance;
+ property Message: IROMessage read FMessage write FMessage;
+ property Channel: IROTransportChannel read FChannel write FChannel;
+ end;
+
+
+
+function CreateProc(Caller: TPSExec; p: PIFProcRec; Global, Stack: TPSStack): Boolean;
+var
+ temp, res: TPSVariantIFC;
+ Chan: TROTransportChannel;
+ Msg: TROMessage;
+ NewRes: TRoObjectInstance;
+begin
+ res := NewTPSVariantIFC(Stack[Stack.count -1], True);
+ if (Res.Dta = nil) or (res.aType.BaseType <> btInterface) then
+ begin
+ Caller.CMD_Err2(erCustomError, 'RO Invoker: Invalid Parameters');
+ Result := False;
+ exit;
+ end;
+ IUnknown(Res.Dta^) := nil;
+
+ NewRes := TRoObjectInstance.Create;
+
+ temp := NewTPSVariantIFC(Stack[Stack.Count -4], True);
+
+ if (temp.aType <> nil) and (temp.Dta <> nil) and (Temp.aType.BaseType = btClass) and (TObject(Temp.Dta^) is TROTransportChannel) then
+ Chan := TROTransportChannel(temp.dta^)
+ else
+ Chan := nil;
+ temp := NewTPSVariantIFC(Stack[Stack.Count -3], True);
+ if (temp.aType <> nil) and (temp.Dta <> nil) and (Temp.aType.BaseType = btClass) and (TObject(Temp.Dta^) is TROMessage) then
+ Msg := TROMessage(temp.dta^)
+ else
+ Msg := nil;
+ if (msg = nil) or (chan = nil) then
+ begin
+ Chan.free;
+ msg.Free;
+
+ NewRes.Free;
+ Result := false;
+ Caller.CMD_Err2(erCustomError, 'Could not create message');
+ exit;
+ end;
+
+ IRoClass(Res.Dta^) := NewRes;
+
+ NewRes.Message := Msg;
+ NewRes.Channel := Chan;
+ Result := True;
+end;
+
+function NilProc(Caller: TPSExec; p: PIFProcRec; Global, Stack: TPSStack): Boolean;
+var
+ n: TPSVariantIFC;
+begin
+ n := NewTPSVariantIFC(Stack[Stack.count -1], True);
+ if (n.Dta = nil) or (n.aType = nil) or (n.aType.BaseType <> btInterface) then
+ begin
+ Caller.CMD_Err2(erCustomError, 'RO Invoker: Cannot free');
+ Result := False;
+ exit;
+ end;
+ IUnknown(n.Dta^) := nil;
+ Result := True;
+end;
+
+type
+ TROStructure = class(TPersistent, IROCustomStreamableType, IROCustomStreamableStruct)
+ private
+ FVar: TPSVariantIFC;
+ FExec: TPSExec;
+ protected
+ function GetTypeName: string;
+ procedure SetTypeName(const s: string);
+ procedure Write(Serializer: TROSerializer; const Name: string);
+ procedure Read(Serializer: TROSerializer; const Name: string);
+ function _AddRef: Integer; stdcall;
+ function _Release: Integer; stdcall;
+ function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
+ function CanImplementType(const aName: string):boolean;
+ procedure SetNull(b: Boolean);
+ function IsNull: Boolean;
+ public
+ constructor Create(aVar: TPSVariantIfc; Exec: TPSExec);
+ end;
+ TROArray = class(TROStructure, IROCustomStreamableType, IROCustomStreamableStruct, IROCustomStreamableArray)
+ protected
+ function GetCount: Longint;
+ procedure SetCount(l: Longint);
+ end;
+
+procedure WriteUserDefined(Exec: TPSExec; const Msg: IROMessage; const Name: string; const n: TPSVariantIfc);
+var
+ obj: TROStructure;
+begin
+ if n.aType.BaseType = btArray then
+ obj := TROArray.Create(n, exec)
+ else if n.aType.BaseType = btRecord then
+ obj := TROStructure.Create(n, exec)
+ else
+ raise Exception.Create('Unknown custom type');
+ try
+ Msg.Write(Name, obj.ClassInfo, obj, []);
+ finally
+ obj.Free;
+ end;
+end;
+
+procedure ReadUserDefined(Exec: TPSExec; const Msg: IROMessage; const Name: string; const n: TPSVariantIfc);
+var
+ obj: TROStructure;
+begin
+ if n.aType.BaseType = btArray then
+ obj := TROArray.Create(n, exec)
+ else if n.aType.BaseType = btRecord then
+ obj := TROStructure.Create(n, exec)
+ else
+ raise Exception.Create('Unknown custom type');
+ try
+ Msg.Read(Name, obj.ClassInfo, obj, []);
+ finally
+ obj.Free;
+ end;
+end;
+
+function RoProc(Caller: TPSExec; p: TIFExternalProcRec; Global, Stack: TIfList): Boolean;
+var
+ s, s2: string;
+ res, n: TPSVariantIFC;
+ aType: TRODataType;
+ aMode: TRODLParamFlag;
+ StartOffset, I: Longint;
+ __request, __response : TMemoryStream;
+ Inst: TRoObjectInstance;
+
+begin
+ s := p.Decl;
+
+ if s[1] = #255 then
+ begin
+ n := NewTPSVariantIFC(Stack[Stack.Count -1], True);
+ res.Dta := nil;
+ res.aType := nil;
+ StartOffset := Stack.Count -2;
+ end
+ else
+ begin
+ n := NewTPSVariantIFC(Stack[Stack.Count -2], True);
+ res := NewTPSVariantIFC(Stack[Stack.Count -1], True);
+ StartOffset := Stack.Count -3;
+ end;
+
+ if (n.Dta = nil) or (N.aType = nil) or (n.aType.BaseType <> btInterface) or (Longint(n.Dta^) = 0) then
+ begin
+ Caller.CMD_Err2(erCustomError, 'RO Invoker: Invalid Parameters');
+ Result := False;
+ exit;
+ end;
+
+ Inst := IROClass(n.dta^).Slf;
+ Delete(s, 1, 1);
+ i := StartOffset;
+ try
+ Inst.SLF.Message.InitializeRequestMessage(Inst.Channel, '', Copy(p.Name,1,pos('.', p.Name) -1), Copy(p.Name, pos('.', p.Name)+1, MaxInt));
+ while Length(s) > 0 do
+ begin
+ s2 := copy(s, 2, ord(s[1]));
+ aMode := TRODLParamFlag(ord(s[length(s2)+2]));
+ aType := TRODataType(ord(s[length(s2)+3]));
+ Delete(s, 1, length(s2)+3);
+ n := NewTPSVariantIFC(Stack[i], True);
+ Dec(I);
+ if ((aMode = fIn) or (aMode = fInOut)) and (n.Dta <> nil) then
+ begin
+ case aType of
+ rtInteger: Inst.Message.Write(s2, TypeInfo(Integer), Integer(n.Dta^), []);
+ rtDateTime: Inst.Message.Write(s2, TypeInfo(DateTime), Double(n.Dta^), []);
+ rtDouble: Inst.Message.Write(s2, TypeInfo(Double), Double(n.Dta^), []);
+ rtCurrency: Inst.Message.Write(s2, TypeInfo(Double), Double(n.Dta^), []);
+ rtWideString: Inst.Message.Write(s2, TypeInfo(WideString), WideString(n.Dta^), []);
+ rtString: Inst.Message.Write(s2, TypeInfo(String), String(n.Dta^), []);
+ rtInt64: Inst.Message.Write(s2, TypeInfo(Int64), Int64(n.Dta^), []);
+ rtBoolean: Inst.Message.Write(s2, TypeInfo(Boolean), Byte(n.Dta^), []);
+ rtUserDefined: WriteUserDefined(Caller, Inst.Message, s2, n);
+ end;
+ end;
+ end;
+ __request := TMemoryStream.Create;
+ __response := TMemoryStream.Create;
+ try
+ Inst.Message.WriteToStream(__request);
+ Inst.Channel.Dispatch(__request, __response);
+ Inst.Message.ReadFromStream(__response);
+ finally
+ __request.Free;
+ __response.Free;
+ end;
+ s := p.Decl;
+ Delete(s, 1, 1);
+ i := StartOffset;
+ while Length(s) > 0 do
+ begin
+ s2 := copy(s, 2, ord(s[1]));
+ aMode := TRODLParamFlag(ord(s[length(s2)+2]));
+ aType := TRODataType(ord(s[length(s2)+3]));
+ Delete(s, 1, length(s2)+3);
+ n := NewTPSVariantIFC(Stack[i], True);
+ Dec(I);
+ if ((aMode = fOut) or (aMode = fInOut)) and (n.Dta <> nil) then
+ begin
+ case aType of
+ rtInteger: Inst.Message.Read(s2, TypeInfo(Integer), Longint(n.Dta^), []);
+ rtDateTime: Inst.Message.Read(s2, TypeInfo(DateTime), double(n.dta^), []);
+ rtDouble: Inst.Message.Read(s2, TypeInfo(Double), double(n.dta^), []);
+ rtCurrency: Inst.Message.Read(s2, TypeInfo(Double), double(n.dta^), []);
+ rtWideString: Inst.Message.Read(s2, TypeInfo(WideString), widestring(n.Dta^), []);
+ rtString: Inst.Message.Read(s2, TypeInfo(String), string(n.dta^), []);
+ rtInt64: Inst.Message.Read(s2, TypeInfo(Int64), Int64(n.Dta^), []);
+ rtBoolean: Inst.Message.Read(s2, TypeInfo(Boolean), Boolean(n.Dta^), []);
+ rtUserDefined: ReadUserDefined(Caller, Inst.Message, s2, n);
+ end;
+ end;
+ end;
+ aType := TRODataType(p.Decl[1]);
+ case aType of
+ rtInteger: Inst.Message.Read('Result', TypeInfo(Integer), Longint(res.Dta^), []);
+ rtDateTime: Inst.Message.Read('Result', TypeInfo(DateTime), Double(res.dta^), []);
+ rtDouble: Inst.Message.Read('Result', TypeInfo(Double), Double(res.Dta^), []);
+ rtCurrency: Inst.Message.Read('Result', TypeInfo(Double), double(res.Dta^), []);
+ rtWideString: Inst.Message.Read('Result', TypeInfo(WideString), WideString(res.Dta^), []);
+ rtString: Inst.Message.Read('Result', TypeInfo(String), String(res.Dta^), []);
+ rtInt64: Inst.Message.Read('Result', TypeInfo(Int64), Int64(res.dta^), []);
+ rtBoolean: Inst.Message.Read('Result', TypeInfo(Boolean), Boolean(res.dta^), []);
+ rtUserDefined: ReadUserDefined(Caller, Inst.Message, 'Result', res);
+ end;
+ except
+ on e: Exception do
+ begin
+ Caller.CMD_Err2(erCustomError, e.Message);
+ Result := False;
+ exit;
+ end;
+ end;
+ Result := True;
+end;
+
+function SProcImport(Sender: TPSExec; p: TIFExternalProcRec; Tag: Pointer): Boolean;
+var
+ s: string;
+begin
+ s := p.Decl;
+ Delete(s, 1, pos(':', s));
+ if s[1] = '-' then
+ p.ProcPtr := @NilProc
+ else if s[1] = '!' then
+ begin
+ P.ProcPtr := @CreateProc;
+ p.Decl := Copy(s, 2, MaxInt);
+ end else
+ begin
+ Delete(s, 1, 1);
+ p.Name := Copy(S,1,pos('!', s)-1);
+ Delete(s, 1, pos('!', s));
+ p.Decl := s;
+ p.ProcPtr := @RoProc;
+ end;
+ Result := True;
+end;
+
+
+type
+ TMYComp = class(TPSPascalCompiler);
+ TRoClass = class(TPSExternalClass)
+ private
+ FService: TRODLService;
+ FNilProcNo: Cardinal;
+ FCompProcno: Cardinal;
+ function CreateParameterString(l: TRODLOperation): string;
+ function GetDT(DataType: string): TRODataType;
+ procedure MakeDeclFor(Dest: TPSParametersDecl; l: TRODLOperation);
+ public
+ constructor Create(Se: TPSPascalCompiler; Service: TRODLService; Const Typeno: TPSType);
+
+ function SelfType: TPSType; override;
+ function Func_Find(const Name: tbtstring; var Index: Cardinal): Boolean; override;
+ function Func_Call(Index: Cardinal; var ProcNo: Cardinal): Boolean; override;
+ function SetNil(var ProcNo: Cardinal): Boolean; override;
+
+ function ClassFunc_Find(const Name: tbtstring; var Index: Cardinal): Boolean; override;
+ function ClassFunc_Call(Index: Cardinal; var ProcNo: Cardinal): Boolean; override;
+ function IsCompatibleWith(Cl: TPSExternalClass): Boolean; override;
+ end;
+
+{ TROPSLink }
+procedure TPSRemObjectsSdkPlugin.RODLLoadFromFile(const FileName: string);
+var
+ f: TFileStream;
+begin
+ f := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
+ try
+ RODLLoadFromStream(f);
+ finally
+ f.Free;
+ end;
+end;
+
+procedure TPSRemObjectsSdkPlugin.RODLLoadFromResource;
+var
+ rs: TResourceStream;
+begin
+ rs := TResourceStream.Create(HInstance, 'RODLFILE', RT_RCDATA);
+ try
+ RODLLoadFromStream(rs);
+ finally
+ rs.Free;
+ end;
+end;
+
+procedure TPSRemObjectsSdkPlugin.RODLLoadFromStream(S: TStream);
+begin
+ FreeAndNil(FRodl);
+ with TXMLToRODL.Create do
+ begin
+ try
+ FRodl := Read(S);
+ finally
+ Free;
+ end;
+ end;
+end;
+
+
+destructor TPSRemObjectsSdkPlugin.Destroy;
+begin
+ FreeAndNil(FRodl);
+ FModules.Free;
+ inherited Destroy;
+end;
+
+{ TRoClass }
+
+constructor TRoClass.Create(Se: TPSPascalCompiler; Service: TRODLService; Const Typeno: TPSType);
+begin
+ inherited Create(SE, TypeNo);
+ FService := Service;
+ FNilProcNo := Cardinal(-1);
+ FCompProcNo := Cardinal(-1);
+end;
+
+function TRoClass.GetDT(DataType: string): TRODataType;
+begin
+ DataType := LowerCase(DataType);
+ if DataType = 'integer' then
+ Result := rtInteger
+ else if DataType = 'datetime' then
+ Result := rtDateTime
+ else if DataType = 'double' then
+ Result := rtDouble
+ else if DataType = 'currency' then
+ Result := rtCurrency
+ else if DataType = 'widestring' then
+ Result := rtWidestring
+ else if DataType = 'string' then
+ Result := rtString
+ else if DataType = 'int64' then
+ Result := rtInt64
+ else if DataType = 'boolean' then
+ Result := rtBoolean
+ else if DataType = 'variant' then
+ Result := rtVariant
+ else if DataType = 'binary' then
+ Result := rtBinary
+ else
+ Result := rtUserDefined;
+end;
+
+function TRoClass.CreateParameterString(l: TRODLOperation): string;
+var
+ i: Longint;
+begin
+ if L.Result = nil then
+ begin
+ Result := #$FF;
+ end else
+ begin
+ Result := Chr(Ord(GetDT(l.Result.DataType)));
+ end;
+ for i := 0 to l.Count -1 do
+ begin
+ if l.Items[i].Flag = fResult then Continue;
+ Result := Result + Chr(Length(l.Items[i].Info.Name))+ l.Items[i].Info.Name + Chr(Ord(l.Items[i].Flag)) + Chr(Ord(GetDT(l.Items[i].DataType)));
+ end;
+end;
+
+procedure TRoClass.MakeDeclFor(Dest: TPSParametersDecl; l: TRODLOperation);
+var
+ i: Longint;
+ dd: TPSParameterDecl;
+begin
+ if l.Result <> nil then
+ begin
+ Dest.Result := TMyComp(SE).at2ut(SE.FindType(l.Result.DataType));
+ end;
+ for i := 0 to l.Count -1 do
+ begin
+ if l.Items[i].Flag = fResult then Continue;
+ dd := Dest.AddParam;
+ if l.Items[i].Flag = fIn then
+ dd.mode := pmIn
+ else
+ dd.Mode := pmInOut;
+ dd.OrgName := l.Items[i].Info.Name;
+ dd.aType := TMyComp(SE).at2ut(SE.FindType(l.Items[i].DataType));
+ end;
+end;
+
+function TRoClass.Func_Call(Index: Cardinal; var ProcNo: Cardinal): Boolean;
+var
+ h, i: Longint;
+ s, e: string;
+ P: TPSProcedure;
+ p2: TPSExternalProcedure;
+begin
+ s := 'roclass:_'+FService.Info.Name + '.' + FService.Default.Items[Index].Info.Name;
+ h := MakeHash(s);
+ for i := 0 to TMyComp(SE).FProcs.Count -1 do
+ begin
+ P := TMyComp(SE).FProcs[i];
+ if (p is TPSExternalProcedure) then
+ begin
+ p2 := TPSExternalProcedure(p);
+ if (p2.RegProc.NameHash = h) and (Copy(p2.RegProc.ImportDecl, 1, pos(tbtchar('!'), p2.RegProc.ImportDecl)) = s) then
+ begin
+ Procno := I;
+ Result := True;
+ Exit;
+ end;
+ end;
+ end;
+ e := CreateParameterString(FService.Default.Items[Index]);
+ s := s + '!' + e;
+ ProcNo := TMyComp(SE).AddUsedFunction2(P2);
+ p2.RegProc := TPSRegProc.Create;
+ TMYComp(SE).FRegProcs.Add(p2.RegProc);
+ p2.RegProc.Name := '';
+ p2.RegProc.ExportName := True;
+ MakeDeclFor(p2.RegProc.Decl, FService.Default.Items[Index]);
+ p2.RegProc.ImportDecl := s;
+ Result := True;
+end;
+
+function TRoClass.Func_Find(const Name: tbtstring; var Index: Cardinal): Boolean;
+var
+ i: Longint;
+begin
+ for i := 0 to FService.Default.Count -1 do
+ begin
+ if CompareText(FService.Default.Items[i].Info.Name, Name) = 0 then
+ begin
+ Index := i;
+ Result := True;
+ Exit;
+ end;
+ end;
+ Result := False;
+end;
+
+const
+ PSClassType = '!ROClass';
+ MyGuid: TGuid = '{CADCCF37-7FA0-452E-971D-65DA691F7648}';
+
+function TRoClass.SelfType: TPSType;
+begin
+ Result := SE.FindType(PSClassType);
+ if Result = nil then
+ begin
+ Result := se.AddInterface(se.FindInterface('IUnknown'), MyGuid, PSClassType).aType;
+ end;
+end;
+
+function TRoClass.SetNil(var ProcNo: Cardinal): Boolean;
+var
+ P: TPSExternalProcedure;
+begin
+ if FNilProcNo <> Cardinal(-1) then
+ ProcNo:= FNilProcNo
+ else
+ begin
+ ProcNo := TMyComp(SE).AddUsedFunction2(P);
+ p.RegProc := TPSRegProc.Create;
+ TMyComp(SE).FRegProcs.Add(p.RegProc);
+ p.RegProc.Name := '';
+ p.RegProc.ExportName := True;
+ with p.RegProc.Decl.AddParam do
+ begin
+ OrgName := 'VarNo';
+ aType := TMYComp(Se).at2ut(SelfType);
+ end;
+ p.RegProc.ImportDecl := 'roclass:-';
+ FNilProcNo := Procno;
+ end;
+ Result := True;
+end;
+
+function TRoClass.ClassFunc_Call(Index: Cardinal;
+ var ProcNo: Cardinal): Boolean;
+var
+ P: TPSExternalProcedure;
+begin
+ if FCompProcNo <> Cardinal(-1) then
+ begin
+ Procno := FCompProcNo;
+ Result := True;
+ Exit;
+ end;
+ ProcNo := TMyComp(SE).AddUsedFunction2(P);
+ p.RegProc := TPSRegProc.Create;
+ TMyComp(SE).FRegProcs.Add(p.RegProc);
+ p.RegProc.ExportName := True;
+ p.RegProc.Decl.Result := TMyComp(SE).at2ut(SelfType);
+ with p.RegProc.Decl.AddParam do
+ begin
+ Orgname := 'Message';
+ aType :=TMyComp(SE).at2ut(SE.FindType('TROMESSAGE'));
+ end;
+ with p.RegProc.Decl.AddParam do
+ begin
+ Orgname := 'Channel';
+ aType :=TMyComp(SE).at2ut(SE.FindType('TROTRANSPORTCHANNEL'));
+ end;
+ p.RegProc.ImportDecl := 'roclass:!';
+ FCompProcNo := Procno;
+ Result := True;
+end;
+
+function TRoClass.ClassFunc_Find(const Name: tbtstring;
+ var Index: Cardinal): Boolean;
+begin
+ if Name = 'CREATE' then
+ begin
+ Result := True;
+ Index := 0;
+ end else
+ result := False;
+end;
+
+function TRoClass.IsCompatibleWith(Cl: TPSExternalClass): Boolean;
+begin
+ Result := Cl is TRoClass;
+end;
+
+{ TRoObjectInstance }
+
+function TRoObjectInstance.SLF: TRoObjectInstance;
+begin
+ Result := Self;
+end;
+
+constructor TRoObjectInstance.Create;
+begin
+ FRefCount := 1;
+end;
+
+
+function TPSRemObjectsSdkPlugin.MkStructName(Struct: TRODLStruct): string;
+var
+ i: Longint;
+begin
+ Result := '!ROStruct!'+Struct.Info.Name+ ',';
+ for i := 0 to Struct.Count -1 do
+ begin
+ Result := Result + Struct.Items[i].Info.Name+ ',';
+ end;
+end;
+
+function CompareStructItem(const S1, S2: TRODLTypedEntity): Integer;
+begin
+ Result := CompareText(S1.Info.Name, S2.Info.Name);
+end;
+
+procedure SortStruct(struct: TRODLStruct; First, Last: Longint);
+var
+ l, r, Pivot: Integer;
+begin
+ while First < Last do
+ begin
+ Pivot := (First + Last) div 2;
+ l := First - 1;
+ r := Last + 1;
+ repeat
+ repeat inc(l); until CompareStructItem(Struct.Items[l], Struct.Items[Pivot]) >= 0;
+ repeat dec(r); until CompareStructItem(Struct.Items[r], Struct.Items[Pivot]) <= 0;
+ if l >= r then break;
+ Struct.Exchange(l, r);
+ until false;
+ if First < r then SortStruct(Struct, First, r);
+ First := r+1;
+ end;
+end;
+
+procedure TPSRemObjectsSdkPlugin.CompileImport1(CompExec: TPSScript);
+var
+ i, i1: Longint;
+ Enum: TRODLEnum;
+ TempType: TPSType;
+ Struct: TRODLStruct;
+ Arr: TRODLArray;
+ RecType: TPSRecordFieldTypeDef;
+ Service: TRODLService;
+begin
+ if FRODL = nil then exit;
+ if CompExec.Comp.FindType('TDateTime') = nil then
+ raise Exception.Create('Please register the DateUtils library first');
+ if CompExec.Comp.FindType('TStream') = nil then
+ raise Exception.Create('Please register the sysutils/classes library first');
+ SIRegisterTROTRANSPORTCHANNEL(CompExec.Comp);
+ SIRegisterTROMESSAGE(CompExec.Comp);
+ SIRegister_uROClasses(CompExec.Comp);
+ CompExec.Comp.AddTypeCopyN('Binary', 'TROBinaryMemoryStream');
+ if CompExec.Comp.FindType('DateTime') = nil then
+ CompExec.Comp.AddTypeCopyN('DateTime', 'TDateTime');
+ if CompExec.Comp.FindType('Currency') = nil then
+ CompExec.Comp.AddTypeCopyN('Currency', 'Double'); // for now
+ for i := 0 to FRodl.EnumCount -1 do
+ begin
+ Enum := FRodl.Enums[i];
+ TempType := CompExec.Comp.AddType(Enum.Info.Name, btEnum);
+ for i1 := 0 to Enum.Count -1 do
+ begin
+ CompExec.Comp.AddConstant(Enum.Items[i1].Info.Name, TempType).SetUInt(i1);
+ end;
+ end;
+ for i := 0 to FRodl.StructCount -1 do
+ begin
+ Struct := FRodl.Structs[i];
+ SortStruct(Struct, 0, Struct.Count-1);
+ TempType := CompExec.Comp.AddType('', btRecord);
+ TempType.ExportName := True;
+ TempType.Name := MkStructName(Struct);
+ for i1 := 0 to Struct.Count -1 do
+ begin
+ RecType := TPSRecordType(TempType).AddRecVal;
+ RecType.FieldOrgName := Struct.Items[i1].Info.Name;
+ RecType.aType := CompExec.Comp.FindType(Struct.Items[i1].DataType);
+ if RecType.aType = nil then begin
+ Arr := fRodl.FindArray(Struct.Items[i1].DataType);
+ if Arr <> nil then begin
+ RecType.aType := CompExec.Comp.AddType(Arr.Info.Name, btArray);
+ TPSArrayType(RecType.aType).ArrayTypeNo := CompExec.Comp.FindType(Arr.ElementType);
+ end;
+ end;
+ end;
+ CompExec.Comp.AddTypeCopy(Struct.Info.Name, TempType);
+ end;
+ for i := 0 to FRodl.ArrayCount -1 do
+ begin
+ Arr := FRodl.Arrays[i];
+ TempType := CompExec.Comp.FindType(Arr.Info.Name);
+ if TempType <> nil then begin
+ if not (TempType is TPSArrayType) then begin
+ CompExec.Comp.MakeError('ROPS', ecDuplicateIdentifier, Arr.Info.Name);
+ end;
+ end else begin
+ TempType := CompExec.Comp.AddType(Arr.Info.Name, btArray);
+ end;
+ TPSArrayType(TempType).ArrayTypeNo := CompExec.Comp.FindType(Arr.ElementType);
+ end;
+ for i := 0 to FRodl.ServiceCount -1 do
+ begin
+ Service := FRodl.Services[i];
+ TempType := CompExec.Comp.AddType(Service.Info.Name, btExtClass);
+ TPSUndefinedClassType(TempType).ExtClass := TRoClass.Create(CompExec.Comp, Service, TempType);
+ end;
+ for i := 0 to FModules.Count -1 do
+ TPSROModuleClass(FModules[i]).CompImp(CompExec.Comp);
+end;
+
+function TPSRemObjectsSdkPlugin.GetHaveRodl: Boolean;
+begin
+ Result := FRodl <> nil;
+end;
+
+procedure TPSRemObjectsSdkPlugin.ClearRodl;
+begin
+ FRodl.Free;
+ FRodl := nil;
+end;
+
+procedure TPSRemObjectsSdkPlugin.ExecImport1(CompExec: TPSScript;
+ const ri: TPSRuntimeClassImporter);
+var
+ i: Longint;
+begin
+ if FRODL = nil then exit;
+ CompExec.Exec.AddSpecialProcImport('roclass', SProcImport, nil);
+ RIRegisterTROTRANSPORTCHANNEL(ri);
+ RIRegisterTROMESSAGE(ri);
+ RIRegister_TROBinaryMemoryStream(ri);
+ for i := 0 to FModules.Count -1 do
+ TPSROModuleClass(FModules[i]).ExecImp(CompExec.Exec, ri);
+end;
+
+constructor TPSRemObjectsSdkPlugin.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FModules := TList.Create;
+ //FEnableSOAP := True;
+ FEnableBinary := True;
+ FEnableIndyTCP := True;
+ FEnableIndyHTTP := True;
+end;
+
+procedure TPSRemObjectsSdkPlugin.Loaded;
+begin
+ inherited Loaded;
+ ReloadModules;
+end;
+
+procedure TPSRemObjectsSdkPlugin.RegisterModule(
+ Module: TPSROModuleClass);
+begin
+ FModules.Add(Module);
+end;
+
+procedure TPSRemObjectsSdkPlugin.ReloadModules;
+begin
+ FModules.Clear;
+ if FEnableIndyTCP then RegisterModule(TPSROIndyTCPModule);
+ if FEnableIndyHTTP then RegisterModule(TPSROIndyHTTPModule);
+ //if FEnableSOAP then RegisterModule(TPSROSoapModule);
+ if FEnableBinary then RegisterModule(TPSROBinModule);
+ if assigned(FOnLoadModule) then
+ FOnLoadModule(Self);
+end;
+
+{ TPSROModule }
+
+class procedure TPSROModule.CompImp(comp: TPSPascalCompiler);
+begin
+ // do nothing
+end;
+
+class procedure TPSROModule.ExecImp(exec: TPSExec;
+ ri: TPSRuntimeClassImporter);
+begin
+ // do nothing
+end;
+
+procedure IntRead(Exec: TPSExec; Serializer: TROSerializer;
+ const Name: string; aVar: TPSVariantIFC; arridx: Longint);
+var
+ i: Longint;
+ s, s2: string;
+ r: TROStructure;
+begin
+ case aVar.aType.BaseType of
+ btS64: Serializer.Read(Name, TypeInfo(int64), Int64(avar.Dta^), arridx);
+ btu32: Serializer.Read(Name, TypeInfo(cardinal), Cardinal(avar.Dta^), arridx);
+ bts32: Serializer.Read(Name, TypeInfo(longint), Longint(avar.Dta^), arridx);
+ btu16: Serializer.Read(Name, TypeInfo(word), Word(aVar.Dta^), arridx);
+ btS16: Serializer.Read(Name, TypeInfo(smallint), Smallint(aVar.Dta^), arridx);
+ btu8: Serializer.Read(Name, TypeInfo(byte), Byte(aVar.Dta^), arridx);
+ btS8: Serializer.Read(Name, TypeInfo(shortint), Shortint(aVar.Dta^), arridx);
+ btDouble:
+ begin
+ if aVar.aType.ExportName = 'TDATETIME' then
+ Serializer.Read(Name, TypeInfo(datetime), Double(avar.Dta^), arridx)
+ else
+ Serializer.Read(Name, TypeInfo(double), Double(aVar.Dta^), arridx);
+ end;
+ btSingle: Serializer.Read(Name, TypeInfo(single), Single(avar.Dta^), arridx);
+ btExtended: Serializer.Read(Name, TypeInfo(extended), Extended(avar.dta^), arridx);
+ btWideString: Serializer.Read(Name, TypeInfo(widestring), widestring(avar.dta^), arridx);
+ btString: Serializer.Read(Name, TypeInfo(string), string(avar.dta^), arridx);
+ btArray:
+ begin
+ if (TPSTypeRec_Array(avar.aType).ArrayType.BaseType = btRecord) then
+ begin
+ for i := 0 to PSDynArrayGetLength(Pointer(aVar.Dta^), aVar.aType) -1 do
+ begin
+ r := TROStructure.Create(PSGetArrayField(avar, i), Exec);
+ try
+ Serializer.Read(Name, typeinfo(TROArray), r, i);
+ finally
+ r.Free;
+ end;
+ end;
+ end else if (TPSTypeRec_Array(avar.aType).ArrayType.BaseType = btArray) then
+ begin
+ for i := 0 to PSDynArrayGetLength(Pointer(aVar.Dta^), aVar.aType) -1 do
+ begin
+ r := TROArray.Create(PSGetArrayField(avar, i), Exec);
+ try
+ Serializer.Read(Name, typeinfo(TROArray), r, i);
+ finally
+ r.Free;
+ end;
+ end;
+ end else begin
+ for i := 0 to PSDynArrayGetLength(Pointer(aVar.Dta^), aVar.aType) -1 do
+ begin
+ IntRead(Exec, Serializer, Name, PSGetArrayField(avar, i), i);
+ end;
+ end;
+ end;
+ btRecord:
+ begin
+ s := avar.aType.ExportName;
+ if copy(s,1, 10) <> '!ROStruct!' then
+ raise Exception.Create('Invalid structure: '+s);
+ Delete(s,1,pos(',',s));
+ for i := 0 to TPSTypeRec_Record(aVar.aType).FieldTypes.Count -1 do
+ begin
+ s2 := copy(s,1,pos(',',s)-1);
+ delete(s,1,pos(',',s));
+ if (TPSTypeRec(TPSTypeRec_Record(aVar.aType).FieldTypes[i]).BaseType = btRecord) then
+ begin
+
+ r := TROStructure.Create(PSGetRecField(aVar, i), Exec);
+ try
+ Serializer.Read(s2, typeinfo(TROStructure), r, -1);
+ finally
+ r.Free;
+ end;
+ end else if (TPSTypeRec(TPSTypeRec_Record(aVar.aType).FieldTypes[i]).BaseType = btArray) then
+ begin
+ r := TROArray.Create(PSGetRecField(aVar, i), Exec);
+ try
+ Serializer.Read(s2, typeinfo(TROArray), r, -1);
+ finally
+ r.Free;
+ end;
+ end else
+ IntRead(Exec, Serializer, s2, PSGetRecField(aVar, i), -1);
+ end;
+ end;
+ else
+ raise Exception.Create('Unable to read type');
+
+ end;
+end;
+
+procedure IntWrite(Exec: TPSExec; Serializer: TROSerializer;
+ const Name: string; aVar: TPSVariantIFC; arridx: Longint);
+var
+ i: Longint;
+ s, s2: string;
+ r: TROStructure;
+begin
+ case aVar.aType.BaseType of
+ btS64: Serializer.Write(Name, TypeInfo(int64), Int64(avar.Dta^), arridx);
+ btu32: Serializer.Write(Name, TypeInfo(cardinal), Cardinal(avar.Dta^), arridx);
+ bts32: Serializer.Write(Name, TypeInfo(longint), Longint(avar.Dta^), arridx);
+ btu16: Serializer.Write(Name, TypeInfo(word), Word(avar.Dta^), arridx);
+ btS16: Serializer.Write(Name, TypeInfo(smallint), Smallint(aVar.Dta^), arridx);
+ btu8: Serializer.Write(Name, TypeInfo(byte), Byte(aVar.Dta^), arridx);
+ btS8: Serializer.Write(Name, TypeInfo(shortint), ShortInt(aVar.Dta^), arridx);
+ btDouble:
+ begin
+ if aVar.aType.ExportName = 'TDATETIME' then
+ Serializer.Write(Name, TypeInfo(datetime), Double(aVar.Dta^), arridx)
+ else
+ Serializer.Write(Name, TypeInfo(double), Double(aVar.Dta^), arridx);
+ end;
+ btSingle: Serializer.Write(Name, TypeInfo(single), Single(aVar.Dta^), arridx);
+ btExtended: Serializer.Write(Name, TypeInfo(extended), Extended(aVar.Dta^), arridx);
+ btWideString: Serializer.Write(Name, TypeInfo(widestring), WideString(aVar.Dta^), arridx);
+ btString: Serializer.Write(Name, TypeInfo(string), String(aVar.Dta^), arridx);
+ btArray:
+ begin
+ if (TPSTypeRec_Array(avar.aType).ArrayType.BaseType = btRecord) then
+ begin
+ for i := 0 to PSDynArrayGetLength(Pointer(aVar.Dta^), aVar.aType) -1 do
+ begin
+ r := TROStructure.Create(PSGetArrayField(aVar, i), Exec);
+ try
+ Serializer.Write(Name, typeinfo(TROArray), r, i);
+ finally
+ r.Free;
+ end;
+ end;
+ end else if (TPSTypeRec_Array(avar.aType).ArrayType.BaseType = btArray) then
+ begin
+ for i := 0 to PSDynArrayGetLength(Pointer(aVar.Dta^), aVar.aType) -1 do
+ begin
+ r := TROArray.Create(PSGetArrayField(aVar, i), Exec);
+ try
+ Serializer.Write(Name, typeinfo(TROArray), r, i);
+ finally
+ r.Free;
+ end;
+ end;
+ end else begin
+ for i := 0 to PSDynArrayGetLength(Pointer(aVar.Dta^), aVar.aType) -1 do
+ begin
+ IntWrite(Exec, Serializer, Name, PSGetArrayField(aVar, i), i);
+ end;
+ end;
+ end;
+ btRecord:
+ begin
+ s := avar.aType.ExportName;
+ if copy(s,1, 10) <> '!ROStruct!' then
+ raise Exception.Create('Invalid structure: '+s);
+ Delete(s,1,pos(',',s));
+ for i := 0 to TPSTypeRec_Record(aVar.aType).FieldTypes.Count -1 do
+ begin
+ s2 := copy(s,1,pos(',',s)-1);
+ delete(s,1,pos(',',s));
+ if (TPSTypeRec(TPSTypeRec_Record(aVar.aType).FieldTypes[i]).BaseType = btRecord) then
+ begin
+ r := TROStructure.Create(PSGetRecField(aVar, i), Exec);
+ try
+ Serializer.Write(s2, typeinfo(TROStructure), r, -1);
+ finally
+ r.Free;
+ end;
+ end else if (TPSTypeRec(TPSTypeRec_Record(aVar.aType).FieldTypes[i]).BaseType = btArray) then
+ begin
+ r := TROArray.Create(PSGetRecField(aVar, i), Exec);
+ try
+ Serializer.Write(s2, typeinfo(TROArray), r, -1);
+ finally
+ r.Free;
+ end;
+ end else
+ IntWrite(Exec, Serializer, s2, PSGetRecField(aVar, i), -1);
+ end;
+ end;
+ else
+ raise Exception.Create('Unable to read type');
+
+ end;
+end;
+
+{ TROStructure }
+
+constructor TROStructure.Create(aVar: TPSVariantIfc; Exec: TPSExec);
+begin
+ inherited Create;
+ FVar := aVar;
+ FExec := Exec;
+end;
+
+function TROStructure.IsNull: Boolean;
+begin
+ Result := False;
+end;
+
+function TROStructure.QueryInterface(const IID: TGUID;
+ out Obj): HResult;
+begin
+ if GetInterface(IID, Obj) then
+ Result := 0
+ else
+ Result := E_NOINTERFACE;
+end;
+
+procedure TROStructure.Read(Serializer: TROSerializer;
+ const Name: string);
+begin
+ IntRead(FExec, Serializer, Name, FVar, -1);
+end;
+
+procedure TROStructure.SetNull(b: Boolean);
+begin
+ // null not supported
+end;
+
+function TROStructure.GetTypeName: string;
+var
+ s: string;
+begin
+ s := fvar.atype.ExportName;
+ delete(s,1,1);
+ delete(s,1,pos('!', s));
+ result := copy(s,1,pos(',',s)-1);
+end;
+
+procedure TROStructure.Write(Serializer: TROSerializer;
+ const Name: string);
+begin
+ IntWrite(FExec, Serializer, Name, FVar, -1);
+end;
+
+
+function TROStructure._AddRef: Integer;
+begin
+ // do nothing
+ Result := 1;
+end;
+
+function TROStructure._Release: Integer;
+begin
+ // do nothing
+ Result := 1;
+end;
+
+function TROStructure.CanImplementType(const aName: string): boolean;
+begin
+ if SameText(aName, Self.GetTypeName) then
+ Result := True
+ else
+ Result := False;
+end;
+
+procedure TROStructure.SetTypeName(const s: string);
+begin
+ // Do nothing
+end;
+
+{ TROArray }
+
+function TROArray.GetCount: Longint;
+begin
+
+ // we should have an array in pVar now so assume that's true
+ Result := PSDynArrayGetLength(Pointer(fVar.Dta^), fvar.aType);
+end;
+
+procedure TROArray.SetCount(l: Integer);
+begin
+ PSDynArraySetLength(Pointer(fVAr.Dta^), fVar.aType, l);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/x64.inc b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/x64.inc
new file mode 100644
index 0000000..5952b16
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/x64.inc
@@ -0,0 +1,528 @@
+{ implementation of x64 abi }
+//procedure DebugBreak; external 'Kernel32.dll';
+const
+ EmptyPchar: array[0..0] of char = #0;
+{$ASMMODE INTEL}
+
+{$IFDEF WINDOWS}
+procedure x64call(
+ Address: Pointer;
+ out _RAX: IPointer;
+ _RCX, _RDX, _R8, _R9: IPointer;
+ var _XMM0: Double;
+ _XMM1, _XMM2, _XMM3: Double;
+ aStack: Pointer; aItems: Integer); assembler; nostackframe;
+asm
+(* Registers:
+ RCX: Address
+ RDX: *_RAX
+ R8: _RCX
+ R9: _RDX
+
+ fpc inserts an 20h emty space
+*)
+ push rbp
+ mov rbp,rsp
+// call debugbreak
+ push rcx // address
+ push rdx // _rax
+ push r8 // _rcx
+ push r9 // _rdx
+ mov rcx, aItems
+ mov rdx, aStack
+ jmp @compareitems
+@work:
+ push [rdx]
+ dec rcx
+ sub rdx,8
+@compareitems:
+ or rcx, rcx
+ jnz @work
+
+ // copy registers
+ movd xmm0,[_XMM0]
+ movd xmm1,_XMM1
+ movd xmm2,_XMM2
+ movd xmm3,_XMM3
+ mov RAX, [rbp-8]
+ mov RCX, [rbp-24]
+ mov RDX, [rbp-32]
+ mov R8, _R8
+ mov R9, _R9
+
+ // weird thing on windows, it needs 32 bytes in the CALLEE side to do whatever in
+ sub RSP, 32
+
+ call RAX
+
+ add RSP, 32 // undo the damage done earlier
+
+ // copy result back
+ mov RDX, [rbp-16]
+ mov [RDX], RAX
+ movd [_XMM0],xmm0
+
+ pop r9
+ pop r8
+ pop rdx
+ pop rcx
+ leave
+ ret
+end;
+{$ELSE}
+type
+ TRegisters = packed record
+ _RDI, // 0
+ _RSI, // 8
+ _RDX, // 16
+ _RCX, // 24
+ _R8, // 32
+ _R9: IPointer; // 40
+ _XMM1, // 48
+ _XMM2, // 56
+ _XMM3, // 64
+ _XMM4, // 72
+ _XMM5, // 80
+ _XMM6, // 88
+ _XMM7: Double; // 96
+ end;
+
+procedure x64call(
+ Address: Pointer;
+ out _RAX: IPointer;
+
+ var Registers: TRegisters;
+ aStack: Pointer; aItems: Integer; var _XMM0: Double); assembler; nostackframe;
+
+
+asm
+(* Registers:
+ RDI: Address
+ RSI: _RAX
+ RDX: Registers
+ RCX: aStack
+ R8: aItems
+ R9: XMM0
+
+ rbp-8 addr
+ rbp-16 _rax
+ rbp-24 _xmm0
+*)
+ push rbp
+ mov rbp,rsp
+ push rdi // address
+ push rsi // _rax
+ push r9 // xmm0
+ mov rax, rdx
+ jmp @compareitems
+@work:
+ push [rcx]
+ dec r8
+ sub rcx,8
+@compareitems:
+ or r8, r8
+ jnz @work
+
+ // copy registers
+ movd xmm0,[rbp-24]
+ movd xmm1,[rax+48]
+ movd xmm2,[rax+56]
+ movd xmm3,[rax+64]
+ movd xmm4,[rax+72]
+ movd xmm5,[rax+80]
+ movd xmm6,[rax+88]
+ movd xmm7,[rax+96]
+ mov RDI, [rax]
+ mov RSI, [rax+ 8]
+ mov RDX, [rax+16]
+ mov RCX, [rax+24]
+ mov R8, [rax+32]
+ mov R9, [rax+40]
+
+ // weird thing on windows, it needs 32 bytes in the CALLEE side to do whatever in; not sure about linux
+ //sub RSP, 32
+
+ mov rax, [rbp-8]
+ call RAX
+
+ // add RSP, 32 // undo the damage done earlier
+
+ // copy result back
+ mov rsi, [rbp-16]
+ mov [rsi], RAX
+ mov rsi, [rbp-24]
+ movd [rsi],xmm0
+
+ pop r9 // xmm0
+ pop rsi // _rax
+ pop rdi // address
+ leave
+ ret
+end;
+{$ENDIF}
+
+function TPSExec.InnerfuseCall(_Self, Address: Pointer; CallingConv: TPSCallingConvention; Params: TPSList; res: PPSVariantIFC): Boolean;
+var
+ Stack: array of Byte;
+ _RAX: IPointer;
+{$IFDEF WINDOWS}
+ _RCX, _RDX, _R8, _R9: IPointer;
+ _XMM0, _XMM1, _XMM2, _XMM3: Double;
+{$ELSE}
+_XMM0: Double;
+ Registers: TRegisters;
+ RegUsageFloat: Byte;
+{$ENDIF}
+ RegUsage: Byte;
+ CallData: TPSList;
+ I: Integer;
+ pp: ^Byte;
+
+ function rp(p: PPSVariantIFC): PPSVariantIFC;
+ begin
+ if p = nil then
+ begin
+ result := nil;
+ exit;
+ end;
+ if p.aType.BaseType = btPointer then
+ begin
+ p^.aType := Pointer(Pointer(IPointer(p^.dta) + PointerSize)^);
+ p^.Dta := Pointer(p^.dta^);
+ end;
+ Result := p;
+ end;
+{$IFDEF WINDOWS}
+ procedure StoreReg(data: IPointer); overload;
+ var p: Pointer;
+ begin
+ case RegUsage of
+ 0: begin inc(RegUsage); _RCX:=Data; end;
+ 1: begin inc(RegUsage); _RDX:=Data; end;
+ 2: begin inc(RegUsage); _R8:=Data; end;
+ 3: begin inc(RegUsage); _R9:=Data; end;
+ else begin
+ SetLength(Stack, Length(Stack)+8);
+ p := @Stack[LEngth(Stack)-8];
+ IPointer(p^) := data;
+ end;
+ end;
+ end;
+ {$ELSE}
+ procedure StoreReg(data: IPointer); overload;
+ var p: Pointer;
+ begin
+ case RegUsage of
+ 0: begin inc(RegUsage); Registers._RDI:=Data; end;
+ 1: begin inc(RegUsage); Registers._RSI:=Data; end;
+ 2: begin inc(RegUsage); Registers._RDX:=Data; end;
+ 3: begin inc(RegUsage); Registers._RCX:=Data; end;
+ 4: begin inc(RegUsage); Registers._R8:=Data; end;
+ 5: begin inc(RegUsage); Registers._R9:=Data; end;
+ else begin
+ SetLength(Stack, Length(Stack)+8);
+ p := @Stack[LEngth(Stack)-8];
+ IPointer(p^) := data;
+ end;
+ end;
+ end;
+{$ENDIF}
+
+ procedure StoreStack(const aData; Len: Integer);
+ var
+ p: Pointer;
+ begin
+ if Len > 8 then
+ if Length(Stack) mod 16 <> 0 then begin
+ SetLength(Stack, Length(Stack)+ (16-(Length(Stack) mod 16)));
+ end;
+ SetLength(Stack, Length(Stack)+Len);
+ p := @Stack[Length(Stack)-Len];
+ Move(aData, p^, Len);
+ end;
+
+{$IFDEF WINDOWS}
+ procedure StoreReg(data: Double); overload;
+ var p: Pointer;
+ begin
+ case RegUsage of
+ 0: begin inc(RegUsage); _XMM0:=Data; end;
+ 1: begin inc(RegUsage); _XMM1:=Data; end;
+ 2: begin inc(RegUsage); _XMM2:=Data; end;
+ 3: begin inc(RegUsage); _XMM3:=Data; end;
+ else begin
+ SetLength(Stack, Length(Stack)+8);
+ p := @Stack[LEngth(Stack)-8];
+ Double(p^) := data;
+ end;
+ end;
+ end;
+ {$ELSE}
+ procedure StoreReg(data: Double); overload;
+ var p: Pointer;
+ begin
+ case RegUsageFloat of
+ 0: begin inc(RegUsageFloat); _XMM0:=Data; end;
+ 1: begin inc(RegUsageFloat); Registers._XMM1:=Data; end;
+ 2: begin inc(RegUsageFloat); Registers._XMM2:=Data; end;
+ 3: begin inc(RegUsageFloat); Registers._XMM3:=Data; end;
+ 4: begin inc(RegUsageFloat); Registers._XMM4:=Data; end;
+ 5: begin inc(RegUsageFloat); Registers._XMM5:=Data; end;
+ 6: begin inc(RegUsageFloat); Registers._XMM6:=Data; end;
+ 7: begin inc(RegUsageFloat); Registers._XMM7:=Data; end;
+ else begin
+ SetLength(Stack, Length(Stack)+8);
+ p := @Stack[LEngth(Stack)-8];
+ Double(p^) := data;
+ end;
+ end;
+ end;
+ {$ENDIF}
+ function GetPtr(fVar: PPSVariantIFC): Boolean;
+ var
+ varPtr: Pointer;
+ //UseReg: Boolean;
+ //tempstr: tbtstring;
+ p: Pointer;
+ begin
+ Result := False;
+ if FVar = nil then exit;
+ if fVar.VarParam then
+ begin
+ case fvar.aType.BaseType of
+ btArray:
+ begin
+ if Copy(fvar.aType.ExportName, 1, 10) = '!OPENARRAY' then
+ begin
+ p := CreateOpenArray(True, Self, FVar);
+ if p = nil then exit;
+ CallData.Add(p);
+ StoreReg(IPointer(POpenArray(p)^.Data));
+ StoreReg(IPointer(POpenArray(p)^.ItemCount -1));
+ Result := True;
+ Exit;
+ end else begin
+ varptr := fvar.Dta;
+// Exit;
+ end;
+ end;
+ btVariant,
+ btSet,
+ btStaticArray,
+ btRecord,
+ btInterface,
+ btClass,
+ {$IFNDEF PS_NOWIDESTRING} btUnicodeString, btWideString, btWideChar, {$ENDIF} btU8, btS8, btU16,
+ btS16, btU32, btS32, btSingle, btDouble, btExtended, btString, btPChar, btChar, btCurrency
+ {$IFNDEF PS_NOINT64}, bts64{$ENDIF}:
+ begin
+ Varptr := fvar.Dta;
+ end;
+ else begin
+ exit; //invalid type
+ end;
+ end; {case}
+
+ StoreReg(IPointer(VarPtr));
+ end else begin
+// UseReg := True;
+ case fVar^.aType.BaseType of
+ btSet:
+ begin
+ case TPSTypeRec_Set(fvar.aType).aByteSize of
+ 1: StoreReg(IPointer(byte(fvar.dta^)));
+ 2: StoreReg(IPointer(word(fvar.dta^)));
+ 3, 4: StoreReg(IPointer(cardinal(fvar.dta^)));
+ 5,6,7,8: StoreReg(IPointer(fVar.Dta^));
+ else
+ StoreReg(IPointer(fvar.Dta));
+ end;
+ end;
+ btArray:
+ begin
+ if Copy(fvar^.aType.ExportName, 1, 10) = '!OPENARRAY' then
+ begin
+ p := CreateOpenArray(False, SElf, FVar);
+ if p =nil then exit;
+ CallData.Add(p);
+ StoreReg(IPointer(POpenArray(p)^.Data));
+ StoreReg(IPointer(POpenArray(p)^.ItemCount -1));
+ Result := True;
+ exit;
+ end else begin
+ StoreReg(IPointer(FVar.Dta^));
+ end;
+ end;
+ btVariant
+ , btStaticArray, btRecord:
+ begin
+ StoreReg(IPointer(fVar.Dta));
+ end;
+ btExtended, btDouble: {8 bytes} begin
+ StoreReg(double(fvar.dta^));
+ end;
+ btCurrency: {8 bytes} begin
+ StoreReg(IPointer(fvar.dta^));
+ end;
+ btSingle: {4 bytes} begin
+ StoreReg(single(fvar.dta^));
+ end;
+
+ btChar,
+ btU8,
+ btS8: begin
+ StoreReg(IPointer(byte(fVar^.dta^)));
+ end;
+ btWideChar,
+ btu16, btS16: begin
+ StoreReg(IPointer(word(fVar^.dta^)));
+ end;
+ btu32, bts32: begin
+ StoreReg(IPointer(cardinal(fVar^.dta^)));
+ end;
+ btPchar:
+ begin
+ if pointer(fvar^.dta^) = nil then
+ StoreReg(IPointer(@EmptyPchar))
+ else
+ StoreReg(IPointer(fvar^.dta^));
+ end;
+ btclass, btinterface, btString:
+ begin
+ StoreReg(IPointer(fvar^.dta^));
+ end;
+ btWideString: begin
+ StoreReg(IPointer(fvar^.dta^));
+ end;
+ btUnicodeString: begin
+ StoreReg(IPointer(fvar^.dta^));
+ end;
+
+ btProcPtr:
+ begin
+ GetMem(p, PointerSize2);
+ TMethod(p^) := MKMethod(Self, Longint(FVar.Dta^));
+ StoreStack(p^, Pointersize2);
+ FreeMem(p);
+ end;
+
+ bts64:
+ begin
+ StoreReg(IPointer(int64(fvar^.dta^)));
+ end;
+ end; {case}
+ end;
+ Result := True;
+ end;
+begin
+ InnerfuseCall := False;
+ if Address = nil then
+ exit; // need address
+ SetLength(Stack, 0);
+ CallData := TPSList.Create;
+ res := rp(res);
+ if res <> nil then
+ res.VarParam := true;
+ try
+{$IFNDEF WINDOWS}
+ (*_RSI := 0;
+ _RDI := 0;
+ _XMM4 := 0;
+ _XMM5 := 0;
+ _XMM6 := 0;
+ _XMM7 := 0;*)
+ FillChar(Registers, Sizeof(REgisters), 0);
+ _XMM0 := 0;
+ RegUsageFloat := 0;
+{$ELSE}
+ _RCX := 0;
+ _RDX := 0;
+ _R8 := 0;
+ _R9 := 0;
+ _XMM0 := 0;
+ _XMM1 := 0;
+ _XMM2 := 0;
+ _XMM3 := 0;
+{$ENDIF}
+ _RAX := 0;
+ RegUsage := 0;
+ if assigned(_Self) then begin
+ StoreReg(IPointer(_Self));
+ end;
+ for I := 0 to Params.Count - 1 do
+ begin
+ if not GetPtr(rp(Params[I])) then Exit;
+ end;
+
+ if assigned(res) then begin
+ case res^.aType.BaseType of
+ {$IFDEF x64_string_result_as_varparameter}
+ btstring, btWideString, btUnicodeString,
+ {$ENDIF}
+ btInterface, btArray, btrecord, btVariant, btStaticArray: GetPtr(res);
+ btSet:
+ begin
+ if TPSTypeRec_Set(res.aType).aByteSize > PointerSize then GetPtr(res);
+ end;
+ end;
+ if Stack = nil then pp := nil else pp := @Stack[Length(Stack) -8];
+{$IFDEF WINDOWS}
+ x64call(Address, _RAX, _RCX, _RDX, _R8, _R9, _XMM0, _XMM1, _XMM2, _XMM3, pp, Length(Stack) div 8);
+{$ELSE}
+ x64call(Address, _RAX, Registers, pp, Length(Stack) div 8, _XMM0);
+{$ENDIF}
+ case res^.aType.BaseType of
+ btSet:
+ begin
+ case TPSTypeRec_Set(res.aType).aByteSize of
+ 1: byte(res.Dta^) := _RAX;
+ 2: word(res.Dta^) := _RAX;
+ 3,
+ 4: Longint(res.Dta^) := _RAX;
+ 5,6,7,8: IPointer(res.dta^) := _RAX;
+ end;
+ end;
+ btSingle: tbtsingle(res.Dta^) := _XMM0;
+ btDouble: tbtdouble(res.Dta^) := _XMM0;
+ btExtended: tbtextended(res.Dta^) := _XMM0;
+ btchar,btU8, btS8: tbtu8(res.dta^) := _RAX;
+ btWideChar, btu16, bts16: tbtu16(res.dta^) := _RAX;
+ btClass : IPointer(res.dta^) := _RAX;
+ btu32,bts32: tbtu32(res.dta^) := _RAX;
+ btPChar: pansichar(res.dta^) := Pansichar(_RAX);
+ bts64: tbts64(res.dta^) := Int64(_RAX);
+ btCurrency: tbtCurrency(res.Dta^) := Int64(_RAX);
+ btInterface,
+ btVariant,
+ {$IFDEF x64_string_result_as_varparameter}
+ btWidestring,btUnicodestring, btstring ,
+ {$ENDIF}
+ btStaticArray, btArray, btrecord:;
+ {$IFNDEF x64_string_result_as_varparameter}
+ btUnicodeString, btWideString, btstring: Int64(res.dta^) := _RAX;
+ {$ENDIF}
+ else
+ exit;
+ end;
+ end else begin
+ if Stack = nil then pp := nil else pp := @Stack[Length(Stack) -8];
+{$IFDEF WINDOWS}
+ x64call(Address, _RAX, _RCX, _RDX, _R8, _R9, _XMM0, _XMM1, _XMM2, _XMM3, pp, Length(Stack) div 8);
+{$ELSE}
+ x64call(Address, _RAX, Registers, pp, Length(Stack) div 8, _XMM0);
+{$ENDIF}
+ end;
+ Result := True;
+ finally
+ for i := CallData.Count -1 downto 0 do
+ begin
+ pp := CallData[i];
+ case pp^ of
+ 0: DestroyOpenArray(Self, Pointer(pp));
+ end;
+ end;
+ CallData.Free;
+ end;
+end;
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/Source/x86.inc b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/x86.inc
new file mode 100644
index 0000000..38289a7
--- /dev/null
+++ b/internal/6.0.43.801/1/Pascal Script for Delphi/Source/x86.inc
@@ -0,0 +1,746 @@
+{ implementation of x86 abi }
+{$ifdef FPC}
+{$define PS_ARRAY_ON_STACK}
+{$endif}
+function RealFloatCall_Register(p: Pointer;
+ _EAX, _EDX, _ECX: Cardinal;
+ StackData: Pointer;
+ StackDataLen: Longint // stack length are in 4 bytes. (so 1 = 4 bytes)
+ ): Extended; Stdcall; // make sure all things are on stack
+var
+ E: Extended;
+begin
+ asm
+ mov ecx, stackdatalen
+ jecxz @@2
+ mov eax, stackdata
+ @@1:
+ mov edx, [eax]
+ push edx
+ sub eax, 4
+ dec ecx
+ or ecx, ecx
+ jnz @@1
+ @@2:
+ mov eax,_EAX
+ mov edx,_EDX
+ mov ecx,_ECX
+ call p
+ fstp tbyte ptr [e]
+ end;
+ Result := E;
+end;
+
+function RealFloatCall_Other(p: Pointer;
+ StackData: Pointer;
+ StackDataLen: Longint // stack length are in 4 bytes. (so 1 = 4 bytes)
+ ): Extended; Stdcall; // make sure all things are on stack
+var
+ E: Extended;
+begin
+ asm
+ mov ecx, stackdatalen
+ jecxz @@2
+ mov eax, stackdata
+ @@1:
+ mov edx, [eax]
+ push edx
+ sub eax, 4
+ dec ecx
+ or ecx, ecx
+ jnz @@1
+ @@2:
+ call p
+ fstp tbyte ptr [e]
+ end;
+ Result := E;
+end;
+
+function RealFloatCall_CDecl(p: Pointer;
+ StackData: Pointer;
+ StackDataLen: Longint // stack length are in 4 bytes. (so 1 = 4 bytes)
+ ): Extended; Stdcall; // make sure all things are on stack
+var
+ E: Extended;
+begin
+ asm
+ mov ecx, stackdatalen
+ jecxz @@2
+ mov eax, stackdata
+ @@1:
+ mov edx, [eax]
+ push edx
+ sub eax, 4
+ dec ecx
+ or ecx, ecx
+ jnz @@1
+ @@2:
+ call p
+ fstp tbyte ptr [e]
+ @@5:
+ mov ecx, stackdatalen
+ jecxz @@2
+ @@6:
+ pop edx
+ dec ecx
+ or ecx, ecx
+ jnz @@6
+ end;
+ Result := E;
+end;
+
+function RealCall_Register(p: Pointer;
+ _EAX, _EDX, _ECX: Cardinal;
+ StackData: Pointer;
+ StackDataLen: Longint; // stack length are in 4 bytes. (so 1 = 4 bytes)
+ ResultLength: Longint; ResEDX: Pointer): Longint; Stdcall; // make sure all things are on stack
+var
+ r: Longint;
+begin
+ asm
+ mov ecx, stackdatalen
+ jecxz @@2
+ mov eax, stackdata
+ @@1:
+ mov edx, [eax]
+ push edx
+ sub eax, 4
+ dec ecx
+ or ecx, ecx
+ jnz @@1
+ @@2:
+ mov eax,_EAX
+ mov edx,_EDX
+ mov ecx,_ECX
+ call p
+ mov ecx, resultlength
+ cmp ecx, 0
+ je @@5
+ cmp ecx, 1
+ je @@3
+ cmp ecx, 2
+ je @@4
+ mov r, eax
+ jmp @@5
+ @@3:
+ xor ecx, ecx
+ mov cl, al
+ mov r, ecx
+ jmp @@5
+ @@4:
+ xor ecx, ecx
+ mov cx, ax
+ mov r, ecx
+ @@5:
+ mov ecx, resedx
+ jecxz @@6
+ mov [ecx], edx
+ @@6:
+ end;
+ Result := r;
+end;
+
+function RealCall_Other(p: Pointer;
+ StackData: Pointer;
+ StackDataLen: Longint; // stack length are in 4 bytes. (so 1 = 4 bytes)
+ ResultLength: Longint; ResEDX: Pointer): Longint; Stdcall; // make sure all things are on stack
+var
+ r: Longint;
+begin
+ asm
+ mov ecx, stackdatalen
+ jecxz @@2
+ mov eax, stackdata
+ @@1:
+ mov edx, [eax]
+ push edx
+ sub eax, 4
+ dec ecx
+ or ecx, ecx
+ jnz @@1
+ @@2:
+ call p
+ mov ecx, resultlength
+ cmp ecx, 0
+ je @@5
+ cmp ecx, 1
+ je @@3
+ cmp ecx, 2
+ je @@4
+ mov r, eax
+ jmp @@5
+ @@3:
+ xor ecx, ecx
+ mov cl, al
+ mov r, ecx
+ jmp @@5
+ @@4:
+ xor ecx, ecx
+ mov cx, ax
+ mov r, ecx
+ @@5:
+ mov ecx, resedx
+ jecxz @@6
+ mov [ecx], edx
+ @@6:
+ end;
+ Result := r;
+end;
+
+function RealCall_CDecl(p: Pointer;
+ StackData: Pointer;
+ StackDataLen: Longint; // stack length are in 4 bytes. (so 1 = 4 bytes)
+ ResultLength: Longint; ResEDX: Pointer): Longint; Stdcall; // make sure all things are on stack
+var
+ r: Longint;
+begin
+ asm
+ mov ecx, stackdatalen
+ jecxz @@2
+ mov eax, stackdata
+ @@1:
+ mov edx, [eax]
+ push edx
+ sub eax, 4
+ dec ecx
+ or ecx, ecx
+ jnz @@1
+ @@2:
+ call p
+ mov ecx, resultlength
+ cmp ecx, 0
+ je @@5
+ cmp ecx, 1
+ je @@3
+ cmp ecx, 2
+ je @@4
+ mov r, eax
+ jmp @@5
+ @@3:
+ xor ecx, ecx
+ mov cl, al
+ mov r, ecx
+ jmp @@5
+ @@4:
+ xor ecx, ecx
+ mov cx, ax
+ mov r, ecx
+ @@5:
+ mov ecx, stackdatalen
+ jecxz @@7
+ @@6:
+ pop eax
+ dec ecx
+ or ecx, ecx
+ jnz @@6
+ mov ecx, resedx
+ jecxz @@7
+ mov [ecx], edx
+ @@7:
+ end;
+ Result := r;
+end;
+
+const
+ EmptyPchar: array[0..0] of char = #0;
+
+function TPSExec.InnerfuseCall(_Self, Address: Pointer; CallingConv: TPSCallingConvention; Params: TPSList; res: PPSVariantIFC): Boolean;
+var
+ Stack: ansistring;
+ I: Longint;
+ RegUsage: Byte;
+ CallData: TPSList;
+ pp: ^Byte;
+{$IFDEF FPC}
+ IsConstructor: Boolean;
+{$ENDIF}
+
+ EAX, EDX, ECX: Longint;
+
+ function rp(p: PPSVariantIFC): PPSVariantIFC;
+ begin
+ if p = nil then
+ begin
+ result := nil;
+ exit;
+ end;
+ if p.aType.BaseType = btPointer then
+ begin
+ p^.aType := Pointer(Pointer(IPointer(p^.dta) + 4)^);
+ p^.Dta := Pointer(p^.dta^);
+ end;
+ Result := p;
+ end;
+
+ function GetPtr(fVar: PPSVariantIFC): Boolean;
+ var
+ varPtr: Pointer;
+ UseReg: Boolean;
+ tempstr: tbtstring;
+ p: Pointer;
+ begin
+ Result := False;
+ if FVar = nil then exit;
+ if fVar.VarParam then
+ begin
+ case fvar.aType.BaseType of
+ btArray:
+ begin
+ if Copy(fvar.aType.ExportName, 1, 10) = '!OPENARRAY' then
+ begin
+ p := CreateOpenArray(True, Self, FVar);
+ if p = nil then exit;
+ CallData.Add(p);
+ case RegUsage of
+ 0: begin EAX := Longint(POpenArray(p)^.Data); Inc(RegUsage); end;
+ 1: begin EDX := Longint(POpenArray(p)^.Data); Inc(RegUsage); end;
+ 2: begin ECX := Longint(POpenArray(p)^.Data); Inc(RegUsage); end;
+ else begin
+ Stack := StringOfChar(AnsiChar(#0),4) + Stack;
+ Pointer((@Stack[1])^) := POpenArray(p)^.Data;
+ end;
+ end;
+ case RegUsage of
+ 0: begin EAX := Longint(POpenArray(p)^.ItemCount - 1); Inc(RegUsage); end;
+ 1: begin EDX := Longint(POpenArray(p)^.ItemCount -1); Inc(RegUsage); end;
+ 2: begin ECX := Longint(POpenArray(p)^.ItemCount -1); Inc(RegUsage); end;
+ else begin
+ Stack := StringOfChar(AnsiChar(#0),4) + Stack;
+ Longint((@Stack[1])^) := POpenArray(p)^.ItemCount -1;
+ end;
+ end;
+ Result := True;
+ Exit;
+ end else begin
+ {$IFDEF PS_DYNARRAY}
+ varptr := fvar.Dta;
+ {$ELSE}
+ Exit;
+ {$ENDIF}
+ end;
+ end;
+ btVariant,
+ btSet,
+ btStaticArray,
+ btRecord,
+ btInterface,
+ btClass,
+ {$IFNDEF PS_NOWIDESTRING} btUnicodeString, btWideString, btWideChar, {$ENDIF} btU8, btS8, btU16,
+ btS16, btU32, btS32, btSingle, btDouble, btExtended, btString, btPChar, btChar, btCurrency
+ {$IFNDEF PS_NOINT64}, bts64{$ENDIF}:
+ begin
+ Varptr := fvar.Dta;
+ end;
+ else begin
+ exit; //invalid type
+ end;
+ end; {case}
+ case RegUsage of
+ 0: begin EAX := Longint(VarPtr); Inc(RegUsage); end;
+ 1: begin EDX := Longint(VarPtr); Inc(RegUsage); end;
+ 2: begin ECX := Longint(VarPtr); Inc(RegUsage); end;
+ else begin
+ Stack := StringOfChar(AnsiChar(#0),4) + Stack;
+ Pointer((@Stack[1])^) := VarPtr;
+ end;
+ end;
+ end else begin
+ UseReg := True;
+ case fVar^.aType.BaseType of
+ btSet:
+ begin
+ tempstr := StringOfChar(AnsiChar(#0),4);
+ case TPSTypeRec_Set(fvar.aType).aByteSize of
+ 1: Byte((@tempstr[1])^) := byte(fvar.dta^);
+ 2: word((@tempstr[1])^) := word(fvar.dta^);
+ 3, 4: cardinal((@tempstr[1])^) := cardinal(fvar.dta^);
+ else
+ pointer((@tempstr[1])^) := fvar.dta;
+ end;
+ end;
+ btArray:
+ begin
+ if Copy(fvar^.aType.ExportName, 1, 10) = '!OPENARRAY' then
+ begin
+ p := CreateOpenArray(False, SElf, FVar);
+ if p =nil then exit;
+ CallData.Add(p);
+ case RegUsage of
+ 0: begin EAX := Longint(POpenArray(p)^.Data); Inc(RegUsage); end;
+ 1: begin EDX := Longint(POpenArray(p)^.Data); Inc(RegUsage); end;
+ 2: begin ECX := Longint(POpenArray(p)^.Data); Inc(RegUsage); end;
+ else begin
+ Stack := StringOfChar(AnsiChar(#0),4) + Stack;
+ Pointer((@Stack[1])^) := POpenArray(p)^.Data;
+ end;
+ end;
+ case RegUsage of
+ 0: begin EAX := Longint(POpenArray(p)^.ItemCount -1); Inc(RegUsage); end;
+ 1: begin EDX := Longint(POpenArray(p)^.ItemCount -1); Inc(RegUsage); end;
+ 2: begin ECX := Longint(POpenArray(p)^.ItemCount -1); Inc(RegUsage); end;
+ else begin
+ Stack := StringOfChar(AnsiChar(#0),4) + Stack;
+ Longint((@Stack[1])^) := POpenArray(p)^.ItemCount -1;
+ end;
+ end;
+ Result := True;
+ exit;
+ end else begin
+ {$IFDEF PS_DYNARRAY}
+ TempStr := StringOfChar(AnsiChar(#0),4);
+ Pointer((@TempStr[1])^) := Pointer(fvar.Dta^);
+ {$IFDEF PS_ARRAY_ON_STACK}
+ UseReg := false;
+ {$ENDIF}
+ {$ELSE}
+ Exit;
+ {$ENDIF}
+ end;
+ end;
+ btVariant
+ , btStaticArray, btRecord:
+ begin
+ TempStr := StringOfChar(AnsiChar(#0),4);
+ Pointer((@TempStr[1])^) := Pointer(fvar.Dta);
+ end;
+ btDouble: {8 bytes} begin
+ TempStr := StringOfChar(AnsiChar(#0),8);
+ UseReg := False;
+ double((@TempStr[1])^) := double(fvar.dta^);
+ end;
+ btCurrency: {8 bytes} begin
+ TempStr := StringOfChar(AnsiChar(#0),8);
+ UseReg := False;
+ currency((@TempStr[1])^) := currency(fvar.dta^);
+ end;
+ btSingle: {4 bytes} begin
+ TempStr := StringOfChar(AnsiChar(#0),4);;
+ UseReg := False;
+ Single((@TempStr[1])^) := single(fvar.dta^);
+ end;
+
+ btExtended: {10 bytes} begin
+ UseReg := False;
+ TempStr:= StringOfChar(AnsiChar(#0),12);
+ Extended((@TempStr[1])^) := extended(fvar.dta^);
+ end;
+ btChar,
+ btU8,
+ btS8: begin
+ TempStr := tbtchar(fVar^.dta^) + tbtstring(StringOfChar(AnsiChar(#0),3));
+ end;
+ {$IFNDEF PS_NOWIDESTRING}btWideChar, {$ENDIF}
+ btu16, btS16: begin
+ TempStr := StringOfChar(AnsiChar(#0),4);
+ Word((@TempStr[1])^) := word(fVar^.dta^);
+ end;
+ btu32, bts32: begin
+ TempStr := StringOfChar(AnsiChar(#0),4);
+ Longint((@TempStr[1])^) := Longint(fVar^.dta^);
+ end;
+ btPchar:
+ begin
+ TempStr := StringOfChar(AnsiChar(#0),4);
+ if pointer(fvar^.dta^) = nil then
+ Pointer((@TempStr[1])^) := @EmptyPchar
+ else
+ Pointer((@TempStr[1])^) := pointer(fvar^.dta^);
+ end;
+ btclass, btinterface, btString:
+ begin
+ TempStr := StringOfChar(AnsiChar(#0),4);
+ Pointer((@TempStr[1])^) := pointer(fvar^.dta^);
+ end;
+ {$IFNDEF PS_NOWIDESTRING}
+ btWideString: begin
+ TempStr := StringOfChar(AnsiChar(#0),4);
+ Pointer((@TempStr[1])^) := pointer(fvar^.dta^);
+ end;
+ btUnicodeString: begin
+ TempStr := StringOfChar(AnsiChar(#0),4);
+ Pointer((@TempStr[1])^) := pointer(fvar^.dta^);
+ end;
+ {$ENDIF}
+
+ btProcPtr:
+ begin
+ tempstr := StringOfChar(AnsiChar(#0),8);
+ TMethod((@TempStr[1])^) := MKMethod(Self, Longint(FVar.Dta^));
+ UseReg := false;
+ end;
+
+ {$IFNDEF PS_NOINT64}bts64:
+ begin
+ TempStr:= StringOfChar(AnsiChar(#0),8);
+ Int64((@TempStr[1])^) := int64(fvar^.dta^);
+ UseReg := False;
+ end;{$ENDIF}
+ end; {case}
+ if UseReg then
+ begin
+ case RegUsage of
+ 0: begin EAX := Longint((@Tempstr[1])^); Inc(RegUsage); end;
+ 1: begin EDX := Longint((@Tempstr[1])^); Inc(RegUsage); end;
+ 2: begin ECX := Longint((@Tempstr[1])^); Inc(RegUsage); end;
+ else begin
+ {$IFDEF FPC_OLD_FIX}
+ if CallingConv = cdRegister then
+ Stack := Stack + TempStr
+ else
+ {$ENDIF}
+ Stack := TempStr + Stack;
+ end;
+ end;
+ end else begin
+ {$IFDEF FPC_OLD_FIX}
+ if CallingConv = cdRegister then
+ Stack := Stack + TempStr
+ else
+ {$ENDIF}
+ Stack := TempStr + Stack;
+ end;
+ end;
+ Result := True;
+ end;
+begin
+ if (Integer(CallingConv) and 64) <> 0 then begin
+ {$IFDEF FPC}
+ IsConstructor := true;
+ {$ENDIF}
+ CAllingConv := TPSCallingConvention(Integer(CallingConv) and not 64);
+ end else begin
+ {$IFDEF FPC}
+ IsConstructor := false;
+ {$ENDIF}
+ end;
+ InnerfuseCall := False;
+ if Address = nil then
+ exit; // need address
+ Stack := '';
+ CallData := TPSList.Create;
+ res := rp(res);
+ if res <> nil then
+ res.VarParam := true;
+ try
+ case CallingConv of
+ cdRegister: begin
+ EAX := 0;
+ EDX := 0;
+ ECX := 0;
+ RegUsage := 0;
+
+{$IFDEF FPC} // FIX FOR FPC constructor calls
+ if IsConstructor then begin
+ if not GetPtr(rp(Params[0])) then exit; // this goes first
+ RegUsage := 2;
+ EDX := Longint(_Self);
+ Params.Delete(0);
+ end else
+{$ENDIF}
+ if assigned(_Self) then begin
+ RegUsage := 1;
+ EAX := Longint(_Self);
+ end;
+
+ for I := 0 to Params.Count - 1 do
+ begin
+ if not GetPtr(rp(Params[I])) then Exit;
+ end;
+
+ if assigned(res) then begin
+ case res^.aType.BaseType of
+ {$IFNDEF PS_NOWIDESTRING}btWideString, btUnicodeString, {$ENDIF}
+ btInterface, btArray, btrecord, {$IFNDEF PS_FPCSTRINGWORKAROUND}btstring, {$ENDIF}btVariant, btStaticArray: GetPtr(res);
+ btSet:
+ begin
+ if TPSTypeRec_Set(res.aType).aByteSize >4 then GetPtr(res);
+ end;
+ end;
+ case res^.aType.BaseType of
+ btSet:
+ begin
+ case TPSTypeRec_Set(res.aType).aByteSize of
+ 1: byte(res.Dta^) := RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 1, nil);
+ 2: word(res.Dta^) := RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 2, nil);
+ 3,
+ 4: Longint(res.Dta^) := RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil);
+ else RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 0, nil)
+ end;
+ end;
+ btSingle: tbtsingle(res.Dta^) := RealFloatCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btDouble: tbtdouble(res.Dta^) := RealFloatCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btExtended: tbtextended(res.Dta^) := RealFloatCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btchar,btU8, btS8: tbtu8(res.dta^) := RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 1, nil);
+ {$IFNDEF PS_NOWIDESTRING}btWideChar, {$ENDIF}btu16, bts16: tbtu16(res.dta^) := RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 2, nil);
+ btClass :
+ {$IFDEF FPC_OLD_FIX}
+ tbtu32(res.dta^) := RealCall_Register(Address, EDX, EAX, ECX,
+ @Stack[Length(Stack) - 3], Length(Stack) div 4, 4, nil);
+ {$ELSE}
+ tbtu32(res.dta^) := RealCall_Register(Address, EAX, EDX, ECX,
+ @Stack[Length(Stack) - 3], Length(Stack) div 4, 4, nil);
+ {$ENDIF}
+
+ btu32,bts32: tbtu32(res.dta^) := RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil);
+ btPChar: pansichar(res.dta^) := Pansichar(RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil));
+ {$IFNDEF PS_NOINT64}bts64:
+ begin
+ EAX := RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, @EDX);
+ tbts64(res.dta^) := Int64(Cardinal(EDX)) shl 32 or Cardinal(EAX);
+ end;
+ {$ENDIF}
+ btCurrency: tbtCurrency(res.Dta^) := RealFloatCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4) / 10000;
+ btInterface,
+ btVariant,
+ {$IFNDEF PS_NOWIDESTRING}btWidestring,btUnicodestring, {$ENDIF}
+ btStaticArray, btArray, btrecord{$IFNDEF PS_FPCSTRINGWORKAROUND}, btstring {$ENDIF}: RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 0, nil);
+ {$IFDEF PS_FPCSTRINGWORKAROUND}
+ btstring: begin
+ eax := RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil);
+ Longint(res.dta^) := eax;
+ end;
+ {$ENDIF}
+ else
+ exit;
+ end;
+ end else
+ RealCall_Register(Address, EAX, EDX, ECX, @Stack[Length(Stack)-3], Length(Stack) div 4, 0, nil);
+ Result := True;
+ end;
+ cdPascal: begin
+ RegUsage := 3;
+ for I := 0 to Params.Count - 1 do begin
+ if not GetPtr(Params[i]) then Exit;
+ end;
+ if assigned(res) then begin
+ case res^.aType.BaseType of
+ {$IFNDEF PS_NOWIDESTRING}btWideString, btUnicodeString, {$ENDIF}btInterface, btArray, btrecord, btstring, btVariant: GetPtr(res);
+ end;
+ end;
+ if assigned(_Self) then begin
+ Stack := StringOfChar(AnsiChar(#0),4) +Stack;
+ Pointer((@Stack[1])^) := _Self;
+ end;
+ if assigned(res) then begin
+ case res^.aType.BaseType of
+ btSingle: tbtsingle(res^.Dta^) := RealFloatCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btDouble: tbtdouble(res^.Dta^) := RealFloatCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btExtended: tbtextended(res^.Dta^) := RealFloatCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btChar, btU8, btS8: tbtu8(res^.Dta^) := RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 1, nil);
+ {$IFNDEF PS_NOWIDESTRING}btWideChar, {$ENDIF}btu16, bts16: tbtu16(res^.Dta^) := RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 2, nil);
+ btClass, btu32, bts32: tbtu32(res^.Dta^):= RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil);
+ btPChar: TBTSTRING(res^.dta^) := Pansichar(RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil));
+ {$IFNDEF PS_NOINT64}bts64:
+ begin
+ EAX := RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, @EDX);
+ tbts64(res^.dta^) := Int64(EAX) shl 32 or EDX;
+ end;
+ {$ENDIF}
+ btVariant,
+ btInterface, btrecord, btstring: RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 0, nil);
+ else
+ exit;
+ end;
+ end else
+ RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 0, nil);
+ Result := True;
+ end;
+ cdSafeCall: begin
+ RegUsage := 3;
+ if assigned(res) then begin
+ GetPtr(res);
+ end;
+ for I := Params.Count - 1 downto 0 do begin
+ if not GetPtr(Params[i]) then Exit;
+ end;
+ if assigned(_Self) then begin
+ Stack := StringOfChar(AnsiChar(#0),4) +Stack;
+ Pointer((@Stack[1])^) := _Self;
+ end;
+ OleCheck(RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil));
+ Result := True;
+ end;
+
+ CdCdecl: begin
+ RegUsage := 3;
+ if assigned(_Self) then begin
+ Stack := StringOfChar(AnsiChar(#0),4);
+ Pointer((@Stack[1])^) := _Self;
+ end;
+ for I := Params.Count - 1 downto 0 do begin
+ if not GetPtr(Params[I]) then Exit;
+ end;
+ if assigned(res) then begin
+ case res^.aType.BaseType of
+ btSingle: tbtsingle(res^.dta^) := RealFloatCall_Cdecl(Address, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btDouble: tbtdouble(res^.dta^) := RealFloatCall_Cdecl(Address, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btExtended: tbtextended(res^.dta^) := RealFloatCall_Cdecl(Address, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btCHar, btU8, btS8: tbtu8(res^.dta^) := RealCall_Cdecl(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 1, nil);
+ {$IFNDEF PS_NOWIDESTRING}btWideChar, {$ENDIF}btu16, bts16: tbtu16(res^.dta^) := RealCall_Cdecl(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 2, nil);
+ btClass, btu32, bts32: tbtu32(res^.dta^) := RealCall_Cdecl(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil);
+ btPChar: TBTSTRING(res^.dta^) := Pansichar(RealCall_Cdecl(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil));
+ {$IFNDEF PS_NOINT64}bts64:
+ begin
+ EAX := RealCall_CDecl(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, @EDX);
+ tbts64(res^.Dta^) := Int64(EAX) shl 32 or EDX;
+ end;
+ {$ENDIF}
+ btVariant, {$IFNDEF PS_NOWIDESTRING}btUnicodeString, btWideString, {$ENDIF}
+ btInterface,
+ btArray, btrecord, btstring: begin GetPtr(res); RealCall_Cdecl(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 0, nil); end;
+ else
+ exit;
+ end;
+ end else begin
+ RealCall_CDecl(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 0, nil);
+ end;
+ Result := True;
+ end;
+ CdStdCall: begin
+ RegUsage := 3;
+ for I := Params.Count - 1 downto 0 do begin
+ if not GetPtr(Params[I]) then exit;
+ end;
+ if assigned(_Self) then begin
+ Stack := StringOfChar(AnsiChar(#0),4) + Stack;
+ Pointer((@Stack[1])^) := _Self;
+ end;
+ if assigned(res) then begin
+ case res^.aType.BaseType of
+ btSingle: tbtsingle(res^.dta^) := RealFloatCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btDouble: tbtdouble(res^.dta^) := RealFloatCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btExtended: tbtextended(res^.dta^):= RealFloatCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4);
+ btChar, btU8, btS8: tbtu8(res^.dta^) := RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 1, nil);
+ {$IFNDEF PS_NOWIDESTRING}btWideChar, {$ENDIF}btu16, bts16: tbtu16(res^.dta^) := RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 2, nil);
+ btclass, btu32, bts32: tbtu32(res^.dta^) := RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil);
+ btPChar: TBTSTRING(res^.dta^) := Pansichar(RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, nil));
+ {$IFNDEF PS_NOINT64}bts64:
+ begin
+ EAX := RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 4, @EDX);
+ tbts64(res^.dta^) := Int64(EAX) shl 32 or EDX;
+ end;
+ {$ENDIF}
+ btVariant, {$IFNDEF PS_NOWIDESTRING}btUnicodeString, btWideString, {$ENDIF}
+ btInterface, btArray, btrecord, btstring: begin GetPtr(res); RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 0, nil); end;
+ else
+ exit;
+ end;
+ end else begin
+ RealCall_Other(Address, @Stack[Length(Stack)-3], Length(Stack) div 4, 0, nil);
+ end;
+ Result := True;
+ end;
+ end;
+ finally
+ for i := CallData.Count -1 downto 0 do
+ begin
+ pp := CallData[i];
+ case pp^ of
+ 0: DestroyOpenArray(Self, Pointer(pp));
+ end;
+ end;
+ CallData.Free;
+ end;
+end;
+
+
diff --git a/internal/6.0.43.801/1/Pascal Script for Delphi/ps.png b/internal/6.0.43.801/1/Pascal Script for Delphi/ps.png
new file mode 100644
index 0000000..610bc82
Binary files /dev/null and b/internal/6.0.43.801/1/Pascal Script for Delphi/ps.png differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/Messages.nx1 b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/Messages.nx1
new file mode 100644
index 0000000..1bbc406
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/Messages.nx1 differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/MessagesPerSession.nx1 b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/MessagesPerSession.nx1
new file mode 100644
index 0000000..9a402e3
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/MessagesPerSession.nx1 differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/Sessions.nx1 b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/Sessions.nx1
new file mode 100644
index 0000000..39b94a6
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/Sessions.nx1 differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/nxTrans.cfg b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/nxTrans.cfg
new file mode 100644
index 0000000..003aee3
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/MasterServer_Data/nxTrans.cfg differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/Olympia.sqb b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/Olympia.sqb
new file mode 100644
index 0000000..36df6a7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/Olympia.sqb differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROCOM.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROCOM.dll
new file mode 100644
index 0000000..67a2a59
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROCOM.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RODL.exe b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RODL.exe
new file mode 100644
index 0000000..c341f06
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RODL.exe differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROMasterServer.exe b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROMasterServer.exe
new file mode 100644
index 0000000..3db850e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROMasterServer.exe differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROOlympiaServer.exe b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROOlympiaServer.exe
new file mode 100644
index 0000000..61123d0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROOlympiaServer.exe differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBBCB.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBBCB.dll
new file mode 100644
index 0000000..0918b0c
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBBCB.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDataAbstract.codetemplates.cfg b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDataAbstract.codetemplates.cfg
new file mode 100644
index 0000000..7d493c2
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDataAbstract.codetemplates.cfg
@@ -0,0 +1,88 @@
+[OneSchemaMethod-Delphi]
+var
+ lDataSet:IDADataSet;
+begin
+ { This method body was auto-generated to retrieve the schema of your datasets.
+ You can now modify it to suite your needs. }
+
+ { ToDO: Rename the Schema reference below to match the name of your Schema component }
+
+ result := Binary.Create();
+ lDataSet := %SCHEMA%.NewDataset(Connection, aDataSet);
+ BinAdapter.WriteDataset(result, lDataSet, [woSchema], 0);
+end;
+
+
+[OneGetMethod-Delphi]
+var
+ lDataSet:IDADataSet;
+begin
+ { This method body was auto-generated to retrieve the rows of your datasets.
+ You can now modify it to suite your needs. }
+
+ { ToDO: Rename the Schema reference below to match the name of your Schema component }
+
+ result := Binary.Create();
+ lDataSet := %SCHEMA%.NewDataset(Connection, aDataSet);
+ BinAdapter.WriteDataset(result, lDataSet, [woRows], -1);
+end;
+
+
+[OneUpdateMethod-Delphi]
+begin
+ { Implement yourself ;-}
+ result := nil;
+end;
+
+
+[SchemaMethodPerDataSet-Delphi]
+var
+ lDataSet:IDADataSet;
+begin
+ { This method body was auto-generated to retrieve the schema of your %DATASET% dataset.
+ You can now modify it to suite your needs. }
+
+ { ToDO: Rename the Schema reference below to match the name of your Schema component }
+
+ result := Binary.Create();
+ lDataSet := %SCHEMA%.NewDataset(Connection, %DATASET%);
+ BinAdapter.WriteDataset(result, lDataSet, [woSchema], 0);
+end;
+
+
+[GetMethodPerDataSet-Delphi]
+var
+ lDataSet:IDADataSet;
+begin
+ { This method body was auto-generated to retrieve the rows of your %DATASET% dataset.
+ You can now modify it to suite your needs. }
+
+ { ToDO: Rename the Schema reference below to match the name of your Schema component }
+
+ result := Binary.Create();
+ lDataSet := %SCHEMA%.NewDataset(Connection, %DATASET%);
+ BinAdapter.WriteDataset(result, lDataSet, [woRows], -1);
+end;
+
+
+[UpdateMethodPerDataSet-Delphi]
+begin
+ { Implement yourself ;-}
+ result := nil;
+end;
+
+[GetSchemaXmlMethod-Delphi]
+begin
+ { This method body was auto-generated to allow access to your XML schema.
+ You might want to disable this functionality in release builds for security
+ reasons by putting in the FDEFs below. }
+
+ { ToDo: Rename the Schema reference below to match the name of your Schema component }
+
+ {.$IFDEF RELEASE_BUILD}
+ result := Binary.Create();
+ %SCHEMA%.SaveToStream(result);
+ {.$ELSE}
+ { result := nil; }
+ {.$ENDIF RELEASE_BUILD}
+end;
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDataAbstract.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDataAbstract.dll
new file mode 100644
index 0000000..1b497df
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDataAbstract.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDefaultEditor.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDefaultEditor.dll
new file mode 100644
index 0000000..f9b2407
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDefaultEditor.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDefaultValidator.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDefaultValidator.dll
new file mode 100644
index 0000000..b7e9707
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDefaultValidator.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDelphi.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDelphi.dll
new file mode 100644
index 0000000..3e4ca48
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBDelphi.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBJSONRPC.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBJSONRPC.dll
new file mode 100644
index 0000000..6e07127
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBJSONRPC.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBOSX.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBOSX.dll
new file mode 100644
index 0000000..d7f9c3c
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBOSX.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBPHP.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBPHP.dll
new file mode 100644
index 0000000..937325a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBPHP.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBPasImporter.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBPasImporter.dll
new file mode 100644
index 0000000..f12c837
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBPasImporter.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBSOAP.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBSOAP.dll
new file mode 100644
index 0000000..e973768
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBSOAP.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBStandardImporters.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBStandardImporters.dll
new file mode 100644
index 0000000..aaeae9e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBStandardImporters.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBStandardViews.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBStandardViews.dll
new file mode 100644
index 0000000..d7ccbb2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBStandardViews.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBTLBImporter.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBTLBImporter.dll
new file mode 100644
index 0000000..af45ad2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROSBTLBImporter.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROServiceBuilder.exe b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROServiceBuilder.exe
new file mode 100644
index 0000000..b6cb4ff
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROServiceBuilder.exe differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROServiceBuilder70.bpl b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROServiceBuilder70.bpl
new file mode 100644
index 0000000..c9f353a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROServiceBuilder70.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROServiceTester.exe b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROServiceTester.exe
new file mode 100644
index 0000000..6de2217
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROServiceTester.exe differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROZeroConfHub.exe b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROZeroConfHub.exe
new file mode 100644
index 0000000..93eb202
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/ROZeroConfHub.exe differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects SDK.lic b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects SDK.lic
new file mode 100644
index 0000000..8c85b5e
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects SDK.lic
@@ -0,0 +1,18 @@
+9ec181ceba7436a2119d54f5c0c1c0fec113135e2e4f51fe88205a1ef5959131b503723938b2a2fc071b246527e8ebcc8f4b4d7b2986a3b44f26ac7b7edb400b7e81ff73dcc1bca1f0770d3ec140d91ed14dc13535b1d1150d52471fe12a1149d720c035d6f838832de2e7f78588f6ecc2d087c29d89c10fb7b94fe871d4130a75e419fd8e5ac74aff1d1a177db0786d899806592c929dd943a43ae251256a88abb0b7ff37bd126fa8c36b7240a1f7abc43f9c5689fb4da7cca7967379b63327e9d85efa3d4f3579bf1efef15148d8b5c45dbfab35151868bf096d8cfb7ffba50a5af91de1ceae27e885ef66b8976da75cad6db1153f6c44be7bf61cb4fa8875
+b28dcda5d2ae96078f5518dd88e60244a6a3afaddb01072a611aff866b1b160bafc240d530edfb814fa28a8ba94f9c5c378e2eac4d4374e368aea3fca38d393c
+Name=Trial
+Email=Trial
+UserId=Trial
+Company=Trial
+LicenseType=Default
+ProductName=RemObjects SDK
+Version=6
+AllowBeta=0
+Trial=1
+SubscriptionEndDate=2009-12-04
+LicenseFileEndDate=2009-12-3
+StartDate=2009-11-30
+EndDate=2010-9-2
+P1=1839102476694900580
+P2=11062474516006441058
+P3=3495438591
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects.DataAbstract.Server.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects.DataAbstract.Server.dll
new file mode 100644
index 0000000..625b0f9
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects.DataAbstract.Server.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects.DataAbstract.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects.DataAbstract.dll
new file mode 100644
index 0000000..dfc3cc0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects.DataAbstract.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects.Olympia.dll b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects.Olympia.dll
new file mode 100644
index 0000000..c4c7b93
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/RemObjects.Olympia.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/System.Data.SQLite.DLL b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/System.Data.SQLite.DLL
new file mode 100644
index 0000000..8787bed
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/System.Data.SQLite.DLL differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/rtl70.bpl b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/rtl70.bpl
new file mode 100644
index 0000000..ea28d0b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/rtl70.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/vcl70.bpl b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/vcl70.bpl
new file mode 100644
index 0000000..572cb25
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK (Common)/Bin/vcl70.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.InternetPack.dll b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.InternetPack.dll
new file mode 100644
index 0000000..b7cb5cc
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.InternetPack.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.SDK.Server.dll b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.SDK.Server.dll
new file mode 100644
index 0000000..f1d7503
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.SDK.Server.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.SDK.ZLib.dll b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.SDK.ZLib.dll
new file mode 100644
index 0000000..bcef67a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.SDK.ZLib.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.SDK.dll b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.SDK.dll
new file mode 100644
index 0000000..0c4ec08
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Bin/RemObjects.SDK.dll differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_D11.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_D11.bpl
new file mode 100644
index 0000000..dafecbf
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_D11.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_D11.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_D11.dcp
new file mode 100644
index 0000000..ca66caa
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_D11.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_D11.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_D11.dcu
new file mode 100644
index 0000000..2b59868
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_D11.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_Reg.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_Reg.dcu
new file mode 100644
index 0000000..b8eb22d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/RemObjects_IDE_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fCustomIDEMessagesForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fCustomIDEMessagesForm.dcu
new file mode 100644
index 0000000..ab872ba
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fCustomIDEMessagesForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fDispatchersEditorForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fDispatchersEditorForm.dcu
new file mode 100644
index 0000000..7c08028
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fDispatchersEditorForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fNewProjectForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fNewProjectForm.dcu
new file mode 100644
index 0000000..e83e656
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fNewProjectForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fROAbout.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fROAbout.dcu
new file mode 100644
index 0000000..d75261d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fROAbout.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fROServerClassForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fROServerClassForm.dcu
new file mode 100644
index 0000000..a8fcd92
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fROServerClassForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fServerProjectOptions.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fServerProjectOptions.dcu
new file mode 100644
index 0000000..f7f11b0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/fServerProjectOptions.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODECReg.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODECReg.dcu
new file mode 100644
index 0000000..620b98d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODECReg.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLAsyncConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLAsyncConverter.dcu
new file mode 100644
index 0000000..9b21030
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLAsyncConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLConvertersUtils.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLConvertersUtils.dcu
new file mode 100644
index 0000000..0ea3443
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLConvertersUtils.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLCppConverters.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLCppConverters.dcu
new file mode 100644
index 0000000..e8d0bcd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLCppConverters.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLDelphiConverters.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLDelphiConverters.dcu
new file mode 100644
index 0000000..90fb3bd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLDelphiConverters.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLGenTools.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLGenTools.dcu
new file mode 100644
index 0000000..10bfc9c
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLGenTools.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLImplConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLImplConverter.dcu
new file mode 100644
index 0000000..19a7884
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLImplConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLIntfConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLIntfConverter.dcu
new file mode 100644
index 0000000..9f9faad
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLIntfConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLInvkConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLInvkConverter.dcu
new file mode 100644
index 0000000..31c4bc4
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLInvkConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLLineStream.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLLineStream.dcu
new file mode 100644
index 0000000..8b5b05c
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLLineStream.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLSplitableConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLSplitableConverter.dcu
new file mode 100644
index 0000000..99490d5
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLSplitableConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLTemplateBasedConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLTemplateBasedConverter.dcu
new file mode 100644
index 0000000..a829138
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLTemplateBasedConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLTemplateBasedConverterUtils.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLTemplateBasedConverterUtils.dcu
new file mode 100644
index 0000000..0e56548
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLTemplateBasedConverterUtils.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascal.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascal.dcu
new file mode 100644
index 0000000..bc72d63
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascal.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalAsync.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalAsync.dcu
new file mode 100644
index 0000000..1dacad0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalAsync.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalImpl.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalImpl.dcu
new file mode 100644
index 0000000..6163773
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalImpl.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalIntf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalIntf.dcu
new file mode 100644
index 0000000..e8d59ac
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalIntf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalInvk.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalInvk.dcu
new file mode 100644
index 0000000..56f3fbf
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRODLToPascalInvk.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROEncKeyPropEditor.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROEncKeyPropEditor.dcu
new file mode 100644
index 0000000..4753109
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROEncKeyPropEditor.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROExtraEditors.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROExtraEditors.dcu
new file mode 100644
index 0000000..daa966b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROExtraEditors.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEData.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEData.dcu
new file mode 100644
index 0000000..b8416ad
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEData.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEEditors.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEEditors.dcu
new file mode 100644
index 0000000..de26931
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEEditors.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEMenu.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEMenu.dcu
new file mode 100644
index 0000000..1757a0f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEMenu.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEPrjWizard.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEPrjWizard.dcu
new file mode 100644
index 0000000..2cfef73
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDEPrjWizard.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDETools.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDETools.dcu
new file mode 100644
index 0000000..6725ea0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROIDETools.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROLoginNeededForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROLoginNeededForm.dcu
new file mode 100644
index 0000000..0a42450
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROLoginNeededForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROProductVersionInfo.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROProductVersionInfo.dcu
new file mode 100644
index 0000000..d31be91
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROProductVersionInfo.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROProductVersionInfoForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROProductVersionInfoForm.dcu
new file mode 100644
index 0000000..154189b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROProductVersionInfoForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROProductVersionInfo_Intf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROProductVersionInfo_Intf.dcu
new file mode 100644
index 0000000..c051bed
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROProductVersionInfo_Intf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRORODLNotifier.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRORODLNotifier.dcu
new file mode 100644
index 0000000..a0707ea
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uRORODLNotifier.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROResWriter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROResWriter.dcu
new file mode 100644
index 0000000..c9f38ab
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D10/uROResWriter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/ROMasterServerLibrary_Intf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/ROMasterServerLibrary_Intf.dcu
new file mode 100644
index 0000000..df57c9e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/ROMasterServerLibrary_Intf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/ROOlympia_Intf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/ROOlympia_Intf.dcu
new file mode 100644
index 0000000..749924a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/ROOlympia_Intf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects.inc b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects.inc
new file mode 100644
index 0000000..bbc33e5
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects.inc
@@ -0,0 +1,151 @@
+{$INCLUDE eDefines.inc}
+
+{ Define to check for RemObjects SDK 3.0 [vs. future versions] }
+{.$DEFINE ROSDK4}
+{$DEFINE ROSDK5}
+
+{ Define to check for RemObjects SDK 3.0 and above [vs. older versions] }
+{$DEFINE ROSDK3UP}
+{$DEFINE ROSDK4UP}
+{$DEFINE ROSDK5UP}
+
+{ DXSock }
+
+ { To use RemObjects with the standalone version of DXSock, simply remove the
+ define below. Note that this has only been tested with DXSock 3.0, and that
+ doing so requires a separate license for DXSock from Brain PatchWorks
+ see http://www.bpdx.com for more information }
+
+ {$DEFINE RemObjects_USE_RODX}
+
+{ Internet Component Suite (ICS) }
+ { Internet Component Suite - http://www.overbyte.be }
+
+ {$DEFINE RemObjects_ICS_v5}
+ {.$DEFINE RemObjects_ICS_v6}
+
+{ Indy }
+
+ { If you are using Indy 10.2.3 or the latest just uncomment the
+ RemObjects_INDY10C DEFINE right below, and remove the Indy
+ package references from the Requires section of RemObjects_Indy_Dx.dpk
+ before re-compiling your RemObjects Indy package. }
+
+ {.$DEFINE RemObjects_INDY10C}
+ {$IFDEF RemObjects_INDY10C}
+ {$DEFINE RemObjects_INDY10}
+ {$DEFINE RemObjects_INDY10B}
+ {$DEFINE RemObjects_GLOBAL_INDY_DEFINE}
+ {$ENDIF}
+
+ { If you are using latest Indy 10 in Delphi 6 or 7, just uncomment the
+ RemObjects_INDY10_in_Delphi67 DEFINE right below, and remove the Indy
+ package references from the Requires section of RemObjects_Indy_Dx.dpk
+ before re-compiling your RemObjects Indy package. }
+
+ {.$DEFINE RemObjects_INDY10_in_Delphi67}
+ {$IFDEF RemObjects_INDY10_in_Delphi67}
+ {$DEFINE RemObjects_INDY10}
+ {$DEFINE RemObjects_INDY10B}
+ {$DEFINE RemObjects_GLOBAL_INDY_DEFINE}
+ {$ENDIF}
+
+ {$IFNDEF RemObjects_GLOBAL_INDY_DEFINE}
+
+ {$UNDEF RemObjects_INDY8}
+ {$UNDEF RemObjects_INDY9}
+ {$UNDEF RemObjects_INDY10}
+
+ {$IFDEF FPC}
+ {$DEFINE RemObjects_INDY10}
+ {$DEFINE RemObjects_INDY10B}
+ {$DEFINE RemObjects_INDY10C}
+ {$ELSE}
+ {$IFDEF DELPHI12UP}
+ {$DEFINE RemObjects_INDY10}
+ {$DEFINE RemObjects_INDY10B}
+ {$DEFINE RemObjects_INDY10C}
+ {$ELSE}
+ {$IFDEF DELPHI10UP}
+ {$DEFINE RemObjects_INDY10}
+ {$DEFINE RemObjects_INDY10B}
+ {$ELSE}
+ {$IFDEF DELPHI9UP}
+ {$DEFINE RemObjects_INDY10}
+ {$DEFINE RemObjects_INDY10A}
+ {$ELSE}
+ {$IFDEF DELPHI7UP}
+ {$DEFINE RemObjects_INDY9}
+ {$ELSE}
+ {$DEFINE RemObjects_INDY8}
+ {$ENDIF}
+ {$ENDIF}
+ {$ENDIF}
+ {$ENDIF}
+
+ {$IFDEF KYLIX}
+ {$IFDEF KYLIX3UP}
+ {$DEFINE RemObjects_INDY9}
+ {$ELSE}
+ {$DEFINE RemObjects_INDY8}
+ {$ENDIF}
+ {$ENDIF}
+ {$ENDIF}
+
+ { If you are using Indy 9 in Delphi 6 just uncomment the Indy9 DEFINE below,
+ and remove the Indy package references from the Requires section of
+ RemObjects_Indy_D6.dpk before compiling your RemObjects Indy package. }
+
+ {.$DEFINE RemObjects_INDY9}
+
+ {$IFDEF RemObjects_INDY9}
+ {$UNDEF RemObjects_INDY8}
+ {$ENDIF}
+
+ {$ENDIF}
+
+ { If you are using a newer version of Indy that properly works at designtime,
+ you can set define the define below. If the define is not set (as is the
+ default), Indy channels cannot be used to connect at designtime, trying so
+ will display a warning message.
+
+ If you enable this define and receive an Access Violation when trying to
+ connect at designtime, then your Indy version does not yet include the
+ fix for this problem. Please contact the Indy Crew for details.
+
+ This problem applies to the Delphi Windows IDE's only; Kylix is not affected. }
+
+ {.$DEFINE RemObjects_INDY_DESIGNTIME_FIX}
+
+{ Thread Names in Debugger }
+
+ {$IFDEF DELPHI7UP}
+ {$DEFINE RemObjects_SetThreadName}
+ {$ENDIF}
+
+{ XML }
+
+ {$IFDEF MSWINDOWS}
+ {$DEFINE RemObjects_MSXML}
+ {$ELSE}
+ {$DEFINE RemObjects_OpenXML}
+ {$ENDIF}
+
+ { if we someone manually defined RemObjects_OpenXML, then undef RemObjects_MSXML }
+ {$IFDEF RemObjects_OpenXML}
+ {$UNDEF RemObjects_MSXML}
+ {$ENDIF}
+
+{ Encryption }
+
+ {$IFDEF MSWINDOWS}
+ {$DEFINE RemObjects_UseEncryption }
+ {$ENDIF MSWINDOWS}
+
+ {$IFDEF FPC}
+ {$MODE DELPHI}
+ {$UNDEF RemObjects_UseEncryption}
+ {$DEFINE RemObjects_OpenXML}
+ {$UNDEF RemObjects_MSXML}
+ {$ENDIF}
+ {$Q-,B-,R-}
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.bpl
new file mode 100644
index 0000000..16e9ccf
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.dcp
new file mode 100644
index 0000000..d53ff73
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.dcu
new file mode 100644
index 0000000..c47ab7e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_D11.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_Reg.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_Reg.dcu
new file mode 100644
index 0000000..1c06852
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_BPDX_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.bpl
new file mode 100644
index 0000000..e4c34bc
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.dcp
new file mode 100644
index 0000000..36cdcbd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.dcu
new file mode 100644
index 0000000..e745609
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_D11.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_Reg.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_Reg.dcu
new file mode 100644
index 0000000..b3f9f99
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Core_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.bpl
new file mode 100644
index 0000000..77ea0de
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.dcp
new file mode 100644
index 0000000..5a65314
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.dcu
new file mode 100644
index 0000000..7f7d98d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_D11.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_Glyphs.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_Glyphs.res
new file mode 100644
index 0000000..0578e6e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_Glyphs.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_Reg.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_Reg.dcu
new file mode 100644
index 0000000..8737f31
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_DataSnap_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.bpl
new file mode 100644
index 0000000..aedd3a2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.dcp
new file mode 100644
index 0000000..49f3dfd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.dcu
new file mode 100644
index 0000000..83da077
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_D11.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_Reg.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_Reg.dcu
new file mode 100644
index 0000000..c6b3949
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_IDE_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.bpl
new file mode 100644
index 0000000..3eed6dc
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.dcp
new file mode 100644
index 0000000..4dec939
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.dcu
new file mode 100644
index 0000000..aec678b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_D11.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_Reg.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_Reg.dcu
new file mode 100644
index 0000000..081fbb7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Indy_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.bpl
new file mode 100644
index 0000000..ea5bdda
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.dcp
new file mode 100644
index 0000000..46d5105
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.dcu
new file mode 100644
index 0000000..2a49969
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_RODX_D11.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.bpl
new file mode 100644
index 0000000..2516cb5
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.dcp
new file mode 100644
index 0000000..11d184d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.dcu
new file mode 100644
index 0000000..26d38a1
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_D11.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_Reg.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_Reg.dcu
new file mode 100644
index 0000000..6df5115
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_Synapse_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.bpl
new file mode 100644
index 0000000..1291f09
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.dcp
new file mode 100644
index 0000000..91dce9f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.dcu
new file mode 100644
index 0000000..411050d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.res
new file mode 100644
index 0000000..aef77e0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_D11.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_Reg.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_Reg.dcu
new file mode 100644
index 0000000..2b50e6f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/RemObjects_WebBroker_Reg.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/Resources.BDS.RES b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/Resources.BDS.RES
new file mode 100644
index 0000000..048522e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/Resources.BDS.RES differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/Templates.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/Templates.res
new file mode 100644
index 0000000..a160053
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/Templates.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/asn1util.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/asn1util.dcu
new file mode 100644
index 0000000..21299b3
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/asn1util.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/blcksock.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/blcksock.dcu
new file mode 100644
index 0000000..7c45091
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/blcksock.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/eDefines.inc b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/eDefines.inc
new file mode 100644
index 0000000..ef01d58
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/eDefines.inc
@@ -0,0 +1,495 @@
+{----------------------------------------------------------------------------}
+{file: eDefines.inc }
+{type: Delphi include file }
+{ }
+{compiler: Borland Pascal 7, }
+{ Delphi 1-7, 2005-2007 for Win32 }
+{ Kylix 1-3, }
+{ C++Builder 1-6, 2006-2007 }
+{ Free Pascal Compiler 2.x }
+{ }
+{platforms: DOS, DPMI, Win16, Win32, Win64, Linux, Mac OS X }
+{ }
+{author: mh@elitedev.com }
+{ }
+{contents: Defines that can be flexibily used to determine the exact }
+{ compiler version used. }
+{ }
+{(c)opyright elitedevelopments software. all rights reserved. }
+{ http://www.elitedev.com }
+{ }
+{ Third Party component developers are encouraged to use the set of defines }
+{ established in this file, rather then their own system, for checking their }
+{ component libraries agains different versions of Delphi and C++Builder. }
+{ }
+{ This file may be distributed freely with both free and commercial source }
+{ libraries, but you are asked to please leave this comment in place, and }
+{ to return any improvements you make to this file to the maintainer that }
+{ is noted above. }
+{----------------------------------------------------------------------------}
+
+{----------------------------------------------------------------------------}
+{ Compiler and OS version defines: }
+{ }
+{ exact compiler versions: }
+{ }
+{ BP7 Borland Pascal 7.0 }
+{ DELPHI1 Delphi 1.0 (any Delphi) }
+{ DELPHI2 Delphi 2.0 }
+{ DELPHI3 Delphi 3.0 }
+{ DELPHI4 Delphi 4.0 }
+{ DELPHI5 Delphi 5.0 }
+{ DELPHI6 Delphi 6.0 }
+{ DELPHI7 Delphi 7.0 }
+{ DELPHI9 Delphi 2005 }
+{ DELPHI2005 Delphi 2005 }
+{ DELPHI2006 Delphi 2006 }
+{ DELPHI2007 Delphi 2007 }
+{ KYLIX1 Kylix 1.0 }
+{ KYLIX2 Kylix 2.0 }
+{ KYLIX3 Kylix 3.0 }
+{ CBUILDER1 C++Builder 1.0 }
+{ CBUILDER3 C++Builder 3.0 }
+{ CBUILDER4 C++Builder 4.0 }
+{ CBUILDER5 C++Builder 5.0 }
+{ }
+{ }
+{ minimum compiler versions: }
+{ }
+{ DELPHI1UP Delphi 1.0 and above (any Delphi) }
+{ DELPHI2UP Delphi 2.0 and above }
+{ DELPHI3UP Delphi 3.0 and above }
+{ DELPHI4UP Delphi 4.0 and above }
+{ DELPHI5UP Delphi 5.0 and above }
+{ DELPHI6UP Delphi 6.0 and above }
+{ DELPHI7UP Delphi 7.0 and above }
+{ DELPHI9UP Delphi 9.0 (2005) and above }
+{ DELPHI10UP Delphi 10.0 (2006) and above }
+{ DELPHI11UP Delphi 11.0 (2007) and above }
+{ DELPHI2005UP Delphi 2005 and above }
+{ DELPHI2006UP Delphi 2006 and above }
+{ DELPHI2007UP Delphi 2007 and above }
+{ KYLIX1UP Kylix 1.0 and above (any Kylix) }
+{ KYLIX2UP Kylix 2.0 and above (any Kylix) }
+{ KYLIX3UP Kylix 3.0 and above (any Kylix) }
+{ CBUILDER1UP C++Builder 1.0 and above or Delphi 2 and above }
+{ CBUILDER3UP C++Builder 3.0 and above or Delphi 3.0 and above }
+{ CBUILDER4UP C++Builder 4.0 and above or Delphi 4.0 and above }
+{ CBUILDER5UP C++Builder 5.0 and above or Delphi 5.0 and above }
+{ CBUILDER6UP C++Builder 5.0 and above or Delphi 5.0 and above }
+{ }
+{ }
+{ compiler types: }
+{ }
+{ BP Borland Pascal (not Delphi or C++Builder) }
+{ DELPHI any Delphi version (but not C++Builder or Kylix) }
+{ KYLIX any Kylix version (not Delphi or C++Builder for Windows) }
+{ CBUILDER any C++Builder for Windows (Pascal) }
+{ }
+{ }
+{ target platforms compiler types: }
+{ }
+{ DELPHI_16BIT 16bit Delphi (but not C++Builder!) }
+{ DELPHI_32BIT 32bit Delphi (but not C++Builder) }
+{ KYLIX_32BIT 32bit Kylix (but not C++Builder) }
+{ CBUILDER_32BIT 32bit C++Builer's Pascal (but not Delphi) }
+{ }
+{ }
+{ target cpu types }
+{ }
+{ CPU16 16bit Delphi or Borland Pascal }
+{ CPU32 32bit Delphi or Free Pascal }
+{ CPU64 64bit Free Pascal }
+{ }
+{ target platforms }
+{ }
+{ DOS any DOS (plain and DPMI) }
+{ REALMODE 16bit realmode DOS }
+{ PROTECTEDMODE 16bit DPMI DOS }
+{ }
+{ MSWINDOWS any Windows platform }
+{ WIN16 16bit Windows }
+{ WIN32 32bit Windows }
+{ WIN64 64bit Windows }
+{ DOTNET .NET }
+{ }
+{ LINUX any Linux platform }
+{ LINUX32 32bit Linux }
+{ LINUX64 64bit Linux }
+{ }
+{ DARWIN Any Mac OS X }
+{ DARWIN32 32bit Mac OS X }
+{ DARWIN64 64bit Mac OS X }
+{----------------------------------------------------------------------------}
+
+{ defines for Borland Pascal 7.0 }
+{$IFDEF VER70}
+ {$DEFINE BP}
+ {$DEFINE BP7}
+ {$DEFINE 16BIT}
+ {$DEFINE CPU16}
+
+ { defines for BP7 DOS real mode }
+ {$IFDEF MSDOS}
+ {$DEFINE DOS}
+ {$DEFINE REALMODE}
+ {$ENDIF}
+
+ { defines for BP7 DOS protected mode }
+ {$IFDEF DPMI}
+ {$DEFINE DOS}
+ {$DEFINE PROTECTEDMODE}
+ {$ENDIF}
+
+ { defines for BP7 Windows }
+ {$IFDEF WINDOWS}
+ {$DEFINE MSWINDOWS}
+ {$DEFINE WIN16}
+ {$ENDIF}
+{$ENDIF}
+
+{ defines for Delphi 1.0 thru 7.0 }
+{$IFDEF MSWINDOWS}
+
+ { defines for Delphi 1.0 }
+ {$IFDEF VER80}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI1}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI_16BIT}
+ {$DEFINE WIN16}
+ {$DEFINE 16BIT}
+ {$DEFINE CPU16}
+ {$ENDIF}
+
+ { defines for Delphi 2.0 }
+ {$IFDEF VER90}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI2}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$ENDIF}
+
+ { defines for C++Builder 1.0 }
+ {$IFDEF VER93}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER1}
+ {$DEFINE CBUILDER1UP}
+ {$ENDIF}
+
+ { defines for Delphi 3.0 }
+ {$IFDEF VER100}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI3}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$ENDIF}
+
+ { defines for C++Builder 3.0 }
+ {$IFDEF VER110}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER3}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$ENDIF}
+
+ { defines for Delphi 4.0 }
+ {$IFDEF VER120}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI4}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$ENDIF}
+
+ { defines for C++Builder 4.0 }
+ {$IFDEF VER125}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER4}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$DEFINE CBUILDER4UP}
+ {$ENDIF}
+ { defines for Delphi 5.0 }
+ {$IFDEF VER130}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI5}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$ENDIF}
+
+ { defines for C++Builder 5.0 }
+ {$IFDEF VER135}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE CBUILDER}
+ {$DEFINE CBUILDER5}
+ {$DEFINE CBUILDER1UP}
+ {$DEFINE CBUILDER3UP}
+ {$DEFINE CBUILDER4UP}
+ {$DEFINE CBUILDER5UP}
+ {$ENDIF}
+
+ { defines for Delphi 6.0 }
+ {$IFDEF VER140}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI6}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$ENDIF}
+
+ { defines for Delphi 7.0 }
+ {$IFDEF VER150}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI7}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$ENDIF}
+
+ { defines for Delphi 2005 }
+ {$IFDEF VER170}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI9}
+ {$DEFINE DELPHI2005}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE BDS}
+ {$DEFINE BDS3}
+ {$DEFINE BDS3UP}
+ {$ENDIF}
+
+ { defines for Delphi 2006 }
+ {$IFDEF VER180}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+ {$DEFINE DELPHI10}
+ {$DEFINE DELPHI10A}
+ {$DEFINE DELPHI2006}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE BDS}
+ {$DEFINE BDS4}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$ENDIF}
+
+ { defines for Delphi 2007 }
+ {$IFDEF VER185}
+ {$UNDEF DELPHI10A} // declared in VER180
+ {$UNDEF DELPHI2006} // declared in VER180
+ {$UNDEF BDS4} // declared in VER180
+
+ {$DEFINE DELPHI10B}
+ {$DEFINE DELPHI10BUP}
+ {$DEFINE DELPHI11}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI2007}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE BDS5}
+ {$DEFINE BDS5UP}
+ {$ENDIF}
+
+ { defines for Delphi 2009 }
+ {$IFDEF VER200}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+
+ {$DEFINE DELPHI12}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI12UP}
+
+ {$DEFINE DELPHI2009}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE DELPHI2009UP}
+
+ {$DEFINE BDS}
+ {$DEFINE BDS6}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$DEFINE BDS5UP}
+ {$DEFINE BDS6UP}
+ {$ENDIF}
+
+ { defines for Delphi 2010 }
+ {$IFDEF VER210}
+ {$DEFINE VER140UP}
+ {$DEFINE DELPHI}
+
+ {$DEFINE DELPHI14}
+ {$DEFINE DELPHI1UP}
+ {$DEFINE DELPHI2UP}
+ {$DEFINE DELPHI3UP}
+ {$DEFINE DELPHI4UP}
+ {$DEFINE DELPHI5UP}
+ {$DEFINE DELPHI6UP}
+ {$DEFINE DELPHI7UP}
+ {$DEFINE DELPHI9UP}
+ {$DEFINE DELPHI10UP}
+ {$DEFINE DELPHI11UP}
+ {$DEFINE DELPHI12UP}
+ {$DEFINE DELPHI14UP}
+
+ {$DEFINE DELPHI2010}
+ {$DEFINE DELPHI2005UP}
+ {$DEFINE DELPHI2006UP}
+ {$DEFINE DELPHI2007UP}
+ {$DEFINE DELPHI2009UP}
+ {$DEFINE DELPHI2010UP}
+
+ {$DEFINE BDS}
+ {$DEFINE BDS7}
+ {$DEFINE BDS3UP}
+ {$DEFINE BDS4UP}
+ {$DEFINE BDS5UP}
+ {$DEFINE BDS6UP}
+ {$DEFINE BDS7UP}
+ {$ENDIF}
+
+
+ {$IFDEF WIN32}
+ {$DEFINE MSWINDOWS} //not automatically defined for Delphi 2 thru 5
+ {$DEFINE 32BIT}
+ {$DEFINE CPU32}
+ {$ENDIF}
+
+{$ENDIF MSWINDOWS}
+
+{ defines for "Delphi for .NET" }
+{$IFDEF CLR}
+ {$DEFINE DOTNET}
+{$ENDIF}
+
+{$IFDEF DELPHI}
+ {$IFDEF DELPHI2UP}
+ {$DEFINE DELPHI_32BIT}
+ {$ENDIF}
+{$ENDIF}
+
+{$IFDEF CBUILDER}
+ {$DEFINE CBUILDER_32BIT}
+{$ENDIF}
+
+{$IFNDEF FPC}
+
+ { Kylix 1.0 thru 3.0 }
+ {$IFDEF LINUX}
+
+ {$DEFINE VER140UP}
+
+ { Any Kylix }
+ {$DEFINE 32BIT}
+ {$DEFINE LINUX32}
+ {$DEFINE KYLIX_32BIT}
+ {$DEFINE KYLIX}
+ {$DEFINE KYLIX1UP}
+
+ {$IFDEF CONDITIONALEXPRESSIONS}
+ {$IF Declared(CompilerVersion)}
+
+ { Kylix 2.0 }
+ {$IF Declared(RTLVersion) and (RTLVersion = 14.1)}
+ {$DEFINE KYLIX2}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$IFEND}
+
+ { Kylix 3.0 - Delphi portion }
+ {$IF Declared(RTLVersion) and (RTLVersion = 14.5)}
+ {$DEFINE KYLIX3}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$DEFINE KYLIX3UP}
+ {$IFEND}
+
+ { Kylix 1.0 }
+ {$ELSE}
+ {$DEFINE KYLIX1}
+ {$IFEND}
+ {$ENDIF CONDITIONALEXPRESSIONS}
+
+ {$ENDIF LINUX}
+{$ENDIF}
+
+{ CPU }
+
+{$IFDEF FPC}
+ {$IFDEF MSWINDOWS}
+ {$IFDEF CPU64}
+ {$DEFINE WIN64}
+ {$ENDIF}
+ {$ENDIF}
+ {$IFDEF LINUX}
+ {$IFDEF CPU32}
+ {$DEFINE LINUX32}
+ {$ENDIF}
+ {$IFDEF CPU64}
+ {$DEFINE LINUX64}
+ {$ENDIF}
+ {$ENDIF}
+ {$IFDEF DARWIN}
+ {$IFDEF CPU32}
+ {$DEFINE DARWIN32}
+ {$ENDIF}
+ {$IFDEF CPU64}
+ {$DEFINE DARWIN64}
+ {$ENDIF}
+ {$ENDIF}
+{$ELSE}
+ {$DEFINE ENDIAN_LITTLE} // To have endianness symbol defined in Delphi too
+{$ENDIF}
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fCustomIDEMessagesForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fCustomIDEMessagesForm.dcu
new file mode 100644
index 0000000..05de43b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fCustomIDEMessagesForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fDispatchersEditorForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fDispatchersEditorForm.dcu
new file mode 100644
index 0000000..4b491d9
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fDispatchersEditorForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fNewProjectForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fNewProjectForm.dcu
new file mode 100644
index 0000000..ff36229
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fNewProjectForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fROAbout.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fROAbout.dcu
new file mode 100644
index 0000000..9cbcf40
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fROAbout.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fROServerClassForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fROServerClassForm.dcu
new file mode 100644
index 0000000..62c2402
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fROServerClassForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fServerProjectOptions.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fServerProjectOptions.dcu
new file mode 100644
index 0000000..34e06b7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/fServerProjectOptions.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/httpsend.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/httpsend.dcu
new file mode 100644
index 0000000..da7b14a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/httpsend.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/ldapsend.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/ldapsend.dcu
new file mode 100644
index 0000000..c16bb01
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/ldapsend.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synacode.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synacode.dcu
new file mode 100644
index 0000000..3ad7056
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synacode.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synafpc.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synafpc.dcu
new file mode 100644
index 0000000..1835d79
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synafpc.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synaip.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synaip.dcu
new file mode 100644
index 0000000..416ed73
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synaip.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synautil.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synautil.dcu
new file mode 100644
index 0000000..c83e909
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synautil.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synsock.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synsock.dcu
new file mode 100644
index 0000000..374e488
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/synsock.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uIPAsyncHttpServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uIPAsyncHttpServer.dcu
new file mode 100644
index 0000000..d5cf93a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uIPAsyncHttpServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uIPAsyncSocket.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uIPAsyncSocket.dcu
new file mode 100644
index 0000000..1de0368
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uIPAsyncSocket.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uIPHttpHeaders.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uIPHttpHeaders.dcu
new file mode 100644
index 0000000..03c2a41
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uIPHttpHeaders.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsync.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsync.dcu
new file mode 100644
index 0000000..70fd76c
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsync.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsyncResponseStorage.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsyncResponseStorage.dcu
new file mode 100644
index 0000000..c54b68f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsyncResponseStorage.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsyncSCHelpers.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsyncSCHelpers.dcu
new file mode 100644
index 0000000..7ebbff1
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsyncSCHelpers.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsyncSuperTcpServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsyncSuperTcpServer.dcu
new file mode 100644
index 0000000..5ba5806
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROAsyncSuperTcpServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBPDXHTTPServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBPDXHTTPServer.dcu
new file mode 100644
index 0000000..03444f0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBPDXHTTPServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBPDXTCPServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBPDXTCPServer.dcu
new file mode 100644
index 0000000..fa67898
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBPDXTCPServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBaseSuperHttpChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBaseSuperHttpChannel.dcu
new file mode 100644
index 0000000..bda8c8e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBaseSuperHttpChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBaseSuperHttpServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBaseSuperHttpServer.dcu
new file mode 100644
index 0000000..28bbab5
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBaseSuperHttpServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBinMessage.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBinMessage.dcu
new file mode 100644
index 0000000..9ed08d8
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBinMessage.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBinaryHelpers.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBinaryHelpers.dcu
new file mode 100644
index 0000000..21e7a05
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBinaryHelpers.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBroadcastChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBroadcastChannel.dcu
new file mode 100644
index 0000000..f0a453b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBroadcastChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBroadcastServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBroadcastServer.dcu
new file mode 100644
index 0000000..d020b20
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROBroadcastServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCOMInit.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCOMInit.dcu
new file mode 100644
index 0000000..73e406a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCOMInit.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCipher.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCipher.dcu
new file mode 100644
index 0000000..d2672e9
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCipher.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCipher1.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCipher1.dcu
new file mode 100644
index 0000000..23058ce
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCipher1.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCiphers.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCiphers.dcu
new file mode 100644
index 0000000..4d4e05b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCiphers.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClassFactories.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClassFactories.dcu
new file mode 100644
index 0000000..a415928
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClassFactories.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClasses.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClasses.dcu
new file mode 100644
index 0000000..c4010d5
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClasses.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClient.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClient.dcu
new file mode 100644
index 0000000..27bc3ff
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClient.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClientIntf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClientIntf.dcu
new file mode 100644
index 0000000..1ee968c
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROClientIntf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROComboService.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROComboService.dcu
new file mode 100644
index 0000000..9f8a408
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROComboService.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCompression.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCompression.dcu
new file mode 100644
index 0000000..88c7963
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROCompression.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODBEventRepository.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODBEventRepository.dcu
new file mode 100644
index 0000000..255c494
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODBEventRepository.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODBSessionManager.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODBSessionManager.dcu
new file mode 100644
index 0000000..5aa46df
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODBSessionManager.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECConst.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECConst.dcu
new file mode 100644
index 0000000..c14843f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECConst.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECReg.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECReg.dcu
new file mode 100644
index 0000000..50c18ab
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECReg.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECReg.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECReg.res
new file mode 100644
index 0000000..915f25d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECReg.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECUtil.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECUtil.dcu
new file mode 100644
index 0000000..49f6e5f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODECUtil.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODL.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODL.dcu
new file mode 100644
index 0000000..6a88c29
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODL.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLAsyncConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLAsyncConverter.dcu
new file mode 100644
index 0000000..c244b5c
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLAsyncConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLConvertersUtils.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLConvertersUtils.dcu
new file mode 100644
index 0000000..7148ed1
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLConvertersUtils.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLCppConverters.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLCppConverters.dcu
new file mode 100644
index 0000000..baf4f9a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLCppConverters.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLDelphiConverters.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLDelphiConverters.dcu
new file mode 100644
index 0000000..e3d6b11
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLDelphiConverters.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLGenTools.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLGenTools.dcu
new file mode 100644
index 0000000..02af7fe
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLGenTools.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLImplConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLImplConverter.dcu
new file mode 100644
index 0000000..636b194
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLImplConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLIntfConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLIntfConverter.dcu
new file mode 100644
index 0000000..1ad449a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLIntfConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLInvkConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLInvkConverter.dcu
new file mode 100644
index 0000000..cc178e7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLInvkConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLLChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLLChannel.dcu
new file mode 100644
index 0000000..851a992
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLLChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLLHelpers.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLLHelpers.dcu
new file mode 100644
index 0000000..53ce875
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLLHelpers.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLLineStream.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLLineStream.dcu
new file mode 100644
index 0000000..98c7943
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLLineStream.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLSplitableConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLSplitableConverter.dcu
new file mode 100644
index 0000000..a27f291
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLSplitableConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLTemplateBasedConverter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLTemplateBasedConverter.dcu
new file mode 100644
index 0000000..8832b6d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLTemplateBasedConverter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLTemplateBasedConverterUtils.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLTemplateBasedConverterUtils.dcu
new file mode 100644
index 0000000..46b9a80
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLTemplateBasedConverterUtils.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascal.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascal.dcu
new file mode 100644
index 0000000..a1254bf
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascal.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalAsync.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalAsync.dcu
new file mode 100644
index 0000000..6cf4ec2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalAsync.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalImpl.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalImpl.dcu
new file mode 100644
index 0000000..02b8c1a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalImpl.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalIntf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalIntf.dcu
new file mode 100644
index 0000000..2c7a611
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalIntf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalInvk.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalInvk.dcu
new file mode 100644
index 0000000..37163d5
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToPascalInvk.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToWSDL.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToWSDL.dcu
new file mode 100644
index 0000000..424b450
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToWSDL.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToXML.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToXML.dcu
new file mode 100644
index 0000000..e7e4530
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODLToXML.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXHTTPHeaderTools.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXHTTPHeaderTools.dcu
new file mode 100644
index 0000000..11e0dd2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXHTTPHeaderTools.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXHTTPServerCore.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXHTTPServerCore.dcu
new file mode 100644
index 0000000..a8f2c6d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXHTTPServerCore.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXISAPI.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXISAPI.dcu
new file mode 100644
index 0000000..f9f6206
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXISAPI.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXISAPIFilter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXISAPIFilter.dcu
new file mode 100644
index 0000000..8fceed8
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXISAPIFilter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSecurity.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSecurity.dcu
new file mode 100644
index 0000000..46d8048
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSecurity.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXServerCore.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXServerCore.dcu
new file mode 100644
index 0000000..3e6328d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXServerCore.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSessionTracker.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSessionTracker.dcu
new file mode 100644
index 0000000..c23ecb2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSessionTracker.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSock.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSock.dcu
new file mode 100644
index 0000000..1fb1b2a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSock.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSockClient.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSockClient.dcu
new file mode 100644
index 0000000..824033b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSockClient.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSocket.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSocket.dcu
new file mode 100644
index 0000000..14f2486
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXSocket.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXString.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXString.dcu
new file mode 100644
index 0000000..ce01b94
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODXString.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapBaseAppServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapBaseAppServer.dcu
new file mode 100644
index 0000000..935a0c7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapBaseAppServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapConnection.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapConnection.dcu
new file mode 100644
index 0000000..7376f78
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapConnection.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapModule.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapModule.dcu
new file mode 100644
index 0000000..001fb37
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapModule.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapNewServerModuleWizard.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapNewServerModuleWizard.dcu
new file mode 100644
index 0000000..ccf54a3
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapNewServerModuleWizard.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapNewServerModuleWizard.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapNewServerModuleWizard.res
new file mode 100644
index 0000000..e3a9d19
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapNewServerModuleWizard.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapProviderManager.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapProviderManager.dcu
new file mode 100644
index 0000000..1c429cc
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapProviderManager.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapProviderPublisher.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapProviderPublisher.dcu
new file mode 100644
index 0000000..36705be
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapProviderPublisher.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapPublishedProvidersCollection.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapPublishedProvidersCollection.dcu
new file mode 100644
index 0000000..27d4ba1
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapPublishedProvidersCollection.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapRes.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapRes.dcu
new file mode 100644
index 0000000..0ba22c0
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnapRes.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnap_Async.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnap_Async.dcu
new file mode 100644
index 0000000..2045316
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnap_Async.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnap_Intf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnap_Intf.dcu
new file mode 100644
index 0000000..9a34a6d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnap_Intf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnap_Invk.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnap_Invk.dcu
new file mode 100644
index 0000000..9236e9d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODataSnap_Invk.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery.dcu
new file mode 100644
index 0000000..c407f4f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscoveryService_Impl.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscoveryService_Impl.dcu
new file mode 100644
index 0000000..7c66cee
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscoveryService_Impl.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery_Async.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery_Async.dcu
new file mode 100644
index 0000000..ef091b9
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery_Async.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery_Intf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery_Intf.dcu
new file mode 100644
index 0000000..bb7dddd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery_Intf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery_Invk.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery_Invk.dcu
new file mode 100644
index 0000000..23fe743
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODiscovery_Invk.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODynamicRequest.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODynamicRequest.dcu
new file mode 100644
index 0000000..9d981d3
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRODynamicRequest.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEncKeyPropEditor.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEncKeyPropEditor.dcu
new file mode 100644
index 0000000..68b48c2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEncKeyPropEditor.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEncryption.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEncryption.dcu
new file mode 100644
index 0000000..a8b0268
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEncryption.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEncryptionEnvelope.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEncryptionEnvelope.dcu
new file mode 100644
index 0000000..4a71941
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEncryptionEnvelope.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEndianness.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEndianness.dcu
new file mode 100644
index 0000000..53b5cbf
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEndianness.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEventRepository.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEventRepository.dcu
new file mode 100644
index 0000000..5777f76
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROEventRepository.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROExtraEditors.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROExtraEditors.dcu
new file mode 100644
index 0000000..ac593a7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROExtraEditors.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHCMngr.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHCMngr.dcu
new file mode 100644
index 0000000..333db62
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHCMngr.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHTTPDispatch.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHTTPDispatch.dcu
new file mode 100644
index 0000000..60e28ee
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHTTPDispatch.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHTTPTools.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHTTPTools.dcu
new file mode 100644
index 0000000..cb5f941
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHTTPTools.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHash.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHash.dcu
new file mode 100644
index 0000000..d341b6d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHash.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHtmlServerInfo.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHtmlServerInfo.dcu
new file mode 100644
index 0000000..6d85e4a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHtmlServerInfo.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHtmlServerInfo.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHtmlServerInfo.res
new file mode 100644
index 0000000..07f0364
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROHtmlServerInfo.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEData.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEData.dcu
new file mode 100644
index 0000000..3cd7616
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEData.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEEditors.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEEditors.dcu
new file mode 100644
index 0000000..630ea87
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEEditors.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEMenu.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEMenu.dcu
new file mode 100644
index 0000000..112a0e6
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEMenu.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEPrjWizard.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEPrjWizard.dcu
new file mode 100644
index 0000000..d404c7d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDEPrjWizard.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDETools.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDETools.dcu
new file mode 100644
index 0000000..1109da2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIDETools.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIdeOnly.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIdeOnly.dcu
new file mode 100644
index 0000000..29d259e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIdeOnly.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyEmail.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyEmail.dcu
new file mode 100644
index 0000000..2f1c041
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyEmail.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyEmailChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyEmailChannel.dcu
new file mode 100644
index 0000000..fcfa599
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyEmailChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyEmailServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyEmailServer.dcu
new file mode 100644
index 0000000..a7a8848
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyEmailServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyHTTPChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyHTTPChannel.dcu
new file mode 100644
index 0000000..ee02cee
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyHTTPChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyHTTPServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyHTTPServer.dcu
new file mode 100644
index 0000000..43b59af
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyHTTPServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndySuperHttpChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndySuperHttpChannel.dcu
new file mode 100644
index 0000000..aa49079
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndySuperHttpChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyTCPChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyTCPChannel.dcu
new file mode 100644
index 0000000..dc627ce
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyTCPChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyTCPServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyTCPServer.dcu
new file mode 100644
index 0000000..b73d654
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyTCPServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyUDPChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyUDPChannel.dcu
new file mode 100644
index 0000000..ae16245
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyUDPChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyUDPServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyUDPServer.dcu
new file mode 100644
index 0000000..0d01c96
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIndyUDPServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIpHttpServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIpHttpServer.dcu
new file mode 100644
index 0000000..424e412
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIpHttpServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIpSuperHttpServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIpSuperHttpServer.dcu
new file mode 100644
index 0000000..2aacf9d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIpSuperHttpServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIpTcpServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIpTcpServer.dcu
new file mode 100644
index 0000000..abbc4cc
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROIpTcpServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROJSONMessage.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROJSONMessage.dcu
new file mode 100644
index 0000000..712b2aa
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROJSONMessage.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROJSONParser.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROJSONParser.dcu
new file mode 100644
index 0000000..603af43
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROJSONParser.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLDAP.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLDAP.dcu
new file mode 100644
index 0000000..2add562
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLDAP.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLocalChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLocalChannel.dcu
new file mode 100644
index 0000000..a0c05ae
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLocalChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLocalServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLocalServer.dcu
new file mode 100644
index 0000000..3d18f40
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLocalServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLoginNeededForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLoginNeededForm.dcu
new file mode 100644
index 0000000..039e6c8
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROLoginNeededForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMSXML2_TLB.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMSXML2_TLB.dcu
new file mode 100644
index 0000000..f78787e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMSXML2_TLB.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMSXMLImpl.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMSXMLImpl.dcu
new file mode 100644
index 0000000..a548423
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMSXMLImpl.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMasterServerEventRepository.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMasterServerEventRepository.dcu
new file mode 100644
index 0000000..0d7bb74
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMasterServerEventRepository.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMasterServerSessionManager.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMasterServerSessionManager.dcu
new file mode 100644
index 0000000..1271afd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROMasterServerSessionManager.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRONamedPipeChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRONamedPipeChannel.dcu
new file mode 100644
index 0000000..7493199
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRONamedPipeChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRONamedPipeServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRONamedPipeServer.dcu
new file mode 100644
index 0000000..61cce8d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRONamedPipeServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROOlympiaEventRepository.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROOlympiaEventRepository.dcu
new file mode 100644
index 0000000..f11a67a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROOlympiaEventRepository.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROOlympiaSessionManager.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROOlympiaSessionManager.dcu
new file mode 100644
index 0000000..c1d627a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROOlympiaSessionManager.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROOpenXMLImpl.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROOpenXMLImpl.dcu
new file mode 100644
index 0000000..c3022bf
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROOpenXMLImpl.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPleaseWaitForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPleaseWaitForm.dcu
new file mode 100644
index 0000000..64feb25
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPleaseWaitForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPleaseWaitForm.dfm b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPleaseWaitForm.dfm
new file mode 100644
index 0000000..63d01db
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPleaseWaitForm.dfm
@@ -0,0 +1,103 @@
+object PleaseWaitForm: TPleaseWaitForm
+ Left = 336
+ Top = 344
+ BorderIcons = []
+ BorderStyle = bsDialog
+ Caption = 'RemObjects SDK'
+ ClientHeight = 41
+ ClientWidth = 542
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnHide = FormHide
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object lbl_Caption: TLabel
+ Left = 64
+ Top = 14
+ Width = 66
+ Height = 13
+ Caption = 'Please wait...'
+ end
+ object img_Logo: TImage
+ Left = 2
+ Top = 0
+ Width = 32
+ Height = 32
+ AutoSize = True
+ Center = True
+ Picture.Data = {
+ 07544269746D617080080000424D800800000000000036040000280000002000
+ 00002000000001000800010000004A040000C21E0000C21E0000000000000000
+ 000000000000000080000080000000808000800000008000800080800000C0C0
+ C000C0DCC000F0CAA6000000000001010100030303000606060005050F000808
+ 08000B0B0B000C0D0D000D0D0D00101010001212120014141400151515001717
+ 17001A1A1A001C1C1C001F1F1F0004042100161620001D1E2800181A2F000707
+ 370005053E00101037001B1D32001F202B002021210021212100242424002626
+ 2600292929002B2B2B002E2E2E0026283300282A3500282A3600303030003333
+ 3300323434003535350036383800383838003A3A3A003C3C3C003F3F3F000D0E
+ 4800171B4500151A4E00181D490010155D00151B5B00151B5C001D2141001D21
+ 42001C245D00262940002126480023294B0031374F00393C48003C3F4B002B33
+ 5900333952000404650005066F0008096A000E14660001017500090F75000404
+ 7800121F790015206E001E2C73001A287A00232F6C0029356800323B6100343E
+ 630024327000283776002E3D7B003E4141003E445B003A4675003D4977004141
+ 410042454500434545004444440046464600494949004B4B4B004A4C4C004E4E
+ 4E004144500043465200484B5700515151005052520053535300565656005858
+ 58005B5B5B005A5D5D005D5D5D005D5E5E00434C6D005B5E6700606060006262
+ 620062646400656565006767670068696900686A6A006B6B6B00616778007171
+ 710070727200727676007D7F7F0001018700010188000C188300000090000000
+ 9A0000029F000B1D970008199C00172A8A00182A89000F2091001D369B001F39
+ 9E000005A5000009AB000411A4000618A6000A1FA700000CB100000FB8000213
+ B400071EB1000216BA000012BE00132FAA000B24B1000C27B6001131BB00233F
+ AB00374A8D002A4094002E4395002D439600344A99002D46A3003851A7003C54
+ A8002443B8002F4DBC00485A950055669C0060688200566AA7000015C4000018
+ CA00001BD000001ED7000520C1000E33CB001538C200183BC300153BCE000022
+ DD00062FDE000028E900032FEA00123EE700002BF000002EF6000332F0000A3A
+ F2000F3EF3000032FC000336FE00073AFF000C3EFF00224ADD00385FDF003C62
+ DF001442F3001847F3001042FF001547FF001A4BFF001E4FFF00204AE8002853
+ E9002354FF002758FF002C5CFF003A63EA003E67EA003C68F4003161FF003565
+ FF003A69FF003F6EFF004A67C200496EE1004C72E1004570F5004974F5004372
+ FF007B8080007C81810080828200828484009095950093979700959B9B009CA1
+ A1009EA4A400A1A7A700A2A8A800A4A9A900A6ACAC00AEB5B500B0B6B600B1B8
+ B800B3BABA00B6BDBD00B7BEBE00BAC2C200BDC4C400C6CECE00F0FBFF00A4A0
+ A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF
+ FF000AF5000DEFE0612414131210246081EDF50009F5000008F50011E8661A19
+ 181716141312100F0D0C30E6F50107F5000006F50015F4712726251A19181716
+ 141312100F0D0C0B5BF3F59405F5000005F50017E93329282726251A3B919088
+ 8784491F0F0D0C0B11EAF50004F5000004F5000FE42F2E2A2928272625389591
+ 908887000287000883200D0C0B00E1F503F5000003F50011EB33312F2E2A2928
+ 27263D96959190888700038700074D0E0C0B00EAF51902F5000002F50013F162
+ 3433312F2E2A2928273E979695919088871A03870008861B0C0B11F3F5F50000
+ 02F500147836353433312F2E2A2928273E3D224C9190888703870007860E0C0B
+ 5BF5F5F500000017F5EC625F36353433312F2E2A29282726251D959190888720
+ 038700064D0D0C0BE6F500000018F57C63625F36353433312F2E2A2928272685
+ 96959190888703870005200D0C30F50000000019F2656463625F57B4BE9E472F
+ 2E2A292851AE9A9695919088871B02870005830F0D0CEDF50000001AE5676564
+ 6368C0C3C2C1B8312F2E2A2940AFAE9A969591908887028700041F0F0D810000
+ 0020806B6765645DCAC4C3C2C155312F2E2A2C8DAFAE9A96959190374F874910
+ 0F3200000020736D6B67655ECBCAC4C3C24833312F2E2A292BAF933C92954E17
+ 218784121015000000206F6E6D6B6765C5CBCAC4B5353433312F2E2A41B05026
+ 23391E181C4B4A13121000000020706F6E6D6B676AA4A5A35F3635343331548B
+ 9CB1942726251A191817161413120000002072706F6E6D6B67656463625F3635
+ 3444BCB98C9C43282726251A191817161413000000207672706F6E6D6B676564
+ 63625F363559BD9B2F2E2A29282726251A1918171614000000207B7672706F6E
+ 6D6B67656463625F3635B3BA582F2E2A2942898A3A1A19181724000000208277
+ 7672706F6E6D6B676564695C5F368FC1BA312F2E2AB2B0AF99231A1918610000
+ 0020E779777672706F6E6D6B6774CECBA8A1C3C28E33312F2EB7B1B0AF3F251A
+ 19E000000020F37A79777675D5D7AA6D6BA6CDCCCBCAC45A353433312F9DB7B1
+ 982726251AEF00000020F5E27A7977DBD9D8D36E6DA7D0CDCCCBCA9F46353433
+ 312F52532D28272666F500000020F5EE7B7A79DCDFD9D8C7C6D2D1D0CDCCCBCA
+ C4B6353433312F2E2A292827E8F5000002F5001EE37B7A7EDEDFD9D8D7D6D2D1
+ D0CDCCCBCABB36353433312F2E2A296CF5F5000002F5001EF37F7B7AACDEDFD9
+ D8D7D6D2D1D0CDCCCBA25F46453433312F2E33F0F5F5000003F5001BEE7D7B7A
+ 7EDCDFD9D8D7D6D2D1D0CDCCC9A2C0BF563433312FE9F52802F5000004F50019
+ EB7D7B7A79ADDDD9D8D7D6D2D1D0CDCCCBC8A136353433E4F52E03F5000005F5
+ 0017EE7F7B7A7977ABDAD4D7D6D2D1CFA9A063625F3662EBF53504F5000006F5
+ 0015F3E37B7A79777672706F6E6D6B676564636278F1F50005F5000008F50011
+ EEE27A79777672706F6E6D6B67657CECF52E07F500000AF5000DF3E7827B7672
+ 706F7380E5F2F5D209F50001}
+ Transparent = True
+ end
+end
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPostMessage.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPostMessage.dcu
new file mode 100644
index 0000000..37aadb4
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPostMessage.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPoweredByRemObjectsButton.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPoweredByRemObjectsButton.dcu
new file mode 100644
index 0000000..95f386e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPoweredByRemObjectsButton.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPoweredByRemObjectsButton.res b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPoweredByRemObjectsButton.res
new file mode 100644
index 0000000..774c2b2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROPoweredByRemObjectsButton.res differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROProductVersionInfo.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROProductVersionInfo.dcu
new file mode 100644
index 0000000..c09db4e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROProductVersionInfo.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROProductVersionInfoForm.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROProductVersionInfoForm.dcu
new file mode 100644
index 0000000..b6a15f2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROProductVersionInfoForm.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROProductVersionInfo_Intf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROProductVersionInfo_Intf.dcu
new file mode 100644
index 0000000..bf9b82f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROProductVersionInfo_Intf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORFC1760.RES b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORFC1760.RES
new file mode 100644
index 0000000..b5f037b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORFC1760.RES differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORFC2289.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORFC2289.dcu
new file mode 100644
index 0000000..26da531
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORFC2289.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORODLNotifier.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORODLNotifier.dcu
new file mode 100644
index 0000000..b715dee
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORODLNotifier.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORemoteDataModule.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORemoteDataModule.dcu
new file mode 100644
index 0000000..abe55f5
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORemoteDataModule.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORemoteService.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORemoteService.dcu
new file mode 100644
index 0000000..f1f5bc1
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORemoteService.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORes.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORes.dcu
new file mode 100644
index 0000000..78c1968
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORes.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROResWriter.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROResWriter.dcu
new file mode 100644
index 0000000..c418803
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROResWriter.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORng.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORng.dcu
new file mode 100644
index 0000000..aa81305
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uRORng.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSCHelpers.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSCHelpers.dcu
new file mode 100644
index 0000000..7a4180b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSCHelpers.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSOAPMessage.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSOAPMessage.dcu
new file mode 100644
index 0000000..5111aff
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSOAPMessage.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSerializer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSerializer.dcu
new file mode 100644
index 0000000..98b2530
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSerializer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROServer.dcu
new file mode 100644
index 0000000..f6aa705
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROServerIntf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROServerIntf.dcu
new file mode 100644
index 0000000..839835d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROServerIntf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROServerMultiMessage.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROServerMultiMessage.dcu
new file mode 100644
index 0000000..aa0f9da
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROServerMultiMessage.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSessions.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSessions.dcu
new file mode 100644
index 0000000..b02ddac
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSessions.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROStreamSerializer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROStreamSerializer.dcu
new file mode 100644
index 0000000..31a96d6
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROStreamSerializer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROStreamUtils.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROStreamUtils.dcu
new file mode 100644
index 0000000..f2024d3
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROStreamUtils.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSuperTCPChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSuperTCPChannel.dcu
new file mode 100644
index 0000000..89f18ea
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSuperTCPChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSuperTCPServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSuperTCPServer.dcu
new file mode 100644
index 0000000..57328ff
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSuperTCPServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseHTTPChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseHTTPChannel.dcu
new file mode 100644
index 0000000..5dae955
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseHTTPChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSCHelpers.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSCHelpers.dcu
new file mode 100644
index 0000000..af99e8b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSCHelpers.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseServerSocket.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseServerSocket.dcu
new file mode 100644
index 0000000..fc032d9
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseServerSocket.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSuperHttpChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSuperHttpChannel.dcu
new file mode 100644
index 0000000..87d7edc
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSuperHttpChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSuperTCPCHannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSuperTCPCHannel.dcu
new file mode 100644
index 0000000..859546b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSuperTCPCHannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSuperTCPServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSuperTCPServer.dcu
new file mode 100644
index 0000000..c309e3e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROSynapseSuperTCPServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROThread.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROThread.dcu
new file mode 100644
index 0000000..7ef69e6
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROThread.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROThreadPool.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROThreadPool.dcu
new file mode 100644
index 0000000..eb262b3
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROThreadPool.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROTypes.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROTypes.dcu
new file mode 100644
index 0000000..6ccd7c8
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROTypes.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROUnicodeConv.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROUnicodeConv.dcu
new file mode 100644
index 0000000..7ee07a7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROUnicodeConv.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWebBrokerServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWebBrokerServer.dcu
new file mode 100644
index 0000000..501db5d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWebBrokerServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWinInetHttpChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWinInetHttpChannel.dcu
new file mode 100644
index 0000000..0faa494
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWinInetHttpChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWinMessageChannel.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWinMessageChannel.dcu
new file mode 100644
index 0000000..4cc768d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWinMessageChannel.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWinMessageServer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWinMessageServer.dcu
new file mode 100644
index 0000000..5006b0d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROWinMessageServer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXDOM_2_3.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXDOM_2_3.dcu
new file mode 100644
index 0000000..2b24a46
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXDOM_2_3.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXMLIntf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXMLIntf.dcu
new file mode 100644
index 0000000..3bd1f16
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXMLIntf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXMLSerializer.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXMLSerializer.dcu
new file mode 100644
index 0000000..adbdfdd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXMLSerializer.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXmlRpcMessage.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXmlRpcMessage.dcu
new file mode 100644
index 0000000..3c5e045
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROXmlRpcMessage.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZLib.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZLib.dcu
new file mode 100644
index 0000000..bf23b9b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZLib.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConf.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConf.dcu
new file mode 100644
index 0000000..b0affae
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConf.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConfHub.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConfHub.dcu
new file mode 100644
index 0000000..2179909
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConfHub.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConfHubSynapse.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConfHubSynapse.dcu
new file mode 100644
index 0000000..a678900
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConfHubSynapse.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConfStreamWorker.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConfStreamWorker.dcu
new file mode 100644
index 0000000..4886601
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROZeroConfStreamWorker.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROmDNS.dcu b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROmDNS.dcu
new file mode 100644
index 0000000..88590c7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D11/uROmDNS.dcu differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_BPDX_D12.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_BPDX_D12.bpl
new file mode 100644
index 0000000..4af65b6
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_BPDX_D12.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_BPDX_D12.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_BPDX_D12.dcp
new file mode 100644
index 0000000..7c5db67
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_BPDX_D12.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Core_D12.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Core_D12.bpl
new file mode 100644
index 0000000..2b930cf
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Core_D12.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Core_D12.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Core_D12.dcp
new file mode 100644
index 0000000..d02a4ff
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Core_D12.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_DataSnap_D12.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_DataSnap_D12.bpl
new file mode 100644
index 0000000..5e445cd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_DataSnap_D12.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_DataSnap_D12.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_DataSnap_D12.dcp
new file mode 100644
index 0000000..a804df7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_DataSnap_D12.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_IDE_D12.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_IDE_D12.bpl
new file mode 100644
index 0000000..eac88c1
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_IDE_D12.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_IDE_D12.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_IDE_D12.dcp
new file mode 100644
index 0000000..4cea735
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_IDE_D12.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Indy_D12.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Indy_D12.bpl
new file mode 100644
index 0000000..3f973e7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Indy_D12.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Indy_D12.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Indy_D12.dcp
new file mode 100644
index 0000000..046ccd2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Indy_D12.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_RODX_D12.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_RODX_D12.bpl
new file mode 100644
index 0000000..3c74696
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_RODX_D12.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_RODX_D12.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_RODX_D12.dcp
new file mode 100644
index 0000000..92de0d6
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_RODX_D12.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Synapse_D12.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Synapse_D12.bpl
new file mode 100644
index 0000000..c2e7bbd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Synapse_D12.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Synapse_D12.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Synapse_D12.dcp
new file mode 100644
index 0000000..cf95aaa
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_Synapse_D12.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_WebBroker_D12.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_WebBroker_D12.bpl
new file mode 100644
index 0000000..b77537a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_WebBroker_D12.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_WebBroker_D12.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_WebBroker_D12.dcp
new file mode 100644
index 0000000..bf3873f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D12/RemObjects_WebBroker_D12.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_BPDX_D14.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_BPDX_D14.bpl
new file mode 100644
index 0000000..dd30017
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_BPDX_D14.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_BPDX_D14.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_BPDX_D14.dcp
new file mode 100644
index 0000000..92d2054
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_BPDX_D14.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Core_D14.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Core_D14.bpl
new file mode 100644
index 0000000..cb46a53
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Core_D14.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Core_D14.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Core_D14.dcp
new file mode 100644
index 0000000..3054181
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Core_D14.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_DataSnap_D14.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_DataSnap_D14.bpl
new file mode 100644
index 0000000..cc2839a
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_DataSnap_D14.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_DataSnap_D14.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_DataSnap_D14.dcp
new file mode 100644
index 0000000..9be477b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_DataSnap_D14.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_IDE_D14.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_IDE_D14.bpl
new file mode 100644
index 0000000..add1805
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_IDE_D14.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_IDE_D14.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_IDE_D14.dcp
new file mode 100644
index 0000000..423b50d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_IDE_D14.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Indy_D14.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Indy_D14.bpl
new file mode 100644
index 0000000..f68e49d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Indy_D14.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Indy_D14.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Indy_D14.dcp
new file mode 100644
index 0000000..6cb9e3d
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Indy_D14.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_RODX_D14.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_RODX_D14.bpl
new file mode 100644
index 0000000..3653983
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_RODX_D14.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_RODX_D14.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_RODX_D14.dcp
new file mode 100644
index 0000000..ab1d90f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_RODX_D14.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Synapse_D14.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Synapse_D14.bpl
new file mode 100644
index 0000000..2d3f8dd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Synapse_D14.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Synapse_D14.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Synapse_D14.dcp
new file mode 100644
index 0000000..cb0c850
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_Synapse_D14.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_WebBroker_D14.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_WebBroker_D14.bpl
new file mode 100644
index 0000000..389efbc
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_WebBroker_D14.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_WebBroker_D14.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_WebBroker_D14.dcp
new file mode 100644
index 0000000..b567658
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D14/RemObjects_WebBroker_D14.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_BPDX_D7.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_BPDX_D7.bpl
new file mode 100644
index 0000000..fffd1c8
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_BPDX_D7.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_BPDX_D7.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_BPDX_D7.dcp
new file mode 100644
index 0000000..45c5233
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_BPDX_D7.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Core_D7.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Core_D7.bpl
new file mode 100644
index 0000000..e9c5189
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Core_D7.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Core_D7.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Core_D7.dcp
new file mode 100644
index 0000000..2df54fd
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Core_D7.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_DataSnap_D7.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_DataSnap_D7.bpl
new file mode 100644
index 0000000..b069df3
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_DataSnap_D7.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_DataSnap_D7.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_DataSnap_D7.dcp
new file mode 100644
index 0000000..62209a7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_DataSnap_D7.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_IDE_D7.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_IDE_D7.bpl
new file mode 100644
index 0000000..dacb554
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_IDE_D7.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_IDE_D7.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_IDE_D7.dcp
new file mode 100644
index 0000000..c602c27
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_IDE_D7.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Indy_D7.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Indy_D7.bpl
new file mode 100644
index 0000000..56588c7
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Indy_D7.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Indy_D7.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Indy_D7.dcp
new file mode 100644
index 0000000..06d7a1f
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Indy_D7.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_RODX_D7.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_RODX_D7.bpl
new file mode 100644
index 0000000..78a44f3
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_RODX_D7.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_RODX_D7.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_RODX_D7.dcp
new file mode 100644
index 0000000..372093c
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_RODX_D7.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Synapse_D7.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Synapse_D7.bpl
new file mode 100644
index 0000000..84add88
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Synapse_D7.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Synapse_D7.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Synapse_D7.dcp
new file mode 100644
index 0000000..e3f641e
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_Synapse_D7.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_WebBroker_D7.bpl b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_WebBroker_D7.bpl
new file mode 100644
index 0000000..9a01b5b
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_WebBroker_D7.bpl differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_WebBroker_D7.dcp b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_WebBroker_D7.dcp
new file mode 100644
index 0000000..073b3b3
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Dcu/D7/RemObjects_WebBroker_D7.dcp differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/changelog.png b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/changelog.png
new file mode 100644
index 0000000..0e19bbc
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/changelog.png differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/iphone-xcode.png b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/iphone-xcode.png
new file mode 100644
index 0000000..9b8f26c
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/iphone-xcode.png differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/rodelphi.png b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/rodelphi.png
new file mode 100644
index 0000000..c05e13c
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/rodelphi.png differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/wiki.png b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/wiki.png
new file mode 100644
index 0000000..a626fe1
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Help/wiki.png differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Launch.exe b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Launch.exe
new file mode 100644
index 0000000..4b346d2
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Launch.exe differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/License.txt b/internal/6.0.43.801/1/RemObjects SDK for Delphi/License.txt
new file mode 100644
index 0000000..9b07198
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/License.txt
@@ -0,0 +1,85 @@
+*** REMOBJECTS SOFTWARE END USER LICENSE AGREEMENT ***
+
+Updated January 8, 2009
+
+IMPORTANT: PLEASE READ THIS DOCUMENT CAREFULLY AND IN ITS ENTIRETY BEFORE USING ANY SOFTWARE PRODUCT ACQUIRED FROM REMOBJECTS SOFTWARE.
+
+This document constitutes a LEGAL AGREEMENT between you, the End User (either an individual or an entity), and RemObjects Software, LLC.
+
+
+1. SCOPE
+
+This End User License Agreement ("EULA") covers all SOFTWARE PRODUCTS produced and sold by RemObjects Software, LLC. The sections of this EULA that contain information that pertain specifically to a certain product are properly marked as such.
+
+SOFTWARE PRODUCTS covered this EULA:
+
+* RemObjects AnyDAC
+* RemObjects Data Abstract
+* RemObjects DebugServer
+* RemObjects Developer Studio
+* RemObjects Everwood
+* RemObjects Internet Pack
+* RemObjects Hydra
+* RemObjects Oxygene
+* RemObjects Pascal Script
+* RemObjects SDK
+
+
+2. DEFINITIONS
+
+SOFTWARE PRODUCTS: refers to one or more product as made available as a unified installation package.
+
+(LIBRARY) SOURCE CODE: refers to the source code shipped with any of the SOFTWARE PRODUCTS licensed to you, the End User, in the “Source” folder of the product installation.
+
+TOOLS: refers to ANY of the applications deployed with the SOFTWARE PRODUCTS in executable form, whether as auxiliary helper programs of a Library product or as main product. This includes but is not limited to any .EXE files and IDE integration.
+
+SAMPLE CODE: sample code is provided to you as part of the SOFTWARE PRODUCT license inside the “Samples” folder
+
+EXECUTABLE FORMAT refers to executable files such as .EXE and .DLL files build from your own source code, linking in code provided as part of the LIBRARY SOURCE CODE. It does not encompass Delphi .DCU or .BPL/.DCP files or any other format that would allow a third party to the provided file as a replacement for the LIBRARY SOURCE CODE
+
+
+3. COPYRIGHT
+
+This SOFTWARE PRODUCT is owned by RemObjects Software, LLC and is protected by copyright laws and international copyright treaties.
+
+All copyrights of this SOFTWARE PRODUCT, including but not limited to any source code, tools, documentation, images, text, and samples incorporated into the SOFTWARE PRODUCT, as well as those provided via Support Services or any of the RemObjects websites, are proprietary products of RemObjects Software, LLC and are protected by copyright law. You acquire only the right to use the SOFTWARE PRODUCT and do not acquire any rights of ownership. You acknowledge that the SOFTWARE PRODUCT and its source code remains a confidential trade secret of RemObjects Software, LLC. RemObjects Software, LLC may have trademarks, copyrights, patents or other intellectual property rights covering the SOFTWARE PRODUCT. You are not granted any license to these patents, trademarks, copyrights, or other intellectual property rights except as expressly provided herein. RemObjects Software, LLC reserves all rights not expressly granted.
+
+All names and logos of the SOFTWARE PRODUCTS defined in the SCOPE section of this EULA are trademarks or registered trademarks of RemObjects Software, LLC. These names and logos may only be used by the End User when referring to RemObjects Software, LLC or any of its products. These names and logos may not be used by the End User for branding or marketing purposes, without written consent from RemObjects Software, LLC.
+
+
+2. GRANT OF LICENSE
+
+BY INSTALLING, COPYING, OR OTHERWISE USING THE SOFTWARE PRODUCT, YOU AGREE TO BE BOUND BY ALL OF THE TERMS AND CONDITIONS OF THIS END USER LICENSE AGREEMENT. IF YOU DO NOT AGREE TO THE TERMS OF THIS AGREEMENT, YOU ARE NOT PERMITTED TO INSTALL, COPY, OR USE THE SOFTWARE PRODUCT. IF YOU REJECT THE TERMS OF THIS AGREEMENT WITHIN THIRTY (30) DAYS AFTER PURCHASING THE SOFTWARE PRODUCT, YOU MAY SEND AN EMAIL TO sales@remobjects.com AND REQUEST A FULL REFUND OF THE PURCHASE PRICE. IN ORDER TO RECEIVE THE REFUND, YOU MUST IRREVOCABLY UNINSTALL AND/OR DELETE ANY AND ALL COPIES OF THE SOFTWARE PRODUCT(S) YOU HAVE PURCHASED, AND PROVIDE CERTIFICATION OF SUCH TO REMOBJECTS.
+You may make one copy of the SOFTWARE PRODUCT solely for backup or archival purposes or transfer the SOFTWARE PRODUCT to a single hard disk provided you keep the original solely for backup or archival purposes.
+
+You may install the software on up to five computers, providing you are the only person using the software on these computers.
+
+You may not alter any of the programs or accompanying files without written permission from RemObjects Software, LLC. Any resale or commercial distribution of the SOFTWARE PRODUCT is strictly prohibited, unless RemObjects Software, LLC has given explicit written permission.
+
+You are not obtaining title to the SOFTWARE PRODUCT or any copyrights. You may not sublicense, rent, lease, convey, modify, translate, convert to another programming language, decompile, or disassemble the SOFTWARE PRODUCT for any purpose. RemObjects Software, LLC grants you as an individual, a personal, non exclusive license to install and use the SOFTWARE PRODUCT for the sole purpose of developing systems that are not in competition with the SOFTWARE PRODUCT, or any other products developed and sold by RemObjects Software, LLC.
+
+If you are an entity, RemObjects Software, LLC grants you the right to designate one individual within your organization to have the right to use the SOFTWARE PRODUCT in the manner described above.
+The named License you acquired is not transferrable to another individual or entity, unless you are given written permission by RemObjects Software, LLC.
+
+You may link against the LIBRARY SOURCE CODE and deploy it in EXECUTABLE FORMAT as part of your application; you may make changes to the LIBRARY SOURCE CODE and write extensions for your own use, and link against and deploy your changes in EXECUTABLE FORMAT. You may NOT deploy RemObjects Software’s source code to anyone.
+SAMPLE CODE for provided for your convenience and you may use it at your discretion. You may create your own products starting from the samples provided and consider this derived work as your own. You may also deploy such derived work in any way you see fit, including in source code form.
+
+Unless specifically stated on a per-tool basis, you may not deploy the TOOLS included with the SOFTWARE PRODUCT to anyone, neither standalone or as part of your own application; the tools are intended solely for use by yourself.
+In general, you may not distribute any part of the installed product, nor any license codes, license files or your website login to third parties.
+
+
+3. SUPPORT SERVICES
+
+RemObjects Software, LLC may provide the End User with Support Services related to the SOFTWARE PRODUCT. Support Services include free downloading of upgrades as covered by the original purchase, as well as technical support offered via NNTP-based newsgroups, e-mail or telephone. Use of Support Services is governed by RemObjects Software policies and programs described on the RemObjects website (www.remobjects.com/support) and may be subject to additional support charges depending on the type and level of support provided. Any supplemental software code provided to you as part of the Support Services shall be considered part of the SOFTWARE PRODUCT and is subject to the terms and conditions of this EULA.
+
+
+4. TERMINATION
+
+This License shall remain in effect only for so long as you are in compliance with the terms and conditions of this EULA. This License will terminate if you fail to comply with any of its terms or conditions. You may terminate it at any time by destroying your copies of the SOFTWARE PRODUCT. You agree, upon termination, to destroy all copies of the Product. Without prejudice to any other rights, RemObjects Software, LLC may terminate this EULA if you fail to comply with the terms. The provisions of this EULA that protect the proprietary rights of RemObjects Software, LLC and the LIMITATIONS OF WARRANTIES will continue to be in force even after any termination. Upon termination, RemObjects Software, LLC may also enforce any rights provided by law.
+
+
+5. LIMITATIONS OF WARRANTIES AND LIABILITY
+
+THIS SOFTWARE PRODUCT IS PROVIDED TO YOU "AS IS" WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE APPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. YOU ASSUME THE ENTIRE RISK AS TO THE ACCURACY AND THE USE OF THE SOFTWARE PRODUCT AND ALL OTHER RISK ARISING FROMTHE USE OR PERFORMANCE OF THIS SOFTWARE PRODUCT AND DOCUMENTATION.
+
+RemObjects Software, LLC SHALL NOT BE LIABLE FOR ANY DAMAGES WHATSOEVER ARISING FROM USE OF OR INABILITY TO USE THIS SOFTWARE PRODUCT, EVEN IF RemObjects Software, LLC HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL RemObjects Software, LLC BE LIABLE FOR ANY CONSEQUENTIAL, INCIDENTAL, DIRECT, INDIRECT, SPECIAL, PUNITIVE, OR OTHER DAMAGES WHATSOEVER, INCLUDING BUT NOT LIMITED TO DAMAGES OR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS, EVEN IF RemObjects Software, LLC HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME STATES/JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY.
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/README.html b/internal/6.0.43.801/1/RemObjects SDK for Delphi/README.html
new file mode 100644
index 0000000..b3d6516
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/README.html
@@ -0,0 +1,347 @@
+
+
+
+RemObjects SDK - README - RemObjects Software
+
+
+
+
+
+
+
+
+
+
+
+
+Thank You for Your Interest in our Products and for Choosing RemObjects SDK for Delphi .
+
+
+Our goal with RemObjects SDK (or “RO” as we call it for short) is to provide you with a powerful and
+flexible framework to build your application solutions upon.
+
+
+RemObjects SDK is not standing still. We will continue to improve the product over time and these improvements
+will be available to you as part of your subscription. To ensure continued access to the latest release and to
+stay up to date with the most recent fixes and new features, please make sure that your subscription stays active.
+
+
+Please check our website regularly, to keep your product up to date with the latest additions.
+
+
+
+
+
+
+Find Out What's New
+
+
+The Winter 2009 release of
+RemObjects SDK
+continues to focus mainly on quality and bugfixing, but also contain a few new features and enhancements.
+Check out our What's New page for a detailed overview look of all what's new.
+Or visit the Change Logs to get a more detailed list
+of all changes, including features, minor enhanceents and bug-fixes.
+
+
+
+Delve into the Documentation
+
+
+Our documentation wiki at wiki.remobjects.com also
+continues to be a rich and growing source of information, providing introductory texts about different concepts in
+RemObjects SDK, articles and how-tos, as well as thorough class reference help.
+
+
+The Wiki is community driven, allowing you and all other RemObjects SDK customers to participate and contribute content, as well.
+
+
+
+
+New : Build Native Mac and iPhone apps with RemObjects SDK for OS X
+
+
+The RemObjects SDK product family is growing, as we're adding a third fully native edition to the product suite, designed specifically
+for building native client applications for Macintosh computers and iPhone and iPod touch devices using Cocoa and Xcode.
+
+
+
+Leverage your existing investment into RemObjects SDK by exposing your existing servers to new clients written for these two exciting
+platforms, for example to deliver a first-class mobile front-end for your RO based enterprise application.
+
+
+RemObjects SDK for OS X is shipping now, as is its big brother Data Abstract for OS X .
+Please check our Shop for purchasing options, or contact our
+sales team if you have any further questions.
+
+
+
+
+
+Some More Technical Information
+
+The remainder of the README provides some more general information and a few guidelines that you should
+follow in order to install and get started with RemObjects SDK.
+
+
+
Software Requirements
+
+RemObjects SDK for Delphi supports versions 7, 2007, 2009 and 2010 of Delphi, for 32-bit Windows Development.
+Support is also provided for current releases of Free Pascal 2.2 and later, for both 32-bit and 64-bit Windows and Linux development.
+
+
+The Fall 2009 release drops precompiled support for Delphi 6 and Delphi 2006, although package source files are still provided, if
+you need to manually install RemObjects SDK in these versions of Delphi. These two versions are no longer officially supported.
+
+
+While Delphi 7 is still officially supported, we strognly recommend our customers to move to Delphi 2007 or later.
+
+
TRIAL Version Requirements
+
+The following requirements must be met for the trial version:
+
+
+Delphi 2010 : No Update Pack required.
+Delphi 2009 : Update Pack 1 is not essential, but strongly recommended.
+Delphi 2007 : Update Pack 3 is required.
+Delphi 7 : No Update Pack required.
+
+
+Using Indy-based components with the TRIAL edition requires the original version of Indy that was installed with your edition of Delphi.
+If you have upgraded to a different Indy version, there should still be enough alternative channels for you to evaluate RemObjects SDK
+without relying on Indy.
+
+
+Please note that these requirements are for the TRIAL version only. Since the retail version comes with full source code,
+you can easily rebuild it to match the version of Delphi that you are using. Simply open the
+BuildPackages_Dx.bpg project group and do a 'Build All Projects'.
+
+Component Installation
+
+RemObjects SDK comes as several individual packages, provided in precompiled versions for Delphi 7, 2007, 2009 and 2010.
+Setup will install automatically install these packages with the supported IDEs
+
+The Indy packages are built to work with the default versions of Indy that come with
+Delphi 7 (Indy 9), 2007 (Indy 10) or 2009 and 2010 (Indy 10.2.3). If you have a custom version,
+then the RemObjects SDK Indy package will most likely fail to load when yoiu first start the Delphi IDE.
+
+
+If this is the case you will need to adjust the RemObjects.inc file as described below, and then rebuild the RemObjects_Indy
+package manually to match your specific version. You can accomplish this by opening the RemObjects_Indy_D7.dpk (or D10-D14) in
+the IDE and then building and installing it.
+
+
+Alternatively, you can of course choose to not load the RemObjects SDK Indy components, and instead rely on the other channels we provide.
+
+Free Pascal (FPC)
+
+The current release of RemObjects SDK for Delphi provides library support for Free Pascal 2.2.2 and above, allowing you to rebuild your
+projects for the Win32 (x86), Win64 (x64), Linux (x86 and x64) platforms. Compilation against other platforms provided by FPC might be possible,
+but is not currently supported; however, we are interested in your feedback if you do try to build against other platforms.
+
+
+Official support for other platforms, as well as support for the Lazarus IDE, is under review for future releases.
+
+
+The minimum version of FPC required is Free Pascal 2.2.2 or newer (which can be downloaded here ).
+Please note that we explicitly do not support the 2.0.x release, as it is missing crucial functionality.
+
+
+More information about Free Pascal can be found on the FPC homepage at http://www.freepascal.org .
+
+Limitations of Free Pascal Support
+
+Not all client and server channels provided with RemObjects SDK are supported for Free Pascal or for all four platforms available through
+Free Pascal.
+
+
+
+For obvious reasons, the WinINet HTTP Channel is not supported for Linux but will function under the Win32 and Win64 targets; the same
+holds true for the Named Pipe client and server channels.
+
+
+Indy support for FPC is experimental, and as such the Indy based channels are only experimentally supported for FPC.
+
+
+Support for FPC requires full source, and so is not available in the TRIAL version of RemObjects SDK.
+
+
+
+
License File
+
+To avoid piracy and abuse, the RemObjects SDK install contains a time-limited license for tools auch as Schema Modeler and Service Builder, as
+well as the pre-compiled component libraries. This license file will expire after 30 days of use.
+
+
+You will be prompted about this trial period and offered an option to download your personal license file when you start the tools
+for the first time, or when you build your application using RemObjects SDK
+components. You can
+choose to either download your own license file right away, or keep working with the trial license until such a time
+when the download is more convenient for you. Alternatively, it's possible to download it directly
+from my.remobjects.com .
+
+
+Please note that applications built with the trial license will be marked as such and display the trial notification
+dialog on startup. Download your personal license when prompted, in order to build your applications without this limitation.
+
+
+Sample Projects
+
+A number of sample projects are included in the RemObjects Samples folder of your Shared Documents folder.
+A detailed introduction to the available samples can be found in the wiki .
+
+
+After the first start of your development IDE, the Welcome Page
+for RemObjects SDK will be presented, giving you the option to directly open any of the sample client applications.
+The matching server application comes pre-compiled with RemObjects SDK for Delphi and can be launched from the Start Menu.
+
+
+Please Note: Samples have been moved from underneath the product install to the Shared Documents folder, to make them more
+easily usable on Windows Vista and Windows 7, where the Program Files folder is read-only during normal operation.
+
+Support
+
+Support for RemObjects SDK is available via our newsgroups at
+remobjects.public.sdk.delphi .
+
+
+You can use these newsgroups to report any problems or suggestions you might have in regards to RemObjects SDK, you can communicate
+with fellow RemObjects SDK users and exchange ideas and solutions. More information about our support offerings, including the
+Premium Support subscription, can be found at remobjects.com/support .
+
+
+
+Known Issues in this Release of RemObjects SDK
+
+
+While we try our best to get all known issues fixed and addressed for each build, sometimes less important issues need to be
+deferred for later releases in favor of getting a version released at all (perfect is the enemy of shipping, after all).
+Please check our list of known issues for any crucial known problems with
+the current release.
+
+
+
+Thank You
+
+Let us thank you again for choosing RemObjects SDK. We are confident that you
+will find it to be a worthwhile addition to your development toolset.
+
+
+Should you, at any time, encounter a problem or need assistance using RemObjects SDK, please feel free to ask on the newsgroups
+or contact us directly via email at support@remobjects.com .
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Samples.lnk b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Samples.lnk
new file mode 100644
index 0000000..747bac1
Binary files /dev/null and b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Samples.lnk differ
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D10.bdsgroup b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D10.bdsgroup
new file mode 100644
index 0000000..8ac831f
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D10.bdsgroup
@@ -0,0 +1,41 @@
+
+
+
+
+ Default.Personality
+
+ 1.0
+ {CDD70F62-05F7-4112-A8A7-9904A7180AAE}
+
+
+
+
+ RemObjects_Core_D10.bdsproj
+ IDE\RemObjects_IDE_D10.bdsproj
+ RemObjects_WebBroker_D10.bdsproj
+ RemObjects_Indy_D10.bdsproj
+ RODX\RemObjects_RODX_D10.bdsproj
+ RemObjects_BPDX_D10.bdsproj
+ DataSnap\RemObjects_DataSnap_D10.bdsproj
+ RemObjects_Synapse_D10.bdsproj
+ RemObjects_Core_D10.bpl RemObjects_IDE_D10.bpl RemObjects_WebBroker_D10.bpl RemObjects_Indy_D10.bpl RemObjects_RODX_D10.bpl RemObjects_BPDX_D10.bpl RemObjects_DataSnap_D10.bpl RemObjects_Synapse_D10.bpl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D11.groupproj b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D11.groupproj
new file mode 100644
index 0000000..9767849
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D11.groupproj
@@ -0,0 +1,114 @@
+
+
+ {426d6bef-d93c-4c13-9e7c-fff76629872a}
+
+
+
+
+ RemObjects_Core_D11.dproj
+
+
+ RemObjects_Core_D11.dproj
+
+
+ RODX\RemObjects_RODX_D11.dproj
+
+
+
+ RemObjects_Core_D11.dproj
+
+
+
+ RemObjects_Core_D11.dproj
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D12.groupproj b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D12.groupproj
new file mode 100644
index 0000000..89f93dd
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D12.groupproj
@@ -0,0 +1,130 @@
+
+
+ {426d6bef-d93c-4c13-9e7c-fff76629872a}
+
+
+
+
+
+
+ RemObjects_Core_D12.dproj
+
+
+ RemObjects_Core_D12.dproj
+
+
+ RemObjects_Core_D12.dproj
+
+
+
+
+
+ RemObjects_Core_D12.dproj;RODX\RemObjects_RODX_D12.dproj
+
+
+ RemObjects_Core_D12.dproj
+
+
+ RemObjects_Core_D12.dproj
+
+
+
+ Default.Personality.12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D5.bpg b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D5.bpg
new file mode 100644
index 0000000..6f6cd66
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D5.bpg
@@ -0,0 +1,41 @@
+#------------------------------------------------------------------------------
+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 = RemObjects_Core_D5.bpl RemObjects_IDE_D5.bpl \
+ RemObjects_WebBroker_D5.bpl RemObjects_Indy_D5.bpl RemObjects_RODX_D5.bpl \
+ RemObjects_BPDX_D5.bpl RemObjects_Synapse_D5.bpl
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+RemObjects_Core_D5.bpl: RemObjects_Core_D5.dpk
+ $(DCC)
+
+RemObjects_IDE_D5.bpl: IDE\RemObjects_IDE_D5.dpk
+ $(DCC)
+
+RemObjects_Indy_D5.bpl: RemObjects_Indy_D5.dpk
+ $(DCC)
+
+RemObjects_BPDX_D5.bpl: RemObjects_BPDX_D5.dpk
+ $(DCC)
+
+RemObjects_RODX_D5.bpl: RODX\RemObjects_RODX_D5.dpk
+ $(DCC)
+
+RemObjects_Synapse_D7.bpl: RemObjects_Synapse_D7.dpk
+ $(DCC)
+
+RemObjects_WebBroker_D7.bpl: RemObjects_WebBroker_D7.dpk
+ $(DCC)
+
+
+
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D6.bpg b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D6.bpg
new file mode 100644
index 0000000..119cb74
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D6.bpg
@@ -0,0 +1,41 @@
+#------------------------------------------------------------------------------
+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 = RemObjects_Core_D6.bpl RemObjects_IDE_D6.bpl \
+ RemObjects_WebBroker_D6.bpl RemObjects_Indy_D6.bpl RemObjects_RODX_D6.bpl \
+ RemObjects_BPDX_D6.bpl RemObjects_DataSnap_D6.bpl RemObjects_Synapse_D6.bpl
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+RemObjects_Core_D6.bpl: RemObjects_Core_D6.dpk
+ $(DCC)
+
+RemObjects_IDE_D6.bpl: IDE\RemObjects_IDE_D6.dpk
+ $(DCC)
+
+RemObjects_Indy_D6.bpl: RemObjects_Indy_D6.dpk
+ $(DCC)
+
+RemObjects_BPDX_D6.bpl: RemObjects_BPDX_D6.dpk
+ $(DCC)
+
+RemObjects_DataSnap_D6.bpl: DataSnap\RemObjects_DataSnap_D6.dpk
+ $(DCC)
+
+RemObjects_RODX_D6.bpl: rodx\RemObjects_RODX_D6.dpk
+ $(DCC)
+
+RemObjects_Synapse_D6.bpl: RemObjects_Synapse_D6.dpk
+ $(DCC)
+
+RemObjects_WebBroker_D6.bpl: RemObjects_WebBroker_D6.dpk
+ $(DCC)
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D7.bpg b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D7.bpg
new file mode 100644
index 0000000..b1aed3d
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_D7.bpg
@@ -0,0 +1,43 @@
+#------------------------------------------------------------------------------
+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 = RemObjects_Core_D7.bpl RemObjects_IDE_D7.bpl \
+ RemObjects_WebBroker_D7.bpl RemObjects_Indy_D7.bpl RemObjects_RODX_D7.bpl \
+ RemObjects_BPDX_D7.bpl RemObjects_DataSnap_D7.bpl RemObjects_Synapse_D7.bpl
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+RemObjects_Core_D7.bpl: RemObjects_Core_D7.dpk
+ $(DCC)
+
+RemObjects_IDE_D7.bpl: IDE\RemObjects_IDE_D7.dpk
+ $(DCC)
+
+RemObjects_Indy_D7.bpl: RemObjects_Indy_D7.dpk
+ $(DCC)
+
+RemObjects_BPDX_D7.bpl: RemObjects_BPDX_D7.dpk
+ $(DCC)
+
+RemObjects_DataSnap_D7.bpl: DataSnap\RemObjects_DataSnap_D7.dpk
+ $(DCC)
+
+RemObjects_RODX_D7.bpl: rodx\RemObjects_RODX_D7.dpk
+ $(DCC)
+
+RemObjects_Synapse_D7.bpl: RemObjects_Synapse_D7.dpk
+ $(DCC)
+
+RemObjects_WebBroker_D7.bpl: RemObjects_WebBroker_D7.dpk
+ $(DCC)
+
+
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_d14.groupproj b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_d14.groupproj
new file mode 100644
index 0000000..7feee48
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/BuildPackages_d14.groupproj
@@ -0,0 +1,120 @@
+
+
+ {36A3BEFE-3A2A-4D8C-97B3-A5373FDAF11E}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Default.Personality.12
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLGenTools.pas b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLGenTools.pas
new file mode 100644
index 0000000..96bd332
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLGenTools.pas
@@ -0,0 +1,542 @@
+unit uRODLGenTools;
+
+{----------------------------------------------------------------------------}
+{ RemObjects SDK Library - CodeGen }
+{ }
+{ compiler: Delphi 5 and up, Kylix 2 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the RemObjects SDK }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFNDEF MSWINDOWS}
+{$I ../RemObjects.inc}
+{$ELSE}
+{$I ..\RemObjects.inc}
+{$ENDIF}
+
+
+interface
+
+uses Classes, uRODL, uRORemoteDataModule;
+
+const IntfInvkNotice =
+ '{----------------------------------------------------------------------------}'+#13#10+
+ '{ This unit was automatically generated by the RemObjects SDK after reading }'+#13#10+
+ '{ the RODL file associated with this project . }'+#13#10+
+ '{ }'+#13#10+
+ '{ Do not modify this unit manually, or your changes will be lost when this }'+#13#10+
+ '{ unit is regenerated the next time you compile the project. }'+#13#10+
+ '{----------------------------------------------------------------------------}';
+
+ ImplNotice =
+ '{----------------------------------------------------------------------------}'+#13#10+
+ '{ This unit was automatically generated by the RemObjects SDK after reading }'+#13#10+
+ '{ the RODL file associated with this project . }'+#13#10+
+ '{ }'+#13#10+
+ '{ This is where you are supposed to code the implementation of your objects. }'+#13#10+
+ '{----------------------------------------------------------------------------}';
+
+ IntfInvkNoticeCSharp =
+ '//---------------------------------------------------------------------------'+#13+
+ '// This source file was automatically generated by the RemObjects SDK after '+#13+
+ '// reading the RODL file associated with this project. '+#13+
+ '// '+#13+
+ '// Do not modify this file manually, or your changes will be lost when this '+#13+
+ '// source file is regenerated the next time you compile the project. '+#13+
+ '//---------------------------------------------------------------------------';
+
+ ImplNoticeCSharp =
+ '//---------------------------------------------------------------------------'+#13+
+ '// This source file was automatically generated by the RemObjects SDK after '+#13+
+ '// reading the RODL file associated with this project. '+#13+
+ '// '+#13+
+ '// This is where you are supposed to code the implementation of your objects.'+#13+
+ '//---------------------------------------------------------------------------';
+
+ DelphiFlagNames : array[TRODLParamFlag] of string = (
+ 'const', 'out', 'var', 'result');
+
+ CSharpFlagNames : array[TRODLParamFlag] of string = (
+ '', 'out ', 'ref ', 'result');
+
+ DelphiAsyncInvokeFlagNames : array[TRODLParamFlag] of string = (
+ 'const', '[out]', 'const', '[result]');
+
+ DelphiAsyncRetrieveFlagNames : array[TRODLParamFlag] of string = (
+ '[const]', 'out', 'out', 'result');
+
+type
+ PRODataModuleClass = ^TRODataModuleClass;
+ TRODataModuleClass = record
+ ClassType : TRORemoteDataModuleClass;
+ Alias,
+ Description,
+ RequiredUnits : string;
+ end;
+
+// Code generation helpers
+function GetOperationDefinition(
+ const anOperation : TRODLOperation;
+ const aClassName : string = '';
+ const aSuffix : string = '';
+ AddSenderGUID : boolean = FALSE) : string;
+
+function DataTypeToCSharpType(const iType:string; iLibrary:TRODLLibrary=nil; iForNew:boolean=false):string;
+function DataTypeToDelphiDotNetType(const iType:string; iLibrary:TRODLLibrary=nil; iForNew:boolean=false):string;
+
+
+function GetOperationDefinitionCSharp(
+ const anOperation : TRODLOperation;
+ aForInterface:boolean;
+ const aSuffix : string = ''; aLibrary: TRODLLibrary= nil) : string;
+
+function GetOperationDefinitionDelphiForDotNet(const anOperation : TRODLOperation; aLibrary:TRODLLibrary; const aClassName : string = ''; const aSuffix : string = '') : string;
+
+function GetAsyncInvokeOperationDefinition(
+ const anOperation : TRODLOperation;
+ const aClassName : string = '';
+ const aSuffix : string = '') : string;
+
+function GetAsyncRetrieveOperationDefinition(
+ const anOperation : TRODLOperation;
+ const aClassName : string = '';
+ const aSuffix : string = '') : string;
+function NeedsAsyncRetrieveOperationDefinition(anOperation:TRODLOperation):boolean;
+
+function MessageWrite(const iType, iRodlType, iName, iVariable:string):string;
+function MessageRead(const iType, iRodlType, iName:string):string;
+function TypeToReadWriteFn(const iType:string):string;
+
+procedure GetTypeNames(const aLibrary : TRODLLibrary; aResult : TStrings);
+function TypeByName(const aLibrary : TRODLLibrary; const aTypeName : string) : TRODLEntity;
+
+// TRORemoteDatamodule registration
+procedure RegisterRODataModuleClass(aClass : TRORemoteDataModuleClass; const anAlias, aDescription, someRequiredUnits : string);
+function GetRODataModuleClass(Index : integer) : TRODataModuleClass;
+function GetRODataModuleClassCount : integer;
+
+implementation
+
+uses {$IFDEF MSWINDOWS}Windows,{$ENDIF} SysUtils, uRORes, uROTypes, uRODLToPascalIntf;
+
+var _datamodules : TStringList;
+
+const
+ MAX_PARAM_LENGTH = 100;
+
+// Code generation helpers
+function GetOperationDefinition(const anOperation : TRODLOperation;
+ const aClassName : string = ''; const aSuffix : string = '';
+ AddSenderGUID : boolean = FALSE) : string;
+var x : integer;
+ lPars, lPars2, s : string;
+ lFillStr: string;
+begin
+ if not Assigned(anOperation.Result) then s := 'procedure ' else s := 'function ';
+
+ if aClassName<>''
+ then s := s+aClassName+'.'+anOperation.Name
+ else s := s+anOperation.Name;
+
+ if aSuffix<>''
+ then s := s+aSuffix;
+
+ if aClassName = '' then
+ SetLength(lFillStr,Length(s)+4+1) { Interface section }
+ else
+ SetLength(lFillStr,Length(s)+1); { Implementation section }
+// FillChar(lFillStr[1],Length(lFillStr),#32);
+
+ for x := 1 to Length(lFillStr) do
+ lFillStr[x] := #32;
+
+ with anOperation do begin
+ lPars := '';
+ lPars2 := '';
+
+ if (Count>0) then begin
+ for x := 0 to (Count-1) do begin
+ with Items[x] do begin
+ if (Flag <> fResult) then begin
+ if Length(lPars2) > MAX_PARAM_LENGTH then begin
+ lPars := lPars+lPars2+#13#10+lFillStr;
+ lPars2 := '';
+ end;
+ lPars2 := lPars2+Format('%s %s: %s; ', [DelphiFlagNames[Flag], Name, GetDataType(DataType)]);
+ end;
+ end;
+ end;
+ lPars := lPars+lPars2;
+ end;
+
+ if AddSenderGUID then begin
+ lPars2 := 'const __Sender : TGUID';
+ if (lPars<>'') then lPars2 := lPars2+'; ';
+
+ lPars := lPars2+lPars;
+ end;
+
+ if (lPars<>'') then begin
+ if Count>0
+ then s := s+'('+Copy(lPars,1,Length(lPars)-2)+')'
+ else s := s+'('+Copy(lPars,1,Length(lPars))+')'
+ end;
+ end;
+
+ if Assigned(anOperation.Result) then s := s+': '+GetDataType(anOperation.Result.DataType);
+ s := s+';';
+
+ result := s;
+end;
+
+function DataTypeToCSharpType(const iType:string; iLibrary:TRODLLibrary=nil; iForNew:boolean=false):string;
+var
+ lType,lElementType:string;
+begin
+ lType := iType;
+ if CompareText(iType,'Integer') = 0 then begin
+ Result := 'Int32';
+ end
+ else if CompareText(iType,'WideString') = 0 then begin
+ Result := 'String';
+ end
+ else if CompareText(iType,'DateTime') = 0 then begin
+ Result := 'DateTime'; //make sure casing is good
+ end
+ else if CompareText(iType,'Xml') = 0 then begin
+ Result := 'XmlNode';
+ end
+ else if Assigned(iLibrary) and IsArray(lType,ilibrary,lElementType) then begin
+ if iForNew then
+ Result := DataTypeToCSharpType(lElementType,iLibrary)+'[0]'
+ else
+ Result := DataTypeToCSharpType(lElementType,iLibrary)+'[]';
+ end
+ else if Assigned(iLibrary) then begin
+ if IsUserDefinedType(lType,iLibrary) then begin
+ result := lType; // IsUserDefinedType() fixed the casing
+ end
+ else begin
+ Result := LowerCase(iType);
+ if Length(Result) > 0 then Result[1] := UpCase(Result[1]);
+ end;
+ end
+ else begin
+ Result := iType;
+ end;
+ if iForNew and (Pos('[0]',result) = 0) then result := result+'()';
+end;
+
+function DataTypeToDelphiDotNetType(const iType:string; iLibrary:TRODLLibrary=nil; iForNew:boolean=false):string;
+var
+ lType:string;
+begin
+ lType := iType;
+ if CompareText(iType, 'Xml') = 0 then
+ result := 'XmlNode'
+ else
+ if CompareText(iType,'WideString') = 0 then begin
+ Result := 'String';
+ end
+ else if Assigned(iLibrary) then begin
+ if IsUserDefinedType(lType,iLibrary) then begin
+ result := lType; // IsUserDefinedType() fixed the casing
+ end
+ else begin
+ Result := LowerCase(iType);
+ if Length(Result) > 0 then Result[1] := UpCase(Result[1]);
+ end;
+ end
+ else begin
+ Result := iType;
+ end;
+ //if iForNew and (Pos('[0]',result) = 0) then result := result+'()';
+end;
+
+function GetOperationDefinitionCSharp(const anOperation : TRODLOperation; aForInterface:Boolean; const aSuffix : string = ''; aLibrary: TRODLLibrary = nil) : string;
+var x : integer;
+ pars, s : string;
+begin
+ if not Assigned(anOperation.Result) then s := 'void ' else s := DataTypeToCSharpType(anOperation.Result.DataType,aLibrary)+' ';
+ if not aForInterface then s := 'public '+s;
+
+ {if aClassName<>''
+ then s := s+aClassName+'.'+anOperation.Name
+ else}
+ s := s+anOperation.Name;
+
+ {if aSuffix<>''
+ then s := s+aSuffix;}
+
+ with anOperation do
+ if (Count>0) then begin
+ pars := '';
+
+ for x := 0 to (Count-1) do begin
+ with Items[x] do begin
+ if (Flag<>fresult)
+ then pars :=pars+Format('%s%s %s, ', [CSharpFlagNames[Flag], DataTypeToCSharpType(DataType,aLibrary), Name]);
+ end;
+ end;
+
+ if (pars<>'') then
+ s := s+'('+Copy(pars,1,Length(pars)-2)+')'
+ else
+ s := s+'()';
+ end
+ else
+ s := s+'()';
+
+ //if Assigned(anOperation.Result) then s := s+': '+anOperation.Result.DataType;
+ //s := s+';';
+ if aForInterface then s := s+';';
+
+ result := s;
+end;
+
+function GetOperationDefinitionDelphiForDotNet(const anOperation : TRODLOperation; aLibrary:TRODLLibrary; const aClassName : string = ''; const aSuffix : string = '') : string;
+var x : integer;
+ pars, s : string;
+begin
+ if not Assigned(anOperation.Result) then s := 'procedure ' else s := 'function ';
+
+ if aClassName<>''
+ then s := s+aClassName+'.'+anOperation.Name
+ else s := s+anOperation.Name;
+
+ if aSuffix<>''
+ then s := s+aSuffix;
+
+ with anOperation do
+ if (Count>0) then begin
+ pars := '';
+
+ for x := 0 to (Count-1) do begin
+ with Items[x] do begin
+ if (Flag<>fresult)
+ then pars :=pars+Format('%s %s: %s; ', [DelphiFlagNames[Flag], Name, DataTypeToCSharpType(DataType)]);
+ end;
+ end;
+
+ if (pars<>'') then s := s+'('+Copy(pars,1,Length(pars)-2)+')';
+ end;
+
+ if Assigned(anOperation.Result) then s := s+': '+DataTypeToCSharpType(anOperation.Result.DataType);
+ s := s+';';
+
+ result := s;
+end;
+
+
+function GetAsyncInvokeOperationDefinition(
+ const anOperation : TRODLOperation;
+ const aClassName : string = '';
+ const aSuffix : string = '') : string;
+var x : integer;
+ pars, s : string;
+begin
+ s := 'procedure ';
+
+ if aClassName<>''
+ then s := s+aClassName+'.'+'Invoke_'+anOperation.Name
+ else s := s+'Invoke_'+anOperation.Name;
+
+ if aSuffix<>''
+ then s := s+aSuffix;
+
+ with anOperation do
+ if (Count>0) then begin
+ pars := '';
+
+ for x := 0 to (Count-1) do begin
+ with Items[x] do begin
+ if not (Flag in [fOut,fResult]) then
+ pars :=pars+Format('%s %s: %s; ', [DelphiAsyncInvokeFlagNames[Flag], Name, GetDataType(DataType)]);
+ end;
+ end;
+
+ if (pars<>'') then s := s+'('+Copy(pars,1,Length(pars)-2)+')';
+ end;
+
+ //if Assigned(anOperation.Result) then s := s+': '+anOperation.Result.DataType;
+ s := s+';';
+
+ result := s;
+end;
+
+function NeedsAsyncRetrieveOperationDefinition(anOperation:TRODLOperation):boolean;
+var
+ i:integer;
+begin
+ result := Assigned(anOperation.Result) or (anOperation.ForceAsyncResponse);
+ if not result then
+ for i := 0 to anOperation.Count-1 do with anOperation.Items[i] do
+ if (Flag <> fIn) then result := true;
+end;
+
+function GetAsyncRetrieveOperationDefinition(
+ const anOperation : TRODLOperation;
+ const aClassName : string = '';
+ const aSuffix : string = '') : string;
+var x : integer;
+ pars, s : string;
+begin
+ if not Assigned(anOperation.Result) then s := 'procedure ' else s := 'function ';
+
+ if aClassName<>''
+ then s := s+aClassName+'.'+'Retrieve_'+anOperation.Name
+ else s := s+'Retrieve_'+anOperation.Name;
+
+ if aSuffix<>''
+ then s := s+aSuffix;
+
+ with anOperation do
+ if (Count>0) then begin
+ pars := '';
+
+ for x := 0 to (Count-1) do begin
+ with Items[x] do begin
+ if not (Flag in [fIn,fResult]) then
+ pars :=pars+Format('%s %s: %s; ', [DelphiAsyncRetrieveFlagNames[Flag], Name, GetDataType(DataType)]);
+ end;
+ end;
+
+ if (pars<>'') then s := s+'('+Copy(pars,1,Length(pars)-2)+')';
+ end;
+
+ if Assigned(anOperation.Result) then s := s+': '+GetDataType(anOperation.Result.DataType);
+ s := s+';';
+
+ result := s;
+end;
+
+function TypeToReadWriteFn(const iType:string):string;
+begin
+ if SameText(iType,'Integer') then begin
+ result := 'Int32';
+ end
+ else if SameText(iType,'Boolean') then begin
+ result := 'Boolean';
+ end
+ else if SameText(iType,'WideString') then begin
+ result := 'WideString';
+ end
+ else if SameText(iType,'AnsiString') then begin
+ result := 'AnsiString';
+ end
+ {else if (iType = 'Binary') or (iType = 'Array') then begin
+ Result := 'ISerializable';
+ end}
+ else begin
+ Result := '';
+ end;
+end;
+
+function MessageWrite(const iType, iRodlType, iName, iVariable:string):string;
+var lWriteFn: string;
+begin
+ lWriteFn := TypeToReadWriteFn(iRodlType);
+ if lWriteFn <> '' then begin
+ Result := Format('%s("%s", %s);',
+ [lWriteFn, iName, iVariable]);
+ end
+ else begin
+ Result := Format('("%s", %s, typeof(%s));', //typeof(%s),
+ [iName, iVariable, iType]); //iType,
+ end;
+end;
+
+function MessageRead(const iType, iRodlType, iName:string):string;
+var lWriteFn: string;
+begin
+ lWriteFn := TypeToReadWriteFn(iRodlType);
+ if lWriteFn <> '' then begin
+ Result := Format('__Message.Read%s("%s");',
+ [lWriteFn, iName]);
+ end
+ else begin
+ Result := Format('(%s)__Message.Read("%s", typeof(%s));',
+ [iType, iName, iType]);
+ end;
+end;
+
+procedure GetTypeNames(const aLibrary : TRODLLibrary; aResult : TStrings);
+var i : integer;
+begin
+ with aLibrary do begin
+ for i := 0 to StructCount-1 do
+ aResult.AddObject(Structs[i].Name, pointer(Structs[i]));
+
+ for i := 0 to EnumCount-1 do
+ aResult.AddObject(Enums[i].Name, pointer(Enums[i]));
+
+ for i := 0 to ArrayCount-1 do
+ aResult.AddObject(Arrays[i].Name, pointer(Arrays[i]));
+ end;
+end;
+
+function TypeByName(const aLibrary : TRODLLibrary; const aTypeName : string) : TRODLEntity;
+var i : integer;
+begin
+ result := NIL;
+
+ with aLibrary do begin
+ for i := 0 to (Count-1) do
+ if (CompareText(Items[i].Name, aTypeName)=0) then begin
+ result := Items[i];
+ Exit;
+ end;
+ end;
+end;
+
+// TRORemoteDatamodule registration
+procedure RegisterRODataModuleClass(aClass : TRORemoteDataModuleClass; const anAlias, aDescription, someRequiredUnits : string);
+var idx : integer;
+ item : PRODataModuleClass;
+begin
+ idx := _datamodules.IndexOf(aClass.ClassName);
+ if (idx>=0) then begin
+ Dispose(PRODataModuleClass(_datamodules.Objects[idx]));
+ _datamodules.Delete(idx);
+ end;
+
+ New(item);
+ item.ClassType := aClass;
+ item.Alias := anAlias;
+ item.Description := aDescription;
+ item.RequiredUnits := someRequiredUnits;
+
+ _datamodules.AddObject(aClass.ClassName, TObject(item));
+end;
+
+function GetRODataModuleClass(Index : integer) : TRODataModuleClass;
+begin
+ result := PRODataModuleClass(_datamodules.Objects[Index])^
+end;
+
+function GetRODataModuleClassCount : integer;
+begin
+ result := _datamodules.Count
+end;
+
+procedure DisposeModuleClasses;
+var i : integer;
+begin
+ for i := 0 to (_datamodules.Count-1) do
+ Dispose(PRODataModuleClass(_datamodules.Objects[i]));
+end;
+
+initialization
+ _datamodules := TStringList.Create;
+ {_datamodules.Duplicates := dupError;}
+ _datamodules.Sorted := TRUE;
+
+finalization
+ DisposeModuleClasses();
+ FreeAndNIL(_datamodules);
+
+end.
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascal.pas b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascal.pas
new file mode 100644
index 0000000..6ddeb88
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascal.pas
@@ -0,0 +1,13 @@
+unit uRODLToPascal;
+
+interface
+
+const PASCAL_INDENTATION_LEVEL_1 = 2;
+ PASCAL_INDENTATION_LEVEL_2 = 4;
+ PASCAL_INDENTATION_LEVEL_3 = 6;
+ PASCAL_INDENTATION_LEVEL_4 = 8;
+
+implementation
+
+end.
+
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalAsync.pas b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalAsync.pas
new file mode 100644
index 0000000..2d3e60a
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalAsync.pas
@@ -0,0 +1,388 @@
+unit uRODLToPascalAsync;
+
+{----------------------------------------------------------------------------}
+{ RemObjects SDK Library - CodeGen }
+{ }
+{ compiler: Delphi 5 and up, Kylix 2 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the RemObjects SDK }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFNDEF MSWINDOWS}
+{$I ../RemObjects.inc}
+{$ELSE}
+{$I ..\RemObjects.inc}
+{$ENDIF}
+
+interface
+
+uses uRODL;
+
+type { TRODLToPascalAsync }
+ TRODLToPascalAsync = class(TRODLConverter)
+ private
+ procedure WriteServiceDeclarationInterface(aService: TRODLService);
+ procedure WriteServiceDeclarationProxy(aService: TRODLService);
+ procedure WriteServiceDeclarationCoClass(aService: TRODLService);
+ procedure WriteCoClass(aLibrary : TRODLLibrary; aService: TRODLService);
+
+// function IsSOAPService(aService : TRODLService) : boolean;
+ protected
+ procedure IntConvert(const aLibrary : TRODLLibrary; const aTargetEntity : string = ''); override;
+
+ public
+ class function GetTargetFileName(const aLibrary : TRODLLibrary; const aTargetEntity : string = ''): string; override;
+
+ end;
+
+implementation
+
+uses SysUtils, Classes, Dialogs, uROTypes,
+ {$IFDEF DELPHI5}
+ ComObj,
+ {$ENDIF}
+ uRODLGenTools, uRODLToPascal, uRODLToPascalIntf, uROClasses;
+
+{ TRODLToPascalAsync }
+
+procedure TRODLToPascalAsync.IntConvert(const aLibrary: TRODLLibrary; const aTargetEntity: string);
+var {x,} i : integer;
+ s, s2 : string;
+ lServices: IROStrings;
+ fulllist: TStrings;
+begin
+ try
+ Write(Format('unit %s;', [ChangeFileExt(GetTargetFileName(aLibrary), '')]));
+ WriteEmptyLine;
+
+ WriteLines(IntfInvkNotice);
+ WriteEmptyLine;
+
+ write('{$I RemObjects.inc}');
+ WriteEmptyLine;
+
+ Write('interface');
+ WriteEmptyLine;
+
+ Write('uses');
+ Write('{vcl:} Classes, TypInfo,',PASCAL_INDENTATION_LEVEL_1);
+ Write('{RemObjects:} uROXMLIntf, uROClasses, uROTypes, uROClientIntf, uROAsync,',PASCAL_INDENTATION_LEVEL_1);
+
+ if aLibrary.UseCount > 0 then begin
+ s := '';
+ fulllist := TStringList.Create;
+ try
+ for i := 0 to aLibrary.UseCount-1 do begin
+ if aLibrary.Use[i].LoadedRodlLibraryName <> '' then
+ s2 := aLibrary.Use[i].LoadedRodlLibraryName
+ else
+ s2 := ChangeFileExt(ExtractFilename(aLibrary.Use[i].RodlFile),'');
+
+ if fulllist.IndexOf(s2) > -1 then Continue;
+
+ fulllist.Add(s2);
+ if s <> '' then s := s+', ';
+ s := s + s2 + '_Intf, ' + s2 + '_Async';
+
+ if (Length(s)>65) then begin
+ s := s+ ',';
+ Write('{Used RODLs:} '+ s,PASCAL_INDENTATION_LEVEL_1);
+ s := '';
+ end;
+ end; { for }
+ finally
+ FreeAndNil(fulllist);
+ end;
+
+ if s <> '' then begin
+ s := s+',';
+ Write('{Used RODLs:} '+s,PASCAL_INDENTATION_LEVEL_1);
+ end;
+ end;
+
+ Write('{Project:} '+ChangeFileExt(TRODLToIntf.GetTargetFileName(aLibrary),'')+';',PASCAL_INDENTATION_LEVEL_1);
+ lServices := aLibrary.CalcServiceOrder;
+ WriteEmptyLine;
+ if aLibrary.ServiceCount > 0 then
+ begin
+ Write('type');
+ Write(' TSeekOrigin = Classes.TSeekOrigin; // fake declaration');
+ (*
+ for i := 0 to (aLibrary.ServiceCount-1) do begin
+ if not aLibrary.Services[i].IsFromUsedRodl then
+ Write(Format('I%s_Async = interface;', [aLibrary.Services[i].Name]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ for i := 0 to (aLibrary.ServiceCount-1) do begin
+ if not aLibrary.Services[i].IsFromUsedRodl then
+ Write(Format('Co%s_Async = class;', [aLibrary.Services[i].Name]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ for i := 0 to (aLibrary.ServiceCount-1) do begin
+ if not aLibrary.Services[i].IsFromUsedRodl then
+ Write(Format('T%s_AsyncProxy = class;', [aLibrary.Services[i].Name]),PASCAL_INDENTATION_LEVEL_1);
+ end; *)
+
+ for i := 0 to lServices.Count -1 do begin
+ if not TRODLService(lServices.Objects[i]).IsFromUsedRodl then
+ WriteServiceDeclarationInterface(TRODLService(lServices.Objects[i]));
+ end;
+
+ for i := 0 to lServices.Count -1 do begin
+ if not TRODLService(lServices.Objects[i]).IsFromUsedRodl then
+ WriteServiceDeclarationCoClass(TRODLService(lServices.Objects[i]));
+ end;
+
+ for i := 0 to lServices.Count -1 do begin
+ if not TRODLService(lServices.Objects[i]).IsFromUsedRodl then
+ WriteServiceDeclarationProxy(TRODLService(lServices.Objects[i]));
+ end;
+ end;
+
+ //WriteEmptyLine;
+
+ Write('implementation');
+ WriteEmptyLine;
+
+ Write('uses');
+ Write('{vcl:} SysUtils;',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ for i := 0 to (aLibrary.ServiceCount-1) do
+ WriteCoClass(aLibrary, aLibrary.Services[i]);
+
+ Write('initialization');
+ {for i := 0 to (aLibrary.Count-1) do
+ if (aLibrary.Items[i] is TRODLArray) or (aLibrary.Items[i] is TRODLStruct)
+ then Write(' RegisterROClass('+aLibrary.Items[i].Name+');');}
+
+ //WriteEmptyLine;
+
+ {Write('finalization');
+ for i := 0 to (aLibrary.Count-1) do
+ if (aLibrary.Items[i] is TRODLArray) or (aLibrary.Items[i] is TRODLStruct)
+ then Write(' UnRegisterClass('+aLibrary.Items[i].Name+');');
+
+ WriteEmptyLine;}
+
+ Write('end.');
+
+ finally
+ end;
+end;
+
+class function TRODLToPascalAsync.GetTargetFileName(const aLibrary: TRODLLibrary;
+ const aTargetEntity: string): string;
+begin
+ try
+ result := aLibrary.Name+'_Async.pas'
+ except
+ result := 'Unknown.pas';
+ end;
+end;
+
+const
+ InnerIndent = 4;
+
+procedure TRODLToPascalAsync.WriteCoClass(aLibrary : TRODLLibrary; aService: TRODLService);
+var i, p : integer;
+ sa : string;
+// soapsvc : boolean;
+begin
+ if not aService.IsFromUsedRodl then with aService.Default do begin
+// soapsvc := IsSOAPService(aService);
+
+ Write('{ Co'+aService.Name+' }');
+ WriteEmptyLine;
+
+ Write(Format('class function Co%s_Async.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): I%s_Async;',
+ [aService.Name, aService.Name]));
+ Write('begin');
+ Write(Format(' result := T%s_AsyncProxy.Create(aMessage, aTransportChannel);', [aService.Name]));
+ Write('end;');
+ WriteEmptyLine;
+
+ if Count > 0 then begin
+ Write(Format('{ T%s_AsyncProxy }', [aService.Name]));
+ WriteEmptyLine;
+ end;
+
+ Write(Format('function T%s_AsyncProxy.__GetInterfaceName:string;',[aService.Name]));
+ Write('begin');
+ Write(Format(' result := ''%s'';',[aService.Name]));
+ Write('end;');
+ WriteEmptyLine;
+
+ for i := 0 to (Count-1) do begin
+ Write(GetAsyncInvokeOperationDefinition(Items[i], Format('T%s_AsyncProxy', [aService.Name])));
+// Write('var __request:TStream;');
+// if soapsvc then Write('var __http : IROHTTPTransport;');
+ Write('begin');
+ Write(Format('__AssertProxyNotBusy(''%s'');',[Items[i].Name]),PASCAL_INDENTATION_LEVEL_1);
+// Write('__request := TMemoryStream.Create;',PASCAL_INDENTATION_LEVEL_1);
+ //Write('__response := TMemoryStream.Create;',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ sa := GetAttributes(Items[i].Info.Attributes, aService.Info.Attributes, aLibrary.Info.Attributes, InnerIndent);
+ if sa <> '' then
+ Write('__Message.SetAttributes(__TransportChannel, '+sa+');', InnerIndent);
+
+
+ Write(Format('__Message.InitializeRequestMessage(__TransportChannel, ''%s'', __InterfaceName, ''%s'');', [aLibrary.Name, Items[i].Name]), PASCAL_INDENTATION_LEVEL_1);
+
+ with Items[i] do begin
+ for p := 0 to (Count-1) do
+ if IsInputFlag(Items[p].Flag) then begin
+ if (StrToDataType(Items[p].DataType)=rtDateTime)
+ then sa := '[paIsDateTime]'
+ else sa := '[]';
+
+ Write(Format('__Message.Write(''%s'', TypeInfo(%s), %s, %s);',
+ [Items[p].Name, GetDataType(Items[p].DataType), Items[p].Name, sa]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+ end;
+// Write('__Message.Finalize;',PASCAL_INDENTATION_LEVEL_1);
+// WriteEmptyLine;
+
+// Write('__Message.WriteToStream(__request);',PASCAL_INDENTATION_LEVEL_1);
+ if NeedsAsyncRetrieveOperationDefinition(Items[i]) then begin
+ Write(Format('__DispatchAsyncRequest(''%s'',__Message);',[Items[i].Name]),PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('__DispatchAsyncRequest(''%s'',__Message, false);',[Items[i].Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+ if sa <> '' then
+ Write(' __Message.UnsetAttributes(__TransportChannel);');
+ Write('end;');
+ WriteEmptyLine;
+
+ if NeedsAsyncRetrieveOperationDefinition(Items[i]) then begin
+ Write(GetAsyncRetrieveOperationDefinition(Items[i], Format('T%s_AsyncProxy', [aService.Name])));
+ Write('var __response:TStream;');
+ Write('begin');
+
+ with Items[i] do begin
+ for p := 0 to (Count-1) do
+ if (Items[p].Flag in [fInOut,fOut]) and IsImplementedAsClass(Items[p].DataType, aLibrary) then
+ Write(Format('%s := nil;', [Items[p].Name]),PASCAL_INDENTATION_LEVEL_1);
+ if Assigned(Result) and IsImplementedAsClass(Result.DataType, aLibrary) then
+ Write('result := nil;', PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write(Format('__response := __RetrieveAsyncResponse(''%s'');',[Items[i].Name]),PASCAL_INDENTATION_LEVEL_1);
+ //Write('__TransportChannel.Dispatch(__request, __response);',PASCAL_INDENTATION_LEVEL_1);
+ Write('__Message.ReadFromStream(__response);',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ //Write(Format('Message.Initialize(''I%s'', ''%s'');', [aService.Name, Items[i].Name]), PASCAL_INDENTATION_LEVEL_1);
+ with Items[i] do begin
+
+ if Assigned(Result) then begin
+ if (StrToDataType(Result.DataType)=rtDateTime) then sa := '[paIsDateTime]' else sa := '[]';
+ Write(Format('__Message.Read(''%s'', TypeInfo(%s), Result, %s);',
+ [Result.Name, GetDataType(Result.DataType), sa]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+ for p := 0 to (Count-1) do
+ if IsOutputFlag(Items[p].Flag) then begin
+
+ if (StrToDataType(Items[p].DataType)=rtDateTime) then sa := '[paIsDateTime]' else sa := '[]';
+ Write(Format('__Message.Read(''%s'', TypeInfo(%s), %s, %s);',
+ [Items[p].Name, GetDataType(Items[p].DataType), Items[p].Name, sa]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+ end;
+ //Write('Message.Finalize;',5);
+
+ //Write('__request.Free;',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ Write('__response.Free();',PASCAL_INDENTATION_LEVEL_1);
+ Write('end;');
+ WriteEmptyLine;
+ end;
+ end;
+
+ WriteEmptyLine;
+ end;
+end;
+{
+function TRODLToPascalAsync.IsSOAPService(aService: TRODLService): boolean;
+begin
+ result := aService.Attributes.Values['Type'] = 'SOAP';
+end;
+}
+
+
+
+
+procedure TRODLToPascalAsync.WriteServiceDeclarationCoClass(
+ aService: TRODLService);
+ //lOperation:TRODLOperation;
+begin
+ if not aService.IsFromUsedRodl then with aService.Default do begin
+ Write(Format('{ Co%s_Async }', [aService.Name]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('Co%s_Async = class', [aService.Name]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): I%s_Async;',
+ [aService.Name]), PASCAL_INDENTATION_LEVEL_2);
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ end;
+end;
+
+procedure TRODLToPascalAsync.WriteServiceDeclarationInterface(
+ aService: TRODLService);
+var i:integer;
+ //lOperation:TRODLOperation;
+begin
+ if not aService.IsFromUsedRodl then with aService.Default do begin
+
+ Write(Format('{ I%s_Async }', [aService.Name]), PASCAL_INDENTATION_LEVEL_1);
+ if aService.Ancestor <> '' then begin
+ Write(Format('I%s_Async = interface(I%s_Async)', [aService.Name,aService.Ancestor]), PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('I%s_Async = interface(IROAsyncInterface)', [aService.Name]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write(Format('[''%s'']', [NewGuidAsString()]), PASCAL_INDENTATION_LEVEL_2);
+
+ for i := 0 to (Count-1) do
+ Write(GetAsyncInvokeOperationDefinition(Items[i]), PASCAL_INDENTATION_LEVEL_2);
+ for i := 0 to (Count-1) do
+ if NeedsAsyncRetrieveOperationDefinition(Items[i]) then
+ Write(GetAsyncRetrieveOperationDefinition(Items[i]), PASCAL_INDENTATION_LEVEL_2);
+
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ end;
+end;
+
+procedure TRODLToPascalAsync.WriteServiceDeclarationProxy(
+ aService: TRODLService);
+var i:integer;
+ //lOperation:TRODLOperation;
+begin
+ if not aService.IsFromUsedRodl then with aService.Default do begin
+ Write(Format('{ T%s_AsyncProxy }', [aService.Name]), PASCAL_INDENTATION_LEVEL_1);
+ if aService.Ancestor <> '' then begin
+ Write(Format('T%s_AsyncProxy = class(T%s_AsyncProxy, I%s_Async)', [aService.Name, aService.Ancestor, aService.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('T%s_AsyncProxy = class(TROAsyncProxy, I%s_Async)', [aService.Name, aService.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write('private',PASCAL_INDENTATION_LEVEL_1);
+ Write('protected',PASCAL_INDENTATION_LEVEL_1);
+ Write(' function __GetInterfaceName:string; override;',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ for i := 0 to (Count-1) do
+ Write(GetAsyncInvokeOperationDefinition(Items[i]), PASCAL_INDENTATION_LEVEL_2);
+ for i := 0 to (Count-1) do
+ if NeedsAsyncRetrieveOperationDefinition(Items[i]) then
+ Write(GetAsyncRetrieveOperationDefinition(Items[i]), PASCAL_INDENTATION_LEVEL_2);
+
+ Write('end;',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ end;
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalImpl.pas b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalImpl.pas
new file mode 100644
index 0000000..e9e206b
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalImpl.pas
@@ -0,0 +1,367 @@
+unit uRODLToPascalImpl;
+
+{----------------------------------------------------------------------------}
+{ RemObjects SDK Library - CodeGen }
+{ }
+{ compiler: Delphi 5 and up, Kylix 2 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the RemObjects SDK }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFNDEF MSWINDOWS}
+{$I ../RemObjects.inc}
+{$ELSE}
+{$I ..\RemObjects.inc}
+{$ENDIF}
+
+interface
+
+uses
+ {$IFDEF FPC}LResources,{$ENDIF}uRODL;
+
+type { TRODLToImpl }
+ TRODLToImpl = class(TRODLConverter)
+ private
+ fDFMExtension: string;
+ fService : TRODLService;
+ fAncestorService:TRODLService;
+ fServerClassName: string;
+ fRequiredUnits: string;
+
+ procedure WriteServiceDeclaration(const aService: TRODLService);
+ procedure WriteOperationImplementation(const anOperation : TRODLOperation);
+ procedure SetServerClassName(const Value: string);
+ function GetWriteDataModule: boolean;
+
+ protected
+ procedure IntConvert(const aLibrary : TRODLLIbrary; const aTargetEntity : string = ''); override;
+ function ValidateTargetEntity(const aLibrary : TRODLLIbrary; const aTargetEntity : string) : boolean; override;
+
+ public
+ constructor Create(const aLibrary: TRODLLibrary; const aTargetEntity: string = ''); override;
+ class function GetTargetFileName(const aLibrary : TRODLLIbrary; const aTargetEntity : string = ''): string; override;
+
+ property WriteDataModule : boolean read GetWriteDataModule;
+ procedure WriteDFM(const aLibrary: TRODLLIbrary; const aTargetEntity: string; const aFilename: string);
+
+ property ServerClassName : string read fServerClassName write SetServerClassName;
+ property RequiredUnits : string read fRequiredUnits write fRequiredUnits;
+ property DFMExtension: string read fDFMExtension write fDFMExtension;
+ end;
+
+implementation
+
+uses SysUtils, Dialogs, Classes,
+ {$IFDEF HYDRA_DESIGNTIME}
+ uROIDETools, uEWOTAHelpers,
+ {$ENDIF HYDRA_DESIGNTIME}
+ uRODLGenTools, uRODLToPascalInvk, uRODLToPascal, uROServer;
+
+function IsHydraModule : boolean;
+{$IFDEF HYDRA_DESIGNTIME}
+var
+ lSource: string;
+{$ENDIF HYDRA_DESIGNTIME}
+begin
+ result := FALSE;
+ {$IFDEF HYDRA_DESIGNTIME}
+ if (CurrentProject<>NIL) then begin
+ lSource := UpperCase(ReadModuleSource(CurrentProject));
+ result := Pos('{#HYDRAMODULE}', lSource)>0;
+ end;
+ {$ENDIF HYDRA_DESIGNTIME}
+end;
+
+{ TRODLToImpl }
+procedure TRODLToImpl.WriteDFM(const aLibrary: TRODLLIbrary; const aTargetEntity: string; const aFilename: string);
+var svc : TRODLService;
+begin
+ with TStringList.Create do try
+ svc := aLibrary.ItemByName(aTargetEntity) as TRODLService;
+
+ if (Trim(svc.Ancestor)='') then Add(Format('object %s: T%s', [aTargetEntity, aTargetEntity]))
+ else Add(Format('inherited %s: T%s', [aTargetEntity, aTargetEntity]));
+ {$IFNDEF FPC}
+ Add(' OldCreateOrder = True');
+ {$ENDIF}
+ Add(' Left = 200');
+ Add(' Top = 200');
+ Add(' Height = 300');
+ Add(' Width = 300');
+ Add('end');
+ finally
+ SaveToFile(aFilename);
+ Free;
+ end;
+ {$IFDEF FPC}
+ LFMtoLRSfile(aFilename);
+ {$ENDIF}
+end;
+
+procedure TRODLToImpl.IntConvert(const aLibrary: TRODLLIbrary; const aTargetEntity : string = '');
+var i : integer;
+ s, s2 : string;
+ lIsHydraModule : boolean;
+ lFileName: string;
+begin
+ if not Assigned(fService) or not Assigned(fService.Default) then exit;
+ if ServerClassName = '' then begin
+ ServerClassName := 'TRORemoteDataModule';
+ if (copy(RequiredUnits, Length(RequiredUnits), 1) <> ',') and (RequiredUnits <> '') then
+ RequiredUnits := RequiredUnits + ',';
+ RequiredUnits := RequiredUnits + 'uRORemoteDataModule';
+ end;
+ lFileName := ChangeFileExt(GetTargetFileName(aLibrary, TargetEntity), '');
+ Write(Format('unit %s;', [lFileName]));
+ WriteEmptyLine;
+
+ WriteLines(ImplNotice);
+ WriteEmptyLine;
+
+ write('{$I RemObjects.inc}');
+ WriteEmptyLine;
+
+ Write('interface');
+ WriteEmptyLine;
+
+ Write('uses');
+ Write('{$IFDEF FPC}LResources,{$ENDIF}',PASCAL_INDENTATION_LEVEL_1);
+ Write('{vcl:} Classes, SysUtils, ' ,PASCAL_INDENTATION_LEVEL_1);
+ Write('{RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,' ,PASCAL_INDENTATION_LEVEL_1);
+
+ {
+ handled via RequiredUnits
+ if WriteDataModule then begin
+ s := Copy(ServerClassName,2,MaxInt);
+ if (s<>'') // For inherited ones...
+ then Write(Format(' u%s,', [s]),PASCAL_INDENTATION_LEVEL_1);
+ end;}
+
+ if (RequiredUnits<>'') then begin
+ s := Trim(RequiredUnits);
+ if (s[Length(s)]<>',') then s := s+',';
+ Write('{Required:} '+s ,PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ {TODO: -cRO3 RequiredUnits, and UsedRODLs might overlap if (for example) using the DARemoteService
+ ancestor was chosen not in SB but from the IDE. Check these and create a unique list
+ for RO3. }
+
+ if fService.Ancestor <> '' then begin
+ fAncestorService := aLibrary.FindService(fService.Ancestor);
+ if Assigned(fAncestorService) and (fAncestorService.ImplUnit <> '') then
+ Write('{Ancestor Implementation:} '+fAncestorService.ImplUnit+',',PASCAL_INDENTATION_LEVEL_1)
+ else
+ Write('{Ancestor Implementation:} '+fService.Ancestor+'_Impl,',PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ if aLibrary.UseCount > 0 then begin
+ s := '';
+ for i := 0 to aLibrary.UseCount-1 do begin
+ if aLibrary.Use[i].LoadedRodlLibraryName <> '' then
+ s2 := aLibrary.Use[i].LoadedRodlLibraryName + '_Intf'
+ else
+ s2 := ChangeFileExt(ExtractFilename(aLibrary.Use[i].RodlFile),'')+'_Intf';
+ if Pos(s2, s) <= 0 then begin
+ if s <> '' then
+ s := s+', ';
+ s := s+s2;
+ end;
+ end; { for }
+ s := s+',';
+
+ Write('{Used RODLs:} '+s,PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ Write(Format('{Generated:} %s_Intf;', [aLibrary.Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ Write('type');
+
+ WriteServiceDeclaration(fService);
+
+ {WriteEmptyLine;
+ Write(Format('// Returns an I%s instance in case you need direct access to it from inside your server application',
+ [fService.Info.Name]));
+ Write(Format('function New%s(const aClientID : TGUID; UseClassFactory : boolean = TRUE) : I%s;', [fService.Info.Name, fService.Info.Name]));}
+
+ WriteEmptyLine;
+
+ Write('implementation');
+ WriteEmptyLine;
+ if WriteDataModule then begin
+ Write('{$IFNDEF FPC}');
+ Write(' {$R *.dfm}');
+ Write('{$ENDIF}');
+ end;
+
+ Write('uses');
+
+ (*)if aLibrary.UseCount > 0 then begin
+ s := '';
+ for i := 0 to aLibrary.UseCount-1 do begin
+ if s <> '' then s := s+', ';
+ s := s+ChangeFileExt(ExtractFilename(aLibrary.Use[i].RodlFile),'')+'_Invk';
+ end; { for }
+ s := s+',';
+
+ Write('{Ansestor Invokers:} '+s,PASCAL_INDENTATION_LEVEL_1);
+ end; *)
+ if fService.IsFromUsedRodl then begin
+ s := ChangeFileExt(ExtractFilename(fService.LocatedInRodlUse.RodlFile),'')+'_Invk';
+ end
+ else begin
+ s := ChangeFileExt(TRODLToInvk.GetTargetFileName(aLibrary),'');
+ end;
+
+ lIsHydraModule := IsHydraModule;
+ if lIsHydraModule then begin
+ Write(Format('{Hydra:} uHYRes, uHYIntf, uHYROFactory,', [s]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ Write(Format('{Generated:} %s;', [s]),PASCAL_INDENTATION_LEVEL_1);
+
+ WriteEmptyLine;
+
+ Write(Format('procedure Create_%s(out anInstance : IUnknown);', [fService.Info.Name]));
+ Write('begin');
+ if WriteDataModule
+ then Write(Format(' anInstance := T%s.Create(nil);', [fService.Info.Name]))
+ else Write(Format(' anInstance := T%s.Create;', [fService.Info.Name]));
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('{ %s }', [fService.Info.Name]));
+{ Write(Format('function New%s(const aClientID : TGUID; UseClassFactory : boolean = TRUE) : I%s;', [fService.Info.Name, fService.Info.Name]));
+ Write('var');
+ Write(' lUnknown: IUnknown;');
+ Write(' lClassFactorty: IROClassFactory;');
+ Write('begin');
+ Write(' result := nil;');
+ Write(' if UseClassFactory then begin');
+ Write(Format(' lClassFactorty := FindClassFactory(''%s'');', [fService.Info.Name]));
+ Write(' lClassFactorty.CreateInstance(aClientID, lUnknown);');
+ Write(' end');
+ Write(Format(' else Create_%s(lUnknown);', [fService.Info.Name]));
+ WriteEmptyLine;
+ Write(Format(' result := lUnknown as I%s;', [fService.Info.Name]));
+ Write('end;');
+
+ WriteEmptyLine;}
+
+ if Assigned(fService.Default) then begin
+ for i := 0 to fService.Default.Count-1 do
+ WriteOperationImplementation(fService.Default.Items[i]);
+ end;
+
+ s := fService.Info.Name;
+ Write('var');
+ write(' fClassFactory: IROClassFactory;');
+ Write('initialization');
+ Write('{$IFDEF FPC}');
+ Write(Format(' {$I %s.lrs}',[lFileName]));
+ Write('{$ENDIF}');
+
+ Write(Format(' fClassFactory := TROClassFactory.Create(''%s'', Create_%s, T%s_Invoker);', [s,s,s]));
+ Write(Format(' // RegisterForZeroConf(fClassFactory,''_%s_rosdk._tcp.'');', [s]));
+ if lIsHydraModule then Write(' THYROFactory.Create(HInstance, fClassFactory);');
+ WriteEmptyLine;
+ Write('finalization');
+ write(' UnRegisterClassFactory(fClassFactory);');
+ write(' fClassFactory := nil;');
+ WriteEmptyLine;
+ Write('end.');
+ s := buffer.Text;
+end;
+
+procedure TRODLToImpl.WriteServiceDeclaration(const aService : TRODLService);
+var i : integer;
+begin
+ Write(Format('{ T%s }', [aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ if aService.Ancestor <> '' then begin
+ if Assigned(fAncestorService) and (fAncestorService.ImplClass <> '') then
+ Write(Format('T%s = class(%s, I%s)', [aService.Info.Name, fAncestorService.ImplClass, aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1)
+ else
+ Write(Format('T%s = class(T%s, I%s)', [aService.Info.Name, aService.Ancestor, aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ if WriteDataModule then
+ Write(Format('T%s = class(%s, I%s)', [aService.Info.Name, ServerClassName, aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1)
+ else
+ Write(Format('T%s = class(TRORemotable, I%s)', [aService.Info.Name, aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ Write('private',PASCAL_INDENTATION_LEVEL_1);
+ Write('protected',PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('{ I%s methods }', [aService.Info.Name]), PASCAL_INDENTATION_LEVEL_2);
+ for i := 0 to (aService.Default.Count-1) do
+ Write(Format(GetOperationDefinition(aService.Default.Items[i]), []), PASCAL_INDENTATION_LEVEL_2);
+
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+end;
+
+function TRODLToImpl.ValidateTargetEntity(
+ const aLibrary: TRODLLIbrary; const aTargetEntity: string): boolean;
+var i : integer;
+begin
+ result := FALSE;
+
+ for i := 0 to (aLibrary.ServiceCount-1) do
+ if (CompareText(aLibrary.Services[i].Info.Name, aTargetEntity)=0) then begin
+ fService := aLibrary.Services[i]; // Will be used later
+ result := TRUE;
+ Exit;
+ end;
+end;
+
+constructor TRODLToImpl.Create(const aLibrary: TRODLLibrary;
+ const aTargetEntity: string);
+begin
+ inherited Create(aLibrary, aTargetEntity);
+ fDFMExtension := '.dfm';
+end;
+
+procedure TRODLToImpl.WriteOperationImplementation(const anOperation: TRODLOperation);
+var
+ i : integer;
+ lCode:TStrings;
+begin
+ Write(GetOperationDefinition(anOperation, 'T'+fService.Info.Name));
+ lCode := anOperation.CodeBodies['Delphi'];
+ if Assigned(lCode) then begin
+ WriteLines(lCode.Text);
+ end
+ else begin
+ Write('begin');
+ Write('end;');
+ end;
+
+
+ for i := 0 to (anOperation.Count-1) do begin
+ end;
+
+ WriteEmptyLine;
+end;
+
+class function TRODLToImpl.GetTargetFileName(
+ const aLibrary: TRODLLIbrary; const aTargetEntity: string): string;
+begin
+ result := aTargetEntity+'_Impl.pas';
+end;
+
+procedure TRODLToImpl.SetServerClassName(const Value: string);
+begin
+ fServerClassName := Value;
+end;
+
+function TRODLToImpl.GetWriteDataModule: boolean;
+begin
+ result := (fServerClassName <> TRORemotable.ClassName);
+end;
+
+end.
+
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalIntf.pas b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalIntf.pas
new file mode 100644
index 0000000..3903547
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalIntf.pas
@@ -0,0 +1,2144 @@
+unit uRODLToPascalIntf;
+
+{----------------------------------------------------------------------------}
+{ RemObjects SDK Library - CodeGen }
+{ }
+{ compiler: Delphi 5 and up, Kylix 2 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the RemObjects SDK }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFNDEF MSWINDOWS}
+{$I ../RemObjects.inc}
+{$ELSE}
+{$I ..\RemObjects.inc}
+{$ENDIF}
+
+interface
+
+uses Classes, uRODL;
+
+type { TRODLToIntf }
+ TRODLToIntf = class(TRODLConverter)
+ private
+ fUnitName : string;
+
+ procedure WriteTypeDeclaration(aLibrary: TRODLLibrary; aType: TRODLEntity);
+ procedure WriteServiceDeclaration(aService: TRODLService);
+ procedure WriteEventSinkDeclaration(aEventSink: TRODLEventSink);
+ procedure WriteCoClass(aLibrary : TRODLLibrary; aService: TRODLService);
+ procedure WriteServiceConsts(aService : TRODLService);
+ procedure WriteArraySerializer(aLibrary : TRODLLibrary; anArray : TRODLArray);
+ procedure WriteStructPropMethods(aLibrary : TRODLLibrary; aStruct: TRODLStruct);
+ procedure WriteAttributesMethods(anEntity: TRODLEntity);
+
+ procedure WriteDocumentation(aInfo: TRODLEntity);
+
+ function IsSOAPService(aService : TRODLService) : boolean;
+ procedure WriteEventSink(aLibrary : TRODLLibrary; aEventSink: TRODLEventSink);
+ procedure GetInheritedExceptionFields(const aLibrary: TRODLLibrary; anException: TRODLException; aList: TList);
+ function AdjustParamList(const aParamList: string; Indentation: integer): string;
+ procedure WriteOperationDocumentation(anOperation:TRODLOperation; IndentationLevel : integer);
+ protected
+ procedure IntConvert(const aLibrary : TRODLLibrary; const aTargetEntity : string = ''); override;
+
+ public
+ constructor Create(const aLibraryFile:string; iUnitName:string=''); reintroduce; overload; virtual;
+ constructor Create(const aLibrary : TRODLLibrary; iUnitName:string=''); reintroduce; overload; virtual;
+ class function GetTargetFileName(const aLibrary : TRODLLibrary; const aTargetEntity : string = ''): string; override;
+
+ end;
+
+function GetDataType(const aType: string): String;
+function GetAttributes(atOperation, atService, atLibrary: TStrings; Ident: Integer): string;
+
+implementation
+
+uses SysUtils, uROTypes,
+ {$IFDEF DELPHI5}
+ ComObj,
+ {$ENDIF}
+ uRODLGenTools, uRODLToPascal, uROClasses, uROSerializer;
+
+{ TRODLToIntf }
+
+function GetDataType(const aType: string): String;
+begin
+ case StrToDataType(aType) of
+ rtXML: result := 'IXmlNode';
+ else
+ result := aType;
+ end;
+end;
+
+constructor TRODLToIntf.Create(const aLibraryFile: string; iUnitName: string);
+begin
+ fUnitName := iUnitName;
+ inherited Create(aLibraryFile);
+end;
+
+constructor TRODLToIntf.Create(const aLibrary: TRODLLibrary; iUnitName: string);
+begin
+ fUnitName := iUnitName;
+ inherited Create(aLibrary);
+end;
+
+procedure TRODLToIntf.GetInheritedExceptionFields(const aLibrary: TRODLLibrary;
+ anException: TRODLException; aList: TList);
+var ex : TRODLException;
+ i : integer;
+begin
+ aList.Clear;
+ ex := anException;
+
+ repeat
+ ex := aLibrary.FindException(ex.Ancestor);
+ if (ex=NIL) then Exit;
+
+ for i := (ex.Count-1) downto 0 do
+ aList.Insert(0, ex[i]);
+
+ until 1=2;
+end;
+
+function TRODLToIntf.AdjustParamList(const aParamList : string; Indentation : integer) : string;
+var i, k, cnt : integer;
+begin
+ result := aParamList;
+ cnt := 1;
+ i := 1;
+
+ while (i80) and ((result[i-1]=';') or (result[i-1]=',')) then begin
+ cnt := 1;
+ Insert(#13#10, result, i);
+ for k := 1 to Indentation do begin
+ Insert(#32, result, i+2);
+ end;
+ Inc(i, Indentation+2);
+ end;
+ end;
+end;
+
+procedure TRODLToIntf.IntConvert(const aLibrary: TRODLLibrary; const aTargetEntity: string);
+var l, x, i, k : integer;
+ s, s2: string;
+ fulllist: TStrings;
+ svc : TRODLService;
+ roexception : TRODLException;
+ roexceptionEntityList: IROStrings;
+ roexceptionEntity: TRODLTypedEntity;
+ inheritedfields : TList;
+ lPascalIndentationLevel: Integer;
+begin
+ inheritedfields := TList.Create;
+ try
+ if fUnitName = '' then begin
+ fUnitName := ChangeFileExt(GetTargetFileName(aLibrary), '');
+ end;
+
+ Write(Format('unit %s;', [fUnitName]));
+ WriteEmptyLine;
+
+ WriteLines(IntfInvkNotice);
+ WriteEmptyLine;
+
+ Write('{$I RemObjects.inc}');
+ WriteEmptyLine;
+
+ Write('interface');
+ WriteEmptyLine;
+
+ Write('uses');
+ Write('{vcl:} Classes, TypInfo,',PASCAL_INDENTATION_LEVEL_1);
+
+ if aLibrary.UseCount > 0 then begin
+ Write('{RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf,',PASCAL_INDENTATION_LEVEL_1);
+
+ s := '';
+ l := 0;
+
+ fulllist := TStringList.Create;
+ try
+ for i := 0 to aLibrary.UseCount-1 do begin
+
+ if aLibrary.Use[i].LoadedRodlLibraryName <> '' then
+ s2 := aLibrary.Use[i].LoadedRodlLibraryName + '_Intf'
+ else
+ s2 := ChangeFileExt(ExtractFilename(aLibrary.Use[i].RodlFile),'')+'_Intf';
+ if fulllist.IndexOf(s2) > -1 then
+ Continue;
+
+ if s <> '' then s := s+', ';
+ Inc(l, Length(s2));
+
+ s := s+s2;
+ fulllist.Add(s2);
+
+ if (l>80) then begin
+
+ if i <> aLibrary.UseCount -1 then s := s+ ',';
+
+ Write('{Used RODLs:} '+ s,PASCAL_INDENTATION_LEVEL_1);
+ s := '';
+ l := 0;
+
+ end;
+
+ end; { for }
+ finally
+ FreeAndNil(fulllist);
+ end;
+ s := s+';';
+
+ Write('{Used RODLs:} '+
+
+ s,PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write('{RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf;',PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+
+ WriteEmptyLine;
+
+ Write('const');
+ Write('{ Library ID }',PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('LibraryUID = ''%s'';', [GUIDToString(aLibrary.Info.UID)]),PASCAL_INDENTATION_LEVEL_1);
+ if (aLibrary.Info.Attributes.Values['Wsdl']<>'')
+ then Write(Format('WSDLLocation = ''%s'';', [aLibrary.Info.Attributes.Values['Wsdl']]),PASCAL_INDENTATION_LEVEL_1);
+
+
+ Write(Format('TargetNamespace = ''%s'';', [aLibrary.Info.Attributes.Values['TargetNamespace']]),PASCAL_INDENTATION_LEVEL_1);
+
+ WriteEmptyLine;
+
+ Write('{ Service Interface ID''s }',PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to (aLibrary.Count-1) do
+ if (aLibrary.Items[i] is TRODLService) and not aLibrary.Items[i].IsFromUsedRodl then begin
+ svc := TRODLService(aLibrary.Items[i]);
+ Write('I'+aLibrary.Items[i].Info.Name+'_IID : TGUID = '''+GUIDToString(svc.Default.Info.UID)+''';' ,PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ for i := 0 to (aLibrary.ServiceCount-1) do begin
+ if not aLibrary.Services[i].IsFromUsedRodl then begin
+ WriteServiceConsts(aLibrary.Services[i]);
+ end;
+ end;
+ WriteEmptyLine();
+
+ {-------- Events ----------}
+ Write('{ Event ID''s }',PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to (aLibrary.EventSinkCount-1) do begin
+ if not aLibrary.EventSinks[i].IsFromUsedRodl then begin
+ Write(Format('EID_%s = ''%s'';', [aLibrary.EventSinks[i].Info.Name, aLibrary.EventSinks[i].Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+ end;
+ WriteEmptyLine();
+ {--------------------------}
+
+ if (aLibrary.Count > 0) then begin
+ Write('type');
+ Write(' TSeekOrigin = Classes.TSeekOrigin; // fake declaration');
+ end;
+
+ with aLibrary do begin
+ // Forward declarations
+ Write('{ Forward declarations }',PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to (aLibrary.ServiceCount-1) do if (not aLibrary.Services[i].IsFromUsedRodl) then
+ Write(Format('I%s = interface;', [aLibrary.Services[i].Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ if aLibrary.ServiceCount>0 then WriteEmptyLine;
+
+ for i := 0 to (aLibrary.ArrayCount-1) do if (not aLibrary.Arrays[i].IsFromUsedRodl) then
+ Write(Format('%s = class;', [aLibrary.Arrays[i].Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ if aLibrary.ArrayCount>0 then WriteEmptyLine;
+
+ for i := 0 to (aLibrary.StructCount-1) do if (not aLibrary.Structs[i].IsFromUsedRodl) then
+ Write(Format('%s = class;', [aLibrary.Structs[i].Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ if aLibrary.StructCount>0 then WriteEmptyLine;
+
+ for i := 0 to (aLibrary.ExceptionCount-1) do if (not aLibrary.Exceptions[i].IsFromUsedRodl) then
+ Write(Format('%s = class;',[aLibrary.Exceptions[i].Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ if aLibrary.ExceptionCount>0 then WriteEmptyLine;
+
+ for i := 0 to (aLibrary.EventSinkCount-1) do if not aLibrary.EventSinks[i].IsFromUsedRodl then
+ Write(Format('I%s = interface;', [aLibrary.EventSinks[i].Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ if aLibrary.EventSinkCount>0 then WriteEmptyLine;
+
+ WriteEmptyLine;
+
+ if (EnumCount > 0) then begin
+ Write('{ Enumerateds }', PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to (EnumCount-1) do
+ if (not aLibrary.Enums[i].IsFromUsedRodl) then with Enums[i] do begin
+ WriteDocumentation(aLibrary.Enums[i]);
+ lPascalIndentationLevel := PASCAL_INDENTATION_LEVEL_1;
+ s := Info.Name+' = (';
+ l := Length(s);
+ for x := 0 to (Count-1) do begin
+ if PrefixEnumValues then
+ s2 := Info.Name+'_'+Items[x].Info.Name
+ else
+ s2 := Items[x].Info.Name;
+ s2 := s2 + ',';
+ Inc(l, Length(s2));
+ s := s + s2;
+ if (l>80) and (x <> Count-1) then begin
+ Write(s, lPascalIndentationLevel);
+ lPascalIndentationLevel := PASCAL_INDENTATION_LEVEL_3;
+ s := '';
+ l := 0;
+ end;
+ end;
+ System.Delete(s,Length(s),1);
+ s := s+');';
+
+ Write(s, lPascalIndentationLevel);
+ end;
+ WriteEmptyLine;
+ end;
+
+ end;
+
+ with aLibrary.CalcStructOrder() do begin
+ for i := 0 to (Count-1) do //if (not aLibrary.Services[i].IsFromUsedRodl) then
+ WriteTypeDeclaration(aLibrary, Objects[i] as TRODLStruct);
+ end;
+ //for i := 0 to (aLibrary.StructCount-1) do if (not aLibrary.Structs[i].IsFromUsedRodl) then
+ //WriteTypeDeclaration(aLibrary, aLibrary.Structs[i]);
+
+ for i := 0 to (aLibrary.ArrayCount-1) do if (not aLibrary.Arrays[i].IsFromUsedRodl) then
+ WriteTypeDeclaration(aLibrary, aLibrary.Arrays[i]);
+
+ if aLibrary.ExceptionCount > 0 then begin
+ Write('{ Exceptions }',PASCAL_INDENTATION_LEVEL_1);
+
+ with aLibrary.CalcExceptionOrder() do begin
+ for i := 0 to (Count-1) do begin
+ roexception := (Objects[i] as TRODLException);
+ GetInheritedExceptionFields(aLibrary, roexception, inheritedfields);
+
+ WriteDocumentation(roexception.Info);
+ if roexception.Ancestor <> '' then
+ Write(Format('%s = class(%s)',[roexception.Info.Name, roexception.Ancestor]),PASCAL_INDENTATION_LEVEL_1)
+ else
+ Write(Format('%s = class(EROException)',[roexception.Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+
+ Write('private', PASCAL_INDENTATION_LEVEL_1);
+ for k := 0 to (roexception.Count-1) do begin
+ Write(Format('f%s: %s;', [roexception[k].Name, GetDataType(roexception[k].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ Write('public', PASCAL_INDENTATION_LEVEL_1);
+
+ if roexception.Attributes.Count > 0 then begin
+ Write('class function GetAttributeCount: Integer; override;', PASCAL_INDENTATION_LEVEL_2);
+ Write('class function GetAttributeName(aIndex: Integer): string; override;', PASCAL_INDENTATION_LEVEL_2);
+ Write('class function GetAttributeValue(aIndex: Integer): string; override;', PASCAL_INDENTATION_LEVEL_2);
+ if (roexception.Count > 0) then WriteEmptyLine;
+ end;
+
+ if (roexception.Count>0) then begin
+ s := 'constructor Create(anExceptionMessage : string; ';
+ for k := 0 to (inheritedfields.Count-1) do
+ s := s+Format('a%s: %s; ', [TRODLTypedEntity(inheritedfields[k]).Name, GetDataType(TRODLTypedEntity(inheritedfields[k]).DataType)]);
+ for k := 0 to (roexception.Count-1) do
+ s := s+Format('a%s: %s; ', [roexception[k].Name, GetDataType(roexception[k].DataType)]);
+ s := Copy(s,1,Length(s)-2)+');';
+ Write(AdjustParamList(s, PASCAL_INDENTATION_LEVEL_3), PASCAL_INDENTATION_LEVEL_2);
+ roexceptionEntityList:=roexception.CalcItemsMarshalingOrder(True);
+ if (roexception.Count>0) and (roexceptionEntityList.Count > 0) then begin
+ Write(' procedure ReadException(ASerializer: TObject); override;', PASCAL_INDENTATION_LEVEL_1);
+ Write(' procedure WriteException(ASerializer: TObject); override;', PASCAL_INDENTATION_LEVEL_1);
+ end;
+ roexceptionEntityList:=nil;
+ end;
+
+ Write('published', PASCAL_INDENTATION_LEVEL_1);
+
+ for k := 0 to (roexception.Count-1) do begin
+ WriteDocumentation(roexception[k]);
+ Write(Format('property %s: %s read f%s write f%s;',
+ [roexception[k].Name, GetDataType(roexception[k].DataType),
+ roexception[k].Name, roexception[k].Name]),
+ PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ end;
+ end;
+
+ {for i := 0 to (aLibrary.ExceptionCount-1) do if (not aLibrary.Exceptions[i].IsFromUsedRodl) then begin
+ WriteDocumentation(aLibrary.Exceptions[i].Info);
+ if aLibrary.Exceptions[i].Ancestor <> '' then
+ Write(Format('%s = class(%s);',[aLibrary.Exceptions[i].Info.Name, aLibrary.Exceptions[i].Ancestor]),PASCAL_INDENTATION_LEVEL_1)
+ else
+ Write(Format('%s = class(EROException);',[aLibrary.Exceptions[i].Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end; }
+ WriteEmptyLine;
+ end;
+
+ with aLibrary.CalcServiceOrder() do begin
+ for i := 0 to (Count-1) do //if (not aLibrary.Services[i].IsFromUsedRodl) then
+ WriteServiceDeclaration(Objects[i] as TRODLService);
+ end;
+
+ {-------- Events ----------}
+ //ToDo -omh: This should use a CalcServerEventsOrder method which is currently not present in uRODL.pas
+ with aLibrary do begin
+ for i := 0 to EventSinkCount-1 do begin
+ if aLibrary.EventSinks[i].IsFromUsedRodl then Continue;
+
+ WriteEventSinkDeclaration(aLibrary.EventSinks[i]);
+ end;
+ end;
+ {--------------------------}
+
+ {for i := 0 to (aLibrary.ServiceCount-1) do if (not aLibrary.Services[i].IsFromUsedRodl) then
+ WriteServiceDeclaration(aLibrary.Services[i]);}
+
+ //WriteEmptyLine;
+
+ Write('implementation');
+ WriteEmptyLine;
+
+ Write('uses');
+ Write('{vcl:} SysUtils,',PASCAL_INDENTATION_LEVEL_1);
+ Write('{RemObjects:} uROEventRepository, uROSerializer, uRORes;',PASCAL_INDENTATION_LEVEL_1);
+
+ WriteEmptyLine;
+
+ with aLibrary.CalcExceptionOrder() do begin
+ for i := 0 to (Count-1) do begin
+ roexception := (Objects[i] as TRODLException);
+ if (roexception.Count = 0) and (roexception.Attributes.Count = 0) then
+ Continue;
+
+ Write('{ '+roexception.Name+' }');
+ WriteEmptyLine;
+
+ if roexception.Attributes.Count > 0 then
+ WriteAttributesMethods(roexception);
+
+ if (roexception.Count=0) then Continue;
+ GetInheritedExceptionFields(aLibrary, roexception, inheritedfields);
+
+ s := 'constructor '+roexception.Name+'.Create(anExceptionMessage : string; ';
+ for k := 0 to (inheritedfields.Count-1) do
+ s := s+Format('a%s: %s; ', [TRODLTypedEntity(inheritedfields[k]).Name, GetDataType(TRODLTypedEntity(inheritedfields[k]).DataType)]);
+
+ for k := 0 to (roexception.Count-1) do
+ s := s+Format('a%s: %s; ', [roexception[k].Name, GetDataType(roexception[k].DataType)]);
+ s := Copy(s,1,Length(s)-2)+');';
+ Write(AdjustParamList(s, 1));
+
+ Write('begin');
+ s := ' inherited Create(anExceptionMessage';
+ for k := 0 to (inheritedfields.Count-1) do
+ s := s+Format(', a%s', [TRODLTypedEntity(inheritedfields[k]).Name]);
+ s := s+');';
+ Write(AdjustParamList(s, 10));
+
+ WriteEmptyLine;
+
+ for k := 0 to (roexception.Count-1) do begin
+ Write(Format(' f%s := a%s;', [roexception[k].Name, roexception[k].Name]));
+ end;
+
+ Write('end;');
+
+ roexceptionEntityList:=roexception.CalcItemsMarshalingOrder(True);
+ if (roexception.Count>0) and (roexceptionEntityList.Count > 0) then begin
+ WriteEmptyLine;
+ Write('procedure '+roexception.Name+'.ReadException(ASerializer: TObject);');
+ if roexceptionEntityList.Count > 0 then Write('var');
+ For k:=0 to roexceptionEntityList.Count - 1 do
+ with TRODLTypedEntity(roexceptionEntityList.Objects[k]) do
+ Write(Format(' l_%s: %s;',[Name, GetDataType(DataType)]));
+ Write('begin');
+ Write(' if TROSerializer(ASerializer).RecordStrictOrder then begin');
+ if roexception.Count <> roexceptionEntityList.Count then
+ Write(' inherited;');
+ for k := 0 to (roexception.Count-1) do begin
+ roexceptionEntity:= roexception[k];
+ Write(Format(' l_%s := %0:s;',[roexceptionEntity.Name]));
+ case StrToDataType(roexceptionEntity.DataType) of
+ rtInteger: Write(Format(' TROSerializer(ASerializer).ReadInteger(''%s'', otSLong, l_%0:s);',[roexceptionEntity.Name]));
+ rtDateTime: Write(Format(' TROSerializer(ASerializer).ReadDateTime(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtDouble: Write(Format(' TROSerializer(ASerializer).ReadDouble(''%s'', ftDouble, l_%0:s);',[roexceptionEntity.Name]));
+ rtCurrency: Write(Format(' TROSerializer(ASerializer).ReadDouble(''%s'', ftCurr, l_%0:s);',[roexceptionEntity.Name]));
+ rtWidestring: Write(Format(' TROSerializer(ASerializer).ReadWideString(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtString: Write(Format(' TROSerializer(ASerializer).ReadAnsiString(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtUTF8String: Write(Format(' TROSerializer(ASerializer).ReadUTF8String(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtInt64: Write(Format(' TROSerializer(ASerializer).ReadInt64(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtBoolean: Write(Format(' TROSerializer(ASerializer).ReadEnumerated(''%s'',TypeInfo(boolean), l_%0:s);',[roexceptionEntity.Name]));
+ rtVariant: Write(Format(' TROSerializer(ASerializer).ReadVariant(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtXML: Write(Format(' TROSerializer(ASerializer).ReadXML(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtGuid: Write(Format(' TROSerializer(ASerializer).ReadGuid(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtDecimal: Write(Format(' TROSerializer(ASerializer).ReadDecimal(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtBinary: Write(Format(' TROSerializer(ASerializer).ReadBinary(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtXsDateTime: Write(Format(' TROSerializer(ASerializer).ReadStruct(''%s'', %s, l_%0:s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]));
+ rtUserDefined:
+ if aLibrary.FindArray(roexceptionEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).ReadArray(''%s'', %s, l_%0:s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]))
+ else if aLibrary.FindEnum(roexceptionEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).ReadEnumerated(''%s'',TypeInfo(%s), l_%0:s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]))
+ else
+ Write(Format(' TROSerializer(ASerializer).ReadStruct(''%s'', %s, l_%0:s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]));
+ end;
+ if (StrToDataType(roexceptionEntity.DataType) in [rtBinary, rtUserDefined, rtXsDateTime]) and (aLibrary.FindEnum(roexceptionEntity.DataType) = nil) then
+ Write(Format(' if %s <> l_%0:s then %0:s.Free;',[roexceptionEntity.Name]));
+ Write(Format(' %s := l_%0:s;',[roexceptionEntity.Name]));
+ end;
+ Write(' end');
+ Write(' else begin');
+ for k := 0 to (roexceptionEntityList.Count-1) do begin
+ roexceptionEntity:= TRODLTypedEntity(roexceptionEntityList.Objects[k]);
+ Write(Format(' l_%s := %0:s;',[roexceptionEntity.Name]));
+ case StrToDataType(roexceptionEntity.DataType) of
+ rtInteger: Write(Format(' TROSerializer(ASerializer).ReadInteger(''%s'', otSLong, l_%0:s);',[roexceptionEntity.Name]));
+ rtDateTime: Write(Format(' TROSerializer(ASerializer).ReadDateTime(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtDouble: Write(Format(' TROSerializer(ASerializer).ReadDouble(''%s'', ftDouble, l_%0:s);',[roexceptionEntity.Name]));
+ rtCurrency: Write(Format(' TROSerializer(ASerializer).ReadDouble(''%s'', ftCurr, l_%0:s);',[roexceptionEntity.Name]));
+ rtWidestring: Write(Format(' TROSerializer(ASerializer).ReadWideString(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtString: Write(Format(' TROSerializer(ASerializer).ReadAnsiString(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtUTF8String: Write(Format(' TROSerializer(ASerializer).ReadUTF8String(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtInt64: Write(Format(' TROSerializer(ASerializer).ReadInt64(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtBoolean: Write(Format(' TROSerializer(ASerializer).ReadEnumerated(''%s'',TypeInfo(boolean), l_%0:s);',[roexceptionEntity.Name]));
+ rtVariant: Write(Format(' TROSerializer(ASerializer).ReadVariant(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtXML: Write(Format(' TROSerializer(ASerializer).ReadXML(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtGuid: Write(Format(' TROSerializer(ASerializer).ReadGuid(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtDecimal: Write(Format(' TROSerializer(ASerializer).ReadDecimal(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtBinary: Write(Format(' TROSerializer(ASerializer).ReadBinary(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtXsDateTime: Write(Format(' TROSerializer(ASerializer).ReadStruct(''%s'', %s, l_%0:s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]));
+ rtUserDefined:
+ if aLibrary.FindArray(roexceptionEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).ReadArray(''%s'', %s, l_%0:s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]))
+ else if aLibrary.FindEnum(roexceptionEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).ReadEnumerated(''%s'',TypeInfo(%s), l_%0:s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]))
+ else
+ Write(Format(' TROSerializer(ASerializer).ReadStruct(''%s'', %s, l_%0:s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]));
+ end;
+ if (StrToDataType(roexceptionEntity.DataType) in [rtBinary, rtUserDefined, rtXsDateTime]) and (aLibrary.FindEnum(roexceptionEntity.DataType) = nil) then
+ Write(Format(' if %s <> l_%0:s then %0:s.Free;',[roexceptionEntity.Name]));
+ Write(Format(' %s := l_%0:s;',[roexceptionEntity.Name]));
+ end;
+ Write(' end;');
+ Write('end;');
+
+
+ WriteEmptyLine;
+ Write('procedure '+roexception.Name+'.WriteException(ASerializer: TObject);');
+ if roexceptionEntityList.Count > 0 then Write('var');
+ For k:=0 to roexceptionEntityList.Count - 1 do
+ with TRODLTypedEntity(roexceptionEntityList.Objects[k]) do
+ Write(Format(' l_%s: %s;',[Name, GetDataType(DataType)]));
+ Write('begin');
+ Write(' if TROSerializer(ASerializer).RecordStrictOrder then begin');
+ if roexception.Count <> roexceptionEntityList.Count then
+ Write('inherited;', PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('TROSerializer(ASerializer).ChangeClass(%s);', [roexception.Name]), PASCAL_INDENTATION_LEVEL_2);
+ for k := 0 to (roexception.Count-1) do begin
+ roexceptionEntity:= roexception[k];
+ Write(Format(' l_%s := %0:s;',[roexceptionEntity.Name]));
+ case StrToDataType(roexceptionEntity.DataType) of
+ rtInteger: Write(Format(' TROSerializer(ASerializer).WriteInteger(''%s'', otSLong, l_%0:s);',[roexceptionEntity.Name]));
+ rtDateTime: Write(Format(' TROSerializer(ASerializer).WriteDateTime(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtDouble: Write(Format(' TROSerializer(ASerializer).WriteDouble(''%s'', ftDouble, l_%0:s);',[roexceptionEntity.Name]));
+ rtCurrency: Write(Format(' TROSerializer(ASerializer).WriteDouble(''%s'', ftCurr, l_%0:s);',[roexceptionEntity.Name]));
+ rtWidestring: Write(Format(' TROSerializer(ASerializer).WriteWideString(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtString: Write(Format(' TROSerializer(ASerializer).WriteAnsiString(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtUTF8String: Write(Format(' TROSerializer(ASerializer).WriteUTF8String(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtInt64: Write(Format(' TROSerializer(ASerializer).WriteInt64(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtBoolean: Write(Format(' TROSerializer(ASerializer).WriteEnumerated(''%s'',TypeInfo(boolean), l_%0:s);',[roexceptionEntity.Name]));
+ rtVariant: Write(Format(' TROSerializer(ASerializer).WriteVariant(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtXML: Write(Format(' TROSerializer(ASerializer).WriteXML(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtGuid: Write(Format(' TROSerializer(ASerializer).WriteGuid(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtDecimal: Write(Format(' TROSerializer(ASerializer).WriteDecimal(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtBinary: Write(Format(' TROSerializer(ASerializer).WriteBinary(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtXsDateTime: Write(Format(' TROSerializer(ASerializer).WriteStruct(''%s'', l_%0:s, %s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]));
+ rtUserDefined:
+ if aLibrary.FindArray(roexceptionEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).WriteArray(''%s'', l_%0:s, %s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]))
+ else if aLibrary.FindEnum(roexceptionEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).WriteEnumerated(''%s'',TypeInfo(%s), l_%0:s);',[roexceptionEntity.Name,roexceptionEntity.DataType]))
+ else
+ Write(Format(' TROSerializer(ASerializer).WriteStruct(''%s'', l_%0:s, %s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]))
+ end;
+ end;
+ Write(' end');
+ Write(' else begin');
+ for k := 0 to (roexceptionEntityList.Count-1) do begin
+ roexceptionEntity:= TRODLTypedEntity(roexceptionEntityList.Objects[k]);
+ Write(Format(' l_%s := %0:s;',[roexceptionEntity.Name]));
+ case StrToDataType(roexceptionEntity.DataType) of
+ rtInteger: Write(Format(' TROSerializer(ASerializer).WriteInteger(''%s'', otSLong, l_%0:s);',[roexceptionEntity.Name]));
+ rtDateTime: Write(Format(' TROSerializer(ASerializer).WriteDateTime(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtDouble: Write(Format(' TROSerializer(ASerializer).WriteDouble(''%s'', ftDouble, l_%0:s);',[roexceptionEntity.Name]));
+ rtCurrency: Write(Format(' TROSerializer(ASerializer).WriteDouble(''%s'', ftCurr, l_%0:s);',[roexceptionEntity.Name]));
+ rtWidestring: Write(Format(' TROSerializer(ASerializer).WriteWideString(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtString: Write(Format(' TROSerializer(ASerializer).WriteAnsiString(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtUTF8String: Write(Format(' TROSerializer(ASerializer).WriteUTF8String(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtInt64: Write(Format(' TROSerializer(ASerializer).WriteInt64(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtBoolean: Write(Format(' TROSerializer(ASerializer).WriteEnumerated(''%s'',TypeInfo(boolean), l_%0:s);',[roexceptionEntity.Name]));
+ rtVariant: Write(Format(' TROSerializer(ASerializer).WriteVariant(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtXML: Write(Format(' TROSerializer(ASerializer).WriteXML(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtGuid: Write(Format(' TROSerializer(ASerializer).WriteGuid(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtDecimal: Write(Format(' TROSerializer(ASerializer).WriteDecimal(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtBinary: Write(Format(' TROSerializer(ASerializer).WriteBinary(''%s'', l_%0:s);',[roexceptionEntity.Name]));
+ rtXsDateTime: Write(Format(' TROSerializer(ASerializer).WriteStruct(''%s'', l_%0:s, %s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]));
+ rtUserDefined:
+ if aLibrary.FindArray(roexceptionEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).WriteArray(''%s'', l_%0:s,%s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]))
+ else if aLibrary.FindEnum(roexceptionEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).WriteEnumerated(''%s'',TypeInfo(%s), l_%0:s);',[roexceptionEntity.Name,roexceptionEntity.DataType]))
+ else
+ Write(Format(' TROSerializer(ASerializer).WriteStruct(''%s'', l_%0:s,%s);',[roexceptionEntity.Name,GetDataType(roexceptionEntity.DataType)]))
+ end;
+ end;
+ Write(' end;');
+ Write('end;');
+ end;
+ roexceptionEntityList:=nil;
+ WriteEmptyLine;
+ end;
+ end;
+
+ for i := 0 to (aLibrary.ArrayCount-1) do if (not aLibrary.Arrays[i].IsFromUsedRodl) then
+ WriteArraySerializer(aLibrary, aLibrary.Arrays[i]);
+
+ for i := 0 to (aLibrary.StructCount-1) do if (not aLibrary.Structs[i].IsFromUsedRodl) then
+ WriteStructPropMethods(aLibrary, aLibrary.Structs[i]);
+
+ for i := 0 to (aLibrary.ServiceCount-1) do if (not aLibrary.Services[i].IsFromUsedRodl) then
+ WriteCoClass(aLibrary, aLibrary.Services[i]);
+
+ for i := 0 to (aLibrary.EventSinkCount-1) do if (not aLibrary.EventSinks[i].IsFromUsedRodl) then
+ WriteEventSink(aLibrary, aLibrary.EventSinks[i]);
+
+ Write('initialization');
+ for i := 0 to (aLibrary.Count-1) do
+ if ((aLibrary.Items[i] is TRODLArray) or (aLibrary.Items[i] is TRODLStruct)) and
+ (not aLibrary.Items[i].IsFromUsedRodl) then
+ Write(' RegisterROClass('+aLibrary.Items[i].Info.Name+');');
+
+ for i := 0 to (aLibrary.ExceptionCount-1) do if (not aLibrary.Exceptions[i].IsFromUsedRodl) then begin
+ Write(Format('RegisterExceptionClass(%s);',[aLibrary.Exceptions[i].Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ for i := 0 to (aLibrary.Count-1) do
+ if (aLibrary.Items[i] is TRODLService) and not aLibrary.Items[i].IsFromUsedRodl then begin
+ Write(' RegisterProxyClass(I'+aLibrary.Items[i].Info.Name+'_IID, T'+aLibrary.Items[i].Info.Name+'_Proxy);');
+ end;
+
+ WriteEmptyLine;
+ with aLibrary do
+ for i := 0 to EventSinkCount-1 do
+ if (not EventSinks[i].IsFromUsedRodl) then begin
+ Write(Format(' RegisterEventWriterClass(I%s_Writer, T%s_Writer);', [EventSinks[i].Info.Name, EventSinks[i].Info.Name]));
+ Write(Format(' RegisterEventInvokerClass(EID_%s, T%s_Invoker);', [EventSinks[i].Info.Name, EventSinks[i].Info.Name]));
+ end;
+
+ with aLibrary do
+ begin
+ for i := 0 to EnumCount-1 do
+ for k := 0 to Enums[i].Count - 1 do
+ Write(Format(' RegisterEnumMapping(TROEnumMapping.Create(''%s'', ''%s'', ''%s''));',
+ [Enums[i].Name, Enums[i].Items[k].Name, Enums[i].Items[k].OriginalName]));
+ end;
+
+ Write('');
+ Write('finalization');
+ for i := 0 to (aLibrary.Count-1) do
+ if ((aLibrary.Items[i] is TRODLArray) or (aLibrary.Items[i] is TRODLStruct)) and
+ (not aLibrary.Items[i].IsFromUsedRodl) then
+ Write(' UnregisterROClass('+aLibrary.Items[i].Info.Name+');');
+
+ for i := 0 to (aLibrary.ExceptionCount-1) do if (not aLibrary.Exceptions[i].IsFromUsedRodl) then begin
+ Write(Format('UnregisterExceptionClass(%s);',[aLibrary.Exceptions[i].Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ for i := 0 to (aLibrary.Count-1) do
+ if (aLibrary.Items[i] is TRODLService) and not aLibrary.Items[i].IsFromUsedRodl then begin
+ Write(' UnregisterProxyClass(I'+aLibrary.Items[i].Info.Name+'_IID);');
+ end;
+
+ WriteEmptyLine;
+ with aLibrary do
+ for i := 0 to EventSinkCount-1 do
+ if (not EventSinks[i].IsFromUsedRodl) then begin
+ Write(Format(' UnregisterEventWriterClass(I%s_Writer);', [EventSinks[i].Info.Name]));
+ Write(Format(' UnregisterEventInvokerClass(EID_%s);', [EventSinks[i].Info.Name]));
+ end;
+
+ WriteEmptyLine;
+ if aLibrary.EnumCount > 0 then Write(' UnRegisterEnumMappings();');
+
+ //WriteEmptyLine;
+
+ {Write('finalization');
+ for i := 0 to (aLibrary.Count-1) do
+ if (aLibrary.Items[i] is TRODLArray) or (aLibrary.Items[i] is TRODLStruct)
+ then Write(' UnRegisterClass('+aLibrary.Items[i].Info.Name+');');
+
+ WriteEmptyLine;}
+
+ Write('end.');
+
+ finally
+ inheritedfields.Free;
+ end;
+end;
+
+procedure TRODLToIntf.WriteServiceConsts(aService : TRODLService);
+begin
+ with aService.Info do
+ // Writes additional SOAP information
+ if IsSOAPService(aService) then begin
+ Write(Format(' %s_EndPointURI = ''%s'';', [Name, Attributes.Values['Location']]));
+
+ end;
+end;
+
+procedure TRODLToIntf.WriteDocumentation(aInfo:TRODLEntity);
+var lDocumentation:string;
+begin
+ if aInfo.Documentation <> '' then begin
+ lDocumentation := aInfo.Documentation;
+ if Length(lDocumentation) < 1000 then
+ ReplaceChar(lDocumentation,['}','{', #13, #10],' ')
+ else begin
+ ReplaceChar(lDocumentation,['}','{'],' ');
+ lDocumentation:=StringReplace(lDocumentation,#10, #10' ',[rfReplaceAll]);
+ end;
+
+ WriteEmptyLine;
+ Write('{ Description:',PASCAL_INDENTATION_LEVEL_1);
+ Write(' '+lDocumentation+' }',PASCAL_INDENTATION_LEVEL_1);
+ end;
+end;
+
+procedure TRODLToIntf.WriteOperationDocumentation(anOperation:TRODLOperation; IndentationLevel : integer);
+var lDocumentation:string;
+ i : integer;
+begin
+ if anOperation.Documentation <> '' then begin
+ lDocumentation := anOperation.Documentation;
+ if Length(lDocumentation) < 1000 then
+ ReplaceChar(lDocumentation,['}','{', #13, #10],' ')
+ else begin
+ ReplaceChar(lDocumentation,['}','{'],' ');
+ lDocumentation:=StringReplace(lDocumentation,#10, #10' ',[rfReplaceAll]);
+ end;
+
+ WriteEmptyLine;
+ Write('{ Description:',IndentationLevel);
+ Write(' '+lDocumentation,IndentationLevel);
+ if (anOperation.Result<>NIL) then begin
+ Write('');
+ Write(' Return Type: '+GetDataType(anOperation.Result.DataType),IndentationLevel);
+ end;
+ Write(' Params',IndentationLevel);
+ for i := 0 to (anOperation.Count-1) do begin
+ Write(' '+IntToStr(i+1)+') '+anOperation[i].Name+' ('+GetDataType(anOperation[i].DataType)+') : '+anOperation[i].Documentation,IndentationLevel);
+ end;
+
+ Write('}',IndentationLevel);
+ end;
+end;
+
+procedure TRODLToIntf.WriteServiceDeclaration(aService : TRODLService);
+var i : integer;
+begin
+ if not aService.IsFromUsedRodl then with aService.Default do begin
+ Write(Format('{ I%s }', [aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+
+ WriteDocumentation(aService);
+
+ if aService.Ancestor <> '' then begin
+ Write(Format('I%s = interface(I%s)', [aService.Info.Name,aService.Ancestor]), PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('I%s = interface', [aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write(Format('[''%s'']', [GUIDToString(Info.UID)]), PASCAL_INDENTATION_LEVEL_2);
+
+ for i := 0 to (Count-1) do begin
+ WriteOperationDocumentation(Items[i], PASCAL_INDENTATION_LEVEL_2);
+ Write(GetOperationDefinition(Items[i]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ Write(Format('{ Co%s }', [aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('Co%s = class', [aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): I%s;',
+ [aService.Info.Name]), PASCAL_INDENTATION_LEVEL_2);
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ Write(Format('{ T%s_Proxy }', [aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ if aService.Ancestor <> '' then begin
+ Write(Format('T%s_Proxy = class(T%s_Proxy, I%s)', [aService.Info.Name, aService.Ancestor, aService.Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('T%s_Proxy = class(TROProxy, I%s)', [aService.Info.Name, aService.Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+ //Write('private',PASCAL_INDENTATION_LEVEL_1);
+ Write('protected',PASCAL_INDENTATION_LEVEL_1);
+ //Write(' // Internal',PASCAL_INDENTATION_LEVEL_1);
+ Write(' function __GetInterfaceName:string; override;',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ //Write(Format(' // %s', [aService.Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+
+ for i := 0 to (Count-1) do
+ Write(GetOperationDefinition(Items[i]), PASCAL_INDENTATION_LEVEL_2);
+ Write('end;',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ end;
+end;
+
+procedure TRODLToIntf.WriteEventSinkDeclaration(aEventSink : TRODLEventSink);
+var i : integer;
+begin
+ if not aEventSink.IsFromUsedRodl then with aEventSink.Default do begin
+ { Client events }
+ Write(Format('{ I%s }', [aEventSink.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ WriteDocumentation(aEventSink);
+ if aEventSink.Ancestor <> '' then begin
+ Write(Format('I%s = interface(I%s)', [aEventSink.Info.Name,aEventSink.Ancestor]), PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('I%s = interface', [aEventSink.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write(Format('[''%s'']', [GUIDToString(Info.UID)]), PASCAL_INDENTATION_LEVEL_2);
+
+ for i := 0 to (Count-1) do begin
+ WriteOperationDocumentation(Items[i], PASCAL_INDENTATION_LEVEL_2);
+ Write(GetOperationDefinition(Items[i]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ { Events writer }
+ Write(Format('{ I%s_Writer }', [aEventSink.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ WriteDocumentation(aEventSink);
+ if aEventSink.Ancestor <> '' then begin
+ Write(Format('I%s_Writer = interface(I%s_Writer)', [aEventSink.Info.Name,aEventSink.Ancestor]), PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('I%s_Writer = interface(IROEventWriter)', [aEventSink.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write(Format('[''%s'']', [GUIDToString(Info.UID){GUIDToString(NewUID)}]), PASCAL_INDENTATION_LEVEL_2);
+
+ for i := 0 to (Count-1) do begin
+ Write(GetOperationDefinition(Items[i], '', '', TRUE), PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ end;
+end;
+
+procedure TRODLToIntf.WriteEventSink(aLibrary : TRODLLibrary; aEventSink : TRODLEventSink);
+
+ function isNeedObjectDisposer(AOperation: TRODLOperation):Boolean;
+ var
+ j: Integer;
+ begin
+ Result := False;
+ for j := 0 to AOperation.Count - 1 do begin
+ Result := not IsSimpleType(GetDataType(AOperation.Items[j].DataType), aLibrary);
+ if Result then Exit;
+ end;
+ end;
+
+var i, x : integer;
+ parline, typname : string;
+ par : TRODLOperationParam;
+ lNeedDisposer: Boolean;
+begin
+ if not aEventSink.IsFromUsedRodl then with aEventSink.Default do begin
+ { -------------------------- EVENT WRITER -------------------------- }
+ Write('type');
+
+ { Event writer class }
+ Write(Format('{ T%s_Writer }', [aEventSink.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ if aEventSink.Ancestor <> '' then begin
+ Write(Format('T%s_Writer = class(T%s_Writer, I%s_Writer)', [aEventSink.Info.Name, aEventSink.Ancestor, aEventSink.Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('T%s_Writer = class(TROEventWriter, I%s_Writer)', [aEventSink.Info.Name, aEventSink.Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+ //Write('private',PASCAL_INDENTATION_LEVEL_1);
+ Write('protected',PASCAL_INDENTATION_LEVEL_1);
+ //Write(' // Internal',PASCAL_INDENTATION_LEVEL_1);
+ //Write(Format(' // %s', [aEventSink.Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+
+ for i := 0 to (Count-1) do
+ Write(GetOperationDefinition(Items[i], '', '', TRUE), PASCAL_INDENTATION_LEVEL_2);
+ Write('end;',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ { Actual methods }
+ for i := 0 to (Count-1) do begin
+ Write(GetOperationDefinition(Items[i], 'T'+aEventSink.Info.Name+'_Writer', '', TRUE));
+ Write('var __eventdata : Binary;');
+
+ Write('begin');
+ Write(' __eventdata := Binary.Create;');
+ Write(' try');
+ Write(Format(' __Message.InitializeEventMessage(NIL, ''%s'', EID_%s, ''%s'');', [aLibrary.Name, aEventSink.Info.Name, Items[i].Info.Name]));
+
+ { Write parameters }
+ for x := 0 to (Items[i].Count-1) do begin
+ par := Items[i].Items[x];
+ typname := GetDataType(par.DataType);
+
+{ if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fIntfUnitName);
+ end;}
+ Write(Format(' __Message.Write(''%s'', TypeInfo(%s), %s, []);', [par.Name, typname, par.Name]));
+ end;
+
+ Write(' __Message.Finalize;');
+ WriteEmptyLine;
+ Write(' __Message.WriteToStream(__eventdata);');
+ WriteEmptyLine;
+ Write(' Repository.StoreEventData(__Sender, __eventdata, ExcludeSender, ExcludeSessionList, SessionList.CommaText);');
+ Write(' finally');
+ Write(' __eventdata.Free;');
+ Write(' end;');
+ Write('end;');
+ WriteEmptyLine;
+ end;
+
+ { -------------------------- INVOKER -------------------------- }
+ Write('type');
+
+ { Event invoker class }
+ Write(Format('{ T%s_Invoker }', [aEventSink.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ if aEventSink.Ancestor <> '' then begin
+ Write(Format('T%s_Invoker = class(T%s_Invoker)', [aEventSink.Info.Name, aEventSink.Ancestor]),PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('T%s_Invoker = class(TROEventInvoker)', [aEventSink.Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write('published',PASCAL_INDENTATION_LEVEL_1);
+
+ for i := 0 to (Count-1) do
+ Write('procedure Invoke_'+Items[i].Info.Name+'(__EventReceiver : TROEventReceiver; const __Message : IROMessage; const __Target : IUnknown);', PASCAL_INDENTATION_LEVEL_2);
+
+
+ Write('end;',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ { Actual methods }
+
+ for i := 0 to (Count-1) do begin
+ Write(Format('procedure T%s_Invoker.Invoke_%s(__EventReceiver : TROEventReceiver; const __Message : IROMessage; const __Target : IUnknown);',
+ [aEventSink.Info.Name, Items[i].Info.Name]));
+ //Write(GetOperationDefinition(Items[i], 'T'+aEventSink.Info.Name+'_Invoker', '', FALSE));
+
+ { Write local variables }
+ lNeedDisposer := isNeedObjectDisposer(Items[i]);
+ if lNeedDisposer or (Items[i].Count>0) then Write('var');
+ if lNeedDisposer then Write('__lObjectDisposer: TROObjectDisposer;');
+ if (Items[i].Count>0) then begin
+ for x := 0 to (Items[i].Count-1) do begin
+ par := Items[i].Items[x];
+ typname := GetDataType(par.DataType);
+
+ { if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fIntfUnitName);
+ end;}
+ Write(Format(' %s: %s;', [par.Name, typname]));
+ end;
+ end;
+
+ Write('begin');
+
+ for x := 0 to Items[i].Count-1 do begin
+ par := Items[i].Items[x];
+ typname := GetDataType(par.DataType);
+
+ if not IsSimpleType(typname, aLibrary)
+ then Write(Format(' %s := NIL;', [par.Name]));
+ end;
+ if Items[i].Count>0 then WriteEmptyLine;
+
+ if lNeedDisposer then Write('try', PASCAL_INDENTATION_LEVEL_1);
+ parline := '';
+ { Readers local variables values }
+ if (Items[i].Count>0) then begin
+ for x := 0 to (Items[i].Count-1) do begin
+ par := Items[i].Items[x];
+ parline := parline+par.Name+', ';
+
+ typname := GetDataType(par.DataType);
+
+ { if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fIntfUnitName);
+ end;}
+
+ Write(Format('__Message.Read(''%s'', TypeInfo(%s), %s, []);', [par.Name, typname, par.Name]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+ end;
+
+ WriteEmptyLine;
+ parline := Copy(parline, 1, Length(parline)-2);
+ Write(Format('(__Target as I%s).%s(%s);',
+ [aEventSink.Info.Name, Items[i].Info.Name, parline]), PASCAL_INDENTATION_LEVEL_2);
+ WriteEmptyLine;
+
+ if lNeedDisposer then begin
+ Write('finally', PASCAL_INDENTATION_LEVEL_1);
+ Write('__lObjectDisposer:= TROObjectDisposer.Create(__EventReceiver);', PASCAL_INDENTATION_LEVEL_2);
+ Write('try', PASCAL_INDENTATION_LEVEL_2);
+ for x := 0 to Items[i].Count-1 do begin
+ par := Items[i].Items[x];
+ typname := GetDataType(par.DataType);
+
+ if not IsSimpleType(typname, aLibrary)
+ then Write('__lObjectDisposer.Add('+par.Name+');', PASCAL_INDENTATION_LEVEL_3);
+ end;
+ Write('finally', PASCAL_INDENTATION_LEVEL_2);
+ Write('__lObjectDisposer.Free();', PASCAL_INDENTATION_LEVEL_3);
+ Write('end', PASCAL_INDENTATION_LEVEL_2);
+ Write('end', PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write('end;');
+ WriteEmptyLine;
+ end;
+ end;
+end;
+
+class function TRODLToIntf.GetTargetFileName(const aLibrary: TRODLLibrary;
+ const aTargetEntity: string): string;
+begin
+ try
+ result := aLibrary.Info.Name+'_Intf.pas'
+ except
+ result := 'Unknown.pas';
+ end;
+end;
+
+const
+ InnerIndent = 4;
+
+procedure TRODLToIntf.WriteCoClass(aLibrary: TRODLLibrary; aService: TRODLService);
+var i, p : integer;
+ sa : string;
+// soapsvc : boolean;
+ typname : string;
+// urn : string;
+begin
+ with aService.Default do begin
+// soapsvc := IsSOAPService(aService);
+
+ Write('{ Co'+aService.Info.Name+' }');
+ WriteEmptyLine;
+
+ Write(Format('class function Co%s.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): I%s;',
+ [aService.Info.Name, aService.Info.Name]));
+ Write('begin');
+ Write(Format(' result := T%s_Proxy.Create(aMessage, aTransportChannel);', [aService.Info.Name]));
+ Write('end;');
+ WriteEmptyLine;
+
+ if Count > 0 then begin
+ Write(Format('{ T%s_Proxy }', [aService.Info.Name]));
+ WriteEmptyLine;
+ end;
+
+ Write(Format('function T%s_Proxy.__GetInterfaceName:string;',[aService.Info.Name]));
+ Write('begin');
+ Write(Format(' result := ''%s'';',[aService.Info.Name]));
+ Write('end;');
+ WriteEmptyLine;
+
+ for i := 0 to (Count-1) do begin
+ Write(GetOperationDefinition(Items[i], Format('T%s_Proxy', [aService.Info.Name])));
+// Write('var');
+// Write(' __request, __response : TMemoryStream;');
+ //if soapsvc then write('var');
+ //if soapsvc then Write(' __http : IROHTTPTransport;');
+ //if soapsvc then Write(' __TargetUrlWasSet : boolean;');
+ Write('begin');
+ //if soapsvc then Write('__TargetUrlWasSet := false;',PASCAL_INDENTATION_LEVEL_1);
+
+ sa := GetAttributes(Items[i].Info.Attributes, aService.Info.Attributes, aLibrary.Info.Attributes, InnerIndent);
+ if sa <> '' then
+ Write('__Message.SetAttributes(__TransportChannel, '+sa+');', InnerIndent);
+ write('try', PASCAL_INDENTATION_LEVEL_1);
+
+ with Items[i] do begin
+ for p := 0 to (Count-1) do
+ if (Items[p].Flag = fOut) and IsImplementedAsClass(Items[p].DataType, aLibrary) then
+ Write(Format('%s := nil;', [Items[p].Name]),PASCAL_INDENTATION_LEVEL_2);
+ if Assigned(Result) and IsImplementedAsClass(Result.DataType, aLibrary) then
+ Write('result := nil;', PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+// Write('__request := TMemoryStream.Create;',PASCAL_INDENTATION_LEVEL_1);
+// Write('__response := TMemoryStream.Create;',PASCAL_INDENTATION_LEVEL_1);
+// WriteEmptyLine;
+// Write('try',PASCAL_INDENTATION_LEVEL_1);
+
+(* if soapsvc then begin
+ urn := Items[i].Info.Attributes.Values['Action'];
+ if (urn='') then urn := Items[0].Info.Attributes.Values['InputNamespace']; // Apache ones...
+
+ if Items[i].Info.Attributes.Values['InputMessageName'] <> '' then
+ Write(Format('__Message.InitializeRequestMessage(__TransportChannel, ''%s'', TargetNamespace, ''%s'');', [aLibrary.Info.Name, Items[i].Info.Attributes.Values['InputMessageName']]),InnerIndent)
+ else
+ Write(Format('__Message.InitializeRequestMessage(__TransportChannel, ''%s'', TargetNamespace, ''%s'');', [aLibrary.Info.Name, Items[i].Info.Name]),InnerIndent);
+
+ WriteEmptyLine;
+ Write('if Supports(__TransportChannel, IROHTTPTransport, __http) then begin',InnerIndent);
+ Write(Format(' __http.Headers[''SOAPAction''] := ''"%s"'';', [Items[i].Info.Attributes.Values['Action']]),InnerIndent);
+ Write(' __TargetUrlWasSet := (__http.TargetURL='''');',InnerIndent);
+ Write(Format(' if __TargetUrlWasSet then __http.TargetURL := %s_EndPointURI;', [aService.Info.Name]),InnerIndent);
+ Write('end;',InnerIndent);
+ WriteEmptyLine;
+ end
+ else begin
+ //Write(Format('__Message.Initialize(__TransportChannel, ''%s'', ''%s'', ''%s'');', [aLibrary.Info.Name, aService.Info.Name, Items[i].Info.Name]),InnerIndent);
+ if Items[i].Info.Attributes.Values['InputMessageName'] <> '' then
+ Write(Format('__Message.InitializeRequestMessage(__TransportChannel, ''%s'', __InterfaceName, ''%s'');', [aLibrary.Info.Name, Items[i].Info.Attributes.Values['InputMessageName']]),InnerIndent)
+ else*)
+ Write(Format('__Message.InitializeRequestMessage(__TransportChannel, ''%s'', __InterfaceName, ''%s'');', [aLibrary.Info.Name, Items[i].Info.Name]),InnerIndent);
+(* end;*)
+
+ with Items[i] do begin
+ for p := 0 to (Count-1) do
+ if IsInputFlag(Items[p].Flag) then begin
+ if (StrToDataType(Items[p].DataType)=rtDateTime)
+ then sa := '[paIsDateTime]'
+ else sa := '[]';
+
+
+ typname := GetDataType(Items[p].DataType);
+ if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fUnitName);
+ end;
+
+ Write(Format('__Message.Write(''%s'', TypeInfo(%s), %s, %s);',
+ [Items[p].Name, typname, Items[p].Name, sa]),InnerIndent);
+ end;
+ end;
+ Write('__Message.Finalize;',InnerIndent);
+ WriteEmptyLine;
+
+// Write('__Message.WriteToStream(__request);',InnerIndent);
+// Write('__TransportChannel.Dispatch(__request, __response);',InnerIndent);
+// Write('__Message.ReadFromStream(__response);',InnerIndent);
+ Write('__TransportChannel.Dispatch(__Message);',InnerIndent);
+// with Items[i] do begin
+// for p := 0 to (Count-1) do
+// if (Items[p].Flag = fIn) and (IsImplementedAsClass(Items[p].DataType, aLibrary)) then
+// Write(Format('%s.Free;', [Items[p].Name]),PASCAL_INDENTATION_LEVEL_2);
+// end;
+ WriteEmptyLine;
+
+ //Write(Format('Message.Initialize(''I%s'', ''%s'');', [aService.Name, Items[i].Name]),InnerIndent);
+ with Items[i] do begin
+
+ if Assigned(Result) then begin
+ if (StrToDataType(Result.DataType)=rtDateTime)
+ then sa := '[paIsDateTime]'
+ else sa := '[]';
+
+ typname := GetDataType(Result.DataType);
+ if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fUnitName);
+ end;
+
+ Write(Format('__Message.Read(''%s'', TypeInfo(%s), result, %s);',
+ [Result.Name, typname, sa]),InnerIndent);
+ end;
+
+ for p := 0 to (Count-1) do
+ if IsOutputFlag(Items[p].Flag) then begin
+
+ if (StrToDataType(Items[p].DataType)=rtDateTime)
+ then sa := '[paIsDateTime]'
+ else sa := '[]';
+
+ typname := GetDataType(Items[p].DataType);
+ if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fUnitName);
+ end;
+
+ Write(Format('__Message.Read(''%s'', TypeInfo(%s), %s, %s);',
+ [Items[p].Name, typname, Items[p].Name, sa]),InnerIndent);
+ end;
+ end;
+ //Write('Message.Finalize;',InnerIndent);
+
+ Write(' finally');
+(* if soapsvc then begin
+ Write(' if Supports(__TransportChannel, IROHTTPTransport, __http) then begin',InnerIndent);
+ Write(' if __TargetUrlWasSet then __http.TargetURL := '''';',InnerIndent);
+ Write(' end;',InnerIndent);
+ WriteEmptyLine;
+ end;*)
+ if sa <> '' then
+ Write(' __Message.UnsetAttributes(__TransportChannel);');
+ Write(' __Message.FreeStream;');
+// Write(' __response.Free;');
+ Write(' end');
+ Write('end;');
+ WriteEmptyLine;
+ end;
+
+ end;
+end;
+
+function TRODLToIntf.IsSOAPService(aService: TRODLService): boolean;
+begin
+ result := aService.Attributes.Values['Type'] = 'SOAP';
+end;
+
+procedure TRODLToIntf.WriteTypeDeclaration(aLibrary: TRODLLibrary; aType: TRODLEntity);
+var
+ i : integer;
+ AList: TStringList;
+ s,s1: string;
+ lNeedInitSimpleTypeWithDefaultValues: boolean;
+begin
+ Write(Format('{ %s }', [aType.Name]), PASCAL_INDENTATION_LEVEL_1);
+ // Structs
+ if (aType is TRODLStruct) then with TRODLStruct(aType) do begin
+
+ WriteDocumentation(aType);
+ if Ancestor <> '' then begin
+ Write(Format('%s = class(%s)', [Name,Ancestor]),PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('%s = class(TROComplexType)', [Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+ if Count > 0 then begin
+
+ Write('private',PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to (Count-1) do begin
+ Write(Format('f%s: %s;', [Items[i].Name, GetDataType(Items[i].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+ //WriteEmptyLine;
+ lNeedInitSimpleTypeWithDefaultValues := False;
+ for i := 0 to (Count-1) do begin
+ //if IsStruct(Items[i].DataType, aLibrary) or IsArray(Items[i].DataType, aLibrary) then begin
+ if IsImplementedAsClass(Items[i].DataType, aLibrary) then begin
+ //Write(Format('procedure Set%s(Value : %s);', [Items[i].Name, Items[i].DataType]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('function Get%s: %s;', [Items[i].Name, GetDataType(Items[i].DataType)]), PASCAL_INDENTATION_LEVEL_2);
+ end
+ else begin
+ lNeedInitSimpleTypeWithDefaultValues := lNeedInitSimpleTypeWithDefaultValues or (Items[i].Attributes.IndexOfName('Default') <> -1);
+ end;
+ end;
+
+ Write('public',PASCAL_INDENTATION_LEVEL_1);
+ if lNeedInitSimpleTypeWithDefaultValues then begin
+ Write('constructor Create(aCollection : TCollection); override;', PASCAL_INDENTATION_LEVEL_2);
+ end;
+ if aType.Attributes.Count > 0 then begin
+ Write('class function GetAttributeCount: Integer; override;', PASCAL_INDENTATION_LEVEL_2);
+ Write('class function GetAttributeName(aIndex: Integer): string; override;', PASCAL_INDENTATION_LEVEL_2);
+ Write('class function GetAttributeValue(aIndex: Integer): string; override;', PASCAL_INDENTATION_LEVEL_2);
+ WriteEmptyLine;
+ end;
+ {Write(' constructor Create; override;',PASCAL_INDENTATION_LEVEL_1);
+ Write(' destructor Destroy; override;',PASCAL_INDENTATION_LEVEL_1);}
+ Write('procedure Assign(iSource: TPersistent); override;',PASCAL_INDENTATION_LEVEL_2);
+ if (CalcItemsMarshalingOrder(True).Count>0) and (Count > 0) then begin
+ Write('procedure ReadComplex(ASerializer: TObject); override;',PASCAL_INDENTATION_LEVEL_2);
+ Write('procedure WriteComplex(ASerializer: TObject); override;',PASCAL_INDENTATION_LEVEL_2);
+ end;
+ //WriteEmptyLine;
+ Write('published',PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to (Count-1) do begin
+ //if IsStruct(Items[i].DataType, aLibrary) or IsArray(Items[i].DataType, aLibrary)
+ WriteDocumentation(Items[i]);
+ if IsImplementedAsClass(Items[i].DataType, aLibrary) then begin
+ Write(Format('property %s:%s read Get%s write f%s;',
+ [Items[i].Name, GetDataType(Items[i].DataType), Items[i].Name, Items[i].Name]), PASCAL_INDENTATION_LEVEL_2)
+ end
+ else begin
+ Write(Format('property %s:%s read f%s write f%s;',
+ [Items[i].Name, GetDataType(Items[i].DataType), Items[i].Name, Items[i].Name]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+ end;
+ //WriteEmptyLine;
+ end;
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ // Adds also a collection. This is handy when dealing with VCL wrappers
+ Write(Format('{ %sCollection }', [aType.Name]), PASCAL_INDENTATION_LEVEL_1);
+ if Ancestor <> '' then begin
+ Write(Format('%sCollection = class(%sCollection)', [Name,Ancestor]),PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('%sCollection = class(TROCollection)', [Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ Write('protected', PASCAL_INDENTATION_LEVEL_1);
+ Write('constructor Create(aItemClass: TCollectionItemClass); overload;', PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('function GetItems(aIndex: integer): %s;', [Name]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('procedure SetItems(aIndex: integer; const Value: %s);', [Name]), PASCAL_INDENTATION_LEVEL_2);
+ Write('public', PASCAL_INDENTATION_LEVEL_1);
+ Write('constructor Create; overload;', PASCAL_INDENTATION_LEVEL_2);
+
+ Write(Format('function Add: %s; reintroduce;', [Name]), PASCAL_INDENTATION_LEVEL_2);
+
+ aList := TStringList.Create;
+ try
+ aLibrary.GetArraysByElement(Name,aList);
+ aList.Sorted:=True;
+ if aList.Count > 1 then s:= ' overload;' else s:='';
+ s1 := '';
+ for i:=0 to aList.Count-1 do begin
+ if aList[i] = s1 then continue;
+ s1 := aList[i];
+ Write(Format('procedure SaveToArray(anArray: %s);'+s, [aList[i]]), PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('procedure LoadFromArray(anArray: %s);'+s, [aList[i]]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+ finally
+ aList.Free;
+ end;
+
+ Write(Format('property Items[Index: integer]:%s read GetItems write SetItems; default;', [Name]), PASCAL_INDENTATION_LEVEL_2);
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ end
+
+ // Arrays
+ else if (aType is TRODLArray) then with TRODLArray(aType) do begin
+ WriteDocumentation(aType);
+ Write(Format('%s_%s = array of %s;', [Name, GetDataType(ElementType),GetDataType(ElementType)]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format('%s = class(TROArray)', [Name]),PASCAL_INDENTATION_LEVEL_1);
+ Write('private',PASCAL_INDENTATION_LEVEL_1);
+
+ Write(' fCount: Integer;', PASCAL_INDENTATION_LEVEL_1);
+
+ Write(Format(' fItems : %s_%s;', [Name, GetDataType(ElementType)]), PASCAL_INDENTATION_LEVEL_1);
+ Write('protected',PASCAL_INDENTATION_LEVEL_1);
+
+ Write('procedure Grow; virtual;',PASCAL_INDENTATION_LEVEL_2);
+
+ Write(Format('function GetItems(aIndex: integer): %s;', [GetDataType(ElementType)]),PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('procedure SetItems(aIndex: integer; const Value: %s);', [GetDataType(ElementType)]),PASCAL_INDENTATION_LEVEL_2);
+ Write('function GetCount: integer; override;',PASCAL_INDENTATION_LEVEL_2);
+ Write('public',PASCAL_INDENTATION_LEVEL_1);
+ if aType.Attributes.Count > 0 then begin
+ Write('class function GetAttributeCount: Integer; override;', PASCAL_INDENTATION_LEVEL_2);
+ Write('class function GetAttributeName(aIndex: Integer): string; override;', PASCAL_INDENTATION_LEVEL_2);
+ Write('class function GetAttributeValue(aIndex: Integer): string; override;', PASCAL_INDENTATION_LEVEL_2);
+ end;
+ Write('class function GetItemType: PTypeInfo; override;',PASCAL_INDENTATION_LEVEL_2);
+ if IsImplementedAsClass(GetDataType(ElementType), aLibrary) then begin
+ Write('class function GetItemClass: TClass; override;',PASCAL_INDENTATION_LEVEL_2);
+ end;
+ Write('class function GetItemSize: integer; override;',PASCAL_INDENTATION_LEVEL_2);
+ WriteEmptyLine;
+ Write(' function GetItemRef(aIndex: integer): pointer; override;',PASCAL_INDENTATION_LEVEL_1);
+ if not IsSimpleType(GetDataType(ElementType),aLibrary) then begin
+ Write(' procedure SetItemRef(aIndex: integer; Ref: pointer); override;',PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write(' procedure Clear; override;',PASCAL_INDENTATION_LEVEL_1);
+ Write(' procedure Delete(aIndex: integer); override;',PASCAL_INDENTATION_LEVEL_1);
+
+ Write(' procedure Resize(ElementCount: integer); override;',PASCAL_INDENTATION_LEVEL_1);
+
+ WriteEmptyLine;
+
+ Write('procedure Assign(iSource:TPersistent); override;',PASCAL_INDENTATION_LEVEL_2);
+ Write('procedure ReadComplex(ASerializer: TObject); override;',PASCAL_INDENTATION_LEVEL_2);
+ Write('procedure WriteComplex(ASerializer: TObject); override;',PASCAL_INDENTATION_LEVEL_2);
+
+ if IsSimpleType(GetDataType(ElementType), aLibrary) then begin
+ Write(Format(' function Add(const Value:%s): integer;', [GetDataType(ElementType)]), PASCAL_INDENTATION_LEVEL_1);
+ Write('function GetIndex(const aPropertyName : string;',PASCAL_INDENTATION_LEVEL_2);
+ Write(' const aPropertyValue : Variant;',PASCAL_INDENTATION_LEVEL_2);
+ Write(' StartFrom : integer = 0;',PASCAL_INDENTATION_LEVEL_2);
+ Write(' Options : TROSearchOptions = [soIgnoreCase]) : integer; override;',PASCAL_INDENTATION_LEVEL_2);
+ end
+ else begin
+ Write(Format(' function Add: %s; overload;', [GetDataType(ElementType)]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format(' function Add(const Value: %s):integer; overload;', [GetDataType(ElementType)]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ WriteEmptyLine;
+ Write(' property Count : integer read GetCount;',PASCAL_INDENTATION_LEVEL_1);
+ Write(Format(' property Items[Index: integer]:%s read GetItems write SetItems; default;', [GetDataType(ElementType)]), PASCAL_INDENTATION_LEVEL_1);
+ Write(Format(' property InnerArray: %s_%s read fItems;', [Name, GetDataType(ElementType)]), PASCAL_INDENTATION_LEVEL_1);
+ //WriteEmptyLine;
+ Write('end;',PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+ end;
+end;
+
+
+procedure TRODLToIntf.WriteArraySerializer(aLibrary : TRODLLibrary; anArray : TRODLArray);
+var
+ lAsClass: boolean;
+begin
+ with anArray do begin
+ Write('{ '+Name+' }');
+ WriteEmptyLine;
+
+ if anArray.Attributes.Count > 0 then WriteAttributesMethods(anArray);
+ lAsClass := IsImplementedAsClass(GetDataType(ElementType), aLibrary);
+ Write(Format('procedure %s.Assign(iSource: TPersistent);',[Name]));
+ Write(Format('var lSource:%s;',[Name]));
+ Write( ' i:integer;');
+ if lAsClass then Write(Format(' lItem:%s;',[GetDataType(ElementType)]));
+ Write('begin');
+ Write(Format(' if (iSource is %s) then begin',[Name]));
+ Write(Format(' lSource := %s(iSource);',[Name]));
+ Write(' Clear();');
+ WriteEmptyLine;
+ if lAsClass then begin
+ Write( ' for i := 0 to lSource.Count-1 do');
+ Write( ' if Assigned(lSource.Items[i]) then begin');
+ Write(Format(' lItem := %s(lSource.Items[i].ClassType.Create);',[GetDataType(ElementType)]));
+ Write( ' lItem.Assign(lSource.Items[i]);');
+ Write( ' Add(lItem);');
+ Write( ' end');
+ Write( ' else begin');
+ Write( ' Add(nil);');
+ Write( ' end;');
+ end
+ else begin
+ Write(' Resize(lSource.Count);');
+ Write(' for i := 0 to lSource.Count-1 do');
+ Write(' Items[i] := lSource.Items[i];');
+ end;
+ Write(' end');
+ Write(' else begin');
+ Write(' inherited Assign(iSource);');
+ Write(' end;');
+ Write('end;');
+ WriteEmptyLine;
+
+ // GetItemType
+ Write(Format('class function %s.GetItemType: PTypeInfo;', [Name]));
+ Write('begin');
+ Write(Format(' result := TypeInfo(%s);', [GetDataType(ElementType)]));
+ Write('end;');
+ WriteEmptyLine;
+
+ // GetItemClass
+ if IsImplementedAsClass(GetDataType(ElementType), aLibrary) then begin
+ Write(Format('class function %s.GetItemClass: TClass;', [Name]));
+ Write( 'begin');
+ Write(Format(' result := %s;', [GetDataType(ElementType)]));
+ Write( 'end;');
+ WriteEmptyLine;
+ end;
+
+ // GetItemSize
+ Write(Format('class function %s.GetItemSize: integer;', [Name]));
+ Write('begin');
+ Write(Format(' result := SizeOf(%s);', [GetDataType(ElementType)]));
+ Write('end;');
+ WriteEmptyLine;
+
+ // GetItems
+ Write(Format('function %s.GetItems(aIndex: integer): %s;', [Name, GetDataType(ElementType)]));
+ Write('begin');
+ Write(' if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);');
+ Write(' result := fItems[aIndex];');
+ Write('end;');
+ WriteEmptyLine;
+
+ // GetItemRef
+ Write(Format('function %s.GetItemRef(aIndex: integer): pointer;', [Name]));
+ Write('begin');
+ Write(' if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);');
+ if IsSimpleType(GetDataType(ElementType), aLibrary)
+ then Write(' result := @fItems[aIndex];')
+ else Write(' result := fItems[aIndex];');
+ Write('end;');
+ WriteEmptyLine;
+
+ // SetItemRef
+ if not IsSimpleType(GetDataType(ElementType), aLibrary) then begin
+ Write(Format('procedure %s.SetItemRef(aIndex: integer; Ref: pointer);', [Name]));
+ Write('begin');
+ Write(' if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);');
+ Write(' if Ref <> fItems[aIndex] then begin');
+ write(' if fItems[aIndex] <> nil then fItems[aIndex].Free;');
+ Write(' fItems[aIndex] := Ref;');
+ write(' end;');
+ Write('end;');
+ WriteEmptyLine;
+ end;
+
+ // Clear
+ Write(Format('procedure %s.Clear;', [Name]));
+ if not IsSimpleType(GetDataType(ElementType), aLibrary) then Write('var i: integer;');
+ Write('begin');
+ if not IsSimpleType(GetDataType(ElementType), aLibrary) then Write(' for i := 0 to (Count-1) do fItems[i].Free();');
+ Write(' SetLength(fItems, 0);');
+
+ Write(' FCount := 0;');
+
+ Write('end;');
+ WriteEmptyLine;
+
+ // Delete
+ Write(Format('procedure %s.Delete(aIndex: integer);', [Name]));
+ //if not IsSimpleType(ElementType) then Write(' for i := 0 to (Count-1) do fItems[i].Free;');
+ Write('var i: integer;');
+ Write('begin');
+ Write(' if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);');
+ WriteEmptyLine;
+ if not IsSimpleType(GetDataType(ElementType), aLibrary) then begin
+ Write(' fItems[aIndex].Free();');
+ WriteEmptyLine;
+ end;
+ //ToDo: thic can probably be optimized???
+ Write(' if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);');
+ if not IsSimpleType(GetDataType(ElementType), aLibrary) then begin
+ Write(' if fItems[aIndex] <> Value then begin');
+ Write(' fItems[aIndex].Free;');
+ Write(' fItems[aIndex] := Value;');
+ Write(' end;');
+ end
+ else begin
+ Write(' fItems[aIndex] := Value;');
+ end;
+ Write('end;');
+ WriteEmptyLine;
+
+ // Resize
+ Write(Format('procedure %s.Resize(ElementCount: integer);', [Name]));
+ if not IsSimpleType(GetDataType(ElementType), aLibrary) then begin
+ Write('var i: Integer;');
+ end;
+ Write('begin');
+ Write(' if fCount = ElementCount then Exit;');
+ if not IsSimpleType(GetDataType(ElementType), aLibrary) then begin
+ write(' for i := FCount -1 downto ElementCount do');
+ Write(' FItems[i].Free;');
+ end;
+ Write(' SetLength(fItems, ElementCount);');
+ if not IsSimpleType(GetDataType(ElementType), aLibrary) then begin
+ Write(' for i := FCount to ElementCount -1 do');
+ write(Format(' FItems[i] := %s.Create;', [GetDataType(ElementType)]));
+ end;
+ Write(' FCount := ElementCount;');
+ Write('end;');
+ WriteEmptyLine;
+
+ // GetCount
+ Write(Format('function %s.GetCount: integer;', [Name]));
+ Write('begin');
+
+ //Write(' result := Length(fItems);');
+ Write(' result := FCount;');
+
+ Write('end;');
+ WriteEmptyLine;
+
+ // Grow
+ Write(Format('procedure %s.Grow;', [Name]));
+ Write('var');
+ Write(' Delta, Capacity: Integer;');
+ Write('begin');
+ Write(' Capacity := Length(fItems);');
+ Write(' if Capacity > 64 then');
+ Write(' Delta := Capacity div 4');
+ Write(' else');
+ Write(' if Capacity > 8 then');
+ Write(' Delta := 16');
+ Write(' else');
+ Write(' Delta := 4;');
+ Write(' SetLength(fItems, Capacity + Delta);');
+ Write('end;');
+ WriteEmptyLine;
+
+ // Add
+ if IsSimpleType(GetDataType(ElementType), aLibrary) then begin
+ Write(Format('function %s.Add(const Value: %s): integer;', [Name, GetDataType(ElementType)]));
+ Write('begin');
+
+ //Write(' SetLength(fItems, Length(fItems)+1);');
+ //Write(' result := Length(fItems)-1;');
+ //Write(' fItems[result] := Value;');
+ Write(' Result := Count;');
+ Write(' if Length(fItems) = Result then');
+ Write(' Grow;');
+ Write(' fItems[result] := Value;');
+ Write(' Inc(fCount);');
+
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('function %s.GetIndex(const aPropertyName: string;', [Name]));
+ Write(' const aPropertyValue: Variant; StartFrom: integer;');
+ Write(' Options: TROSearchOptions): integer;');
+ Write('begin');
+ Write(' result := -1;');
+ Write('end;');
+ WriteEmptyLine;
+ end
+ else begin
+ Write(Format('function %s.Add: %s;', [Name, GetDataType(ElementType)]));
+ Write('begin');
+ Write(Format(' result := %s.Create;', [GetDataType(ElementType)]));
+
+ //Write(' SetLength(fItems, Length(fItems)+1);');
+ //Write(' fItems[Length(fItems)-1] := result;');
+ Write(' Add(Result);');
+
+ Write('end;');
+ WriteEmptyLine;
+ Write(Format('function %s.Add(const Value:%s): integer;', [Name, GetDataType(ElementType)]));
+ Write('begin');
+
+ //Write(' SetLength(fItems, Length(fItems)+1);');
+ //Write(' result := Length(fItems)-1;');
+ //Write(' fItems[result] := Value;');
+ Write(' Result := Count;');
+ Write(' if Length(fItems) = Result then');
+ Write(' Grow;');
+ Write(' fItems[result] := Value;');
+ Write(' Inc(fCount);');
+
+ Write('end;');
+ WriteEmptyLine;
+ end;
+
+ Write(Format('procedure %s.ReadComplex(ASerializer: TObject);', [Name]));
+ Write('var');
+ Write(' lval: '+GetDataType(ElementType)+';');
+ Write(' i: integer;');
+// Write(' itemref : pointer;');
+ Write('begin');
+ Write(' for i := 0 to Count-1 do begin');
+// write(' if (GetItemClass<>NIL) then itemref := NIL else itemref := GetItemRef(i);');
+ Write(' with TROSerializer(ASerializer) do begin');
+ case StrToDataType(ElementType) of
+ rtInteger: Write(' ReadInteger(GetArrayElementName(GetItemType, GetItemRef(i)), otSLong, lval, i);');
+ rtDateTime: Write(' ReadDateTime(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);');
+ rtDouble: Write(' ReadDouble(GetArrayElementName(GetItemType, GetItemRef(i)), ftDouble, lval, i);');
+ rtCurrency: Write(' ReadDouble(GetArrayElementName(GetItemType, GetItemRef(i)), ftCurr, lval, i);');
+ rtWidestring: Write(' ReadWideString(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);');
+ rtString: Write(' ReadAnsiString(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);');
+ rtUTF8String: Write(' ReadUTF8String(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);');
+ rtInt64: Write(' ReadInt64(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);');
+ rtBoolean: Write(' ReadEnumerated(GetArrayElementName(GetItemType, GetItemRef(i)),TypeInfo(boolean), lval, i);');
+ rtVariant: Write(' ReadVariant(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);');
+ rtXML: Write(' ReadXML(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);');
+ rtGuid: Write(' ReadGuid(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);');
+ rtDecimal: Write(' ReadDecimal(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);');
+ rtBinary: Write(' ReadBinary(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);');
+ rtXsDateTime:
+ Write(Format(' ReadStruct(GetArrayElementName(GetItemType, GetItemRef(i)), %s, lval, i);',[GetDataType(ElementType)]));
+ rtUserDefined: begin
+ if aLibrary.FindArray(GetDataType(ElementType)) <> nil then begin
+ Write( ' lval := nil;');
+ Write(Format(' ReadArray(GetArrayElementName(GetItemType, GetItemRef(i)), %s, lval, i);',[GetDataType(ElementType)]))
+ end
+ else if aLibrary.FindEnum(GetDataType(ElementType)) <> nil then
+ Write(Format(' ReadEnumerated(GetArrayElementName(GetItemType, GetItemRef(i)),TypeInfo(%s), lval, i);',[GetDataType(ElementType)]))
+ else
+ Write(Format(' ReadStruct(GetArrayElementName(GetItemType, GetItemRef(i)), %s, lval, i);',[GetDataType(ElementType)]));
+ end;
+ end;
+ Write(' end;');
+ Write(' Items[i] := lval;');
+ Write(' end;');
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('procedure %s.WriteComplex(ASerializer: TObject);', [Name]));
+ Write('var');
+ Write(' i: integer;');
+ Write('begin');
+ Write(' for i := 0 to Count-1 do');
+ Write(' with TROSerializer(ASerializer) do');
+ case StrToDataType(ElementType) of
+ rtInteger: Write(' WriteInteger(GetArrayElementName(GetItemType, GetItemRef(i)), otSLong, fItems[i], i);');
+ rtDateTime: Write(' WriteDateTime(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);');
+ rtDouble: Write(' WriteDouble(GetArrayElementName(GetItemType, GetItemRef(i)), ftDouble, fItems[i], i);');
+ rtCurrency: Write(' WriteDouble(GetArrayElementName(GetItemType, GetItemRef(i)), ftCurr, fItems[i], i);');
+ rtWidestring: Write(' WriteWideString(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);');
+ rtString: Write(' WriteAnsiString(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);');
+ rtUTF8String: Write(' WriteUTF8String(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);');
+ rtInt64: Write(' WriteInt64(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);');
+ rtBoolean: Write(' WriteEnumerated(GetArrayElementName(GetItemType, GetItemRef(i)),TypeInfo(boolean), fItems[i], i);');
+ rtVariant: Write(' WriteVariant(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);');
+ rtXML: Write(' WriteXML(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);');
+ rtGuid: Write(' WriteGuid(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);');
+ rtDecimal: Write(' WriteDecimal(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);');
+ rtBinary: Write(' WriteBinary(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);');
+ rtXsDateTime: Write(' WriteStruct(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], '+GetDataType(ElementType)+', i);');
+ rtUserDefined:
+ if aLibrary.FindArray(GetDataType(ElementType)) <> nil then
+ Write(' WriteArray(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], '+GetDataType(ElementType)+', i);')
+ else if aLibrary.FindEnum(GetDataType(ElementType)) <> nil then
+ Write(Format(' WriteEnumerated(GetArrayElementName(GetItemType, GetItemRef(i)),TypeInfo(%s), fItems[i], i);',[GetDataType(ElementType)]))
+ else
+ Write(' WriteStruct(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], '+GetDataType(ElementType)+', i);');
+ end;
+ Write('end;');
+ WriteEmptyLine;
+ end;
+end;
+
+procedure TRODLToIntf.WriteStructPropMethods(aLibrary : TRODLLibrary; aStruct: TRODLStruct);
+var i : integer;
+ //lWroteComment: boolean;
+ aList: TStringList;
+ s: string;
+ structEntityList: IROStrings;
+ structEntity: TRODLTypedEntity;
+ lNeedInitSimpleTypeWithDefaultValues: Boolean;
+ lDefaultValue: string;
+begin
+ with aStruct do begin
+{ Write(Format('constructor %s.Create;', [Name]));
+ Write('begin');
+ Write(' inherited;');
+ for i := 0 to (Count-1) do with Items[i] do begin
+ if not (IsStruct(DataType, aLibrary) or IsArray(DataType, aLibrary)) then Continue;
+ Write(Format(' fDestroy_%s := FALSE;', [Name]));
+ end;
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('destructor %s.Destroy;', [Name]));
+ Write('begin');
+ for i := 0 to (Count-1) do with Items[i] do begin
+ if not (IsStruct(DataType, aLibrary) or IsArray(DataType, aLibrary)) then Continue;
+ Write(Format(' if fDestroy_%s then FreeAndNIL(f%s);', [Name, Name]));
+ end;
+ Write(' inherited;');
+ Write('end;');
+ WriteEmptyLine;}
+
+ //lWroteComment := true;
+ //lWroteComment := false;
+
+ if Count > 0 then begin
+ Write('{ '+Name+' }');
+ WriteEmptyLine;
+
+ if aStruct.Attributes.Count > 0 then
+ WriteAttributesMethods(aStruct);
+
+ Write(Format('procedure %s.Assign(iSource: TPersistent); ',[aStruct.Name]));
+ Write(Format('var lSource: %s.%s;',[fUnitName, aStruct.Name]));
+ Write('begin');
+ Write(' inherited Assign(iSource);');
+ Write(Format(' if (iSource is %s.%s) then begin',[fUnitName, aStruct.Name]));
+ Write(Format(' lSource := %s.%s(iSource);',[fUnitName, aStruct.Name]));
+ lNeedInitSimpleTypeWithDefaultValues := False;
+ for i := 0 to (Count-1) do begin
+ if IsImplementedAsClass(Items[i].DataType, aLibrary) then begin
+ if not AutoCreateParams then
+ Write(Format(' if Assigned(%s) then'#13#10, [Items[i].Name]));
+ Write(Format(' %s.Assign(lSource.%s);',[Items[i].Name,Items[i].Name]));
+ end
+ else begin
+ lNeedInitSimpleTypeWithDefaultValues := lNeedInitSimpleTypeWithDefaultValues or (Items[i].Attributes.IndexOfName('Default') <> -1);
+ Write(Format(' %s := lSource.%s;',[Items[i].Name,Items[i].Name]));
+ end;
+ end;
+ Write(' end;');
+ Write('end;');
+ WriteEmptyLine;
+
+ if lNeedInitSimpleTypeWithDefaultValues then begin
+ Write(Format('constructor %s.Create(aCollection : TCollection);',[aStruct.Name]));
+ Write('begin');
+ Write(' inherited Create(aCollection);');
+ For i := 0 to (Count-1) do begin
+ if (not IsImplementedAsClass(Items[i].DataType, aLibrary)) and (Items[i].Attributes.IndexOfName('Default')<>-1) then begin
+ lDefaultValue := '';
+ case StrToDataType(Items[i].DataType) of
+ rtInteger,
+ rtInt64,
+ rtDouble,
+ rtBoolean,
+ rtCurrency: lDefaultValue := Items[i].Attributes.Values['Default'];
+ rtWidestring,
+ rtGuid,
+ rtVariant,
+ rtUtf8String,
+ rtString: lDefaultValue := ''''+Items[i].Attributes.Values['Default']+'''';
+ rtDateTime: lDefaultValue := 'StrToDateTimeDef('''+Items[i].Attributes.Values['Default']+''',0)';
+ rtDecimal: lDefaultValue := Items[i].Attributes.Values['Default'];
+ //
+ rtBinary : ;
+ rtXML: ;
+ rtUserDefined: ;
+ end;
+ if lDefaultValue <> '' then Write(Format(' f%s := %s;',[Items[i].Name, lDefaultValue]));
+ end;
+ end;
+ Write('end;');
+ WriteEmptyLine;
+ end;
+ end;
+
+
+ for i := 0 to (Count-1) do with Items[i] do begin
+ if IsImplementedAsClass(DataType, aLibrary) then begin
+ //if not (IsStruct(DataType, aLibrary) or IsArray(DataType, aLibrary)) then Continue;
+
+ {Write(Format('procedure %s.Set%s(Value : %s);', [aStruct.Name, Name, DataType]));
+ Write('begin');
+ Write(Format(' if (f%s<>NIL) and (fDestroy_%s) then FreeAndNIL(f%s);', [Name, Name, Name]));
+ Write(Format(' f%s := Value;', [Name]));
+ Write(Format(' fDestroy_%s := FALSE;', [Name]));
+ Write('end;');
+ WriteEmptyLine;}
+
+ Write(Format('function %s.Get%s: %s;', [aStruct.Name, Name, GetDataType(DataType)]));
+ Write('begin');
+ if AutoCreateParams then
+ Write(Format(' if (f%s = nil) then f%s := %s.Create();', [Name, Name, GetDataType(DataType)]));
+ Write(Format(' result := f%s;', [Name]));
+ Write('end;');
+ WriteEmptyLine;
+ end;
+ end;
+
+ structEntityList:=CalcItemsMarshalingOrder(True);
+ if (structEntityList.Count>0) and (Count > 0) then begin
+ Write(Format('procedure %s.ReadComplex(ASerializer: TObject);', [Name]));
+ if structEntityList.Count > 0 then Write('var');
+ For i:=0 to structEntityList.Count - 1 do
+ with TRODLTypedEntity(structEntityList.Objects[i]) do
+ Write(Format(' l_%s: %s;',[Name, GetDataType(DataType)]));
+ Write('begin');
+ Write(' if TROSerializer(ASerializer).RecordStrictOrder then begin');
+ if Count <> structEntityList.Count then
+ Write(' inherited;');
+ For i:=0 to Count-1 do begin
+ structEntity:=Items[i];
+ Write(Format(' l_%s := %0:s;',[structEntity.Name]));
+ case StrToDataType(structEntity.DataType) of
+ rtInteger: Write(Format(' TROSerializer(ASerializer).ReadInteger(''%s'', otSLong, l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtDateTime: Write(Format(' TROSerializer(ASerializer).ReadDateTime(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtDouble: Write(Format(' TROSerializer(ASerializer).ReadDouble(''%s'', ftDouble, l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtCurrency: Write(Format(' TROSerializer(ASerializer).ReadDouble(''%s'', ftCurr, l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtWidestring: Write(Format(' TROSerializer(ASerializer).ReadWideString(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtString: Write(Format(' TROSerializer(ASerializer).ReadAnsiString(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtUTF8String: Write(Format(' TROSerializer(ASerializer).ReadUTF8String(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtInt64: Write(Format(' TROSerializer(ASerializer).ReadInt64(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtBoolean: Write(Format(' TROSerializer(ASerializer).ReadEnumerated(''%s'',TypeInfo(boolean), l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtVariant: Write(Format(' TROSerializer(ASerializer).ReadVariant(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtXML: Write(Format(' TROSerializer(ASerializer).ReadXML(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtGuid: Write(Format(' TROSerializer(ASerializer).ReadGuid(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtDecimal: Write(Format(' TROSerializer(ASerializer).ReadDecimal(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtBinary: Write(Format(' TROSerializer(ASerializer).ReadBinary(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtXsDateTime: Write(Format(' TROSerializer(ASerializer).ReadStruct(''%s'', %s, l_%s);',[structEntity.OriginalName, GetDataType(structEntity.DataType), structEntity.Name]));
+ rtUserDefined:
+ if aLibrary.FindArray(structEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).ReadArray(''%s'', %s, l_%s);',[structEntity.OriginalName, GetDataType(structEntity.DataType), structEntity.Name]))
+ else if aLibrary.FindEnum(structEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).ReadEnumerated(''%s'',TypeInfo(%s), l_%s);',[structEntity.OriginalName,GetDataType(structEntity.DataType), structEntity.Name]))
+ else
+ Write(Format(' TROSerializer(ASerializer).ReadStruct(''%s'', %s, l_%s);',[structEntity.OriginalName, GetDataType(structEntity.DataType), structEntity.Name]));
+ end;
+ if (StrToDataType(structEntity.DataType) in [rtBinary, rtUserDefined, rtXsDateTime]) and (aLibrary.FindEnum(structEntity.DataType) = nil) then
+ Write(Format(' if %s <> l_%0:s then %0:s.Free;',[structEntity.Name]));
+ Write(Format(' %s := l_%0:s;',[structEntity.Name]));
+ end;
+ Write(' end');
+ Write(' else begin');
+ For i:=0 to structEntityList.Count-1 do begin
+ structEntity:=TRODLTypedEntity(structEntityList.Objects[i]);
+ Write(Format(' l_%s := %0:s;',[structEntity.Name]));
+ case StrToDataType(structEntity.DataType) of
+ rtInteger: Write(Format(' TROSerializer(ASerializer).ReadInteger(''%s'', otSLong, l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtDateTime: Write(Format(' TROSerializer(ASerializer).ReadDateTime(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtDouble: Write(Format(' TROSerializer(ASerializer).ReadDouble(''%s'', ftDouble, l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtCurrency: Write(Format(' TROSerializer(ASerializer).ReadDouble(''%s'', ftCurr, l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtWidestring: Write(Format(' TROSerializer(ASerializer).ReadWideString(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtUTF8String: Write(Format(' TROSerializer(ASerializer).ReadUTF8String(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtString: Write(Format(' TROSerializer(ASerializer).ReadAnsiString(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtInt64: Write(Format(' TROSerializer(ASerializer).ReadInt64(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtBoolean: Write(Format(' TROSerializer(ASerializer).ReadEnumerated(''%s'',TypeInfo(boolean), l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtVariant: Write(Format(' TROSerializer(ASerializer).ReadVariant(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtXML: Write(Format(' TROSerializer(ASerializer).ReadXML(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtGuid: Write(Format(' TROSerializer(ASerializer).ReadGuid(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtDecimal: Write(Format(' TROSerializer(ASerializer).ReadDecimal(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtBinary: Write(Format(' TROSerializer(ASerializer).ReadBinary(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtXsDateTime: Write(Format(' TROSerializer(ASerializer).ReadStruct(''%s'', %s, l_%s);',[structEntity.OriginalName, GetDataType(structEntity.DataType), structEntity.Name]));
+ rtUserDefined:
+ if aLibrary.FindArray(structEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).ReadArray(''%s'', %s, l_%s);',[structEntity.OriginalName, GetDataType(structEntity.DataType), structEntity.Name]))
+ else if aLibrary.FindEnum(structEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).ReadEnumerated(''%s'',TypeInfo(%s), l_%s);',[structEntity.OriginalName, GetDataType(structEntity.DataType), structEntity.Name]))
+ else
+ Write(Format(' TROSerializer(ASerializer).ReadStruct(''%s'', %s, l_%s);',[structEntity.OriginalName, GetDataType(structEntity.DataType), structEntity.Name]));
+ end;
+ if (StrToDataType(structEntity.DataType) in [rtBinary, rtUserDefined, rtXsDateTime]) and (aLibrary.FindEnum(structEntity.DataType) = nil) then
+ Write(Format(' if %s <> l_%0:s then %0:s.Free;',[structEntity.Name]));
+ Write(Format(' %s := l_%0:s;',[structEntity.Name]));
+ end;
+ Write(' end;');
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('procedure %s.WriteComplex(ASerializer: TObject);', [Name]));
+ if structEntityList.Count > 0 then Write('var');
+ For i:=0 to structEntityList.Count - 1 do
+ with TRODLTypedEntity(structEntityList.Objects[i]) do
+ Write(Format(' l_%s: %s;',[Name, GetDataType(DataType)]));
+ Write('begin');
+ Write(' if TROSerializer(ASerializer).RecordStrictOrder then begin');
+ if Count <> structEntityList.Count then
+ Write('inherited;', PASCAL_INDENTATION_LEVEL_2);
+ Write(Format('TROSerializer(ASerializer).ChangeClass(%s);', [Name]), PASCAL_INDENTATION_LEVEL_2);
+ for i := 0 to Count-1 do begin
+ structEntity:=Items[i];
+ Write(Format(' l_%s := %0:s;',[structEntity.Name]));
+ case StrToDataType(structEntity.DataType) of
+ rtInteger: Write(Format(' TROSerializer(ASerializer).WriteInteger(''%s'', otSLong, l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtDateTime: Write(Format(' TROSerializer(ASerializer).WriteDateTime(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtDouble: Write(Format(' TROSerializer(ASerializer).WriteDouble(''%s'', ftDouble, l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtCurrency: Write(Format(' TROSerializer(ASerializer).WriteDouble(''%s'', ftCurr, l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtWidestring: Write(Format(' TROSerializer(ASerializer).WriteWideString(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtString: Write(Format(' TROSerializer(ASerializer).WriteAnsiString(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtUTF8String: Write(Format(' TROSerializer(ASerializer).WriteUTF8String(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtInt64: Write(Format(' TROSerializer(ASerializer).WriteInt64(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtBoolean: Write(Format(' TROSerializer(ASerializer).WriteEnumerated(''%s'',TypeInfo(boolean), l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtVariant: Write(Format(' TROSerializer(ASerializer).WriteVariant(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtXML: Write(Format(' TROSerializer(ASerializer).WriteXML(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtGuid: Write(Format(' TROSerializer(ASerializer).WriteGuid(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtDecimal: Write(Format(' TROSerializer(ASerializer).WriteDecimal(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtBinary: Write(Format(' TROSerializer(ASerializer).WriteBinary(''%s'', l_%s);',[structEntity.OriginalName, structEntity.Name]));
+ rtXsDateTime: Write(Format(' TROSerializer(ASerializer).WriteStruct(''%s'', l_%s, %s);',[structEntity.OriginalName, structEntity.Name,GetDataType(structEntity.DataType)]));
+ rtUserDefined:
+ if aLibrary.FindArray(structEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).WriteArray(''%s'', l_%s, %s);',[structEntity.OriginalName, structEntity.Name,GetDataType(structEntity.DataType)]))
+ else if aLibrary.FindEnum(structEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).WriteEnumerated(''%s'',TypeInfo(%s), l_%s);',[structEntity.OriginalName,structEntity.DataType, structEntity.Name]))
+ else
+ Write(Format(' TROSerializer(ASerializer).WriteStruct(''%s'', l_%s, %s);',[structEntity.OriginalName, structEntity.Name, GetDataType(structEntity.DataType)]))
+ end;
+ end;
+ Write(' end');
+ Write(' else begin');
+ For i:=0 to structEntityList.Count-1 do begin
+ structEntity:=TRODLTypedEntity(structEntityList.Objects[i]);
+ Write(Format(' l_%s := %0:s;',[structEntity.Name]));
+ case StrToDataType(structEntity.DataType) of
+ rtInteger: Write(Format(' TROSerializer(ASerializer).WriteInteger(''%s'', otSLong, l_%0:s);',[structEntity.Name]));
+ rtDateTime: Write(Format(' TROSerializer(ASerializer).WriteDateTime(''%s'', l_%0:s);',[structEntity.Name]));
+ rtDouble: Write(Format(' TROSerializer(ASerializer).WriteDouble(''%s'', ftDouble, l_%0:s);',[structEntity.Name]));
+ rtCurrency: Write(Format(' TROSerializer(ASerializer).WriteDouble(''%s'', ftCurr, l_%0:s);',[structEntity.Name]));
+ rtWidestring: Write(Format(' TROSerializer(ASerializer).WriteWideString(''%s'', l_%0:s);',[structEntity.Name]));
+ rtString: Write(Format(' TROSerializer(ASerializer).WriteAnsiString(''%s'', l_%0:s);',[structEntity.Name]));
+ rtUTF8String: Write(Format(' TROSerializer(ASerializer).WriteUTF8String(''%s'', l_%0:s);',[structEntity.Name]));
+ rtInt64: Write(Format(' TROSerializer(ASerializer).WriteInt64(''%s'', l_%0:s);',[structEntity.Name]));
+ rtBoolean: Write(Format(' TROSerializer(ASerializer).WriteEnumerated(''%s'',TypeInfo(boolean), l_%0:s);',[structEntity.Name]));
+ rtVariant: Write(Format(' TROSerializer(ASerializer).WriteVariant(''%s'', l_%0:s);',[structEntity.Name]));
+ rtXML: Write(Format(' TROSerializer(ASerializer).WriteXML(''%s'', l_%0:s);',[structEntity.Name]));
+ rtGuid: Write(Format(' TROSerializer(ASerializer).WriteGuid(''%s'', l_%0:s);',[structEntity.Name]));
+ rtDecimal: Write(Format(' TROSerializer(ASerializer).WriteDecimal(''%s'', l_%0:s);',[structEntity.Name]));
+ rtBinary: Write(Format(' TROSerializer(ASerializer).WriteBinary(''%s'', l_%0:s);',[structEntity.Name]));
+ rtXsDateTime: Write(Format(' TROSerializer(ASerializer).WriteStruct(''%s'', l_%0:s, %s);',[structEntity.Name,GetDataType(structEntity.DataType)]));
+ rtUserDefined:
+ if aLibrary.FindArray(structEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).WriteArray(''%s'', l_%0:s, %s);',[structEntity.Name,GetDataType(structEntity.DataType)]))
+ else if aLibrary.FindEnum(structEntity.DataType) <> nil then
+ Write(Format(' TROSerializer(ASerializer).WriteEnumerated(''%s'',TypeInfo(%s), l_%0:s);',[structEntity.Name,structEntity.DataType]))
+ else
+ Write(Format(' TROSerializer(ASerializer).WriteStruct(''%s'', l_%0:s, %s);',[structEntity.Name,GetDataType(structEntity.DataType)]))
+ end;
+ end;
+ Write(' end;');
+ Write('end;');
+ WriteEmptyLine;
+ end;
+ structEntityList:=nil;
+
+ // Writes the collection methods
+ Write('{ '+Name+'Collection }');
+ Write(Format('constructor %sCollection.Create;', [aStruct.Name]));
+ Write('begin');
+ Write(Format(' inherited Create(%s);', [aStruct.Name]));
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('constructor %sCollection.Create(aItemClass: TCollectionItemClass);', [aStruct.Name]));
+ Write('begin');
+ Write(Format(' inherited Create(aItemClass);', [aStruct.Name]));
+ Write('end;');
+
+ WriteEmptyLine;
+ Write(Format('function %sCollection.Add: %s;', [aStruct.Name, aStruct.Name]));
+ Write('begin');
+ Write(Format(' result := %s(inherited Add);', [aStruct.Name]));
+ Write('end;');
+ WriteEmptyLine;
+ Write(Format('function %sCollection.GetItems(aIndex: integer): %s;', [aStruct.Name, aStruct.Name]));
+ Write('begin');
+ Write(Format(' result := %s(inherited Items[aIndex]);', [aStruct.Name]));
+ Write('end;');
+ WriteEmptyLine;
+
+ aList := TStringList.Create;
+ try
+ aLibrary.GetArraysByElement(Name,aList);
+ aList.Sorted:=True;
+ s:='';
+ for i := 0 to aList.Count-1 do begin
+ if aList[i] = s then Continue;
+ s := aList[i];
+ Write(Format('procedure %sCollection.LoadFromArray(anArray: %s);', [aStruct.Name, aList[i]]));
+ Write('var i : integer;');
+ Write('begin');
+ Write(' Clear;');
+ Write(' for i := 0 to (anArray.Count-1) do');
+ Write(' anArray[i].Clone.Collection := Self;');
+ Write('end;');
+ WriteEmptyLine;
+ Write(Format('procedure %sCollection.SaveToArray(anArray: %s);', [aStruct.Name, aList[i]]));
+ Write('var i : integer;');
+ Write('begin');
+ Write(' anArray.Clear;');
+ Write(' for i := 0 to (Count-1) do begin');
+ Write(' if Assigned(Items[i]) then');
+ Write(Format(' anArray.Add(%s(Items[i].Clone))',[GetDataType(aStruct.Name)]));
+ Write(' else');
+ Write(' anArray.Add(nil);');
+ Write(' end;');
+ Write('end;');
+ WriteEmptyLine;
+ end;
+ finally
+ aList.Free;
+ end;
+
+ Write(Format('procedure %sCollection.SetItems(aIndex: integer; const Value: %s);', [aStruct.Name, aStruct.Name]));
+ Write('begin');
+ Write(Format(' %s(inherited Items[aIndex]).Assign(Value);', [aStruct.Name, aStruct.Name]));
+ Write('end;');
+ WriteEmptyLine;
+ end;
+end;
+
+
+function GetAttributes(atOperation, atService, atLibrary: TStrings; Ident: Integer): string;
+var
+ sl: TStringList;
+ s: string;
+ i, n: Integer;
+begin
+ sl := TStringList.Create;
+ try
+ sl.AddStrings(atOperation);
+ sl.AddStrings(atService);
+ sl.AddStrings(atLibrary);
+ sl.Sort;
+ for i := sl.Count -1 downto 1 do begin
+ if sl[i] = sl[i-1] then sl.Delete(I); // remove dupes
+ end;
+ if sl.Count = 0 then begin result := ''; exit; end;
+ s := '';
+ for i := 0 to sl.Count -1 do begin
+ if sl[i] = '' then continue;
+ if i mod 8 = 7 then begin
+ s := s + #13#10;
+ setLength(s, Length(s) + Ident + 2);
+ for n := Length(s) - Ident -1 to Length(s) do
+ s[n] := ' ';
+ end;
+ if i <> 0 then s := s + ', ';
+ s := s + #39 + sl.Names[i] + #39;
+ end;
+ Result :='['+s+'], '#13#10;
+ setLength(Result, Length(Result) + Ident + 2);
+ for n := Length(Result) - Ident -1 to Length(Result) do
+ Result[n] := ' ';
+
+ s := '';
+ for i := 0 to sl.Count -1 do begin
+ if sl[i] = '' then continue;
+ if i mod 8 = 7 then begin
+ s := s + #13#10;
+ setLength(s, Length(s) + Ident + 2);
+ for n := Length(s) - Ident -1 to Length(s) do
+ s[n] := ' ';
+ end;
+ if i <> 0 then s := s + ', ';
+ if sl.Names[i] = 'TargetNamespace' then s:= s + 'TargetNamespace'
+ else if sl.Names[i] = 'Wsdl' then s := s + 'WSDLLocation'
+ else s := s + #39 + StringReplace(sl.Values[sl.Names[i]], #39, #39#39, [rfReplaceAll]) + #39;
+ end;
+ Result := Result + '['+s+']';
+ finally
+ sl.Free;
+ end;
+end;
+
+procedure TRODLToIntf.WriteAttributesMethods(anEntity: TRODLEntity);
+var
+ i: Integer;
+begin
+ with anEntity do begin
+ Write(Format('class function %s.GetAttributeCount: Integer;',[Name]));
+ Write('begin');
+ Write(Format('result := %d;', [Attributes.Count]), PASCAL_INDENTATION_LEVEL_1);
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('class function %s.GetAttributeName(aIndex: Integer): string;',[Name]));
+ Write('begin');
+ if Attributes.Count > 0 then begin
+ Write('case aIndex of', PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to Attributes.Count - 1 do
+ Write(Format('%d: result := %s;', [i, QuotedStr(Attributes.Names[i])]), PASCAL_INDENTATION_LEVEL_2);
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write('end;');
+ WriteEmptyLine;
+
+ Write(Format('class function %s.GetAttributeValue(aIndex: Integer): string;',[Name]));
+ Write('begin');
+ if Attributes.Count > 0 then begin
+ Write('case aIndex of', PASCAL_INDENTATION_LEVEL_1);
+ for i := 0 to Attributes.Count - 1 do
+ Write(Format('%d: result := %s;', [i, QuotedStr(Attributes.Values[Attributes.Names[i]])]), PASCAL_INDENTATION_LEVEL_2);
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write('end;');
+ WriteEmptyLine;
+ end;
+end;
+
+
+end.
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalInvk.pas b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalInvk.pas
new file mode 100644
index 0000000..53b4403
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToPascalInvk.pas
@@ -0,0 +1,461 @@
+unit uRODLToPascalInvk;
+
+{----------------------------------------------------------------------------}
+{ RemObjects SDK Library - CodeGen }
+{ }
+{ compiler: Delphi 5 and up, Kylix 2 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the RemObjects SDK }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFNDEF MSWINDOWS}
+{$I ../RemObjects.inc}
+{$ELSE}
+{$I ..\RemObjects.inc}
+{$ENDIF}
+
+interface
+
+uses uRODL;
+
+type { TRODLToInvk }
+ TRODLToInvk = class(TRODLConverter)
+ private
+ fIntfUnitName : string;
+
+ procedure WriteInvokerDeclaration(const aService: TRODLService; aLibrary : TRODLLibrary);
+ procedure WriteOperationImplementation(const aService : TRODLService;
+ const anOperation : TRODLOperation;
+ aLibrary : TRODLLibrary);
+
+ protected
+ procedure IntConvert(const aLibrary : TRODLLibrary; const aTargetEntity : string = ''); override;
+
+ public
+ class function GetTargetFileName(const aLibrary : TRODLLibrary; const aTargetEntity : string = ''): string; override;
+
+ end;
+
+
+implementation
+
+uses SysUtils, uRODLGenTools, uROTypes, uROClasses, uRODLToPascalImpl, uRODLToPascalIntf, Dialogs, uRODLToPascal;
+
+{ TRODLToInvk }
+
+procedure TRODLToInvk.IntConvert(const aLibrary: TRODLLIbrary; const aTargetEntity : string = '');
+var i, k : integer;
+ s,t,actualname : string;
+begin
+ fIntfUnitName := ChangeFileExt(TRODLToIntf.GetTargetFileName(aLibrary), '');
+
+ Write(Format('unit %s;', [ChangeFileExt(GetTargetFileName(aLibrary), '')]));
+ WriteEmptyLine;
+
+ WriteLines(IntfInvkNotice);
+ WriteEmptyLine;
+
+ Write('{$I RemObjects.inc}');
+ WriteEmptyLine;
+
+ Write('interface');
+ WriteEmptyLine;
+
+ Write('uses');
+ Write('{vcl:} Classes,' ,PASCAL_INDENTATION_LEVEL_1);
+ Write('{RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,' ,PASCAL_INDENTATION_LEVEL_1);
+
+ if aLibrary.UseCount > 0 then begin
+
+ s := '';
+ t := '';
+ for i := 0 to aLibrary.UseCount-1 do begin
+
+ if aLibrary.Use[i].LoadedRodlLibraryName <> '' then
+ actualname := aLibrary.Use[i].LoadedRodlLibraryName
+ else
+ actualname := ChangeFileExt(ExtractFilename(aLibrary.Use[i].RodlFile),'');
+
+ if (Pos(actualname+'_Intf', s)<=0) then begin
+ if s <> '' then s := s+', ';
+ s := s+actualname+'_Intf';
+ end;
+
+ if (Pos(actualname+'_Invk', t)<=0) then begin
+ if t <> '' then t := t+', ';
+ t := t+actualname+'_Invk';
+ end;
+ end; { for }
+
+ if (s<>'') then begin
+ s := s+',';
+ Write('{Used RODL Intf''s:} '+s,PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ if (t<>'') then begin
+ t := t+',';
+ Write('{Used RODL Invk''s:} '+t,PASCAL_INDENTATION_LEVEL_1);
+ end;
+ end;
+
+ Write(Format('{Generated:} %s_Intf;', [aLibrary.Info.Name]),PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ if aLibrary.ServiceCount > 0 then begin
+ Write('type');
+ Write(' TSeekOrigin = Classes.TSeekOrigin; // fake declaration');
+ end;
+
+ with aLibrary.CalcServiceOrder() do begin
+ for i := 0 to (Count-1) do //if (not aLibrary.Services[i].IsFromUsedRodl) then
+ WriteInvokerDeclaration(Objects[i] as TRODLService, aLibrary);
+ end;
+
+ {for i := 0 to (aLibrary.ServiceCount-1) do if (not aLibrary.Services[i].IsFromUsedRodl) then
+ WriteInvokerDeclaration(aLibrary.Services[i], aLibrary); }
+
+ Write('implementation');
+ WriteEmptyLine;
+
+ //s := '';
+ {for i := 0 to (aLibrary.ServiceCount-1) do begin
+ //s := s+ChangeFileExt(TRODLToImpl.GetTargetFileName(aLibrary, aLibrary.Services[i].Info.Name),'');
+ s := s+aLibrary.Services[i].Info.Name+'_Impl';
+ if (i'')
+ then Write(Format('{RemObjects:} uRORes, %s;', [s]),PASCAL_INDENTATION_LEVEL_1)
+ else *)Write(Format('{RemObjects:} uRORes, uROClient;', []),PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine;
+
+ for i := 0 to (aLibrary.ServiceCount-1) do if (not aLibrary.Services[i].IsFromUsedRodl) then begin
+ //WriteInvokerHandleMessage(aLibrary.Services[i]);
+
+ if not Assigned(aLibrary.Services[i].Default) then Continue;
+
+ Write('{ T'+aLibrary.Services[i].Info.Name+'_Invoker }');
+ WriteEmptyLine;
+
+ Write('constructor T' + aLibrary.Services[i].Info.Name + '_Invoker.Create;');
+ Write('begin');
+ Write(' inherited Create;');
+ Write(' FAbstract := ' + BoolToStr(aLibrary.Services[i].Abstract,True)+';');
+ Write('end;');
+ WriteEmptyLine;
+
+ for k := 0 to (aLibrary.Services[i].Default.Count-1) do
+ WriteOperationImplementation(aLibrary.Services[i], aLibrary.Services[i].Default.Items[k], aLibrary);
+ end;
+
+ for i := 0 to (aLibrary.ServiceCount-1) do ;
+
+ Write('initialization');
+ with aLibrary.Attributes do
+ for i := 0 to Count-1 do
+ Write(Format(' RegisterServiceAttribute(''%s'',''%s'',''%s'');',['',Names[i],Values[Names[i]]]));
+ For k:=0 to aLibrary.ServiceCount -1 do
+ with aLibrary.Services[k], Attributes do
+ for i := 0 to Count-1 do
+ Write(Format(' RegisterServiceAttribute(''%s'',''%s'',''%s'');',[Name, Names[i],Values[Names[i]]]));
+ Write('end.');
+end;
+
+procedure TRODLToInvk.WriteInvokerDeclaration(const aService : TRODLService; aLibrary : TRODLLibrary);
+var i : integer;
+begin
+ if aService.Ancestor <> '' then begin
+ Write(Format('T%s_Invoker = class(T%s_Invoker)', [aService.Info.Name,aService.Ancestor]), PASCAL_INDENTATION_LEVEL_1);
+ end
+ else begin
+ Write(Format('T%s_Invoker = class(TROInvoker)', [aService.Info.Name]), PASCAL_INDENTATION_LEVEL_1);
+ end;
+ Write('private', PASCAL_INDENTATION_LEVEL_1);
+ Write('protected', PASCAL_INDENTATION_LEVEL_1);
+ Write('public', PASCAL_INDENTATION_LEVEL_1);
+ Write(' constructor Create; override;', PASCAL_INDENTATION_LEVEL_1);
+ Write('published', PASCAL_INDENTATION_LEVEL_1);
+
+ for i := 0 to (aService.Default.Count-1) do begin
+ Write(Format('procedure Invoke_%s(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);', [aService.Default.Items[i].Info.Name]), PASCAL_INDENTATION_LEVEL_2);
+ end;
+
+ Write('end;', PASCAL_INDENTATION_LEVEL_1);
+ WriteEmptyLine();
+end;
+
+procedure TRODLToInvk.WriteOperationImplementation(
+ const aService : TRODLService;
+ const anOperation: TRODLOperation; aLibrary : TRODLLibrary);
+ const resultname = 'return';
+var i,k : integer;
+ lHasObjectDisposer: Boolean;
+ pars, s, sa : string;
+ typname : string;
+begin
+ Write(Format('procedure T%s_Invoker.Invoke_%s(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);',
+ [aService.Info.Name, anOperation.Info.Name]));
+
+ Write(Format('{ %s }', [GetOperationDefinition(anOperation)]));
+
+ with anOperation do begin
+
+ { Determine if we need an ObjectDisposer }
+ lHasObjectDisposer := False;
+ for i := 0 to (Count-1) do with Items[i] do begin
+ if IsImplementedAsClass(DataType, aLibrary) then begin
+ lHasObjectDisposer := true;
+ break;
+ end;
+ end;
+ if Assigned(Result) and IsImplementedAsClass(Result.DataType, aLibrary) then
+ lHasObjectDisposer := true;
+
+ //ShowMessage('1');
+
+ { Write local variables }
+ if (Count>0) or Assigned(Result) or lHasObjectDisposer then Write('var');
+ for i := 0 to (Count-1) do begin
+
+ typname := GetDataType(Items[i].DataType);
+ if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fIntfUnitName);
+ end;
+
+ Write(Format('%s: %s;', [Items[i].Name, typname]),PASCAL_INDENTATION_LEVEL_1);
+ if (Items[i].Flag = fInOut) and IsImplementedAsClass(Items[i].DataType, aLibrary) then
+ Write(Format('__in_%s: %s;', [Items[i].Name, typname]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+ //ShowMessage('2');
+
+ if Assigned(Result) then begin
+ typname := GetDataType(Result.DataType);
+ if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fIntfUnitName);
+ end;
+ Write(Format('lResult: %s;', [ typname]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+
+
+ if lHasObjectDisposer then
+ Write('__lObjectDisposer: TROObjectDisposer;',PASCAL_INDENTATION_LEVEL_1);
+
+{ if Assigned(Result)
+ then Write(' %s: %s;', [resultname, Result.DataType]);}
+
+ //ShowMessage('3');
+
+ Write('begin');
+ if (Length(anOperation.Roles) > 0) or (Length(aService.Roles) > 0) then begin
+ s := 'CheckRoles(__Instance, [';
+ k := 0;
+ for i := 0 to Length(anOperation.Roles) -1 do begin
+ if k <> 0 then s := s +', ';
+ inc(k);
+ if (k mod 10) = 0 then s := s + #13#10+' ';
+ s := s+#39+StringReplace(anOperation.Roles[i], #39, #39#39, [rfReplaceAll])+#39;
+ end;
+ for i := 0 to Length(aService.Roles) -1 do begin
+ if k <> 0 then s := s +', ';
+ inc(k);
+ if (k mod 10) = 0 then s := s + #13#10+' ';
+ s := s+#39+StringReplace(aService.Roles[i], #39, #39#39, [rfReplaceAll])+#39;
+ end;
+ Write(s+']);');
+ end;
+ sa := GetAttributes(anOperation.Info.Attributes, aService.Info.Attributes, aLibrary.Info.Attributes, 4);
+ if sa <> '' then
+ Write(' __Message.SetAttributes(__Transport, '+sa +');');
+
+ if (Count>0) then begin
+ for i := 0 to (Count-1) do begin
+ with Items[i] do begin
+ if IsImplementedAsClass(DataType, aLibrary) then begin
+ Write(Format('%s := nil;', [Items[i].Name]),PASCAL_INDENTATION_LEVEL_1);
+ if (Flag = fInOut) then
+ Write(Format('__in_%s := nil;', [Items[i].Name]),PASCAL_INDENTATION_LEVEL_1);
+ end;
+ end;
+ end;
+ end;
+ if Assigned(Result) then
+ if IsImplementedAsClass(Result.DataType, aLibrary) then
+ Write('lResult := nil;',PASCAL_INDENTATION_LEVEL_1);
+
+ Write(' try');
+
+ //ShowMessage('4');
+
+ for i := 0 to (Count-1) do
+ if IsInputFlag(Items[i].Flag) then begin
+
+ if (StrToDataType(Items[i].DataType)=rtDateTime)
+ then sa := '[paIsDateTime]'
+ else sa := '[]';
+
+ typname := GetDataType(Items[i].DataType);
+ if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fIntfUnitName);
+ end;
+
+ Write(Format('__Message.Read(''%s'', TypeInfo(%s), %s, %s);',[Items[i].Name, typname, Items[i].Name, sa]),PASCAL_INDENTATION_LEVEL_2);
+ if (Items[i].Flag = fInOut) and IsImplementedAsClass(Items[i].DataType, aLibrary) then begin
+ Write(Format('__in_%s := %s;',[Items[i].Name, Items[i].Name]),PASCAL_INDENTATION_LEVEL_2)
+ end;
+ end;
+
+ if (Count>0) then WriteEmptyLine;
+ s := ' ';
+ if Assigned(Result) then s := s+'lResult := ';
+ s := s+Format('(__Instance as I%s).%s', [aService.Name, anOperation.Name]);
+
+ //ShowMessage('5');
+
+ if (Count>0) then begin
+ pars := '';
+ k := Length(s);
+ for i := 0 to (Count-1) do begin
+ if (Items[i].Flag=fResult) then Continue;
+ pars := pars+Items[i].Name+', ';
+ inc(k, Length(Items[i].Name)+2);
+ if k > 150 then begin
+ pars := pars+#13#10' ';
+ k:=8;
+ end;
+ end;
+
+ pars := TrimRight(pars);
+ if (pars<>'') and (pars[Length(pars)] = ',') then s := s+'('+Copy(pars, 1, Length(pars)-1)+')';
+ end;
+
+ s := s+';';
+ Write(s);
+
+ WriteEmptyLine;
+(* if anOperation.Info.Attributes.Values['OutputMessageName'] <> '' then
+ Write(Format(' __Message.InitializeResponseMessage(__Transport, ''%s'', ''%s'', ''%s'');',[aLibrary.Name, aService.Name, anOperation.Info.Attributes.Values['OutputMessageName']]))
+ else *)
+
+ Write(Format(' __Message.InitializeResponseMessage(__Transport, ''%s'', ''%s'', ''%sResponse'');',[aLibrary.Name, aService.Name, Name]));
+
+
+ //ShowMessage('6');
+
+ if Assigned(Result) then begin
+ if (StrToDataType(Result.DataType)=rtDateTime) then
+ sa := '[paIsDateTime]'
+ else
+ sa := '[]';
+
+ typname := GetDataType(Result.DataType);
+ if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fIntfUnitName);
+ end;
+
+ Write(Format(' __Message.Write(''%s'', TypeInfo(%s), lResult, %s);',
+ [Result.Name, typname, sa]));
+ end;
+
+ //ShowMessage('7');
+
+ for i := 0 to (Count-1) do
+ if IsOutputFlag(Items[i].Flag) then begin
+
+ if (StrToDataType(Items[i].DataType)=rtDateTime)
+ then sa := '[paIsDateTime]'
+ else sa := '[]';
+
+ typname := GetDataType(Items[i].DataType);
+ if IsUserDefinedType(typname,aLibrary) then begin
+ typname := GetFullyQualifiedTypeName(typname,aLibrary,fIntfUnitName);
+ end;
+
+ Write(Format(' __Message.Write(''%s'', TypeInfo(%s), %s, %s);',
+ [Items[i].Name, typname, Items[i].Name, sa]));
+ end;
+
+ {if Assigned(Result) then begin
+ Write(Format(' __Message.Write(''%s'', TypeInfo(%s), @%s);', [resultname, Result.DataType, resultname]))
+ end;}
+ Write(' __Message.Finalize;');
+ if sa <> '' then
+ Write(' __Message.UnsetAttributes(__Transport);');
+ WriteEmptyLine;
+
+ if not NeedsAsyncRetrieveOperationDefinition(anOperation) then begin
+ Write(' __oResponseOptions := [roNoResponse];');
+ WriteEmptyLine;
+ end;
+
+ Write(' finally');
+
+ //ShowMessage('8');
+
+ if lHasObjectDisposer then begin
+ Write(' __lObjectDisposer := TROObjectDisposer.Create(__Instance);');
+ Write(' try');
+
+ for i := 0 to (Count-1) do with Items[i] do begin
+ if IsImplementedAsClass(DataType, aLibrary) then begin
+ if Items[i].Flag = fInOut then begin
+ Write(Format(' __lObjectDisposer.Add(__in_%s);', [Items[i].Name]));
+ end;
+ Write(Format(' __lObjectDisposer.Add(%s);', [Items[i].Name]));
+ end;
+ end;
+ if Assigned(Result) then begin
+ if IsImplementedAsClass(Result.DataType, aLibrary) then begin
+ Write(' __lObjectDisposer.Add(lResult);');
+ end;
+ end;
+
+ Write(' finally');
+ Write(' __lObjectDisposer.Free();');
+ Write(' end;');
+ end;
+ Write(' end;');
+ Write('end;');
+
+
+ { ToDo: passing an incomig reference to an out param will blow, as both will
+ be freed (so the same object si freed twice. we need to add better
+ logic to catch this:
+
+ currently
+
+ finally
+ if (Param1 <> Result) then Param1.Free;
+ Result.Free;
+ end;
+
+ better:
+
+ finally
+ if (Param1 <> Result) then Param1.Free;
+ Result.Free;
+ end;
+ }
+
+ {finally
+ if (Param1 <> Result) then Param1.Free;
+ Result.Free;
+ end;}
+
+
+
+ end;
+ WriteEmptyLine;
+end;
+
+class function TRODLToInvk.GetTargetFileName(const aLibrary: TRODLLIbrary; const aTargetEntity: string): string;
+begin
+ result := aLibrary.Name+'_Invk.pas';
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToWSDL.pas b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToWSDL.pas
new file mode 100644
index 0000000..fbd6abe
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToWSDL.pas
@@ -0,0 +1,1045 @@
+unit uRODLToWSDL;
+
+{----------------------------------------------------------------------------}
+{ RemObjects SDK Library - CodeGen }
+{ }
+{ compiler: Delphi 5 and up, Kylix 2 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the RemObjects SDK }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFNDEF MSWINDOWS}
+{$I ../RemObjects.inc}
+{$ELSE}
+{$I ..\RemObjects.inc}
+{$ENDIF}
+
+interface
+
+uses
+ Classes, uRODL, uROTypes, uROClasses, uROXMLSerializer;
+
+const
+
+ SOAPDataTypes : array[TRODataType] of string = (
+ 'int',
+ 'dateTime',
+ 'double',
+ 'double',
+ 'string',
+ 'string',
+ 'long',
+ 'boolean',
+ 'anyType',
+ dts_base64Binary,
+ 'anyType',
+ 'string',
+ 'decimal',
+ 'string',
+ 'dateTime',
+ '???');
+
+
+type
+ { TRODLToWSDL }
+ TRODLToWSDL = class(TRODLConverter)
+ private
+ fLocation: string;
+ fShowClientId: Boolean;
+ fUseLiteral: Boolean;
+ fUseDocument: Boolean;
+ fTargetEntity, fTargetNamespace: string;
+ fExternalTypesAsReferences: Boolean;
+ fHasXsdData: Boolean;
+ fExternalRefs, // namespace
+ fExternalUrls: TStrings; // uri
+ fXsdTns,
+ fTargetXSD: string;
+ procedure SetLocation(const Value: string);
+ function GetPrefix(const aType, aNs: string): String;
+
+ procedure WriteEnum(anEnum : TRODLEnum);
+ procedure WriteStruct(const aLibrary: TRODLLibrary; aStruct : TRODLStruct);
+ procedure WriteArray(anArray : TRODLArray);
+ procedure WriteExceptionElement(anException : TRODLException);
+
+ procedure WriteMessages(aLibrary: TRODLLibrary; aService : TRODLService);
+ procedure WriteExceptionMessage(anException: TRODLException);
+ procedure WriteLiteralParameters(aLibrary: TRODLLibrary; aService : TRODLService);
+ procedure WriteBindings(aLibrary: TRODLLibrary; aService : TRODLService);
+ procedure WritePorts(aLibrary: TRODLLibrary; aService : TRODLService);
+ procedure WriteExceptionParts(aMeth: TRODLOperation);
+ procedure WriteService(aLibrary: TRODLLibrary; aService : TRODLService);
+ function GetAnchestor(aLibrary: TRODLLibrary;
+ aService: TRODLService): TRODLService;
+ procedure WriteAnnotation(aDocString: string; aIndentation: Integer = 0; aNs:
+ string = 'xs:');
+ procedure WriteDocumentation(aDocString: string; aIndentation: Integer = 0;
+ aNs: string = 'xs:');
+ function ExtSOAPDataType(aLibrary: TRODLLibrary; const aDataTypeName : string) : string;
+ procedure ResolveExternalReferences(aLibrary: TRODLLibrary);
+ function ReplaceSpecialChars(aText: String): String;
+ protected
+ procedure IntConvert(const aLibrary : TRODLLibrary; const aTargetEntity : string = ''); override;
+ procedure AddExternal(aNode: TRODLEntity); overload;
+ procedure AddExternal(const aNs,aUrl: string); overload;
+
+ public
+ constructor Create(const aLibraryFile: string; const aTargetEntity: string = ''); overload; override;
+ constructor Create(const aLibrary: TRODLLibrary; const aTargetEntity: string = ''); overload; override;
+ destructor Destroy; override;
+ property TargetXsd: string read fTargetXSD write fTargetXSD;
+ property Location : string read fLocation write SetLocation;
+ property TargetNamespace: string read fTargetNamespace write fTargetNamespace;
+ property ShowClientId : Boolean read fShowClientId write fShowClientId;
+ property UseLiteral : Boolean read fUseLiteral write fUseLiteral;
+ property UseDocument : Boolean read fUseDocument write fUseDocument;
+ property ExternalTypesAsReferences : Boolean read fExternalTypesAsReferences write fExternalTypesAsReferences;
+ end;
+
+function SOAPDataType(const aDataTypeName : string; IncludeNamespace : boolean = TRUE) : string;
+
+implementation
+
+uses SysUtils;
+
+function SOAPDataType(const aDataTypeName : string; IncludeNamespace : boolean = TRUE) : string;
+var dt : TRODataType;
+begin
+ dt := StrToDataType(aDataTypeName);
+ if (dt=rtUserDefined)
+ then result := aDataTypeName
+ else result := SOAPDataTypes[dt];
+
+ if IncludeNamespace then begin
+ if (dt=rtUserDefined) then result := 'tns:'+result
+ else result := ns_Standard+':'+result;
+ end;
+end;
+
+{ TRODLToWSDL }
+
+const
+ definitions_ns : array[0..5] of string = ('xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" ',
+ 'xmlns:xs="http://www.w3.org/2001/XMLSchema" ',
+ 'name="%s" ',
+ 'xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" ',
+ 'xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" ',
+ 'xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"');
+
+procedure TRODLToWSDL.IntConvert(const aLibrary: TRODLLibrary; const aTargetEntity: string);
+var
+ s, i: integer;
+ lService: TRODLService;
+begin
+ if pos(':', fTargetNamespace) = 0 then fTargetNamespace := 'urn:'+fTargetNamespace;
+ fTargetEntity := aTargetEntity;
+ with aLibrary do begin
+ if (aTargetEntity<>'') then begin
+ lService := aLibrary.FindService(aTargetEntity);
+ if (lService <> nil) then
+ if lService.isPrivate then Exit;
+ end else
+ lService := NIL;
+ fExternalRefs.Clear;
+ fExternalUrls.Clear;
+ fXsdTns := '';
+ if fExternalTypesAsReferences then begin
+ ResolveExternalReferences(aLibrary);
+ end;
+ if fXsdTns = '' then
+ fXsdTns := fTargetNamespace;
+
+
+
+ Write('');
+ if fTargetXSD <> '' then begin
+ if not fHasXsdData then raise Exception.Create('No xsd by that name');
+ Write(' fXsdTns then
+ write('xmlns:ns'+IntToStr(i)+'="'+fExternalRefs[i]+'" ', 3);
+ end;
+ Write('>');
+
+
+ end else begin
+ Write('');
+ WriteAnnotation(aLibrary.Documentation); {Giovanni}
+
+
+ // Write types
+
+ Write('', 3);
+ Write(Format('', [fTargetNamespace]), 6);
+ end;
+
+ for i := 0 to fExternalRefs.Count -1 do begin
+ if ((fTargetXSD ='') and (fExternalRefs[i] = fTargetNamespace)) or
+ ((fTargetXSD <> '') and (fExternalRefs[i] = fXsdTns)) then
+ Write(Format(' ',[flocation, fExternalUrls[i]] ), 3)
+ else
+ Write(Format(' ',[fExternalRefs[i], fLocation, fExternalUrls[i]] ), 3);
+ end;
+
+ for i := 0 to (EnumCount-1) do WriteEnum(Enums[i]);
+ for i := 0 to (StructCount-1) do WriteStruct(aLibrary, Structs[i]);
+ for i := 0 to (ArrayCount-1) do WriteArray(Arrays[i]);
+ for i := 0 to (ExceptionCount-1) do WriteExceptionElement(Exceptions[i]);
+ if fUseLiteral and fUseDocument then begin
+ if (aTargetEntity<>'') then WriteLiteralParameters(aLibrary, lService)
+ else for s := 0 to (ServiceCount-1) do begin
+ lService := Services[s];
+ WriteLiteralParameters(aLibrary, lService);
+ end;
+ if fShowClientId then begin
+ Write('', 3);
+ Write('', 6);
+ Write('', 9);
+ Write(' ', 6);
+ Write(' ', 9);
+ Write(' ', 6);
+ Write(' ', 3);
+ end;
+ end;
+ Write(' ', 6);
+ if fTargetXSD = '' then begin
+ Write(' ', 3);
+
+ // Writes messages
+ if (aTargetEntity<>'') then WriteMessages(aLibrary, lService)
+ else for s := 0 to (ServiceCount-1) do begin
+ lService := Services[s];
+ WriteMessages(aLibrary, lService);
+ end;
+ for s := 0 to aLibrary.ExceptionCount -1 do begin
+ WriteExceptionMessage(aLibrary.Exceptions[s]);
+ end;
+ if fShowClientId and fUseLiteral and fUseDocument then begin
+ Write('', 3);
+ Write(' ', 3);
+ Write(' ', 3);
+ end;
+
+ // Writes port and operations
+ if (aTargetEntity<>'') then WritePorts(aLibrary, lService)
+ else for s := 0 to (ServiceCount-1) do begin
+ lService := Services[s];
+ WritePorts(aLibrary, lService);
+ end;
+
+ // Write bindings
+ if (aTargetEntity<>'') then WriteBindings(aLibrary, lService)
+ else for s := 0 to (ServiceCount-1) do begin
+ lService := Services[s];
+ WriteBindings(aLibrary, lService);
+ end;
+
+ // Writes services
+ if (aTargetEntity<>'') then WriteService(aLibrary, lService)
+ else for s := 0 to (ServiceCount-1) do begin
+ lService := Services[s];
+ WriteService(aLibrary, lService);
+ end;
+
+ Write(' ');
+ end;
+ end;
+end;
+
+procedure TRODLToWSDL.SetLocation(const Value: string);
+begin
+ fLocation := Value;
+end;
+
+procedure TRODLToWSDL.WriteArray(anArray: TRODLArray);
+var
+ lMin,
+ lMax: Integer;
+begin
+ if fExternalTypesAsReferences and (anArray.Attributes.Values['ImportedFromUrl'] <> fTargetXSD) then exit;
+ Write(Format('', [anArray.Name]), 9);
+ WriteAnnotation(anArray.Documentation, 9);
+
+ if fUseDocument then begin
+ Write('', 12);
+
+ lMax := StrToIntDef(anArray.Attributes.Values['MaxOccurs'], -1);
+ lMin := StrToIntDef(anArray.Attributes.Values['MinOccurs'], 0);
+
+ if lMax = -1 then begin
+ Write(Format(' ', [Unprefix(SOAPDataType(anArray.ElementType, false)),
+ lMin,
+ ExtSOAPDataType(anArray.OwnerLibrary, anArray.ElementType)]), 15);
+ end else begin
+ Write(Format(' ', [Unprefix(SOAPDataType(anArray.ElementType, false)),
+ lMin,
+ lMax,
+ ExtSOAPDataType(anArray.OwnerLibrary, anArray.ElementType)]), 15);
+ end;
+ Write(' ', 12);
+ end else begin
+ Write('', 12);
+ Write('', 15);
+ Write(' ', 18);
+ Write(Format(' ',
+ [Unprefix(ExtSOAPDataType(anArray.OwnerLibrary, anArray.ElementType))]), 18);
+ Write(' ', 15);
+
+ Write(' ', 12);
+
+ end;
+ Write(' ', 9);
+end;
+
+procedure TRODLToWSDL.WriteEnum(anEnum: TRODLEnum);
+var i : integer;
+begin
+ if fExternalTypesAsReferences and (anEnum.Attributes.Values['ImportedFromUrl'] <> fTargetXSD) then exit;
+ Write(Format('', [anEnum.Name]), 9);
+ WriteAnnotation(anEnum.Documentation, 12); {Giovanni}
+ Write('', 12);
+ for i := 0 to anEnum.Count-1 do
+ begin
+ //WriteDocumentation(anEnum.Items[i].Documentation, 12); {Giovanni}
+ Write(Format(' ', [Unprefix(anEnum.Items[i].Name)]), 15);
+ end;
+ Write(' ', 12);
+ Write(' ', 9);
+end;
+
+function TRODLToWSDL.GetAnchestor(aLibrary: TRODLLibrary; aService: TRODLService): TRODLService;
+begin
+ result := NIL;
+ if (aService.Ancestor<>'') and not aService.isPrivate
+ then result := aLibrary.FindService(aService.Ancestor)
+end;
+
+procedure TRODLToWSDL.WriteMessages(aLibrary: TRODLLibrary; aService: TRODLService);
+var o, p : integer;
+ dups : TStringList;
+ lRet: TRODLStruct;
+ lType, s, svcname, mtdname : string;
+ op : TRODLOperation;
+begin
+ // Writes all the methods of this service and its anchestors.
+ // If more than one service descend from the same base one, the WSDL has to be generated
+ // using a format like this: http://localhost:8099/SOAP?Service=ServiceOne
+
+ svcname := aService.Name;
+ dups := TStringList.Create;
+ dups.Duplicates := dupIgnore;
+ dups.Sorted := TRUE;
+ try
+ while Assigned(aService) and not aService.isPrivate do begin
+
+ with aService.Default do begin
+ for o := 0 to (Count-1) do begin
+ op := Items[o];
+
+ // If a method with this name is present, it skips it
+ mtdname := UpperCase(op.Name);
+ if (dups.IndexOf(mtdname)>=0) then Continue else dups.Add(mtdname);
+
+ if fUseLiteral and fUseDocument then begin
+ Write(Format('', [Unprefix(svcname), Unprefix(op.Name)]), 3);
+ s := op.Attributes.Values['SOAPInputNameOverride'];
+ if s = '' then s := Format('%s___%s', [svcname, op.Name]);
+ Write(Format(' ', [s]), 6);
+ Write(' ', 3);
+ Write(Format('', [Unprefix(svcname), Unprefix(op.Name)]), 3);
+ s := op.Attributes.Values['SOAPOutputNameOverride'];
+ if s = '' then s := Format('%s___%sResponse', [svcname, op.Name]);
+ Write(Format(' ', [s]), 6);
+ Write(' ', 3);
+ end
+ else begin
+ // Continues
+ with Items[o] do begin
+ // Request
+ Write(Format('', [Unprefix(svcname), Unprefix(op.Name)]), 3);
+ for p := 0 to (Count-1) do
+ if IsInputFlag(Items[p].Flag) then begin
+ lType := Items[p].DataType;
+ lRet := aLibrary.FindStruct(lType);
+ if (lRet <> nil) and (lRet.Count = 1) and (lRet.Attributes.Values['Anonymous'] = '1') then
+ lType := lRet.Items[0].DataType;
+
+ Write(Format(' ', [Unprefix(Items[p].Name), ExtSOAPDataType(aLibrary, lType)]), 6);
+ end;
+ Write(' ', 3);
+
+ // Response
+ Write(Format('', [Unprefix(svcname), Unprefix(op.Name)]), 3);
+
+ if Assigned(aService.Default.Items[o].Result) then begin
+ lType := op.Result.DataType;
+ lRet := aLibrary.FindStruct(lType);
+ if (lRet <> nil) and (lRet.Count = 1) and (lRet.Attributes.Values['Anonymous'] = '1') then
+ lType := lRet.Items[0].DataType;
+ Write(Format(' ', [Unprefix(op.Result.Name), ExtSOAPDataType(aLibrary, lType)]), 6);
+ end;
+ //Write(Format(' ', [SOAPDataType(aService.Default.Items[o].Result.DataType)]), 6);
+
+ for p := 0 to (Count-1) do begin
+ if Items[p].Flag in [fOut, fInOut] then begin
+ lType := Items[p].DataType;
+ lRet := aLibrary.FindStruct(lType);
+ if (lRet <> nil) and (lRet.Count = 1) and (lRet.Attributes.Values['Anonymous'] = '1') then
+ lType := lRet.Items[0].DataType;
+
+ Write(Format(' ', [Unprefix(Items[p].Name), ExtSOAPDataType(aLibrary, lType)]), 6);
+ end;
+ end;
+ Write(' ', 3);
+ end;
+ end;
+ end;
+ end;
+ aService := GetAnchestor(aLibrary, aService);
+ end;
+ finally
+ dups.Free;
+ end;
+end;
+
+procedure TRODLToWSDL.WritePorts(aLibrary: TRODLLibrary; aService: TRODLService);
+var o : integer;
+svcname: string;
+begin
+ // Writes a port for each method of this service and its anchestors.
+ // Refer to the comment in TRODLToWSDL.WriteMessages
+ if aService.isPrivate then Exit;
+ svcname := aService.Name;
+ Write(Format('', [Unprefix(svcname)]), 3);
+ WriteDocumentation(aService.Documentation, 6, 'wsdl:');
+ while Assigned(aService) and not aService.isPrivate do begin
+
+ for o := 0 to (aService.Default.Count-1) do begin
+ with aService.Default.Items[o] do begin
+ Write(Format('', [Unprefix(Name)]), 6);
+ WriteDocumentation(Documentation, 6, 'wsdl:'); {Giovanni}
+ Write(Format(' ', [Unprefix(svcname), Unprefix(Name)]), 9);
+ Write(Format(' ', [Unprefix(svcname), Unprefix(Name)]), 9);
+ WriteExceptionParts(aService.Default.Items[o]);
+ Write(Format(' ', [Name]), 6)
+ end;
+ end;
+
+ aService := GetAnchestor(aLibrary, aService);
+ end;
+ Write(' ', 3);
+end;
+
+procedure TRODLToWSDL.WriteBindings(aLibrary: TRODLLibrary; aService: TRODLService);
+var o : integer;
+ lAct, svcname : string;
+begin
+ // Write all the bindings for this service and its anchestors using the method names.
+ // It's important to notice that we NEVER use the anchestor name when composing the SOAPAction, but
+ // always use the final service name
+ if aService.isPrivate then Exit;
+ svcname := aService.Name;
+
+ Write(Format('', [Unprefix(svcname), Unprefix(svcname)]), 3);
+ WriteAnnotation(aService.Documentation, 6); {Giovanni}
+ if fUseDocument then
+ Write(' ', 6)
+ else
+ Write(' ', 6);
+
+ while Assigned(aService) and not aService.isPrivate do begin
+
+ for o := 0 to (aService.Default.Count-1) do begin
+ with aService.Default.Items[o] do begin
+ lAct := Attributes.Values['Action'];
+ Write(Format('', [Unprefix(Name)]), 9);
+ if lAct <> '' then begin
+ if pos(':', lAct) = 0 then lAct := 'urn:'+lAct;
+ if fUseDocument then
+ Write(Format(' ', [lAct]),12)
+ else
+ Write(Format(' ', [lAct]),12);
+ end else begin
+ if fUseDocument then
+ Write(Format(' ', [aLibrary.Name, Unprefix(svcname), Unprefix(Name)]),12)
+ else
+ Write(Format(' ', [aLibrary.Name, Unprefix(svcname), Unprefix(Name)]),12);
+ end;
+ if fUseLiteral then begin
+ Write('', 12);
+ Write(' ', 15);
+ if fShowClientId and fUseDocument then
+ write(' ', 15);
+ Write(' ', 12);
+
+ Write('', 12);
+ Write(' ', 15);
+ if fShowClientId and fUseDocument then
+ write(' ', 15);
+ Write(' ', 12);
+ end
+ else begin
+ Write('', 12);
+ Write(Format(' ',
+ [Unprefix(aLibrary.Name), Unprefix(svcname)]), 15);
+ Write(' ', 12);
+
+ Write('', 12);
+ Write(Format(' ',
+ [Unprefix(aLibrary.Name), Unprefix(svcname)]), 15);
+ Write(' ', 12);
+ end;
+
+ Write(' ', 9);
+ end;
+ end;
+
+ aService := GetAnchestor(aLibrary, aService);
+ end;
+
+ Write(' ', 3);
+end;
+
+
+procedure TRODLToWSDL.WriteAnnotation(aDocString: string; aIndentation: Integer
+ = 0; aNs: string = 'xs:');
+begin
+ if Trim(aDocString) = '' then exit;
+ Write(Format('<%sannotation>',[aNs]), aIndentation);
+ WriteDocumentation(aDocString,aIndentation+3, aNs);
+ Write(Format('%sannotation>',[aNs]), aIndentation);
+end;
+
+
+procedure TRODLToWSDL.WriteDocumentation(aDocString: string; aIndentation:
+ Integer = 0; aNs: string = 'xs:');
+var lDocString: String;
+begin
+ lDocString := ReplaceSpecialChars(aDocString);
+ if Trim(aDocString) = '' then exit;
+ Write(Format('<%sdocumentation>',[aNs]), aIndentation);
+ Write(Format('%s', [lDocString]),aIndentation);
+ Write(Format('%sdocumentation>',[aNs]), aIndentation);
+end;
+
+procedure TRODLToWSDL.WriteService(aLibrary: TRODLLibrary; aService: TRODLService);
+begin
+ // We only write the service itself, ignoring the anchestors
+ if aService.isPrivate then Exit;
+ Write(Format('', [Unprefix(aService.Name)]), 3);
+ WriteAnnotation(aService.Default.Documentation, 6);
+
+ while Assigned(aService) and not aService.isPrivate do begin
+ Write(Format('',
+ [Unprefix(aService.Name), Unprefix(aService.Name)]), 6);
+ Write(Format(' ', [fLocation+'?service='+StringReplace(aService.Name,' ', '+', [rfReplaceAll])]), 9);
+ Write(' ', 6);
+
+ aService := NIL;//GetAnchestor(aLibrary, aService);
+ end;
+
+ Write(' ',3);
+end;
+
+procedure TRODLToWSDL.WriteStruct(const aLibrary: TRODLLibrary; aStruct: TRODLStruct);
+var
+ i : integer;
+ lLax: Boolean;
+ lRet: TRODLStruct;
+begin
+ if fExternalTypesAsReferences and (aStruct.Attributes.Values['ImportedFromUrl'] <> fTargetXSD) then exit;
+ if aStruct.Attributes.Values['Anonymous'] = '1' then exit;
+ Write(Format('', [Unprefix(aStruct.Name)]), 9);
+ WriteAnnotation(aStruct.Documentation, 9); {Giovanni}
+ if fUseDocument then begin
+ if aStruct.Ancestor <> '' then begin
+ write(Format('', [ExtSOAPDataType(aLibrary, aStruct.Ancestor)]), 9);
+ end;
+ end;
+ Write('', 12);
+ lLax := aStruct.Attributes.Values['lax'] = '1';
+ while Assigned(aStruct) do begin
+ for i := 0 to aStruct.Count-1 do
+ with aStruct.Items[i] do begin
+ lRet := aLibrary.FindStruct(DataType);
+ if (lRet <> nil) and (lRet.Count = 1) and (lRet.Attributes.Values['Anonymous'] = '1') then begin
+ if lRet.Attributes.Values['Nillable'] = '1' then
+ Write(Format('', [Unprefix(Name), ExtSOAPDataType(aLibrary, lRet.Items[0].DataType)]), 15)
+ else
+ Write(Format('', [Unprefix(Name), ExtSOAPDataType(aLibrary, lRet.Items[0].DataType)]), 15);
+ end else begin
+ Write(Format('', [Unprefix(Name), ExtSOAPDataType(aLibrary, DataType)]), 15);
+ end;
+ WriteAnnotation(Documentation, 15); {Giovanni}
+ Write(' ',15);
+ end;
+
+ if fUseDocument then break;
+ if aStruct.Ancestor <> '' then begin
+ aStruct := aLibrary.FindStruct(aStruct.Ancestor)
+ end
+ else begin
+ aStruct := nil;
+ end;
+ end;
+ if lLax then
+ Write(' ', 15);
+ Write(' ', 12);
+ if fUseDocument then begin
+ if aStruct.Ancestor <> '' then
+ write(' ', 9);
+ end;
+
+ Write(' ', 9);
+end;
+
+procedure TRODLToWSDL.WriteLiteralParameters(aLibrary: TRODLLibrary;
+ aService: TRODLService);
+var o, p, i : integer;
+ dups : TStringList;
+ s, svcname, mtdname : string;
+ op : TRODLOperation;
+ lRet: TRODLStruct;
+begin
+ // Writes all the methods of this service and its anchestors.
+ // If more than one service descend from the same base one, the WSDL has to be generated
+ // using a format like this: http://localhost:8099/SOAP?Service=ServiceOne
+
+ svcname := aService.Name;
+ dups := TStringList.Create;
+ dups.Duplicates := dupIgnore;
+ dups.Sorted := TRUE;
+ try
+ while Assigned(aService) and not aService.isPrivate do begin
+
+ for o := 0 to (aService.Default.Count-1) do begin
+ op := aService.Default.Items[o];
+
+ // If a method with this name is present, it skips it
+ mtdname := UpperCase(op.Name);
+ if (dups.IndexOf(mtdname)>=0) then Continue else dups.Add(mtdname);
+
+ s := op.Attributes.Values['SOAPInputNameOverride'];
+ if s = '' then s := Format('%s___%s', [Unprefix(svcname), Unprefix(op.Name)]);
+
+ if not ((fExternalTypesAsReferences) and (op.Attributes.Values['InputImportedFromUrl'] <> fTargetXSD)) then begin
+ p := 0;
+ for i := 0 to op.Count -1 do begin
+ if op[i].Flag in [fIn, fInOut] then
+ inc(p);
+ end;
+ write(Format('', [Unprefix(s)]), 3);
+ if p = 0 then begin
+ write(' ', 6);
+ end
+ else begin
+ write('', 6);
+ write('', 9);
+ for i := 0 to op.Count -1 do begin
+ if op[i].Flag in [fIn, fInOut] then begin
+ lRet := aLibrary.FindStruct(op[i].DataType);
+ if (lRet <> nil) and (lRet.Count = 1) and (lRet.Attributes.Values['Anonymous'] = '1') then begin
+ if lRet.Attributes.Values['Nillable'] = '1' then
+ write(Format(' ', [Unprefix(op[i].Name), ExtSOAPDataType(aLibrary, lRet[0].DataType)]), 12)
+ else
+ write(Format(' ', [Unprefix(op[i].Name), ExtSOAPDataType(aLibrary, lRet[0].DataType)]), 12);
+ end else
+
+ write(Format(' ', [Unprefix(op[i].Name), ExtSOAPDataType(aLibrary, op[i].DataType)]), 12);
+ end;
+ end;
+ if op.Attributes.VAlues['InputLax'] = '1' then
+ Write(' ', 12);
+ write(' ', 9);
+ write(' ', 6);
+ end;
+
+ write(' ', 3);
+ end;
+
+ s := op.Attributes.Values['SOAPOutputNameOverride'];
+ if s = '' then s := Format('%s___%sResponse', [Unprefix(svcname), Unprefix(op.Name)]);
+ if not ((fExternalTypesAsReferences) and (op.Attributes.Values['OutputImportedFromUrl'] <> fTargetXSD)) then begin
+ p := 0;
+ for i := 0 to op.Count -1 do begin
+ if op[i].Flag in [fOut, fInOut, fResult] then
+ inc(p);
+ end;
+ if op.Result <> nil then begin
+ inc(p);
+ end;
+ write(Format('', [Unprefix(s)]), 3);
+ if p = 0 then begin
+ write(' ', 6);
+ end
+ else begin
+ write('', 6);
+ write('', 9);
+ if op.Result <> nil then begin
+ lRet := aLibrary.FindStruct(op.Result.DataType);
+ if (lRet <> nil) and (lRet.Count = 1) and (lRet.Attributes.Values['Anonymous'] = '1') then begin
+ if lRet.Attributes.Values['Nillable'] = '1' then
+ write(Format(' ', [Unprefix(op.Result.Name), ExtSOAPDataType(aLibrary, lRet[0].DataType)]), 12)
+ else
+ write(Format(' ', [Unprefix(op.Result.Name), ExtSOAPDataType(aLibrary, lRet[0].DataType)]), 12);
+ end else
+ write(Format(' ', [Unprefix(op.Result.Name), ExtSOAPDataType(aLibrary, op.Result.DataType)]), 12);
+ end;
+ for i := 0 to op.Count -1 do begin
+ if op[i].Flag in [fOut, fInOut, fResult] then begin
+ lRet := aLibrary.FindStruct(op[i].DataType);
+ if (lRet <> nil) and (lRet.Count = 1) and (lRet.Attributes.Values['Anonymous'] = '1') then begin
+ if lRet.Attributes.Values['Nillable'] = '1' then
+ write(Format(' ', [Unprefix(op[i].Name), ExtSOAPDataType(aLibrary, lRet[0].DataType)]), 12)
+ else
+ write(Format(' ', [Unprefix(op[i].Name), ExtSOAPDataType(aLibrary, lRet[0].DataType)]), 12);
+ end else
+ write(Format(' ', [Unprefix(op[i].Name), ExtSOAPDataType(aLibrary, op[i].DataType)]), 12);
+ end;
+ end;
+ if op.Attributes.VAlues['OutputLax'] = '1' then
+ Write(' ', 12);
+ write(' ', 9);
+ write(' ', 6);
+ end;
+ write(' ', 3);
+ end;
+ end;
+ aService := GetAnchestor(aLibrary, aService);
+ end;
+ finally
+ dups.Free;
+ end;
+end;
+
+constructor TRODLToWSDL.Create(const aLibraryFile, aTargetEntity: string);
+begin
+ fTargetNamespace := 'http://tempuri.org/';
+ fExternalRefs := TStringList.Create;
+ fExternalUrls := TStringList.Create;
+ inherited;
+end;
+
+constructor TRODLToWSDL.Create(const aLibrary: TRODLLibrary;
+ const aTargetEntity: string);
+begin
+ fTargetNamespace := 'http://tempuri.org/';
+ fExternalRefs := TStringList.Create;
+ fExternalUrls := TStringList.Create;
+ inherited;
+end;
+
+destructor TRODLToWSDL.Destroy;
+begin
+ fExternalRefs.Free;
+ fExternalUrls.Free;
+ inherited;
+end;
+
+procedure TRODLToWSDL.AddExternal(aNode: TRODLEntity);
+var
+ lEx: TRODLException;
+begin
+ if Anode = nil then exit;
+ if aNode is TRODLException then begin
+ lEx := TRODLException(aNode);
+ if (fTargetXSD = '') or (fTargetXSD <> lEx.Attributes.Values['ElementUrl']) then
+ AddExternal(lEx.Attributes.Values['ElementNamespace'], lEx.Attributes.Values['ElementUrl']);
+ exit;
+ end;
+ if aNode.Attributes.Values['ImportedFromUrl'] = '' then exit;
+ AddExternal(aNode.Attributes.Values['ImportedFromNamespace'], aNode.Attributes.Values['ImportedFromUrl']);
+end;
+
+procedure TRODLToWSDL.AddExternal(const aNs,aUrl: string);
+var
+ i: Integer;
+begin
+ for i := 0 to fExternalRefs.Count -1 do begin
+ if (fExternalRefs[i] = aNs) and (fExternalUrls[i] = aUrl) then exit;
+ end;
+ fExternalRefs.Add(aNs);
+ fExternalUrls.ADd(aUrl);
+end;
+
+
+function TRODLToWSDL.ExtSOAPDataType(aLibrary: TRODLLibrary; const aDataTypeName: string): string;
+var
+ el: TRODLEntity;
+begin
+ if fExternalTypesAsReferences then begin
+ el := aLibrary.FindStruct(aDataTypeName);
+ if el = nil then
+ el := aLibrary.FindException(aDataTypeName);
+ if el = nil then
+ el := aLibrary.FindEnum(aDataTypeName);
+ if el = nil then
+ el := aLibrary.FindArray(aDataTypeName);
+ if el <> nil then begin
+ if (el.Attributes.values['ElementNamespace'] <> '') and (fXsdTns <> el.Attributes.values['ElementNamespace']) then begin
+ result := 'ns'+IntToStr(fExternalRefs.IndexOf(el.Attributes.values['ElementNamespace']))+':'+Unprefix(aDataTypeName);
+ exit;
+ end;
+ if (el.Attributes.values['ImportedFromNamespace'] <> '') and (fXsdTns <> el.Attributes.values['ImportedFromNamespace']) then begin
+ result := 'ns'+IntToStr(fExternalRefs.IndexOf(el.Attributes.values['ImportedFromNamespace']))+':'+Unprefix(aDataTypeName);
+ exit;
+ end;
+ end;
+ end;
+
+ result := SOAPDataType(Unprefix(aDataTypeName), True);
+end;
+
+procedure TRODLToWSDL.ResolveExternalReferences(aLibrary: TRODLLibrary);
+var
+ i, j, k: Integer;
+ lIsTarget: Boolean;
+ lServ: TRODLService;
+ lStr: TRODLStruct;
+ lEx: TRODLException;
+ lEl: TRODLEntity;
+
+ lOp: TRODLOperation;
+ lList: TList;
+
+begin
+ lList := TList.Create;
+ try
+ // assume only 1 of fTargetEntity/fTargetXsd is set
+ for i := 0 to aLibrary.ExceptionCount -1 do begin
+ lEx := aLibrary.Exceptions[i];
+ if (lEx.Attributes.Values['ElementUrl'] = fTargetXSD) and (lEx.Count = 1) then begin
+ fHasXsdData := true;
+ if (fXsdTns = '') and (lEx.Attributes.Values['ElementNamespace'] <> '') then
+ fXsdTns := lEx.Attributes.Values['ElementNamespace'];
+ lEl := aLibrary.ItemByName(lEx.Items[0].DataType);
+ if (lEl <> nil) and (lEl.Attributes.Values['ImportedFromUrl'] <> fTargetXSD) then
+ AddExternal(lEl);
+ lEl := aLibrary.ItemByName(lex.Ancestor);
+ if (lEl <> nil) and (lEl.Attributes.Values['ElementUrl'] <> fTargetXSD) then
+ AddExternal(lEl);
+ end;
+ end;
+ for i := 0 to aLibrary.ArrayCount -1 do begin
+ if aLibrary.Arrays[i].Attributes.Values['ImportedFromUrl'] = fTargetXSD then begin
+ fHasXsdData := true;
+ if (fXsdTns = '') and (aLibrary.Arrays[i].Attributes.Values['ImportedFromNamespace'] <> '') then
+ fXsdTns := aLibrary.Arrays[i].Attributes.Values['ImportedFromNamespace'];
+ lEl := aLibrary.ItemByName(aLibrary.Arrays[i].ElementType);
+ if (lEl <> nil) and (lEl.Attributes.Values['ImportedFromUrl'] <> fTargetXSD) then
+ AddExternal(lEl);
+ end else if fTargetXSD = '' then AddExternal(aLibrary.Arrays[i]);
+ end;
+ for i := 0 to aLibrary.StructCount -1 do begin
+ lStr := aLibrary.Structs[i];
+ if lStr.Attributes.Values['ImportedFromUrl'] = fTargetXSD then begin
+ while lStr <> nil do begin
+ fHasXsdData := true;
+ if (fXsdTns = '') and (lStr.Attributes.Values['ImportedFromNamespace'] <> '') then
+ fXsdTns := lStr.Attributes.Values['ImportedFromNamespace'];
+ for j := 0 to lStr.Count -1 do begin
+ lEl := aLibrary.ItemByName(lStr[j].DataType);
+ if (lEl <> nil) and (lEl.Attributes.Values['ImportedFromUrl'] <> fTargetXSD) then
+ AddExternal(lEl);
+ end;
+ lEl := aLibrary.ItemByName(lStr.Ancestor);
+ if (lEl <> nil) and (lEl.Attributes.Values['ImportedFromUrl'] <> fTargetXSD) then
+ AddExternal(lEl);
+ if lEl is TRODLStruct then
+ lStr := TRodlStruct(lEl)
+ else
+ break;
+ end;
+ end else if fTargetXSD = '' then AddExternal(lStr);
+ end;
+ for i := 0 to aLibrary.EnumCount -1 do begin
+ if aLibrary.Enums[i].Attributes.Values['ImportedFromUrl'] = fTargetXSD then begin
+ fHasXsdData := true;
+ if (fXsdTns = '') and (aLibrary.Enums[i].Attributes.Values['ImportedFromNamespace'] <> '') then
+ fXsdTns := aLibrary.Enums[i].Attributes.Values['ImportedFromNamespace'];
+
+ end else if fTargetXSD = '' then
+ AddExternal(aLibrary.Enums[i]);
+ end;
+ for i := 0 to aLibrary.ServiceCount -1 do begin
+ lServ := aLibrary.Services[i];
+ lIsTarget := ((fTargetEntity = '') or (lServ.Name = fTargetEntity)) and (fTargetXsd = '');
+ if lIsTarget or (fTargetXSD <> '') then begin
+ for j := 0 to lServ[0].Count -1 do begin
+ lOp := lServ[0][j];
+ if lIsTarget then
+ for k := 0 to lOp.Attributes.Count -1 do begin
+ if copy(lOp.Attributes[k], 1, 6) = 'fault_' then begin
+ AddExternal(aLibrary.FindException(lOp.Attributes.Values[lOp.Attributes.Names[k]]));
+ end;
+ end;
+ if lOp.Attributes.Values['InputImportedFromUrl'] = fTargetXSD then begin
+ for k := 0 to lOp.Count -1 do begin
+ if lOp[k].Flag in [fIn, fInOut] then begin
+ lEl := aLibrary.ItemByName(lOp[k].DataType);
+ if (lEl <> nil) and (lEl.Attributes.Values['ImportedFromUrl'] <> fTargetXSD) then
+ AddExternal(lEl);
+ end;
+ end;
+ end else if lIsTarget and (lOp.Attributes.Values['InputImportedFromUrl'] <> '') then begin
+ AddExternal(fTargetNamespace, lOp.Attributes.Values['InputImportedFromUrl']);
+ end;
+ if lOp.Attributes.Values['OutputImportedFromUrl'] = fTargetXSD then begin
+ for k := 0 to lOp.Count -1 do begin
+ if lOp[k].Flag in [fInOut] then begin
+ lEl := aLibrary.ItemByName(lOp[k].DataType);
+ if (lEl <> nil) and (lEl.Attributes.Values['ImportedFromUrl'] <> fTargetXSD) then
+ AddExternal(lEl);
+ end;
+ end;
+ if lOp.Result <> nil then begin
+ lEl := aLibrary.ItemByName(lOp.Result.DataType);
+ if (lEl <> nil) and (lEl.Attributes.Values['ImportedFromUrl'] <> fTargetXSD) then
+ AddExternal(lEl);
+ end;
+ end else if lIsTarget and (lOp.Attributes.Values['OutputImportedFromUrl'] <> '') then begin
+ AddExternal(fTargetNamespace, lOp.Attributes.Values['OutputImportedFromUrl']);
+ end;
+ end;
+ end;
+ end;
+
+ finally
+ lList.Free;
+ end;
+end;
+
+procedure TRODLToWSDL.WriteExceptionMessage(AnException: TRODLException);
+var
+ i: Integer;
+ lItem: TRODLTypedEntity;
+begin
+ if not fUseDocument then exit; // only supported for document
+ Write(Format('', [anException.Name]), 3);
+ for i := 0 to anException.Count -1 do begin
+ lItem := anException[i];
+ if AnException.Attributes.Values['ElementName'] <> '' then
+ Write(Format(' ', [lItem.Name, GetPrefix(AnException.Attributes.Values['ElementName'], AnException.Attributes.Values['ElementNamespace'])]), 6)
+ else
+ Write(Format(' ', [lItem.Name, ExtSOAPDataType(anException.OwnerLibrary, lItem.DataType)]), 6);
+ end;
+ Write(' ', 3);
+
+end;
+
+procedure TRODLToWSDL.WriteExceptionParts(aMeth: TRODLOperation);
+var
+ i: Integer;
+ s, lVal: string;
+begin
+ if not UseDocument then exit;
+ for i := 0 to aMeth.Attributes.Count -1 do begin
+ s := aMeth.Attributes.Names[i];
+ if copy(s,1,6)= 'fault_' then begin
+ lVal := aMeth.Attributes.Values[s];
+ if aMeth.OwnerLibrary.FindException(lVal) <> nil then begin
+ Write(Format(' ', [copy(s,7,MaxInt), lVal]), 9);
+ end;
+ end;
+ end;
+end;
+
+procedure TRODLToWSDL.WriteExceptionElement(anException: TRODLException);
+var
+ lRet: TRODLStruct;
+ i: Integer;
+begin
+ if fExternalTypesAsReferences and (anException.Attributes.Values['ElementUrl'] <> fTargetXSD) then exit;
+
+ if (anException.Attributes.Values['ElementType'] = '') and (anException.Attributes.Values['ElementName'] <> '') then begin
+ Write(Format('', [anException.Attributes.Values['ElementName']]), 9);
+ WriteAnnotation(anException.Documentation, 9); {Giovanni}
+ Write('', 9);
+ end else begin
+ if anException.Attributes.Values['ElementType'] = '' then
+ Write(Format('', [anException.Name]), 9)
+ else
+ Write(Format('', [anException.Attributes.Values['ElementType']]), 9);
+ WriteAnnotation(anException.Documentation, 9); {Giovanni}
+ end;
+ if anException.Ancestor <> '' then begin
+ write('', 9);
+ write(Format('', [ExtSOAPDataType(anException.OwnerLibrary, anException.Ancestor)]), 9);
+ end;
+ Write('', 12);
+
+ for i := 0 to anException.Count-1 do begin
+ with anException.Items[i] do begin
+ lRet := anException.OwnerLibrary.FindStruct(DataType);
+ if (lRet <> nil) and (lRet.Count = 1) and (lRet.Attributes.Values['Anonymous'] = '1') then begin
+ if lRet.Attributes.Values['Nillable'] = '1' then
+ Write(Format('', [Unprefix(Name), ExtSOAPDataType(anException.OwnerLibrary, lRet.Items[0].DataType)]), 15)
+ else
+ Write(Format('', [Unprefix(Name), ExtSOAPDataType(anException.OwnerLibrary, lRet.Items[0].DataType)]), 15);
+ end else begin
+ Write(Format('', [Unprefix(Name), ExtSOAPDataType(anException.OwnerLibrary, DataType)]), 15);
+ end;
+ WriteAnnotation(Documentation, 15); {Giovanni}
+ Write(' ',15);
+ end;
+ end;
+ Write(' ', 12);
+ if anException.Ancestor <> '' then begin
+ write(' ', 9);
+ write(' ', 9);
+ end;
+ Write(' ', 9);
+ if (anException.Attributes.Values['ElementType'] = '') and (anException.Attributes.Values['ElementName'] <> '') then
+ Write(' ', 9);
+ if anException.Attributes.Values['ElementType'] <> '' then begin
+ Write(Format(' ', [anException.Attributes.Values['ElementName'], anException.Attributes.Values['ElementType']]), 9);
+ end;
+end;
+
+function TRODLToWSDL.GetPrefix(const aType, aNs: string): String;
+begin
+ if (fTargetXSD = '') and (aNs = fTargetNamespace) then begin
+ result := 'tns:'+aType;
+ exit;
+ end;
+
+ if aNs <> '' then begin
+ result := 'ns'+IntToStr(fExternalRefs.IndexOf(aNs))+':'+Unprefix(aType);
+ exit;
+ end;
+ Result := 'tns:'+ aType;
+end;
+
+function TRODLToWSDL.ReplaceSpecialChars(aText: String): String;
+begin
+ result := StringReplace(aText, '&', '&', [rfReplaceAll, rfIgnoreCase]);
+ result := StringReplace(result, '"', '"', [rfReplaceAll, rfIgnoreCase]);
+ result := StringReplace(result, '''', ''', [rfReplaceAll, rfIgnoreCase]);
+ result := StringReplace(result, '<', '<', [rfReplaceAll, rfIgnoreCase]);
+ result := StringReplace(result, '>', '>', [rfReplaceAll, rfIgnoreCase]);
+end;
+
+end.
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToXML.pas b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToXML.pas
new file mode 100644
index 0000000..c2792b9
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen/uRODLToXML.pas
@@ -0,0 +1,586 @@
+unit uRODLToXML;
+
+{----------------------------------------------------------------------------}
+{ RemObjects SDK Library - CodeGen }
+{ }
+{ compiler: Delphi 5 and up, Kylix 2 and up }
+{ platform: Win32, Linux }
+{ }
+{ (c)opyright RemObjects Software. all rights reserved. }
+{ }
+{ Using this code requires a valid license of the RemObjects SDK }
+{ which can be obtained at http://www.remobjects.com. }
+{----------------------------------------------------------------------------}
+
+{$IFNDEF MSWINDOWS}
+{$I ../RemObjects.inc}
+{$ELSE}
+{$I ..\RemObjects.inc}
+{$ENDIF}
+
+interface
+
+uses
+ SysUtils,
+ Classes,uRODL,uROClasses;
+
+var
+ XMLFlagNames: XMLFlagNamesArray deprecated;
+
+type
+ { TRODLToXML }
+ TRODLToXML = class(TRODLConverter)
+ private
+ fFlattenUsedRODLs:boolean;
+ fStyleSheet: string;
+ fOutputFileName : string;
+ procedure WriteRoles(xml: TSTringList; aRoles: TStringArray);
+ procedure WriteArrays(xml: TStringList; aLibrary: TRODLLibrary);
+ procedure WriteAttributes(xml: TStringList; aEntity: TRODLEntity);
+ procedure WriteEnums(xml: TStringList; aLibrary: TRODLLibrary);
+ procedure WriteEventSinks(xml: TStringList; aLibrary: TRODLLibrary);
+ procedure WriteExceptions(xml: TStringList; aLibrary: TRODLLibrary);
+ procedure WriteServices(xml: TStringList; aLibrary: TRODLLibrary);
+ procedure WriteStructs(xml: TStringList; aLibrary: TRODLLibrary);
+ procedure WriteUses(xml: TStringList; aLibrary: TRODLLibrary);
+ function WriteAsCData(aData: string): string;
+ function Indent(SpaceCount: byte): string;
+ protected
+ procedure IntConvert(const aLibrary: TRODLLibrary; const aTargetEntity: string = ''); override;
+ public
+ constructor Create(const aLibrary: TRODLLibrary; iFlattenUsedRODLs:boolean=false; AOutputFileName: string = ''); reintroduce; overload;
+ constructor Create(const aLibraryFile: string; iFlattenUsedRODLs:boolean=false; AOutputFileName: string = ''); reintroduce; overload;
+
+ property StyleSheet: string read fStyleSheet write fStyleSheet;
+ end;
+
+ TXMLToRODL = uRODL.TXMLToRODL;
+
+function XMLFlagNameToFlag(const aName: string): TRODLParamFlag;
+
+function LoadLibraryFromXml(const aFilename: string): TRODLLibrary;
+
+implementation
+
+uses
+ {$IFDEF DEBUG_REMOBJECTS_RODLTOXML}eDebugServer, {$ENDIF}
+ TypInfo, {$IFDEF DELPHI5}ComObj,{$ENDIF}
+ uRORes, uROXMLIntf;
+
+function XMLFlagNameToFlag(const aName: string): TRODLParamFlag;
+begin
+ result := uRODL.XMLFlagNameToFlag(aName);
+end;
+
+function LoadLibraryFromXml(const aFilename: string): TRODLLibrary;
+begin
+ with uRODL.TXMLToRODL.Create do try
+ result := ReadFromFile(aFilename);
+ finally
+ Free;
+ end;
+end;
+
+constructor TRODLToXML.Create(const aLibrary: TRODLLibrary; iFlattenUsedRODLs: boolean; AOutputFileName: string);
+begin
+ fOutputFileName := AOutputFileName;
+ fFlattenUsedRODLs := iFlattenUsedRODLs;
+ inherited Create(aLibrary);
+end;
+
+constructor TRODLToXML.Create(const aLibraryFile: string; iFlattenUsedRODLs: boolean; AOutputFileName: string);
+begin
+ fOutputFileName := AOutputFileName;
+ fFlattenUsedRODLs := iFlattenUsedRODLs;
+ inherited Create(aLibraryFIle);
+end;
+
+procedure TRODLToXML.IntConvert(const aLibrary: TRODLLibrary; const aTargetEntity: string = '');
+var
+ lAdditional: string;
+ xml: TStringList;
+begin
+ xml := TStringList.Create;
+ with aLibrary do try
+ {$IFDEF FPC}
+ if aTargetEntity = '' then lAdditional := '' else //remove FPC warning
+ {$ENDIF FPC}
+ lAdditional := '';
+ if Namespace <> '' then lAdditional := 'Namespace="' + Namespace + '" ';
+
+ xml.Append('');
+ if fStyleSheet <> '' then
+ xml.Append('');
+
+ xml.Append(Format('', [Name, GUIDToString(UID)]));
+
+ WriteAttributes(xml, aLibrary);
+ WriteServices(xml, aLibrary);
+ WriteEventSinks(xml, aLibrary);
+ WriteStructs(xml, aLibrary);
+ WriteEnums(xml, aLibrary);
+ WriteArrays(xml, aLibrary);
+ WriteUses(xml, aLibrary);
+ WriteExceptions(xml, aLibrary);
+
+ xml.Append(' ');
+ finally
+ Buffer.AddStrings(xml);
+ xml.Free;
+ end;
+end;
+
+procedure TRODLToXML.WriteArrays(xml: TStringList; aLibrary: TRODLLibrary);
+var
+ i: Integer;
+begin
+ xml.Append(Indent(3) + '');
+ with aLibrary do
+ for i := 0 to (ArrayCount - 1) do begin
+ if fFlattenUsedRODLs or not Arrays[i].IsFromUsedRodl then
+ with Arrays[i] do begin
+ xml.Append(Indent(6) + Format('', [Name, GUIDToString(UID)]));
+ WriteAttributes(xml, Info);
+ xml.Append(Indent(3) + Format(' ', [ElementType]));
+ xml.Append(Indent(6) + ' ');
+ end;
+ end;
+ xml.Append(Indent(3) + ' ');
+end;
+
+function TRODLToXML.WriteAsCData(aData: string): string;
+
+ function CleanCDATA(const aString: string): string;
+ var
+ lLength: Integer;
+ begin
+ result := aString;
+ lLength := length(aString);
+ while (lLength > 0) and
+ {$IFDEF UNICODE}
+ (CharInSet(result[lLength],[#09,#10,#13,#32]))
+ {$ELSE}
+ (result[lLength] in [#09,#10,#13,#32])
+ {$ENDIF}
+ do dec(lLength);
+ SetLength(result, lLength);
+ for lLength := Length(Result) downto 1 do
+ if
+ {$IFDEF UNICODE}
+ CharInSet(Result[lLength] , [#0..#8,#11,#12,#14..#31])
+ {$ELSE}
+ (Result[lLength] in [#0..#8,#11,#12,#14..#31])
+ {$ENDIF}
+ then result[lLength] := #32;
+ result := StringReplace(result, ']]>', ']]>', [rfReplaceAll]);
+ end;
+
+begin
+ result := ''{$IFDEF UNICODE})){$ENDIF};
+end;
+
+function SafeHtmlAttribute(const s: string): string;
+begin
+ result := StringReplace(s, '&', '&' , [rfReplaceAll]);
+end;
+
+procedure TRODLToXML.WriteAttributes(xml: TStringList; aEntity: TRODLEntity);
+var
+ attr: Integer;
+begin
+ if aEntity.Documentation <> '' then
+ xml.Append(Indent(6) + '' + WriteAsCData(aEntity.Documentation) + ' ');
+
+ if (aEntity.Attributes.Count > 0) then begin
+ with aEntity.Attributes do begin
+ xml.Append(Indent(6) + '');
+
+ for attr := 0 to (aEntity.Attributes.Count - 1) do
+ xml.Append(Indent(9) + Format('<%s Value="%s" />',
+ [Names[attr], SafeHtmlAttribute(Values[Names[attr]])]));
+
+ xml.Append(Indent(6) + ' ');
+ end;
+ end;
+
+ if Assigned(aEntity.GroupUnder) then
+ xml.Append(Indent(6) + Format(' ', [GUIDToString(aEntity.GroupUnder.UID)]));
+end;
+
+procedure TRODLToXML.WriteEnums(xml: TStringList; aLibrary: TRODLLibrary);
+var
+ i, k: Integer;
+begin
+ xml.Append(Indent(3) + '');
+ with aLibrary do
+ for i := 0 to (EnumCount - 1) do begin
+
+ if fFlattenUsedRODLs or not Enums[i].IsFromUsedRodl then
+ with Enums[i] do begin
+ if not PrefixEnumValues then
+ xml.Append(Indent(6) + Format('', [Name, GUIDToString(UID)]))
+ else
+ xml.Append(Indent(6) + Format('', [Name, GUIDToString(UID)]));
+ WriteAttributes(xml, Info);
+ xml.Append(Indent(3) + '');
+ for k := 0 to (Count - 1) do begin
+ with Items[k] do begin
+ xml.Append(Indent(9) + Format('', [Name]));
+ WriteAttributes(xml, Info);
+ xml.Append(Indent(9) + ' ');
+ end;
+ end;
+ xml.Append(Indent(3) + ' ');
+ xml.Append(Indent(6) + ' ');
+ end;
+ end;
+ xml.Append(Indent(3) + ' ');
+end;
+
+procedure TRODLToXML.WriteEventSinks(xml: TStringList; aLibrary: TRODLLibrary);
+var
+ i, k, m, p: Integer;
+ lAdditional: string;
+begin
+ with aLibrary do
+ if EventSinkCount > 0 then begin
+ xml.Append(Indent(3) + '');
+ for i := 0 to (EventSinkCount - 1) do begin
+ if fFlattenUsedRODLs or not EventSinks[i].IsFromUsedRodl then
+ with EventSinks[i] do begin
+
+ lAdditional := '';
+ if ImplUnit <> '' then lAdditional := ' ImplUnit="' + ImplUnit + '"';
+ if ImplClass <> '' then lAdditional := lAdditional + ' ImplClass="' + ImplClass + '"';
+ if Ancestor <> '' then lAdditional := lAdditional + ' Ancestor="' + Ancestor + '"';
+ if Abstract then lAdditional := lAdditional + ' Abstract="1"';
+ xml.Append(Indent(6) + Format('', [Name, GUIDToString(UID)]));
+
+ WriteAttributes(xml, Info);
+
+ xml.Append(Indent(6) + '');
+
+ for k := 0 to (Count - 1) do begin
+ with Items[k] do begin
+ xml.Append(Indent(9) +
+ Format('', [Name, GUIDToString(UID)]));
+
+ WriteAttributes(xml, Info);
+
+ xml.Append(Indent(6) + '');
+ for m := 0 to (Count - 1) do begin
+ with Items[m] do begin
+ xml.Append(Indent(9) +
+ Format('', [Name, GUIDToString(UID)]));
+
+ WriteAttributes(xml, Info);
+
+ xml.Append(Indent(6) + '');
+
+ { ToDo: cloned from above for now; implement "proper" RODL->XML for 3.0 }
+ if Assigned(Result) then with Result do begin
+ with Result do begin
+ xml.Append(Format('', [Name, DataType, uRODL.XMLFlagNames[Flag]]));
+ WriteAttributes(xml, Info);
+ xml.Append(' ');
+ end;
+ end;
+
+ for p := 0 to (Count - 1) do begin
+ with Items[p] do begin
+ xml.Append(Format('', [Name, DataType, uRODL.XMLFlagNames[Flag]]));
+ WriteAttributes(xml, Info);
+ xml.Append(' ');
+ end;
+ end;
+ xml.Append(Indent(6) + ' ');
+ xml.Append(Indent(9) + ' ');
+ end;
+ end;
+ xml.Append(Indent(6) + ' ');
+
+ xml.Append(Indent(9) + ' ');
+ end;
+ end;
+
+ xml.Append(Indent(6) + ' ');
+ xml.Append(Indent(6) + ' ');
+ end;
+ end;
+ xml.Append(Indent(3) + ' ');
+ end;
+end;
+
+procedure TRODLToXML.WriteExceptions(xml: TStringList; aLibrary: TRODLLibrary);
+var
+ i, k: Integer;
+ lAdd: string;
+begin
+ with aLibrary do
+ if ExceptionCount > 0 then begin
+ xml.Append(Indent(3) + '');
+ for i := 0 to (ExceptionCount - 1) do begin
+ if fFlattenUsedRODLs or not Exceptions[i].IsFromUsedRodl then
+ with Exceptions[i] do begin
+
+ lAdd := '';
+ if AutoCreateParams then
+ lAdd := ' AutoCreateParams="1"'
+ else
+ lAdd := ' AutoCreateParams="0"';
+
+ if Ancestor <> '' then lAdd := lAdd+Format(' Ancestor="%s"',[Ancestor]);
+ if Abstract then lAdd := lAdd + ' Abstract="1"';
+
+ xml.Append(Indent(6) + Format('',[Name, GUIDToString(UID)]));
+ WriteAttributes(xml, Info);
+ xml.Append(Indent(3) + '');
+ for k := 0 to (Count - 1) do begin
+ with Items[k] do begin
+ xml.Append(Indent(9) + Format('', [Name, DataType]));
+ WriteAttributes(xml, Info);
+ xml.Append(Indent(9) + Format(' ', [Name, DataType]));
+ end;
+ end;
+ xml.Append(Indent(3) + ' ');
+ xml.Append(Indent(6) + ' ')
+ end;
+
+ end;
+ xml.Append(Indent(3) + ' ');
+ end;
+end;
+
+procedure TRODLToXML.WriteServices(xml: TStringList; aLibrary: TRODLLibrary);
+var
+ i, k, m, p: Integer;
+ lAdditional: string;
+begin
+ with aLibrary do begin
+ if GroupCount > 0 then begin
+ xml.Append(Indent(3) + '');
+ for i := 0 to (GroupCount - 1) do begin
+ if fFlattenUsedRODLs or not Groups[i].IsFromUsedRodl then begin
+ with Groups[i] do begin
+ xml.Append(Indent(6) + Format('', [Name, GUIDToString(UID)]));
+ WriteAttributes(xml, Info);
+ xml.Append(Indent(6) + ' ');
+ end;
+ end;
+ end;
+ xml.Append(Indent(3) + ' ');
+ end;
+
+ xml.Append(Indent(3) + '');
+ for i := 0 to (ServiceCount - 1) do begin
+ if fFlattenUsedRODLs or not Services[i].IsFromUsedRodl then
+ with Services[i] do begin
+
+ lAdditional := '';
+ if ImplUnit <> '' then lAdditional := ' ImplUnit="' + ImplUnit + '"';
+ if ImplClass <> '' then lAdditional := lAdditional + ' ImplClass="' + ImplClass + '"';
+ if Ancestor <> '' then lAdditional := lAdditional + ' Ancestor="' + Ancestor + '"';
+ if Abstract then lAdditional := lAdditional + ' Abstract="1"';
+ if isPrivate then lAdditional := lAdditional + ' Private="1"';
+
+ xml.Append(Indent(6) + Format('', [Name, GUIDToString(UID)]));
+ WriteRoles(xml, Roles);
+ WriteAttributes(xml, Info);
+
+ xml.Append(Indent(6) + '');
+
+ for k := 0 to (Count - 1) do begin
+ with Items[k] do begin
+ xml.Append(Indent(9) + Format('', [Name, GUIDToString(UID)]));
+ WriteAttributes(xml, Info);
+
+ xml.Append(Indent(6) + '');
+ for m := 0 to (Count - 1) do begin
+ with Items[m] do begin
+ if Length(Roles) = 0 then lAdditional := '' else begin
+ lAdditional := ' Roles="';
+ for p := 0 to Length(Roles) -1 do begin
+ if p <> 0 then lAdditional := lAdditional +',' + SafeHtmlAttribute(Roles[p]) else
+ lAdditional := lAdditional+SafeHtmlAttribute(Roles[p]);
+ end;
+ lAdditional := lAdditional + '"';
+ end;
+ if ForceAsyncResponse then
+ xml.Append(Indent(9) + Format('', [Name, GUIDToString(UID)]))
+ else
+ xml.Append(Indent(9) + Format('', [Name, GUIDToString(UID)]));
+ WriteRoles(xml, Roles);
+ WriteAttributes(xml, Info);
+
+ xml.Append(Indent(6) + '');
+
+ if Assigned(Result) then with Result do begin
+ with Result do begin
+ xml.Append(Format('', [Name, DataType, uRODL.XMLFlagNames[Flag]]));
+ WriteAttributes(xml, Info);
+ xml.Append(' ');
+ end;
+ end;
+
+ for p := 0 to (Count - 1) do begin
+ with Items[p] do begin
+ xml.Append(Format('', [Name, DataType, uRODL.XMLFlagNames[Flag]]));
+ WriteAttributes(xml, Info);
+ xml.Append(' ');
+ end;
+ end;
+ xml.Append(Indent(6) + ' ');
+
+ if CodeBodyCount > 0 then begin
+ xml.Append(Indent(6) + '');
+ for p := 0 to CodeBodyCount-1 do begin
+ xml.Append(Indent(6) + '' + WriteAsCData(CodeBodies[CodeBodyLanguages[p]].Text) + '');
+ end;
+ xml.Append(Indent(6) + '');
+ end;
+
+ xml.Append(Indent(9) + ' ');
+ end;
+ end;
+ xml.Append(Indent(6) + ' ');
+
+ xml.Append(Indent(9) + ' ');
+ end;
+ end;
+
+ xml.Append(Indent(6) + ' ');
+ xml.Append(Indent(6) + ' ');
+ end;
+ end;
+ end;
+ xml.Append(Indent(3) + ' ');
+end;
+
+procedure TRODLToXML.WriteStructs(xml: TStringList; aLibrary: TRODLLibrary);
+var
+ i, k: Integer;
+ lAdditional: string;
+begin
+ xml.Append(Indent(3) + '');
+ with aLibrary do
+ for i := 0 to (StructCount - 1) do begin
+
+ if fFlattenUsedRODLs or not Structs[i].IsFromUsedRodl then
+ with Structs[i] do begin
+
+ lAdditional := '';
+ if AutoCreateParams then
+ lAdditional := ' AutoCreateParams="1"'
+ else
+ lAdditional := ' AutoCreateParams="0"';
+
+ if Ancestor <> '' then lAdditional := lAdditional + Format(' Ancestor="%s"', [Ancestor]);
+ if Abstract then lAdditional := lAdditional + ' Abstract="1"';
+
+ xml.Append(Indent(6) + Format('',
+ [Name, GUIDToString(UID)]));
+
+ WriteAttributes(xml, Info);
+ xml.Append(Indent(3) + '');
+ for k := 0 to (Count - 1) do begin
+ with Items[k] do begin
+ xml.Append(Indent(9) + Format('', [Name, DataType]));
+ WriteAttributes(xml, Info);
+ xml.Append(Indent(9) + Format(' ', [Name, DataType]));
+ end;
+ end;
+ xml.Append(Indent(3) + ' ');
+ xml.Append(Indent(6) + ' ');
+ end;
+
+ end;
+ xml.Append(Indent(3) + ' ');
+end;
+
+procedure TRODLToXML.WriteUses(xml: TStringList; aLibrary: TRODLLibrary);
+var
+ i: Integer;
+ lSplitModeAttribute: string;
+ lUsedRodlFilename, lUsedRodlFilename_absolute: string;
+ lDir: string;
+begin
+ lDir := ExtractFilePath(fOutputFileName);
+ with aLibrary do
+ if UseCount > 0 then begin
+ xml.Append(Indent(3) + '');
+ for i := 0 to (UseCount - 1) do begin
+ if (not fFlattenUsedRODLs) and (not Use[i].IsFromUsedRodl) then
+ with Use[i] do begin
+ lUsedRodlFilename := RodlFile;
+ lUsedRodlFilename_absolute := AbsoluteRodlFile;
+ if lUsedRodlFilename_absolute = '' then
+ lUsedRodlFilename_absolute := ExpandFileName(ExpandVariables(lUsedRodlFilename));
+ if lDir <> '' then
+ lUsedRodlFilename := ExtractRelativePath(lDir,lUsedRodlFilename);
+ lSplitModeAttribute := '';
+ if SplitMode <> usmAsParent then
+ lSplitModeAttribute := Format(' SplitMode="%s"', [IntToStr(Integer(SplitMode))]);
+ if GenerateCode then
+ xml.Append(Indent(6) + Format('',
+ [Name, GUIDToString(UID), lUsedRodlFilename, lUsedRodlFilename_absolute, lSplitModeAttribute]))
+ else
+ xml.Append(Indent(6) + Format('',
+ [Name, GUIDToString(UID), lUsedRodlFilename, lUsedRodlFilename_absolute, lSplitModeAttribute]));
+ WriteAttributes(xml, Info);
+ xml.Append(Indent(6) + ' ')
+ end;
+
+ end;
+ xml.Append(Indent(3) + ' ');
+ end;
+end;
+
+function TRODLToXML.Indent(SpaceCount: byte): string;
+{var
+ i: integer;}
+begin
+ {$IFDEF FPC}
+ if SpaceCount = 0 then result := '' else // removing FPC warning
+ {$ENDIF}
+ result := '';
+ {for i := 1 to SpaceCount do
+ result := result + ' ';}
+end;
+
+(*
+function StringToGUID(const s: string): TGUID;
+begin
+ if s = '' then Result := NewGuid else begin
+ try
+ Result := Sysutils.StringToGUID(s);
+ except
+ on e: EConvertError do
+ Result := NewGuid;
+ end;
+ end;
+end;
+*)
+procedure TRODLToXML.WriteRoles(xml: TSTringList; aRoles: TStringArray);
+var
+ s: string;
+ i: Integer;
+begin
+ if Length(aRoles) = 0 then exit;
+ xml.Add(Indent(6) + '');
+ for i := 0 to Length(aRoles) -1 do begin
+ s := Trim(aRoles[i]);
+ if Copy(s,1,1) = '!' then begin
+ Delete(s,1,1);
+ s := TrimLeft(s);
+ xml.Add(Indent(8) + ''+SafeHtmlAttribute(s)+' ');
+ end else xml.Add(Indent(8) + ''+SafeHtmlAttribute(s)+' ');
+ end;
+ xml.Add(Indent(6) + ' ');
+end;
+
+initialization
+ {$WARN SYMBOL_DEPRECATED OFF}
+ XMLFlagNames := uRODL.XMLFlagNames;
+ {$WARN SYMBOL_DEPRECATED ON}
+end.
+
diff --git a/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen2/Templates/Templates.lrs b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen2/Templates/Templates.lrs
new file mode 100644
index 0000000..5d15517
--- /dev/null
+++ b/internal/6.0.43.801/1/RemObjects SDK for Delphi/Source/CodeGen2/Templates/Templates.lrs
@@ -0,0 +1,3689 @@
+LazarusResources.Add('TEMPLATE_INTF_PAS','RCDATA',[
+ 'unit %UNIT_NAME%;'#13#10#13#10'{--------------------------------------------'
+ +'--------------------------------}'#13#10'{ This unit was automatically gene'
+ +'rated by the RemObjects SDK after reading }'#13#10'{ the RODL file associa'
+ +'ted with this project . }'#13#10'{ '
+ +' }'#13#10'{'
+ +' Do not modify this unit manually, or your changes will be lost when this '
+ +' }'#13#10'{ unit is regenerated the next time you compile the project. '
+ +' }'#13#10'{-----------------------------------------------------'
+ +'-----------------------}'#13#10#13#10'{$I RemObjects.inc}'#13#10#13#10'inte'
+ +'rface'#13#10#13#10'uses'#13#10' {vcl:} Classes, TypInfo,'#13#10' // <%%% '
+ +'START REQUIRED_UNITS %%%>'#13#10' {Required:} %REQUIRED_UNIT_NAME%,'#13#10
+ +' // <%%% END REQUIRED_UNITS %%%>'#13#10' {RemObjects:} uROXMLIntf, uROCla'
+ +'sses, uROClient, uROTypes, uROClientIntf;'#13#10#13#10'const'#13#10' { Lib'
+ +'rary ID }'#13#10' LibraryUID = ''%LIBRARY_UID%'';'#13#10' TargetNamespace'
+ +' = ''%NAMESPACE_NAME%'';'#13#10#13#10' { Service Interface ID''s }'#13#10
+ +' // <%%% START SERVICES %%%>'#13#10' I%SERVICE_NAME%_IID : TGUID = ''%SER'
+ +'VICE_UID%'';'#13#10' // <%%% END SERVICES %%%>'#13#10' '#13#10' { Event '
+ +'ID''s }'#13#10' // <%%% START EVENT_SINKS %%%>'#13#10' EID_%EVENT_SINK_NA'
+ +'ME% = ''%EVENT_SINK_NAME%'';'#13#10' // <%%% END EVENT_SINKS %%%>'#13#10' '
+ +' '#13#10'type'#13#10' { Forward declarations }'#13#10' // <%%% START SERV'
+ +'ICES %%%>'#13#10' I%SERVICE_NAME% = interface;'#13#10' // <%%% END SERVIC'
+ +'ES %%%>'#13#10' // <%%% START ARRAYS %%%>'#13#10' %ARRAY_NAME% = class;'
+ +#13#10' // <%%% END ARRAYS %%%>'#13#10' // <%%% START STRUCTS %%%>'#13#10
+ +' %STRUCT_NAME% = class;'#13#10' // <%%% END STRUCTS %%%>'#13#10' // <%%%'
+ +' START EXCEPTIONS %%%>'#13#10' %EXCEPTION_NAME% = class;'#13#10' // <%%% '
+ +'END EXCEPTIONS %%%>'#13#10' // <%%% START EVENT_SINKS %%%>'#13#10' I%EVEN'
+ +'T_SINK_NAME% = interface;'#13#10' // <%%% END EVENT_SINKS %%%>'#13#10#13#10
+ +' { Enumerateds }'#13#10' // <%%% START ENUMS %%%>'#13#10' // <%%% START '
+ +'DOCUMENTATION %%%>'#13#10#13#10' { Description:'#13#10' %CONTENT% }'
+ +#13#10' // <%%% END DOCUMENTATION %%%>'#13#10' %ENUM_NAME% = ('#13#10' '
+ +' // <%%% START VALUES %%%>'#13#10' %VALUE_NAME%,'
+ +#13#10' // <%%% END VALUES %%%>'#13#10' );'#13
+ +#10#13#10' // <%%% END ENUMS %%%>'#13#10' // <%%% START STRUCTS %%%>'#13#10
+ +' { %STRUCT_NAME% }'#13#10' // <%%% START DOCUMENTATION %%%>'#13#10#13#10
+ +' { Description:'#13#10' %CONTENT% }'#13#10' // <%%% END DOCUMENTATIO'
+ +'N %%%>'#13#10' %STRUCT_NAME% = class(%STRUCT_ANCESTOR_NAME%)'#13#10' priv'
+ +'ate'#13#10' FDestroying: Boolean;'#13#10#13#10' // <%%% START FIELDS_'
+ +'NO_STRIP %%%>'#13#10' f%FIELD_NAME%: %FIELD_TYPE%;'#13#10' // <%%% EN'
+ +'D FIELDS_NO_STRIP %%%>'#13#10' // <%%% START FIELDS_NO_STRIP %%%>'#13#10
+ +' // <%%% START IF_FIELD_TYPE_COMPLEX %%%>'#13#10' function Get%FIELD_'
+ +'NAME%: %FIELD_TYPE%;'#13#10' // <%%% END IF_FIELD_TYPE_COMPLEX %%%>'#13
+ +#10' // <%%% END FIELDS_NO_STRIP %%%>'#13#10' public'#13#10' // <%%% '
+ +'START STRUCT_GENERATE_DEFAULT_VALUES %%%>'#13#10' constructor Create(aCo'
+ +'llection : TCollection); override;'#13#10' // <%%% END STRUCT_GENERATE_D'
+ +'EFAULT_VALUES %%%>'#13#10' // <%%% START IF_STRUCT_HAS_ATTRIBUTES %%%>'
+ +#13#10' class function GetAttributeCount: Integer; override;'#13#10' c'
+ +'lass function GetAttributeName(aIndex: Integer): string; override;'#10' '
+ +'class function GetAttributeValue(aIndex: Integer): string; override;'#10' '
+ +' // <%%% END IF_STRUCT_HAS_ATTRIBUTES %%%>'#13#10' procedure Assign(iSo'
+ +'urce: TPersistent); override;'#13#10' destructor Destroy; override;'#13
+ +#10' // <%%% START IF_HAS_FIELDS %%%>'#13#10' procedure ReadComplex(AS'
+ +'erializer: TObject); override;'#13#10' procedure WriteComplex(ASerialize'
+ +'r: TObject); override;'#13#10' // <%%% END IF_HAS_FIELDS %%%>'#13#10' p'
+ +'ublished'#13#10' // Fields must be published for the ancestor destructor'
+ +' to find and destroy them.'#13#10' // <%%% START FIELDS_NO_STRIP %%%>'#13
+ +#10' // <%%% START IF_FIELD_TYPE_SIMPLE %%%>'#13#10' property %FIELD_N'
+ +'AME%:%FIELD_TYPE% read f%FIELD_NAME% write f%FIELD_NAME%;'#13#10' // <%%'
+ +'% END IF_FIELD_TYPE_SIMPLE %%%>'#13#10' // <%%% START IF_FIELD_TYPE_COMP'
+ +'LEX %%%>'#13#10' property %FIELD_NAME%:%FIELD_TYPE% read Get%FIELD_NAME%'
+ +' write f%FIELD_NAME%;'#13#10' // <%%% END IF_FIELD_TYPE_COMPLEX %%%>'#13
+ +#10' // <%%% END FIELDS_NO_STRIP %%%>'#13#10' end;'#13#10#13#10' { %STR'
+ +'UCT_COLLECTION_NAME% }'#13#10' %STRUCT_COLLECTION_NAME% = class(%STRUCT_AN'
+ +'CESTOR_COLLECTION_NAME%)'#13#10' protected'#13#10' constructor Create(a'
+ +'ItemClass: TCollectionItemClass); overload;'#13#10' function GetItems(aI'
+ ,'ndex: integer): %STRUCT_NAME%;'#13#10' procedure SetItems(aIndex: intege'
+ +'r; const Value: %STRUCT_NAME%);'#13#10' public'#13#10' constructor Crea'
+ +'te; overload;'#13#10' function Add: %STRUCT_NAME%; reintroduce;'#13#10' '
+ +' // <%%% START ARRAYS_IS_FOUND %%%>'#13#10' procedure SaveToArray(anAr'
+ +'ray: %ARRAY_NAME%); overload;'#13#10' procedure LoadFromArray(anArray: %'
+ +'ARRAY_NAME%); overload;'#13#10' // <%%% END ARRAYS_IS_FOUND %%%>'#13#10
+ +' property Items[Index: integer]:%STRUCT_NAME% read GetItems write SetIte'
+ +'ms; default;'#13#10' end;'#13#10#13#10' // <%%% END STRUCTS %%%>'#13#10' '
+ +' // <%%% START ARRAYS %%%>'#13#10' { %ARRAY_NAME% }'#13#10' // <%%% START'
+ +' DOCUMENTATION %%%>'#13#10#13#10' { Description:'#13#10' %CONTENT% }'
+ +#13#10' // <%%% END DOCUMENTATION %%%>'#13#10' %ARRAY_NAME%_%ARRAY_TYPE% ='
+ +' array of %ARRAY_TYPE%;'#13#10' %ARRAY_NAME% = class(TROArray)'#13#10' pr'
+ +'ivate'#13#10' fCount: Integer;'#13#10' fItems : %ARRAY_NAME%_%ARRAY_T'
+ +'YPE%;'#13#10' protected'#13#10' procedure Grow; virtual;'#13#10' fun'
+ +'ction GetItems(aIndex: integer): %ARRAY_TYPE%;'#13#10' procedure SetItem'
+ +'s(aIndex: integer; const Value: %ARRAY_TYPE%);'#13#10' function GetCount'
+ +': integer; override;'#13#10' public'#13#10' // <%%% START IF_ARRAY_HAS_'
+ +'ATTRIBUTES %%%>'#13#10' class function GetAttributeCount: Integer; overr'
+ +'ide;'#13#10' class function GetAttributeName(aIndex: Integer): string; o'
+ +'verride;'#10' class function GetAttributeValue(aIndex: Integer): string;'
+ +' override;'#10' // <%%% END IF_ARRAY_HAS_ATTRIBUTES %%%>'#13#10' clas'
+ +'s function GetItemType: PTypeInfo; override;'#13#10' // <%%% START IF_AR'
+ +'RAY_TYPE_COMPLEX %%%>'#13#10' class function GetItemClass: TClass; overr'
+ +'ide;'#13#10' // <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' class fun'
+ +'ction GetItemSize: integer; override;'#13#10#13#10' function GetItemRef('
+ +'aIndex: integer): pointer; override;'#13#10' // <%%% START IF_ARRAY_TYPE'
+ +'_COMPLEX %%%>'#13#10' procedure SetItemRef(aIndex: integer; Ref: pointer'
+ +'); override;'#13#10' // <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' p'
+ +'rocedure Clear; override;'#13#10' procedure Delete(aIndex: integer); ove'
+ +'rride;'#13#10' procedure Resize(ElementCount: integer); override;'#13#10
+ +#13#10' procedure Assign(iSource:TPersistent); override;'#13#10' proce'
+ +'dure ReadComplex(ASerializer: TObject); override;'#13#10' procedure Writ'
+ +'eComplex(ASerializer: TObject); override;'#13#10' // <%%% START IF_ARRAY'
+ +'_TYPE_COMPLEX %%%>'#13#10' function Add: %ARRAY_TYPE%; overload;'#13#10
+ +' // <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' function Add(const Va'
+ +'lue: %ARRAY_TYPE%):integer; overload;'#13#10' // <%%% START IF_ARRAY_TYP'
+ +'E_SIMPLE %%%>'#13#10' function GetIndex(const aPropertyName : string;'#13
+ +#10' const aPropertyValue : Variant;'#13#10' '
+ +' StartFrom : integer = 0;'#13#10' Options : '
+ +'TROSearchOptions = [soIgnoreCase]) : integer; override;'#13#10' // <%%% '
+ +'END IF_ARRAY_TYPE_SIMPLE %%%>'#13#10#13#10' property Count : integer rea'
+ +'d GetCount;'#13#10' property Items[Index: integer]:%ARRAY_TYPE% read Get'
+ +'Items write SetItems; default;'#13#10' property InnerArray: %ARRAY_NAME%'
+ +'_%ARRAY_TYPE% read fItems;'#13#10' end;'#13#10#13#10' // <%%% END ARRAYS '
+ +'%%%>'#13#10' { Exceptions }'#13#10' // <%%% START EXCEPTIONS %%%>'#13#10
+ +' // <%%% START DOCUMENTATION %%%>'#13#10#13#10' { Description:'#13#10' '
+ +' %CONTENT% }'#13#10' // <%%% END DOCUMENTATION %%%>'#13#10' %EXCEPTION_'
+ +'NAME% = class(%EXCEPTION_ANCESTOR_NAME%)'#13#10' private'#13#10' // <%%'
+ +'% START FIELDS_NO_STRIP %%%>'#13#10' f%FIELD_NAME%: %FIELD_TYPE%;'#13#10
+ +' // <%%% END FIELDS_NO_STRIP %%%>'#13#10' public'#13#10' constructor'
+ +' Create(anExceptionMessage : string'#13#10' // <%%% S'
+ +'TART ANCESTOR_FIELDS %%%>'#13#10' ; a%FIELD_NAME%: %F'
+ +'IELD_TYPE%'#13#10' // <%%% END ANCESTOR_FIELDS %%%>'
+ +#13#10' // <%%% START FIELDS_NO_STRIP %%%>'#13#10' '
+ +' ; a%FIELD_NAME%: %FIELD_TYPE%'#13#10' '
+ +' // <%%% END FIELDS_NO_STRIP %%%>'#13#10' );'#13#10
+ +' // <%%% START IF_HAS_FIELDS %%%>'#13#10' procedure ReadException(ASe'
+ +'rializer: TObject); override;'#13#10' procedure WriteException(ASerializ'
+ +'er: TObject); override;'#13#10' // <%%% END IF_HAS_FIELDS %%%>'#13#10' '
+ +'published'#13#10' // <%%% START FIELDS_NO_STRIP %%%>'#13#10' property'
+ +' %FIELD_NAME%: %FIELD_TYPE% read f%FIELD_NAME% write f%FIELD_NAME%;'#13#10
+ +' // <%%% END FIELDS_NO_STRIP %%%>'#13#10' end;'#13#10#13#10' // <%%% E'
+ +'ND EXCEPTIONS %%%>'#13#10' // <%%% START SERVICES %%%>'#13#10' { I%SERVIC'
+ +'E_NAME% }'#13#10' // <%%% START DOCUMENTATION %%%>'#13#10#13#10' { Descri'
+ ,'ption:'#13#10' %CONTENT% }'#13#10' // <%%% END DOCUMENTATION %%%>'#13
+ +#10' I%SERVICE_NAME% = interface%SERVICE_ANCESTOR_NAME%'#13#10' [''%SERV'
+ +'ICE_UID%'']'#13#10' // <%%% START FUNCTION_OPERATIONS %%%>'#13#10' fu'
+ +'nction %OPERATION_NAME%('#13#10' // <%%% START PARAMS %%%>'#13
+ +#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10
+ +' // <%%% END PARAMS %%%>'#13#10' ): %OPERATION_'
+ +'RESULT%;'#13#10' // <%%% END FUNCTION_OPERATIONS %%%>'#13#10' // <%%%'
+ +' START PROCEDURE_OPERATIONS %%%>'#13#10' procedure %OPERATION_NAME%('#13
+ +#10' // <%%% START PARAMS %%%>'#13#10' %PARAM_'
+ +'FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' // <%%% '
+ +'END PARAMS %%%>'#13#10' );'#13#10' // <%%% END PROCEDURE_'
+ +'OPERATIONS %%%>'#13#10' end;'#13#10#13#10' { Co%SERVICE_NAME% }'#13#10' '
+ +'Co%SERVICE_NAME% = class'#13#10' class function Create(const aMessage: I'
+ +'ROMessage; aTransportChannel: IROTransportChannel): I%SERVICE_NAME%;'#13#10
+ +' end;'#13#10#13#10' { T%SERVICE_NAME%_Proxy }'#13#10' T%SERVICE_NAME%_Pr'
+ +'oxy = class(%SERVICE_PROXY_ANCESTOR_NAME%, I%SERVICE_NAME%)'#13#10' protec'
+ +'ted'#13#10' function __GetInterfaceName:string; override;'#13#10#13#10' '
+ +' // <%%% START FUNCTION_OPERATIONS %%%>'#13#10' function %OPERATION_NA'
+ +'ME%('#13#10' // <%%% START PARAMS %%%>'#13#10' '
+ +'%PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' //'
+ +' <%%% END PARAMS %%%>'#13#10' ): %OPERATION_RESULT%;'#13#10' '
+ +' // <%%% END FUNCTION_OPERATIONS %%%>'#13#10' // <%%% START PROCEDURE_'
+ +'OPERATIONS %%%>'#13#10' procedure %OPERATION_NAME%('#13#10' '
+ +' // <%%% START PARAMS %%%>'#13#10' %PARAM_FRONT_MODIFIER% '
+ +'%PARAM_NAME%: %PARAM_TYPE%;'#13#10' // <%%% END PARAMS %%%>'
+ +#13#10' );'#13#10' // <%%% END PROCEDURE_OPERATIONS %%%>'
+ +#13#10' end;'#13#10#13#10' // <%%% END SERVICES %%%>'#13#10' // <%%% STAR'
+ +'T EVENT_SINKS %%%>'#13#10' { I%EVENT_SINK_NAME% }'#13#10' // <%%% START D'
+ +'OCUMENTATION %%%>'#13#10#13#10' { Description:'#13#10' %CONTENT% }'#13
+ +#10' // <%%% END DOCUMENTATION %%%>'#13#10' I%EVENT_SINK_NAME% = interface'
+ +'%EVENT_SINK_ANCESTOR_NAME%'#13#10' [''%EVENT_SINK_UID%'']'#13#10' // '
+ +'<%%% START OPERATIONS %%%>'#13#10' procedure %OPERATION_NAME%('#13#10' '
+ +' // <%%% START PARAMS %%%>'#13#10' %PARAM_FRONT'
+ +'_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' // <%%% END P'
+ +'ARAMS %%%>'#13#10' );'#13#10' // <%%% END OPERATIONS %%%>'
+ +#13#10' end;'#13#10#13#10' { I%EVENT_SINK_NAME%_Writer }'#13#10' // <%%% '
+ +'START DOCUMENTATION %%%>'#13#10#13#10' { Description:'#13#10' %CONTEN'
+ +'T% }'#13#10' // <%%% END DOCUMENTATION %%%>'#13#10' I%EVENT_SINK_NAME%_Wr'
+ +'iter = interface(I%EVENT_SINK_WRITER_ANCESTOR_NAME%)'#13#10' [''%EVENT_S'
+ +'INK_UID%'']'#13#10' // <%%% START OPERATIONS %%%>'#13#10' procedure %'
+ +'OPERATION_NAME%(const __Sender : TGUID'#13#10' // <%%% START'
+ +' PARAMS %%%>'#13#10' ; %PARAM_FRONT_MODIFIER% %PARAM_NAME%: '
+ +'%PARAM_TYPE%'#13#10' // <%%% END PARAMS %%%>'#13#10' '
+ +' );'#13#10' // <%%% END OPERATIONS %%%>'#13#10' end;'#13#10#13#10
+ +' // <%%% END EVENT_SINKS %%%>'#13#10'implementation'#13#10#13#10'uses'#13
+ +#10' {vcl:} SysUtils,'#13#10' {RemObjects:} uROEventRepository, uROSeriali'
+ +'zer, uRORes;'#13#10#13#10'// <%%% START EXCEPTIONS %%%>'#13#10'{ %EXCEPTION'
+ +'_NAME% }'#13#10'constructor %EXCEPTION_NAME%.Create(anExceptionMessage : st'
+ +'ring'#13#10' // <%%% START ANCESTOR_FIELDS %%%>'#13#10' ; a%FIELD_NAME%: '
+ +'%FIELD_TYPE%'#13#10' // <%%% END ANCESTOR_FIELDS %%%>'#13#10' // <%%% STA'
+ +'RT FIELDS_NO_STRIP %%%>'#13#10' ; a%FIELD_NAME%: %FIELD_TYPE%'#13#10' // '
+ +'<%%% END FIELDS_NO_STRIP %%%>'#13#10' );'#13#10'begin'#13#10' inherited C'
+ +'reate(anExceptionMessage'#13#10' // <%%% START ANCESTOR_F'
+ +'IELDS %%%>'#13#10' , a%FIELD_NAME%'#13#10' '
+ +' // <%%% END ANCESTOR_FIELDS %%%>'#13#10' );'#13#10#13
+ +#10' // <%%% START FIELDS_NO_STRIP %%%>'#13#10' f%FIELD_NAME% := a%FIELD_N'
+ +'AME%;'#13#10' // <%%% END FIELDS_NO_STRIP %%%>'#13#10'end;'#13#10#13#10'//'
+ +' <%%% START IF_HAS_FIELDS %%%>'#13#10'procedure %EXCEPTION_NAME%.ReadExcept'
+ +'ion(ASerializer: TObject);'#13#10'var'#13#10' // <%%% START ENTIRE_HIERARC'
+ +'HY_FIELDS %%%>'#13#10' l_%FIELD_NAME%: %FIELD_TYPE%;'#13#10' // <%%% END '
+ +'ENTIRE_HIERARCHY_FIELDS %%%>'#13#10'begin'#13#10' if TROSerializer(ASerial'
+ +'izer).RecordStrictOrder then begin'#13#10' // <%%% START IF_STRUCT_HAS_A'
+ +'NCESTOR %%%>'#13#10' inherited;'#13#10' // <%%% END IF_STRUCT_HAS_ANC'
+ +'ESTOR %%%>'#13#10' // <%%% START FIELDS_NO_STRIP %%%>'#13#10' l_%FIEL'
+ ,'D_NAME% := %FIELD_NAME%;'#13#10' // <%%% START IF_FIELD_BINARY_TYPE %%%>'
+ +#13#10' TROSerializer(ASerializer).ReadBinary(''%FIELD_ORIGINALNAME%'', l'
+ +'_%FIELD_NAME%);'#13#10' if %FIELD_NAME% <> l_%FIELD_NAME% then %FIELD_NA'
+ +'ME%.Free;'#13#10' // <%%% END IF_FIELD_BINARY_TYPE %%%>'#13#10' // <%'
+ +'%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' TROSerializer(ASerializer).R'
+ +'eadEnumerated(''%FIELD_ORIGINALNAME%'', TypeInfo(boolean), l_%FIELD_NAME%);'
+ +#13#10' // <%%% END IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' // <%%% START I'
+ +'F_FIELD_CURRENCY_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadDouble'
+ +'(''%FIELD_ORIGINALNAME%'', ftCurr, l_%FIELD_NAME%);'#13#10' // <%%% END '
+ +'IF_FIELD_CURRENCY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DATETIME_TYPE'
+ +' %%%>'#13#10' TROSerializer(ASerializer).ReadDateTime(''%FIELD_ORIGINALN'
+ +'AME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DATETIME_TYPE %%%>'
+ +#13#10' // <%%% START IF_FIELD_DECIMAL_TYPE %%%>'#13#10' TROSerializer'
+ +'(ASerializer).ReadDecimal(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10
+ +' // <%%% END IF_FIELD_DECIMAL_TYPE %%%>'#13#10' // <%%% START IF_FIEL'
+ +'D_DOUBLE_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadDouble(''%FIEL'
+ +'D_ORIGINALNAME%'', ftDouble, l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIE'
+ +'LD_DOUBLE_TYPE %%%>'#13#10' // <%%% START IF_FIELD_GUID_TYPE %%%>'#13#10
+ +' TROSerializer(ASerializer).ReadGuid(''%FIELD_ORIGINALNAME%'', l_%FIELD_'
+ +'NAME%);'#13#10' // <%%% END IF_FIELD_GUID_TYPE %%%>'#13#10' // <%%% S'
+ +'TART IF_FIELD_INT64_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadInt'
+ +'64(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIE'
+ +'LD_INT64_TYPE %%%>'#13#10' // <%%% START IF_FIELD_INTEGER_TYPE %%%>'#13
+ +#10' TROSerializer(ASerializer).ReadInteger(''%FIELD_ORIGINALNAME%'', otS'
+ +'Long, l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_INTEGER_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' TROSerializer'
+ +'(ASerializer).ReadAnsiString(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' // <%%% START I'
+ +'F_FIELD_UTF8STRING_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadUTF8'
+ +'String(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF'
+ +'_FIELD_UTF8STRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_VARIANT_TYPE '
+ +'%%%>'#13#10' TROSerializer(ASerializer).ReadVariant(''%FIELD_ORIGINALNAM'
+ +'E%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_VARIANT_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_WIDESTRING_TYPE %%%>'#13#10' TROSerializer'
+ +'(ASerializer).ReadWideString(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_WIDESTRING_TYPE %%%>'#13#10' // <%%% START I'
+ +'F_FIELD_XML_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadXml(''%FIEL'
+ +'D_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_XML_TYP'
+ +'E %%%>'#13#10' // <%%% START IF_FIELD_ARRAY_TYPE %%%>'#13#10' TROSeri'
+ +'alizer(ASerializer).ReadArray(''%FIELD_ORIGINALNAME%'', %FIELD_TYPE%, l_%FI'
+ +'ELD_NAME%);'#13#10' if %FIELD_NAME% <> l_%FIELD_NAME% then %FIELD_NAME%.'
+ +'Free;'#13#10' // <%%% END IF_FIELD_ARRAY_TYPE %%%>'#13#10' // <%%% ST'
+ +'ART IF_FIELD_ENUM_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadEnume'
+ +'rated(''%FIELD_ORIGINALNAME%'', TypeInfo(%FIELD_TYPE%), l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_ENUM_TYPE %%%>'#13#10' // <%%% START IF_FIEL'
+ +'D_STRUCT_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadStruct(''%FIEL'
+ +'D_ORIGINALNAME%'', %FIELD_TYPE%, l_%FIELD_NAME%);'#13#10' if %FIELD_NAME'
+ +'% <> l_%FIELD_NAME% then %FIELD_NAME%.Free;'#13#10' // <%%% END IF_FIELD'
+ +'_STRUCT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_XSDATETIME_TYPE %%%>'#13
+ +#10' TROSerializer(ASerializer).ReadStruct(''%FIELD_ORIGINALNAME%'', %FIE'
+ +'LD_TYPE%, l_%FIELD_NAME%);'#13#10' if %FIELD_NAME% <> l_%FIELD_NAME% the'
+ +'n %FIELD_NAME%.Free;'#13#10' // <%%% END IF_FIELD_XSDATETIME_TYPE %%%>'
+ +#13#10' %FIELD_NAME% := l_%FIELD_NAME%;'#13#10' // <%%% END FIELDS_NO_'
+ +'STRIP %%%>'#13#10' end'#13#10' else begin'#13#10' // <%%% START ENTIRE'
+ +'_HIERARCHY_FIELDS %%%>'#13#10' l_%FIELD_NAME% := %FIELD_NAME%;'#13#10' '
+ +' // <%%% START IF_FIELD_BINARY_TYPE %%%>'#13#10' TROSerializer(ASeriali'
+ +'zer).ReadBinary(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' if %F'
+ +'IELD_NAME% <> l_%FIELD_NAME% then %FIELD_NAME%.Free;'#13#10' // <%%% END'
+ +' IF_FIELD_BINARY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_BOOLEAN_TYPE %'
+ +'%%>'#13#10' TROSerializer(ASerializer).ReadEnumerated(''%FIELD_ORIGINALN'
+ +'AME%'', TypeInfo(boolean), l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD'
+ +'_BOOLEAN_TYPE %%%>'#13#10' // <%%% START IF_FIELD_CURRENCY_TYPE %%%>'#13
+ +#10' TROSerializer(ASerializer).ReadDouble(''%FIELD_ORIGINALNAME%'', ftCu'
+ +'rr, l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_CURRENCY_TYPE %%%>'#13
+ ,#10' // <%%% START IF_FIELD_DATETIME_TYPE %%%>'#13#10' TROSerializer(A'
+ +'Serializer).ReadDateTime(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10
+ +' // <%%% END IF_FIELD_DATETIME_TYPE %%%>'#13#10' // <%%% START IF_FIE'
+ +'LD_DECIMAL_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadDecimal(''%F'
+ +'IELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DECI'
+ +'MAL_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DOUBLE_TYPE %%%>'#13#10' '
+ +' TROSerializer(ASerializer).ReadDouble(''%FIELD_ORIGINALNAME%'', ftDouble, '
+ +'l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DOUBLE_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_GUID_TYPE %%%>'#13#10' TROSerializer(ASerialize'
+ +'r).ReadGuid(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% E'
+ +'ND IF_FIELD_GUID_TYPE %%%>'#13#10' // <%%% START IF_FIELD_INT64_TYPE %%%'
+ +'>'#13#10' TROSerializer(ASerializer).ReadInt64(''%FIELD_ORIGINALNAME%'','
+ +' l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_INT64_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_INTEGER_TYPE %%%>'#13#10' TROSerializer(ASerial'
+ +'izer).ReadInteger(''%FIELD_ORIGINALNAME%'', otSLong, l_%FIELD_NAME%);'#13#10
+ +' // <%%% END IF_FIELD_INTEGER_TYPE %%%>'#13#10' // <%%% START IF_FIEL'
+ +'D_ANSISTRING_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadAnsiString'
+ +'(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD'
+ +'_ANSISTRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_UTF8STRING_TYPE %%%'
+ +'>'#13#10' TROSerializer(ASerializer).ReadUTF8String(''%FIELD_ORIGINALNAM'
+ +'E%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_UTF8STRING_TYPE %%%>'
+ +#13#10' // <%%% START IF_FIELD_VARIANT_TYPE %%%>'#13#10' TROSerializer'
+ +'(ASerializer).ReadVariant(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10
+ +' // <%%% END IF_FIELD_VARIANT_TYPE %%%>'#13#10' // <%%% START IF_FIEL'
+ +'D_WIDESTRING_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadWideString'
+ +'(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD'
+ +'_WIDESTRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_XML_TYPE %%%>'#13#10
+ +' TROSerializer(ASerializer).ReadXml(''%FIELD_ORIGINALNAME%'', l_%FIELD_N'
+ +'AME%);'#13#10' // <%%% END IF_FIELD_XML_TYPE %%%>'#13#10' // <%%% STA'
+ +'RT IF_FIELD_ARRAY_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadArray'
+ +'(''%FIELD_ORIGINALNAME%'', %FIELD_TYPE%, l_%FIELD_NAME%);'#13#10' if %FI'
+ +'ELD_NAME% <> l_%FIELD_NAME% then %FIELD_NAME%.Free;'#13#10' // <%%% END '
+ +'IF_FIELD_ARRAY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ENUM_TYPE %%%>'
+ +#13#10' TROSerializer(ASerializer).ReadEnumerated(''%FIELD_ORIGINALNAME%'
+ +''', TypeInfo(%FIELD_TYPE%), l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIEL'
+ +'D_ENUM_TYPE %%%>'#13#10' // <%%% START IF_FIELD_STRUCT_TYPE %%%>'#13#10
+ +' TROSerializer(ASerializer).ReadStruct(''%FIELD_ORIGINALNAME%'', %FIELD_'
+ +'TYPE%, l_%FIELD_NAME%);'#13#10' if %FIELD_NAME% <> l_%FIELD_NAME% then %'
+ +'FIELD_NAME%.Free;'#13#10' // <%%% END IF_FIELD_STRUCT_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_XSDATETIME_TYPE %%%>'#13#10' TROSerializer(ASe'
+ +'rializer).ReadStruct(''%FIELD_ORIGINALNAME%'', %FIELD_TYPE%, l_%FIELD_NAME%'
+ +');'#13#10' if %FIELD_NAME% <> l_%FIELD_NAME% then %FIELD_NAME%.Free;'#13
+ +#10' // <%%% END IF_FIELD_XSDATETIME_TYPE %%%>'#13#10' %FIELD_NAME% :='
+ +' l_%FIELD_NAME%;'#13#10' // <%%% END ENTIRE_HIERARCHY_FIELDS %%%>'#13#10
+ +' end;'#13#10'end;'#13#10#13#10'procedure %EXCEPTION_NAME%.WriteException(A'
+ +'Serializer: TObject);'#13#10'var'#13#10' // <%%% START ENTIRE_HIERARCHY_FI'
+ +'ELDS %%%>'#13#10' l_%FIELD_NAME%: %FIELD_TYPE%;'#13#10' // <%%% END ENTIR'
+ +'E_HIERARCHY_FIELDS %%%>'#13#10'begin'#13#10' if TROSerializer(ASerializer)'
+ +'.RecordStrictOrder then begin'#13#10' // <%%% START IF_STRUCT_HAS_ANCEST'
+ +'OR %%%>'#13#10' inherited;'#13#10' // <%%% END IF_STRUCT_HAS_ANCESTOR'
+ +' %%%>'#13#10' // <%%% START FIELDS_NO_STRIP %%%>'#13#10' l_%FIELD_NAM'
+ +'E% := %FIELD_NAME%;'#13#10' // <%%% START IF_FIELD_BINARY_TYPE %%%>'#13
+ +#10' TROSerializer(ASerializer).WriteBinary(''%FIELD_ORIGINALNAME%'', l_%'
+ +'FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_BINARY_TYPE %%%>'#13#10' /'
+ +'/ <%%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' TROSerializer(ASerialize'
+ +'r).WriteEnumerated(''%FIELD_ORIGINALNAME%'', TypeInfo(boolean), l_%FIELD_NA'
+ +'ME%);'#13#10' // <%%% END IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' // <%%% '
+ +'START IF_FIELD_CURRENCY_TYPE %%%>'#13#10' TROSerializer(ASerializer).Wri'
+ +'teDouble(''%FIELD_ORIGINALNAME%'', ftCurr, l_%FIELD_NAME%);'#13#10' // <'
+ +'%%% END IF_FIELD_CURRENCY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DATET'
+ +'IME_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteDateTime(''%FIELD_'
+ +'ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DATETIME_'
+ +'TYPE %%%>'#13#10' // <%%% START IF_FIELD_DECIMAL_TYPE %%%>'#13#10' TR'
+ +'OSerializer(ASerializer).WriteDecimal(''%FIELD_ORIGINALNAME%'', l_%FIELD_NA'
+ ,'ME%);'#13#10' // <%%% END IF_FIELD_DECIMAL_TYPE %%%>'#13#10' // <%%% '
+ +'START IF_FIELD_DOUBLE_TYPE %%%>'#13#10' TROSerializer(ASerializer).Write'
+ +'Double(''%FIELD_ORIGINALNAME%'', ftDouble, l_%FIELD_NAME%);'#13#10' // <'
+ +'%%% END IF_FIELD_DOUBLE_TYPE %%%>'#13#10' // <%%% START IF_FIELD_GUID_TY'
+ +'PE %%%>'#13#10' TROSerializer(ASerializer).WriteGuid(''%FIELD_ORIGINALNA'
+ +'ME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_GUID_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_INT64_TYPE %%%>'#13#10' TROSerializer(ASer'
+ +'ializer).WriteInt64(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' /'
+ +'/ <%%% END IF_FIELD_INT64_TYPE %%%>'#13#10' // <%%% START IF_FIELD_INTEG'
+ +'ER_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteInteger(''%FIELD_OR'
+ +'IGINALNAME%'', otSLong, l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_IN'
+ +'TEGER_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ANSISTRING_TYPE %%%>'#13
+ +#10' TROSerializer(ASerializer).WriteAnsiString(''%FIELD_ORIGINALNAME%'','
+ +' l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ANSISTRING_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' TROSerializer'
+ +'(ASerializer).WriteUTF8String(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' // <%%% START I'
+ +'F_FIELD_VARIANT_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteVarian'
+ +'t(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIEL'
+ +'D_VARIANT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_WIDESTRING_TYPE %%%>'
+ +#13#10' TROSerializer(ASerializer).WriteWideString(''%FIELD_ORIGINALNAME%'
+ +''', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_WIDESTRING_TYPE %%%>'
+ +#13#10' // <%%% START IF_FIELD_XML_TYPE %%%>'#13#10' TROSerializer(ASe'
+ +'rializer).WriteXml(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' //'
+ +' <%%% END IF_FIELD_XML_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ARRAY_TY'
+ +'PE %%%>'#13#10' TROSerializer(ASerializer).WriteArray(''%FIELD_ORIGINALN'
+ +'AME%'', l_%FIELD_NAME%, %FIELD_TYPE%);'#13#10' // <%%% END IF_FIELD_ARRA'
+ +'Y_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ENUM_TYPE %%%>'#13#10' TRO'
+ +'Serializer(ASerializer).WriteEnumerated(''%FIELD_ORIGINALNAME%'', TypeInfo('
+ +'%FIELD_TYPE%), l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ENUM_TYPE %'
+ +'%%>'#13#10' // <%%% START IF_FIELD_STRUCT_TYPE %%%>'#13#10' TROSerial'
+ +'izer(ASerializer).WriteStruct(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%, %FI'
+ +'ELD_TYPE%);'#13#10' // <%%% END IF_FIELD_STRUCT_TYPE %%%>'#13#10' // '
+ +'<%%% START IF_FIELD_XSDATETIME_TYPE %%%>'#13#10' TROSerializer(ASerializ'
+ +'er).WriteStruct(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%, %FIELD_TYPE%);'#13
+ +#10' // <%%% END IF_FIELD_XSDATETIME_TYPE %%%>'#13#10' // <%%% END FIE'
+ +'LDS_NO_STRIP %%%>'#13#10' end'#13#10' else begin'#13#10' // <%%% START'
+ +' ENTIRE_HIERARCHY_FIELDS %%%>'#13#10' l_%FIELD_NAME% := %FIELD_NAME%;'#13
+ +#10' // <%%% START IF_FIELD_BINARY_TYPE %%%>'#13#10' TROSerializer(ASe'
+ +'rializer).WriteBinary(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' '
+ +' // <%%% END IF_FIELD_BINARY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_BO'
+ +'OLEAN_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteEnumerated(''%FI'
+ +'ELD_ORIGINALNAME%'', TypeInfo(boolean), l_%FIELD_NAME%);'#13#10' // <%%%'
+ +' END IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' // <%%% START IF_FIELD_CURRENCY_'
+ +'TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteDouble(''%FIELD_ORIGIN'
+ +'ALNAME%'', ftCurr, l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_CURRENC'
+ +'Y_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DATETIME_TYPE %%%>'#13#10' '
+ +' TROSerializer(ASerializer).WriteDateTime(''%FIELD_ORIGINALNAME%'', l_%FIEL'
+ +'D_NAME%);'#13#10' // <%%% END IF_FIELD_DATETIME_TYPE %%%>'#13#10' // '
+ +'<%%% START IF_FIELD_DECIMAL_TYPE %%%>'#13#10' TROSerializer(ASerializer)'
+ +'.WriteDecimal(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%%'
+ +' END IF_FIELD_DECIMAL_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DOUBLE_TY'
+ +'PE %%%>'#13#10' TROSerializer(ASerializer).WriteDouble(''%FIELD_ORIGINAL'
+ +'NAME%'', ftDouble, l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DOUBLE_'
+ +'TYPE %%%>'#13#10' // <%%% START IF_FIELD_GUID_TYPE %%%>'#13#10' TROSe'
+ +'rializer(ASerializer).WriteGuid(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'
+ +#13#10' // <%%% END IF_FIELD_GUID_TYPE %%%>'#13#10' // <%%% START IF_F'
+ +'IELD_INT64_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteInt64(''%FI'
+ +'ELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_INT64'
+ +'_TYPE %%%>'#13#10' // <%%% START IF_FIELD_INTEGER_TYPE %%%>'#13#10' T'
+ +'ROSerializer(ASerializer).WriteInteger(''%FIELD_ORIGINALNAME%'', otSLong, l'
+ +'_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_INTEGER_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' TROSerializer(ASer'
+ +'ializer).WriteAnsiString(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10
+ ,' // <%%% END IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' // <%%% START IF_F'
+ +'IELD_UTF8STRING_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteUTF8St'
+ +'ring(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_F'
+ +'IELD_UTF8STRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_VARIANT_TYPE %%'
+ +'%>'#13#10' TROSerializer(ASerializer).WriteVariant(''%FIELD_ORIGINALNAME'
+ +'%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_VARIANT_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_WIDESTRING_TYPE %%%>'#13#10' TROSerializer'
+ +'(ASerializer).WriteWideString(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_WIDESTRING_TYPE %%%>'#13#10' // <%%% START I'
+ +'F_FIELD_XML_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteXml(''%FIE'
+ +'LD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_XML_TY'
+ +'PE %%%>'#13#10' // <%%% START IF_FIELD_ARRAY_TYPE %%%>'#13#10' TROSer'
+ +'ializer(ASerializer).WriteArray(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%, %'
+ +'FIELD_TYPE%);'#13#10' // <%%% END IF_FIELD_ARRAY_TYPE %%%>'#13#10' //'
+ +' <%%% START IF_FIELD_ENUM_TYPE %%%>'#13#10' TROSerializer(ASerializer).W'
+ +'riteEnumerated(''%FIELD_ORIGINALNAME%'', TypeInfo(%FIELD_TYPE%), l_%FIELD_N'
+ +'AME%);'#13#10' // <%%% END IF_FIELD_ENUM_TYPE %%%>'#13#10' // <%%% ST'
+ +'ART IF_FIELD_STRUCT_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteSt'
+ +'ruct(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%, %FIELD_TYPE%);'#13#10' //'
+ +' <%%% END IF_FIELD_STRUCT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_XSDAT'
+ +'ETIME_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteStruct(''%FIELD_'
+ +'ORIGINALNAME%'', l_%FIELD_NAME%, %FIELD_TYPE%);'#13#10' // <%%% END IF_F'
+ +'IELD_XSDATETIME_TYPE %%%>'#13#10' // <%%% END ENTIRE_HIERARCHY_FIELDS %%'
+ +'%>'#13#10' end;'#13#10'end;'#13#10#13#10'// <%%% END IF_HAS_FIELDS %%%>'#13
+ +#10'// <%%% END EXCEPTIONS %%%>'#13#10'// <%%% START ARRAYS %%%>'#13#10'{ %A'
+ +'RRAY_NAME% }'#13#10#13#10'// <%%% START IF_ARRAY_HAS_ATTRIBUTES %%%>'#13#10
+ +'class function %ARRAY_NAME%.GetAttributeCount: Integer;'#13#10'begin'#13#10
+ +' Result := %ATTRIBUTES_COUNT%;'#13#10'end;'#13#10#13#10'class function %AR'
+ +'RAY_NAME%.GetAttributeName(aIndex: Integer): string;'#10'begin'#10' case a'
+ +'Index of'#10'// <%%% START ATTRIBUTES_NO_STRIP %%%>'#10' %ATTRIBUTE_INDE'
+ +'X%: Result := %ATTRIBUTE_NAME%;'#10'// <%%% END ATTRIBUTES_NO_STRIP %%%>'#10
+ +' end;'#10'end;'#10#10'class function %ARRAY_NAME%.GetAttributeValue(aIndex'
+ +': Integer): string;'#10'begin'#10' case aIndex of'#10'// <%%% START ATTRIB'
+ +'UTES_NO_STRIP %%%>'#10' %ATTRIBUTE_INDEX%: Result := %ATTRIBUTE_VALUE%;'
+ +#10'// <%%% END ATTRIBUTES_NO_STRIP %%%>'#10' end;'#10'end;'#10'// <%%% END'
+ +' IF_ARRAY_HAS_ATTRIBUTES %%%>'#13#10#13#10'procedure %ARRAY_NAME%.Assign(iS'
+ +'ource: TPersistent);'#13#10'var lSource:%ARRAY_NAME%;'#13#10' i:integer;'
+ +#13#10'begin'#13#10' if (iSource is %ARRAY_NAME%) then begin'#13#10' lSo'
+ +'urce := %ARRAY_NAME%(iSource);'#13#10' Clear();'#13#10' Resize(lSourc'
+ +'e.Count);'#13#10' '#13#10' for i := 0 to Count-1 do begin'#13#10' '
+ +' // <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' if Assigned(lSource'
+ +'.Items[i]) then begin'#13#10' Items[i].Assign(lSource.Items[i]);'#13
+ +#10' end;'#13#10' // <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' '
+ +' // <%%% START IF_ARRAY_TYPE_SIMPLE %%%>'#13#10' Items[i] := lSourc'
+ +'e.Items[i];'#13#10' // <%%% END IF_ARRAY_TYPE_SIMPLE %%%>'#13#10' e'
+ +'nd;'#13#10' end'#13#10' else begin'#13#10' inherited Assign(iSource);'
+ +#13#10' end;'#13#10'end;'#13#10#13#10'class function %ARRAY_NAME%.GetItemTy'
+ +'pe: PTypeInfo;'#13#10'begin'#13#10' result := TypeInfo(%ARRAY_TYPE%);'#13
+ +#10'end;'#13#10#13#10'// <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10'class '
+ +'function %ARRAY_NAME%.GetItemClass: TClass;'#13#10'begin'#13#10' result :='
+ +' %ARRAY_TYPE%;'#13#10'end;'#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13
+ +#10#13#10'class function %ARRAY_NAME%.GetItemSize: integer;'#13#10'begin'#13
+ +#10' result := SizeOf(%ARRAY_TYPE%);'#13#10'end;'#13#10#13#10'function %ARR'
+ +'AY_NAME%.GetItems(aIndex: integer): %ARRAY_TYPE%;'#13#10'begin'#13#10' if '
+ +'(aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds'
+ +',[aIndex]);'#13#10' result := fItems[aIndex];'#13#10'end;'#13#10#13#10'fun'
+ +'ction %ARRAY_NAME%.GetItemRef(aIndex: integer): pointer;'#13#10'begin'#13#10
+ +' if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfB'
+ +'ounds,[aIndex]);'#13#10' // <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' '
+ +' result := fItems[aIndex];'#13#10' // <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'
+ +#13#10' // <%%% START IF_ARRAY_TYPE_SIMPLE %%%>'#13#10' result := @fItems['
+ +'aIndex];'#13#10' // <%%% END IF_ARRAY_TYPE_SIMPLE %%%>'#13#10'end;'#13#10
+ +#13#10'// <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10'procedure %ARRAY_NAME'
+ +'%.SetItemRef(aIndex: integer; Ref: pointer);'#13#10'begin'#13#10' if (aInd'
+ ,'ex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIn'
+ +'dex]);'#13#10' if Ref <> fItems[aIndex] then begin'#13#10' if fItems[aI'
+ +'ndex] <> nil then fItems[aIndex].Free;'#13#10' fItems[aIndex] := Ref;'#13
+ +#10' end;'#13#10'end;'#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10
+ +#13#10'procedure %ARRAY_NAME%.Clear;'#13#10'// <%%% START IF_ARRAY_TYPE_COMP'
+ +'LEX %%%>'#13#10'var i: integer;'#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%'
+ +'%>'#13#10'begin'#13#10' // <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' '
+ +'for i := 0 to (Count-1) do fItems[i].Free();'#13#10' // <%%% END IF_ARRAY_'
+ +'TYPE_COMPLEX %%%>'#13#10' SetLength(fItems, 0);'#13#10' FCount := 0;'#13
+ +#10'end;'#13#10#13#10'procedure %ARRAY_NAME%.Delete(aIndex: integer);'#13#10
+ +'var i: integer;'#13#10'begin'#13#10' if (aIndex>=Count) then RaiseError(er'
+ +'r_InvalidIndex, [aIndex]);'#13#10#13#10' // <%%% START IF_ARRAY_TYPE_COMPL'
+ +'EX %%%>'#13#10' fItems[aIndex].Free();'#13#10' // <%%% END IF_ARRAY_TYPE_'
+ +'COMPLEX %%%>'#13#10' '#13#10' if (aIndex= Count) then RaiseError(err_Array'
+ +'IndexOutOfBounds,[aIndex]);'#13#10' // <%%% START IF_ARRAY_TYPE_COMPLEX %%'
+ +'%> '#13#10' if fItems[aIndex] <> Value then begin'#13#10' fItems[aInde'
+ +'x].Free; '#13#10' fItems[aIndex] := Value;'#13#10' end;'#13#10' // '
+ +'<%%% END IF_ARRAY_TYPE_COMPLEX %%%> '#13#10' // <%%% START IF_ARRAY_TYPE_'
+ +'SIMPLE %%%>'#13#10' fItems[aIndex] := Value; '#13#10' // <%%% END IF_ARR'
+ +'AY_TYPE_SIMPLE %%%> '#13#10'end;'#13#10#13#10'procedure %ARRAY_NAME%.Resiz'
+ +'e(ElementCount: integer);'#13#10'// <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'
+ +#13#10'var i: Integer;'#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10
+ +'begin'#13#10' if fCount = ElementCount then Exit;'#13#10'// <%%% START IF_'
+ +'ARRAY_TYPE_COMPLEX %%%>'#13#10' for i := FCount -1 downto ElementCount do'
+ +#13#10' FItems[i].Free;'#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13
+ +#10' SetLength(fItems, ElementCount);'#13#10'// <%%% START IF_ARRAY_TYPE_CO'
+ +'MPLEX %%%>'#13#10' for i := FCount to ElementCount -1 do'#13#10' FItems'
+ +'[i] := %ARRAY_TYPE%.Create;'#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'
+ +#13#10' FCount := ElementCount;'#13#10'end;'#13#10#13#10'function %ARRAY_NA'
+ +'ME%.GetCount: integer;'#13#10'begin'#13#10' result := FCount;'#13#10'end;'
+ +#13#10#13#10'procedure %ARRAY_NAME%.Grow;'#13#10'var'#13#10' Delta, Capacit'
+ +'y: Integer;'#13#10'begin'#13#10' Capacity := Length(fItems);'#13#10' if C'
+ +'apacity > 64 then'#13#10' Delta := Capacity div 4'#13#10' else'#13#10' '
+ +' if Capacity > 8 then'#13#10' Delta := 16'#13#10' else'#13#10' '
+ +' Delta := 4;'#13#10' SetLength(fItems, Capacity + Delta);'#13#10'end;'#13
+ +#10#13#10'// <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10'function %ARRAY_NA'
+ +'ME%.Add: %ARRAY_TYPE%;'#13#10'begin'#13#10' result := %ARRAY_TYPE%.Create;'
+ +#13#10' Add(Result);'#13#10'end;'#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %'
+ +'%%>'#13#10#13#10'function %ARRAY_NAME%.Add(const Value:%ARRAY_TYPE%): integ'
+ +'er;'#13#10'begin'#13#10' Result := Count;'#13#10' if Length(fItems) = Res'
+ +'ult then'#13#10' Grow;'#13#10' fItems[result] := Value;'#13#10' Inc(fC'
+ +'ount);'#13#10'end;'#13#10#13#10'// <%%% START IF_ARRAY_TYPE_SIMPLE %%%>'#13
+ +#10'function %ARRAY_NAME%.GetIndex(const aPropertyName : string;'#13#10' co'
+ +'nst aPropertyValue : Variant; StartFrom : integer;'#13#10' Options : TROSe'
+ +'archOptions) : integer;'#13#10'begin'#13#10' result := -1;'#13#10'end;'#13
+ +#10'// <%%% END IF_ARRAY_TYPE_SIMPLE %%%>'#13#10#13#10'procedure %ARRAY_NAME'
+ +'%.ReadComplex(ASerializer: TObject);'#13#10'var'#13#10' lval: %ARRAY_TYPE%'
+ +';'#13#10' i: integer;'#13#10'begin'#13#10' for i := 0 to Count-1 do begin'
+ +#13#10' with TROSerializer(ASerializer) do'#13#10' // <%%% START IF_'
+ +'ARRAY_BINARY_TYPE %%%>'#13#10' ReadBinary(GetArrayElementName(GetItemT'
+ +'ype, GetItemRef(i)), lval, i);'#13#10' // <%%% END IF_ARRAY_BINARY_TYP'
+ +'E %%%>'#13#10' // <%%% START IF_ARRAY_BOOLEAN_TYPE %%%>'#13#10' R'
+ +'eadEnumerated(GetArrayElementName(GetItemType, GetItemRef(i)), TypeInfo(boo'
+ +'lean), lval, i);'#13#10' // <%%% END IF_ARRAY_BOOLEAN_TYPE %%%>'#13#10
+ +' // <%%% START IF_ARRAY_CURRENCY_TYPE %%%>'#13#10' ReadDouble(Get'
+ +'ArrayElementName(GetItemType, GetItemRef(i)), ftCurr, lval, i);'#13#10' '
+ +' // <%%% END IF_ARRAY_CURRENCY_TYPE %%%>'#13#10' // <%%% START IF_ARR'
+ +'AY_DATETIME_TYPE %%%>'#13#10' ReadDateTime(GetArrayElementName(GetItem'
+ +'Type, GetItemRef(i)), lval, i);'#13#10' // <%%% END IF_ARRAY_DATETIME_'
+ +'TYPE %%%>'#13#10' // <%%% START IF_ARRAY_DECIMAL_TYPE %%%>'#13#10' '
+ ,' ReadDecimal(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);'#13
+ +#10' // <%%% END IF_ARRAY_DECIMAL_TYPE %%%>'#13#10' // <%%% START '
+ +'IF_ARRAY_DOUBLE_TYPE %%%>'#13#10' ReadDouble(GetArrayElementName(GetIt'
+ +'emType, GetItemRef(i)), ftDouble, lval, i);'#13#10' // <%%% END IF_ARR'
+ +'AY_DOUBLE_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_GUID_TYPE %%%>'#13
+ +#10' ReadGuid(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i)'
+ +';'#13#10' // <%%% END IF_ARRAY_GUID_TYPE %%%>'#13#10' // <%%% STA'
+ +'RT IF_ARRAY_INT64_TYPE %%%>'#13#10' ReadInt64(GetArrayElementName(GetI'
+ +'temType, GetItemRef(i)), lval, i);'#13#10' // <%%% END IF_ARRAY_INT64_'
+ +'TYPE %%%>'#13#10' // <%%% START IF_ARRAY_INTEGER_TYPE %%%>'#13#10' '
+ +' ReadInteger(GetArrayElementName(GetItemType, GetItemRef(i)), otSLong, lva'
+ +'l, i);'#13#10' // <%%% END IF_ARRAY_INTEGER_TYPE %%%>'#13#10' // '
+ +'<%%% START IF_ARRAY_ANSISTRING_TYPE %%%>'#13#10' ReadUTF8String(GetArr'
+ +'ayElementName(GetItemType, GetItemRef(i)), lval, i);'#13#10' // <%%% E'
+ +'ND IF_ARRAY_ANSISTRING_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_UTF8ST'
+ +'RING_TYPE %%%>'#13#10' ReadUTF8String(GetArrayElementName(GetItemType,'
+ +' GetItemRef(i)), lval, i);'#13#10' // <%%% END IF_ARRAY_UTF8STRING_TYP'
+ +'E %%%>'#13#10' // <%%% START IF_ARRAY_VARIANT_TYPE %%%>'#13#10' R'
+ +'eadVariant(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);'#13#10
+ +' // <%%% END IF_ARRAY_VARIANT_TYPE %%%>'#13#10' // <%%% START IF_'
+ +'ARRAY_WIDESTRING_TYPE %%%>'#13#10' ReadWideString(GetArrayElementName('
+ +'GetItemType, GetItemRef(i)), lval, i);'#13#10' // <%%% END IF_ARRAY_WI'
+ +'DESTRING_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_XML_TYPE %%%>'#13#10
+ +' ReadXml(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);'#13
+ +#10' // <%%% END IF_ARRAY_XML_TYPE %%%>'#13#10' // <%%% START IF_A'
+ +'RRAY_ARRAY_TYPE %%%>'#13#10' ReadArray(GetArrayElementName(GetItemType'
+ +', GetItemRef(i)), %ARRAY_TYPE%, lval, i);'#13#10' // <%%% END IF_ARRAY'
+ +'_ARRAY_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_ENUM_TYPE %%%>'#13#10
+ +' ReadEnumerated(GetArrayElementName(GetItemType, GetItemRef(i)), TypeI'
+ +'nfo(%ARRAY_TYPE%), lval, i);'#13#10' // <%%% END IF_ARRAY_ENUM_TYPE %%'
+ +'%>'#13#10' // <%%% START IF_ARRAY_STRUCT_TYPE %%%>'#13#10' ReadSt'
+ +'ruct(GetArrayElementName(GetItemType, GetItemRef(i)), %ARRAY_TYPE%, lval, i'
+ +');'#13#10' // <%%% END IF_ARRAY_STRUCT_TYPE %%%>'#13#10' Items[i] :'
+ +'= lval;'#13#10' end;'#13#10'end;'#13#10#13#10'procedure %ARRAY_NAME%.Write'
+ +'Complex(ASerializer: TObject);'#13#10'var'#13#10' i: integer;'#13#10'begin'
+ +#13#10' for i := 0 to Count-1 do'#13#10' with TROSerializer(ASerializer)'
+ +' do'#13#10' // <%%% START IF_ARRAY_BINARY_TYPE %%%>'#13#10' Write'
+ +'Binary(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);'#13
+ +#10' // <%%% END IF_ARRAY_BINARY_TYPE %%%>'#13#10' // <%%% START I'
+ +'F_ARRAY_BOOLEAN_TYPE %%%>'#13#10' WriteEnumerated(GetArrayElementName('
+ +'GetItemType, GetItemRef(i)), TypeInfo(boolean), fItems[i], i);'#13#10' '
+ +' // <%%% END IF_ARRAY_BOOLEAN_TYPE %%%>'#13#10' // <%%% START IF_ARRAY'
+ +'_CURRENCY_TYPE %%%>'#13#10' WriteDouble(GetArrayElementName(GetItemTyp'
+ +'e, GetItemRef(i)), ftCurr, fItems[i], i);'#13#10' // <%%% END IF_ARRAY'
+ +'_CURRENCY_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_DATETIME_TYPE %%%>'
+ +#13#10' WriteDateTime(GetArrayElementName(GetItemType, GetItemRef(i)), '
+ +'fItems[i], i);'#13#10' // <%%% END IF_ARRAY_DATETIME_TYPE %%%>'#13#10
+ +' // <%%% START IF_ARRAY_DECIMAL_TYPE %%%>'#13#10' WriteDecimal(Ge'
+ +'tArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);'#13#10' '
+ +'// <%%% END IF_ARRAY_DECIMAL_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_'
+ +'DOUBLE_TYPE %%%>'#13#10' WriteDouble(GetArrayElementName(GetItemType, '
+ +'GetItemRef(i)), ftDouble, fItems[i], i);'#13#10' // <%%% END IF_ARRAY_'
+ +'DOUBLE_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_GUID_TYPE %%%>'#13#10
+ +' WriteGuid(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i],'
+ +' i);'#13#10' // <%%% END IF_ARRAY_GUID_TYPE %%%>'#13#10' // <%%% '
+ +'START IF_ARRAY_INT64_TYPE %%%>'#13#10' WriteInt64(GetArrayElementName('
+ +'GetItemType, GetItemRef(i)), fItems[i], i);'#13#10' // <%%% END IF_ARR'
+ +'AY_INT64_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_INTEGER_TYPE %%%>'#13
+ +#10' WriteInteger(GetArrayElementName(GetItemType, GetItemRef(i)), otSL'
+ +'ong, fItems[i], i);'#13#10' // <%%% END IF_ARRAY_INTEGER_TYPE %%%>'#13
+ +#10' // <%%% START IF_ARRAY_ANSISTRING_TYPE %%%>'#13#10' WriteUTF8'
+ +'String(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);'#13
+ +#10' // <%%% END IF_ARRAY_ANSISTRING_TYPE %%%>'#13#10' // <%%% STA'
+ +'RT IF_ARRAY_UTF8STRING_TYPE %%%>'#13#10' WriteUTF8String(GetArrayEleme'
+ ,'ntName(GetItemType, GetItemRef(i)), fItems[i], i);'#13#10' // <%%% END'
+ +' IF_ARRAY_UTF8STRING_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_VARIANT_'
+ +'TYPE %%%>'#13#10' WriteVariant(GetArrayElementName(GetItemType, GetIte'
+ +'mRef(i)), fItems[i], i);'#13#10' // <%%% END IF_ARRAY_VARIANT_TYPE %%%'
+ +'>'#13#10' // <%%% START IF_ARRAY_WIDESTRING_TYPE %%%>'#13#10' Wri'
+ +'teWideString(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i)'
+ +';'#13#10' // <%%% END IF_ARRAY_WIDESTRING_TYPE %%%>'#13#10' // <%'
+ +'%% START IF_ARRAY_XML_TYPE %%%>'#13#10' WriteXml(GetArrayElementName(G'
+ +'etItemType, GetItemRef(i)), fItems[i], i);'#13#10' // <%%% END IF_ARRA'
+ +'Y_XML_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_ARRAY_TYPE %%%>'#13#10
+ +' WriteArray(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i]'
+ +', , %ARRAY_TYPE%, i);'#13#10' // <%%% END IF_ARRAY_ARRAY_TYPE %%%>'#13
+ +#10' // <%%% START IF_ARRAY_ENUM_TYPE %%%>'#13#10' WriteEnumerated'
+ +'(GetArrayElementName(GetItemType, GetItemRef(i)), TypeInfo(%ARRAY_TYPE%), f'
+ +'Items[i], i);'#13#10' // <%%% END IF_ARRAY_ENUM_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_ARRAY_STRUCT_TYPE %%%>'#13#10' WriteStruct(GetArrayE'
+ +'lementName(GetItemType, GetItemRef(i)), fItems[i], %ARRAY_TYPE%, i);'#13#10
+ +' // <%%% END IF_ARRAY_STRUCT_TYPE %%%>'#13#10'end;'#13#10#13#10'// <%%'
+ +'% END ARRAYS %%%>'#13#10'// <%%% START STRUCTS %%%>'#13#10'{ %STRUCT_NAME% '
+ +'}'#13#10'// <%%% START IF_STRUCT_HAS_ATTRIBUTES %%%>'#13#10'class function '
+ +'%STRUCT_NAME%.GetAttributeCount: Integer;'#13#10'begin'#13#10' Result := %'
+ +'ATTRIBUTES_COUNT%;'#13#10'end;'#13#10#13#10'class function %STRUCT_NAME%.Ge'
+ +'tAttributeName(aIndex: Integer): string;'#10'begin'#10' case aIndex of'#10
+ +'// <%%% START ATTRIBUTES_NO_STRIP %%%>'#10' %ATTRIBUTE_INDEX%: Result :='
+ +' %ATTRIBUTE_NAME%;'#10'// <%%% END ATTRIBUTES_NO_STRIP %%%>'#10' end;'#10
+ +'end;'#10#10'class function %STRUCT_NAME%.GetAttributeValue(aIndex: Integer)'
+ +': string;'#10'begin'#10' case aIndex of'#10'// <%%% START ATTRIBUTES_NO_ST'
+ +'RIP %%%>'#10' %ATTRIBUTE_INDEX%: Result := %ATTRIBUTE_VALUE%;'#10'// <%%'
+ +'% END ATTRIBUTES_NO_STRIP %%%>'#10' end;'#10'end;'#10'// <%%% END IF_STRUC'
+ +'T_HAS_ATTRIBUTES %%%>'#13#10#13#10'procedure %STRUCT_NAME%.Assign(iSource: '
+ +'TPersistent);'#13#10'// <%%% START IF_HAS_FIELDS %%%>'#13#10'var'#13#10' l'
+ +'Source: %STRUCT_NAME%;'#13#10'// <%%% END IF_HAS_FIELDS %%%>'#13#10'begin'
+ +#13#10' inherited Assign(iSource);'#13#10' // <%%% START IF_HAS_FIELDS %%%'
+ +'>'#13#10' if (iSource is %STRUCT_NAME%) then begin'#13#10' lSource := %'
+ +'STRUCT_NAME%(iSource);'#13#10#13#10' // <%%% END IF_HAS_FIELDS %%%>'#13#10
+ +' // <%%% START FIELDS_NO_STRIP %%%>'#13#10' // <%%% START IF_FIELD_TY'
+ +'PE_SIMPLE %%%>'#13#10' %FIELD_NAME% := lSource.%FIELD_NAME%;'#13#10' '
+ +'// <%%% END IF_FIELD_TYPE_SIMPLE %%%>'#13#10' // <%%% START IF_FIELD_TYP'
+ +'E_COMPLEX %%%>'#13#10' // <%%% START IF_NOT_AUTO_CREATE_FIELDS %%%>'#13
+ +#10' if Assigned(f%FIELD_NAME%) then begin'#13#10' if Assigned(lSour'
+ +'ce.%FIELD_NAME%) then'#13#10' %FIELD_NAME%.Assign(lSource.%FIELD_NAM'
+ +'E%)'#13#10' else'#13#10' FreeAndNil(f%FIELD_NAME%);'#13#10' '
+ +'end;'#13#10' // <%%% END IF_NOT_AUTO_CREATE_FIELDS %%%>'#13#10' // <%'
+ +'%% START IF_AUTO_CREATE_FIELDS %%%>'#13#10' %FIELD_NAME%.Assign(lSource.'
+ +'%FIELD_NAME%);'#13#10' // <%%% END IF_AUTO_CREATE_FIELDS %%%>'#13#10' '
+ +' // <%%% END IF_FIELD_TYPE_COMPLEX %%%>'#13#10' // <%%% END FIELDS_NO_ST'
+ +'RIP %%%>'#13#10' // <%%% START IF_HAS_FIELDS %%%>'#13#10' end;'#13#10' /'
+ +'/ <%%% END IF_HAS_FIELDS %%%>'#13#10'end;'#13#10#13#10'// <%%% START STRUCT'
+ +'_GENERATE_DEFAULT_VALUES %%%>'#13#10'constructor %STRUCT_NAME%.Create(aColl'
+ +'ection : TCollection);'#13#10'begin'#13#10' inherited Create(aCollection);'
+ +#13#10' // <%%% START FIELDS_NO_STRIP %%%>'#13#10' // <%%% START IF_FIELD_'
+ +'HAS_DEFAULT_VALUE %%%>'#13#10' // <%%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13
+ +#10' f%FIELD_NAME% := %DEFAULT_VALUE%;'#13#10' // <%%% END IF_FIELD_BOOLEA'
+ +'N_TYPE %%%>'#13#10' // <%%% START IF_FIELD_CURRENCY_TYPE %%%>'#13#10' f%F'
+ +'IELD_NAME% := %DEFAULT_VALUE%;'#13#10' // <%%% END IF_FIELD_CURRENCY_TYPE '
+ +'%%%>'#13#10' // <%%% START IF_FIELD_DATETIME_TYPE %%%>'#13#10' f%FIELD_NA'
+ +'ME% := StrToDateTimeDef(''%DEFAULT_VALUE%'',0);'#13#10' // <%%% END IF_FIE'
+ +'LD_DATETIME_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DECIMAL_TYPE %%%>'#13
+ +#10' f%FIELD_NAME% := %DEFAULT_VALUE%;'#13#10' // <%%% END IF_FIELD_DECIMA'
+ +'L_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DOUBLE_TYPE %%%>'#13#10' f%FIE'
+ +'LD_NAME% := %DEFAULT_VALUE%;'#13#10' // <%%% END IF_FIELD_DOUBLE_TYPE %%%>'
+ +#13#10' // <%%% START IF_FIELD_GUID_TYPE %%%>'#13#10' f%FIELD_NAME% := ''%'
+ +'DEFAULT_VALUE%'';'#13#10' // <%%% END IF_FIELD_GUID_TYPE %%%>'#13#10' // '
+ +'<%%% START IF_FIELD_INT64_TYPE %%%>'#13#10' f%FIELD_NAME% := %DEFAULT_VALU'
+ ,'E%;'#13#10' // <%%% END IF_FIELD_INT64_TYPE %%%>'#13#10' // <%%% START IF'
+ +'_FIELD_INTEGER_TYPE %%%>'#13#10' f%FIELD_NAME% := %DEFAULT_VALUE%;'#13#10
+ +' // <%%% END IF_FIELD_INTEGER_TYPE %%%>'#13#10' // <%%% START IF_FIELD_AN'
+ +'SISTRING_TYPE %%%>'#13#10' f%FIELD_NAME% := ''%DEFAULT_VALUE%'';'#13#10' '
+ +'// <%%% END IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_U'
+ +'TF8STRING_TYPE %%%>'#13#10' f%FIELD_NAME% := ''%DEFAULT_VALUE%'';'#13#10' '
+ +' // <%%% END IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_'
+ +'VARIANT_TYPE %%%>'#13#10' f%FIELD_NAME% := ''%DEFAULT_VALUE%'';'#13#10' /'
+ +'/ <%%% END IF_FIELD_VARIANT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_WIDES'
+ +'TRING_TYPE %%%>'#13#10' f%FIELD_NAME% := ''%DEFAULT_VALUE%'';'#13#10' // '
+ +'<%%% END IF_FIELD_WIDESTRING_TYPE %%%>'#13#10' // <%%% END IF_FIELD_HAS_DE'
+ +'FAULT_VALUE %%%>'#13#10' // <%%% END FIELDS_NO_STRIP %%%>'#13#10'end;'#13
+ +#10'// <%%% END STRUCT_GENERATE_DEFAULT_VALUES %%%>'#13#10#13#10'destructor '
+ +'%STRUCT_NAME%.Destroy;'#13#10'begin'#13#10' FDestroying := True;'#13#10' '
+ +'try'#13#10' inherited Destroy;'#13#10' finally'#13#10' FDestroying :'
+ +'= False;'#13#10' end;'#13#10'end;'#13#10#13#10'// <%%% START FIELDS_NO_STR'
+ +'IP %%%>'#13#10'// <%%% START IF_FIELD_TYPE_COMPLEX %%%>'#13#10'function %ST'
+ +'RUCT_NAME%.Get%FIELD_NAME%: %FIELD_TYPE%;'#13#10'begin'#13#10' // <%%% STA'
+ +'RT IF_AUTO_CREATE_FIELDS %%%>'#13#10' if not Assigned(f%FIELD_NAME%) and n'
+ +'ot FDestroying then'#13#10' f%FIELD_NAME% := %FIELD_TYPE%.Create();'#13
+ +#10' // <%%% END IF_AUTO_CREATE_FIELDS %%%>'#13#10' Result := f%FIELD_NAME'
+ +'%;'#13#10'end;'#13#10'// <%%% END IF_FIELD_TYPE_COMPLEX %%%>'#13#10'// <%%%'
+ +' END FIELDS_NO_STRIP %%%>'#13#10#13#10'// <%%% START IF_HAS_FIELDS %%%>'#13
+ +#10'procedure %STRUCT_NAME%.ReadComplex(ASerializer: TObject);'#13#10'var'#13
+ +#10' // <%%% START ENTIRE_HIERARCHY_FIELDS %%%>'#13#10' l_%FIELD_NAME%: %F'
+ +'IELD_TYPE%;'#13#10' // <%%% END ENTIRE_HIERARCHY_FIELDS %%%>'#13#10'begin'
+ +#13#10' if TROSerializer(ASerializer).RecordStrictOrder then begin'#13#10' '
+ +' // <%%% START IF_STRUCT_HAS_ANCESTOR %%%>'#13#10' inherited;'#13#10' '
+ +' // <%%% END IF_STRUCT_HAS_ANCESTOR %%%>'#13#10' // <%%% START FIELDS_'
+ +'NO_STRIP %%%>'#13#10' l_%FIELD_NAME% := %FIELD_NAME%;'#13#10' // <%%%'
+ +' START IF_FIELD_BINARY_TYPE %%%>'#13#10' TROSerializer(ASerializer).Read'
+ +'Binary(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' if %FIELD_NAME'
+ +'% <> l_%FIELD_NAME% then %FIELD_NAME%.Free;'#13#10' // <%%% END IF_FIELD'
+ +'_BINARY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13#10
+ +' TROSerializer(ASerializer).ReadEnumerated(''%FIELD_ORIGINALNAME%'', Typ'
+ +'eInfo(boolean), l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_BOOLEAN_TY'
+ +'PE %%%>'#13#10' // <%%% START IF_FIELD_CURRENCY_TYPE %%%>'#13#10' TRO'
+ +'Serializer(ASerializer).ReadDouble(''%FIELD_ORIGINALNAME%'', ftCurr, l_%FIE'
+ +'LD_NAME%);'#13#10' // <%%% END IF_FIELD_CURRENCY_TYPE %%%>'#13#10' //'
+ +' <%%% START IF_FIELD_DATETIME_TYPE %%%>'#13#10' TROSerializer(ASerialize'
+ +'r).ReadDateTime(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%'
+ +'%% END IF_FIELD_DATETIME_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DECIMA'
+ +'L_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadDecimal(''%FIELD_ORIG'
+ +'INALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DECIMAL_TYPE '
+ +'%%%>'#13#10' // <%%% START IF_FIELD_DOUBLE_TYPE %%%>'#13#10' TROSeria'
+ +'lizer(ASerializer).ReadDouble(''%FIELD_ORIGINALNAME%'', ftDouble, l_%FIELD_'
+ +'NAME%);'#13#10' // <%%% END IF_FIELD_DOUBLE_TYPE %%%>'#13#10' // <%%%'
+ +' START IF_FIELD_GUID_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadGu'
+ +'id(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIE'
+ +'LD_GUID_TYPE %%%>'#13#10' // <%%% START IF_FIELD_INT64_TYPE %%%>'#13#10
+ +' TROSerializer(ASerializer).ReadInt64(''%FIELD_ORIGINALNAME%'', l_%FIELD'
+ +'_NAME%);'#13#10' // <%%% END IF_FIELD_INT64_TYPE %%%>'#13#10' // <%%%'
+ +' START IF_FIELD_INTEGER_TYPE %%%>'#13#10' TROSerializer(ASerializer).Rea'
+ +'dInteger(''%FIELD_ORIGINALNAME%'', otSLong, l_%FIELD_NAME%);'#13#10' // '
+ +'<%%% END IF_FIELD_INTEGER_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ANSIS'
+ +'TRING_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadAnsiString(''%FIE'
+ +'LD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ANSIST'
+ +'RING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_UTF8STRING_TYPE %%%>'#13#10
+ +' TROSerializer(ASerializer).ReadUTF8String(''%FIELD_ORIGINALNAME%'', l_%'
+ +'FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_VARIANT_TYPE %%%>'#13#10' TROSerializer(ASeria'
+ +'lizer).ReadVariant(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' //'
+ +' <%%% END IF_FIELD_VARIANT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_WIDE'
+ +'STRING_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadWideString(''%FI'
+ ,'ELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_WIDES'
+ +'TRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_XML_TYPE %%%>'#13#10' '
+ +'TROSerializer(ASerializer).ReadXml(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%'
+ +');'#13#10' // <%%% END IF_FIELD_XML_TYPE %%%>'#13#10' // <%%% START I'
+ +'F_FIELD_ARRAY_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadArray(''%'
+ +'FIELD_ORIGINALNAME%'', %FIELD_TYPE%, l_%FIELD_NAME%);'#13#10' if %FIELD_'
+ +'NAME% <> l_%FIELD_NAME% then %FIELD_NAME%.Free;'#13#10' // <%%% END IF_F'
+ +'IELD_ARRAY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ENUM_TYPE %%%>'#13#10
+ +' TROSerializer(ASerializer).ReadEnumerated(''%FIELD_ORIGINALNAME%'', Typ'
+ +'eInfo(%FIELD_TYPE%), l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ENUM_'
+ +'TYPE %%%>'#13#10' // <%%% START IF_FIELD_STRUCT_TYPE %%%>'#13#10' TRO'
+ +'Serializer(ASerializer).ReadStruct(''%FIELD_ORIGINALNAME%'', %FIELD_TYPE%, '
+ +'l_%FIELD_NAME%);'#13#10' if %FIELD_NAME% <> l_%FIELD_NAME% then %FIELD_N'
+ +'AME%.Free;'#13#10' // <%%% END IF_FIELD_STRUCT_TYPE %%%>'#13#10' // <'
+ +'%%% START IF_FIELD_XSDATETIME_TYPE %%%>'#13#10' TROSerializer(ASerialize'
+ +'r).ReadStruct(''%FIELD_ORIGINALNAME%'', %FIELD_TYPE%, l_%FIELD_NAME%);'#13
+ +#10' if %FIELD_NAME% <> l_%FIELD_NAME% then %FIELD_NAME%.Free;'#13#10' '
+ +' // <%%% END IF_FIELD_XSDATETIME_TYPE %%%>'#13#10' %FIELD_NAME% := l_%FI'
+ +'ELD_NAME%;'#13#10' // <%%% END FIELDS_NO_STRIP %%%>'#13#10' end'#13#10
+ +' else begin'#13#10' // <%%% START ENTIRE_HIERARCHY_FIELDS %%%>'#13#10' '
+ +' l_%FIELD_NAME% := %FIELD_NAME%;'#13#10' // <%%% START IF_FIELD_BINARY'
+ +'_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadBinary(''%FIELD_ORIGIN'
+ +'ALNAME%'', l_%FIELD_NAME%);'#13#10' if %FIELD_NAME% <> l_%FIELD_NAME% th'
+ +'en %FIELD_NAME%.Free;'#13#10' // <%%% END IF_FIELD_BINARY_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' TROSerializer(AS'
+ +'erializer).ReadEnumerated(''%FIELD_ORIGINALNAME%'', TypeInfo(boolean), l_%F'
+ +'IELD_NAME%);'#13#10' // <%%% END IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' /'
+ +'/ <%%% START IF_FIELD_CURRENCY_TYPE %%%>'#13#10' TROSerializer(ASerializ'
+ +'er).ReadDouble(''%FIELD_ORIGINALNAME%'', ftCurr, l_%FIELD_NAME%);'#13#10' '
+ +' // <%%% END IF_FIELD_CURRENCY_TYPE %%%>'#13#10' // <%%% START IF_FIELD'
+ +'_DATETIME_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadDateTime(''%F'
+ +'IELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DATE'
+ +'TIME_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DECIMAL_TYPE %%%>'#13#10' '
+ +' TROSerializer(ASerializer).ReadDecimal(''%FIELD_ORIGINALNAME%'', l_%FIEL'
+ +'D_NAME%);'#13#10' // <%%% END IF_FIELD_DECIMAL_TYPE %%%>'#13#10' // <'
+ +'%%% START IF_FIELD_DOUBLE_TYPE %%%>'#13#10' TROSerializer(ASerializer).R'
+ +'eadDouble(''%FIELD_ORIGINALNAME%'', ftDouble, l_%FIELD_NAME%);'#13#10' /'
+ +'/ <%%% END IF_FIELD_DOUBLE_TYPE %%%>'#13#10' // <%%% START IF_FIELD_GUID'
+ +'_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadGuid(''%FIELD_ORIGINAL'
+ +'NAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_GUID_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_INT64_TYPE %%%>'#13#10' TROSerializer(ASer'
+ +'ializer).ReadInt64(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' //'
+ +' <%%% END IF_FIELD_INT64_TYPE %%%>'#13#10' // <%%% START IF_FIELD_INTEGE'
+ +'R_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadInteger(''%FIELD_ORIG'
+ +'INALNAME%'', otSLong, l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_INTE'
+ +'GER_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ANSISTRING_TYPE %%%>'#13#10
+ +' TROSerializer(ASerializer).ReadAnsiString(''%FIELD_ORIGINALNAME%'', l_%'
+ +'FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' TROSerializer(ASe'
+ +'rializer).ReadUTF8String(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10
+ +' // <%%% END IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' // <%%% START IF_F'
+ +'IELD_VARIANT_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadVariant('''
+ +'%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_VA'
+ +'RIANT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_WIDESTRING_TYPE %%%>'#13
+ +#10' TROSerializer(ASerializer).ReadWideString(''%FIELD_ORIGINALNAME%'', '
+ +'l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_WIDESTRING_TYPE %%%>'#13#10
+ +' // <%%% START IF_FIELD_XML_TYPE %%%>'#13#10' TROSerializer(ASerializ'
+ +'er).ReadXml(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% E'
+ +'ND IF_FIELD_XML_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ARRAY_TYPE %%%>'
+ +#13#10' TROSerializer(ASerializer).ReadArray(''%FIELD_ORIGINALNAME%'', %F'
+ +'IELD_TYPE%, l_%FIELD_NAME%);'#13#10' if %FIELD_NAME% <> l_%FIELD_NAME% t'
+ +'hen %FIELD_NAME%.Free;'#13#10' // <%%% END IF_FIELD_ARRAY_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_ENUM_TYPE %%%>'#13#10' TROSerializer(ASeri'
+ +'alizer).ReadEnumerated(''%FIELD_ORIGINALNAME%'', TypeInfo(%FIELD_TYPE%), l_'
+ ,'%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ENUM_TYPE %%%>'#13#10' //'
+ +' <%%% START IF_FIELD_STRUCT_TYPE %%%>'#13#10' TROSerializer(ASerializer)'
+ +'.ReadStruct(''%FIELD_ORIGINALNAME%'', %FIELD_TYPE%, l_%FIELD_NAME%);'#13#10
+ +' if %FIELD_NAME% <> l_%FIELD_NAME% then %FIELD_NAME%.Free;'#13#10' //'
+ +' <%%% END IF_FIELD_STRUCT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_XSDAT'
+ +'ETIME_TYPE %%%>'#13#10' TROSerializer(ASerializer).ReadStruct(''%FIELD_O'
+ +'RIGINALNAME%'', %FIELD_TYPE%, l_%FIELD_NAME%);'#13#10' if %FIELD_NAME% <'
+ +'> l_%FIELD_NAME% then %FIELD_NAME%.Free;'#13#10' // <%%% END IF_FIELD_XS'
+ +'DATETIME_TYPE %%%>'#13#10' %FIELD_NAME% := l_%FIELD_NAME%;'#13#10' //'
+ +' <%%% END ENTIRE_HIERARCHY_FIELDS %%%>'#13#10' end;'#13#10'end;'#13#10#13
+ +#10'procedure %STRUCT_NAME%.WriteComplex(ASerializer: TObject);'#13#10'var'
+ +#13#10' // <%%% START ENTIRE_HIERARCHY_FIELDS %%%>'#13#10' l_%FIELD_NAME%:'
+ +' %FIELD_TYPE%;'#13#10' // <%%% END ENTIRE_HIERARCHY_FIELDS %%%>'#13#10'beg'
+ +'in'#13#10' if TROSerializer(ASerializer).RecordStrictOrder then begin'#13
+ +#10' // <%%% START IF_STRUCT_HAS_ANCESTOR %%%>'#13#10' inherited;'#13
+ +#10' // <%%% END IF_STRUCT_HAS_ANCESTOR %%%>'#13#10' TROSerializer(ASe'
+ +'rializer).ChangeClass(%STRUCT_NAME%);'#13#10' // <%%% START FIELDS_NO_ST'
+ +'RIP %%%>'#13#10' l_%FIELD_NAME% := %FIELD_NAME%;'#13#10' // <%%% STAR'
+ +'T IF_FIELD_BINARY_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteBina'
+ +'ry(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIE'
+ +'LD_BINARY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13
+ +#10' TROSerializer(ASerializer).WriteEnumerated(''%FIELD_ORIGINALNAME%'','
+ +' TypeInfo(boolean), l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_BOOLEA'
+ +'N_TYPE %%%>'#13#10' // <%%% START IF_FIELD_CURRENCY_TYPE %%%>'#13#10' '
+ +' TROSerializer(ASerializer).WriteDouble(''%FIELD_ORIGINALNAME%'', ftCurr, l'
+ +'_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_CURRENCY_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_DATETIME_TYPE %%%>'#13#10' TROSerializer(ASeri'
+ +'alizer).WriteDateTime(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' '
+ +' // <%%% END IF_FIELD_DATETIME_TYPE %%%>'#13#10' // <%%% START IF_FIELD_'
+ +'DECIMAL_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteDecimal(''%FIE'
+ +'LD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DECIMA'
+ +'L_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DOUBLE_TYPE %%%>'#13#10' T'
+ +'ROSerializer(ASerializer).WriteDouble(''%FIELD_ORIGINALNAME%'', ftDouble, l'
+ +'_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DOUBLE_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_GUID_TYPE %%%>'#13#10' TROSerializer(ASerializer'
+ +').WriteGuid(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% E'
+ +'ND IF_FIELD_GUID_TYPE %%%>'#13#10' // <%%% START IF_FIELD_INT64_TYPE %%%'
+ +'>'#13#10' TROSerializer(ASerializer).WriteInt64(''%FIELD_ORIGINALNAME%'''
+ +', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_INT64_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_INTEGER_TYPE %%%>'#13#10' TROSerializer(ASeria'
+ +'lizer).WriteInteger(''%FIELD_ORIGINALNAME%'', otSLong, l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_INTEGER_TYPE %%%>'#13#10' // <%%% START IF_F'
+ +'IELD_ANSISTRING_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteAnsiSt'
+ +'ring(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_F'
+ +'IELD_ANSISTRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_UTF8STRING_TYPE'
+ +' %%%>'#13#10' TROSerializer(ASerializer).WriteUTF8String(''%FIELD_ORIGIN'
+ +'ALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_UTF8STRING_TYPE'
+ +' %%%>'#13#10' // <%%% START IF_FIELD_VARIANT_TYPE %%%>'#13#10' TROSer'
+ +'ializer(ASerializer).WriteVariant(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%)'
+ +';'#13#10' // <%%% END IF_FIELD_VARIANT_TYPE %%%>'#13#10' // <%%% STAR'
+ +'T IF_FIELD_WIDESTRING_TYPE %%%>'#13#10' TROSerializer(ASerializer).Write'
+ +'WideString(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% EN'
+ +'D IF_FIELD_WIDESTRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_XML_TYPE '
+ +'%%%>'#13#10' TROSerializer(ASerializer).WriteXml(''%FIELD_ORIGINALNAME%'
+ +''', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_XML_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_ARRAY_TYPE %%%>'#13#10' TROSerializer(ASeriali'
+ +'zer).WriteArray(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%, %FIELD_TYPE%);'#13
+ +#10' // <%%% END IF_FIELD_ARRAY_TYPE %%%>'#13#10' // <%%% START IF_FIE'
+ +'LD_ENUM_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteEnumerated(''%'
+ +'FIELD_ORIGINALNAME%'', TypeInfo(%FIELD_TYPE%), l_%FIELD_NAME%);'#13#10' '
+ +'// <%%% END IF_FIELD_ENUM_TYPE %%%>'#13#10' // <%%% START IF_FIELD_STRUC'
+ +'T_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteStruct(''%FIELD_ORIG'
+ +'INALNAME%'', l_%FIELD_NAME%, %FIELD_TYPE%);'#13#10' // <%%% END IF_FIELD'
+ +'_STRUCT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_XSDATETIME_TYPE %%%>'#13
+ ,#10' TROSerializer(ASerializer).WriteStruct(''%FIELD_ORIGINALNAME%'', l_%'
+ +'FIELD_NAME%, %FIELD_TYPE%);'#13#10' // <%%% END IF_FIELD_XSDATETIME_TYPE'
+ +' %%%>'#13#10' // <%%% END FIELDS_NO_STRIP %%%>'#13#10' end'#13#10' els'
+ +'e begin'#13#10' // <%%% START ENTIRE_HIERARCHY_FIELDS %%%>'#13#10' l_'
+ +'%FIELD_NAME% := %FIELD_NAME%;'#13#10' // <%%% START IF_FIELD_BINARY_TYPE'
+ +' %%%>'#13#10' TROSerializer(ASerializer).WriteBinary(''%FIELD_ORIGINALNA'
+ +'ME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_BINARY_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' TROSerializer(AS'
+ +'erializer).WriteEnumerated(''%FIELD_ORIGINALNAME%'', TypeInfo(boolean), l_%'
+ +'FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' '
+ +'// <%%% START IF_FIELD_CURRENCY_TYPE %%%>'#13#10' TROSerializer(ASeriali'
+ +'zer).WriteDouble(''%FIELD_ORIGINALNAME%'', ftCurr, l_%FIELD_NAME%);'#13#10
+ +' // <%%% END IF_FIELD_CURRENCY_TYPE %%%>'#13#10' // <%%% START IF_FIE'
+ +'LD_DATETIME_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteDateTime('
+ +'''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_'
+ +'DATETIME_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DECIMAL_TYPE %%%>'#13
+ +#10' TROSerializer(ASerializer).WriteDecimal(''%FIELD_ORIGINALNAME%'', l_'
+ +'%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DECIMAL_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_DOUBLE_TYPE %%%>'#13#10' TROSerializer(ASerializ'
+ +'er).WriteDouble(''%FIELD_ORIGINALNAME%'', ftDouble, l_%FIELD_NAME%);'#13#10
+ +' // <%%% END IF_FIELD_DOUBLE_TYPE %%%>'#13#10' // <%%% START IF_FIELD'
+ +'_GUID_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteGuid(''%FIELD_OR'
+ +'IGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_GUID_TYPE %'
+ +'%%>'#13#10' // <%%% START IF_FIELD_INT64_TYPE %%%>'#13#10' TROSeriali'
+ +'zer(ASerializer).WriteInt64(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_INT64_TYPE %%%>'#13#10' // <%%% START IF_FIE'
+ +'LD_INTEGER_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteInteger(''%'
+ +'FIELD_ORIGINALNAME%'', otSLong, l_%FIELD_NAME%);'#13#10' // <%%% END IF_'
+ +'FIELD_INTEGER_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ANSISTRING_TYPE %'
+ +'%%>'#13#10' TROSerializer(ASerializer).WriteAnsiString(''%FIELD_ORIGINAL'
+ +'NAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ANSISTRING_TYPE %'
+ +'%%>'#13#10' // <%%% START IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' TROSe'
+ +'rializer(ASerializer).WriteUTF8String(''%FIELD_ORIGINALNAME%'', l_%FIELD_NA'
+ +'ME%);'#13#10' // <%%% END IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' // <%'
+ +'%% START IF_FIELD_VARIANT_TYPE %%%>'#13#10' TROSerializer(ASerializer).W'
+ +'riteVariant(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% E'
+ +'ND IF_FIELD_VARIANT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_WIDESTRING_'
+ +'TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteWideString(''%FIELD_OR'
+ +'IGINALNAME%'', l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_WIDESTRING_'
+ +'TYPE %%%>'#13#10' // <%%% START IF_FIELD_XML_TYPE %%%>'#13#10' TROSer'
+ +'ializer(ASerializer).WriteXml(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_XML_TYPE %%%>'#13#10' // <%%% START IF_FIELD'
+ +'_ARRAY_TYPE %%%>'#13#10' TROSerializer(ASerializer).WriteArray(''%FIELD_'
+ +'ORIGINALNAME%'', l_%FIELD_NAME%, %FIELD_TYPE%);'#13#10' // <%%% END IF_F'
+ +'IELD_ARRAY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ENUM_TYPE %%%>'#13#10
+ +' TROSerializer(ASerializer).WriteEnumerated(''%FIELD_ORIGINALNAME%'', Ty'
+ +'peInfo(%FIELD_TYPE%), l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ENUM'
+ +'_TYPE %%%>'#13#10' // <%%% START IF_FIELD_STRUCT_TYPE %%%>'#13#10' TR'
+ +'OSerializer(ASerializer).WriteStruct(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAM'
+ +'E%, %FIELD_TYPE%);'#13#10' // <%%% END IF_FIELD_STRUCT_TYPE %%%>'#13#10
+ +' // <%%% START IF_FIELD_XSDATETIME_TYPE %%%>'#13#10' TROSerializer(AS'
+ +'erializer).WriteStruct(''%FIELD_ORIGINALNAME%'', l_%FIELD_NAME%, %FIELD_TYP'
+ +'E%);'#13#10' // <%%% END IF_FIELD_XSDATETIME_TYPE %%%>'#13#10' // <%%'
+ +'% END ENTIRE_HIERARCHY_FIELDS %%%>'#13#10' end;'#13#10'end;'#13#10#13#10'/'
+ +'/ <%%% END IF_HAS_FIELDS %%%>'#13#10'{ %STRUCT_COLLECTION_NAME% }'#13#10'co'
+ +'nstructor %STRUCT_COLLECTION_NAME%.Create;'#13#10'begin'#13#10' inherited '
+ +'Create(%STRUCT_NAME%);'#13#10'end;'#13#10#13#10'constructor %STRUCT_COLLECT'
+ +'ION_NAME%.Create(aItemClass: TCollectionItemClass);'#13#10'begin'#13#10' i'
+ +'nherited Create(aItemClass);'#13#10'end;'#13#10#13#10'function %STRUCT_COLL'
+ +'ECTION_NAME%.Add: %STRUCT_NAME%;'#13#10'begin'#13#10' result := %STRUCT_NA'
+ +'ME%(inherited Add);'#13#10'end;'#13#10#13#10'function %STRUCT_COLLECTION_NA'
+ +'ME%.GetItems(aIndex: integer): %STRUCT_NAME%;'#13#10'begin'#13#10' result '
+ +':= %STRUCT_NAME%(inherited Items[aIndex]);'#13#10'end;'#13#10#13#10'// <%%%'
+ +' START ARRAYS_IS_FOUND %%%>'#13#10'procedure %STRUCT_COLLECTION_NAME%.LoadF'
+ ,'romArray(anArray: %ARRAY_NAME%);'#13#10'var'#13#10' i : integer;'#13#10'be'
+ +'gin'#13#10' Clear;'#13#10' for i := 0 to (anArray.Count-1) do'#13#10' '
+ +'Add.Assign(anArray[i]);'#13#10'end;'#13#10#13#10'procedure %STRUCT_COLLECTI'
+ +'ON_NAME%.SaveToArray(anArray: %ARRAY_NAME%);'#13#10'var'#13#10' i : intege'
+ +'r;'#13#10'begin'#13#10' anArray.Clear;'#13#10' anArray.Resize(Count);'#13
+ +#10' for i := 0 to (Count-1) do begin'#13#10' anArray[i] := %STRUCT_NAME'
+ +'%.Create;'#13#10' anArray[i].Assign(Items[i]);'#13#10' end;'#13#10'end;'
+ +#13#10#13#10'// <%%% END ARRAYS_IS_FOUND %%%>'#13#10#13#10'procedure %STRUCT'
+ +'_COLLECTION_NAME%.SetItems(aIndex: integer; const Value: %STRUCT_NAME%);'#13
+ +#10'begin'#13#10' %STRUCT_NAME%(inherited Items[aIndex]).Assign(Value);'#13
+ +#10'end;'#13#10#13#10'// <%%% END STRUCTS %%%>'#13#10'// <%%% START SERVICES'
+ +' %%%>'#13#10'{ Co%SERVICE_NAME% }'#13#10#13#10'class function Co%SERVICE_NA'
+ +'ME%.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChann'
+ +'el): I%SERVICE_NAME%;'#13#10'begin'#13#10' result := T%SERVICE_NAME%_Proxy'
+ +'.Create(aMessage, aTransportChannel);'#13#10'end;'#13#10#13#10'{ T%SERVICE_'
+ +'NAME%_Proxy }'#13#10#13#10'function T%SERVICE_NAME%_Proxy.__GetInterfaceNam'
+ +'e:string;'#13#10'begin'#13#10' result := ''%SERVICE_NAME%'';'#13#10'end;'
+ +#13#10#13#10'// <%%% START FUNCTION_OPERATIONS %%%>'#13#10'function T%SERVIC'
+ +'E_NAME%_Proxy.%OPERATION_NAME%('#13#10' // <%%% START PARAMS %%%>'
+ +#13#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10
+ +' // <%%% END PARAMS %%%>'#13#10' ): %OPERATION_RESULT%;'
+ +#13#10'begin'#13#10' // <%%% START OUT_PARAMS_NO_STRIP %%%>'#13#10' // <%%'
+ +'% START IF_PARAM_TYPE_COMPLEX %%%>'#13#10' %PARAM_NAME% := nil;'#13#10' /'
+ +'/ <%%% END IF_PARAM_TYPE_COMPLEX %%%>'#13#10' // <%%% END OUT_PARAMS_NO_ST'
+ +'RIP %%%>'#13#10' // <%%% START IF_RESULT_COMPLEX %%%>'#13#10' Result := n'
+ +'il;'#13#10' // <%%% END IF_RESULT_COMPLEX %%%>'#13#10' try'#13#10' __M'
+ +'essage.InitializeRequestMessage(__TransportChannel, ''%LIBRARY_NAME%'', __I'
+ +'nterfaceName, ''%OPERATION_NAME%'');'#13#10' // <%%% START IN_PARAMS_NO_'
+ +'STRIP %%%>'#13#10' __Message.Write(''%PARAM_NAME%'', TypeInfo(%PARAM_TYP'
+ +'E%), %PARAM_NAME%, [%PARAM_ATTRIBUTE%]);'#13#10' // <%%% END IN_PARAMS_N'
+ +'O_STRIP %%%>'#13#10' __Message.Finalize;'#13#10#13#10' __TransportCha'
+ +'nnel.Dispatch(__Message);'#13#10#13#10' __Message.Read(''Result'', TypeI'
+ +'nfo(%OPERATION_RESULT%), result, [%OPERATION_RESULT_ATTRIBUTE%]);'#13#10' '
+ +' // <%%% START OUT_PARAMS_NO_STRIP %%%>'#13#10' __Message.Read(''%PARAM'
+ +'_NAME%'', TypeInfo(%PARAM_TYPE%), %PARAM_NAME%, [%PARAM_ATTRIBUTE%]);'#13#10
+ +' // <%%% END OUT_PARAMS_NO_STRIP %%%>'#13#10' finally'#13#10' __Mess'
+ +'age.FreeStream;'#13#10' end'#13#10'end;'#13#10#13#10'// <%%% END FUNCTION_'
+ +'OPERATIONS %%%>'#13#10'// <%%% START PROCEDURE_OPERATIONS %%%>'#13#10'proce'
+ +'dure T%SERVICE_NAME%_Proxy.%OPERATION_NAME%('#13#10' // <%%% STAR'
+ +'T PARAMS %%%>'#13#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM'
+ +'_TYPE%;'#13#10' // <%%% END PARAMS %%%>'#13#10' );'#13
+ +#10'begin'#13#10' // <%%% START OUT_PARAMS_NO_STRIP %%%>'#13#10' // <%%% S'
+ +'TART IF_PARAM_TYPE_COMPLEX %%%>'#13#10' %PARAM_NAME% := nil;'#13#10' // <'
+ +'%%% END IF_PARAM_TYPE_COMPLEX %%%>'#13#10' // <%%% END OUT_PARAMS_NO_STRIP'
+ +' %%%>'#13#10' try'#13#10' __Message.InitializeRequestMessage(__Transpor'
+ +'tChannel, ''%LIBRARY_NAME%'', __InterfaceName, ''%OPERATION_NAME%'');'#13#10
+ +' // <%%% START IN_PARAMS_NO_STRIP %%%>'#13#10' __Message.Write(''%PAR'
+ +'AM_NAME%'', TypeInfo(%PARAM_TYPE%), %PARAM_NAME%, [%PARAM_ATTRIBUTE%]);'#13
+ +#10' // <%%% END IN_PARAMS_NO_STRIP %%%>'#13#10' __Message.Finalize;'
+ +#13#10#13#10' __TransportChannel.Dispatch(__Message);'#13#10#13#10' //'
+ +' <%%% START OUT_PARAMS_NO_STRIP %%%>'#13#10' __Message.Read(''%PARAM_NAM'
+ +'E%'', TypeInfo(%PARAM_TYPE%), %PARAM_NAME%, [%PARAM_ATTRIBUTE%]);'#13#10' '
+ +' // <%%% END OUT_PARAMS_NO_STRIP %%%>'#13#10' finally'#13#10' __Messag'
+ +'e.FreeStream;'#13#10' end'#13#10'end;'#13#10#13#10'// <%%% END PROCEDURE_O'
+ +'PERATIONS %%%>'#13#10'// <%%% END SERVICES %%%>'#13#10'// <%%% START EVENT_'
+ +'SINKS %%%>'#13#10'type'#13#10' { T%EVENT_SINK_NAME%_Writer }'#13#10' T%EV'
+ +'ENT_SINK_NAME%_Writer = class(T%EVENT_SINK_WRITER_ANCESTOR_NAME%, I%EVENT_S'
+ +'INK_NAME%_Writer)'#13#10' protected'#13#10' // <%%% START OPERATIONS %%'
+ +'%>'#13#10' procedure %OPERATION_NAME%(const __Sender : TGUID'#13#10' '
+ +' // <%%% START PARAMS %%%>'#13#10' ; %PARAM_FRONT'
+ +'_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%'#13#10' // <%%% END PA'
+ +'RAMS %%%>'#13#10' );'#13#10' // <%%% END OPERATIONS %%%>'
+ +#13#10' end;'#13#10#13#10'// <%%% START OPERATIONS %%%>'#13#10'procedure T%'
+ +'EVENT_SINK_NAME%_Writer.%OPERATION_NAME%(const __Sender : TGUID'#13#10' //'
+ ,' <%%% START PARAMS %%%>'#13#10' ; %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PA'
+ +'RAM_TYPE%'#13#10' // <%%% END PARAMS %%%>'#13#10' );'#13#10'var __eventda'
+ +'ta : Binary;'#13#10'begin'#13#10' __eventdata := Binary.Create;'#13#10' t'
+ +'ry'#13#10' __Message.InitializeEventMessage(NIL, ''%LIBRARY_NAME%'', EID'
+ +'_%EVENT_SINK_NAME%, ''%OPERATION_NAME%'');'#13#10' // <%%% START PARAMS_'
+ +'NO_STRIP %%%>'#13#10' __Message.Write(''%PARAM_NAME%'', TypeInfo(%PARAM_'
+ +'TYPE%), %PARAM_NAME%, [%PARAM_ATTRIBUTE%]);'#13#10' // <%%% END PARAMS_N'
+ +'O_STRIP %%%>'#13#10' __Message.Finalize;'#13#10#13#10' __Message.Writ'
+ +'eToStream(__eventdata);'#13#10#13#10' Repository.StoreEventData(__Sender'
+ +', __eventdata, ExcludeSender, ExcludeSessionList, SessionList.CommaText);'
+ +#13#10' finally'#13#10' __eventdata.Free;'#13#10' end;'#13#10'end;'#13
+ +#10#13#10'// <%%% END OPERATIONS %%%>'#13#10'type'#13#10' { T%EVENT_SINK_NA'
+ +'ME%_Invoker }'#13#10' T%EVENT_SINK_NAME%_Invoker = class(T%EVENT_SINK_INVO'
+ +'KER_ANCESTOR_NAME%)'#13#10' published'#13#10' // <%%% START OPERATIONS '
+ +'%%%>'#13#10' procedure Invoke_%OPERATION_NAME%(__EventReceiver : TROEven'
+ +'tReceiver; const __Message : IROMessage; const __Target : IUnknown);'#13#10
+ +' // <%%% END OPERATIONS %%%>'#13#10' end;'#13#10#13#10'// <%%% START OP'
+ +'ERATIONS %%%>'#13#10'procedure T%EVENT_SINK_NAME%_Invoker.Invoke_%OPERATION'
+ +'_NAME%(__EventReceiver : TROEventReceiver; const __Message : IROMessage; co'
+ +'nst __Target : IUnknown);'#13#10'var'#13#10' // <%%% START PARAMS_NO_STRIP'
+ +' %%%>'#13#10' %PARAM_NAME%: %PARAM_TYPE%;'#13#10' // <%%% END PARAMS_NO_S'
+ +'TRIP %%%>'#13#10' // <%%% START IF_HAS_COMPLEX_TYPE %%%>'#13#10' __lObjec'
+ +'tDisposer: TROObjectDisposer;'#13#10' // <%%% END IF_HAS_COMPLEX_TYPE %%%>'
+ +#13#10' __%EVENT_SINK_NAME%Instance: I%EVENT_SINK_NAME%;'#13#10'begin'#13#10
+ +' // <%%% START PARAMS_NO_STRIP %%%>'#13#10' // <%%% START IF_PARAM_TYPE_C'
+ +'OMPLEX %%%>'#13#10' %PARAM_NAME% := nil;'#13#10' // <%%% END IF_PARAM_TYP'
+ +'E_COMPLEX %%%>'#13#10' // <%%% END PARAMS_NO_STRIP %%%>'#13#10' try'#13#10
+ +' // <%%% START PARAMS_NO_STRIP %%%>'#13#10' __Message.Read(''%PARAM_N'
+ +'AME%'', TypeInfo(%PARAM_TYPE%), %PARAM_NAME%, [%PARAM_ATTRIBUTE%]);'#13#10
+ +' // <%%% END PARAMS_NO_STRIP %%%>'#13#10#13#10' __%EVENT_SINK_NAME%In'
+ +'stance := (__Target as I%EVENT_SINK_NAME%);'#13#10' __%EVENT_SINK_NAME%I'
+ +'nstance.%OPERATION_NAME%('#13#10' // <%%% '
+ +'START PARAMS %%%>'#13#10' %PARAM_NAME%,'#13
+ +#10' // <%%% END PARAMS %%%>'#13#10' '
+ +' );'#13#10#13#10' finally'#13#10' // <%%% STA'
+ +'RT IF_HAS_COMPLEX_TYPE %%%>'#13#10' __lObjectDisposer := TROObjectDispos'
+ +'er.Create(__EventReceiver);'#13#10' try'#13#10' // <%%% START PARAM'
+ +'S_NO_STRIP %%%>'#13#10' // <%%% START IF_PARAM_TYPE_COMPLEX %%%>'#13#10
+ +' __lObjectDisposer.Add(%PARAM_NAME%);'#13#10' // <%%% END IF_PARA'
+ +'M_TYPE_COMPLEX %%%>'#13#10' // <%%% END PARAMS_NO_STRIP %%%>'#13#10' '
+ +' finally'#13#10' __lObjectDisposer.Free();'#13#10' end;'#13#10' '
+ +' // <%%% END IF_HAS_COMPLEX_TYPE %%%>'#13#10' end'#13#10'end;'#13#10#13#10
+ +'// <%%% END OPERATIONS %%%>'#13#10'// <%%% END EVENT_SINKS %%%>'#13#10'init'
+ +'ialization'#13#10' // <%%% START STRUCTS %%%>'#13#10' RegisterROClass(%ST'
+ +'RUCT_NAME%);'#13#10' // <%%% END STRUCTS %%%>'#13#10' // <%%% START ARRAY'
+ +'S %%%>'#13#10' RegisterROClass(%ARRAY_NAME%);'#13#10' // <%%% END ARRAYS '
+ +'%%%>'#13#10' // <%%% START EXCEPTIONS %%%>'#13#10' RegisterExceptionClass'
+ +'(%EXCEPTION_NAME%);'#13#10' // <%%% END EXCEPTIONS %%%>'#13#10' // <%%% S'
+ +'TART SERVICES %%%>'#13#10' RegisterProxyClass(I%SERVICE_NAME%_IID, T%SERVI'
+ +'CE_NAME%_Proxy);'#13#10' // <%%% END SERVICES %%%> '#13#10' // <%%% S'
+ +'TART EVENT_SINKS %%%>'#13#10' RegisterEventWriterClass(I%EVENT_SINK_NAME%_'
+ +'Writer, T%EVENT_SINK_NAME%_Writer);'#13#10' RegisterEventInvokerClass(EID_'
+ +'%EVENT_SINK_NAME%, T%EVENT_SINK_NAME%_Invoker);'#13#10' // <%%% END EVENT_'
+ +'SINKS %%%> '#13#10#13#10'finalization'#13#10' // <%%% START STRUCTS %%'
+ +'%>'#13#10' UnregisterROClass(%STRUCT_NAME%);'#13#10' // <%%% END STRUCTS '
+ +'%%%>'#13#10' // <%%% START ARRAYS %%%>'#13#10' UnregisterROClass(%ARRAY_N'
+ +'AME%);'#13#10' // <%%% END ARRAYS %%%>'#13#10' // <%%% START EXCEPTIONS %'
+ +'%%>'#13#10' UnregisterExceptionClass(%EXCEPTION_NAME%);'#13#10' // <%%% E'
+ +'ND EXCEPTIONS %%%>'#13#10' // <%%% START SERVICES %%%>'#13#10' Unregister'
+ +'ProxyClass(I%SERVICE_NAME%_IID);'#13#10' // <%%% END SERVICES %%%>'#13#10
+ +' // <%%% START EVENT_SINKS %%%>'#13#10' UnregisterEventWriterClass(I%EVEN'
+ +'T_SINK_NAME%_Writer);'#13#10' UnregisterEventInvokerClass(EID_%EVENT_SINK_'
+ +'NAME%);'#13#10' // <%%% END EVENT_SINKS %%%> '#13#10#13#10'end.'#13#10
+]);
+LazarusResources.Add('TEMPLATE_INVK_PAS','RCDATA',[
+ 'unit %UNIT_NAME%;'#13#10#13#10'{--------------------------------------------'
+ +'--------------------------------}'#13#10'{ This unit was automatically gene'
+ +'rated by the RemObjects SDK after reading }'#13#10'{ the RODL file associa'
+ +'ted with this project . }'#13#10'{ '
+ +' }'#13#10'{'
+ +' Do not modify this unit manually, or your changes will be lost when this '
+ +' }'#13#10'{ unit is regenerated the next time you compile the project. '
+ +' }'#13#10'{-----------------------------------------------------'
+ +'-----------------------}'#13#10#13#10'{$I RemObjects.inc}'#13#10#13#10'inte'
+ +'rface'#13#10#13#10'uses'#13#10' {vcl:} Classes,'#13#10' {RemObjects:} uRO'
+ +'XMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,'#13#10' // <%%'
+ +'% START REQUIRED_UNITS %%%>'#13#10' {Required:} %REQUIRED_UNIT_NAME%,'#13
+ +#10' // <%%% END REQUIRED_UNITS %%%>'#13#10' {Generated:} %LIBRARY_NAME%_I'
+ +'ntf;'#13#10#13#10'type'#13#10' TSeekOrigin = Classes.TSeekOrigin; // fake '
+ +'declaration'#13#10#13#10' // <%%% START SERVICES %%%>'#13#10' T%SERVICE_N'
+ +'AME%_Invoker = class(T%SERVICE_INVOKER_ANCESTOR_NAME%)'#13#10' private'#13
+ +#10' protected'#13#10' constructor Create; override;'#13#10' published'
+ +#13#10' // <%%% START FUNCTION_OPERATIONS %%%>'#13#10' procedure Invok'
+ +'e_%OPERATION_NAME%(const __Instance:IInterface; const __Message:IROMessage;'
+ +' const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions)'
+ +';'#13#10' // <%%% END FUNCTION_OPERATIONS %%%>'#13#10' // <%%% START '
+ +'PROCEDURE_OPERATIONS %%%>'#13#10' procedure Invoke_%OPERATION_NAME%(cons'
+ +'t __Instance:IInterface; const __Message:IROMessage; const __Transport:IROT'
+ +'ransport; out __oResponseOptions:TROResponseOptions);'#13#10' // <%%% EN'
+ +'D PROCEDURE_OPERATIONS %%%>'#13#10' end;'#13#10#13#10' // <%%% END SERVIC'
+ +'ES %%%>'#13#10'implementation'#13#10#13#10'uses'#13#10' {RemObjects:} uROR'
+ +'es, uROClient;'#13#10#13#10'// <%%% START SERVICES %%%>'#13#10'{ T%SERVICE_'
+ +'NAME%_Invoker }'#13#10#13#10'constructor T%SERVICE_NAME%_Invoker.Create;'#13
+ +#10'begin'#13#10' inherited Create;'#13#10' FAbstract := %IS_ABSTRACT%;'#13
+ +#10'end;'#13#10#13#10'// <%%% START FUNCTION_OPERATIONS %%%>'#13#10'procedur'
+ +'e T%SERVICE_NAME%_Invoker.Invoke_%OPERATION_NAME%(const __Instance:IInterfa'
+ +'ce; const __Message:IROMessage; const __Transport:IROTransport; out __oResp'
+ +'onseOptions:TROResponseOptions);'#13#10'{ function %OPERATION_NAME%('#13#10
+ +' // <%%% START PARAMS %%%>'#13#10' %PARAM_FRONT_M'
+ +'ODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' // <%%% END PARAM'
+ +'S %%%>'#13#10' ): %OPERATION_RESULT%; }'#13#10'var'#13#10' //'
+ +' <%%% START PARAMS_NO_STRIP %%%>'#13#10' %PARAM_NAME%: %PARAM_TYPE%;'#13#10
+ +' // <%%% END PARAMS_NO_STRIP %%%>'#13#10' lResult: %OPERATION_RESULT%;'#13
+ +#10' // <%%% START IF_HAS_COMPLEX_TYPE %%%>'#13#10' __lObjectDisposer: TRO'
+ +'ObjectDisposer;'#13#10' // <%%% END IF_HAS_COMPLEX_TYPE %%%>'#13#10' __%S'
+ +'ERVICE_NAME%Instance: I%SERVICE_NAME%;'#13#10'begin'#13#10' // <%%% START '
+ +'PARAMS_NO_STRIP %%%>'#13#10' // <%%% START IF_PARAM_TYPE_COMPLEX %%%>'#13
+ +#10' %PARAM_NAME% := nil;'#13#10' // <%%% END IF_PARAM_TYPE_COMPLEX %%%>'
+ +#13#10' // <%%% END PARAMS_NO_STRIP %%%>'#13#10' // <%%% START IF_RESULT_C'
+ +'OMPLEX %%%>'#13#10' lResult := nil;'#13#10' // <%%% END IF_RESULT_COMPLEX'
+ +' %%%>'#13#10' try'#13#10' // <%%% START IN_PARAMS_NO_STRIP %%%>'#13#10
+ +' __Message.Read(''%PARAM_NAME%'', TypeInfo(%PARAM_TYPE%), %PARAM_NAME%, '
+ +'[%PARAM_ATTRIBUTE%]);'#13#10' // <%%% END IN_PARAMS_NO_STRIP %%%>'#13#10
+ +#13#10' __%SERVICE_NAME%Instance := __Instance as I%SERVICE_NAME%; '#13#10
+ +' lResult := __%SERVICE_NAME%Instance.%OPERATION_NAME%('#13#10' '
+ +' // <%%% START PARAMS %%%>'#13#10' '
+ +' %PARAM_NAME%,'#13#10' '
+ +' // <%%% END PARAMS %%%>'#13#10' '
+ +' );'#13#10#13#10' __Message.InitializeResponseMessage(_'
+ +'_Transport, ''%LIBRARY_NAME%'', ''%SERVICE_NAME%'', ''%OPERATION_NAME%Respo'
+ +'nse'');'#13#10' __Message.Write(''Result'', TypeInfo(%OPERATION_RESULT%)'
+ +', lResult, [%OPERATION_RESULT_ATTRIBUTE%]);'#13#10' // <%%% START OUT_PA'
+ +'RAMS_NO_STRIP %%%>'#13#10' __Message.Write(''%PARAM_NAME%'', TypeInfo(%P'
+ +'ARAM_TYPE%), %PARAM_NAME%, [%PARAM_ATTRIBUTE%]);'#13#10' // <%%% END OUT'
+ +'_PARAMS_NO_STRIP %%%>'#13#10' __Message.Finalize;'#13#10' __Message.U'
+ +'nsetAttributes(__Transport);'#13#10' '#13#10' finally'#13#10' // <%%'
+ +'% START IF_HAS_COMPLEX_TYPE %%%>'#13#10' __lObjectDisposer := TROObjectD'
+ +'isposer.Create(__Instance);'#13#10' try'#13#10' // <%%% START PARAM'
+ +'S_NO_STRIP %%%>'#13#10' // <%%% START IF_PARAM_TYPE_COMPLEX %%%>'#13#10
+ ,' __lObjectDisposer.Add(%PARAM_NAME%);'#13#10' // <%%% END IF_PARA'
+ +'M_TYPE_COMPLEX %%%>'#13#10' // <%%% END PARAMS_NO_STRIP %%%>'#13#10' '
+ +' // <%%% START IF_RESULT_COMPLEX %%%>'#13#10' __lObjectDisposer.Add'
+ +'(lResult);'#13#10' // <%%% END IF_RESULT_COMPLEX %%%>'#13#10' final'
+ +'ly'#13#10' __lObjectDisposer.Free();'#13#10' end;'#13#10' // <%%'
+ +'% END IF_HAS_COMPLEX_TYPE %%%>'#13#10' end;'#13#10'end;'#13#10#13#10'// <%'
+ +'%% END FUNCTION_OPERATIONS %%%>'#13#10'// <%%% START PROCEDURE_OPERATIONS %'
+ +'%%>'#13#10'procedure T%SERVICE_NAME%_Invoker.Invoke_%OPERATION_NAME%(const '
+ +'__Instance:IInterface; const __Message:IROMessage; const __Transport:IROTra'
+ +'nsport; out __oResponseOptions:TROResponseOptions);'#13#10'{ procedure %OPE'
+ +'RATION_NAME%('#13#10' // <%%% START PARAMS %%%>'#13#10' '
+ +' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' '
+ +' // <%%% END PARAMS %%%>'#13#10' ); }'#13#10'var'#13#10' /'
+ +'/ <%%% START PARAMS_NO_STRIP %%%>'#13#10' %PARAM_NAME%: %PARAM_TYPE%;'#13
+ +#10' // <%%% END PARAMS_NO_STRIP %%%>'#13#10' // <%%% START IF_HAS_COMPLEX'
+ +'_TYPE %%%>'#13#10' __lObjectDisposer: TROObjectDisposer;'#13#10' // <%%% '
+ +'END IF_HAS_COMPLEX_TYPE %%%>'#13#10' __%SERVICE_NAME%Instance: I%SERVICE_N'
+ +'AME%;'#13#10'begin'#13#10' // <%%% START PARAMS_NO_STRIP %%%>'#13#10' // '
+ +'<%%% START IF_PARAM_TYPE_COMPLEX %%%>'#13#10' %PARAM_NAME% := nil;'#13#10
+ +' // <%%% END IF_PARAM_TYPE_COMPLEX %%%>'#13#10' // <%%% END PARAMS_NO_STR'
+ +'IP %%%>'#13#10' try'#13#10' // <%%% START IN_PARAMS_NO_STRIP %%%>'#13#10
+ +' __Message.Read(''%PARAM_NAME%'', TypeInfo(%PARAM_TYPE%), %PARAM_NAME%, '
+ +'[%PARAM_ATTRIBUTE%]);'#13#10' // <%%% END IN_PARAMS_NO_STRIP %%%>'#13#10
+ +#13#10' __%SERVICE_NAME%Instance := __Instance as I%SERVICE_NAME%; '#13#10
+ +' __%SERVICE_NAME%Instance.%OPERATION_NAME%('#13#10' '
+ +' // <%%% START PARAMS %%%>'#13#10' %'
+ +'PARAM_NAME%,'#13#10' // <%%% END PARAMS %%%>'
+ +#13#10' );'#13#10#13#10' __Message.Initiali'
+ +'zeResponseMessage(__Transport, ''%LIBRARY_NAME%'', ''%SERVICE_NAME%'', ''%O'
+ +'PERATION_NAME%Response'');'#13#10' // <%%% START OUT_PARAMS_NO_STRIP %%%'
+ +'>'#13#10' __Message.Write(''%PARAM_NAME%'', TypeInfo(%PARAM_TYPE%), %PAR'
+ +'AM_NAME%, [%PARAM_ATTRIBUTE%]);'#13#10' // <%%% END OUT_PARAMS_NO_STRIP '
+ +'%%%>'#13#10' __Message.Finalize;'#13#10' __Message.UnsetAttributes(__'
+ +'Transport);'#13#10' '#13#10' // <%%% START IF_NO_OUT_PARAMS %%%>'#13
+ +#10' __oResponseOptions := [roNoResponse];'#13#10#13#10' // <%%% END I'
+ +'F_NO_OUT_PARAMS %%%>'#13#10' finally'#13#10' // <%%% START IF_HAS_COMPL'
+ +'EX_TYPE %%%>'#13#10' __lObjectDisposer := TROObjectDisposer.Create(__Ins'
+ +'tance);'#13#10' try'#13#10' // <%%% START PARAMS_NO_STRIP %%%>'#13
+ +#10' // <%%% START IF_PARAM_TYPE_COMPLEX %%%>'#13#10' __lObjectDis'
+ +'poser.Add(%PARAM_NAME%);'#13#10' // <%%% END IF_PARAM_TYPE_COMPLEX %%%'
+ +'>'#13#10' // <%%% END PARAMS_NO_STRIP %%%>'#13#10' finally'#13#10' '
+ +' __lObjectDisposer.Free();'#13#10' end;'#13#10' // <%%% END IF_HA'
+ +'S_COMPLEX_TYPE %%%>'#13#10' end;'#13#10'end;'#13#10#13#10'// <%%% END PROC'
+ +'EDURE_OPERATIONS %%%>'#13#10'// <%%% END SERVICES %%%>'#13#10'end.'#13#10
+]);
+LazarusResources.Add('TEMPLATE_IMPL_PAS','RCDATA',[
+ 'unit %UNIT_NAME%;'#13#10#13#10'{--------------------------------------------'
+ +'--------------------------------}'#13#10'{ This unit was automatically gene'
+ +'rated by the RemObjects SDK after reading }'#13#10'{ the RODL file associa'
+ +'ted with this project . }'#13#10'{ '
+ +' }'#13#10'{'
+ +' This is where you are supposed to code the implementation of your objects.'
+ +' }'#13#10'{----------------------------------------------------------------'
+ +'------------}'#13#10#13#10'{$I RemObjects.inc}'#13#10#13#10'interface'#13#10
+ +#13#10'uses'#13#10' {vcl:} Classes, SysUtils,'#13#10' {RemObjects:} uROXML'
+ +'Intf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,'#13#10
+ +' // <%%% START REQUIRED_UNITS %%%>'#13#10' {Required:} %REQUIRED_UNIT_NAM'
+ +'E%,'#13#10' // <%%% END REQUIRED_UNITS %%%>'#13#10' {Generated:} %LIBRARY'
+ +'_NAME%_Intf;'#13#10#13#10'// <%%% START SERVICES %%%>'#13#10'type'#13#10' '
+ +'{ T%SERVICE_NAME% }'#13#10' T%SERVICE_NAME% = class(%SERVICE_ANCESTOR_NAME'
+ +'%, I%SERVICE_NAME%)'#13#10' private'#13#10' protected'#13#10' { I%SERV'
+ +'ICE_NAME% methods }'#13#10' // <%%% START FUNCTION_OPERATIONS %%%>'#13#10
+ +' function %OPERATION_NAME%('#13#10' // <%%% START PARAMS %'
+ +'%%>'#13#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%'
+ +';'#13#10' // <%%% END PARAMS %%%>'#13#10' ): %O'
+ +'PERATION_RESULT%;'#13#10' // <%%% END FUNCTION_OPERATIONS %%%>'#13#10' '
+ +' // <%%% START PROCEDURE_OPERATIONS %%%>'#13#10' procedure %OPERATION_N'
+ +'AME%('#13#10' // <%%% START PARAMS %%%>'#13#10' '
+ +' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' /'
+ +'/ <%%% END PARAMS %%%>'#13#10' );'#13#10' // <%%% END PROC'
+ +'EDURE_OPERATIONS %%%>'#13#10' end;'#13#10'// <%%% END SERVICES %%%>'#13#10
+ +#13#10'implementation'#13#10#13#10'// <%%% START IF_DATA_MODULE %%%>'#13#10
+ +'{$R *.dfm}'#13#10#13#10'// <%%% END IF_DATA_MODULE %%%>'#13#10'uses'#13#10
+ +' {Generated:} %LIBRARY_NAME%_Invk;'#13#10#13#10'// <%%% START SERVICES %%%'
+ +'>'#13#10'procedure Create_%SERVICE_NAME%(out anInstance : IUnknown);'#13#10
+ +'begin'#13#10' anInstance := T%SERVICE_NAME%.Create('#13#10' // <%%% STA'
+ +'RT IF_DATA_MODULE %%%>'#13#10' nil'#13#10' // <%%% END IF_DATA_MODULE'
+ +' %%%>'#13#10' );'#13#10'end;'#13#10#13#10'{ %SERVICE_NAME% }'#13#10'// <'
+ +'%%% START FUNCTION_OPERATIONS %%%>'#13#10'function T%SERVICE_NAME%.%OPERATI'
+ +'ON_NAME%('#13#10' // <%%% START PARAMS %%%>'#13#10' %PA'
+ +'RAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' // <%%% E'
+ +'ND PARAMS %%%>'#13#10' ): %OPERATION_RESULT%;'#13#10'begin'#13#10
+ +'end;'#13#10#13#10'// <%%% END FUNCTION_OPERATIONS %%%>'#13#10'// <%%% START'
+ +' PROCEDURE_OPERATIONS %%%>'#13#10'procedure T%SERVICE_NAME%.%OPERATION_NAME'
+ +'%('#13#10' // <%%% START PARAMS %%%>'#13#10' %PARAM_FRO'
+ +'NT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' // <%%% END PARA'
+ +'MS %%%>'#13#10' );'#13#10'begin'#13#10'end;'#13#10#13#10'// <%%% '
+ +'END PROCEDURE_OPERATIONS %%%>'#13#10'initialization'#13#10' TROClassFactor'
+ +'y.Create(''%SERVICE_NAME%'', Create_%SERVICE_NAME%, T%SERVICE_NAME%_Invoker'
+ +');'#13#10#13#10'finalization'#13#10#13#10'// <%%% END SERVICES %%%>'#13#10
+ +'end.'#13#10
+]);
+LazarusResources.Add('TEMPLATE_ASYNC_PAS','RCDATA',[
+ 'unit %UNIT_NAME%;'#13#10#13#10'{--------------------------------------------'
+ +'--------------------------------}'#13#10'{ This unit was automatically gene'
+ +'rated by the RemObjects SDK after reading }'#13#10'{ the RODL file associa'
+ +'ted with this project . }'#13#10'{ '
+ +' }'#13#10'{'
+ +' Do not modify this unit manually, or your changes will be lost when this '
+ +' }'#13#10'{ unit is regenerated the next time you compile the project. '
+ +' }'#13#10'{-----------------------------------------------------'
+ +'-----------------------}'#13#10#13#10'{$I RemObjects.inc}'#13#10#13#10'inte'
+ +'rface'#13#10#13#10'uses'#13#10' {vcl:} Classes, TypInfo,'#13#10' {RemObje'
+ +'cts:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf, uROAsync'
+ +#13#10' // <%%% START REQUIRED_UNITS %%%>'#13#10' {Required:} %REQUIRED_UN'
+ +'IT_NAME%,'#13#10' // <%%% END REQUIRED_UNITS %%%>'#13#10' {Generated:} %L'
+ +'IBRARY_NAME%_Intf;'#13#10#13#10'type'#13#10' { Forward declarations }'#13
+ +#10' // <%%% START SERVICES %%%>'#13#10' I%SERVICE_NAME%_Async = interface'
+ +';'#13#10' Co%SERVICE_NAME%_Async = class;'#13#10' T%SERVICE_NAME%_AsyncPr'
+ +'oxy = class;'#13#10' // <%%% END SERVICES %%%>'#13#10#13#10' // <%%% STAR'
+ +'T SERVICES %%%>'#13#10' { I%SERVICE_NAME%_Async }'#13#10' // <%%% START D'
+ +'OCUMENTATION %%%>'#13#10#13#10' { Description:'#13#10' %CONTENT% }'#13
+ +#10' // <%%% END DOCUMENTATION %%%>'#13#10' I%SERVICE_NAME%_Async = interf'
+ +'ace%SERVICE_ANCESTOR_NAME%'#13#10' [''%ASYNC_SERVICE_UID%'']'#13#10' '
+ +'// <%%% START FUNCTION_OPERATIONS %%%>'#13#10' procedure Invoke_%OPERATI'
+ +'ON_NAME%('#13#10' // <%%% START IN_PARAMS %%%>'#13#10' '
+ +' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' '
+ +' // <%%% END IN_PARAMS %%%>'#13#10' );'#13#10' functi'
+ +'on Retrieve_%OPERATION_NAME%('#13#10' // <%%% START OUT_PARAM'
+ +'S %%%>'#13#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TY'
+ +'PE%;'#13#10' // <%%% END OUT_PARAMS %%%>'#13#10' '
+ +' ): %OPERATION_RESULT%;'#13#10' // <%%% END FUNCTION_OPERATIONS %%%>'#13
+ +#10' // <%%% START PROCEDURE_OPERATIONS %%%>'#13#10' procedure Invoke_'
+ +'%OPERATION_NAME%('#13#10' // <%%% START IN_PARAMS %%%>'#13#10
+ +' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' '
+ +' // <%%% END IN_PARAMS %%%>'#13#10' );'#13#10
+ +' // <%%% START IF_OUT_PARAMS %%%>'#13#10' procedure Retrieve_%OPERATI'
+ +'ON_NAME%('#13#10' // <%%% START OUT_PARAMS %%%>'#13#10' '
+ +' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' '
+ +' // <%%% END OUT_PARAMS %%%>'#13#10' );'#13#10' // <'
+ +'%%% END IF_OUT_PARAMS %%%>'#13#10' // <%%% END PROCEDURE_OPERATIONS %%%>'
+ +#13#10' end;'#13#10#13#10' { Co%SERVICE_NAME%_Async }'#13#10' Co%SERVICE_'
+ +'NAME%_Async = class'#13#10' class function Create(const aMessage: IROMes'
+ +'sage; aTransportChannel: IROTransportChannel): I%SERVICE_NAME%_Async;'#13#10
+ +' end;'#13#10#13#10' { T%SERVICE_NAME%_Proxy }'#13#10' T%SERVICE_NAME%_As'
+ +'yncProxy = class(%SERVICE_PROXY_ANCESTOR_NAME%, I%SERVICE_NAME%_Async)'#13
+ +#10' protected'#13#10' function __GetInterfaceName:string; override;'#13
+ +#10#13#10' // <%%% START FUNCTION_OPERATIONS %%%>'#13#10' procedure In'
+ +'voke_%OPERATION_NAME%('#13#10' // <%%% START IN_PARAMS %%%>'
+ +#13#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13
+ +#10' // <%%% END IN_PARAMS %%%>'#13#10' );'#13#10
+ +' function Retrieve_%OPERATION_NAME%('#13#10' // <%%% START'
+ +' OUT_PARAMS %%%>'#13#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME%:'
+ +' %PARAM_TYPE%;'#13#10' // <%%% END OUT_PARAMS %%%>'#13#10' '
+ +' ): %OPERATION_RESULT%;'#13#10' // <%%% END FUNCTION_OPERATIO'
+ +'NS %%%>'#13#10' // <%%% START PROCEDURE_OPERATIONS %%%>'#13#10' proce'
+ +'dure Invoke_%OPERATION_NAME%('#13#10' // <%%% START IN_PARAM'
+ +'S %%%>'#13#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_T'
+ +'YPE%;'#13#10' // <%%% END IN_PARAMS %%%>'#13#10' '
+ +' );'#13#10' // <%%% START IF_OUT_PARAMS %%%>'#13#10' procedure Ret'
+ +'rieve_%OPERATION_NAME%('#13#10' // <%%% START OUT_PARAMS %%%>'
+ +#13#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13
+ +#10' // <%%% END OUT_PARAMS %%%>'#13#10' );'#13
+ +#10' // <%%% END IF_OUT_PARAMS %%%>'#13#10' // <%%% END PROCEDURE_OPER'
+ +'ATIONS %%%>'#13#10' end;'#13#10#13#10' // <%%% END SERVICES %%%>'#13#10'i'
+ +'mplementation'#13#10#13#10'uses'#13#10' {vcl:} SysUtils,'#13#10' {RemObje'
+ +'cts:} uROEventRepository, uRORes;'#13#10#13#10'// <%%% START SERVICES %%%>'
+ ,#13#10'{ Co%SERVICE_NAME%_Async }'#13#10#13#10'class function Co%SERVICE_NAM'
+ +'E%_Async.Create(const aMessage: IROMessage; aTransportChannel: IROTransport'
+ +'Channel): I%SERVICE_NAME%_Async;'#13#10'begin'#13#10' result := T%SERVICE_'
+ +'NAME%_AsyncProxy.Create(aMessage, aTransportChannel);'#13#10'end;'#13#10#13
+ +#10'{ T%SERVICE_NAME%_AsyncProxy }'#13#10#13#10'function T%SERVICE_NAME%_Asy'
+ +'ncProxy.__GetInterfaceName:string;'#13#10'begin'#13#10' result := ''%SERVI'
+ +'CE_NAME%'';'#13#10'end;'#13#10#13#10'// <%%% START FUNCTION_OPERATIONS %%%>'
+ +#13#10'procedure T%SERVICE_NAME%_AsyncProxy.Invoke_%OPERATION_NAME%('#13#10
+ +' // <%%% START IN_PARAMS %%%>'#13#10' %PARAM_FRONT_MODI'
+ +'FIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' // <%%% END IN_PARAMS %'
+ +'%%>'#13#10' );'#13#10'begin'#13#10' __AssertProxyNotBusy(''%OPER'
+ +'ATION_NAME%'');'#13#10#13#10' __Message.InitializeRequestMessage(__Transpo'
+ +'rtChannel, ''%LIBRARY_NAME%'', __InterfaceName, ''%OPERATION_NAME%'');'#13
+ +#10' // <%%% START IN_PARAMS_NO_STRIP %%%>'#13#10' __Message.Write(''%PARA'
+ +'M_NAME%'', TypeInfo(%PARAM_TYPE%), %PARAM_NAME%, [%PARAM_ATTRIBUTE%]);'#13
+ +#10' // <%%% END IN_PARAMS_NO_STRIP %%%>'#13#10#13#10' __DispatchAsyncRequ'
+ +'est(''%OPERATION_NAME%'',__Message);'#13#10'end;'#13#10#13#10'function T%SE'
+ +'RVICE_NAME%_AsyncProxy.Retrieve_%OPERATION_NAME%('#13#10' // <%%%'
+ +' START OUT_PARAMS %%%>'#13#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME'
+ +'%: %PARAM_TYPE%;'#13#10' // <%%% END OUT_PARAMS %%%>'#13#10' '
+ +' ): %OPERATION_RESULT%;'#13#10'var'#13#10' __response:TStream;'#13#10
+ +'begin'#13#10' // <%%% START OUT_PARAMS_NO_STRIP %%%>'#13#10' // <%%% STAR'
+ +'T IF_PARAM_TYPE_COMPLEX %%%>'#13#10' %PARAM_NAME% := nil;'#13#10' // <%%%'
+ +' END IF_PARAM_TYPE_COMPLEX %%%>'#13#10' // <%%% END OUT_PARAMS_NO_STRIP %%'
+ +'%>'#13#10' // <%%% START IF_RESULT_COMPLEX %%%>'#13#10' Result := nil;'#13
+ +#10' // <%%% END IF_RESULT_COMPLEX %%%>'#13#10#13#10' __response := __Retr'
+ +'ieveAsyncResponse(''%OPERATION_NAME%'');'#13#10' __Message.ReadFromStream('
+ +'__response);'#13#10#13#10' __Message.Read(''Result'', TypeInfo(%OPERATION_'
+ +'RESULT%), Result, [%OPERATION_RESULT_ATTRIBUTE%]);'#13#10' // <%%% START O'
+ +'UT_PARAMS_NO_STRIP %%%>'#13#10' __Message.Read(''%PARAM_NAME%'', TypeInfo('
+ +'%PARAM_TYPE%), %PARAM_NAME%, [%PARAM_ATTRIBUTE%]);'#13#10' // <%%% END OUT'
+ +'_PARAMS_NO_STRIP %%%>'#13#10#13#10' __response.Free();'#13#10'end;'#13#10
+ +#13#10'// <%%% END FUNCTION_OPERATIONS %%%>'#13#10'// <%%% START PROCEDURE_O'
+ +'PERATIONS %%%>'#13#10'procedure T%SERVICE_NAME%_AsyncProxy.Invoke_%OPERATIO'
+ +'N_NAME%('#13#10' // <%%% START IN_PARAMS %%%>'#13#10' %'
+ +'PARAM_FRONT_MODIFIER% %PARAM_NAME%: %PARAM_TYPE%;'#13#10' // <%%%'
+ +' END IN_PARAMS %%%>'#13#10' );'#13#10'var'#13#10' __request:TStr'
+ +'eam;'#13#10'begin'#13#10' __AssertProxyNotBusy(''%OPERATION_NAME%'');'#13
+ +#10' __request := TMemoryStream.Create;'#13#10#13#10' __Message.Initialize'
+ +'RequestMessage(__TransportChannel, ''%LIBRARY_NAME%'', __InterfaceName, ''%'
+ +'OPERATION_NAME%'');'#13#10' // <%%% START IN_PARAMS_NO_STRIP %%%>'#13#10' '
+ +' __Message.Write(''%PARAM_NAME%'', TypeInfo(%PARAM_TYPE%), %PARAM_NAME%, [%'
+ +'PARAM_ATTRIBUTE%]);'#13#10' // <%%% END IN_PARAMS_NO_STRIP %%%>'#13#10' _'
+ +'_Message.Finalize;'#13#10#13#10' __Message.WriteToStream(__request);'#13#10
+ +' __DispatchAsyncRequest(''%OPERATION_NAME%'', __request, False);'#13#10'en'
+ +'d;'#13#10#13#10'// <%%% START IF_OUT_PARAMS %%%>'#13#10'procedure T%SERVICE'
+ +'_NAME%_AsyncProxy.Retrieve_%OPERATION_NAME%('#13#10' // <%%% STAR'
+ +'T OUT_PARAMS %%%>'#13#10' %PARAM_FRONT_MODIFIER% %PARAM_NAME%: %P'
+ +'ARAM_TYPE%;'#13#10' // <%%% END OUT_PARAMS %%%>'#13#10' '
+ +' );'#13#10'var'#13#10' __response:TStream;'#13#10'begin'#13#10' // <%%% S'
+ +'TART OUT_PARAMS_NO_STRIP %%%>'#13#10' // <%%% START IF_PARAM_TYPE_COMPLEX '
+ +'%%%>'#13#10' %PARAM_NAME% := nil;'#13#10' // <%%% END IF_PARAM_TYPE_COMPL'
+ +'EX %%%>'#13#10' // <%%% END OUT_PARAMS_NO_STRIP %%%>'#13#10#13#10' __resp'
+ +'onse := __RetrieveAsyncResponse(''%OPERATION_NAME%'');'#13#10' __Message.R'
+ +'eadFromStream(__response);'#13#10#13#10' // <%%% START OUT_PARAMS_NO_STRIP'
+ +' %%%>'#13#10' __Message.Read(''%PARAM_NAME%'', TypeInfo(%PARAM_TYPE%), %PA'
+ +'RAM_NAME%, [%PARAM_ATTRIBUTE%]);'#13#10' // <%%% END OUT_PARAMS_NO_STRIP %'
+ +'%%>'#13#10#13#10' __response.Free();'#13#10'end;'#13#10#13#10'// <%%% END '
+ +'IF_OUT_PARAMS %%%>'#13#10'// <%%% END PROCEDURE_OPERATIONS %%%>'#13#10'// <'
+ +'%%% END SERVICES %%%>'#13#10'initialization'#13#10#13#10'finalization'#13#10
+ +#13#10'end.'#13#10
+]);
+LazarusResources.Add('TEMPLATE_WRAPPER_INTF_PAS','RCDATA',[
+ 'unit %UNIT_NAME%;'#13#10#13#10'{--------------------------------------------'
+ +'--------------------------------}'#13#10'{ This unit was automatically gene'
+ +'rated by the RemObjects SDK after reading }'#13#10'{ the RODL file associa'
+ +'ted with this project . }'#13#10'{ '
+ +' }'#13#10'{'
+ +' Do not modify this unit manually, or your changes will be lost when this '
+ +' }'#13#10'{ unit is regenerated the next time you compile the project. '
+ +' }'#13#10'{-----------------------------------------------------'
+ +'-----------------------}'#13#10#13#10'interface'#13#10#13#10'uses'#13#10' '
+ +'// <%%% START USES %%%>'#13#10' %USED_UNIT_NAME%,'#13#10' // <%%% END USE'
+ +'S %%%>'#13#10' ;'#13#10#13#10'type'#13#10' // <%%% START TYPES %%%>'#13#10
+ +' %TYPE_NAME% = %TYPE_UNIT_NAME%.%TYPE_NAME%;'#13#10' // <%%% END TYPES %%'
+ +'%>'#13#10' '#13#10'implementation'#13#10#13#10'end.'#13#10
+]);
+LazarusResources.Add('TEMPLATE_WRAPPER_INVK_PAS','RCDATA',[
+ 'unit %UNIT_NAME%;'#13#10#13#10'{--------------------------------------------'
+ +'--------------------------------}'#13#10'{ This unit was automatically gene'
+ +'rated by the RemObjects SDK after reading }'#13#10'{ the RODL file associa'
+ +'ted with this project . }'#13#10'{ '
+ +' }'#13#10'{'
+ +' Do not modify this unit manually, or your changes will be lost when this '
+ +' }'#13#10'{ unit is regenerated the next time you compile the project. '
+ +' }'#13#10'{-----------------------------------------------------'
+ +'-----------------------}'#13#10#13#10'interface'#13#10#13#10'uses'#13#10' '
+ +'// <%%% START USES %%%>'#13#10' %USED_UNIT_NAME%,'#13#10' // <%%% END USE'
+ +'S %%%>'#13#10' ;'#13#10#13#10'type'#13#10' // <%%% START TYPES %%%>'#13#10
+ +' %TYPE_NAME%_Invoker = %TYPE_UNIT_NAME%.%TYPE_NAME%_Invoker;'#13#10' // <'
+ +'%%% END TYPES %%%>'#13#10' '#13#10'implementation'#13#10#13#10'end.'#13#10
+]);
+LazarusResources.Add('TEMPLATE_WRAPPER_ASYNC_PAS','RCDATA',[
+ 'unit %UNIT_NAME%;'#13#10#13#10'{--------------------------------------------'
+ +'--------------------------------}'#13#10'{ This unit was automatically gene'
+ +'rated by the RemObjects SDK after reading }'#13#10'{ the RODL file associa'
+ +'ted with this project . }'#13#10'{ '
+ +' }'#13#10'{'
+ +' Do not modify this unit manually, or your changes will be lost when this '
+ +' }'#13#10'{ unit is regenerated the next time you compile the project. '
+ +' }'#13#10'{-----------------------------------------------------'
+ +'-----------------------}'#13#10#13#10'interface'#13#10#13#10'uses'#13#10' '
+ +'// <%%% START USES %%%>'#13#10' %USED_UNIT_NAME%,'#13#10' // <%%% END USE'
+ +'S %%%>'#13#10' ;'#13#10#13#10'type'#13#10' // <%%% START TYPES %%%>'#13#10
+ +' %TYPE_NAME% = %TYPE_UNIT_NAME%.%TYPE_NAME%;'#13#10' // <%%% END TYPES %%'
+ +'%>'#13#10' '#13#10'implementation'#13#10#13#10'end.'#13#10
+]);
+LazarusResources.Add('TEMPLATE_IMPL_DFM','RCDATA',[
+ '// <%%% START SERVICES %%%>'#13#10'object %SERVICE_NAME%: T%SERVICE_NAME%'#13
+ +#10' OldCreateOrder = False'#13#10' Height = 150'#13#10' Width = 150'#13
+ +#10'end'#13#10'// <%%% END SERVICES %%%>'#13#10
+]);
+LazarusResources.Add('TEMPLATE_INTF_CPP','RCDATA',[
+ '// %UNIT_NAME%'#13#10'//'#13#10'/*------------------------------------------'
+ +'---------------------------------}'#13#10'{ This unit was automatically gen'
+ +'erated by the RemObjects SDK after reading }'#13#10'{ the RODL file associ'
+ +'ated with this project. }'#13#10'{ '
+ +' }'#13#10
+ +'{ Do not modify this unit manually, or your changes will be lost when this '
+ +' }'#13#10'{ unit is regenerated the next time you compile the project. '
+ +' }'#13#10'{----------------------------------------------------'
+ +'-----------------------*/'#13#10#13#10'void __initialization_%UNIT_NAME%();'
+ +#13#10'void __finalization_%UNIT_NAME%();'#13#10#13#10'#pragma startup __ini'
+ +'tialization_%UNIT_NAME%'#13#10'#pragma exit __finalization_%UNIT_NAME%'
+ +#13#10#13#10'#include "%LIBRARY_NAME%_Intf.h"'#13#10'#include '#13#10'#include '#13#10#13#10'// Implementation of %'
+ +'UNIT_NAME%'#13#10#13#10'// <%%% START ARRAYS %%%>'#13#10'// %ARRAY_NAME%'#13
+ +#10'void __fastcall %ARRAY_NAME%::Assign(Classes::TPersistent* iSource)'#13
+ +#10'{'#13#10' %ARRAY_NAME%* lSource = dynamic_cast<%ARRAY_NAME%*>(iSource);'
+ +#13#10' if (lSource)'#13#10' {'#13#10' Clear();'#13#10' Resize(lSour'
+ +'ce->Count);'#13#10' for (int i = 0 ; i < Count ; i++)'#13#10' {'#13#10
+ +' // <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' if (lSource->It'
+ +'ems[i] != NULL)'#13#10' {'#13#10' Items[i]->Assign(lSource->Ite'
+ +'ms[i]);'#13#10' }'#13#10' // <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'
+ +#13#10' // <%%% START IF_ARRAY_TYPE_SIMPLE %%%>'#13#10' Items[i] ='
+ +' lSource->Items[i];'#13#10' // <%%% END IF_ARRAY_TYPE_SIMPLE %%%>'#13
+ +#10' }'#13#10' }'#13#10' else'#13#10' {'#13#10' inherited::Assign(i'
+ +'Source);'#13#10' }'#13#10'}'#13#10#13#10'void __fastcall %ARRAY_NAME%::Rea'
+ +'dComplex(TObject* ASerializer)'#13#10'{'#13#10' // <%%% START IF_ARRAY_TYP'
+ +'E_SIMPLE %%%>'#13#10' %ARRAY_TYPE% lval;'#13#10' // <%%% END IF_ARRAY_TYP'
+ +'E_SIMPLE %%%>'#13#10' // <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' %A'
+ +'RRAY_TYPE%* lval;'#13#10' // <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' '
+ +'TROSerializer* Serializer = dynamic_cast(ASerializer);'#13
+ +#10' for (int i = 0; i < Count; i++)'#13#10' {'#13#10' // <%%% START IF'
+ +'_ARRAY_BINARY_TYPE %%%>'#13#10' Serializer->ReadBinary(Serializer->GetAr'
+ +'rayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), &lval,'
+ +' i);'#13#10' // <%%% END IF_ARRAY_BINARY_TYPE %%%>'#13#10' // <%%% ST'
+ +'ART IF_ARRAY_BOOLEAN_TYPE %%%>'#13#10' Serializer->ReadEnumerated(Serial'
+ +'izer->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef('
+ +'i)), __GetboolInfo, &lval, i);'#13#10' // <%%% END IF_ARRAY_BOOLEAN_TYPE'
+ +' %%%>'#13#10' // <%%% START IF_ARRAY_CURRENCY_TYPE %%%>'#13#10' Seria'
+ +'lizer->ReadDouble(Serializer->GetArrayElementName(GetItemType(__classid(%AR'
+ +'RAY_NAME%)), GetItemRef(i)), ftCurr, &lval, i);'#13#10' // <%%% END IF_A'
+ +'RRAY_CURRENCY_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_DATETIME_TYPE %%%'
+ +'>'#13#10' Serializer->ReadDateTime(Serializer->GetArrayElementName(GetIt'
+ +'emType(__classid(%ARRAY_NAME%)), GetItemRef(i)), &lval, i);'#13#10' // <'
+ +'%%% END IF_ARRAY_DATETIME_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_DECIM'
+ +'AL_TYPE %%%>'#13#10' Serializer->ReadDecimal(Serializer->GetArrayElement'
+ +'Name(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), &lval, i);'#13#10
+ +' // <%%% END IF_ARRAY_DECIMAL_TYPE %%%>'#13#10' // <%%% START IF_ARRA'
+ +'Y_DOUBLE_TYPE %%%>'#13#10' Serializer->ReadDouble(Serializer->GetArrayEl'
+ +'ementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), ftDouble, &'
+ +'lval, i);'#13#10' // <%%% END IF_ARRAY_DOUBLE_TYPE %%%>'#13#10' // <%'
+ +'%% START IF_ARRAY_GUID_TYPE %%%>'#13#10' Serializer->ReadGuid(Serializer'
+ +'->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)),'
+ +' &lval, i);'#13#10' // <%%% END IF_ARRAY_GUID_TYPE %%%>'#13#10' // <%'
+ +'%% START IF_ARRAY_INT64_TYPE %%%>'#13#10' Serializer->ReadInt64(Serializ'
+ +'er->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)'
+ +'), &lval, i);'#13#10' // <%%% END IF_ARRAY_INT64_TYPE %%%>'#13#10' //'
+ +' <%%% START IF_ARRAY_INTEGER_TYPE %%%>'#13#10' Serializer->ReadInteger(S'
+ +'erializer->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetIte'
+ +'mRef(i)), otSLong, &lval, i);'#13#10' // <%%% END IF_ARRAY_INTEGER_TYPE '
+ +'%%%>'#13#10' // <%%% START IF_ARRAY_ANSISTRING_TYPE %%%>'#13#10' Seri'
+ +'alizer->ReadUTF8String(Serializer->GetArrayElementName(GetItemType(__classi'
+ +'d(%ARRAY_NAME%)), GetItemRef(i)), &lval, i);'#13#10' // <%%% END IF_ARRA'
+ +'Y_ANSISTRING_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_UTF8STRING_TYPE %%'
+ +'%>'#13#10' Serializer->ReadUTF8String(Serializer->GetArrayElementName(Ge'
+ ,'tItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), &lval, i);'#13#10' /'
+ +'/ <%%% END IF_ARRAY_UTF8STRING_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_'
+ +'VARIANT_TYPE %%%>'#13#10' Serializer->ReadVariant(Serializer->GetArrayEl'
+ +'ementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), &lval, i);'
+ +#13#10' // <%%% END IF_ARRAY_VARIANT_TYPE %%%>'#13#10' // <%%% START I'
+ +'F_ARRAY_WIDESTRING_TYPE %%%>'#13#10' Serializer->ReadWideString(Serializ'
+ +'er->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)'
+ +'), &lval, i);'#13#10' // <%%% END IF_ARRAY_WIDESTRING_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_ARRAY_XML_TYPE %%%>'#13#10' Serializer->ReadXml(Seri'
+ +'alizer->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRe'
+ +'f(i)), &lval, i);'#13#10' // <%%% END IF_ARRAY_XML_TYPE %%%>'#13#10' '
+ +'// <%%% START IF_ARRAY_ARRAY_TYPE %%%>'#13#10' Serializer->ReadArray(Ser'
+ +'ializer->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemR'
+ +'ef(i)), __classid(%ARRAY_TYPE%), &lval, i);'#13#10' // <%%% END IF_ARRAY'
+ +'_ARRAY_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_ENUM_TYPE %%%>'#13#10' '
+ +' Serializer->ReadEnumerated(Serializer->GetArrayElementName(GetItemType(__'
+ +'classid(%ARRAY_NAME%)), GetItemRef(i)), __Get%ARRAY_TYPE%Info, &lval, i);'
+ +#13#10' // <%%% END IF_ARRAY_ENUM_TYPE %%%>'#13#10' // <%%% START IF_A'
+ +'RRAY_STRUCT_TYPE %%%>'#13#10' Serializer->ReadStruct(Serializer->GetArra'
+ +'yElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), __classi'
+ +'d(%ARRAY_TYPE%), &lval, i);'#13#10' // <%%% END IF_ARRAY_STRUCT_TYPE %%%'
+ +'>'#13#10' Items[i] = lval;'#13#10' }'#13#10'}'#13#10#13#10'void __fastc'
+ +'all %ARRAY_NAME%::WriteComplex(TObject* ASerializer)'#13#10'{'#13#10' TRO'
+ +'Serializer* Serializer = dynamic_cast(ASerializer);'#13#10
+ +' for(int i = 0; i < Count; i++)'#13#10' // <%%% START IF_ARRAY_BINARY_T'
+ +'YPE %%%>'#13#10' Serializer->WriteBinary(Serializer->GetArrayElementName'
+ +'(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), &(fItems[i]), i);'#13
+ +#10' // <%%% END IF_ARRAY_BINARY_TYPE %%%>'#13#10' // <%%% START IF_AR'
+ +'RAY_BOOLEAN_TYPE %%%>'#13#10' Serializer->WriteEnumerated(Serializer->Ge'
+ +'tArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), __G'
+ +'etboolInfo, &(fItems[i]), i);'#13#10' // <%%% END IF_ARRAY_BOOLEAN_TYPE '
+ +'%%%>'#13#10' // <%%% START IF_ARRAY_CURRENCY_TYPE %%%>'#13#10' Serial'
+ +'izer->WriteDouble(Serializer->GetArrayElementName(GetItemType(__classid(%AR'
+ +'RAY_NAME%)), GetItemRef(i)), ftCurr, &(fItems[i]), i);'#13#10' // <%%% E'
+ +'ND IF_ARRAY_CURRENCY_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_DATETIME_T'
+ +'YPE %%%>'#13#10' Serializer->WriteDateTime(Serializer->GetArrayElementNa'
+ +'me(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), &(fItems[i]), i);'
+ +#13#10' // <%%% END IF_ARRAY_DATETIME_TYPE %%%>'#13#10' // <%%% START '
+ +'IF_ARRAY_DECIMAL_TYPE %%%>'#13#10' Serializer->WriteDecimal(Serializer->'
+ +'GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), &'
+ +'(fItems[i]), i);'#13#10' // <%%% END IF_ARRAY_DECIMAL_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_ARRAY_DOUBLE_TYPE %%%>'#13#10' Serializer->WriteDoub'
+ +'le(Serializer->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), Ge'
+ +'tItemRef(i)), ftDouble, &(fItems[i]), i);'#13#10' // <%%% END IF_ARRAY_D'
+ +'OUBLE_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_GUID_TYPE %%%>'#13#10' '
+ +' Serializer->WriteGuid(Serializer->GetArrayElementName(GetItemType(__classi'
+ +'d(%ARRAY_NAME%)), GetItemRef(i)), &(fItems[i]), i);'#13#10' // <%%% END '
+ +'IF_ARRAY_GUID_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_INT64_TYPE %%%>'
+ +#13#10' Serializer->WriteInt64(Serializer->GetArrayElementName(GetItemTyp'
+ +'e(__classid(%ARRAY_NAME%)), GetItemRef(i)), &(fItems[i]), i);'#13#10' //'
+ +' <%%% END IF_ARRAY_INT64_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_INTEGE'
+ +'R_TYPE %%%>'#13#10' Serializer->WriteInteger(Serializer->GetArrayElement'
+ +'Name(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), otSLong, &(fItem'
+ +'s[i]), i);'#13#10' // <%%% END IF_ARRAY_INTEGER_TYPE %%%>'#13#10' // '
+ +'<%%% START IF_ARRAY_ANSISTRING_TYPE %%%>'#13#10' Serializer->WriteUTF8St'
+ +'ring(Serializer->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), '
+ +'GetItemRef(i)), &(fItems[i]), i);'#13#10' // <%%% END IF_ARRAY_ANSISTRIN'
+ +'G_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_UTF8STRING_TYPE %%%>'#13#10' '
+ +' Serializer->WriteUTF8String(Serializer->GetArrayElementName(GetItemType('
+ +'__classid(%ARRAY_NAME%)), GetItemRef(i)), &(fItems[i]), i);'#13#10' // <'
+ +'%%% END IF_ARRAY_UTF8STRING_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_VAR'
+ +'IANT_TYPE %%%>'#13#10' Serializer->WriteVariant(Serializer->GetArrayElem'
+ +'entName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef(i)), &(fItems[i]),'
+ +' i);'#13#10' // <%%% END IF_ARRAY_VARIANT_TYPE %%%>'#13#10' // <%%% S'
+ ,'TART IF_ARRAY_WIDESTRING_TYPE %%%>'#13#10' Serializer->WriteWideString(S'
+ +'erializer->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetIte'
+ +'mRef(i)), &(fItems[i]), i);'#13#10' // <%%% END IF_ARRAY_WIDESTRING_TYPE'
+ +' %%%>'#13#10' // <%%% START IF_ARRAY_XML_TYPE %%%>'#13#10' Serializer'
+ +'->WriteXml(Serializer->GetArrayElementName(GetItemType(__classid(%ARRAY_NAM'
+ +'E%)), GetItemRef(i)), &(fItems[i]), i);'#13#10' // <%%% END IF_ARRAY_XML'
+ +'_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_ARRAY_TYPE %%%>'#13#10' Ser'
+ +'ializer->WriteArray(Serializer->GetArrayElementName(GetItemType(__classid(%'
+ +'ARRAY_NAME%)), GetItemRef(i)), &(fItems[i]), i);'#13#10' // <%%% END IF_'
+ +'ARRAY_ARRAY_TYPE %%%>'#13#10' // <%%% START IF_ARRAY_ENUM_TYPE %%%>'#13
+ +#10' Serializer->WriteEnumerated(Serializer->GetArrayElementName(GetItemT'
+ +'ype(__classid(%ARRAY_NAME%)), GetItemRef(i)), __Get%ARRAY_TYPE%Info, &(fIte'
+ +'ms[i]), i);'#13#10' // <%%% END IF_ARRAY_ENUM_TYPE %%%>'#13#10' // <%'
+ +'%% START IF_ARRAY_STRUCT_TYPE %%%>'#13#10' Serializer->WriteStruct(Seria'
+ +'lizer->GetArrayElementName(GetItemType(__classid(%ARRAY_NAME%)), GetItemRef'
+ +'(i)), &(fItems[i]), __classid(%ARRAY_TYPE%), i);'#13#10' // <%%% END IF_'
+ +'ARRAY_STRUCT_TYPE %%%>'#13#10'}'#13#10#13#10'void __fastcall %ARRAY_NAME%::'
+ +'Grow()'#13#10'{'#13#10' int Delta;'#13#10' int Capacity = fItems.Length;'
+ +#13#10' if (Capacity > 64) '#13#10' {'#13#10' Delta = Capacity / 4;'#13
+ +#10' }'#13#10' else'#13#10' {'#13#10' if (Capacity > 8) '#13#10' '
+ +'Delta = 16;'#13#10' else'#13#10' Delta = 4;'#13#10' }'#13#10' fIt'
+ +'ems.set_length(Capacity + Delta);'#13#10'}'#13#10#13#10'// <%%% START IF_AR'
+ +'RAY_TYPE_COMPLEX %%%>'#13#10'%ARRAY_TYPE%* __fastcall %ARRAY_NAME%::GetItem'
+ +'s(const int Index)'#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10'// '
+ +'<%%% START IF_ARRAY_TYPE_SIMPLE %%%>'#13#10'%ARRAY_TYPE% __fastcall %ARRAY_'
+ +'NAME%::GetItems(const int Index)'#13#10'// <%%% END IF_ARRAY_TYPE_SIMPLE %%'
+ +'%>'#13#10'{'#13#10' if ((Index < 0) || (Index >= Count))'#13#10' {'#13#10
+ +' RaiseError(LoadResourceString(&_err_ArrayIndexOutOfBounds), ARRAYOFCONS'
+ +'T((Index)));'#13#10' }'#13#10' return fItems[Index];'#13#10'}'#13#10#13#10
+ +'// <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10'void __fastcall %ARRAY_NAME'
+ +'%::SetItems(const int Index, %ARRAY_TYPE%* Value)'#13#10'// <%%% END IF_ARR'
+ +'AY_TYPE_COMPLEX %%%>'#13#10'// <%%% START IF_ARRAY_TYPE_SIMPLE %%%>'#13#10
+ +'void __fastcall %ARRAY_NAME%::SetItems(const int Index, %ARRAY_TYPE% Value)'
+ +#13#10'// <%%% END IF_ARRAY_TYPE_SIMPLE %%%>'#13#10'{'#13#10' if ((Index < '
+ +'0) || (Index >= Count))'#13#10' {'#13#10' RaiseError(LoadResourceString'
+ +'(&_err_ArrayIndexOutOfBounds), ARRAYOFCONST((Index)));'#13#10' }'#13#10' '
+ +'// <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' delete fItems[Index];'#13
+ +#10' // <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' fItems[Index] = Value;'
+ +#13#10'}'#13#10#13#10'int __fastcall %ARRAY_NAME%::GetCount()'#13#10'{'#13#10
+ +' return fCount;'#13#10'}'#13#10#13#10'void* __fastcall %ARRAY_NAME%::GetIt'
+ +'emRef(const int Index)'#13#10'{'#13#10' if ((Index < 0) || (Index >= Count'
+ +'))'#13#10' {'#13#10' RaiseError(LoadResourceString(&_err_ArrayIndexOutO'
+ +'fBounds), ARRAYOFCONST((Index)));'#13#10' }'#13#10'// <%%% START IF_ARRAY_'
+ +'TYPE_COMPLEX %%%>'#13#10' return fItems[Index];'#13#10'// <%%% END IF_ARRA'
+ +'Y_TYPE_COMPLEX %%%>'#13#10'// <%%% START IF_ARRAY_TYPE_SIMPLE %%%>'#13#10' '
+ +' return &fItems[Index];'#13#10'// <%%% END IF_ARRAY_TYPE_SIMPLE %%%>'#13#10
+ +'}'#13#10#13#10'// <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10'void __fastc'
+ +'all %ARRAY_NAME%::SetItemRef(const int Index, void* Ref)'#13#10'{'#13#10' '
+ +'if ((Index < 0) || (Index >= Count))'#13#10' {'#13#10' RaiseError(LoadR'
+ +'esourceString(&_err_ArrayIndexOutOfBounds), ARRAYOFCONST((Index)));'#13#10
+ +' }'#13#10#13#10' if (Ref != fItems[Index])'#13#10' {'#13#10' delete f'
+ +'Items[Index];'#13#10' fItems[Index] = reinterpret_cast<%ARRAY_TYPE%*>(Re'
+ +'f);'#13#10' }'#13#10'}'#13#10#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'
+ +#13#10'void __fastcall %ARRAY_NAME%::Clear()'#13#10'{'#13#10' // <%%% START'
+ +' IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' for (int i = 0; i < Count; i++)'#13#10
+ +' delete fItems[i];'#13#10#13#10' // <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'
+ +#13#10' fItems.set_length(0);'#13#10' fCount = 0;'#13#10'}'#13#10#13#10'vo'
+ +'id __fastcall %ARRAY_NAME%::Delete(const int Index)'#13#10'{'#13#10' if (I'
+ +'ndex >= Count)'#13#10' {'#13#10' RaiseError(LoadResourceString(&_err_In'
+ +'validIndex), ARRAYOFCONST((Index)));'#13#10' }'#13#10#13#10' // <%%% STAR'
+ +'T IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' delete fItems[Index];'#13#10#13#10' '
+ +'// <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' if (Index < Count - 1)'#13
+ +#10' for (int i = Index; i < Count - 1 ; i++)'#13#10' fItems[i] = fI'
+ +'tems[i + 1];'#13#10#13#10' fItems.set_length(Count - 1);'#13#10' fCount--'
+ ,';'#13#10'}'#13#10#13#10'void __fastcall %ARRAY_NAME%::Resize(const int Elem'
+ +'entCount)'#13#10'{'#13#10'// <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' '
+ +' int i;'#13#10' for(i = fCount -1; i >= ElementCount; --i)'#13#10' dele'
+ +'te fItems[i];'#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' fItems'
+ +'.set_length(ElementCount);'#13#10'// <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'
+ +#13#10' for(i = fCount; i <= ElementCount -1; ++i)'#13#10' fItems[i] = n'
+ +'ew %ARRAY_TYPE%();'#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%%>'#13#10' f'
+ +'Count = ElementCount;'#13#10'}'#13#10#13#10'// <%%% START IF_ARRAY_TYPE_COM'
+ +'PLEX %%%>'#13#10'%ARRAY_TYPE%* __fastcall %ARRAY_NAME%::Add()'#13#10'{'#13
+ +#10' %ARRAY_TYPE%* result = new %ARRAY_TYPE%();'#13#10' Add(result);'#13#10
+ +' return result;'#13#10'}'#13#10#13#10'// <%%% END IF_ARRAY_TYPE_COMPLEX %%'
+ +'%>'#13#10'// <%%% START IF_ARRAY_TYPE_COMPLEX %%%>'#13#10'int __fastcall %A'
+ +'RRAY_NAME%::Add(%ARRAY_TYPE%* Value)'#13#10'// <%%% END IF_ARRAY_TYPE_COMPL'
+ +'EX %%%>'#13#10'// <%%% START IF_ARRAY_TYPE_SIMPLE %%%>'#13#10'int __fastcal'
+ +'l %ARRAY_NAME%::Add(%ARRAY_TYPE% Value)'#13#10'// <%%% END IF_ARRAY_TYPE_SI'
+ +'MPLE %%%>'#13#10'{'#13#10' int result = Count;'#13#10' if (fItems.Length '
+ +'== result)'#13#10' Grow();'#13#10#13#10' fItems[result] = Value;'#13#10
+ +' fCount++;'#13#10' return result;'#13#10'}'#13#10'// <%%% END ARRAYS %%%>'
+ +#13#10'// <%%% START EXCEPTIONS %%%>'#13#10'// %EXCEPTION_NAME%'#13#10#13#10
+ +'%EXCEPTION_NAME%::%EXCEPTION_NAME%(AnsiString anExceptionMessage'#13#10' '
+ +' // <%%% START ANCESTOR_FIELDS %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_TYPE_SIMPLE %%%>'#13#10' , %FIEL'
+ +'D_TYPE% a%FIELD_NAME% '#13#10' // <%%% END IF_FIELD_TYPE_'
+ +'SIMPLE %%%>'#13#10' // <%%% START IF_FIELD_TYPE_COMPLEX %'
+ +'%%>'#13#10' , %FIELD_TYPE%* a%FIELD_NAME% '#13#10' '
+ +' // <%%% END IF_FIELD_TYPE_COMPLEX %%%>'#13#10' '
+ +' // <%%% END ANCESTOR_FIELDS %%%>'#13#10' // <%%% START '
+ +'FIELDS_NO_STRIP %%%>'#13#10' // <%%% START IF_FIELD_TYPE_'
+ +'SIMPLE %%%>'#13#10' , %FIELD_TYPE% a%FIELD_NAME% '#13#10
+ +' // <%%% END IF_FIELD_TYPE_SIMPLE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_TYPE_COMPLEX %%%>'#13#10' '
+ +', %FIELD_TYPE%* a%FIELD_NAME% '#13#10' // <%%% END IF_FIE'
+ +'LD_TYPE_COMPLEX %%%>'#13#10' // <%%% END FIELDS_NO_STRIP '
+ +'%%%>'#13#10' ): %EXCEPTION_ANCESTOR_NAME%(anExceptionMess'
+ +'age'#13#10' // <%%% START ANCESTOR_FIELDS %%%>'#13#10' '
+ +' , a%FIELD_NAME% '#13#10' // <%%% EN'
+ +'D ANCESTOR_FIELDS %%%>'#13#10' )'#13#10'{'#13#10' // <'
+ +'%%% START FIELDS_NO_STRIP %%%>'#13#10' f%FIELD_NAME% = a%FIELD_NAME%;'#13
+ +#10' // <%%% END FIELDS_NO_STRIP %%%>'#13#10'}'#13#10#13#10'// <%%% START I'
+ +'F_HAS_FIELDS %%%>'#13#10'void __fastcall %EXCEPTION_NAME%::ReadException(TO'
+ +'bject* ASerializer)'#13#10'{'#13#10' if (dynamic_cast(ASer'
+ +'ializer)->RecordStrictOrder)'#13#10' {'#13#10' // <%%% START IF_STRUCT_'
+ +'HAS_ANCESTOR %%%>'#13#10' inherited::ReadException(ASerializer);'#13#10
+ +' // <%%% END IF_STRUCT_HAS_ANCESTOR %%%>'#13#10' // <%%% START FIELDS'
+ +'_NO_STRIP %%%>'#13#10' // <%%% START IF_FIELD_TYPE_SIMPLE %%%>'#13#10' '
+ +' %FIELD_TYPE% l_%FIELD_NAME% = %FIELD_NAME%;'#13#10' // <%%% END IF_FIE'
+ +'LD_TYPE_SIMPLE %%%>'#13#10' // <%%% START IF_FIELD_TYPE_COMPLEX %%%>'#13
+ +#10' %FIELD_TYPE%* l_%FIELD_NAME% = %FIELD_NAME%;'#13#10' // <%%% END '
+ +'IF_FIELD_TYPE_COMPLEX %%%>'#13#10' // <%%% START IF_FIELD_BINARY_TYPE %%'
+ +'%>'#13#10' dynamic_cast(ASerializer)->ReadBinary("%FIELD'
+ +'_NAME%", &l_%FIELD_NAME%);'#13#10' if (%FIELD_NAME% != l_%FIELD_NAME%) d'
+ +'elete %FIELD_NAME%;'#13#10' // <%%% END IF_FIELD_BINARY_TYPE %%%>'#13#10
+ +' // <%%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->ReadEnumerated("%FIELD_NAME%", __GetboolInfo, &l_%F'
+ +'IELD_NAME%);'#13#10' // <%%% END IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' /'
+ +'/ <%%% START IF_FIELD_CURRENCY_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->ReadDouble("%FIELD_NAME%", ftCurr, &l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_CURRENCY_TYPE %%%>'#13#10' // <%%% START IF_'
+ +'FIELD_DATETIME_TYPE %%%>'#13#10' dynamic_cast(ASerialize'
+ +'r)->ReadDateTime("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END I'
+ +'F_FIELD_DATETIME_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DECIMAL_TYPE %'
+ +'%%>'#13#10' dynamic_cast(ASerializer)->ReadDecimal("%FIE'
+ +'LD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DECIMAL_TYPE %'
+ +'%%>'#13#10' // <%%% START IF_FIELD_DOUBLE_TYPE %%%>'#13#10' dynamic_c'
+ ,'ast(ASerializer)->ReadDouble("%FIELD_NAME%", ftDouble, &l_%'
+ +'FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DOUBLE_TYPE %%%>'#13#10' /'
+ +'/ <%%% START IF_FIELD_GUID_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->ReadGuid("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%'
+ +'%% END IF_FIELD_GUID_TYPE %%%>'#13#10' // <%%% START IF_FIELD_INT64_TYPE'
+ +' %%%>'#13#10' dynamic_cast(ASerializer)->ReadInt64("%FIE'
+ +'LD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_INT64_TYPE %%%'
+ +'>'#13#10' // <%%% START IF_FIELD_INTEGER_TYPE %%%>'#13#10' dynamic_ca'
+ +'st(ASerializer)->ReadInteger("%FIELD_NAME%", otSLong, &l_%F'
+ +'IELD_NAME%);'#13#10' // <%%% END IF_FIELD_INTEGER_TYPE %%%>'#13#10' /'
+ +'/ <%%% START IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->ReadAnsiString("%FIELD_NAME%", &l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' // <%%% START I'
+ +'F_FIELD_UTF8STRING_TYPE %%%>'#13#10' dynamic_cast(ASeria'
+ +'lizer)->ReadUTF8String("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%%'
+ +' END IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_VARIAN'
+ +'T_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->ReadVaria'
+ +'nt("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_VARIAN'
+ +'T_TYPE %%%>'#13#10' // <%%% START IF_FIELD_WIDESTRING_TYPE %%%>'#13#10' '
+ +' dynamic_cast(ASerializer)->ReadWideString("%FIELD_NAME%"'
+ +', &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_WIDESTRING_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_XML_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->ReadXml("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' '
+ +' // <%%% END IF_FIELD_XML_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ARRAY'
+ +'_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->ReadArray('
+ +'"%FIELD_NAME%", __classid(%FIELD_TYPE%), &l_%FIELD_NAME%);'#13#10' if (%'
+ +'FIELD_NAME% != l_%FIELD_NAME%) delete %FIELD_NAME%;'#13#10' // <%%% END '
+ +'IF_FIELD_ARRAY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ENUM_TYPE %%%>'
+ +#13#10' dynamic_cast(ASerializer)->ReadEnumerated("%FIELD'
+ +'_NAME%", __Get%FIELD_TYPE%Info, &l_%FIELD_NAME%);'#13#10' // <%%% END IF'
+ +'_FIELD_ENUM_TYPE %%%>'#13#10' // <%%% START IF_FIELD_STRUCT_TYPE %%%>'#13
+ +#10' dynamic_cast(ASerializer)->ReadStruct("%FIELD_NAME%"'
+ +', __classid(%FIELD_TYPE%), &l_%FIELD_NAME%);'#13#10' if (%FIELD_NAME% !='
+ +' l_%FIELD_NAME%) delete %FIELD_NAME%;'#13#10' // <%%% END IF_FIELD_STRUC'
+ +'T_TYPE %%%>'#13#10' %FIELD_NAME% = l_%FIELD_NAME%;'#13#10' // <%%% EN'
+ +'D FIELDS_NO_STRIP %%%>'#13#10' }'#13#10' else'#13#10' {'#13#10' // <%'
+ +'%% START ENTIRE_HIERARCHY_FIELDS %%%>'#13#10' // <%%% START IF_FIELD_TYP'
+ +'E_SIMPLE %%%>'#13#10' %FIELD_TYPE% l_%FIELD_NAME% = %FIELD_NAME%;'#13#10
+ +' // <%%% END IF_FIELD_TYPE_SIMPLE %%%>'#13#10' // <%%% START IF_FIELD'
+ +'_TYPE_COMPLEX %%%>'#13#10' %FIELD_TYPE%* l_%FIELD_NAME% = %FIELD_NAME%;'
+ +#13#10' // <%%% END IF_FIELD_TYPE_COMPLEX %%%>'#13#10' // <%%% START I'
+ +'F_FIELD_BINARY_TYPE %%%>'#13#10' dynamic_cast(ASerialize'
+ +'r)->ReadBinary("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' if (%FIELD_NAME'
+ +'% != l_%FIELD_NAME%) delete %FIELD_NAME%;'#13#10' // <%%% END IF_FIELD_B'
+ +'INARY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13#10
+ +' dynamic_cast(ASerializer)->ReadEnumerated("%FIELD_NAME%'
+ +'", __GetboolInfo, &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_BOOLEAN'
+ +'_TYPE %%%>'#13#10' // <%%% START IF_FIELD_CURRENCY_TYPE %%%>'#13#10' '
+ +'dynamic_cast(ASerializer)->ReadDouble("%FIELD_NAME%", ftCur'
+ +'r, &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_CURRENCY_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_DATETIME_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->ReadDateTime("%FIELD_NAME%", &l_%FIELD_NAME%);'
+ +#13#10' // <%%% END IF_FIELD_DATETIME_TYPE %%%>'#13#10' // <%%% START '
+ +'IF_FIELD_DECIMAL_TYPE %%%>'#13#10' dynamic_cast(ASeriali'
+ +'zer)->ReadDecimal("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END '
+ +'IF_FIELD_DECIMAL_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DOUBLE_TYPE %%'
+ +'%>'#13#10' dynamic_cast(ASerializer)->ReadDouble("%FIELD'
+ +'_NAME%", ftDouble, &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DOUBLE'
+ +'_TYPE %%%>'#13#10' // <%%% START IF_FIELD_GUID_TYPE %%%>'#13#10' dyna'
+ +'mic_cast(ASerializer)->ReadGuid("%FIELD_NAME%", &l_%FIELD_N'
+ +'AME%);'#13#10' // <%%% END IF_FIELD_GUID_TYPE %%%>'#13#10' // <%%% ST'
+ +'ART IF_FIELD_INT64_TYPE %%%>'#13#10' dynamic_cast(ASeria'
+ +'lizer)->ReadInt64("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END '
+ +'IF_FIELD_INT64_TYPE %%%>'#13#10' // <%%% START IF_FIELD_INTEGER_TYPE %%%'
+ ,'>'#13#10' dynamic_cast(ASerializer)->ReadInteger("%FIELD'
+ +'_NAME%", otSLong, &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_INTEGER'
+ +'_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' '
+ +' dynamic_cast(ASerializer)->ReadAnsiString("%FIELD_NAME%",'
+ +' &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ANSISTRING_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' dynamic_cast<'
+ +'TROSerializer*>(ASerializer)->ReadUTF8String("%FIELD_NAME%", &l_%FIELD_NAME'
+ +'%);'#13#10' // <%%% END IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' // <%%%'
+ +' START IF_FIELD_VARIANT_TYPE %%%>'#13#10' dynamic_cast(A'
+ +'Serializer)->ReadVariant("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%'
+ +'%% END IF_FIELD_VARIANT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_WIDESTR'
+ +'ING_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->ReadWid'
+ +'eString("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_W'
+ +'IDESTRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_XML_TYPE %%%>'#13#10
+ +' dynamic_cast(ASerializer)->ReadXml("%FIELD_NAME%", &l_%'
+ +'FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_XML_TYPE %%%>'#13#10' // <'
+ +'%%% START IF_FIELD_ARRAY_TYPE %%%>'#13#10' dynamic_cast('
+ +'ASerializer)->ReadArray("%FIELD_NAME%", __classid(%FIELD_TYPE%), &l_%FIELD_'
+ +'NAME%);'#13#10' if (%FIELD_NAME% != l_%FIELD_NAME%) delete %FIELD_NAME%;'
+ +#13#10' // <%%% END IF_FIELD_ARRAY_TYPE %%%>'#13#10' // <%%% START IF_'
+ +'FIELD_ENUM_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->'
+ +'ReadEnumerated("%FIELD_NAME%", __Get%FIELD_TYPE%Info, &l_%FIELD_NAME%);'#13
+ +#10' // <%%% END IF_FIELD_ENUM_TYPE %%%>'#13#10' // <%%% START IF_FIEL'
+ +'D_STRUCT_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->Re'
+ +'adStruct("%FIELD_NAME%", __classid(%FIELD_TYPE%), &l_%FIELD_NAME%);'#13#10
+ +' if (%FIELD_NAME% != l_%FIELD_NAME%) delete %FIELD_NAME%;'#13#10' // '
+ +'<%%% END IF_FIELD_STRUCT_TYPE %%%>'#13#10' %FIELD_NAME% = l_%FIELD_NAME%'
+ +';'#13#10' // <%%% END ENTIRE_HIERARCHY_FIELDS %%%>'#13#10' }'#13#10'}'
+ +#13#10#13#10'void __fastcall %EXCEPTION_NAME%::WriteException(TObject* ASeri'
+ +'alizer)'#13#10'{'#13#10' if (dynamic_cast(ASerializer)->Re'
+ +'cordStrictOrder)'#13#10' {'#13#10' // <%%% START IF_STRUCT_HAS_ANCESTOR'
+ +' %%%>'#13#10' inherited::WriteException(ASerializer);'#13#10' // <%%%'
+ +' END IF_STRUCT_HAS_ANCESTOR %%%>'#13#10' // <%%% START FIELDS_NO_STRIP %'
+ +'%%>'#13#10' // <%%% START IF_FIELD_TYPE_SIMPLE %%%>'#13#10' %FIELD_TY'
+ +'PE% l_%FIELD_NAME% = %FIELD_NAME%;'#13#10' // <%%% END IF_FIELD_TYPE_SIM'
+ +'PLE %%%>'#13#10' // <%%% START IF_FIELD_TYPE_COMPLEX %%%>'#13#10' %FI'
+ +'ELD_TYPE%* l_%FIELD_NAME% = %FIELD_NAME%;'#13#10' // <%%% END IF_FIELD_T'
+ +'YPE_COMPLEX %%%>'#13#10' // <%%% START IF_FIELD_BINARY_TYPE %%%>'#13#10
+ +' dynamic_cast(ASerializer)->WriteBinary("%FIELD_NAME%", '
+ +'&l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_BINARY_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteEnumerated("%FIELD_NAME%", __GetboolInfo, &l_%F'
+ +'IELD_NAME%);'#13#10' // <%%% END IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' /'
+ +'/ <%%% START IF_FIELD_CURRENCY_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteDouble("%FIELD_NAME%", ftCurr, &l_%FIELD_NAME%);'
+ +#13#10' // <%%% END IF_FIELD_CURRENCY_TYPE %%%>'#13#10' // <%%% START '
+ +'IF_FIELD_DATETIME_TYPE %%%>'#13#10' dynamic_cast(ASerial'
+ +'izer)->WriteDateTime("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% E'
+ +'ND IF_FIELD_DATETIME_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DECIMAL_TY'
+ +'PE %%%>'#13#10' dynamic_cast(ASerializer)->WriteDecimal('
+ +'"%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DECIMAL_T'
+ +'YPE %%%>'#13#10' // <%%% START IF_FIELD_DOUBLE_TYPE %%%>'#13#10' dyna'
+ +'mic_cast(ASerializer)->WriteDouble("%FIELD_NAME%", ftDouble'
+ +', &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DOUBLE_TYPE %%%>'#13#10
+ +' // <%%% START IF_FIELD_GUID_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteGuid("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' '
+ +' // <%%% END IF_FIELD_GUID_TYPE %%%>'#13#10' // <%%% START IF_FIELD_INT6'
+ +'4_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteInt6'
+ +'4("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_INT64_T'
+ +'YPE %%%>'#13#10' // <%%% START IF_FIELD_INTEGER_TYPE %%%>'#13#10' dyn'
+ +'amic_cast(ASerializer)->WriteInteger("%FIELD_NAME%", otSLon'
+ +'g, &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_INTEGER_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' dynamic_cast<'
+ +'TROSerializer*>(ASerializer)->WriteAnsiString("%FIELD_NAME%", &l_%FIELD_NAM'
+ ,'E%);'#13#10' // <%%% END IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' // <%%'
+ +'% START IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteUTF8String("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' '
+ +' // <%%% END IF_FIELD_UTF8STRING_TYPE %%%>'#13#10' // <%%% START IF_FI'
+ +'ELD_VARIANT_TYPE %%%>'#13#10' dynamic_cast(ASerializer)-'
+ +'>WriteVariant("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_F'
+ +'IELD_VARIANT_TYPE %%%>'#13#10' // <%%% START IF_FIELD_WIDESTRING_TYPE %%'
+ +'%>'#13#10' dynamic_cast(ASerializer)->WriteWideString("%'
+ +'FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_WIDESTRING_'
+ +'TYPE %%%>'#13#10' // <%%% START IF_FIELD_XML_TYPE %%%>'#13#10' dynami'
+ +'c_cast(ASerializer)->WriteXml("%FIELD_NAME%", &l_%FIELD_NAM'
+ +'E%);'#13#10' // <%%% END IF_FIELD_XML_TYPE %%%>'#13#10' // <%%% START'
+ +' IF_FIELD_ARRAY_TYPE %%%>'#13#10' dynamic_cast(ASerializ'
+ +'er)->WriteArray("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF'
+ +'_FIELD_ARRAY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ENUM_TYPE %%%>'#13
+ +#10' dynamic_cast(ASerializer)->WriteEnumerated("%FIELD_N'
+ +'AME%", __Get%FIELD_TYPE%Info, &l_%FIELD_NAME%);'#13#10' // <%%% END IF_F'
+ +'IELD_ENUM_TYPE %%%>'#13#10' // <%%% START IF_FIELD_STRUCT_TYPE %%%>'#13
+ +#10' dynamic_cast(ASerializer)->WriteStruct("%FIELD_NAME%'
+ +'", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_STRUCT_TYPE %%%>'#13#10
+ +' // <%%% END FIELDS_NO_STRIP %%%>'#13#10' }'#13#10' else'#13#10' {'#13
+ +#10' // <%%% START ENTIRE_HIERARCHY_FIELDS %%%>'#13#10' // <%%% START '
+ +'IF_FIELD_TYPE_SIMPLE %%%>'#13#10' %FIELD_TYPE% l_%FIELD_NAME% = %FIELD_N'
+ +'AME%;'#13#10' // <%%% END IF_FIELD_TYPE_SIMPLE %%%>'#13#10' // <%%% S'
+ +'TART IF_FIELD_TYPE_COMPLEX %%%>'#13#10' %FIELD_TYPE%* l_%FIELD_NAME% = %'
+ +'FIELD_NAME%;'#13#10' // <%%% END IF_FIELD_TYPE_COMPLEX %%%>'#13#10' /'
+ +'/ <%%% START IF_FIELD_BINARY_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteBinary("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' '
+ +'// <%%% END IF_FIELD_BINARY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_BOO'
+ +'LEAN_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteE'
+ +'numerated("%FIELD_NAME%", __GetboolInfo, &l_%FIELD_NAME%);'#13#10' // <%'
+ +'%% END IF_FIELD_BOOLEAN_TYPE %%%>'#13#10' // <%%% START IF_FIELD_CURRENC'
+ +'Y_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteDoub'
+ +'le("%FIELD_NAME%", ftCurr, &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIEL'
+ +'D_CURRENCY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DATETIME_TYPE %%%>'
+ +#13#10' dynamic_cast(ASerializer)->WriteDateTime("%FIELD_'
+ +'NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DATETIME_TYPE %%%'
+ +'>'#13#10' // <%%% START IF_FIELD_DECIMAL_TYPE %%%>'#13#10' dynamic_ca'
+ +'st(ASerializer)->WriteDecimal("%FIELD_NAME%", &l_%FIELD_NAM'
+ +'E%);'#13#10' // <%%% END IF_FIELD_DECIMAL_TYPE %%%>'#13#10' // <%%% S'
+ +'TART IF_FIELD_DOUBLE_TYPE %%%>'#13#10' dynamic_cast(ASer'
+ +'ializer)->WriteDouble("%FIELD_NAME%", ftDouble, &l_%FIELD_NAME%);'#13#10' '
+ +' // <%%% END IF_FIELD_DOUBLE_TYPE %%%>'#13#10' // <%%% START IF_FIELD_G'
+ +'UID_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteGu'
+ +'id("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_GUID_T'
+ +'YPE %%%>'#13#10' // <%%% START IF_FIELD_INT64_TYPE %%%>'#13#10' dynam'
+ +'ic_cast(ASerializer)->WriteInt64("%FIELD_NAME%", &l_%FIELD_'
+ +'NAME%);'#13#10' // <%%% END IF_FIELD_INT64_TYPE %%%>'#13#10' // <%%% '
+ +'START IF_FIELD_INTEGER_TYPE %%%>'#13#10' dynamic_cast(AS'
+ +'erializer)->WriteInteger("%FIELD_NAME%", otSLong, &l_%FIELD_NAME%);'#13#10
+ +' // <%%% END IF_FIELD_INTEGER_TYPE %%%>'#13#10' // <%%% START IF_FIEL'
+ +'D_ANSISTRING_TYPE %%%>'#13#10' dynamic_cast(ASerializer)'
+ +'->WriteAnsiString("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END '
+ +'IF_FIELD_ANSISTRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_UTF8STRING_'
+ +'TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteUTF8St'
+ +'ring("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_UTF8'
+ +'STRING_TYPE %%%>'#13#10' // <%%% START IF_FIELD_VARIANT_TYPE %%%>'#13#10
+ +' dynamic_cast(ASerializer)->WriteVariant("%FIELD_NAME%",'
+ +' &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_VARIANT_TYPE %%%>'#13#10
+ +' // <%%% START IF_FIELD_WIDESTRING_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteWideString("%FIELD_NAME%", &l_%FIELD_NAME%)'
+ +';'#13#10' // <%%% END IF_FIELD_WIDESTRING_TYPE %%%>'#13#10' // <%%% S'
+ +'TART IF_FIELD_XML_TYPE %%%>'#13#10' dynamic_cast(ASerial'
+ +'izer)->WriteXml("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END IF'
+ ,'_FIELD_XML_TYPE %%%>'#13#10' // <%%% START IF_FIELD_ARRAY_TYPE %%%>'#13
+ +#10' dynamic_cast(ASerializer)->WriteArray("%FIELD_NAME%"'
+ +', &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ARRAY_TYPE %%%>'#13#10
+ +' // <%%% START IF_FIELD_ENUM_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteEnumerated("%FIELD_NAME%", __Get%FIELD_TYPE%Info,'
+ +' &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_ENUM_TYPE %%%>'#13#10' '
+ +' // <%%% START IF_FIELD_STRUCT_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->WriteStruct("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' '
+ +' // <%%% END IF_FIELD_STRUCT_TYPE %%%>'#13#10' // <%%% END ENTIRE_HIER'
+ +'ARCHY_FIELDS %%%>'#13#10' }'#13#10'}'#13#10#13#10'// <%%% END IF_HAS_FIELD'
+ +'S %%%>'#13#10'// <%%% END EXCEPTIONS %%%>'#13#10'// <%%% START STRUCTS %%%>'
+ +#13#10'// %STRUCT_NAME%'#13#10#13#10'void __fastcall %STRUCT_NAME%::Assign(C'
+ +'lasses::TPersistent* iSource)'#13#10'{'#13#10' inherited::Assign(iSource);'
+ +' // inherited typedef'#13#10' // <%%% START IF_HAS_FIELDS %%%>'#13#10#13
+ +#10' %STRUCT_NAME%* lSource = dynamic_cast<%STRUCT_NAME%*>(iSource);'#13#10
+ +' if (lSource)'#13#10' {'#13#10' // <%%% END IF_HAS_FIELDS %%%>'#13#10' '
+ +' // <%%% START FIELDS_NO_STRIP %%%>'#13#10' // <%%% START IF_FIELD_TYPE'
+ +'_SIMPLE %%%>'#13#10' %FIELD_NAME% = lSource->%FIELD_NAME%;'#13#10' //'
+ +' <%%% END IF_FIELD_TYPE_SIMPLE %%%>'#13#10' // <%%% START IF_FIELD_TYPE_'
+ +'COMPLEX %%%>'#13#10' // <%%% START IF_NOT_AUTO_CREATE_FIELDS %%%>'#13#10
+ +' if (f%FIELD_NAME% != NULL)'#13#10' {'#13#10' if (lSource->%FIEL'
+ +'D_NAME% != NULL) '#13#10' {'#13#10' %FIELD_NAME%->Assign(lSourc'
+ +'e->%FIELD_NAME%);'#13#10' }'#13#10' else'#13#10' {'#13#10' '
+ +' delete f%FIELD_NAME%;'#13#10' f%FIELD_NAME% = NULL;'#13#10' '
+ +' }'#13#10' }'#13#10' // <%%% END IF_NOT_AUTO_CREATE_FIELDS %%%>'#13
+ +#10' // <%%% START IF_AUTO_CREATE_FIELDS %%%>'#13#10' %FIELD_NAME%->As'
+ +'sign(lSource->%FIELD_NAME%);'#13#10' // <%%% END IF_AUTO_CREATE_FIELDS %'
+ +'%%>'#13#10' // <%%% END IF_FIELD_TYPE_COMPLEX %%%>'#13#10' // <%%% EN'
+ +'D FIELDS_NO_STRIP %%%>'#13#10' // <%%% START IF_HAS_FIELDS %%%>'#13#10' }'
+ +#13#10' // <%%% END IF_HAS_FIELDS %%%>'#13#10'}'#13#10#13#10'// <%%% START '
+ +'FIELDS_NO_STRIP %%%>'#13#10'// <%%% START IF_FIELD_TYPE_COMPLEX %%%>'#13#10
+ +'%FIELD_TYPE%* __fastcall %STRUCT_NAME%::Get%FIELD_NAME%()'#13#10'{'#13#10' '
+ +' // <%%% START IF_AUTO_CREATE_FIELDS %%%>'#13#10' if (f%FIELD_NAME% == NUL'
+ +'L) '#13#10' f%FIELD_NAME% = new %FIELD_TYPE%();'#13#10' // <%%% END IF_'
+ +'AUTO_CREATE_FIELDS %%%>'#13#10' return f%FIELD_NAME%;'#13#10'}'#13#10#13#10
+ +'// <%%% END IF_FIELD_TYPE_COMPLEX %%%>'#13#10'// <%%% END FIELDS_NO_STRIP %'
+ +'%%>'#13#10'// <%%% START IF_HAS_FIELDS %%%>'#13#10'void __fastcall %STRUCT_'
+ +'NAME%::ReadComplex(TObject* ASerializer)'#13#10'{'#13#10' if (dynamic_cast'
+ +'(ASerializer)->RecordStrictOrder)'#13#10' {'#13#10' // '
+ +'<%%% START IF_STRUCT_HAS_ANCESTOR %%%>'#13#10' inherited::ReadException('
+ +'ASerializer);'#13#10' // <%%% END IF_STRUCT_HAS_ANCESTOR %%%>'#13#10' '
+ +' // <%%% START FIELDS_NO_STRIP %%%>'#13#10' // <%%% START IF_FIELD_TYPE_'
+ +'SIMPLE %%%>'#13#10' %FIELD_TYPE% l_%FIELD_NAME% = %FIELD_NAME%;'#13#10' '
+ +' // <%%% END IF_FIELD_TYPE_SIMPLE %%%>'#13#10' // <%%% START IF_FIELD_'
+ +'TYPE_COMPLEX %%%>'#13#10' %FIELD_TYPE%* l_%FIELD_NAME% = %FIELD_NAME%;'
+ +#13#10' // <%%% END IF_FIELD_TYPE_COMPLEX %%%>'#13#10' // <%%% START I'
+ +'F_FIELD_BINARY_TYPE %%%>'#13#10' dynamic_cast(ASerialize'
+ +'r)->ReadBinary("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' if (%FIELD_NAME'
+ +'% != l_%FIELD_NAME%) delete %FIELD_NAME%;'#13#10' // <%%% END IF_FIELD_B'
+ +'INARY_TYPE %%%>'#13#10' // <%%% START IF_FIELD_BOOLEAN_TYPE %%%>'#13#10
+ +' dynamic_cast(ASerializer)->ReadEnumerated("%FIELD_NAME%'
+ +'", __GetboolInfo, &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_BOOLEAN'
+ +'_TYPE %%%>'#13#10' // <%%% START IF_FIELD_CURRENCY_TYPE %%%>'#13#10' '
+ +'dynamic_cast(ASerializer)->ReadDouble("%FIELD_NAME%", ftCur'
+ +'r, &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_CURRENCY_TYPE %%%>'#13
+ +#10' // <%%% START IF_FIELD_DATETIME_TYPE %%%>'#13#10' dynamic_cast(ASerializer)->ReadDateTime("%FIELD_NAME%", &l_%FIELD_NAME%);'
+ +#13#10' // <%%% END IF_FIELD_DATETIME_TYPE %%%>'#13#10' // <%%% START '
+ +'IF_FIELD_DECIMAL_TYPE %%%>'#13#10' dynamic_cast(ASeriali'
+ +'zer)->ReadDecimal("%FIELD_NAME%", &l_%FIELD_NAME%);'#13#10' // <%%% END '
+ +'IF_FIELD_DECIMAL_TYPE %%%>'#13#10' // <%%% START IF_FIELD_DOUBLE_TYPE %%'
+ +'%>'#13#10' dynamic_cast(ASerializer)->ReadDouble("%FIELD'
+ +'_NAME%", ftDouble, &l_%FIELD_NAME%);'#13#10' // <%%% END IF_FIELD_DOUBLE'
+ +'_TYPE %%%>'#13#10' // <%%% START IF_FIELD_GUID_TYPE %%%>'#13#10' dyna'
+ ,'mic_cast